diff options
author | Eugene Sokolov <eug-vs@keemail.me> | 2020-08-19 19:36:46 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-19 19:36:46 +0300 |
commit | d231604a88ea48f3ba7508837d28896ced25b958 (patch) | |
tree | 3e8b7e5be10c67823cc74be5d3290b9ec8eb0de9 /src | |
parent | 32aedd44555b25221e40543f062eaf5fde51a347 (diff) | |
parent | a69e69643f51a97753bf593777461bdce0b63df2 (diff) | |
download | which-ui-d231604a88ea48f3ba7508837d28896ced25b958.tar.gz |
Merge pull request #92 from which-ecosystem/image-compression
Image compression
Diffstat (limited to 'src')
-rw-r--r-- | src/hooks/useS3Preupload.tsx | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/hooks/useS3Preupload.tsx b/src/hooks/useS3Preupload.tsx index 1fb2cd6..651bfb6 100644 --- a/src/hooks/useS3Preupload.tsx +++ b/src/hooks/useS3Preupload.tsx @@ -1,5 +1,7 @@ import { useState, useCallback, useMemo } from 'react'; import axios from 'axios'; +import Bluebird from 'bluebird'; +import Compressor from 'compressorjs'; import { get } from '../requests'; @@ -15,6 +17,17 @@ interface Hook { progress: number; } + +const compressFile = (file: File, quality = 0.6): Promise<Blob> => { + return new Promise((resolve, reject) => { + return new Compressor(file, { + success: result => resolve(result), + error: err => reject(err), + quality + }); + }); +}; + export default (): Hook => { const [url, setUrl] = useState<string>(); const [file, setFile] = useState<File>(); @@ -37,7 +50,7 @@ export default (): Hook => { setProgress(Math.round((progressEvent.loaded * 95) / progressEvent.total)); }, [setProgress]); - const resolve = useCallback(async (): Promise<string> => { + const resolve = useCallback(async (quality?: number): Promise<string> => { if (file) { const config = { headers: { 'Content-Type': 'image/png' }, @@ -45,11 +58,14 @@ export default (): Hook => { }; setProgress(0.01); + // Add querystring to avoid caching request in some browsers, see // https://stackoverflow.com/questions/59339561/safari-skipping-xmlhttprequests - return get(`/files?key=${file.name}`) - .then(response => response.data) - .then(uploadUrl => axios.put(uploadUrl, file, config)) + return Bluebird.all([get(`/files?key=${file.name}`), compressFile(file, quality)]) + .then(([response, compressedFile]) => { + const uploadUrl = response.data; + return axios.put(uploadUrl, compressedFile, config); + }) .then(response => { setProgress(100); const uri = response.config.url; |