diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2020-03-08 23:56:18 +0100 |
---|---|---|
committer | Thibaut Girka <thib@sitedethib.com> | 2020-03-22 16:26:26 +0100 |
commit | 295dadc9f0d03d0dbb8b75f330162473807e7380 (patch) | |
tree | abe3105cc00256e1175f5e95bfc62d2bdee38ab7 /app/javascript/flavours | |
parent | 9abb227250bd2b377d96626122d431ba30c5f5e0 (diff) |
[Glitch] Change local media attachments to perform heavy processing asynchronously
Port front-end part of 9660aa4543deff41c60d131e081137f84e771499 to glitch-soc [API] This makes use of a new media posting API (/api/v2/media), supporting background processing of uploaded files. For Pleroma's purposes, this could be handled the same as /api/v1/media since afaik Pleroma doesn't do any transcoding. Signed-off-by: Thibaut Girka <thib@sitedethib.com>
Diffstat (limited to 'app/javascript/flavours')
-rw-r--r-- | app/javascript/flavours/glitch/actions/compose.js | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index 0be746048..966d605d1 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -259,12 +259,31 @@ export function uploadCompose(files) { // Account for disparity in size of original image and resized data total += file.size - f.size; - return api(getState).post('/api/v1/media', data, { + return api(getState).post('/api/v2/media', data, { onUploadProgress: function({ loaded }){ progress[i] = loaded; dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); }, - }).then(({ data }) => dispatch(uploadComposeSuccess(data, f))); + }).then(({ status, data }) => { + // If server-side processing of the media attachment has not completed yet, + // poll the server until it is, before showing the media attachment as uploaded + + if (status === 200) { + dispatch(uploadComposeSuccess(data, f)); + } else if (status === 202) { + const poll = () => { + api(getState).get(`/api/v1/media/${data.id}`).then(response => { + if (response.status === 200) { + dispatch(uploadComposeSuccess(data, f)); + } else if (response.status === 206) { + setTimeout(() => poll(), 1000); + } + }).catch(error => dispatch(uploadComposeFail(error))); + }; + + poll(); + } + }); }).catch(error => dispatch(uploadComposeFail(error))); }; }; |