From a6d41989a883d7093457118c522839e7684fc685 Mon Sep 17 00:00:00 2001 From: hechang27-sprt Date: Mon, 26 Jan 2026 10:56:38 +0800 Subject: [PATCH] feat: `useRefreshFlags.ts` --- plugs/composables/index.ts | 1 + plugs/composables/useRefreshFlags.ts | 49 ++++++++++++++++++++++++++++ plugs/store/index.ts | 24 ++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 plugs/composables/useRefreshFlags.ts diff --git a/plugs/composables/index.ts b/plugs/composables/index.ts index 8e28f4b..0a0ce04 100644 --- a/plugs/composables/index.ts +++ b/plugs/composables/index.ts @@ -4,3 +4,4 @@ export * from "./useLoading"; export * from "./useModifyForm"; export * from "./useSysDict"; export * from "./useWatchOnce"; +export * from "./useRefreshFlags"; diff --git a/plugs/composables/useRefreshFlags.ts b/plugs/composables/useRefreshFlags.ts new file mode 100644 index 0000000..90a03fb --- /dev/null +++ b/plugs/composables/useRefreshFlags.ts @@ -0,0 +1,49 @@ +import { watch } from "vue"; +import { useRoute } from "vue-router"; +import { useStore } from "vuex"; + +export function useRefreshFlags( + flags: string[], + cb: () => void | Promise, + match: "any" | "all" = "any", + token?: string +) { + const { state, dispatch } = useStore(); + + if (!token) { + const route = useRoute(); + token = route.path; + } + + const flagSet = new Set(flags); + + let test; + if (match === "any") { + test = () => { + const inter = flagSet.intersection(state.refreshFlags); + return inter.size > 0 && Iterator.from(inter).some((flag) => !state.refreshFlags.get(flag)?.has(token)); + }; + } else if (match === "all") { + test = () => { + const isSubset = flagSet.isSubsetOf(state.refreshFlags); + return isSubset && !Iterator.from(flagSet).some((flag) => state.refreshFlags.get(flag)?.has(token)); + }; + } + + if (test) { + watch( + () => { + // Explicitly access state.refreshFlags to ensure reactive tracking + const _ = state.refreshFlags; + return test(); + }, + async (value, oldValue) => { + if (value) { + await cb(); + await dispatch("unsetRefreshFlag", { flags, token }); + } + }, + { immediate: true } + ); + } +} diff --git a/plugs/store/index.ts b/plugs/store/index.ts index 5250cd1..64ac684 100644 --- a/plugs/store/index.ts +++ b/plugs/store/index.ts @@ -19,6 +19,7 @@ export class State { actions = []; user = {}; actionPers = {}; + refreshFlags = new Map(); } export class Actions { @@ -69,6 +70,14 @@ export class Actions { commit("initSize"); this.getMenus(store); }; + + setRefreshFlag = ({ state, commit }, flags: string[]) => { + commit("setRefreshFlag", flags); + }; + + unsetRefreshFlag = ({ state, commit }, params: { flags: string[]; token: string }) => { + commit("unsetRefreshFlag", params); + }; } export class Mutations { @@ -97,6 +106,21 @@ export class Mutations { updateDict = (state, param) => { state.dict[param[0]] = param[1]; }; + + setRefreshFlag = (state, flags: string[]) => { + for (const flag of flags) { + state.refreshFlags.set(flag, new Set()); + } + }; + + unsetRefreshFlag = (state, { flags, token }: { flags: string[]; token: string }) => { + for (const flag of flags) { + if (!state.refreshFlags.has(flag)) { + state.refreshFlags.set(flag, new Set()); + } + state.refreshFlags.get(flag).add(token); + } + }; } export class Getters {