35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
import { type InjectionKey, type Ref, inject, provide, ref } from 'vue';
|
||
|
||
interface WorkbenchWorklogSignal {
|
||
/** 递增版本号:工时类 widget watch 它触发重拉 */
|
||
revision: Ref<number>;
|
||
/** 任一 widget 内联填报/修改工时后调用,广播给同一工作台内的工时类 widget */
|
||
notify: () => void;
|
||
}
|
||
|
||
const WORKBENCH_WORKLOG_SIGNAL: InjectionKey<WorkbenchWorklogSignal> = 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: () => {} });
|
||
}
|