diff --git a/src/component/Navbar/StorageBar.js b/src/component/Navbar/StorageBar.js index 575c78f..16224a7 100644 --- a/src/component/Navbar/StorageBar.js +++ b/src/component/Navbar/StorageBar.js @@ -7,11 +7,11 @@ import { sizeToString } from "../../utils"; import { toggleSnackbar } from "../../actions"; import { - withStyles, - LinearProgress, - Typography, Divider, + LinearProgress, Tooltip, + Typography, + withStyles, } from "@material-ui/core"; import ButtonBase from "@material-ui/core/ButtonBase"; import { withRouter } from "react-router"; @@ -68,6 +68,7 @@ const styles = (theme) => ({ }, }); +// TODO 使用 hooks 重构 class StorageBarCompoment extends Component { state = { percent: 0, diff --git a/src/component/Uploader/Popup/MoreActions.js b/src/component/Uploader/Popup/MoreActions.js index bb0ba13..7ad6217 100644 --- a/src/component/Uploader/Popup/MoreActions.js +++ b/src/component/Uploader/Popup/MoreActions.js @@ -8,7 +8,7 @@ import { import React, { useCallback } from "react"; import { DeleteSweep } from "@material-ui/icons"; import { useDispatch } from "react-redux"; -import { toggleSnackbar } from "../../../actions"; +import { refreshStorage, toggleSnackbar } from "../../../actions"; import API from "../../../middleware/Api"; const useStyles = makeStyles((theme) => ({})); @@ -27,6 +27,9 @@ export default function MoreActions({ anchorEl, onClose, uploadManager }) { dispatch(toggleSnackbar(vertical, horizontal, msg, color)), [dispatch] ); + const RefreshStorage = useCallback(() => dispatch(refreshStorage()), [ + dispatch, + ]); const actionClicked = (next) => () => { onClose(); @@ -37,7 +40,17 @@ export default function MoreActions({ anchorEl, onClose, uploadManager }) { uploadManager.cleanupSessions(); API.delete("/file/upload") .then((response) => { - ToggleSnackbar("top", "right", "上传会话已清除", "success"); + if (response.rawData.code === 0) { + ToggleSnackbar("top", "right", "上传会话已清除", "success"); + } else { + ToggleSnackbar( + "top", + "right", + response.rawData.msg, + "warning" + ); + } + RefreshStorage(); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); diff --git a/src/component/Uploader/core/index.ts b/src/component/Uploader/core/index.ts index 0118788..4e686ac 100644 --- a/src/component/Uploader/core/index.ts +++ b/src/component/Uploader/core/index.ts @@ -5,6 +5,7 @@ import Base from "./uploader/base"; import Local from "./uploader/local"; import { Pool } from "./utils/pool"; import { cleanupResumeCtx } from "./utils"; +import Remote from "./uploader/remote"; export interface Option { logLevel: LogLevel; @@ -45,7 +46,8 @@ export default class UploadManager { switch (task.policy.type) { case PolicyType.local: return new Local(task, this); - + case PolicyType.remote: + return new Remote(task, this); default: throw new UnknownPolicyError( "Unknown policy type.", diff --git a/src/component/Uploader/core/types.ts b/src/component/Uploader/core/types.ts index 586baa0..b1af524 100644 --- a/src/component/Uploader/core/types.ts +++ b/src/component/Uploader/core/types.ts @@ -3,6 +3,9 @@ import { ChunkProgress } from "./uploader/chunk"; export enum PolicyType { local = "local", remote = "remote", + oss = "oss", + qiniu = "qiniu", + onedrive = "onedrive", } export interface Policy { diff --git a/src/component/Uploader/core/uploader/base.ts b/src/component/Uploader/core/uploader/base.ts index 571758f..1df4286 100644 --- a/src/component/Uploader/core/uploader/base.ts +++ b/src/component/Uploader/core/uploader/base.ts @@ -45,7 +45,13 @@ export interface Progress { loaded: number; } -const resumePolicy = [PolicyType.local]; +const resumePolicy = [ + PolicyType.local, + PolicyType.remote, + PolicyType.qiniu, + PolicyType.oss, + PolicyType.onedrive, +]; const deleteUploadSessionDelay = 500; export default abstract class Base { diff --git a/src/component/Uploader/core/uploader/remote.ts b/src/component/Uploader/core/uploader/remote.ts new file mode 100644 index 0000000..1af9cb3 --- /dev/null +++ b/src/component/Uploader/core/uploader/remote.ts @@ -0,0 +1,15 @@ +import Chunk, { ChunkInfo } from "./chunk"; +import { loadUploadChunk } from "../api"; + +export default class Remote extends Chunk { + protected async uploadChunk(chunkInfo: ChunkInfo) { + return loadUploadChunk( + this.task.session?.sessionID!, + chunkInfo, + (p) => { + this.updateChunkProgress(p.loaded, chunkInfo.index); + }, + this.cancelToken.token + ); + } +}