mirror of
https://github.com/filecoin-project/slate.git
synced 2024-09-19 18:28:03 +03:00
110 lines
2.7 KiB
JavaScript
110 lines
2.7 KiB
JavaScript
import * as FileUtilities from "~/common/file-utilities";
|
|
import * as Logging from "~/common/logging";
|
|
import * as Actions from "~/common/actions";
|
|
|
|
// NOTE(amine): utilities
|
|
export const getFileKey = ({ lastModified, name }) => `${lastModified}-${name}`;
|
|
|
|
let UploadStore = {
|
|
queue: [],
|
|
failedFilesCache: {},
|
|
isUploading: false,
|
|
};
|
|
|
|
// NOTE(amine): upload factory function
|
|
export function createUploadProvider({
|
|
onStart,
|
|
onFinish,
|
|
onAddedToQueue,
|
|
onProgress,
|
|
onSuccess,
|
|
onError,
|
|
onDuplicate,
|
|
}) {
|
|
const scheduleQueueUpload = async () => {
|
|
if (UploadStore.isUploading) return;
|
|
|
|
const { file, slate, bucketName } = UploadStore.queue.shift() || {};
|
|
if (!file) return;
|
|
|
|
UploadStore.isUploading = true;
|
|
|
|
let fileKey = getFileKey(file);
|
|
|
|
try {
|
|
// NOTE(amine): delete file from FailedFilesCache
|
|
delete UploadStore.failedFilesCache[fileKey];
|
|
|
|
const response = await FileUtilities.upload({
|
|
file,
|
|
bucketName,
|
|
onProgress: (e) => onProgress({ fileKey, loaded: e.loaded }),
|
|
});
|
|
|
|
if (!response || response.error) {
|
|
UploadStore.failedFilesCache[fileKey] = file;
|
|
|
|
if (onError) onError({ fileKey });
|
|
return;
|
|
}
|
|
|
|
let createResponse = await Actions.createFile({ files: [response], slate });
|
|
if (!createResponse || createResponse.error) {
|
|
UploadStore.failedFilesCache[fileKey] = file;
|
|
}
|
|
|
|
const isDuplicate = createResponse?.data?.skipped > 0;
|
|
if (isDuplicate) {
|
|
if (onDuplicate) onDuplicate({ fileKey });
|
|
} else {
|
|
if (onSuccess) onSuccess({ fileKey });
|
|
}
|
|
} catch (e) {
|
|
UploadStore.failedFilesCache[fileKey] = file;
|
|
|
|
if (onError) onError({ fileKey });
|
|
Logging.error(e);
|
|
}
|
|
|
|
if (UploadStore.queue.length !== 0) {
|
|
UploadStore.isUploading = false;
|
|
scheduleQueueUpload();
|
|
return;
|
|
}
|
|
|
|
if (onFinish) onFinish();
|
|
};
|
|
|
|
const addToUploadQueue = ({ files, slate, bucketName }) => {
|
|
if (UploadStore.queue.length === 0 && !UploadStore.isUploading && onStart) onStart();
|
|
|
|
if (!files || !files.length) {
|
|
return;
|
|
}
|
|
|
|
for (let i = 0; i < files.length; i++) {
|
|
onAddedToQueue(files[i]);
|
|
UploadStore.queue.push({ file: files[i], slate, bucketName });
|
|
scheduleQueueUpload();
|
|
}
|
|
};
|
|
|
|
return {
|
|
upload: addToUploadQueue,
|
|
};
|
|
}
|
|
|
|
// const cancel = ({ fileKey, context }) => {
|
|
// if (fileKey === UploadQueueStore.currentFile) {
|
|
// console.log("still UPLOADING");
|
|
// }
|
|
// // TODO UI update
|
|
// UploadQueueStore.filter((file) => fileKey(file) !== fileKey);
|
|
// context.setState({});
|
|
// };
|
|
|
|
// const retry = async ({ fileKey, context }) => {
|
|
// const file = FailedFilesCache[fileKey];
|
|
// await upload({ file, context });
|
|
// };
|