Browse Source

feat: `useRefreshFlags.ts`

dev
hechang27-sprt 5 months ago
parent
commit
a6d41989a8
  1. 1
      plugs/composables/index.ts
  2. 49
      plugs/composables/useRefreshFlags.ts
  3. 24
      plugs/store/index.ts

1
plugs/composables/index.ts

@ -4,3 +4,4 @@ export * from "./useLoading"; @@ -4,3 +4,4 @@ export * from "./useLoading";
export * from "./useModifyForm";
export * from "./useSysDict";
export * from "./useWatchOnce";
export * from "./useRefreshFlags";

49
plugs/composables/useRefreshFlags.ts

@ -0,0 +1,49 @@ @@ -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<void>,
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 }
);
}
}

24
plugs/store/index.ts

@ -19,6 +19,7 @@ export class State { @@ -19,6 +19,7 @@ export class State {
actions = [];
user = {};
actionPers = {};
refreshFlags = new Map();
}
export class Actions {
@ -69,6 +70,14 @@ 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 { @@ -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 {

Loading…
Cancel
Save