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",
"@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",

View file

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

View file

@ -226,27 +226,32 @@ export class FilesPanel extends React.Component<Props, State, {}> {
selectedItems: Map<string, boolean>(),
});
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<Props, State, {}> {
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<Props, State, {}> {
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;
}

View file

@ -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<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);
});
deleteInArray = async (itemsToDel: Array<string>): Promise<string> => {
const batchSize = 3;
let batch = List<string>();
const batches = _.chunk(itemsToDel, batchSize);
let fails = List<string>();
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<Response<any>> => {
for (let i = 0; i < batches.length; i++) {
let promises = batches[i].map(
async (itemPath: string): Promise<Response<any>> => {
return this.filesClient.delete(itemPath);
});
}
);
const resps = await Promise.all(promises.toSeq());
resps.forEach((resp: Response<any>, 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<any>, 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<string> => {