fix(state_updater): replace delete with deleteInArray

This commit is contained in:
hexxa 2022-04-05 16:30:05 +08:00 committed by Hexxa
parent 7a96cd2483
commit 26a2c7ea46
5 changed files with 62 additions and 74 deletions

View file

@ -41,6 +41,7 @@
"@react-icons/all-files": "^4.1.0", "@react-icons/all-files": "^4.1.0",
"@types/axios": "^0.14.0", "@types/axios": "^0.14.0",
"@types/immutable": "^3.8.7", "@types/immutable": "^3.8.7",
"@types/lodash": "^4.14.181",
"@types/react": "^16.8.13", "@types/react": "^16.8.13",
"@types/react-copy-to-clipboard": "^4.2.6", "@types/react-copy-to-clipboard": "^4.2.6",
"@types/react-dom": "^16.8.4", "@types/react-dom": "^16.8.4",
@ -50,6 +51,7 @@
"css-loader": "^5.0.0", "css-loader": "^5.0.0",
"filesize": "^6.1.0", "filesize": "^6.1.0",
"immutable": "^4.0.0-rc.12", "immutable": "^4.0.0-rc.12",
"lodash": "^4.17.21",
"object-hash": "^2.2.0", "object-hash": "^2.2.0",
"react": "^16.8.6", "react": "^16.8.6",
"react-copy-to-clipboard": "^5.0.1", "react-copy-to-clipboard": "^5.0.1",

View file

@ -36,13 +36,9 @@ export class QuickshareAPI {
return this.updater.props; return this.updater.props;
}; };
delete = async ( deleteInArray = async(itemsToDel: Array<string>): Promise<string> => {
dir: string, return await this.updater.deleteInArray(itemsToDel);
items: Array<MetadataResp>, }
selectedItems: Array<string>
): Promise<string> => {
return await this.updater.delete2(dir, items, selectedItems);
};
} }
const api = new QuickshareAPI(); const api = new QuickshareAPI();

View file

@ -226,27 +226,32 @@ export class FilesPanel extends React.Component<Props, State, {}> {
selectedItems: Map<string, boolean>(), selectedItems: Map<string, boolean>(),
}); });
return; return;
} else { }
const filesToDel = this.state.selectedItems.keySeq().join(", "); const filesToDel = this.state.selectedItems.keySeq().join(", ");
if ( if (
!Env().confirmMsg( !Env().confirmMsg(
`${this.props.msg.pkg.get("op.confirm")} [${ `${this.props.msg.pkg.get("op.confirm")} [${
this.state.selectedItems.size this.state.selectedItems.size
}]: ${filesToDel}` }]: ${filesToDel}`
) )
) { ) {
return; return;
}
} }
this.setLoading(true); this.setLoading(true);
try { try {
const deleteStatus = await updater().delete( const cwd = this.props.filesInfo.dirPath.join("/");
this.props.filesInfo.dirPath, const itemsToDel = this.props.filesInfo.items
this.props.filesInfo.items, .filter((item) => {
this.state.selectedItems 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 !== "") { if (deleteStatus !== "") {
Env().alertMsg( Env().alertMsg(
getErrMsg(this.props.msg.pkg, "op.fail", deleteStatus.toString()) getErrMsg(this.props.msg.pkg, "op.fail", deleteStatus.toString())
@ -254,6 +259,16 @@ export class FilesPanel extends React.Component<Props, State, {}> {
return deleteStatus; 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(); const selfStatus = await updater().self();
if (selfStatus !== "") { if (selfStatus !== "") {
Env().alertMsg( Env().alertMsg(
@ -349,7 +364,9 @@ export class FilesPanel extends React.Component<Props, State, {}> {
const isSharingStatus = await updater().syncIsSharing(dirPath.join("/")); const isSharingStatus = await updater().syncIsSharing(dirPath.join("/"));
if (isSharingStatus !== "") { if (isSharingStatus !== "") {
Env().alertMsg(getErrMsg(this.props.msg.pkg, "op.fail", isSharingStatus)); Env().alertMsg(
getErrMsg(this.props.msg.pkg, "op.fail", isSharingStatus)
);
return; return;
} }

View file

@ -1,4 +1,5 @@
import { List, Map, Set } from "immutable"; import { List, Map, Set } from "immutable";
import _ from "lodash";
import { ICoreState } from "./core_state"; import { ICoreState } from "./core_state";
import { getItemPath, sortRows, Row } from "../common/utils"; import { getItemPath, sortRows, Row } from "../common/utils";
@ -221,65 +222,32 @@ export class Updater {
return ""; return "";
}; };
delete2 = async ( deleteInArray = async (itemsToDel: Array<string>): Promise<string> => {
dir: string,
items: Array<MetadataResp>,
selectedItems: Array<string>
): Promise<string> => {
const dirParts = List(dir.split("/")).filter((part) => part !== "");
const itemsList = List(items);
let selectedItemsMap = Map<string, boolean>();
selectedItems.forEach((item) => {
selectedItemsMap = selectedItemsMap.set(item, true);
});
return this.delete(dirParts, itemsList, selectedItemsMap);
};
delete = async (
dirParts: List<string>,
items: List<MetadataResp>,
selectedItems: Map<string, boolean>
): Promise<string> => {
const pathsToDel = items
.filter((item) => {
return selectedItems.has(item.name);
})
.map((selectedItem: MetadataResp): string => {
return getItemPath(dirParts.join("/"), selectedItem.name);
});
const batchSize = 3; const batchSize = 3;
let batch = List<string>(); const batches = _.chunk(itemsToDel, batchSize);
let fails = List<string>(); let fails = List<string>();
for (let i = 0; i < pathsToDel.size; i++) { for (let i = 0; i < batches.length; i++) {
batch = batch.push(pathsToDel.get(i)); let promises = batches[i].map(
async (itemPath: string): Promise<Response<any>> => {
if (batch.size >= batchSize || i == pathsToDel.size - 1) {
let promises = batch.map(async (itemPath): Promise<Response<any>> => {
return this.filesClient.delete(itemPath); return this.filesClient.delete(itemPath);
}); }
);
const resps = await Promise.all(promises.toSeq()); const resps = await Promise.all(promises);
resps.forEach((resp: Response<any>, i: number) => { resps.forEach((resp: Response<any>, j: number) => {
if (resp.status !== 200) { if (resp.status !== 200) {
fails = fails.push(batch.get(i)); fails = fails.push(batches[i][j]);
} }
}); });
batch = batch.clear();
}
} }
if (fails.size > 0) { if (fails.size > 0) {
Env().alertMsg( return `${errServer}: ${this.props.msg.pkg.get(
`${this.props.msg.pkg.get("delete.fail")}: ${fails.join(",\n")}` "delete.fail"
); )}: ${fails.join(",\n")}`;
return errServer;
} }
return "";
return this.setItems(dirParts);
}; };
refreshFiles = async (): Promise<string> => { refreshFiles = async (): Promise<string> => {

View file

@ -1360,6 +1360,11 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 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@*": "@types/node@*":
version "17.0.23" version "17.0.23"
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"