import type { ComputedRef, Ref } from 'vue'; import { computed, nextTick, onActivated, onBeforeUnmount, onMounted, unref, watch } from 'vue'; import { useRoute } from 'vue-router'; import { consumePendingAnalysisRefresh, registerAnalysisRefreshHandler, resolveAnalysisRefreshRouteKey, syncAnalysisRefreshState, unregisterAnalysisRefreshHandler, } from '@jeesite/core/logics/analysisRefreshPrompt'; interface UseAnalysisRefreshPromptOptions { refresh: () => Promise | void; hasData?: Ref | ComputedRef | (() => boolean); } export function useAnalysisRefreshPrompt(options: UseAnalysisRefreshPromptOptions) { const route = useRoute(); const routeKey = computed(() => resolveAnalysisRefreshRouteKey(route)); const resolveHasData = () => { if (!options.hasData) return false; return typeof options.hasData === 'function' ? !!options.hasData() : !!unref(options.hasData); }; const runPendingRefresh = async () => { const refreshHandler = consumePendingAnalysisRefresh(routeKey.value); if (!refreshHandler) return; await nextTick(); await refreshHandler(); }; const registerHandler = () => { if (!routeKey.value) return; registerAnalysisRefreshHandler(routeKey.value, options.refresh); }; onMounted(() => { registerHandler(); void runPendingRefresh(); }); onActivated(() => { registerHandler(); void runPendingRefresh(); }); onBeforeUnmount(() => { unregisterAnalysisRefreshHandler(routeKey.value); }); if (options.hasData) { watch( resolveHasData, (hasData) => { if (!routeKey.value) return; syncAnalysisRefreshState(routeKey.value, !!hasData); }, { immediate: true }, ); } const syncAnalysisDataRefreshState = (hasData = resolveHasData()) => { if (!routeKey.value) return; syncAnalysisRefreshState(routeKey.value, hasData); }; return { syncAnalysisDataRefreshState, }; }