ticketOverviewOrder.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. import { tryOnScopeDispose, watchOnce } from '@vueuse/core'
  3. import { keyBy } from 'lodash-es'
  4. import { defineStore } from 'pinia'
  5. import { ref, computed } from 'vue'
  6. import { useTicketOverviewOrderQuery } from '#shared/entities/ticket/graphql/queries/ticket/overviewOrder.api.ts'
  7. import type {
  8. TicketOverviewsQuery,
  9. TicketOverviewUpdatesSubscription,
  10. TicketOverviewUpdatesSubscriptionVariables,
  11. } from '#shared/graphql/types.ts'
  12. import { QueryHandler } from '#shared/server/apollo/handler/index.ts'
  13. import type { ConfidentTake } from '#shared/types/utils.ts'
  14. import { TicketOverviewUpdatesDocument } from '../graphql/subscriptions/ticketOverviewUpdates.api.ts'
  15. import { getTicketOverviewStorage } from '../helpers/ticketOverviewStorage.ts'
  16. export type TicketOverview = ConfidentTake<
  17. TicketOverviewsQuery,
  18. 'ticketOverviews.edges.node'
  19. >
  20. export const useTicketOverviewOrderStore = defineStore(
  21. 'ticketOverviewOrder',
  22. () => {
  23. const ticketOverviewOrderHandler = new QueryHandler(
  24. useTicketOverviewOrderQuery(),
  25. )
  26. // Updates the overviews when overviews got added, updated and/or deleted.
  27. ticketOverviewOrderHandler.subscribeToMore<
  28. TicketOverviewUpdatesSubscriptionVariables,
  29. TicketOverviewUpdatesSubscription
  30. >({
  31. document: TicketOverviewUpdatesDocument,
  32. variables: {
  33. ignoreUserConditions: true,
  34. withTicketCount: false,
  35. },
  36. updateQuery(_, { subscriptionData }) {
  37. const ticketOverviews =
  38. subscriptionData.data.ticketOverviewUpdates?.ticketOverviews
  39. // if we return empty array here, the actual query will be aborted, because we have fetchPolicy "cache-and-network"
  40. // if we return existing value, it will throw an error, because "overviews" doesn't exist yet on the query result
  41. if (!ticketOverviews) {
  42. return null as unknown as TicketOverviewsQuery
  43. }
  44. return {
  45. ticketOverviews,
  46. }
  47. },
  48. })
  49. const overviewsRaw = ticketOverviewOrderHandler.result()
  50. const overviewsLoading = ticketOverviewOrderHandler.loading()
  51. const overviews = computed(() => {
  52. if (!overviewsRaw.value?.ticketOverviews.edges) return []
  53. return overviewsRaw.value.ticketOverviews.edges
  54. .filter((overview) => overview?.node?.id)
  55. .map((edge) => edge.node)
  56. })
  57. const overviewsByKey = computed(() => keyBy(overviews.value, 'id'))
  58. const storage = getTicketOverviewStorage()
  59. const includedIds = ref(new Set<string>(storage.getOverviews()))
  60. const includedOverviews = computed(() => {
  61. return [...includedIds.value]
  62. .map((id) => overviewsByKey.value[id])
  63. .filter(Boolean)
  64. })
  65. const saveOverviews = (overviews: TicketOverview[]) => {
  66. const ids = overviews.map(({ id }) => id)
  67. storage.saveOverviews(ids)
  68. includedIds.value = new Set(ids)
  69. }
  70. const populateIncludeIds = (overviews: TicketOverview[]) => {
  71. overviews.forEach((overview) => {
  72. includedIds.value.add(overview.id)
  73. })
  74. saveOverviews(overviews)
  75. }
  76. // store overviews in local storage when loaded
  77. // force it to have something
  78. if (!includedIds.value.size) {
  79. if (!overviews.value.length) {
  80. watchOnce(overviews, populateIncludeIds)
  81. } else {
  82. populateIncludeIds(overviews.value)
  83. }
  84. }
  85. tryOnScopeDispose(() => {
  86. ticketOverviewOrderHandler.stop()
  87. })
  88. return {
  89. overviews,
  90. initializing:
  91. ticketOverviewOrderHandler.operationResult.forceDisabled.value,
  92. loading: overviewsLoading,
  93. includedOverviews,
  94. includedIds,
  95. overviewsByKey,
  96. saveOverviews,
  97. }
  98. },
  99. )