summaryrefslogtreecommitdiff
path: root/packages/bank-ui/src/context/config.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/bank-ui/src/context/config.ts')
-rw-r--r--packages/bank-ui/src/context/config.ts108
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
+ },
+ };