diff options
Diffstat (limited to 'packages/bank-ui/src/context/config.ts')
-rw-r--r-- | packages/bank-ui/src/context/config.ts | 108 |
1 files changed, 74 insertions, 34 deletions
diff --git a/packages/bank-ui/src/context/config.ts b/packages/bank-ui/src/context/config.ts index cb0d599aa..f8be80a6c 100644 --- a/packages/bank-ui/src/context/config.ts +++ b/packages/bank-ui/src/context/config.ts @@ -26,11 +26,12 @@ import { TalerError, assertUnreachable, CacheEvictor, + ObservabilityEvent, } from "@gnu-taler/taler-util"; import { BrowserFetchHttpLib, ErrorLoading, - useTranslationContext + useTranslationContext, } from "@gnu-taler/web-util/browser"; import { ComponentChildren, @@ -63,6 +64,8 @@ export type Type = { conversion: TalerBankConversionHttpClient; authenticator: (user: string) => TalerAuthenticationHttpClient; hints: VersionHint[]; + onBackendActivity: (fn: Listener) => Unsuscriber; + cancelRequest: (eventId: string) => void; }; // FIXME: below @@ -78,6 +81,25 @@ export enum VersionHint { CASHOUT_BEFORE_2FA, } +const observers = new Array<(e: ObservabilityEvent) => void>(); +type Listener = (e: ObservabilityEvent) => void; +type Unsuscriber = () => void; + +const activity = Object.freeze({ + notify: (data: ObservabilityEvent) => + observers.forEach((observer) => observer(data)), + subscribe: (func: Listener): Unsuscriber => { + observers.push(func); + return () => { + observers.forEach((observer, index) => { + if (observer === func) { + observers.splice(index, 1); + } + }); + }; + }, +}); + export type ConfigResult = | undefined | { type: "ok"; config: TalerCorebankApi.Config; hints: VersionHint[] } @@ -96,7 +118,8 @@ export const BankCoreApiProvider = ({ const [checked, setChecked] = useState<ConfigResult>(); const { i18n } = useTranslationContext(); - const { bankClient, conversionClient, authClient } = buildApiClient(new URL(baseUrl)) + const { bankClient, conversionClient, authClient, cancelRequest } = + buildApiClient(new URL(baseUrl)); useEffect(() => { bankClient @@ -150,8 +173,10 @@ export const BankCoreApiProvider = ({ url: new URL(bankClient.baseUrl), config: checked.config, bank: bankClient, + onBackendActivity: activity.subscribe, conversion: conversionClient, authenticator: authClient, + cancelRequest, hints: checked.hints, }; return h(Context.Provider, { @@ -162,8 +187,8 @@ export const BankCoreApiProvider = ({ /** * build http client with cache breaker due to SWR - * @param url - * @returns + * @param url + * @returns */ function buildApiClient(url: URL) { const httpFetch = new BrowserFetchHttpLib({ @@ -172,15 +197,32 @@ function buildApiClient(url: URL) { }); const httpLib = new ObservableHttpClientLibrary(httpFetch, { observe(ev) { - console.log(ev) - } - }) + activity.notify(ev); + }, + }); - const bankClient = new TalerCoreBankHttpClient(url.href, httpLib, evictBankSwrCache); - const conversionClient = new TalerBankConversionHttpClient(bankClient.getConversionInfoAPI().href, httpLib, evictConversionSwrCache); - const authClient = (user: string) => new TalerAuthenticationHttpClient(bankClient.getAuthenticationAPI(user).href, user, httpLib); + function cancelRequest(id: string) { + httpLib.cancelRequest(id); + } - return { bankClient, conversionClient, authClient } + const bankClient = new TalerCoreBankHttpClient( + url.href, + httpLib, + evictBankSwrCache, + ); + const conversionClient = new TalerBankConversionHttpClient( + bankClient.getConversionInfoAPI().href, + httpLib, + evictConversionSwrCache, + ); + const authClient = (user: string) => + new TalerAuthenticationHttpClient( + bankClient.getAuthenticationAPI(user).href, + user, + httpLib, + ); + + return { bankClient, conversionClient, authClient, cancelRequest }; } export const BankCoreApiProviderTesting = ({ @@ -206,7 +248,6 @@ export const BankCoreApiProviderTesting = ({ }); }; - const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { async notifySuccess(op) { switch (op) { @@ -215,7 +256,7 @@ const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { revalidatePublicAccounts(), revalidateBusinessAccounts(), ]); - return + return; } case TalerCoreBankCacheEviction.CREATE_ACCOUNT: { // admin balance change on new account @@ -224,27 +265,25 @@ const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { revalidateTransactions(), revalidatePublicAccounts(), revalidateBusinessAccounts(), - ]) + ]); return; } case TalerCoreBankCacheEviction.UPDATE_ACCOUNT: { - await Promise.all([ - revalidateAccountDetails(), - ]) + await Promise.all([revalidateAccountDetails()]); return; } case TalerCoreBankCacheEviction.CREATE_TRANSACTION: { await Promise.all([ revalidateAccountDetails(), revalidateTransactions(), - ]) + ]); return; } case TalerCoreBankCacheEviction.CONFIRM_WITHDRAWAL: { await Promise.all([ revalidateAccountDetails(), revalidateTransactions(), - ]) + ]); return; } case TalerCoreBankCacheEviction.CREATE_CASHOUT: { @@ -252,7 +291,7 @@ const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { revalidateAccountDetails(), revalidateCashouts(), revalidateTransactions(), - ]) + ]); return; } case TalerCoreBankCacheEviction.UPDATE_PASSWORD: @@ -260,20 +299,21 @@ const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { case TalerCoreBankCacheEviction.CREATE_WITHDRAWAL: return; default: - assertUnreachable(op) + assertUnreachable(op); } - } -} + }, +}; -const evictConversionSwrCache: CacheEvictor<TalerBankConversionCacheEviction> = { - async notifySuccess(op) { - switch (op) { - case TalerBankConversionCacheEviction.UPDATE_RATE: { - await revalidateConversionInfo(); - return +const evictConversionSwrCache: CacheEvictor<TalerBankConversionCacheEviction> = + { + async notifySuccess(op) { + switch (op) { + case TalerBankConversionCacheEviction.UPDATE_RATE: { + await revalidateConversionInfo(); + return; + } + default: + assertUnreachable(op); } - default: - assertUnreachable(op) - } - } -}
\ No newline at end of file + }, + }; |