diff --git a/src/components/FileSize.tsx b/src/components/FileSize.tsx deleted file mode 100644 index 5e5935b7..00000000 --- a/src/components/FileSize.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { h, Component } from 'preact'; -import * as prettyBytes from 'pretty-bytes'; - -type FileContents = ArrayBuffer | Blob; - -interface Props extends Pick> { - file?: FileContents; - compareTo?: FileContents; - increaseClass?: string; - decreaseClass?: string; -} - -interface State { - size?: number; - sizeFormatted?: string; - compareSize?: number; - compareSizeFormatted?: string; -} - -function calculateSize(data: FileContents): number { - return data instanceof ArrayBuffer ? data.byteLength : data.size; -} - -export default class FileSize extends Component { - constructor(props: Props) { - super(props); - if (props.file) { - this.computeSize('size', props.file); - } - if (props.compareTo) { - this.computeSize('compareSize', props.compareTo); - } - } - - componentWillReceiveProps({ file, compareTo }: Props) { - if (file !== this.props.file) { - this.computeSize('size', file); - } - if (compareTo !== this.props.compareTo) { - this.computeSize('compareSize', compareTo); - } - } - - componentDidMount() { - this.applyStyles(); - } - - componentDidUpdate() { - this.applyStyles(); - } - - applyStyles() { - const { size, compareSize = 0 } = this.state; - if (size != null && this.base) { - const delta = size && compareSize ? (size - compareSize) / compareSize : 0; - this.base.style.setProperty('--size', '' + size); - this.base.style.setProperty('--size-delta', '' + Math.round(Math.abs(delta * 100))); - } - } - - computeSize(prop: keyof State, data?: FileContents) { - const size = data ? calculateSize(data) : 0; - const pretty = prettyBytes(size); - this.setState({ - [prop]: size, - [prop + 'Formatted']: pretty, - }); - } - - render( - { file, compareTo, increaseClass, decreaseClass, ...props }: Props, - { size, sizeFormatted = '', compareSize }: State, - ) { - const delta = size && compareSize ? (size - compareSize) / compareSize : 0; - return ( - - {sizeFormatted} - {compareTo && ( - 0 ? increaseClass : decreaseClass}> - {delta > 0 && '+'} - {Math.round(delta * 100)}% - - )} - - ); - } -} diff --git a/src/components/Options/FileSize.tsx b/src/components/Options/FileSize.tsx new file mode 100644 index 00000000..d3432bdc --- /dev/null +++ b/src/components/Options/FileSize.tsx @@ -0,0 +1,63 @@ +import { h, Component } from 'preact'; +import * as prettyBytes from 'pretty-bytes'; +import * as style from './style.scss'; + +interface Props { + blob: Blob; + compareTo?: Blob; +} + +interface State { + sizeFormatted?: string; +} + +export default class FileSize extends Component { + constructor(props: Props) { + super(props); + if (props.blob) { + this.setState({ + sizeFormatted: prettyBytes(props.blob.size), + }); + } + } + + componentWillReceiveProps({ blob }: Props) { + if (blob) { + this.setState({ + sizeFormatted: prettyBytes(blob.size), + }); + } + } + + render( + { blob, compareTo }: Props, + { sizeFormatted }: State, + ) { + let comparison: JSX.Element | undefined; + + if (compareTo) { + const delta = blob.size / compareTo.size; + if (delta > 1) { + const percent = Math.round((delta - 1) * 100) + '%'; + comparison = ( + + {percent === '0%' ? 'slightly' : percent} bigger + + ); + } else if (delta < 1) { + const percent = Math.round((1 - delta) * 100) + '%'; + comparison = ( + + {percent === '0%' ? 'slightly' : percent} smaller + + ); + } else { + comparison = ( + no change + ); + } + } + + return {sizeFormatted} {comparison}; + } +} diff --git a/src/components/Options/index.tsx b/src/components/Options/index.tsx index 7c80e865..a0f7aba0 100644 --- a/src/components/Options/index.tsx +++ b/src/components/Options/index.tsx @@ -35,7 +35,7 @@ import { import { QuantizeOptions } from '../../codecs/imagequant/processor-meta'; import { ResizeOptions } from '../../codecs/resize/processor-meta'; import { PreprocessorState } from '../../codecs/preprocessors'; -import FileSize from '../FileSize'; +import FileSize from './FileSize'; import { DownloadIcon } from '../../lib/icons'; import { SourceImage } from '../App'; import Checkbox from '../checkbox'; @@ -145,7 +145,7 @@ export default class Options extends Component { {encoderState.type === identity.type ? null :
-

Edit

+

Edit