5b24d2c49aebe537d5353f26a3a0708b5d8dda2f
[arvados-workbench2.git] / src / store / collections / uploader / collection-uploader-reducer.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { CollectionUploaderAction, collectionUploaderActions, UploadFile } from "./collection-uploader-actions";
6 import * as _ from 'lodash';
7
8 export type CollectionUploaderState = UploadFile[];
9
10 const initialState: CollectionUploaderState = [];
11
12 export const collectionUploaderReducer = (state: CollectionUploaderState = initialState, action: CollectionUploaderAction) => {
13     return collectionUploaderActions.match(action, {
14         SET_UPLOAD_FILES: files => files.map((f, idx) => ({
15             id: idx,
16             file: f,
17             prevLoaded: 0,
18             loaded: 0,
19             total: 0,
20             startTime: 0,
21             prevTime: 0,
22             currentTime: 0
23         })),
24         START_UPLOAD: () => {
25             const startTime = Date.now();
26             return state.map(f => ({...f, startTime, prevTime: startTime}));
27         },
28         SET_UPLOAD_PROGRESS: ({ fileId, loaded, total, currentTime }) => {
29             const files = _.cloneDeep(state);
30             const f = files.find(f => f.id === fileId);
31             if (f) {
32                 f.prevLoaded = f.loaded;
33                 f.loaded = loaded;
34                 f.total = total;
35                 f.prevTime = f.currentTime;
36                 f.currentTime = currentTime;
37             }
38             return files;
39         },
40         default: () => state
41     });
42 };