| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 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> | void;
- hasData?: Ref<boolean> | ComputedRef<boolean> | (() => 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,
- };
- }
|