summaryrefslogtreecommitdiff
path: root/packages/demobank-ui/src/context/config.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/demobank-ui/src/context/config.ts')
-rw-r--r--packages/demobank-ui/src/context/config.ts201
1 files changed, 93 insertions, 108 deletions
diff --git a/packages/demobank-ui/src/context/config.ts b/packages/demobank-ui/src/context/config.ts
index 72c176679..39d12be86 100644
--- a/packages/demobank-ui/src/context/config.ts
+++ b/packages/demobank-ui/src/context/config.ts
@@ -15,20 +15,16 @@
*/
import {
- AccessToken,
- AmountJson,
- HttpStatusCode,
+ assertUnreachable,
LibtoolVersion,
- OperationFail,
- OperationOk,
- TalerBankConversionApi,
+ TalerBankConversionCacheEviction,
TalerBankConversionHttpClient,
TalerCorebankApi,
+ TalerAuthenticationHttpClient,
+ TalerCoreBankCacheEviction,
TalerCoreBankHttpClient,
- TalerError,
- UserAndToken,
+ TalerError
} from "@gnu-taler/taler-util";
-import { HttpRequestLibrary } from "@gnu-taler/taler-util/http";
import {
BrowserHttpLib,
ErrorLoading,
@@ -61,7 +57,9 @@ import {
export type Type = {
url: URL;
config: TalerCorebankApi.Config;
- api: TalerCoreBankHttpClient;
+ bank: TalerCoreBankHttpClient;
+ conversion: TalerBankConversionHttpClient;
+ authenticator: (user: string) => TalerAuthenticationHttpClient;
hints: VersionHint[];
};
@@ -95,13 +93,14 @@ export const BankCoreApiProvider = ({
}): VNode => {
const [checked, setChecked] = useState<ConfigResult>();
const { i18n } = useTranslationContext();
- const url = new URL(baseUrl);
- const api = new CacheAwareTalerCoreBankHttpClient(url.href, new BrowserHttpLib());
+
+ const { bankClient, conversionClient, authClient } = buildApiClient(new URL(baseUrl))
+
useEffect(() => {
- api
+ bankClient
.getConfig()
.then((resp) => {
- if (api.isCompatible(resp.body.version)) {
+ if (bankClient.isCompatible(resp.body.version)) {
setChecked({ type: "ok", config: resp.body, hints: [] });
} else {
// this API supports version 3.0.3
@@ -116,7 +115,7 @@ export const BankCoreApiProvider = ({
setChecked({
type: "incompatible",
result: resp.body,
- supported: api.PROTOCOL_VERSION,
+ supported: bankClient.PROTOCOL_VERSION,
});
}
}
@@ -146,9 +145,11 @@ export const BankCoreApiProvider = ({
});
}
const value: Type = {
- url,
+ url: new URL(bankClient.baseUrl),
config: checked.config,
- api: api,
+ bank: bankClient,
+ conversion: conversionClient,
+ authenticator: authClient,
hints: checked.hints,
};
return h(Context.Provider, {
@@ -158,100 +159,84 @@ export const BankCoreApiProvider = ({
};
/**
- *
+ * build http client with cache breaker due to SWR
+ * @param url
+ * @returns
*/
-class CacheAwareTalerBankConversionHttpClient extends TalerBankConversionHttpClient {
- constructor(baseUrl: string, httpClient?: HttpRequestLibrary) {
- super(baseUrl, httpClient);
- }
- async updateConversionRate(auth: AccessToken, body: TalerBankConversionApi.ConversionRate) {
- const resp = await super.updateConversionRate(auth, body);
- if (resp.type === "ok") {
- await revalidateConversionInfo();
- }
- return resp
- }
-}
+function buildApiClient(url: URL) {
+ const httpLib = new BrowserHttpLib();
-class CacheAwareTalerCoreBankHttpClient extends TalerCoreBankHttpClient {
- constructor(baseUrl: string, httpClient?: HttpRequestLibrary) {
- super(baseUrl, httpClient);
- }
- async deleteAccount(auth: UserAndToken, cid?: string | undefined) {
- const resp = await super.deleteAccount(auth, cid);
- if (resp.type === "ok") {
- await revalidatePublicAccounts();
- await revalidateBusinessAccounts();
- }
- return resp;
- }
- async createAccount(
- auth: AccessToken,
- body: TalerCorebankApi.RegisterAccountRequest,
- ) {
- const resp = await super.createAccount(auth, body);
- if (resp.type === "ok") {
- // admin balance change on new account
- await revalidateAccountDetails();
- await revalidateTransactions();
- await revalidatePublicAccounts();
- await revalidateBusinessAccounts();
- }
- return resp;
- }
- async updateAccount(
- auth: UserAndToken,
- body: TalerCorebankApi.AccountReconfiguration,
- cid?: string | undefined,
- ) {
- const resp = await super.updateAccount(auth, body, cid);
- if (resp.type === "ok") {
- await revalidateAccountDetails();
- }
- return resp;
- }
- async createTransaction(
- auth: UserAndToken,
- body: TalerCorebankApi.CreateTransactionRequest,
- cid?: string | undefined,
- ) {
- const resp = await super.createTransaction(auth, body, cid);
- if (resp.type === "ok") {
- await revalidateAccountDetails();
- await revalidateTransactions();
- }
- return resp;
- }
- async confirmWithdrawalById(
- auth: UserAndToken,
- wid: string,
- cid?: string | undefined,
- ) {
- const resp = await super.confirmWithdrawalById(auth, wid, cid);
- if (resp.type === "ok") {
- await revalidateAccountDetails();
- await revalidateTransactions();
+ const bankClient = new TalerCoreBankHttpClient(url.href, httpLib, {
+ async notifySuccess(op) {
+ switch (op) {
+ case TalerCoreBankCacheEviction.DELELE_ACCOUNT: {
+ await Promise.all([
+ revalidatePublicAccounts(),
+ revalidateBusinessAccounts(),
+ ]);
+ return
+ }
+ case TalerCoreBankCacheEviction.CREATE_ACCOUNT: {
+ // admin balance change on new account
+ await Promise.all([
+ revalidateAccountDetails(),
+ revalidateTransactions(),
+ revalidatePublicAccounts(),
+ revalidateBusinessAccounts(),
+ ])
+ return;
+ }
+ case TalerCoreBankCacheEviction.UPDATE_ACCOUNT: {
+ 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: {
+ await Promise.all([
+ revalidateAccountDetails(),
+ revalidateCashouts(),
+ revalidateTransactions(),
+ ])
+ return;
+ }
+ case TalerCoreBankCacheEviction.UPDATE_PASSWORD:
+ case TalerCoreBankCacheEviction.ABORT_WITHDRAWAL:
+ case TalerCoreBankCacheEviction.CREATE_WITHDRAWAL:
+ return;
+ default:
+ assertUnreachable(op)
+ }
}
- return resp;
- }
- async createCashout(
- auth: UserAndToken,
- body: TalerCorebankApi.CashoutRequest,
- cid?: string | undefined,
- ) {
- const resp = await super.createCashout(auth, body, cid);
- if (resp.type === "ok") {
- await revalidateAccountDetails();
- await revalidateCashouts();
- await revalidateTransactions();
+ });
+ const conversionClient = new TalerBankConversionHttpClient(bankClient.getConversionInfoAPI(), httpLib, {
+ async notifySuccess(op) {
+ switch (op) {
+ case TalerBankConversionCacheEviction.UPDATE_RATE: {
+ await revalidateConversionInfo();
+ return
+ }
+ default:
+ assertUnreachable(op)
+ }
}
- return resp;
- }
-
- getConversionInfoAPI(): TalerBankConversionHttpClient {
- const api = super.getConversionInfoAPI();
- return new CacheAwareTalerBankConversionHttpClient(api.baseUrl, this.httpLib)
- }
+ });
+ const authClient = (user: string) => new TalerAuthenticationHttpClient(bankClient.getAuthenticationAPI(user), user, httpLib);
+ return { bankClient, conversionClient, authClient }
}
export const BankCoreApiProviderTesting = ({
@@ -267,7 +252,7 @@ export const BankCoreApiProviderTesting = ({
url: new URL(url),
config: state,
// @ts-expect-error this API is not being used, not really needed
- api: undefined,
+ bank: undefined,
hints: [],
};