useAppMaintenanceCheck.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. import { onMounted, reactive, watch } from 'vue'
  3. import { useRouteQuery } from '@vueuse/router'
  4. import {
  5. useNotifications,
  6. NotificationTypes,
  7. } from '@shared/components/CommonNotifications'
  8. import { useApplicationBuildChecksumQuery } from '@shared/graphql/queries/applicationBuildChecksum.api'
  9. import { useAppMaintenanceSubscription } from '@shared/graphql/subscriptions/appMaintenance.api'
  10. import {
  11. ApplicationBuildChecksumQuery,
  12. ApplicationBuildChecksumQueryVariables,
  13. AppMaintenanceType,
  14. AppMaintenanceSubscription,
  15. AppMaintenanceSubscriptionVariables,
  16. } from '@shared/graphql/types'
  17. import {
  18. QueryHandler,
  19. SubscriptionHandler,
  20. } from '@shared/server/apollo/handler'
  21. import testFlags from '@shared/utils/testFlags'
  22. let query: QueryHandler<
  23. ApplicationBuildChecksumQuery,
  24. ApplicationBuildChecksumQueryVariables
  25. >
  26. let previousChecksum: string
  27. let subscription: SubscriptionHandler<
  28. AppMaintenanceSubscription,
  29. AppMaintenanceSubscriptionVariables
  30. >
  31. const useAppMaintenanceCheck = () => {
  32. const notify = (message: string) => {
  33. useNotifications().notify({
  34. message,
  35. type: NotificationTypes.WARN,
  36. persistent: true,
  37. callback: () => {
  38. window.location.reload()
  39. },
  40. })
  41. }
  42. onMounted(() => {
  43. if (query) return
  44. // Default poll interval: every minute.
  45. const defaultPollInterval = 60 * 1000
  46. const applicationRebuildCheckInterval = useRouteQuery(
  47. 'ApplicationRebuildCheckInterval',
  48. defaultPollInterval.toString(),
  49. )
  50. const options = reactive({
  51. pollInterval: parseInt(applicationRebuildCheckInterval.value, 10),
  52. })
  53. watch(applicationRebuildCheckInterval, () => {
  54. options.pollInterval = parseInt(applicationRebuildCheckInterval.value, 10)
  55. })
  56. query = new QueryHandler(useApplicationBuildChecksumQuery(options))
  57. let notificationMessage = __(
  58. 'A newer version of the app is available. Please reload at your earliest.',
  59. )
  60. query.watchOnResult((queryResult): void => {
  61. if (!queryResult?.applicationBuildChecksum.length) return
  62. if (!previousChecksum) {
  63. previousChecksum = queryResult?.applicationBuildChecksum
  64. testFlags.set('useApplicationBuildChecksumQuery.firstResult')
  65. }
  66. if (queryResult?.applicationBuildChecksum !== previousChecksum) {
  67. notify(notificationMessage)
  68. }
  69. })
  70. subscription = new SubscriptionHandler(useAppMaintenanceSubscription())
  71. subscription.onResult((result) => {
  72. const type = result.data?.appMaintenance.type
  73. if (!type) {
  74. testFlags.set('useAppMaintenanceSubscription.subscribed')
  75. return
  76. }
  77. switch (type) {
  78. case AppMaintenanceType.ConfigChanged:
  79. notificationMessage = __(
  80. 'The configuration of Zammad has changed. Please reload at your earliest.',
  81. )
  82. break
  83. case AppMaintenanceType.RestartAuto:
  84. case AppMaintenanceType.RestartManual:
  85. // TODO: this case cannot be handled right now. Legacy interface performs a connectivity check.
  86. break
  87. default:
  88. break
  89. }
  90. notify(notificationMessage)
  91. })
  92. })
  93. }
  94. export default useAppMaintenanceCheck