diff options
Diffstat (limited to 'packages/bank-ui')
43 files changed, 275 insertions, 461 deletions
diff --git a/packages/bank-ui/src/Routing.tsx b/packages/bank-ui/src/Routing.tsx index fbf5aa9ec..489dbe30b 100644 --- a/packages/bank-ui/src/Routing.tsx +++ b/packages/bank-ui/src/Routing.tsx @@ -16,7 +16,11 @@ import { LocalNotificationBanner, + urlPattern, + useBankCoreApiContext, + useCurrentLocation, useLocalNotification, + useNavigationContext, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; @@ -29,8 +33,6 @@ import { assertUnreachable, } from "@gnu-taler/taler-util"; import { useEffect } from "preact/hooks"; -import { useBankCoreApiContext } from "./context/config.js"; -import { useNavigationContext } from "./context/navigation.js"; import { useSessionState } from "./hooks/session.js"; import { AccountPage } from "./pages/AccountPage/index.js"; import { BankFrame } from "./pages/BankFrame.js"; @@ -51,7 +53,6 @@ import { RemoveAccount } from "./pages/admin/RemoveAccount.js"; import { ConversionConfig } from "./pages/regional/ConversionConfig.js"; import { CreateCashout } from "./pages/regional/CreateCashout.js"; import { ShowCashoutDetails } from "./pages/regional/ShowCashoutDetails.js"; -import { urlPattern, useCurrentLocation } from "./route.js"; export function Routing(): VNode { const session = useSessionState(); @@ -97,7 +98,7 @@ function PublicRounting({ const { i18n } = useTranslationContext(); const location = useCurrentLocation(publicPages); const { navigateTo } = useNavigationContext(); - const { config, authenticator } = useBankCoreApiContext(); + const { config, lib } = useBankCoreApiContext(); const [notification, notify, handleError] = useLocalNotification(); useEffect(() => { @@ -112,7 +113,7 @@ function PublicRounting({ async function doAutomaticLogin(username: string, password: string) { await handleError(async () => { - const resp = await authenticator(username).createAccessToken(password, { + const resp = await lib.auth(username).createAccessToken(password, { scope: "readwrite", duration: { d_us: "forever" }, refreshable: true, diff --git a/packages/bank-ui/src/app.tsx b/packages/bank-ui/src/app.tsx index 893942059..434c132ed 100644 --- a/packages/bank-ui/src/app.tsx +++ b/packages/bank-ui/src/app.tsx @@ -15,22 +15,28 @@ */ import { + CacheEvictor, + TalerBankConversionCacheEviction, + TalerCoreBankCacheEviction, + assertUnreachable, canonicalizeBaseUrl, getGlobalLogLevel, setGlobalLogLevelFromString, } from "@gnu-taler/taler-util"; -import { Loading, TranslationProvider } from "@gnu-taler/web-util/browser"; +import { BankApiProvider, BrowserHashNavigationProvider, Loading, TalerWalletIntegrationBrowserProvider, TranslationProvider } from "@gnu-taler/web-util/browser"; import { h } from "preact"; import { useEffect, useState } from "preact/hooks"; import { SWRConfig } from "swr"; import { Routing } from "./Routing.js"; -import { BankCoreApiProvider } from "./context/config.js"; -import { BrowserHashNavigationProvider } from "./context/navigation.js"; +// import { BankCoreApiProvider } from "./context/config.js"; +// import { BrowserHashNavigationProvider } from "./context/navigation.js"; import { SettingsProvider } from "./context/settings.js"; -import { TalerWalletIntegrationBrowserProvider } from "./context/wallet-integration.js"; +// import { TalerWalletIntegrationBrowserProvider } from "./context/wallet-integration.js"; import { strings } from "./i18n/strings.js"; import { BankFrame } from "./pages/BankFrame.js"; import { BankUiSettings, fetchSettings } from "./settings.js"; +import { revalidateAccountDetails, revalidatePublicAccounts, revalidateTransactions } from "./hooks/account.js"; +import { revalidateBusinessAccounts, revalidateCashouts, revalidateConversionInfo } from "./hooks/regional.js"; const WITH_LOCAL_STORAGE_CACHE = false; export function App() { @@ -50,7 +56,10 @@ export function App() { de: strings["de"].completeness, }} > - <BankCoreApiProvider baseUrl={baseUrl} frameOnError={BankFrame}> + <BankApiProvider baseUrl={new URL("/", baseUrl)} frameOnError={BankFrame} evictors={{ + bank: evictBankSwrCache, + conversion: evictConversionSwrCache, + }}> <SWRConfig value={{ provider: WITH_LOCAL_STORAGE_CACHE @@ -84,7 +93,7 @@ export function App() { </BrowserHashNavigationProvider> </TalerWalletIntegrationBrowserProvider> </SWRConfig> - </BankCoreApiProvider> + </BankApiProvider> </TranslationProvider> </SettingsProvider> ); @@ -135,3 +144,74 @@ function getInitialBackendBaseURL( return canonicalizeBaseUrl(window.origin); } } + + +const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { + async notifySuccess(op) { + switch (op) { + case TalerCoreBankCacheEviction.DELETE_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); + } + }, +}; + +const evictConversionSwrCache: CacheEvictor<TalerBankConversionCacheEviction> = +{ + async notifySuccess(op) { + switch (op) { + case TalerBankConversionCacheEviction.UPDATE_RATE: { + await revalidateConversionInfo(); + return; + } + default: + assertUnreachable(op); + } + }, +}; diff --git a/packages/bank-ui/src/components/Cashouts/index.ts b/packages/bank-ui/src/components/Cashouts/index.ts index 2c6bf681c..99a946865 100644 --- a/packages/bank-ui/src/components/Cashouts/index.ts +++ b/packages/bank-ui/src/components/Cashouts/index.ts @@ -14,7 +14,7 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Loading, utils } from "@gnu-taler/web-util/browser"; +import { Loading, RouteDefinition, utils } from "@gnu-taler/web-util/browser"; import { AbsoluteTime, AmountJson, @@ -25,7 +25,6 @@ import { import { ErrorLoadingWithDebug } from "../ErrorLoadingWithDebug.js"; import { useComponentState } from "./state.js"; import { FailedView, ReadyView } from "./views.js"; -import { RouteDefinition } from "../../route.js"; export interface Props { account: string; diff --git a/packages/bank-ui/src/components/Cashouts/test.ts b/packages/bank-ui/src/components/Cashouts/test.ts index 4bd6b5eac..4ed0d7c11 100644 --- a/packages/bank-ui/src/components/Cashouts/test.ts +++ b/packages/bank-ui/src/components/Cashouts/test.ts @@ -24,7 +24,7 @@ import { SwrMockEnvironment } from "@gnu-taler/web-util/testing"; import { expect } from "chai"; import { Props } from "./index.js"; import { useComponentState } from "./state.js"; -import { buildNullRoutDefinition } from "../../route.js"; +import { buildNullRoutDefinition } from "@gnu-taler/web-util/browser"; describe("Cashout states", () => { it.skip("should query backend and render transactions", async () => { diff --git a/packages/bank-ui/src/components/Transactions/index.ts b/packages/bank-ui/src/components/Transactions/index.ts index 4cad6f306..2f68b2ded 100644 --- a/packages/bank-ui/src/components/Transactions/index.ts +++ b/packages/bank-ui/src/components/Transactions/index.ts @@ -19,17 +19,17 @@ import { Loading, utils } from "@gnu-taler/web-util/browser"; import { ErrorLoadingWithDebug } from "../ErrorLoadingWithDebug.js"; import { useComponentState } from "./state.js"; import { ReadyView } from "./views.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export interface Props { account: string; routeCreateWireTransfer: - | RouteDefinition<{ - account?: string; - subject?: string; - amount?: string; - }> - | undefined; + | RouteDefinition<{ + account?: string; + subject?: string; + amount?: string; + }> + | undefined; } export type State = State.Loading | State.LoadingUriError | State.Ready; @@ -52,12 +52,12 @@ export namespace State { status: "ready"; error: undefined; routeCreateWireTransfer: - | RouteDefinition<{ - account?: string; - subject?: string; - amount?: string; - }> - | undefined; + | RouteDefinition<{ + account?: string; + subject?: string; + amount?: string; + }> + | undefined; transactions: Transaction[]; onGoStart?: () => void; onGoNext?: () => void; diff --git a/packages/bank-ui/src/components/Transactions/views.tsx b/packages/bank-ui/src/components/Transactions/views.tsx index 4397651e2..ebce00a2a 100644 --- a/packages/bank-ui/src/components/Transactions/views.tsx +++ b/packages/bank-ui/src/components/Transactions/views.tsx @@ -14,10 +14,9 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Attention, useTranslationContext } from "@gnu-taler/web-util/browser"; +import { Attention, useBankCoreApiContext, useTranslationContext } from "@gnu-taler/web-util/browser"; import { format } from "date-fns"; import { Fragment, VNode, h } from "preact"; -import { useBankCoreApiContext } from "../../context/config.js"; import { RenderAmount } from "../../pages/PaytoWireTransferForm.js"; import { Time } from "../Time.js"; import { State } from "./index.js"; @@ -120,7 +119,7 @@ export function ReadyView({ <Time format="HH:mm:ss" timestamp={item.when} - // relative={Duration.fromSpec({ days: 1 })} + // relative={Duration.fromSpec({ days: 1 })} /> </div> <dl class="font-normal sm:hidden"> diff --git a/packages/bank-ui/src/context/config.ts b/packages/bank-ui/src/context/config.ts index f8be80a6c..55b21d0da 100644 --- a/packages/bank-ui/src/context/config.ts +++ b/packages/bank-ui/src/context/config.ts @@ -251,7 +251,7 @@ export const BankCoreApiProviderTesting = ({ const evictBankSwrCache: CacheEvictor<TalerCoreBankCacheEviction> = { async notifySuccess(op) { switch (op) { - case TalerCoreBankCacheEviction.DELELE_ACCOUNT: { + case TalerCoreBankCacheEviction.DELETE_ACCOUNT: { await Promise.all([ revalidatePublicAccounts(), revalidateBusinessAccounts(), diff --git a/packages/bank-ui/src/hooks/account.ts b/packages/bank-ui/src/hooks/account.ts index 5fe12573c..24309183f 100644 --- a/packages/bank-ui/src/hooks/account.ts +++ b/packages/bank-ui/src/hooks/account.ts @@ -26,7 +26,7 @@ import { useSessionState } from "./session.js"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 import _useSWR, { SWRHook, mutate } from "swr"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; const useSWR = _useSWR as unknown as SWRHook; export interface InstanceTemplateFilter { @@ -44,7 +44,7 @@ export function revalidateAccountDetails() { export function useAccountDetails(account: string) { const { state: credentials } = useSessionState(); - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); async function fetcher([username, token]: [string, AccessToken]) { return await api.getAccount({ username, token }); @@ -70,7 +70,7 @@ export function revalidateWithdrawalDetails() { } export function useWithdrawalDetails(wid: string) { - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const [latestStatus, setLatestStatus] = useState<WithdrawalOperationStatus>(); async function fetcher([wid, old_state]: [ @@ -123,7 +123,7 @@ export function useTransactionDetails(account: string, tid: number) { const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); async function fetcher([username, token, txid]: [ string, @@ -166,7 +166,7 @@ export function usePublicAccounts( ) { const [offset, setOffset] = useState<number | undefined>(initial); - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); async function fetcher([account, txid]: [ string | undefined, @@ -242,7 +242,7 @@ export function useTransactions(account: string, initial?: number) { credentials.status !== "loggedIn" ? undefined : credentials.token; const [offset, setOffset] = useState<number | undefined>(initial); - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); async function fetcher([username, token, txid]: [ string, diff --git a/packages/bank-ui/src/hooks/bank-state.ts b/packages/bank-ui/src/hooks/bank-state.ts index 1d8c4f9e6..616678ddc 100644 --- a/packages/bank-ui/src/hooks/bank-state.ts +++ b/packages/bank-ui/src/hooks/bank-state.ts @@ -28,7 +28,7 @@ import { codecOptional, } from "@gnu-taler/taler-util"; import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser"; -import { AppLocation } from "../route.js"; +import { AppLocation } from "@gnu-taler/web-util/browser"; export type ChallengeInProgess = | DeleteAccountChallenge diff --git a/packages/bank-ui/src/hooks/regional.ts b/packages/bank-ui/src/hooks/regional.ts index 51f3edad4..274638f74 100644 --- a/packages/bank-ui/src/hooks/regional.ts +++ b/packages/bank-ui/src/hooks/regional.ts @@ -33,17 +33,17 @@ import { } from "@gnu-taler/taler-util"; import { useState } from "preact/hooks"; import _useSWR, { SWRHook, mutate } from "swr"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; // FIX default import https://github.com/microsoft/TypeScript/issues/49189 const useSWR = _useSWR as unknown as SWRHook; export type TransferCalculation = | { - debit: AmountJson; - credit: AmountJson; - beforeFee: AmountJson; - } + debit: AmountJson; + credit: AmountJson; + beforeFee: AmountJson; + } | "amount-is-too-small"; type EstimatorFunction = ( amount: AmountJson, @@ -62,7 +62,7 @@ export function revalidateConversionInfo() { ); } export function useConversionInfo() { - const { conversion, config } = useBankCoreApiContext(); + const { lib: { conversion }, config } = useBankCoreApiContext(); async function fetcher() { return await conversion.getConfig(); @@ -88,7 +88,7 @@ export function useConversionInfo() { } export function useCashinEstimator(): ConversionEstimators { - const { conversion } = useBankCoreApiContext(); + const { lib: { conversion } } = useBankCoreApiContext(); return { estimateByCredit: async (fiatAmount, fee) => { const resp = await conversion.getCashinRate({ @@ -144,7 +144,7 @@ export function useCashinEstimator(): ConversionEstimators { } export function useCashoutEstimator(): ConversionEstimators { - const { conversion } = useBankCoreApiContext(); + const { lib: { conversion } } = useBankCoreApiContext(); return { estimateByCredit: async (fiatAmount, fee) => { const resp = await conversion.getCashoutRate({ @@ -217,7 +217,7 @@ export function useBusinessAccounts() { const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const [offset, setOffset] = useState<number | undefined>(); @@ -290,7 +290,7 @@ export function revalidateOnePendingCashouts() { } export function useOnePendingCashouts(account: string) { const { state: credentials } = useSessionState(); - const { bank: api, config } = useBankCoreApiContext(); + const { lib: { bank: api }, config } = useBankCoreApiContext(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; @@ -350,7 +350,7 @@ export function revalidateCashouts() { } export function useCashouts(account: string) { const { state: credentials } = useSessionState(); - const { bank: api, config } = useBankCoreApiContext(); + const { lib: { bank: api }, config } = useBankCoreApiContext(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; @@ -406,7 +406,7 @@ export function revalidateCashoutDetails() { export function useCashoutDetails(cashoutId: number | undefined) { const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? undefined : credentials; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); async function fetcher([username, token, id]: [string, AccessToken, number]) { return api.getCashoutById({ username, token }, id); @@ -459,7 +459,7 @@ export function useLastMonitorInfo( previousMoment: number, timeframe: TalerCorebankApi.MonitorTimeframeParam, ) { - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; diff --git a/packages/bank-ui/src/hooks/session.ts b/packages/bank-ui/src/hooks/session.ts index 35f87e1be..661d64415 100644 --- a/packages/bank-ui/src/hooks/session.ts +++ b/packages/bank-ui/src/hooks/session.ts @@ -86,7 +86,7 @@ export interface SessionStateHandler { logIn(info: { username: string; token: AccessToken }): void; } -const SESSION_STATE_KEY = buildStorageKey("bank-state", codecForSessionState()); +const SESSION_STATE_KEY = buildStorageKey("bank-session", codecForSessionState()); /** * Return getters and setters for diff --git a/packages/bank-ui/src/pages/AccountPage/index.ts b/packages/bank-ui/src/pages/AccountPage/index.ts index 757346c5c..8a9471ef4 100644 --- a/packages/bank-ui/src/pages/AccountPage/index.ts +++ b/packages/bank-ui/src/pages/AccountPage/index.ts @@ -25,7 +25,7 @@ import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js import { LoginForm } from "../LoginForm.js"; import { useComponentState } from "./state.js"; import { InvalidIbanView, ReadyView } from "./views.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export interface Props { account: string; diff --git a/packages/bank-ui/src/pages/AccountPage/views.tsx b/packages/bank-ui/src/pages/AccountPage/views.tsx index 3a182ed1b..42892f536 100644 --- a/packages/bank-ui/src/pages/AccountPage/views.tsx +++ b/packages/bank-ui/src/pages/AccountPage/views.tsx @@ -22,7 +22,7 @@ import { useBankState } from "../../hooks/bank-state.js"; import { usePreferences } from "../../hooks/preferences.js"; import { PaymentOptions } from "../PaymentOptions.js"; import { State } from "./index.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export function InvalidIbanView({ error }: State.InvalidIban) { return ( diff --git a/packages/bank-ui/src/pages/BankFrame.tsx b/packages/bank-ui/src/pages/BankFrame.tsx index 39f042455..6eb7d1b7e 100644 --- a/packages/bank-ui/src/pages/BankFrame.tsx +++ b/packages/bank-ui/src/pages/BankFrame.tsx @@ -33,7 +33,7 @@ import { } from "@gnu-taler/web-util/browser"; import { ComponentChildren, Fragment, VNode, h } from "preact"; import { useEffect, useErrorBoundary, useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSettingsContext } from "../context/settings.js"; import { useAccountDetails } from "../hooks/account.js"; import { useBankState } from "../hooks/bank-state.js"; @@ -43,7 +43,7 @@ import { usePreferences, } from "../hooks/preferences.js"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { RenderAmount } from "./PaytoWireTransferForm.js"; import { privatePages } from "../Routing.js"; @@ -102,9 +102,9 @@ export function BankFrame({ session.state.status !== "loggedIn" ? undefined : () => { - session.logOut(); - resetBankState(); - } + session.logOut(); + resetBankState(); + } } sites={ !settings.topNavSites ? [] : Object.entries(settings.topNavSites) @@ -234,7 +234,7 @@ function AppActivity(): VNode { }>(); const [status, setStatus] = useState<"ok" | "fail">(); const d = useBankCoreApiContext(); - const onBackendActivity = !d ? undefined : d.onBackendActivity; + const onBackendActivity = !d ? undefined : d.onActivity; const cancelRequest = !d ? undefined : d.cancelRequest; const [pref] = usePreferences(); useEffect(() => { diff --git a/packages/bank-ui/src/pages/LoginForm.tsx b/packages/bank-ui/src/pages/LoginForm.tsx index 337cfc8b1..904cd39d2 100644 --- a/packages/bank-ui/src/pages/LoginForm.tsx +++ b/packages/bank-ui/src/pages/LoginForm.tsx @@ -24,9 +24,9 @@ import { } from "@gnu-taler/web-util/browser"; import { VNode, h } from "preact"; import { useEffect, useRef, useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty } from "../utils.js"; import { doAutoFocus } from "./PaytoWireTransferForm.js"; import { USERNAME_REGEX } from "./RegistrationPage.js"; @@ -52,7 +52,7 @@ export function LoginForm({ ); const [password, setPassword] = useState<string | undefined>(); const { i18n } = useTranslationContext(); - const { authenticator } = useBankCoreApiContext(); + const { lib: { auth: authenticator } } = useBankCoreApiContext(); const [notification, withErrorHandler] = useLocalNotificationHandler(); const { config } = useBankCoreApiContext(); @@ -78,25 +78,25 @@ export function LoginForm({ !username || !password ? undefined : withErrorHandler( - async () => - authenticator(username).createAccessToken(password, { - // scope: "readwrite" as "write", // FIX: different than merchant - scope: "readwrite", - duration: { d_us: "forever" }, - refreshable: true, - }), - (result) => { - session.logIn({ username, token: result.body.access_token }); - }, - (fail) => { - switch (fail.case) { - case HttpStatusCode.Unauthorized: - return i18n.str`Wrong credentials for "${username}"`; - case HttpStatusCode.NotFound: - return i18n.str`Account not found`; - } - }, - ); + async () => + authenticator(username).createAccessToken(password, { + // scope: "readwrite" as "write", // FIX: different than merchant + scope: "readwrite", + duration: { d_us: "forever" }, + refreshable: true, + }), + (result) => { + session.logIn({ username, token: result.body.access_token }); + }, + (fail) => { + switch (fail.case) { + case HttpStatusCode.Unauthorized: + return i18n.str`Wrong credentials for "${username}"`; + case HttpStatusCode.NotFound: + return i18n.str`Account not found`; + } + }, + ); return ( <div class="flex min-h-full flex-col justify-center "> diff --git a/packages/bank-ui/src/pages/OperationState/index.ts b/packages/bank-ui/src/pages/OperationState/index.ts index 8ab5659b1..4a7888ee3 100644 --- a/packages/bank-ui/src/pages/OperationState/index.ts +++ b/packages/bank-ui/src/pages/OperationState/index.ts @@ -34,7 +34,7 @@ import { NeedConfirmationView, ReadyView, } from "./views.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export interface Props { currency: string; @@ -106,15 +106,15 @@ export namespace State { account: string; routeHere: RouteDefinition<{ wopid: string }>; onAbort: - | undefined - | (() => Promise< - TalerCoreBankErrorsByMethod<"abortWithdrawalById"> | undefined - >); + | undefined + | (() => Promise< + TalerCoreBankErrorsByMethod<"abortWithdrawalById"> | undefined + >); onConfirm: - | undefined - | (() => Promise< - TalerCoreBankErrorsByMethod<"confirmWithdrawalById"> | undefined - >); + | undefined + | (() => Promise< + TalerCoreBankErrorsByMethod<"confirmWithdrawalById"> | undefined + >); error: undefined; id: string; } diff --git a/packages/bank-ui/src/pages/OperationState/state.ts b/packages/bank-ui/src/pages/OperationState/state.ts index 80af1a91d..a0cbc66b9 100644 --- a/packages/bank-ui/src/pages/OperationState/state.ts +++ b/packages/bank-ui/src/pages/OperationState/state.ts @@ -27,7 +27,7 @@ import { import { utils } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; import { mutate } from "swr"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useWithdrawalDetails } from "../../hooks/account.js"; import { useSessionState } from "../../hooks/session.js"; import { useBankState } from "../../hooks/bank-state.js"; @@ -45,7 +45,7 @@ export function useComponentState({ const [bankState, updateBankState] = useBankState(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? undefined : credentials; - const { bank } = useBankCoreApiContext(); + const { lib: { bank } } = useBankCoreApiContext(); const [failure, setFailure] = useState< TalerCoreBankErrorsByMethod<"createWithdrawal"> | undefined @@ -191,9 +191,9 @@ export function useComponentState({ routeClose, onAbort: !creds ? async () => { - onAbort(); - return undefined; - } + onAbort(); + return undefined; + } : doAbort, }; } diff --git a/packages/bank-ui/src/pages/OperationState/views.tsx b/packages/bank-ui/src/pages/OperationState/views.tsx index 330fe1072..62308eca6 100644 --- a/packages/bank-ui/src/pages/OperationState/views.tsx +++ b/packages/bank-ui/src/pages/OperationState/views.tsx @@ -27,6 +27,7 @@ import { LocalNotificationBanner, notifyInfo, useLocalNotification, + useTalerWalletIntegrationAPI, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; @@ -36,7 +37,6 @@ import { useBankState } from "../../hooks/bank-state.js"; import { usePreferences } from "../../hooks/preferences.js"; import { ShouldBeSameUser } from "../WithdrawalConfirmationQuestion.js"; import { State } from "./index.js"; -import { useTalerWalletIntegrationAPI } from "../../context/wallet-integration.js"; export function InvalidPaytoView({ payto }: State.InvalidPayto) { return <div>Payto from server is not valid "{payto}"</div>; diff --git a/packages/bank-ui/src/pages/PaymentOptions.tsx b/packages/bank-ui/src/pages/PaymentOptions.tsx index 189a7665e..386fe31bc 100644 --- a/packages/bank-ui/src/pages/PaymentOptions.tsx +++ b/packages/bank-ui/src/pages/PaymentOptions.tsx @@ -21,7 +21,7 @@ import { useEffect } from "preact/hooks"; import { useWithdrawalDetails } from "../hooks/account.js"; import { useBankState } from "../hooks/bank-state.js"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { PaytoWireTransferForm } from "./PaytoWireTransferForm.js"; import { WalletWithdrawForm } from "./WalletWithdrawForm.js"; diff --git a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx index 7812a1da0..22db739b1 100644 --- a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx +++ b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx @@ -42,10 +42,10 @@ import { import { ComponentChildren, Fragment, Ref, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { mutate } from "swr"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useBankState } from "../hooks/bank-state.js"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty, validateIBAN, validateTalerBank } from "../utils.js"; interface Props { @@ -82,7 +82,7 @@ export function PaytoWireTransferForm({ const isRawPayto = inputType !== "form"; const { state: credentials } = useSessionState(); - const { bank: api, config, url } = useBankCoreApiContext(); + const { lib: { bank: api }, config, url } = useBankCoreApiContext(); const sendingToFixedAccount = withAccount !== undefined; diff --git a/packages/bank-ui/src/pages/ProfileNavigation.tsx b/packages/bank-ui/src/pages/ProfileNavigation.tsx index 1775d9329..1cf357ceb 100644 --- a/packages/bank-ui/src/pages/ProfileNavigation.tsx +++ b/packages/bank-ui/src/pages/ProfileNavigation.tsx @@ -14,12 +14,11 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ import { assertUnreachable } from "@gnu-taler/taler-util"; -import { useTranslationContext } from "@gnu-taler/web-util/browser"; +import { useNavigationContext, useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; -import { useBankCoreApiContext } from "../context/config.js"; -import { useNavigationContext } from "../context/navigation.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export function ProfileNavigation({ current, diff --git a/packages/bank-ui/src/pages/QrCodeSection.tsx b/packages/bank-ui/src/pages/QrCodeSection.tsx index f442857a8..156c18f48 100644 --- a/packages/bank-ui/src/pages/QrCodeSection.tsx +++ b/packages/bank-ui/src/pages/QrCodeSection.tsx @@ -23,13 +23,13 @@ import { Button, LocalNotificationBanner, useLocalNotificationHandler, + useTalerWalletIntegrationAPI, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useEffect } from "preact/hooks"; import { QR } from "../components/QR.js"; -import { useBankCoreApiContext } from "../context/config.js"; -import { useTalerWalletIntegrationAPI } from "../context/wallet-integration.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../hooks/session.js"; export function QrCodeSection({ @@ -51,7 +51,7 @@ export function QrCodeSection({ const [notification, handleError] = useLocalNotificationHandler(); - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const onAbortHandler = handleError( async () => { diff --git a/packages/bank-ui/src/pages/RegistrationPage.tsx b/packages/bank-ui/src/pages/RegistrationPage.tsx index 2ce9d96cc..d7093d973 100644 --- a/packages/bank-ui/src/pages/RegistrationPage.tsx +++ b/packages/bank-ui/src/pages/RegistrationPage.tsx @@ -26,9 +26,9 @@ import { } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSettingsContext } from "../context/settings.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty } from "../utils.js"; import { getRandomPassword, getRandomUsername } from "./rnd.js"; @@ -78,7 +78,7 @@ function RegistrationForm({ const [notification, , handleError] = useLocalNotification(); const settings = useSettingsContext(); - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); // const { register } = useTestingAPI(); const { i18n } = useTranslationContext(); diff --git a/packages/bank-ui/src/pages/SolveChallengePage.tsx b/packages/bank-ui/src/pages/SolveChallengePage.tsx index 30ca122bf..48d62f1de 100644 --- a/packages/bank-ui/src/pages/SolveChallengePage.tsx +++ b/packages/bank-ui/src/pages/SolveChallengePage.tsx @@ -32,19 +32,19 @@ import { LocalNotificationBanner, ShowInputErrorLabel, useLocalNotification, + useNavigationContext, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useEffect, useState } from "preact/hooks"; import { ErrorLoadingWithDebug } from "../components/ErrorLoadingWithDebug.js"; import { Time } from "../components/Time.js"; -import { useBankCoreApiContext } from "../context/config.js"; -import { useNavigationContext } from "../context/navigation.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useWithdrawalDetails } from "../hooks/account.js"; import { ChallengeInProgess, useBankState } from "../hooks/bank-state.js"; import { useConversionInfo } from "../hooks/regional.js"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty } from "../utils.js"; import { RenderAmount } from "./PaytoWireTransferForm.js"; import { OperationNotFound } from "./WithdrawalQRCode.js"; @@ -58,7 +58,7 @@ export function SolveChallengePage({ onChallengeCompleted: () => void; routeClose: RouteDefinition; }): VNode { - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const { i18n } = useTranslationContext(); const [bankState, updateBankState] = useBankState(); const [code, setCode] = useState<string | undefined>(undefined); diff --git a/packages/bank-ui/src/pages/WalletWithdrawForm.tsx b/packages/bank-ui/src/pages/WalletWithdrawForm.tsx index 2aa0338ad..b95b109d5 100644 --- a/packages/bank-ui/src/pages/WalletWithdrawForm.tsx +++ b/packages/bank-ui/src/pages/WalletWithdrawForm.tsx @@ -33,11 +33,11 @@ import { import { VNode, h } from "preact"; import { forwardRef } from "preact/compat"; import { useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../hooks/session.js"; import { useBankState } from "../hooks/bank-state.js"; import { usePreferences } from "../hooks/preferences.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty } from "../utils.js"; import { OperationState } from "./OperationState/index.js"; import { @@ -70,7 +70,7 @@ function OldWithdrawalForm({ // const { navigateTo } = useNavigationContext(); const [bankState, updateBankState] = useBankState(); - const { bank: api, config } = useBankCoreApiContext(); + const { lib: { bank: api }, config } = useBankCoreApiContext(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? undefined : credentials; @@ -105,12 +105,12 @@ function OldWithdrawalForm({ class="font-semibold text-yellow-700 hover:text-yellow-600" name="complete operation" href={url} - // onClick={(e) => { - // e.preventDefault() - // walletInegrationApi.publishTalerAction(uri, () => { - // navigateTo(url) - // }) - // }} + // onClick={(e) => { + // e.preventDefault() + // walletInegrationApi.publishTalerAction(uri, () => { + // navigateTo(url) + // }) + // }} > <i18n.Translate>this page</i18n.Translate> </a> @@ -392,7 +392,7 @@ export function WalletWithdrawForm({ routeClose={routeCancel} routeHere={routeOperationDetails} onAbort={onOperationAborted} - // route={routeCancel} + // route={routeCancel} /> )} </div> diff --git a/packages/bank-ui/src/pages/WireTransfer.tsx b/packages/bank-ui/src/pages/WireTransfer.tsx index 59d6b2b0f..f45390938 100644 --- a/packages/bank-ui/src/pages/WireTransfer.tsx +++ b/packages/bank-ui/src/pages/WireTransfer.tsx @@ -30,7 +30,7 @@ import { useAccountDetails } from "../hooks/account.js"; import { useSessionState } from "../hooks/session.js"; import { LoginForm } from "./LoginForm.js"; import { PaytoWireTransferForm } from "./PaytoWireTransferForm.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export function WireTransfer({ toAccount, diff --git a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx index c7bdaaf21..1eec8bfc2 100644 --- a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx +++ b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx @@ -35,11 +35,11 @@ import { } from "@gnu-taler/web-util/browser"; import { ComponentChildren, Fragment, VNode, h } from "preact"; import { mutate } from "swr"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useBankState } from "../hooks/bank-state.js"; import { usePreferences } from "../hooks/preferences.js"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { LoginForm } from "./LoginForm.js"; import { RenderAmount } from "./PaytoWireTransferForm.js"; @@ -74,7 +74,7 @@ export function WithdrawalConfirmationQuestion({ const [notification, notify, handleError] = useLocalNotification(); - const { config, bank: api } = useBankCoreApiContext(); + const { config, lib: { bank: api } } = useBankCoreApiContext(); async function doTransfer() { await handleError(async () => { diff --git a/packages/bank-ui/src/pages/WithdrawalOperationPage.tsx b/packages/bank-ui/src/pages/WithdrawalOperationPage.tsx index fb280cf9c..9dee1403a 100644 --- a/packages/bank-ui/src/pages/WithdrawalOperationPage.tsx +++ b/packages/bank-ui/src/pages/WithdrawalOperationPage.tsx @@ -17,9 +17,9 @@ import { parseWithdrawUri, stringifyWithdrawUri } from "@gnu-taler/taler-util"; import { Attention, useTranslationContext } from "@gnu-taler/web-util/browser"; import { VNode, h } from "preact"; -import { useBankCoreApiContext } from "../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useBankState } from "../hooks/bank-state.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { WithdrawalQRCode } from "./WithdrawalQRCode.js"; export function WithdrawalOperationPage({ @@ -36,7 +36,7 @@ export function WithdrawalOperationPage({ routeClose: RouteDefinition; routeWithdrawalDetails: RouteDefinition<{ wopid: string }>; }): VNode { - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const uri = stringifyWithdrawUri({ bankIntegrationApiBaseUrl: api.getIntegrationAPI().href, withdrawalOperationId: operationId, diff --git a/packages/bank-ui/src/pages/WithdrawalQRCode.tsx b/packages/bank-ui/src/pages/WithdrawalQRCode.tsx index 9765147d1..b61f0cc8f 100644 --- a/packages/bank-ui/src/pages/WithdrawalQRCode.tsx +++ b/packages/bank-ui/src/pages/WithdrawalQRCode.tsx @@ -31,7 +31,7 @@ import { import { VNode, h } from "preact"; import { ErrorLoadingWithDebug } from "../components/ErrorLoadingWithDebug.js"; import { useWithdrawalDetails } from "../hooks/account.js"; -import { RouteDefinition } from "../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { QrCodeSection } from "./QrCodeSection.js"; import { WithdrawalConfirmationQuestion } from "./WithdrawalConfirmationQuestion.js"; diff --git a/packages/bank-ui/src/pages/account/CashoutListForAccount.tsx b/packages/bank-ui/src/pages/account/CashoutListForAccount.tsx index bd9352b21..301978eaa 100644 --- a/packages/bank-ui/src/pages/account/CashoutListForAccount.tsx +++ b/packages/bank-ui/src/pages/account/CashoutListForAccount.tsx @@ -19,7 +19,7 @@ import { Cashouts } from "../../components/Cashouts/index.js"; import { useSessionState } from "../../hooks/session.js"; import { ProfileNavigation } from "../ProfileNavigation.js"; import { CreateCashout } from "../regional/CreateCashout.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; interface Props { account: string; diff --git a/packages/bank-ui/src/pages/account/ShowAccountDetails.tsx b/packages/bank-ui/src/pages/account/ShowAccountDetails.tsx index 13685c2c8..bd3961bb7 100644 --- a/packages/bank-ui/src/pages/account/ShowAccountDetails.tsx +++ b/packages/bank-ui/src/pages/account/ShowAccountDetails.tsx @@ -35,11 +35,11 @@ import { import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useAccountDetails } from "../../hooks/account.js"; import { useSessionState } from "../../hooks/session.js"; import { useBankState } from "../../hooks/bank-state.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { LoginForm } from "../LoginForm.js"; import { ProfileNavigation } from "../ProfileNavigation.js"; import { AccountForm } from "../admin/AccountForm.js"; @@ -70,7 +70,7 @@ export function ShowAccountDetails({ const { i18n } = useTranslationContext(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? undefined : credentials; - const { bank } = useBankCoreApiContext(); + const { lib: { bank } } = useBankCoreApiContext(); const accountIsTheCurrentUser = credentials.status === "loggedIn" ? credentials.username === account diff --git a/packages/bank-ui/src/pages/account/UpdateAccountPassword.tsx b/packages/bank-ui/src/pages/account/UpdateAccountPassword.tsx index 1147e723a..58010ecb3 100644 --- a/packages/bank-ui/src/pages/account/UpdateAccountPassword.tsx +++ b/packages/bank-ui/src/pages/account/UpdateAccountPassword.tsx @@ -29,10 +29,10 @@ import { } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../../hooks/session.js"; import { useBankState } from "../../hooks/bank-state.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty } from "../../utils.js"; import { doAutoFocus } from "../PaytoWireTransferForm.js"; import { ProfileNavigation } from "../ProfileNavigation.js"; @@ -66,7 +66,7 @@ export function UpdateAccountPassword({ const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const [current, setCurrent] = useState<string | undefined>(); const [password, setPassword] = useState<string | undefined>(); diff --git a/packages/bank-ui/src/pages/admin/AccountForm.tsx b/packages/bank-ui/src/pages/admin/AccountForm.tsx index 10b6afdf9..026f6e9b3 100644 --- a/packages/bank-ui/src/pages/admin/AccountForm.tsx +++ b/packages/bank-ui/src/pages/admin/AccountForm.tsx @@ -30,7 +30,7 @@ import { } from "@gnu-taler/web-util/browser"; import { ComponentChildren, VNode, h } from "preact"; import { useState } from "preact/hooks"; -import { VersionHint, useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../../hooks/session.js"; import { ErrorMessageMappingFor, @@ -92,7 +92,7 @@ export function AccountForm<PurposeType extends keyof ChangeByPurposeType>({ onChange: ChangeByPurposeType[PurposeType]; purpose: PurposeType; }): VNode { - const { config, hints, url } = useBankCoreApiContext(); + const { config, url } = useBankCoreApiContext(); const { i18n } = useTranslationContext(); const { state: credentials } = useSessionState(); const [form, setForm] = useState<AccountFormData>({}); @@ -125,8 +125,6 @@ export function AccountForm<PurposeType extends keyof ChangeByPurposeType>({ tan_channel: template?.tan_channel, }; - const OLD_CASHOUT_API = hints.indexOf(VersionHint.CASHOUT_BEFORE_2FA) !== -1; - const userIsAdmin = credentials.status !== "loggedIn" ? false : credentials.isUserAdministrator; @@ -144,9 +142,6 @@ export function AccountForm<PurposeType extends keyof ChangeByPurposeType>({ userIsAdmin && (purpose === "create" || purpose === "update"); const editableAccount = purpose === "create" && userIsAdmin; - const hasPhone = !!defaultValue.phone || !!form.phone; - const hasEmail = !!defaultValue.email || !!form.email; - function updateForm(newForm: typeof defaultValue): void { const trimmedAmountStr = newForm.debit_threshold?.trim(); const parsedAmount = Amounts.parse( @@ -503,138 +498,6 @@ export function AccountForm<PurposeType extends keyof ChangeByPurposeType>({ /> )} - {/* channel, not shown if old cashout api */} - {OLD_CASHOUT_API || - config.supported_tan_channels.length === 0 ? undefined : ( - <div class="sm:col-span-5"> - <label - class="block text-sm font-medium leading-6 text-gray-900" - for="channel" - > - {i18n.str`Enable second factor authentication`} - </label> - <div class="mt-2 max-w-xl text-sm text-gray-500"> - <div class="px-4 mt-4 grid grid-cols-1 gap-y-6"> - {config.supported_tan_channels.indexOf(TanChannel.EMAIL) === - -1 ? undefined : ( - <label - onClick={(e) => { - if (!hasEmail) return; - if (form.tan_channel === TanChannel.EMAIL) { - form.tan_channel = "remove"; - } else { - form.tan_channel = TanChannel.EMAIL; - } - updateForm(structuredClone(form)); - e.preventDefault(); - }} - data-disabled={purpose === "show" || !hasEmail} - data-selected={ - (form.tan_channel ?? defaultValue.tan_channel) === - TanChannel.EMAIL - } - class="relative flex data-[disabled=false]:cursor-pointer rounded-lg border bg-white data-[disabled=true]:bg-gray-200 p-4 shadow-sm focus:outline-none border-gray-300 data-[selected=true]:ring-2 data-[selected=true]:ring-indigo-600" - > - <input - type="radio" - name="channel" - value="Newsletter" - class="sr-only" - /> - <span class="flex flex-1"> - <span class="flex flex-col"> - <span - id="project-type-0-label" - class="block text-sm font-medium text-gray-900 " - > - <i18n.Translate>Using email</i18n.Translate> - </span> - {purpose !== "show" && - !hasEmail && - i18n.str`Add an email in your profile to enable this option`} - </span> - </span> - <svg - data-selected={ - (form.tan_channel ?? defaultValue.tan_channel) === - TanChannel.EMAIL - } - class="h-5 w-5 text-indigo-600 data-[selected=false]:hidden" - viewBox="0 0 20 20" - fill="currentColor" - aria-hidden="true" - > - <path - fill-rule="evenodd" - d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" - clip-rule="evenodd" - /> - </svg> - </label> - )} - - {config.supported_tan_channels.indexOf(TanChannel.SMS) === - -1 ? undefined : ( - <label - onClick={(e) => { - if (!hasPhone) return; - if (form.tan_channel === TanChannel.SMS) { - form.tan_channel = "remove"; - } else { - form.tan_channel = TanChannel.SMS; - } - updateForm(structuredClone(form)); - e.preventDefault(); - }} - data-disabled={purpose === "show" || !hasPhone} - data-selected={ - (form.tan_channel ?? defaultValue.tan_channel) === - TanChannel.SMS - } - class="relative flex data-[disabled=false]:cursor-pointer rounded-lg border data-[disabled=true]:bg-gray-200 p-4 shadow-sm focus:outline-none border-gray-300 data-[selected=true]:ring-2 data-[selected=true]:ring-indigo-600" - > - <input - type="radio" - name="channel" - value="Existing Customers" - class="sr-only" - /> - <span class="flex flex-1"> - <span class="flex flex-col"> - <span - id="project-type-1-label" - class="block text-sm font-medium text-gray-900" - > - <i18n.Translate>Using SMS</i18n.Translate> - </span> - {purpose !== "show" && - !hasPhone && - i18n.str`Add a phone number in your profile to enable this option`} - </span> - </span> - <svg - data-selected={ - (form.tan_channel ?? defaultValue.tan_channel) === - TanChannel.SMS - } - class="h-5 w-5 text-indigo-600 data-[selected=false]:hidden" - viewBox="0 0 20 20" - fill="currentColor" - aria-hidden="true" - > - <path - fill-rule="evenodd" - d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" - clip-rule="evenodd" - /> - </svg> - </label> - )} - </div> - </div> - </div> - )} - <div class="sm:col-span-5"> <label for="debit" @@ -649,9 +512,9 @@ export function AccountForm<PurposeType extends keyof ChangeByPurposeType>({ !editableThreshold ? undefined : (e) => { - form.debit_threshold = e as AmountString; - updateForm(structuredClone(form)); - } + form.debit_threshold = e as AmountString; + updateForm(structuredClone(form)); + } } /> <ShowInputErrorLabel diff --git a/packages/bank-ui/src/pages/admin/AccountList.tsx b/packages/bank-ui/src/pages/admin/AccountList.tsx index 75bc014eb..c4e529f9f 100644 --- a/packages/bank-ui/src/pages/admin/AccountList.tsx +++ b/packages/bank-ui/src/pages/admin/AccountList.tsx @@ -22,9 +22,9 @@ import { import { Loading, useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useBusinessAccounts } from "../../hooks/regional.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { RenderAmount } from "../PaytoWireTransferForm.js"; interface Props { diff --git a/packages/bank-ui/src/pages/admin/AdminHome.tsx b/packages/bank-ui/src/pages/admin/AdminHome.tsx index 613f5c1ef..94b88dc89 100644 --- a/packages/bank-ui/src/pages/admin/AdminHome.tsx +++ b/packages/bank-ui/src/pages/admin/AdminHome.tsx @@ -39,9 +39,9 @@ import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; import { Transactions } from "../../components/Transactions/index.js"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useConversionInfo, useLastMonitorInfo } from "../../hooks/regional.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { RenderAmount } from "../PaytoWireTransferForm.js"; import { WireTransfer } from "../WireTransfer.js"; import { AccountList } from "./AccountList.js"; @@ -363,7 +363,7 @@ function Metrics({ </div> <dl class="mt-5 grid grid-cols-1 md:grid-cols-2 divide-y divide-gray-200 overflow-hidden rounded-lg bg-white shadow-lg md:divide-x md:divide-y-0"> {resp.current.body.type !== "with-conversions" || - resp.previous.body.type !== "with-conversions" ? undefined : ( + resp.previous.body.type !== "with-conversions" ? undefined : ( <Fragment> <div class="px-4 py-5 sm:p-6"> <dt class="text-base font-normal text-gray-900"> @@ -462,9 +462,9 @@ function MetricValue({ const rate = !currAmount || - Number.isNaN(currAmount) || - !prevAmount || - Number.isNaN(prevAmount) + Number.isNaN(currAmount) || + !prevAmount || + Number.isNaN(prevAmount) ? 0 : cmp === -1 ? 1 - Math.round(currAmount) / Math.round(prevAmount) diff --git a/packages/bank-ui/src/pages/admin/CreateNewAccount.tsx b/packages/bank-ui/src/pages/admin/CreateNewAccount.tsx index b14f5b7ca..ecbb18b57 100644 --- a/packages/bank-ui/src/pages/admin/CreateNewAccount.tsx +++ b/packages/bank-ui/src/pages/admin/CreateNewAccount.tsx @@ -30,9 +30,9 @@ import { } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../../hooks/session.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { AccountForm } from "./AccountForm.js"; export function CreateNewAccount({ @@ -46,7 +46,7 @@ export function CreateNewAccount({ const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? undefined : credentials.token; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const [submitAccount, setSubmitAccount] = useState< TalerCorebankApi.RegisterAccountRequest | undefined diff --git a/packages/bank-ui/src/pages/admin/DownloadStats.tsx b/packages/bank-ui/src/pages/admin/DownloadStats.tsx index bef12c580..b9ae401e7 100644 --- a/packages/bank-ui/src/pages/admin/DownloadStats.tsx +++ b/packages/bank-ui/src/pages/admin/DownloadStats.tsx @@ -29,9 +29,9 @@ import { } from "@gnu-taler/web-util/browser"; import { VNode, h } from "preact"; import { useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../../hooks/session.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { getTimeframesForDate } from "./AdminHome.js"; interface Props { @@ -59,7 +59,7 @@ export function DownloadStats({ routeCancel }: Props): VNode { credentials.status !== "loggedIn" || !credentials.isUserAdministrator ? undefined : credentials; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const [options, setOptions] = useState<Options>({ compareWithPrevious: true, @@ -460,9 +460,9 @@ async function fetchAllStatus( // await delay() const previous = options.compareWithPrevious ? await api.getMonitor(token, { - timeframe: frame.timeframe, - which: frame.moment.previous, - }) + timeframe: frame.timeframe, + which: frame.moment.previous, + }) : undefined; if (previous && previous.type === "fail" && options.endOnFirstFail) { diff --git a/packages/bank-ui/src/pages/admin/RemoveAccount.tsx b/packages/bank-ui/src/pages/admin/RemoveAccount.tsx index dad315d98..f9c23ea72 100644 --- a/packages/bank-ui/src/pages/admin/RemoveAccount.tsx +++ b/packages/bank-ui/src/pages/admin/RemoveAccount.tsx @@ -34,14 +34,14 @@ import { import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useAccountDetails } from "../../hooks/account.js"; import { useSessionState } from "../../hooks/session.js"; import { undefinedIfEmpty } from "../../utils.js"; import { LoginForm } from "../LoginForm.js"; import { doAutoFocus } from "../PaytoWireTransferForm.js"; import { useBankState } from "../../hooks/bank-state.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; export function RemoveAccount({ account, @@ -64,7 +64,7 @@ export function RemoveAccount({ const { state } = useSessionState(); const token = state.status !== "loggedIn" ? undefined : state.token; - const { bank: api } = useBankCoreApiContext(); + const { lib: { bank: api } } = useBankCoreApiContext(); const [notification, notify, handleError] = useLocalNotification(); const [, updateBankState] = useBankState(); diff --git a/packages/bank-ui/src/pages/regional/ConversionConfig.tsx b/packages/bank-ui/src/pages/regional/ConversionConfig.tsx index 014142e97..7527290d0 100644 --- a/packages/bank-ui/src/pages/regional/ConversionConfig.tsx +++ b/packages/bank-ui/src/pages/regional/ConversionConfig.tsx @@ -35,7 +35,7 @@ import { } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useEffect, useState } from "preact/hooks"; -import { useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useSessionState } from "../../hooks/session.js"; import { TransferCalculation, @@ -43,7 +43,7 @@ import { useCashoutEstimator, useConversionInfo, } from "../../hooks/regional.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty } from "../../utils.js"; import { InputAmount, RenderAmount } from "../PaytoWireTransferForm.js"; import { ProfileNavigation } from "../ProfileNavigation.js"; @@ -104,7 +104,7 @@ function useComponentState({ return function afterComponentLoads() { const { i18n } = useTranslationContext(); - const { conversion } = useBankCoreApiContext(); + const { lib: { conversion } } = useBankCoreApiContext(); const [notification, notify, handleError] = useLocalNotification(); @@ -519,8 +519,8 @@ function useComponentState({ </div> {cashoutCalc && - status.status === "ok" && - Amounts.cmp(status.result.amount, cashoutCalc.credit) < + status.status === "ok" && + Amounts.cmp(status.result.amount, cashoutCalc.credit) < 0 ? ( <div class="p-4"> <Attention diff --git a/packages/bank-ui/src/pages/regional/CreateCashout.tsx b/packages/bank-ui/src/pages/regional/CreateCashout.tsx index 20d6b0bff..393240dee 100644 --- a/packages/bank-ui/src/pages/regional/CreateCashout.tsx +++ b/packages/bank-ui/src/pages/regional/CreateCashout.tsx @@ -37,7 +37,7 @@ import { import { Fragment, VNode, h } from "preact"; import { useEffect, useState } from "preact/hooks"; import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; -import { VersionHint, useBankCoreApiContext } from "../../context/config.js"; +import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; import { useAccountDetails } from "../../hooks/account.js"; import { useBankState } from "../../hooks/bank-state.js"; import { @@ -46,7 +46,7 @@ import { useConversionInfo, } from "../../hooks/regional.js"; import { useSessionState } from "../../hooks/session.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { TanChannel, undefinedIfEmpty } from "../../utils.js"; import { LoginForm } from "../LoginForm.js"; import { @@ -90,7 +90,7 @@ export function CreateCashout({ const creds = credentials.status !== "loggedIn" ? undefined : credentials; const [, updateBankState] = useBankState(); - const { bank: api, config, hints } = useBankCoreApiContext(); + const { lib: { bank: api }, config, hints } = useBankCoreApiContext(); const [form, setForm] = useState<Partial<FormType>>({ isDebit: true }); const [notification, notify, handleError] = useLocalNotification(); const info = useConversionInfo(); @@ -116,8 +116,6 @@ export function CreateCashout({ ); } - const OLD_CASHOUT_API = hints.indexOf(VersionHint.CASHOUT_BEFORE_2FA) !== -1; - if (!resultAccount) { return <Loading />; } @@ -198,8 +196,7 @@ export function CreateCashout({ * depending on the isDebit flag */ const inputAmount = Amounts.parseOrThrow( - `${form.isDebit ? regional_currency : fiat_currency}:${ - !form.amount ? "0" : form.amount + `${form.isDebit ? regional_currency : fiat_currency}:${!form.amount ? "0" : form.amount }`, ); @@ -240,19 +237,17 @@ export function CreateCashout({ : Amounts.cmp(limit, calc.debit) === -1 ? i18n.str`Balance is not enough` : form.isDebit && - Amounts.cmp(inputAmount, conversionInfo.cashout_min_amount) < 1 - ? i18n.str`Needs to be higher than ${ - Amounts.stringifyValueWithSpec( - Amounts.parseOrThrow(conversionInfo.cashout_min_amount), - regional_currency_specification, - ).normal + Amounts.cmp(inputAmount, conversionInfo.cashout_min_amount) < 1 + ? i18n.str`Needs to be higher than ${Amounts.stringifyValueWithSpec( + Amounts.parseOrThrow(conversionInfo.cashout_min_amount), + regional_currency_specification, + ).normal }` : calculationResult === "amount-is-too-small" ? i18n.str`Amount needs to be higher` : Amounts.isZero(calc.credit) ? i18n.str`The total transfer at destination will be zero` : undefined, - channel: OLD_CASHOUT_API && !form.channel ? i18n.str`Required` : undefined, }); const trimmedAmountStr = form.amount?.trim(); @@ -260,9 +255,7 @@ export function CreateCashout({ const request_uid = encodeCrock(getRandomBytes(32)); await handleError(async () => { // new cashout api doesn't require channel - const validChannel = - !OLD_CASHOUT_API || - config.supported_tan_channels.length === 0 || + const validChannel = config.supported_tan_channels.length === 0 || form.channel; if (!creds || !form.subject || !validChannel) return; @@ -613,9 +606,9 @@ export function CreateCashout({ cashoutDisabled ? undefined : (value) => { - form.amount = value; - updateForm(structuredClone(form)); - } + form.amount = value; + updateForm(structuredClone(form)); + } } /> <ShowInputErrorLabel @@ -656,7 +649,7 @@ export function CreateCashout({ </dd> </div> {Amounts.isZero(sellFee) || - Amounts.isZero(calc.beforeFee) ? undefined : ( + Amounts.isZero(calc.beforeFee) ? undefined : ( <div class="flex items-center justify-between border-t-2 afu pt-4"> <dt class="flex items-center text-sm text-gray-600"> <span> @@ -687,130 +680,6 @@ export function CreateCashout({ </div> )} - {/* channel, not shown if new cashout api */} - {!OLD_CASHOUT_API ? undefined : config.supported_tan_channels - .length === 0 ? ( - <div class="sm:col-span-5"> - <Attention - type="warning" - title={i18n.str`No cashout channel available`} - > - <i18n.Translate> - Before doing a cashout the server need to provide an - second channel to confirm the operation - </i18n.Translate> - </Attention> - </div> - ) : ( - <div class="sm:col-span-5"> - <label - class="block text-sm font-medium leading-6 text-gray-900" - for="channel" - > - {i18n.str`Second factor authentication`} - </label> - <div class="mt-2 max-w-xl text-sm text-gray-500"> - <div class="px-4 mt-4 grid grid-cols-1 gap-y-6"> - {config.supported_tan_channels.indexOf( - TanChannel.EMAIL, - ) === -1 ? undefined : ( - <label - onClick={() => { - if (!resultAccount.body.contact_data?.email) return; - form.channel = TanChannel.EMAIL; - updateForm(structuredClone(form)); - }} - data-disabled={ - !resultAccount.body.contact_data?.email - } - data-selected={form.channel === TanChannel.EMAIL} - class="relative flex data-[disabled=false]:cursor-pointer rounded-lg border bg-white data-[disabled=true]:bg-gray-200 p-4 shadow-sm focus:outline-none border-gray-300 data-[selected=true]:ring-2 data-[selected=true]:ring-indigo-600" - > - <input - type="radio" - name="channel" - value="Newsletter" - class="sr-only" - /> - <span class="flex flex-1"> - <span class="flex flex-col"> - <span - id="project-type-0-label" - class="block text-sm font-medium text-gray-900 " - > - <i18n.Translate>Email</i18n.Translate> - </span> - {!resultAccount.body.contact_data?.email && - i18n.str`Add a email in your profile to enable this option`} - </span> - </span> - <svg - data-selected={form.channel === TanChannel.EMAIL} - class="h-5 w-5 text-indigo-600 data-[selected=false]:hidden" - viewBox="0 0 20 20" - fill="currentColor" - aria-hidden="true" - > - <path - fill-rule="evenodd" - d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" - clip-rule="evenodd" - /> - </svg> - </label> - )} - - {config.supported_tan_channels.indexOf(TanChannel.SMS) === - -1 ? undefined : ( - <label - onClick={() => { - if (!resultAccount.body.contact_data?.phone) return; - form.channel = TanChannel.SMS; - updateForm(structuredClone(form)); - }} - data-disabled={ - !resultAccount.body.contact_data?.phone - } - data-selected={form.channel === TanChannel.SMS} - class="relative flex data-[disabled=false]:cursor-pointer rounded-lg border data-[disabled=true]:bg-gray-200 p-4 shadow-sm focus:outline-none border-gray-300 data-[selected=true]:ring-2 data-[selected=true]:ring-indigo-600" - > - <input - type="radio" - name="channel" - value="Existing Customers" - class="sr-only" - /> - <span class="flex flex-1"> - <span class="flex flex-col"> - <span - id="project-type-1-label" - class="block text-sm font-medium text-gray-900" - > - <i18n.Translate>SMS</i18n.Translate> - </span> - {!resultAccount.body.contact_data?.phone && - i18n.str`Add a phone number in your profile to enable this option`} - </span> - </span> - <svg - data-selected={form.channel === TanChannel.SMS} - class="h-5 w-5 text-indigo-600 data-[selected=false]:hidden" - viewBox="0 0 20 20" - fill="currentColor" - aria-hidden="true" - > - <path - fill-rule="evenodd" - d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" - clip-rule="evenodd" - /> - </svg> - </label> - )} - </div> - </div> - </div> - )} </div> </div> diff --git a/packages/bank-ui/src/pages/regional/ShowCashoutDetails.tsx b/packages/bank-ui/src/pages/regional/ShowCashoutDetails.tsx index 849da77aa..eaefeab12 100644 --- a/packages/bank-ui/src/pages/regional/ShowCashoutDetails.tsx +++ b/packages/bank-ui/src/pages/regional/ShowCashoutDetails.tsx @@ -29,7 +29,7 @@ import { VNode, h } from "preact"; import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; import { Time } from "../../components/Time.js"; import { useCashoutDetails, useConversionInfo } from "../../hooks/regional.js"; -import { RouteDefinition } from "../../route.js"; +import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { RenderAmount } from "../PaytoWireTransferForm.js"; interface Props { @@ -138,7 +138,7 @@ export function ShowCashoutDetails({ id, routeClose }: Props): VNode { timestamp={AbsoluteTime.fromProtocolTimestamp( result.body.creation_time, )} - // relative={Duration.fromSpec({ days: 1 })} + // relative={Duration.fromSpec({ days: 1 })} /> </dd> </div> diff --git a/packages/bank-ui/src/settings.ts b/packages/bank-ui/src/settings.ts index c7c56d299..49c8408ce 100644 --- a/packages/bank-ui/src/settings.ts +++ b/packages/bank-ui/src/settings.ts @@ -17,6 +17,7 @@ import { Codec, buildCodecForObject, + canonicalizeBaseUrl, codecForBoolean, codecForMap, codecForString, @@ -101,7 +102,11 @@ function buildDefaultBackendBaseURL(): string | undefined { window.location.pathname, window.location.origin, ).href; - return currentLocation.replace("/webui", ""); + /** + * By default, bank backend serves the html content + * from the /webui root. + */ + return canonicalizeBaseUrl(currentLocation.replace("/webui", "")); } - return undefined; + throw Error("No default URL") } diff --git a/packages/bank-ui/src/stories.test.ts b/packages/bank-ui/src/stories.test.ts index 8ed00a1e6..2f3988e9a 100644 --- a/packages/bank-ui/src/stories.test.ts +++ b/packages/bank-ui/src/stories.test.ts @@ -23,13 +23,13 @@ import { TalerCorebankApi, setupI18n, } from "@gnu-taler/taler-util"; -import { parseGroupImport } from "@gnu-taler/web-util/browser"; +import { BankApiProviderTesting, parseGroupImport } from "@gnu-taler/web-util/browser"; import * as tests from "@gnu-taler/web-util/testing"; import * as components from "./components/index.examples.js"; import * as pages from "./pages/index.stories.js"; import { ComponentChildren, VNode, h as create } from "preact"; -import { BankCoreApiProviderTesting } from "./context/config.js"; +// import { BankCoreApiProviderTesting } from "./context/config.js"; setupI18n("en", { en: {} }); @@ -72,10 +72,9 @@ function DefaultTestingContext(_props: { children: ComponentChildren }): VNode { default_debit_threshold: "ARS:10" as AmountString, version: "1:0:0", }; - const ctx2 = create(BankCoreApiProviderTesting, { + const ctx2 = create(BankApiProviderTesting, { children: [], - state: cfg, - url: "http://localhost", + value: cfg as any, }); return ctx2; } |