Merge branch '14102-actions-repository'
[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 { unionize, ofType, UnionOf } from "~/common/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 \r
31 export type CollectionUploaderAction = UnionOf<typeof collectionUploaderActions>;\r
32 \r
33 export const uploadCollectionFiles = (collectionUuid: string) =>\r
34     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
35         dispatch(collectionUploaderActions.START_UPLOAD());\r
36         const files = getState().collections.uploader.map(file => file.file);\r
37         await services.collectionService.uploadFiles(collectionUuid, files, handleUploadProgress(dispatch));\r
38         dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
39     };\r
40 \r
41 \r
42 export const uploadCurrentCollectionFiles = () =>\r
43     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {\r
44         const currentCollection = getState().collectionPanel.item;\r
45         if (currentCollection) {\r
46             await dispatch<any>(uploadCollectionFiles(currentCollection.uuid));\r
47             dispatch<any>(loadCollectionFiles(currentCollection.uuid));\r
48             dispatch(closeUploadCollectionFilesDialog());\r
49             dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Data has been uploaded.', hideDuration: 2000 }));\r
50         }\r
51     };\r
52 \r
53 export const UPLOAD_COLLECTION_FILES_DIALOG = 'uploadCollectionFilesDialog';\r
54 export const openUploadCollectionFilesDialog = () => (dispatch: Dispatch) => {\r
55     dispatch(collectionUploaderActions.CLEAR_UPLOAD());\r
56     dispatch<any>(dialogActions.OPEN_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG, data: {} }));\r
57 };\r
58 \r
59 export const closeUploadCollectionFilesDialog = () => dialogActions.CLOSE_DIALOG({ id: UPLOAD_COLLECTION_FILES_DIALOG });\r
60 \r
61 const handleUploadProgress = (dispatch: Dispatch) => (fileId: number, loaded: number, total: number, currentTime: number) => {\r
62     dispatch(collectionUploaderActions.SET_UPLOAD_PROGRESS({ fileId, loaded, total, currentTime }));\r
63 };