macro.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. import { without } from 'lodash-es'
  3. import { defineStore } from 'pinia'
  4. import { computed, nextTick, ref, toValue } from 'vue'
  5. import { useMacrosUpdateSubscription } from '#shared/graphql/subscriptions/macrosUpdate.api.ts'
  6. import type {
  7. MacrosQuery,
  8. MacrosQueryVariables,
  9. } from '#shared/graphql/types.ts'
  10. import QueryHandler from '#shared/server/apollo/handler/QueryHandler.ts'
  11. import SubscriptionHandler from '#shared/server/apollo/handler/SubscriptionHandler.ts'
  12. export const useMacroStore = defineStore('macro', () => {
  13. const usageKeys = ref<string[]>([])
  14. const queryByUsageKey = new Map<
  15. string,
  16. QueryHandler<MacrosQuery, MacrosQueryVariables>
  17. >()
  18. const activate = (
  19. usageKey: string,
  20. query: QueryHandler<MacrosQuery, MacrosQueryVariables>,
  21. ) => {
  22. usageKeys.value.push(usageKey)
  23. queryByUsageKey.set(usageKey, query)
  24. }
  25. const enabled = computed(() => usageKeys.value.length > 0)
  26. const macroSubscription = new SubscriptionHandler(
  27. useMacrosUpdateSubscription(() => ({ enabled })),
  28. )
  29. macroSubscription.onResult((data) => {
  30. const macroId = data.data?.macrosUpdate.macroId
  31. const groupIds = data.data?.macrosUpdate.groupIds
  32. const removeMacroId = data.data?.macrosUpdate.removeMacroId
  33. if (!macroId && !removeMacroId) return
  34. const refetchFor: Record<string, boolean> = {}
  35. queryByUsageKey.forEach((query) => {
  36. const macros = query.operationResult.result.value?.macros
  37. if (
  38. !macros ||
  39. (removeMacroId && !macros.find((macro) => macro.id === removeMacroId))
  40. )
  41. return
  42. const { groupId } = toValue(query.operationResult.variables) ?? {}
  43. // Skip refetching of duplicate queries with the same group ID.
  44. if (!groupId || refetchFor[groupId]) return
  45. if (
  46. groupIds &&
  47. groupIds.length &&
  48. !groupIds.includes(groupId) &&
  49. !macros.find((macro) => macro.id === macroId)
  50. )
  51. return
  52. query.refetch()
  53. refetchFor[groupId] = true
  54. })
  55. })
  56. const deactivate = (usageKey: string) => {
  57. if (!usageKeys.value.includes(usageKey)) return
  58. nextTick(() => {
  59. usageKeys.value = without(usageKeys.value, usageKey)
  60. queryByUsageKey.delete(usageKey)
  61. })
  62. }
  63. return {
  64. usageKeys,
  65. activate,
  66. deactivate,
  67. }
  68. })