123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
- import { onMounted, reactive, watch } from 'vue'
- import { useRouteQuery } from '@vueuse/router'
- import {
- useNotifications,
- NotificationTypes,
- } from '@shared/components/CommonNotifications'
- import { useApplicationBuildChecksumQuery } from '@shared/graphql/queries/applicationBuildChecksum.api'
- import { useAppMaintenanceSubscription } from '@shared/graphql/subscriptions/appMaintenance.api'
- import {
- ApplicationBuildChecksumQuery,
- ApplicationBuildChecksumQueryVariables,
- AppMaintenanceType,
- AppMaintenanceSubscription,
- AppMaintenanceSubscriptionVariables,
- } from '@shared/graphql/types'
- import {
- QueryHandler,
- SubscriptionHandler,
- } from '@shared/server/apollo/handler'
- import testFlags from '@shared/utils/testFlags'
- let query: QueryHandler<
- ApplicationBuildChecksumQuery,
- ApplicationBuildChecksumQueryVariables
- >
- let previousChecksum: string
- let subscription: SubscriptionHandler<
- AppMaintenanceSubscription,
- AppMaintenanceSubscriptionVariables
- >
- const useAppMaintenanceCheck = () => {
- const notify = (message: string) => {
- useNotifications().notify({
- message,
- type: NotificationTypes.WARN,
- persistent: true,
- callback: () => {
- window.location.reload()
- },
- })
- }
- onMounted(() => {
- if (query) return
- // Default poll interval: every minute.
- const defaultPollInterval = 60 * 1000
- const applicationRebuildCheckInterval = useRouteQuery(
- 'ApplicationRebuildCheckInterval',
- defaultPollInterval.toString(),
- )
- const options = reactive({
- pollInterval: parseInt(applicationRebuildCheckInterval.value, 10),
- })
- watch(applicationRebuildCheckInterval, () => {
- options.pollInterval = parseInt(applicationRebuildCheckInterval.value, 10)
- })
- query = new QueryHandler(useApplicationBuildChecksumQuery(options))
- let notificationMessage = __(
- 'A newer version of the app is available. Please reload at your earliest.',
- )
- query.watchOnResult((queryResult): void => {
- if (!queryResult?.applicationBuildChecksum.length) return
- if (!previousChecksum) {
- previousChecksum = queryResult?.applicationBuildChecksum
- testFlags.set('useApplicationBuildChecksumQuery.firstResult')
- }
- if (queryResult?.applicationBuildChecksum !== previousChecksum) {
- notify(notificationMessage)
- }
- })
- subscription = new SubscriptionHandler(useAppMaintenanceSubscription())
- subscription.onResult((result) => {
- const type = result.data?.appMaintenance.type
- if (!type) {
- testFlags.set('useAppMaintenanceSubscription.subscribed')
- return
- }
- switch (type) {
- case AppMaintenanceType.ConfigChanged:
- notificationMessage = __(
- 'The configuration of Zammad has changed. Please reload at your earliest.',
- )
- break
- case AppMaintenanceType.RestartAuto:
- case AppMaintenanceType.RestartManual:
- // TODO: this case cannot be handled right now. Legacy interface performs a connectivity check.
- break
- default:
- break
- }
- notify(notificationMessage)
- })
- })
- }
- export default useAppMaintenanceCheck
|