useMessageLoop.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { effectScope, onScopeDispose, watch } from 'vue'
  2. import { useIntervalFn } from '@vueuse/core'
  3. import uesFetch from '@/hooks/useFetch'
  4. import useMainStore from '@/store/main'
  5. import type { EffectScope, ShallowRef } from 'vue'
  6. import type { ExtractApiResponse } from '@/api/api'
  7. const useMessageLoop = () => {
  8. const mainStore = useMainStore()
  9. const { fetch: getUnReadMessage, result: unReadMessage } = uesFetch('getUnReadMessage')
  10. watch(
  11. () => mainStore?.myUserInfo?.role,
  12. () => {
  13. if (mainStore?.myUserInfo?.role && mainStore?.myUserInfo?.role !== 'ADMIN') {
  14. getUnReadMessage()
  15. useIntervalFn(getUnReadMessage, 30 * 1000)
  16. }
  17. },
  18. {
  19. immediate: true,
  20. }
  21. )
  22. return unReadMessage
  23. }
  24. function createSharedComposable<Fn extends (...args: any[]) => any>(composable: Fn) {
  25. let subscribers = 0
  26. let state: ShallowRef<ExtractApiResponse<'getUnReadMessage'>> | null | undefined
  27. let scope: EffectScope | null
  28. const dispose = () => {
  29. console.log('dispose', scope)
  30. if (scope && --subscribers <= 0) {
  31. scope.stop()
  32. state = scope = null
  33. }
  34. }
  35. return () => {
  36. subscribers++
  37. if (!state) {
  38. scope = effectScope(true)
  39. state = scope.run(composable)
  40. }
  41. onScopeDispose(dispose)
  42. return state
  43. }
  44. }
  45. export default createSharedComposable(useMessageLoop)