From e8e608efd044e42e671159fb65ab057d77862b7c Mon Sep 17 00:00:00 2001 From: hvangeffen Date: Wed, 29 May 2024 11:30:48 +0200 Subject: [PATCH] Show error when backend is unavalaible --- src/layouts/DefaultLayout.vue | 16 +++++++++++++++- src/lib/fews-config/index.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/layouts/DefaultLayout.vue b/src/layouts/DefaultLayout.vue index 46f8af080..fba112e91 100644 --- a/src/layouts/DefaultLayout.vue +++ b/src/layouts/DefaultLayout.vue @@ -146,6 +146,14 @@ + + Backend is unavailable + @@ -162,9 +170,10 @@ import SplashScreen from '@/components/general/SplashScreen.vue' import GlobalSearchComponent from '@/components/general/GlobalSearchComponent.vue' import { configManager } from '@/services/application-config' -import { getResourcesStaticUrl } from '@/lib/fews-config' +import { getResourcesStaticUrl, isBackendAvailable } from '@/lib/fews-config' import { StyleValue, nextTick } from 'vue' import packageConfig from '../../package.json' +import { asyncComputed } from '@vueuse/core' const configStore = useConfigStore() const alertsStore = useAlertsStore() @@ -181,6 +190,11 @@ const logoSrc = ref('') const splashSrc = ref() const appBarStyle = ref() const appBarColor = ref('') +const HEALTH_CHECK_TIMEOUT = 5000 +const showBackendError = asyncComputed( + async () => !(await isBackendAvailable(HEALTH_CHECK_TIMEOUT)), + false, +) function updateAppBarColor() { appBarColor.value = getComputedStyle(document.body).getPropertyValue( diff --git a/src/lib/fews-config/index.ts b/src/lib/fews-config/index.ts index b8068fd16..33c768c70 100644 --- a/src/lib/fews-config/index.ts +++ b/src/lib/fews-config/index.ts @@ -44,3 +44,29 @@ export function getResourcesIconsUrl(resource: string) { }) return webServiceProvider.resourcesIconsUrl(resource).toString() } + +export async function isBackendAvailable(timeout?: number) { + const baseUrl = configManager.get('VITE_FEWS_WEBSERVICES_URL') + + const controller = new AbortController() + const DEFAULT_TIMEOUT = 5000 + const timeoutId = setTimeout( + () => controller.abort(), + timeout ?? DEFAULT_TIMEOUT, + ) + + const webServiceProvider = new PiWebserviceProvider(baseUrl, { + transformRequestFn: createTransformRequestFn(controller), + }) + + try { + await webServiceProvider.getVersion() + } catch (e) { + if (e instanceof Error && e.name === 'AbortError') { + return false + } + } + + clearTimeout(timeoutId) + return true +}