diff options
author | Eugene Sokolov <eug-vs@keemail.me> | 2020-08-14 02:50:16 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-14 02:50:16 +0300 |
commit | dc0d09f568ca9eeda4978c4750b548ba81688c23 (patch) | |
tree | 08dfa96410207f5621989c3cb0ea930624af1bee /src/hooks | |
parent | 6ace75beae6ab6a466c4d0a9a60ca30aaad0a87c (diff) | |
parent | fca54f49bb3541f726da1becffaa60197835ca68 (diff) | |
download | which-ui-dc0d09f568ca9eeda4978c4750b548ba81688c23.tar.gz |
Merge pull request #80 from which-ecosystem/improved-poll-creation
Upload progress logging
Diffstat (limited to 'src/hooks')
-rw-r--r-- | src/hooks/useS3Preupload.tsx | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/hooks/useS3Preupload.tsx b/src/hooks/useS3Preupload.tsx new file mode 100644 index 0000000..3c98e9a --- /dev/null +++ b/src/hooks/useS3Preupload.tsx @@ -0,0 +1,64 @@ +import { useState, useCallback, useMemo } from 'react'; +import axios from 'axios'; +import { get } from '../requests'; + + +interface ProgressEvent { + loaded: number; + total: number; +} + +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 handleUploadProgress = useCallback((progressEvent: ProgressEvent): void => { + setProgress(Math.round((progressEvent.loaded * 100) / progressEvent.total)); + }, [setProgress]); + + const resolve = useCallback(async (): Promise<string> => { + if (file) { + const config = { + headers: { 'Content-Type': 'image/png' }, + onUploadProgress: handleUploadProgress + }; + + return get('/files') + .then(response => response.data) + .then(uploadUrl => axios.put(uploadUrl, file, config)) + .then(response => { + const uri = response.config.url; + return uri ? uri.slice(0, uri.indexOf('?')) : ''; + }); + } + setProgress(100); + return url || ''; + }, [file, handleUploadProgress, url]); + + return { + setValue, + isReady, + resolve, + progress + }; +}; |