From 89dde053665d39be8367c25691efc008fc2a5cc7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 5 Apr 2024 10:42:41 -0300 Subject: fix #7924 --- packages/web-util/src/context/bank-api.ts | 26 +++++++++++++++++++++----- packages/web-util/src/context/merchant-api.ts | 26 +++++++++++++++++++++----- 2 files changed, 42 insertions(+), 10 deletions(-) (limited to 'packages/web-util/src') diff --git a/packages/web-util/src/context/bank-api.ts b/packages/web-util/src/context/bank-api.ts index d2938f150..3f6a32f4b 100644 --- a/packages/web-util/src/context/bank-api.ts +++ b/packages/web-util/src/context/bank-api.ts @@ -74,6 +74,8 @@ type ConfigResult = | { type: "incompatible"; result: T; supported: string } | { type: "error"; error: TalerError }; +const CONFIG_FAIL_TRY_AGAIN_MS = 5000; + export const BankApiProvider = ({ baseUrl, children, @@ -93,8 +95,10 @@ export const BankApiProvider = ({ buildBankApiClient(baseUrl, evictors); useEffect(() => { - getRemoteConfig() - .then((config) => { + let keepRetrying = true; + async function testConfig(): Promise { + try { + const config = await getRemoteConfig(); if (LibtoolVersion.compare(VERSION, config.version)) { setChecked({ type: "ok", config, hints: [] }); } else { @@ -104,12 +108,24 @@ export const BankApiProvider = ({ supported: VERSION, }); } - }) - .catch((error: unknown) => { + } catch (error) { if (error instanceof TalerError) { + if (keepRetrying) { + setTimeout(() => { + testConfig(); + }, CONFIG_FAIL_TRY_AGAIN_MS); + } setChecked({ type: "error", error }); + } else { + setChecked({ type: "error", error: TalerError.fromException(error) }); } - }); + } + } + testConfig(); + return () => { + // on unload, stop retry + keepRetrying = false; + }; }, []); if (checked === undefined) { diff --git a/packages/web-util/src/context/merchant-api.ts b/packages/web-util/src/context/merchant-api.ts index 604119e84..9998b3aeb 100644 --- a/packages/web-util/src/context/merchant-api.ts +++ b/packages/web-util/src/context/merchant-api.ts @@ -81,6 +81,8 @@ export type ConfigResultFail = | { type: "incompatible"; result: T; supported: string } | { type: "error"; error: TalerError }; +const CONFIG_FAIL_TRY_AGAIN_MS = 5000 + export const MerchantApiProvider = ({ baseUrl, children, @@ -103,8 +105,10 @@ export const MerchantApiProvider = ({ buildMerchantApiClient(merchantEndpoint, evictors); useEffect(() => { - getRemoteConfig() - .then((config) => { + let keepRetrying = true; + async function testConfig(): Promise { + try { + const config = await getRemoteConfig(); if (LibtoolVersion.compare(VERSION, config.version)) { setChecked({ type: "ok", config, hints: [] }); } else { @@ -114,12 +118,24 @@ export const MerchantApiProvider = ({ supported: VERSION, }); } - }) - .catch((error: unknown) => { + } catch (error) { if (error instanceof TalerError) { + if (keepRetrying) { + setTimeout(() => { + testConfig() + }, CONFIG_FAIL_TRY_AGAIN_MS); + } setChecked({ type: "error", error }); + } else { + setChecked({ type: "error", error: TalerError.fromException(error) }); } - }); + } + } + testConfig(); + return () => { + // on unload, stop retry + keepRetrying = false; + } }, []); if (!checked || checked.type !== "ok") { -- cgit v1.2.3