0fa55d836cd9510d1840ffb450b9e57801a4a34b
[arvados-workbench2.git] / src / store / collections / uploader / collection-uploader-actions.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.\r
2 //\r
3 // SPDX-License-Identifier: AGPL-3.0\r
4 \r
5 import { default as unionize, ofType, UnionOf } from "unionize";\r
6 import { Dispatch } from 'redux';\r
7 import { RootState } from '~/store/store';\r
8 import { ServiceRepository } from '~/services/services';\r
9 import { dialogActions } from '~/store/dialog/dialog-actions';\r
10 import { loadCollectionFiles } from '../../collection-panel/collection-panel-files/collection-panel-files-actions';\r
11 import { snackbarActions } from "~/store/snackbar/snackbar-actions";\r
12 \r
13 export interface UploadFile {\r
14     id: number;\r
15     file: File;\r
16     prevLoaded: number;\r
17     loaded: number;\r
18     total: number;\r
19     startTime: number;\r
20     prevTime: number;\r
21     currentTime: number;\r
22 }\r
23 \r
24 export const collectionUploaderActions = unionize({\r
25     SET_UPLOAD_FILES: ofType<File[]>(),\r
26     START_UPLOAD: ofType(),\r
27     SET_UPLOAD_PROGRESS: ofType<{ fileId: number, loaded: number, total: number, currentTime: number }>(),\r
28     CLEAR_UPLOAD: ofType()\r
29 }, {\r
30     tag: 'type',\r
31     value: 'payload'\r
32 });\r
33 \r
34 export type CollectionUploaderAction = UnionOf<typeof collectionUploaderActions>;\r
35 \r
36 export const uploadCollectionFiles = (collectionUuid: string) =>\r
37     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
38         dispatch(collectionUploaderActions.START_UPLOAD());\r
39         const files = getState().collections.uploader.map(file => file.file);\r
40         await services.collectionService.uploadFiles(collectionUuid, files, handleUploadProgress(dispatch));\r
41         dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
42     };\r
43 \r
44 \r
45 export const uploadCurrentCollectionFiles = () =>\r
46     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
47         const currentCollection = getState().collectionPanel.item;\r
48         if (currentCollection) {\r
49             await dispatch<any>(uploadCollectionFiles(currentCollection.uuid));\r
50             dispatch<any>(loadCollectionFiles(currentCollection.uuid));\r
51             dispatch(closeUploadCollectionFilesDialog());\r
52             dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Data has been uploaded.', hideDuration: 2000 }));\r
53         }\r
54     };\r
55 \r
56 export const UPLOAD_COLLECTION_FILES_DIALOG = 'uploadCollectionFilesDialog';\r
57 export const openUploadCollectionFilesDialog = () => (dispatch: Dispatch) => {\r
58     dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
59     dispatch<any>(dialogActions.OPEN_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG, data: {} }));\r
60 };\r
61 \r
62 export const closeUploadCollectionFilesDialog = () => dialogActions.CLOSE_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG });\r
63 \r
64 const handleUploadProgress = (dispatch: Dispatch) => (fileId: number, loaded: number, total: number, currentTime: number) => {\r
65     dispatch(collectionUploaderActions.SET_UPLOAD_PROGRESS({ fileId, loaded, total, currentTime }));\r
66 };