useAnalysisRefreshPrompt.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import type { ComputedRef, Ref } from 'vue';
  2. import { computed, nextTick, onActivated, onBeforeUnmount, onMounted, unref, watch } from 'vue';
  3. import { useRoute } from 'vue-router';
  4. import {
  5. consumePendingAnalysisRefresh,
  6. registerAnalysisRefreshHandler,
  7. resolveAnalysisRefreshRouteKey,
  8. syncAnalysisRefreshState,
  9. unregisterAnalysisRefreshHandler,
  10. } from '@jeesite/core/logics/analysisRefreshPrompt';
  11. interface UseAnalysisRefreshPromptOptions {
  12. refresh: () => Promise<void> | void;
  13. hasData?: Ref<boolean> | ComputedRef<boolean> | (() => boolean);
  14. }
  15. export function useAnalysisRefreshPrompt(options: UseAnalysisRefreshPromptOptions) {
  16. const route = useRoute();
  17. const routeKey = computed(() => resolveAnalysisRefreshRouteKey(route));
  18. const resolveHasData = () => {
  19. if (!options.hasData) return false;
  20. return typeof options.hasData === 'function' ? !!options.hasData() : !!unref(options.hasData);
  21. };
  22. const runPendingRefresh = async () => {
  23. const refreshHandler = consumePendingAnalysisRefresh(routeKey.value);
  24. if (!refreshHandler) return;
  25. await nextTick();
  26. await refreshHandler();
  27. };
  28. const registerHandler = () => {
  29. if (!routeKey.value) return;
  30. registerAnalysisRefreshHandler(routeKey.value, options.refresh);
  31. };
  32. onMounted(() => {
  33. registerHandler();
  34. void runPendingRefresh();
  35. });
  36. onActivated(() => {
  37. registerHandler();
  38. void runPendingRefresh();
  39. });
  40. onBeforeUnmount(() => {
  41. unregisterAnalysisRefreshHandler(routeKey.value);
  42. });
  43. if (options.hasData) {
  44. watch(
  45. resolveHasData,
  46. (hasData) => {
  47. if (!routeKey.value) return;
  48. syncAnalysisRefreshState(routeKey.value, !!hasData);
  49. },
  50. { immediate: true },
  51. );
  52. }
  53. const syncAnalysisDataRefreshState = (hasData = resolveHasData()) => {
  54. if (!routeKey.value) return;
  55. syncAnalysisRefreshState(routeKey.value, hasData);
  56. };
  57. return {
  58. syncAnalysisDataRefreshState,
  59. };
  60. }