import { type InjectionKey, type Ref, inject, provide, ref } from 'vue'; interface WorkbenchWorklogSignal { /** 递增版本号:工时类 widget watch 它触发重拉 */ revision: Ref; /** 任一 widget 内联填报/修改工时后调用,广播给同一工作台内的工时类 widget */ notify: () => void; } const WORKBENCH_WORKLOG_SIGNAL: InjectionKey = Symbol('workbench-worklog-signal'); /** * 工作台内联填报工时的跨 widget 刷新信号。 * * todo 面板等 widget 可在工作台路由内弹层填报工时,不触发工作台 keepAlive 的 onActivated, * 「我的工时」widget 因此停在旧数据。用 provide/inject 在工作台根广播一个版本号, * 填报方 notify、展示方 watch revision 重拉,作用域限定在工作台子树、不进全局 store。 */ export function provideWorkbenchWorklogSignal(): WorkbenchWorklogSignal { const revision = ref(0); const signal: WorkbenchWorklogSignal = { revision, notify: () => { revision.value += 1; } }; provide(WORKBENCH_WORKLOG_SIGNAL, signal); return signal; } /** widget 内消费:notify 上报变更、revision 供 watch 重拉;脱离工作台根时退化为无操作 */ export function useWorkbenchWorklogSignal(): WorkbenchWorklogSignal { return inject(WORKBENCH_WORKLOG_SIGNAL, { revision: ref(0), notify: () => {} }); }