9ea6313131b1d0e598ad5771cf75b5d370b5b86b
[arvados-workbench2.git] / src / store / file-uploader / file-uploader-reducer.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { UploadFile, fileUploaderActions, FileUploaderAction } from "./file-uploader-actions";
6 import * as _ from 'lodash';
7
8 export type UploaderState = UploadFile[];
9
10 const initialState: UploaderState = [];
11
12 export const fileUploaderReducer = (state: UploaderState = initialState, action: FileUploaderAction) => {
13     return fileUploaderActions.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         UPDATE_UPLOAD_FILES: files => {
25             const updateFiles = files.map((f, idx) => ({
26                 id: state.length + idx,
27                 file: f,
28                 prevLoaded: 0,
29                 loaded: 0,
30                 total: 0,
31                 startTime: 0,
32                 prevTime: 0,
33                 currentTime: 0
34             }));
35             const updatedState = state.concat(updateFiles);
36             const uniqUpdatedState = _.uniqBy(updatedState, 'file.name');
37
38             return uniqUpdatedState;
39         },
40         START_UPLOAD: () => {
41             const startTime = Date.now();
42             return state.map(f => ({ ...f, startTime, prevTime: startTime }));
43         },
44         SET_UPLOAD_PROGRESS: ({ fileId, loaded, total, currentTime }) =>
45             state.map(f => f.id === fileId ? {
46                 ...f,
47                 prevLoaded: f.loaded,
48                 loaded,
49                 total,
50                 prevTime: f.currentTime,
51                 currentTime
52             } : f),
53         CLEAR_UPLOAD: () => [],
54         default: () => state
55     });
56 };