From 1d727b441608ffc769e0d76fef8bbdee6abd12a7 Mon Sep 17 00:00:00 2001 From: hexxa Date: Fri, 27 Aug 2021 18:11:45 +0800 Subject: [PATCH] fix(ui/browser): move files in batch --- .../web/src/components/state_updater.ts | 53 +++++++++++++------ src/client/web/src/i18n/en_US.ts | 1 + src/client/web/src/i18n/zh_CN.ts | 1 + 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/client/web/src/components/state_updater.ts b/src/client/web/src/components/state_updater.ts index 5c18ddf..e01efb9 100644 --- a/src/client/web/src/components/state_updater.ts +++ b/src/client/web/src/components/state_updater.ts @@ -136,11 +136,9 @@ export class Updater { }) .map((selectedItem: MetadataResp): string => { return getItemPath(dirParts.join("/"), selectedItem.name); - // const resp = await this.filesClient.delete(itemPath); - // return resp.status === 200 ? "" : selectedItem.name; }); - const batchSize = 5; + const batchSize = 3; let batch = List(); let fails = List(); @@ -164,7 +162,9 @@ export class Updater { } if (fails.size > 0) { - alertMsg(`failed to delete ${fails.join(",\n")}`); + alertMsg( + `${this.props.msg.pkg.get("delete.fail")}: ${fails.join(",\n")}` + ); } return this.setItems(dirParts); @@ -196,21 +196,44 @@ export class Updater { dstDir: string, selectedItems: Map ): Promise => { - const moveRequests = List(selectedItems.keys()).map( - async (itemName: string): Promise => { - const oldPath = getItemPath(srcDir, itemName); - const newPath = getItemPath(dstDir, itemName); - const resp = await this.filesClient.move(oldPath, newPath); - return resp.status === 200 ? "" : itemName; + const itemsToMove = List(selectedItems.keys()).map( + (itemName: string): any => { + const from = getItemPath(srcDir, itemName); + const to = getItemPath(dstDir, itemName); + return { from, to }; + // const resp = await this.filesClient.move(oldPath, newPath); + // return resp.status === 200 ? "" : itemName; } ); - const failedFiles = await Promise.all(moveRequests); - failedFiles.forEach((failedItem) => { - if (failedItem !== "") { - alertMsg(`failed to move ${failedItem}`); + const batchSize = 3; + let batch = List(); + let fails = List(); + + for (let i = 0; i < itemsToMove.size; i++) { + batch = batch.push(itemsToMove.get(i)); + + if (batch.size >= batchSize || i == itemsToMove.size - 1) { + let promises = batch.map(async (fromTo: any): Promise> => { + return this.filesClient.move(fromTo.from, fromTo.to); + }); + + const resps = await Promise.all(promises.toSeq()); + resps.forEach((resp: Response, i: number) => { + if (resp.status !== 200) { + fails = fails.push(batch.get(i).from); + } + }); + + batch = batch.clear(); } - }); + } + + if (fails.size > 0) { + alertMsg( + `${this.props.msg.pkg.get("move.fail")}: ${fails.join(",\n")}` + ); + } return this.setItems(List(dstDir.split("/"))); }; diff --git a/src/client/web/src/i18n/en_US.ts b/src/client/web/src/i18n/en_US.ts index 3dcb1c8..5ac7232 100644 --- a/src/client/web/src/i18n/en_US.ts +++ b/src/client/web/src/i18n/en_US.ts @@ -65,4 +65,5 @@ export const msgs: Map = Map({ "admin.roles": "Roles", zhCN: "Chinese (simplified)", enUS: "English (USA)", + "move.fail": "Failed to move", }); diff --git a/src/client/web/src/i18n/zh_CN.ts b/src/client/web/src/i18n/zh_CN.ts index c276e52..efe88ea 100644 --- a/src/client/web/src/i18n/zh_CN.ts +++ b/src/client/web/src/i18n/zh_CN.ts @@ -64,4 +64,5 @@ export const msgs: Map = Map({ "admin.roles": "角色列表", "zhCN": "中文简体", "enUS": "英语美国", + "move.fail": "移动失败", });