From 26a2c7ea460dc36becddd60105ce583e58e54a30 Mon Sep 17 00:00:00 2001 From: hexxa Date: Tue, 5 Apr 2022 16:30:05 +0800 Subject: [PATCH] fix(state_updater): replace delete with deleteInArray --- src/client/web/package.json | 2 + src/client/web/src/components/api.ts | 10 +-- src/client/web/src/components/panel_files.tsx | 51 +++++++++----- .../web/src/components/state_updater.ts | 68 +++++-------------- yarn.lock | 5 ++ 5 files changed, 62 insertions(+), 74 deletions(-) diff --git a/src/client/web/package.json b/src/client/web/package.json index ccaaab8..a2f7589 100644 --- a/src/client/web/package.json +++ b/src/client/web/package.json @@ -41,6 +41,7 @@ "@react-icons/all-files": "^4.1.0", "@types/axios": "^0.14.0", "@types/immutable": "^3.8.7", + "@types/lodash": "^4.14.181", "@types/react": "^16.8.13", "@types/react-copy-to-clipboard": "^4.2.6", "@types/react-dom": "^16.8.4", @@ -50,6 +51,7 @@ "css-loader": "^5.0.0", "filesize": "^6.1.0", "immutable": "^4.0.0-rc.12", + "lodash": "^4.17.21", "object-hash": "^2.2.0", "react": "^16.8.6", "react-copy-to-clipboard": "^5.0.1", diff --git a/src/client/web/src/components/api.ts b/src/client/web/src/components/api.ts index b5208c8..b33bd64 100644 --- a/src/client/web/src/components/api.ts +++ b/src/client/web/src/components/api.ts @@ -36,13 +36,9 @@ export class QuickshareAPI { return this.updater.props; }; - delete = async ( - dir: string, - items: Array, - selectedItems: Array - ): Promise => { - return await this.updater.delete2(dir, items, selectedItems); - }; + deleteInArray = async(itemsToDel: Array): Promise => { + return await this.updater.deleteInArray(itemsToDel); + } } const api = new QuickshareAPI(); diff --git a/src/client/web/src/components/panel_files.tsx b/src/client/web/src/components/panel_files.tsx index 6fc673d..11e43ae 100644 --- a/src/client/web/src/components/panel_files.tsx +++ b/src/client/web/src/components/panel_files.tsx @@ -226,27 +226,32 @@ export class FilesPanel extends React.Component { selectedItems: Map(), }); return; - } else { - const filesToDel = this.state.selectedItems.keySeq().join(", "); - if ( - !Env().confirmMsg( - `${this.props.msg.pkg.get("op.confirm")} [${ - this.state.selectedItems.size - }]: ${filesToDel}` - ) - ) { - return; - } + } + const filesToDel = this.state.selectedItems.keySeq().join(", "); + if ( + !Env().confirmMsg( + `${this.props.msg.pkg.get("op.confirm")} [${ + this.state.selectedItems.size + }]: ${filesToDel}` + ) + ) { + return; } this.setLoading(true); try { - const deleteStatus = await updater().delete( - this.props.filesInfo.dirPath, - this.props.filesInfo.items, - this.state.selectedItems - ); + const cwd = this.props.filesInfo.dirPath.join("/"); + const itemsToDel = this.props.filesInfo.items + .filter((item) => { + return this.state.selectedItems.has(item.name); + }) + .map((selectedItem: MetadataResp): string => { + return getItemPath(cwd, selectedItem.name); + }) + .toArray(); + + const deleteStatus = await updater().deleteInArray(itemsToDel); if (deleteStatus !== "") { Env().alertMsg( getErrMsg(this.props.msg.pkg, "op.fail", deleteStatus.toString()) @@ -254,6 +259,16 @@ export class FilesPanel extends React.Component { return deleteStatus; } + const refreshStatus = await updater().setItems( + this.props.filesInfo.dirPath + ); + if (refreshStatus !== "") { + Env().alertMsg( + getErrMsg(this.props.msg.pkg, "op.fail", refreshStatus.toString()) + ); + return refreshStatus; + } + const selfStatus = await updater().self(); if (selfStatus !== "") { Env().alertMsg( @@ -349,7 +364,9 @@ export class FilesPanel extends React.Component { const isSharingStatus = await updater().syncIsSharing(dirPath.join("/")); if (isSharingStatus !== "") { - Env().alertMsg(getErrMsg(this.props.msg.pkg, "op.fail", isSharingStatus)); + Env().alertMsg( + getErrMsg(this.props.msg.pkg, "op.fail", isSharingStatus) + ); return; } diff --git a/src/client/web/src/components/state_updater.ts b/src/client/web/src/components/state_updater.ts index 3e5b072..7e06bbd 100644 --- a/src/client/web/src/components/state_updater.ts +++ b/src/client/web/src/components/state_updater.ts @@ -1,4 +1,5 @@ import { List, Map, Set } from "immutable"; +import _ from "lodash"; import { ICoreState } from "./core_state"; import { getItemPath, sortRows, Row } from "../common/utils"; @@ -221,65 +222,32 @@ export class Updater { return ""; }; - delete2 = async ( - dir: string, - items: Array, - selectedItems: Array - ): Promise => { - const dirParts = List(dir.split("/")).filter((part) => part !== ""); - const itemsList = List(items); - let selectedItemsMap = Map(); - selectedItems.forEach((item) => { - selectedItemsMap = selectedItemsMap.set(item, true); - }); - - return this.delete(dirParts, itemsList, selectedItemsMap); - }; - - delete = async ( - dirParts: List, - items: List, - selectedItems: Map - ): Promise => { - const pathsToDel = items - .filter((item) => { - return selectedItems.has(item.name); - }) - .map((selectedItem: MetadataResp): string => { - return getItemPath(dirParts.join("/"), selectedItem.name); - }); - + deleteInArray = async (itemsToDel: Array): Promise => { const batchSize = 3; - let batch = List(); + const batches = _.chunk(itemsToDel, batchSize); let fails = List(); - for (let i = 0; i < pathsToDel.size; i++) { - batch = batch.push(pathsToDel.get(i)); - - if (batch.size >= batchSize || i == pathsToDel.size - 1) { - let promises = batch.map(async (itemPath): Promise> => { + for (let i = 0; i < batches.length; i++) { + let promises = batches[i].map( + async (itemPath: string): Promise> => { return this.filesClient.delete(itemPath); - }); + } + ); - const resps = await Promise.all(promises.toSeq()); - resps.forEach((resp: Response, i: number) => { - if (resp.status !== 200) { - fails = fails.push(batch.get(i)); - } - }); - - batch = batch.clear(); - } + const resps = await Promise.all(promises); + resps.forEach((resp: Response, j: number) => { + if (resp.status !== 200) { + fails = fails.push(batches[i][j]); + } + }); } if (fails.size > 0) { - Env().alertMsg( - `${this.props.msg.pkg.get("delete.fail")}: ${fails.join(",\n")}` - ); - return errServer; + return `${errServer}: ${this.props.msg.pkg.get( + "delete.fail" + )}: ${fails.join(",\n")}`; } - - return this.setItems(dirParts); + return ""; }; refreshFiles = async (): Promise => { diff --git a/yarn.lock b/yarn.lock index 9073404..bce240c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1360,6 +1360,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/lodash@^4.14.181": + version "4.14.181" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.181.tgz#d1d3740c379fda17ab175165ba04e2d03389385d" + integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag== + "@types/node@*": version "17.0.23" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"