diff options
author | eug-vs <eug-vs@keemail.me> | 2020-08-22 13:54:56 +0300 |
---|---|---|
committer | eug-vs <eug-vs@keemail.me> | 2020-08-22 13:54:56 +0300 |
commit | 668c9f4841e7118b98bb31d8e68640689be99830 (patch) | |
tree | 692c66b7fee252bba4466104ebd4c8fff02fcf19 /src/containers/PollCreation/useS3Preupload.ts | |
parent | fdf826bf38b967d2f4346e9ee5950e157f0f0beb (diff) | |
download | which-ui-668c9f4841e7118b98bb31d8e68640689be99830.tar.gz |
refactor!: simplify file operations
Diffstat (limited to 'src/containers/PollCreation/useS3Preupload.ts')
-rw-r--r-- | src/containers/PollCreation/useS3Preupload.ts | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/containers/PollCreation/useS3Preupload.ts b/src/containers/PollCreation/useS3Preupload.ts new file mode 100644 index 0000000..ef3a408 --- /dev/null +++ b/src/containers/PollCreation/useS3Preupload.ts @@ -0,0 +1,40 @@ +import { useState, useCallback, useMemo } from 'react'; +import uploadFileToS3 from '../../utils/uploadFileToS3'; + + +interface Hook { + setValue: (value: File | string | undefined) => void; + isReady: boolean; + resolve: () => Promise<string>; + progress: number; +} + +export default (): Hook => { + const [url, setUrl] = useState<string>(); + const [file, setFile] = useState<File>(); + const [progress, setProgress] = useState<number>(0); + + const isReady = useMemo(() => Boolean(file || url), [file, url]); + + const setValue: Hook['setValue'] = useCallback(value => { + if (value instanceof File) { + setFile(value); + setUrl(undefined); + } else { + setUrl(value); + setFile(undefined); + } + }, [setUrl, setFile]); + + const resolve = useCallback(async (quality?: number): Promise<string> => { + if (file) return uploadFileToS3(file, quality, setProgress); + return url || ''; + }, [file, url]); + + return { + setValue, + isReady, + resolve, + progress + }; +}; |