Fix correct bytes not being sent, fix showing upload progress and speed
[arvados-workbench2.git] / src / store / collections / uploader / collection-uploader-reducer.ts
index 05735d6590056275a6893a85310db638930952ac..5b24d2c49aebe537d5353f26a3a0708b5d8dda2f 100644 (file)
@@ -2,23 +2,41 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { CollectionUploaderAction, collectionUploaderActions } from "./collection-uploader-actions";
-import { CollectionUploadFile } from "../../../models/collection-file";
+import { CollectionUploaderAction, collectionUploaderActions, UploadFile } from "./collection-uploader-actions";
+import * as _ from 'lodash';
 
-export interface CollectionUploaderState {
-    files: File[];
-}
+export type CollectionUploaderState = UploadFile[];
 
-const initialState: CollectionUploaderState = {
-    files: []
-};
+const initialState: CollectionUploaderState = [];
 
 export const collectionUploaderReducer = (state: CollectionUploaderState = initialState, action: CollectionUploaderAction) => {
     return collectionUploaderActions.match(action, {
-        SET_UPLOAD_FILES: (files) => ({
-            ...state,
-            files
-        }),
+        SET_UPLOAD_FILES: files => files.map((f, idx) => ({
+            id: idx,
+            file: f,
+            prevLoaded: 0,
+            loaded: 0,
+            total: 0,
+            startTime: 0,
+            prevTime: 0,
+            currentTime: 0
+        })),
+        START_UPLOAD: () => {
+            const startTime = Date.now();
+            return state.map(f => ({...f, startTime, prevTime: startTime}));
+        },
+        SET_UPLOAD_PROGRESS: ({ fileId, loaded, total, currentTime }) => {
+            const files = _.cloneDeep(state);
+            const f = files.find(f => f.id === fileId);
+            if (f) {
+                f.prevLoaded = f.loaded;
+                f.loaded = loaded;
+                f.total = total;
+                f.prevTime = f.currentTime;
+                f.currentTime = currentTime;
+            }
+            return files;
+        },
         default: () => state
     });
 };