diff options
Diffstat (limited to 'packages/demobank-ui/src/pages')
27 files changed, 194 insertions, 107 deletions
diff --git a/packages/demobank-ui/src/pages/AccountPage/index.ts b/packages/demobank-ui/src/pages/AccountPage/index.ts index 6c67f6d90..7a85f59fe 100644 --- a/packages/demobank-ui/src/pages/AccountPage/index.ts +++ b/packages/demobank-ui/src/pages/AccountPage/index.ts @@ -33,13 +33,21 @@ export interface Props { onOperationCreated: (wopid: string) => void; onClose: () => void; tab: "charge-wallet" | "wire-transfer" | undefined; - routeClose: RouteDefinition<Record<string, never>>; - routeChargeWallet: RouteDefinition<Record<string, never>>; - routeWireTransfer: RouteDefinition<Record<string, never>>; - routePublicAccounts: RouteDefinition<Record<string, never>>; - routeCreateWireTransfer: RouteDefinition<{ destination: string }>; + routeClose: RouteDefinition; + routeChargeWallet: RouteDefinition; + routeWireTransfer: RouteDefinition<{ + account?: string; + subject?: string; + amount?: string; + }>; + routePublicAccounts: RouteDefinition; + routeCreateWireTransfer: RouteDefinition<{ + account?: string; + subject?: string; + amount?: string; + }>; routeOperationDetails: RouteDefinition<{ wopid: string }>; - routeSolveSecondFactor: RouteDefinition<Record<string, never>>; + routeSolveSecondFactor: RouteDefinition; } export type State = @@ -73,13 +81,21 @@ export namespace State { onAuthorizationRequired: () => void; onOperationCreated: (wopid: string) => void; onClose: () => void; - routeClose: RouteDefinition<Record<string, never>>; - routeChargeWallet: RouteDefinition<Record<string, never>>; - routeWireTransfer: RouteDefinition<Record<string, never>>; - routePublicAccounts: RouteDefinition<Record<string, never>>; - routeCreateWireTransfer: RouteDefinition<{ destination: string }>; + routeClose: RouteDefinition; + routeChargeWallet: RouteDefinition; + routePublicAccounts: RouteDefinition; + routeWireTransfer: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }>; + routeCreateWireTransfer: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }>; routeOperationDetails: RouteDefinition<{ wopid: string }>; - routeSolveSecondFactor: RouteDefinition<Record<string, never>>; + routeSolveSecondFactor: RouteDefinition; } export interface InvalidIban { @@ -90,7 +106,7 @@ export namespace State { export interface UserNotFound { status: "login"; reason: "not-found" | "forbidden"; - routeRegister?: RouteDefinition<Record<string, never>>; + routeRegister?: RouteDefinition; } } diff --git a/packages/demobank-ui/src/pages/AccountPage/views.tsx b/packages/demobank-ui/src/pages/AccountPage/views.tsx index 4f411940f..cb98c5f2a 100644 --- a/packages/demobank-ui/src/pages/AccountPage/views.tsx +++ b/packages/demobank-ui/src/pages/AccountPage/views.tsx @@ -33,7 +33,7 @@ export function InvalidIbanView({ error }: State.InvalidIban) { const IS_PUBLIC_ACCOUNT_ENABLED = false; function ShowDemoInfo({ routePublicAccounts }: { - routePublicAccounts: RouteDefinition<Record<string, never>>; + routePublicAccounts: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const [settings, updateSettings] = usePreferences(); @@ -63,7 +63,7 @@ function ShowDemoInfo({ routePublicAccounts }: { } function ShowPedingOperation({ routeSolveSecondFactor }: { - routeSolveSecondFactor: RouteDefinition<Record<string, never>>; + routeSolveSecondFactor: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const [bankState, updateBankState] = useBankState(); diff --git a/packages/demobank-ui/src/pages/BankFrame.tsx b/packages/demobank-ui/src/pages/BankFrame.tsx index 266eab636..436076ba4 100644 --- a/packages/demobank-ui/src/pages/BankFrame.tsx +++ b/packages/demobank-ui/src/pages/BankFrame.tsx @@ -36,8 +36,8 @@ import { getLabelForPreferences, usePreferences, } from "../hooks/preferences.js"; -import { RenderAmount } from "./PaytoWireTransferForm.js"; import { RouteDefinition } from "../route.js"; +import { RenderAmount } from "./PaytoWireTransferForm.js"; const GIT_HASH = typeof __GIT_HASH__ !== "undefined" ? __GIT_HASH__ : undefined; const VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : undefined; @@ -48,7 +48,7 @@ export function BankFrame({ routeAccountDetails, }: { account?: string; - routeAccountDetails?: RouteDefinition<Record<string, never>>; + routeAccountDetails?: RouteDefinition; children: ComponentChildren; }): VNode { const { i18n } = useTranslationContext(); @@ -179,7 +179,7 @@ export function BankFrame({ function WelcomeAccount({ account, routeAccountDetails }: { account: string, - routeAccountDetails: RouteDefinition<Record<string, never>>; + routeAccountDetails: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const result = useAccountDetails(account); diff --git a/packages/demobank-ui/src/pages/DownloadStats.tsx b/packages/demobank-ui/src/pages/DownloadStats.tsx index 9bdc04123..353238c13 100644 --- a/packages/demobank-ui/src/pages/DownloadStats.tsx +++ b/packages/demobank-ui/src/pages/DownloadStats.tsx @@ -31,11 +31,11 @@ import { VNode, h } from "preact"; import { useState } from "preact/hooks"; import { useBankCoreApiContext } from "../context/config.js"; import { useBackendState } from "../hooks/backend.js"; -import { RouteDefinition } from "../route.js"; +import { EmptyObject, RouteDefinition } from "../route.js"; import { getTimeframesForDate } from "./admin/AdminHome.js"; interface Props { - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; } type Options = { diff --git a/packages/demobank-ui/src/pages/LoginForm.tsx b/packages/demobank-ui/src/pages/LoginForm.tsx index 6d732f5e8..f90b985e6 100644 --- a/packages/demobank-ui/src/pages/LoginForm.tsx +++ b/packages/demobank-ui/src/pages/LoginForm.tsx @@ -31,7 +31,7 @@ import { useBankCoreApiContext } from "../context/config.js"; import { useBackendState } from "../hooks/backend.js"; import { undefinedIfEmpty } from "../utils.js"; import { doAutoFocus } from "./PaytoWireTransferForm.js"; -import { RouteDefinition } from "../route.js"; +import { EmptyObject, RouteDefinition } from "../route.js"; /** * Collect and submit login data. @@ -43,7 +43,7 @@ export function LoginForm({ }: { fixedUser?: boolean; currentUser?: string; - routeRegister?: RouteDefinition<Record<string, never>>; + routeRegister?: RouteDefinition; }): VNode { const backend = useBackendState(); diff --git a/packages/demobank-ui/src/pages/OperationState/index.ts b/packages/demobank-ui/src/pages/OperationState/index.ts index 20cb1760f..e4d9d45e3 100644 --- a/packages/demobank-ui/src/pages/OperationState/index.ts +++ b/packages/demobank-ui/src/pages/OperationState/index.ts @@ -39,8 +39,9 @@ import { RouteDefinition } from "../../route.js"; export interface Props { currency: string; onAuthorizationRequired: () => void; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; onAbort: () => void; + routeHere: RouteDefinition<{ wopid: string }>; } export type State = @@ -81,7 +82,7 @@ export namespace State { onAbort: () => Promise< TalerCoreBankErrorsByMethod<"abortWithdrawalById"> | undefined >; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; } export interface InvalidPayto { @@ -103,28 +104,29 @@ export namespace State { status: "need-confirmation"; onAuthorizationRequired: () => void; 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; } export interface Aborted { status: "aborted"; error: undefined; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; } export interface Confirmed { status: "confirmed"; error: undefined; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; } } diff --git a/packages/demobank-ui/src/pages/OperationState/state.ts b/packages/demobank-ui/src/pages/OperationState/state.ts index 20d66bbb1..ad2d91ee4 100644 --- a/packages/demobank-ui/src/pages/OperationState/state.ts +++ b/packages/demobank-ui/src/pages/OperationState/state.ts @@ -38,6 +38,7 @@ export function useComponentState({ currency, routeClose, onAbort, + routeHere, onAuthorizationRequired, }: Props): utils.RecursiveState<State> { const [settings] = usePreferences(); @@ -190,9 +191,9 @@ export function useComponentState({ routeClose, onAbort: !creds ? async () => { - onAbort(); - return undefined; - } + onAbort(); + return undefined; + } : doAbort, }; } @@ -220,6 +221,7 @@ export function useComponentState({ return { status: "need-confirmation", error: undefined, + routeHere, onAuthorizationRequired, account: data.username, id: withdrawalOperationId, diff --git a/packages/demobank-ui/src/pages/OperationState/views.tsx b/packages/demobank-ui/src/pages/OperationState/views.tsx index d086c3dd1..6eee6daa9 100644 --- a/packages/demobank-ui/src/pages/OperationState/views.tsx +++ b/packages/demobank-ui/src/pages/OperationState/views.tsx @@ -51,6 +51,7 @@ export function InvalidReserveView({ reserve }: State.InvalidReserve) { export function NeedConfirmationView({ onAbort: doAbort, onConfirm: doConfirm, + routeHere, account, id, onAuthorizationRequired, @@ -144,7 +145,9 @@ export function NeedConfirmationView({ operation: "confirm-withdrawal", id: String(resp.body.challenge_id), sent: AbsoluteTime.never(), + location: routeHere.url({ wopid: id }), request: id, + }); return onAuthorizationRequired(); } @@ -331,7 +334,7 @@ export function ConfirmedView({ routeClose }: State.Confirmed) { export function ReadyView({ uri, onAbort: doAbort, -}: State.Ready): VNode<Record<string, never>> { +}: State.Ready): VNode { const { i18n } = useTranslationContext(); const walletInegrationApi = useTalerWalletIntegrationAPI(); const [notification, notify, errorHandler] = useLocalNotification(); diff --git a/packages/demobank-ui/src/pages/PaymentOptions.tsx b/packages/demobank-ui/src/pages/PaymentOptions.tsx index 10be1245f..b13f7539f 100644 --- a/packages/demobank-ui/src/pages/PaymentOptions.tsx +++ b/packages/demobank-ui/src/pages/PaymentOptions.tsx @@ -19,7 +19,7 @@ import { Fragment, VNode, h } from "preact"; import { useBankState } from "../hooks/bank-state.js"; import { PaytoWireTransferForm } from "./PaytoWireTransferForm.js"; import { WalletWithdrawForm } from "./WalletWithdrawForm.js"; -import { RouteDefinition } from "../route.js"; +import { EmptyObject, RouteDefinition } from "../route.js"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { useWithdrawalDetails } from "../hooks/access.js"; import { useEffect } from "preact/hooks"; @@ -85,9 +85,13 @@ export function PaymentOptions({ onClose: () => void; routeOperationDetails: RouteDefinition<{ wopid: string }>; - routeClose: RouteDefinition<Record<string, never>>; - routeChargeWallet: RouteDefinition<Record<string, never>>; - routeWireTransfer: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; + routeChargeWallet: RouteDefinition; + routeWireTransfer: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }>; }): VNode { const { i18n } = useTranslationContext(); const [bankState, updateBankState] = useBankState(); @@ -213,6 +217,7 @@ export function PaymentOptions({ <PaytoWireTransferForm focus title={i18n.str`Transfer details`} + routeHere={routeWireTransfer} limit={limit} onAuthorizationRequired={onAuthorizationRequired} onSuccess={onClose} diff --git a/packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx index 9fe3453a5..00b6767ac 100644 --- a/packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx +++ b/packages/demobank-ui/src/pages/PaytoWireTransferForm.tsx @@ -45,35 +45,47 @@ import { mutate } from "swr"; import { useBankCoreApiContext } from "../context/config.js"; import { useBackendState } from "../hooks/backend.js"; import { useBankState } from "../hooks/bank-state.js"; -import { RouteDefinition } from "../route.js"; +import { EmptyObject, RouteDefinition } from "../route.js"; import { undefinedIfEmpty, validateIBAN, validateTalerBank } from "../utils.js"; +interface Props { + title: TranslatedString; + focus?: boolean; + withAccount?: string; + withSubject?: string; + withAmount?: string; + onSuccess: () => void; + onAuthorizationRequired: () => void; + routeCancel?: RouteDefinition; + routeHere: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }>; + limit: AmountJson; +} + export function PaytoWireTransferForm({ focus, title, - toAccount, + withAccount, + withSubject, + withAmount, onSuccess, routeCancel, + routeHere, onAuthorizationRequired, limit, -}: { - title: TranslatedString; - focus?: boolean; - toAccount?: string; - onSuccess: () => void; - onAuthorizationRequired: () => void; - routeCancel?: RouteDefinition<Record<string, never>>; - limit: AmountJson; -}): VNode { +}: Props): VNode { const [isRawPayto, setIsRawPayto] = useState(false); const { state: credentials } = useBackendState(); const { api, config, url } = useBankCoreApiContext(); - const sendingToFixedAccount = toAccount !== undefined; + const sendingToFixedAccount = withAccount !== undefined; - const [account, setAccount] = useState<string | undefined>(toAccount); - const [subject, setSubject] = useState<string | undefined>(); - const [amount, setAmount] = useState<string | undefined>(); + const [account, setAccount] = useState<string | undefined>(withAccount); + const [subject, setSubject] = useState<string | undefined>(withSubject); + const [amount, setAmount] = useState<string | undefined>(withAmount); const [, updateBankState] = useBankState(); const [rawPaytoInput, rawPaytoInputSetter] = useState<string | undefined>( @@ -200,6 +212,7 @@ export function PaytoWireTransferForm({ updateBankState("currentChallenge", { operation: "create-transaction", id: String(resp.body.challenge_id), + location: routeHere.url({ account: account ?? "", amount, subject }), sent: AbsoluteTime.never(), request, }); diff --git a/packages/demobank-ui/src/pages/ProfileNavigation.tsx b/packages/demobank-ui/src/pages/ProfileNavigation.tsx index 7c52f4eaa..ba02d07b9 100644 --- a/packages/demobank-ui/src/pages/ProfileNavigation.tsx +++ b/packages/demobank-ui/src/pages/ProfileNavigation.tsx @@ -19,7 +19,7 @@ import { useBankCoreApiContext } from "../context/config.js"; import { useBackendState } from "../hooks/backend.js"; import { assertUnreachable } from "@gnu-taler/taler-util"; import { useNavigationContext } from "../context/navigation.js"; -import { RouteDefinition } from "../route.js"; +import { EmptyObject, RouteDefinition } from "../route.js"; export function ProfileNavigation({ current, @@ -29,10 +29,10 @@ export function ProfileNavigation({ routeMyAccountPassword, }: { current: "details" | "delete" | "credentials" | "cashouts", - routeMyAccountDetails: RouteDefinition<Record<string, never>>; - routeMyAccountDelete: RouteDefinition<Record<string, never>>; - routeMyAccountPassword: RouteDefinition<Record<string, never>>; - routeMyAccountCashout: RouteDefinition<Record<string, never>>; + routeMyAccountDetails: RouteDefinition; + routeMyAccountDelete: RouteDefinition; + routeMyAccountPassword: RouteDefinition; + routeMyAccountCashout: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const { config } = useBankCoreApiContext(); diff --git a/packages/demobank-ui/src/pages/RegistrationPage.tsx b/packages/demobank-ui/src/pages/RegistrationPage.tsx index 29e71413c..87e284411 100644 --- a/packages/demobank-ui/src/pages/RegistrationPage.tsx +++ b/packages/demobank-ui/src/pages/RegistrationPage.tsx @@ -30,7 +30,7 @@ import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { useBankCoreApiContext } from "../context/config.js"; import { useSettingsContext } from "../context/settings.js"; -import { RouteDefinition } from "../route.js"; +import { EmptyObject, RouteDefinition } from "../route.js"; import { undefinedIfEmpty } from "../utils.js"; import { getRandomPassword, getRandomUsername } from "./rnd.js"; @@ -39,7 +39,7 @@ export function RegistrationPage({ routeCancel, }: { onRegistrationSuccesful: (user: string, password: string) => void; - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const { config } = useBankCoreApiContext(); @@ -68,7 +68,7 @@ function RegistrationForm({ routeCancel, }: { onRegistrationSuccesful: (user: string, password: string) => void; - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; }): VNode { const [username, setUsername] = useState<string | undefined>(); const [name, setName] = useState<string | undefined>(); diff --git a/packages/demobank-ui/src/pages/SolveChallengePage.tsx b/packages/demobank-ui/src/pages/SolveChallengePage.tsx index 5ac622795..b7fc82a94 100644 --- a/packages/demobank-ui/src/pages/SolveChallengePage.tsx +++ b/packages/demobank-ui/src/pages/SolveChallengePage.tsx @@ -46,13 +46,14 @@ import { RouteDefinition } from "../route.js"; import { undefinedIfEmpty } from "../utils.js"; import { RenderAmount } from "./PaytoWireTransferForm.js"; import { OperationNotFound } from "./WithdrawalQRCode.js"; +import { useNavigationContext } from "../context/navigation.js"; export function SolveChallengePage({ onChallengeCompleted, routeClose, }: { onChallengeCompleted: () => void; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; }): VNode { const { api } = useBankCoreApiContext(); const { i18n } = useTranslationContext(); @@ -61,6 +62,7 @@ export function SolveChallengePage({ const [notification, notify, handleError] = useLocalNotification(); const { state } = useBackendState(); const creds = state.status !== "loggedIn" ? undefined : state; + const { navigateTo } = useNavigationContext(); if (!bankState.currentChallenge) { return ( @@ -209,6 +211,7 @@ export function SolveChallengePage({ updateBankState("currentChallenge", { operation: ch.operation, id: String(resp.body.challenge_id), + location: ch.location, sent: AbsoluteTime.never(), request: ch.request, }); @@ -262,7 +265,7 @@ export function SolveChallengePage({ onStart={startChallenge} onCancel={() => { updateBankState("currentChallenge", undefined); - onChallengeCompleted(); + navigateTo(ch.location) }} /> {ch.info && ( @@ -304,7 +307,7 @@ export function SolveChallengePage({ </div> </div> <div class="flex items-center justify-between border-gray-900/10 px-4 py-4 "> - <div /> + <div /> <button type="submit" name="confirm" @@ -344,7 +347,7 @@ function ChallengeDetails({ if (firstTime) { onStart() } - },[]) + }, []) return ( <div class="px-4 mt-4 "> <div class="w-full"> diff --git a/packages/demobank-ui/src/pages/WalletWithdrawForm.tsx b/packages/demobank-ui/src/pages/WalletWithdrawForm.tsx index ecb3eb4fc..078f4e5f5 100644 --- a/packages/demobank-ui/src/pages/WalletWithdrawForm.tsx +++ b/packages/demobank-ui/src/pages/WalletWithdrawForm.tsx @@ -54,7 +54,7 @@ function OldWithdrawalForm({ focus?: boolean; routeOperationDetails: RouteDefinition<{ wopid: string }>, onOperationCreated: (wopid: string) => void; - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const [settings] = usePreferences(); @@ -300,7 +300,7 @@ export function WalletWithdrawForm({ onAuthorizationRequired: () => void; onOperationCreated: (wopid: string) => void; onOperationAborted: () => void; - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const [settings, updateSettings] = usePreferences(); @@ -355,6 +355,7 @@ export function WalletWithdrawForm({ currency={limit.currency} onAuthorizationRequired={onAuthorizationRequired} routeClose={routeCancel} + routeHere={routeOperationDetails} onAbort={onOperationAborted} // route={routeCancel} /> diff --git a/packages/demobank-ui/src/pages/WireTransfer.tsx b/packages/demobank-ui/src/pages/WireTransfer.tsx index 190afd66e..927968304 100644 --- a/packages/demobank-ui/src/pages/WireTransfer.tsx +++ b/packages/demobank-ui/src/pages/WireTransfer.tsx @@ -34,13 +34,23 @@ import { RouteDefinition } from "../route.js"; export function WireTransfer({ toAccount, + withSubject, + withAmount, onAuthorizationRequired, routeCancel, + routeHere, onSuccess, }: { onSuccess?: () => void; + routeHere: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }>; toAccount?: string; - routeCancel?: RouteDefinition<Record<string, never>>; + withSubject?: string, + withAmount?: string, + routeCancel?: RouteDefinition; onAuthorizationRequired: () => void; }): VNode { const { i18n } = useTranslationContext(); @@ -77,7 +87,10 @@ export function WireTransfer({ return ( <PaytoWireTransferForm title={i18n.str`Make a wire transfer`} - toAccount={toAccount} + withAccount={toAccount} + withAmount={withAmount} + withSubject={withSubject} + routeHere={routeHere} limit={limit} onAuthorizationRequired={onAuthorizationRequired} onSuccess={() => { diff --git a/packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx index e4631fcc8..39b94b349 100644 --- a/packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx +++ b/packages/demobank-ui/src/pages/WithdrawalConfirmationQuestion.tsx @@ -39,12 +39,14 @@ import { useBankCoreApiContext } from "../context/config.js"; import { useBackendState } from "../hooks/backend.js"; import { useBankState } from "../hooks/bank-state.js"; import { usePreferences } from "../hooks/preferences.js"; +import { RouteDefinition } from "../route.js"; import { LoginForm } from "./LoginForm.js"; import { RenderAmount } from "./PaytoWireTransferForm.js"; interface Props { onAborted: () => void; withdrawUri: WithdrawUriResult; + routeHere: RouteDefinition<{ wopid: string }>; details: { account: PaytoUri; reserve: string; @@ -61,6 +63,7 @@ export function WithdrawalConfirmationQuestion({ onAborted, details, onAuthorizationRequired, + routeHere, withdrawUri, }: Props): VNode { const { i18n } = useTranslationContext(); @@ -126,6 +129,7 @@ export function WithdrawalConfirmationQuestion({ updateBankState("currentChallenge", { operation: "confirm-withdrawal", id: String(resp.body.challenge_id), + location: routeHere.url({ wopid: withdrawUri.withdrawalOperationId }), sent: AbsoluteTime.never(), request: withdrawUri.withdrawalOperationId, }); diff --git a/packages/demobank-ui/src/pages/WithdrawalOperationPage.tsx b/packages/demobank-ui/src/pages/WithdrawalOperationPage.tsx index 87999a722..7075c34c6 100644 --- a/packages/demobank-ui/src/pages/WithdrawalOperationPage.tsx +++ b/packages/demobank-ui/src/pages/WithdrawalOperationPage.tsx @@ -27,12 +27,14 @@ export function WithdrawalOperationPage({ onAuthorizationRequired, onOperationAborted, routeClose, + routeWithdrawalDetails, }: { onAuthorizationRequired: () => void; operationId: string; purpose: "after-creation" | "after-confirmation", onOperationAborted: () => void; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; + routeWithdrawalDetails: RouteDefinition<{ wopid: string }>; }): VNode { const { api } = useBankCoreApiContext(); const uri = stringifyWithdrawUri({ @@ -57,6 +59,7 @@ export function WithdrawalOperationPage({ return ( <WithdrawalQRCode withdrawUri={parsedUri} + routeWithdrawalDetails={routeWithdrawalDetails} onAuthorizationRequired={onAuthorizationRequired} onOperationAborted={() => { updateBankState("currentWithdrawalOperationId", undefined); diff --git a/packages/demobank-ui/src/pages/WithdrawalQRCode.tsx b/packages/demobank-ui/src/pages/WithdrawalQRCode.tsx index e6323631c..b128bd99f 100644 --- a/packages/demobank-ui/src/pages/WithdrawalQRCode.tsx +++ b/packages/demobank-ui/src/pages/WithdrawalQRCode.tsx @@ -38,7 +38,8 @@ import { WithdrawalConfirmationQuestion } from "./WithdrawalConfirmationQuestion interface Props { withdrawUri: WithdrawUriResult; onOperationAborted: () => void; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; + routeWithdrawalDetails: RouteDefinition<{ wopid: string }>; onAuthorizationRequired: () => void; } /** @@ -50,6 +51,7 @@ export function WithdrawalQRCode({ withdrawUri, onOperationAborted, routeClose, + routeWithdrawalDetails, onAuthorizationRequired, }: Props): VNode { const { i18n } = useTranslationContext(); @@ -232,6 +234,7 @@ export function WithdrawalQRCode({ return ( <WithdrawalConfirmationQuestion withdrawUri={withdrawUri} + routeHere={routeWithdrawalDetails} details={{ username: data.username, account, @@ -250,7 +253,7 @@ export function WithdrawalQRCode({ export function OperationNotFound({ routeClose, }: { - routeClose: RouteDefinition<Record<string, never>> | undefined; + routeClose: RouteDefinition | undefined; }): VNode { const { i18n } = useTranslationContext(); return ( diff --git a/packages/demobank-ui/src/pages/account/CashoutListForAccount.tsx b/packages/demobank-ui/src/pages/account/CashoutListForAccount.tsx index 656c2a52a..14f4acdb8 100644 --- a/packages/demobank-ui/src/pages/account/CashoutListForAccount.tsx +++ b/packages/demobank-ui/src/pages/account/CashoutListForAccount.tsx @@ -23,18 +23,20 @@ import { RouteDefinition } from "../../route.js"; interface Props { account: string; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; onAuthorizationRequired: () => void; routeCashoutDetails: RouteDefinition<{ cid: string }>; - routeMyAccountDetails: RouteDefinition<Record<string, never>>; - routeMyAccountDelete: RouteDefinition<Record<string, never>>; - routeMyAccountPassword: RouteDefinition<Record<string, never>>; - routeMyAccountCashout: RouteDefinition<Record<string, never>>; + routeMyAccountDetails: RouteDefinition; + routeMyAccountDelete: RouteDefinition; + routeMyAccountPassword: RouteDefinition; + routeMyAccountCashout: RouteDefinition; + routeCreateCashout: RouteDefinition; } export function CashoutListForAccount({ account, onAuthorizationRequired, + routeCreateCashout, routeCashoutDetails, routeMyAccountCashout, routeMyAccountDelete, @@ -68,6 +70,7 @@ export function CashoutListForAccount({ <CreateCashout focus + routeHere={routeCreateCashout} routeClose={routeClose} onAuthorizationRequired={onAuthorizationRequired} account={account} diff --git a/packages/demobank-ui/src/pages/account/ShowAccountDetails.tsx b/packages/demobank-ui/src/pages/account/ShowAccountDetails.tsx index 8cd758c75..db76e83d9 100644 --- a/packages/demobank-ui/src/pages/account/ShowAccountDetails.tsx +++ b/packages/demobank-ui/src/pages/account/ShowAccountDetails.tsx @@ -49,13 +49,15 @@ export function ShowAccountDetails({ routeMyAccountCashout, routeMyAccountDelete, routeMyAccountDetails, + routeHere, routeMyAccountPassword, }: { - routeClose: RouteDefinition<Record<string, never>>; - routeMyAccountDetails: RouteDefinition<Record<string, never>>; - routeMyAccountDelete: RouteDefinition<Record<string, never>>; - routeMyAccountPassword: RouteDefinition<Record<string, never>>; - routeMyAccountCashout: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; + routeHere: RouteDefinition<{ account: string }>; + routeMyAccountDetails: RouteDefinition; + routeMyAccountDelete: RouteDefinition; + routeMyAccountPassword: RouteDefinition; + routeMyAccountCashout: RouteDefinition; onUpdateSuccess: () => void; onAuthorizationRequired: () => void; account: string; @@ -154,6 +156,7 @@ export function ShowAccountDetails({ updateBankState("currentChallenge", { operation: "update-account", id: String(resp.body.challenge_id), + location: routeHere.url({ account }), sent: AbsoluteTime.never(), request: submitAccount, }); diff --git a/packages/demobank-ui/src/pages/account/UpdateAccountPassword.tsx b/packages/demobank-ui/src/pages/account/UpdateAccountPassword.tsx index d15420b84..dfa0adf17 100644 --- a/packages/demobank-ui/src/pages/account/UpdateAccountPassword.tsx +++ b/packages/demobank-ui/src/pages/account/UpdateAccountPassword.tsx @@ -46,12 +46,14 @@ export function UpdateAccountPassword({ routeMyAccountDetails, routeMyAccountPassword, focus, + routeHere, }: { - routeClose: RouteDefinition<Record<string, never>>; - routeMyAccountDetails: RouteDefinition<Record<string, never>>; - routeMyAccountDelete: RouteDefinition<Record<string, never>>; - routeMyAccountPassword: RouteDefinition<Record<string, never>>; - routeMyAccountCashout: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; + routeHere: RouteDefinition<{ account: string }>; + routeMyAccountDetails: RouteDefinition; + routeMyAccountDelete: RouteDefinition; + routeMyAccountPassword: RouteDefinition; + routeMyAccountCashout: RouteDefinition; focus?: boolean; onAuthorizationRequired: () => void; onUpdateSuccess: () => void; @@ -128,6 +130,7 @@ export function UpdateAccountPassword({ updateBankState("currentChallenge", { operation: "update-password", id: String(resp.body.challenge_id), + location: routeHere.url({ account: accountName }), sent: AbsoluteTime.never(), request, }); @@ -172,7 +175,7 @@ export function UpdateAccountPassword({ > <div class="px-4 py-6 sm:p-8"> <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6"> - {accountIsTheCurrentUser ? ( + {accountIsTheCurrentUser ? ( <div class="sm:col-span-5"> <label class="block text-sm font-medium leading-6 text-gray-900" @@ -205,7 +208,7 @@ export function UpdateAccountPassword({ </p> </div> ) : undefined} - + <div class="sm:col-span-5"> <label class="block text-sm font-medium leading-6 text-gray-900" diff --git a/packages/demobank-ui/src/pages/admin/AccountList.tsx b/packages/demobank-ui/src/pages/admin/AccountList.tsx index 36e417171..d8c129507 100644 --- a/packages/demobank-ui/src/pages/admin/AccountList.tsx +++ b/packages/demobank-ui/src/pages/admin/AccountList.tsx @@ -28,7 +28,7 @@ import { RenderAmount } from "../PaytoWireTransferForm.js"; import { RouteDefinition } from "../../route.js"; interface Props { - routeCreate: RouteDefinition<Record<string, never>>; + routeCreate: RouteDefinition; routeShowAccount: RouteDefinition<{ account: string }>; routeRemoveAccount: RouteDefinition<{ account: string }>; diff --git a/packages/demobank-ui/src/pages/admin/AdminHome.tsx b/packages/demobank-ui/src/pages/admin/AdminHome.tsx index 1803f1b9c..4695d35cf 100644 --- a/packages/demobank-ui/src/pages/admin/AdminHome.tsx +++ b/packages/demobank-ui/src/pages/admin/AdminHome.tsx @@ -50,9 +50,13 @@ import { AccountList } from "./AccountList.js"; * Query account information and show QR code if there is pending withdrawal */ interface Props { - routeCreate: RouteDefinition<Record<string, never>>; - routeDownloadStats: RouteDefinition<Record<string, never>>; - routeCreateWireTransfer: RouteDefinition<{ destination: string }>; + routeCreate: RouteDefinition; + routeDownloadStats: RouteDefinition; + routeCreateWireTransfer: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }>; routeShowAccount: RouteDefinition<{ account: string }>; routeRemoveAccount: RouteDefinition<{ account: string }>; @@ -73,7 +77,7 @@ export function AdminHome({ return ( <Fragment> <Metrics routeDownloadStats={routeDownloadStats} /> - <WireTransfer onAuthorizationRequired={onAuthorizationRequired} /> + <WireTransfer routeHere={routeCreateWireTransfer} onAuthorizationRequired={onAuthorizationRequired} /> <Transactions account="admin" @@ -149,7 +153,7 @@ export function getTimeframesForDate( function Metrics({ routeDownloadStats, }: { - routeDownloadStats: RouteDefinition<Record<string, never>>; + routeDownloadStats: RouteDefinition; }): VNode { const { i18n, dateLocale } = useTranslationContext(); const [metricType, setMetricType] = @@ -351,7 +355,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"> @@ -428,9 +432,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/demobank-ui/src/pages/admin/CreateNewAccount.tsx b/packages/demobank-ui/src/pages/admin/CreateNewAccount.tsx index 6b4307417..8e353b5e7 100644 --- a/packages/demobank-ui/src/pages/admin/CreateNewAccount.tsx +++ b/packages/demobank-ui/src/pages/admin/CreateNewAccount.tsx @@ -38,7 +38,7 @@ export function CreateNewAccount({ routeCancel, onCreateSuccess, }: { - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; onCreateSuccess: () => void; }): VNode { const { i18n } = useTranslationContext(); diff --git a/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx b/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx index 7fc5961cb..6f02eae8f 100644 --- a/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx +++ b/packages/demobank-ui/src/pages/admin/RemoveAccount.tsx @@ -49,10 +49,12 @@ export function RemoveAccount({ onUpdateSuccess, onAuthorizationRequired, focus, + routeHere, }: { focus?: boolean; + routeHere: RouteDefinition<{ account: string }>; onAuthorizationRequired: () => void; - routeCancel: RouteDefinition<Record<string, never>>; + routeCancel: RouteDefinition; onUpdateSuccess: () => void; account: string; }): VNode { @@ -152,6 +154,7 @@ export function RemoveAccount({ operation: "delete-account", id: String(resp.body.challenge_id), sent: AbsoluteTime.never(), + location: routeHere.url({ account }), request: account, }); return onAuthorizationRequired(); diff --git a/packages/demobank-ui/src/pages/business/CreateCashout.tsx b/packages/demobank-ui/src/pages/business/CreateCashout.tsx index 8dcdf5296..1b51e3222 100644 --- a/packages/demobank-ui/src/pages/business/CreateCashout.tsx +++ b/packages/demobank-ui/src/pages/business/CreateCashout.tsx @@ -55,7 +55,8 @@ interface Props { account: string; focus?: boolean; onAuthorizationRequired: () => void; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; + routeHere: RouteDefinition; } type FormType = { @@ -72,6 +73,7 @@ export function CreateCashout({ account: accountName, onAuthorizationRequired, focus, + routeHere, routeClose, }: Props): VNode { const { i18n } = useTranslationContext(); @@ -258,6 +260,7 @@ export function CreateCashout({ operation: "create-cashout", id: String(resp.body.challenge_id), sent: AbsoluteTime.never(), + location: routeHere.url({}), request, }); return onAuthorizationRequired(); diff --git a/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx b/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx index d841ae319..f4b2130a9 100644 --- a/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx +++ b/packages/demobank-ui/src/pages/business/ShowCashoutDetails.tsx @@ -33,7 +33,7 @@ import { RenderAmount } from "../PaytoWireTransferForm.js"; interface Props { id: string; - routeClose: RouteDefinition<Record<string, never>>; + routeClose: RouteDefinition; } export function ShowCashoutDetails({ id, routeClose }: Props): VNode { const { i18n, dateLocale } = useTranslationContext(); |