p5.js-web-editor/client/modules/IDE/actions/uploader.js

114 lines
4 KiB
JavaScript
Raw Normal View History

import apiClient from '../../../utils/apiClient';
import getConfig from '../../../utils/getConfig';
import { createFile } from './files';
2018-05-30 22:23:32 +00:00
import { TEXT_FILE_REGEX } from '../../../../server/utils/fileUtils';
2016-07-15 23:05:18 +00:00
const s3BucketHttps = getConfig('S3_BUCKET_URL_BASE') ||
`https://s3-${getConfig('AWS_REGION')}.amazonaws.com/${getConfig('S3_BUCKET')}/`;
const MAX_LOCAL_FILE_SIZE = 80000; // bytes, aka 80 KB
2016-07-15 23:05:18 +00:00
2016-08-25 04:18:28 +00:00
function localIntercept(file, options = {}) {
return new Promise((resolve, reject) => {
if (!options.readType) {
// const mime = file.type;
// const textType = a(_textTypes).any(type => {
// const re = new RegExp(type);
// return re.test(mime);
// });
// options.readType = textType ? 'readAsText' : 'readAsDataURL';
options.readType = 'readAsText'; // eslint-disable-line
}
const reader = new window.FileReader();
reader.onload = () => {
resolve(reader.result);
};
reader.onerror = () => {
reject(reader.result);
};
// run the reader
reader[options.readType](file);
});
}
export function dropzoneAcceptCallback(userId, file, done) {
2016-12-14 01:08:10 +00:00
return () => {
2018-05-30 22:23:32 +00:00
// if a user would want to edit this file as text, local interceptor
if (file.name.match(TEXT_FILE_REGEX) && file.size < MAX_LOCAL_FILE_SIZE) {
localIntercept(file).then((result) => {
2016-08-25 04:18:28 +00:00
file.content = result; // eslint-disable-line
done('Uploading plaintext file locally.');
2016-08-25 04:18:28 +00:00
})
2018-05-05 00:22:39 +00:00
.catch((result) => {
done(`Failed to download file ${file.name}: ${result}`);
console.warn(file);
});
2016-08-25 04:18:28 +00:00
} else {
file.postData = []; // eslint-disable-line
apiClient.post('/S3/sign', {
name: file.name,
type: file.type,
size: file.size,
userId
2016-08-25 04:18:28 +00:00
// _csrf: document.getElementById('__createPostToken').value
})
2018-05-05 00:22:39 +00:00
.then((response) => {
file.custom_status = 'ready'; // eslint-disable-line
file.postData = response.data; // eslint-disable-line
file.s3 = response.data.key; // eslint-disable-line
file.previewTemplate.className += ' uploading'; // eslint-disable-line
2018-05-05 00:22:39 +00:00
done();
})
2020-04-25 14:48:39 +00:00
.catch((error) => {
const { response } = error;
file.custom_status = 'rejected'; // eslint-disable-line
if (response.data && response.data.responseText && response.data.responseText.message) {
2018-05-05 00:22:39 +00:00
done(response.data.responseText.message);
}
done('Error: Reached upload limit.');
2018-05-05 00:22:39 +00:00
});
2016-08-25 04:18:28 +00:00
}
};
2016-07-15 23:05:18 +00:00
}
export function dropzoneSendingCallback(file, xhr, formData) {
return () => {
2018-05-30 22:23:32 +00:00
if (!file.name.match(TEXT_FILE_REGEX) || file.size >= MAX_LOCAL_FILE_SIZE) {
Object.keys(file.postData).forEach((key) => {
2016-08-25 04:18:28 +00:00
formData.append(key, file.postData[key]);
});
formData.append('Content-type', file.type);
2016-08-25 04:18:28 +00:00
formData.append('Content-length', '');
formData.append('acl', 'public-read');
}
};
2016-07-15 23:05:18 +00:00
}
export function dropzoneCompleteCallback(file) {
return (dispatch, getState) => { // eslint-disable-line
2018-05-30 22:23:32 +00:00
if ((!file.name.match(TEXT_FILE_REGEX) || file.size >= MAX_LOCAL_FILE_SIZE) && file.status !== 'error') {
2016-08-25 04:18:28 +00:00
let inputHidden = '<input type="hidden" name="attachments[]" value="';
const json = {
2016-09-09 02:15:29 +00:00
url: `${s3BucketHttps}${file.postData.key}`,
2016-08-25 04:18:28 +00:00
originalFilename: file.name
};
2016-09-09 02:02:42 +00:00
// console.log(json, JSON.stringify(json), JSON.stringify(json).replace('"', '\\"'));
2016-08-25 04:18:28 +00:00
inputHidden += `${window.btoa(JSON.stringify(json))}" />`;
// document.getElementById('uploader').appendChild(inputHidden);
document.getElementById('uploader').innerHTML += inputHidden;
2016-08-25 04:18:28 +00:00
const formParams = {
name: file.name,
2016-09-09 02:02:42 +00:00
url: `${s3BucketHttps}${file.postData.key}`
2016-08-25 04:18:28 +00:00
};
createFile(formParams)(dispatch, getState);
2016-10-25 01:15:32 +00:00
} else if (file.content !== undefined) {
2016-08-25 04:18:28 +00:00
const formParams = {
name: file.name,
content: file.content
};
createFile(formParams)(dispatch, getState);
}
2016-07-15 23:05:18 +00:00
};
}