From 668c9f4841e7118b98bb31d8e68640689be99830 Mon Sep 17 00:00:00 2001 From: eug-vs Date: Sat, 22 Aug 2020 13:54:56 +0300 Subject: refactor!: simplify file operations --- src/utils/uploadFileToS3.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/utils/uploadFileToS3.ts (limited to 'src/utils/uploadFileToS3.ts') diff --git a/src/utils/uploadFileToS3.ts b/src/utils/uploadFileToS3.ts new file mode 100644 index 0000000..de1b1aa --- /dev/null +++ b/src/utils/uploadFileToS3.ts @@ -0,0 +1,57 @@ +import Compressor from 'compressorjs'; +import axios from 'axios'; +import Bluebird from 'bluebird'; +import { get } from '../requests'; + +interface ProgressEvent { + loaded: number; + total: number; +} + +const compressFile = (file: File, quality = 0.6): Promise => { + return new Promise((resolve, reject) => { + if (quality === 1) resolve(file); + else return new Compressor(file, { + success: result => resolve(result), + error: err => reject(err), + quality + }); + }); +}; + +export default ( + file: File, + quality?: number, + setProgress?: (progress: number) => void +): Promise => { + + const onUploadProgress = (progressEvent: ProgressEvent): void => { + if (setProgress) { + // Only allow upload progress reach 95%, and set 100% when request is resolved + const progress = Math.round((progressEvent.loaded * 95) / progressEvent.total); + setProgress(progress); + } + }; + + const config = { + headers: { 'Content-Type': 'image/png' }, + onUploadProgress + }; + + // Indicate start + if (setProgress) setProgress(0.01); + + // Add querystring to avoid caching request in some browsers, see + // https://stackoverflow.com/questions/59339561/safari-skipping-xmlhttprequests + 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 => { + if (setProgress) setProgress(100); + const uri = response.config.url; + return uri ? uri.slice(0, uri.indexOf('?')) : ''; + }); +}; + -- cgit v1.2.3 From 66e1dfd1b726aa465969d0b7d028db8b0dfa1d0e Mon Sep 17 00:00:00 2001 From: eug-vs Date: Sat, 22 Aug 2020 14:16:36 +0300 Subject: fix: resolve eslint errors --- src/utils/uploadFileToS3.ts | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'src/utils/uploadFileToS3.ts') diff --git a/src/utils/uploadFileToS3.ts b/src/utils/uploadFileToS3.ts index de1b1aa..d91dac5 100644 --- a/src/utils/uploadFileToS3.ts +++ b/src/utils/uploadFileToS3.ts @@ -8,10 +8,13 @@ interface ProgressEvent { total: number; } +type SetProgress = (progress: number) => void; + + const compressFile = (file: File, quality = 0.6): Promise => { return new Promise((resolve, reject) => { - if (quality === 1) resolve(file); - else return new Compressor(file, { + if (quality === 1) return resolve(file); + return new Compressor(file, { success: result => resolve(result), error: err => reject(err), quality @@ -19,16 +22,12 @@ const compressFile = (file: File, quality = 0.6): Promise => { }); }; -export default ( - file: File, - quality?: number, - setProgress?: (progress: number) => void -): Promise => { - +export default (file: File, quality?: number, setProgress?: SetProgress): Promise => { const onUploadProgress = (progressEvent: ProgressEvent): void => { if (setProgress) { + const { loaded, total } = progressEvent; // Only allow upload progress reach 95%, and set 100% when request is resolved - const progress = Math.round((progressEvent.loaded * 95) / progressEvent.total); + const progress = Math.round((loaded * 95) / total); setProgress(progress); } }; @@ -38,9 +37,6 @@ export default ( onUploadProgress }; - // Indicate start - if (setProgress) setProgress(0.01); - // Add querystring to avoid caching request in some browsers, see // https://stackoverflow.com/questions/59339561/safari-skipping-xmlhttprequests return Bluebird.all([get(`/files?key=${file.name}`), compressFile(file, quality)]) -- cgit v1.2.3