diff options
Diffstat (limited to 'packages/web-util')
-rw-r--r-- | packages/web-util/src/context/bank-api.ts | 26 | ||||
-rw-r--r-- | packages/web-util/src/context/merchant-api.ts | 26 |
2 files changed, 42 insertions, 10 deletions
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<T> = | { 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<void> { + 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<T> = | { 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<void> { + 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") { |