Create collection files upload dialog
[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     (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         return services.collectionService.uploadFiles(collectionUuid, files,\r
41             (fileId, loaded, total, currentTime) => {\r
42                 dispatch(collectionUploaderActions.SET_UPLOAD_PROGRESS({ fileId, loaded, total, currentTime }));\r
43             })\r
44             .then(() => {\r
45                 dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
46             });\r
47     };\r
48 \r
49 export const uploadCurrentCollectionFiles = () =>\r
50     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
51         const currentCollection = getState().collectionPanel.item;\r
52         if (currentCollection) {\r
53             await dispatch<any>(uploadCollectionFiles(currentCollection.uuid));\r
54             dispatch<any>(loadCollectionFiles(currentCollection.uuid));\r
55             dispatch(closeUploadCollectionFilesDialog());\r
56             dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Data has been uploaded.', hideDuration: 2000 }));\r
57         }\r
58     };\r
59 \r
60 export const UPLOAD_COLLECTION_FILES_DIALOG = 'uploadCollectionFilesDialog';\r
61 export const openUploadCollectionFilesDialog = () => (dispatch: Dispatch) => {\r
62     dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
63     dispatch<any>(dialogActions.OPEN_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG, data: {} }));\r
64 };\r
65 \r
66 export const closeUploadCollectionFilesDialog = () => dialogActions.CLOSE_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG });\r