diff --git a/src/component/Modals/ConcurrentOption.js b/src/component/Modals/ConcurrentOption.js
new file mode 100644
index 0000000..a3bf0cd
--- /dev/null
+++ b/src/component/Modals/ConcurrentOption.js
@@ -0,0 +1,62 @@
+import React, { useState } from "react";
+import { Input, InputLabel, makeStyles } from "@material-ui/core";
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+} from "@material-ui/core";
+import FormControl from "@material-ui/core/FormControl";
+import Auth from "../../middleware/Auth";
+const useStyles = makeStyles((theme) => ({}));
+
+export default function ConcurrentOptionDialog({ open, onClose, onSave }) {
+ const [count, setCount] = useState(
+ Auth.GetPreferenceWithDefault("concurrent_limit", "5")
+ );
+ const classes = useStyles();
+
+ return (
+
+ );
+}
diff --git a/src/component/Uploader/Popup/MoreActions.js b/src/component/Uploader/Popup/MoreActions.js
index d9edce4..caf9292 100644
--- a/src/component/Uploader/Popup/MoreActions.js
+++ b/src/component/Uploader/Popup/MoreActions.js
@@ -6,7 +6,7 @@ import {
MenuItem,
Tooltip,
} from "@material-ui/core";
-import React, { useCallback, useMemo } from "react";
+import React, { useCallback, useMemo, useState } from "react";
import { useDispatch } from "react-redux";
import API from "../../../middleware/Api";
import { TaskType } from "../core/types";
@@ -15,6 +15,9 @@ import Divider from "@material-ui/core/Divider";
import CheckIcon from "@material-ui/icons/Check";
import { DeleteEmpty } from "mdi-material-ui";
import DeleteIcon from "@material-ui/icons/Delete";
+import ConcurrentOptionDialog from "../../Modals/ConcurrentOption";
+import Auth from "../../../middleware/Auth";
+import { ClearAll } from "@material-ui/icons";
const useStyles = makeStyles((theme) => ({
icon: {
@@ -37,6 +40,7 @@ export default function MoreActions({
}) {
const classes = useStyles();
const dispatch = useDispatch();
+ const [concurrentDialog, setConcurrentDialog] = useState(false);
const ToggleSnackbar = useCallback(
(vertical, horizontal, msg, color) =>
dispatch(toggleSnackbar(vertical, horizontal, msg, color)),
@@ -126,6 +130,13 @@ export default function MoreActions({
onClick: () => cleanFinished(),
icon: ,
text: "清除已完成任务",
+ divider: true,
+ },
+ {
+ tooltip: "清除列表中已完成、失败、被取消的任务",
+ onClick: () => setConcurrentDialog(true),
+ icon: ,
+ text: "设置并行数量",
divider: false,
},
],
@@ -140,25 +151,44 @@ export default function MoreActions({
]
);
+ const onConcurrentLimitSave = (val) => {
+ val = parseInt(val);
+ if (val > 0) {
+ Auth.SetPreference("concurrent_limit", val);
+ uploadManager.changeConcurrentLimit(parseInt(val));
+ }
+ setConcurrentDialog(false);
+ };
+
return (
-
+ <>
+
+ setConcurrentDialog(false)}
+ onSave={onConcurrentLimitSave}
+ />
+ >
);
}
diff --git a/src/component/Uploader/Popup/TaskList.js b/src/component/Uploader/Popup/TaskList.js
index 87ebb05..2c63b64 100644
--- a/src/component/Uploader/Popup/TaskList.js
+++ b/src/component/Uploader/Popup/TaskList.js
@@ -109,9 +109,6 @@ const filters = {
ongoing: (u) => u.status < Status.finished,
};
-const getTaskListPreference = (key, defaultVal) =>
- Auth.GetPreference(key) ? Auth.GetPreference(key) : defaultVal;
-
export default function TaskList({
open,
onClose,
diff --git a/src/component/Uploader/Uploader.js b/src/component/Uploader/Uploader.js
index 0df3100..d8e4163 100644
--- a/src/component/Uploader/Uploader.js
+++ b/src/component/Uploader/Uploader.js
@@ -13,6 +13,7 @@ import {
refreshStorage,
toggleSnackbar,
} from "../../redux/explorer";
+import Auth from "../../middleware/Auth";
let totalProgressCollector = null;
let lastProgressStart = -1;
@@ -82,7 +83,9 @@ export default function Uploader() {
const uploadManager = useMemo(() => {
return new UploadManager({
logLevel: "INFO",
- concurrentLimit: 5,
+ concurrentLimit: parseInt(
+ Auth.GetPreferenceWithDefault("concurrent_limit", "5")
+ ),
dropZone: document.querySelector("body"),
onToast: (type, msg) => {
ToggleSnackbar("top", "right", msg, type);
diff --git a/src/component/Uploader/core/index.ts b/src/component/Uploader/core/index.ts
index 64eba59..11ef391 100644
--- a/src/component/Uploader/core/index.ts
+++ b/src/component/Uploader/core/index.ts
@@ -79,6 +79,10 @@ export default class UploadManager {
}
}
+ changeConcurrentLimit = (newLimit: number) => {
+ this.pool.limit = newLimit;
+ };
+
dispatchUploader(task: Task): Base {
if (task.type == TaskType.resumeHint) {
return new ResumeHint(task, this);
diff --git a/src/component/Uploader/core/utils/pool.ts b/src/component/Uploader/core/utils/pool.ts
index 143828d..e7dd020 100644
--- a/src/component/Uploader/core/utils/pool.ts
+++ b/src/component/Uploader/core/utils/pool.ts
@@ -11,7 +11,7 @@ export class Pool {
queue: Array = [];
processing: Array = [];
- constructor(private limit: number) {}
+ constructor(public limit: number) {}
enqueue(uploader: Base) {
return new Promise((resolve, reject) => {