fix: 修复进度条的问题
This commit is contained in:
83
src/stores/progress.ts
Normal file
83
src/stores/progress.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import type { HubConnection } from "@microsoft/signalr";
|
||||
import type {
|
||||
IProgressHub,
|
||||
IProgressReceiver,
|
||||
} from "@/utils/signalR/TypedSignalR.Client/server.Hubs";
|
||||
import {
|
||||
getHubProxyFactory,
|
||||
getReceiverRegister,
|
||||
} from "@/utils/signalR/TypedSignalR.Client";
|
||||
import { ProgressStatus, type ProgressInfo } from "@/utils/signalR/server.Hubs";
|
||||
import { onMounted, onUnmounted, ref, shallowRef } from "vue";
|
||||
import { defineStore } from "pinia";
|
||||
import { AuthManager } from "@/utils/AuthManager";
|
||||
import { forEach, isUndefined } from "lodash";
|
||||
|
||||
export type ProgressCallback = (msg: ProgressInfo) => void;
|
||||
|
||||
export const useProgressStore = defineStore("progress", () => {
|
||||
// taskId -> name -> callback
|
||||
const progressCallbackFuncs = shallowRef<
|
||||
Map<string, Map<string, ProgressCallback>>
|
||||
>(new Map());
|
||||
|
||||
const progressHubConnection = shallowRef<HubConnection>();
|
||||
const progressHubProxy = shallowRef<IProgressHub>();
|
||||
const progressHubReceiver: IProgressReceiver = {
|
||||
onReceiveProgress: async (msg) => {
|
||||
const taskMap = progressCallbackFuncs.value.get(msg.taskId);
|
||||
if (taskMap) {
|
||||
for (const func of taskMap.values()) {
|
||||
func(msg);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
onMounted(async () => {
|
||||
progressHubConnection.value =
|
||||
AuthManager.createHubConnection("ProgressHub");
|
||||
progressHubProxy.value = getHubProxyFactory("IProgressHub").createHubProxy(
|
||||
progressHubConnection.value,
|
||||
);
|
||||
getReceiverRegister("IProgressReceiver").register(
|
||||
progressHubConnection.value,
|
||||
progressHubReceiver,
|
||||
);
|
||||
progressHubConnection.value.start();
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
if (progressHubConnection.value) {
|
||||
progressHubConnection.value.stop();
|
||||
progressHubConnection.value = undefined;
|
||||
progressHubProxy.value = undefined;
|
||||
}
|
||||
});
|
||||
|
||||
function register(progressId: string, name: string, func: ProgressCallback) {
|
||||
progressHubProxy.value?.join(progressId);
|
||||
let taskMap = progressCallbackFuncs.value.get(progressId);
|
||||
if (!taskMap) {
|
||||
taskMap = new Map();
|
||||
progressCallbackFuncs.value?.set(progressId, taskMap);
|
||||
}
|
||||
taskMap.set(name, func);
|
||||
}
|
||||
|
||||
function unregister(taskId: string, name: string) {
|
||||
progressHubProxy.value?.leave(taskId);
|
||||
const taskMap = progressCallbackFuncs.value.get(taskId);
|
||||
if (taskMap) {
|
||||
taskMap.delete(name);
|
||||
if (taskMap.size === 0) {
|
||||
progressCallbackFuncs.value?.delete(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
register,
|
||||
unregister,
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user