From 73e36c99037cef1ccc43bb80b67b19e0f44326fd Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 23 Feb 2024 08:30:43 -0300 Subject: return to form after 2fa cancelled --- packages/demobank-ui/src/Routing.tsx | 92 ++++++++----------- .../src/components/Transactions/index.ts | 12 ++- .../src/components/Transactions/views.tsx | 4 +- packages/demobank-ui/src/context/navigation.ts | 3 +- packages/demobank-ui/src/hooks/bank-state.ts | 10 +++ .../demobank-ui/src/pages/AccountPage/index.ts | 42 ++++++--- .../demobank-ui/src/pages/AccountPage/views.tsx | 4 +- packages/demobank-ui/src/pages/BankFrame.tsx | 6 +- packages/demobank-ui/src/pages/DownloadStats.tsx | 4 +- packages/demobank-ui/src/pages/LoginForm.tsx | 4 +- .../demobank-ui/src/pages/OperationState/index.ts | 26 +++--- .../demobank-ui/src/pages/OperationState/state.ts | 8 +- .../demobank-ui/src/pages/OperationState/views.tsx | 5 +- packages/demobank-ui/src/pages/PaymentOptions.tsx | 13 ++- .../src/pages/PaytoWireTransferForm.tsx | 43 +++++---- .../demobank-ui/src/pages/ProfileNavigation.tsx | 10 +-- .../demobank-ui/src/pages/RegistrationPage.tsx | 6 +- .../demobank-ui/src/pages/SolveChallengePage.tsx | 11 ++- .../demobank-ui/src/pages/WalletWithdrawForm.tsx | 5 +- packages/demobank-ui/src/pages/WireTransfer.tsx | 17 +++- .../src/pages/WithdrawalConfirmationQuestion.tsx | 4 + .../src/pages/WithdrawalOperationPage.tsx | 5 +- .../demobank-ui/src/pages/WithdrawalQRCode.tsx | 7 +- .../src/pages/account/CashoutListForAccount.tsx | 13 +-- .../src/pages/account/ShowAccountDetails.tsx | 13 +-- .../src/pages/account/UpdateAccountPassword.tsx | 17 ++-- .../demobank-ui/src/pages/admin/AccountList.tsx | 2 +- packages/demobank-ui/src/pages/admin/AdminHome.tsx | 22 +++-- .../src/pages/admin/CreateNewAccount.tsx | 2 +- .../demobank-ui/src/pages/admin/RemoveAccount.tsx | 5 +- .../src/pages/business/CreateCashout.tsx | 5 +- .../src/pages/business/ShowCashoutDetails.tsx | 2 +- packages/demobank-ui/src/route.ts | 100 ++++++++++++++------- 33 files changed, 324 insertions(+), 198 deletions(-) (limited to 'packages/demobank-ui/src') diff --git a/packages/demobank-ui/src/Routing.tsx b/packages/demobank-ui/src/Routing.tsx index 096b6039b..14df5a274 100644 --- a/packages/demobank-ui/src/Routing.tsx +++ b/packages/demobank-ui/src/Routing.tsx @@ -47,7 +47,7 @@ import { CreateNewAccount } from "./pages/admin/CreateNewAccount.js"; import { RemoveAccount } from "./pages/admin/RemoveAccount.js"; import { CreateCashout } from "./pages/business/CreateCashout.js"; import { ShowCashoutDetails } from "./pages/business/ShowCashoutDetails.js"; -import { RouteParamsType, urlPattern, useCurrentLocation } from "./route.js"; +import { urlPattern, useCurrentLocation } from "./route.js"; import { useNavigationContext } from "./context/navigation.js"; import { useEffect } from "preact/hooks"; @@ -155,14 +155,10 @@ function PublicRounting({ return ; } case "operationDetails": { - const { wopid } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; - return ( navigateTo(publicPages.login.url({}))} routeClose={publicPages.login} @@ -192,7 +188,7 @@ function PublicRounting({ ); } default: - assertUnreachable(location.name); + assertUnreachable(location); } } @@ -201,7 +197,11 @@ export const privatePages = { /\/account\/charge-wallet/, () => "#/account/charge-wallet", ), - homeWireTransfer: urlPattern( + homeWireTransfer: urlPattern<{ + account?: string, + subject?: string, + amount?: string, + }>( /\/account\/wire-transfer/, () => "#/account/wire-transfer", ), @@ -212,9 +212,13 @@ export const privatePages = { /\/cashout\/(?[a-zA-Z0-9]+)/, ({ cid }) => `#/cashout/${cid}`, ), - wireTranserCreate: urlPattern<{ destination: string }>( - /\/wire-transfer\/(?[a-zA-Z0-9]+)/, - ({ destination }) => `#/wire-transfer/${destination}`, + wireTranserCreate: urlPattern<{ + account?: string, + subject?: string, + amount?: string, + }>( + /\/wire-transfer\/(?[a-zA-Z0-9]+)/, + ({ account }) => `#/wire-transfer/${account}`, ), publicAccountList: urlPattern(/\/public-accounts/, () => "#/public-accounts"), statsDownload: urlPattern(/\/download-stats/, () => "#/download-stats"), @@ -273,14 +277,11 @@ function PrivateRouting({ switch (location.name) { case "operationDetails": { - const { wopid } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.home.url({}))} routeClose={privatePages.home} @@ -291,14 +292,11 @@ function PrivateRouting({ ); } case "startOperation": { - const { wopid } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.home.url({}))} routeClose={privatePages.home} @@ -331,14 +329,11 @@ function PrivateRouting({ ); } case "accountDetails": { - const { account } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.home.url({}))} + routeHere={privatePages.accountDetails} routeMyAccountCashout={privatePages.myAccountCashouts} routeMyAccountDelete={privatePages.myAccountDelete} routeMyAccountDetails={privatePages.myAccountDetails} @@ -351,14 +346,11 @@ function PrivateRouting({ ); } case "accountChangePassword": { - const { account } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.home.url({}))} routeMyAccountCashout={privatePages.myAccountCashouts} routeMyAccountDelete={privatePages.myAccountDelete} @@ -372,13 +364,10 @@ function PrivateRouting({ ); } case "accountDelete": { - const { account } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.home.url({}))} onAuthorizationRequired={() => navigateTo(privatePages.solveSecondFactor.url({})) @@ -388,13 +377,10 @@ function PrivateRouting({ ); } case "accountCashouts": { - const { account } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.home.url({}))} onAuthorizationRequired={() => navigateTo(privatePages.solveSecondFactor.url({})) @@ -423,6 +410,7 @@ function PrivateRouting({ return ( navigateTo(privatePages.home.url({}))} routeMyAccountCashout={privatePages.myAccountCashouts} routeMyAccountDelete={privatePages.myAccountDelete} @@ -440,6 +428,7 @@ function PrivateRouting({ navigateTo(privatePages.home.url({}))} routeMyAccountCashout={privatePages.myAccountCashouts} routeMyAccountDelete={privatePages.myAccountDelete} @@ -457,6 +446,7 @@ function PrivateRouting({ navigateTo(privatePages.solveSecondFactor.url({})) } @@ -518,25 +509,20 @@ function PrivateRouting({ ); } case "cashoutDetails": { - const { cid } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( ); } case "wireTranserCreate": { - const { destination } = location.values as RouteParamsType< - typeof location.parent, - typeof location.name - >; return ( navigateTo(privatePages.solveSecondFactor.url({})) } @@ -590,6 +576,6 @@ function PrivateRouting({ ); } default: - assertUnreachable(location.name); + assertUnreachable(location); } } diff --git a/packages/demobank-ui/src/components/Transactions/index.ts b/packages/demobank-ui/src/components/Transactions/index.ts index f4e799839..42b12ac65 100644 --- a/packages/demobank-ui/src/components/Transactions/index.ts +++ b/packages/demobank-ui/src/components/Transactions/index.ts @@ -23,7 +23,11 @@ import { RouteDefinition } from "../../route.js"; export interface Props { account: string; - routeCreateWireTransfer: RouteDefinition<{ destination: string }> | undefined; + routeCreateWireTransfer: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }> | undefined; } export type State = State.Loading | State.LoadingUriError | State.Ready; @@ -45,7 +49,11 @@ export namespace State { export interface Ready extends BaseInfo { status: "ready"; error: undefined; - routeCreateWireTransfer: RouteDefinition<{ destination: string }> | undefined; + routeCreateWireTransfer: RouteDefinition<{ + account?: string, + subject?: string, + amount?: string, + }> | undefined; transactions: Transaction[]; onPrev?: () => void; onNext?: () => void; diff --git a/packages/demobank-ui/src/components/Transactions/views.tsx b/packages/demobank-ui/src/components/Transactions/views.tsx index a1ec0fa00..321a6ff3a 100644 --- a/packages/demobank-ui/src/components/Transactions/views.tsx +++ b/packages/demobank-ui/src/components/Transactions/views.tsx @@ -154,7 +154,7 @@ export function ReadyView({ @@ -191,7 +191,7 @@ export function ReadyView({ diff --git a/packages/demobank-ui/src/context/navigation.ts b/packages/demobank-ui/src/context/navigation.ts index 27fdf4649..9552bf899 100644 --- a/packages/demobank-ui/src/context/navigation.ts +++ b/packages/demobank-ui/src/context/navigation.ts @@ -16,6 +16,7 @@ import { ComponentChildren, createContext, h, VNode } from "preact"; import { useContext, useEffect, useState } from "preact/hooks"; +import { AppLocation } from "../route.js"; /** * @@ -25,7 +26,7 @@ import { useContext, useEffect, useState } from "preact/hooks"; export type Type = { path: string; params: Record; - navigateTo: (path: string) => void; + navigateTo: (path: AppLocation) => void; // addNavigationListener: (listener: (path: string, params: Record) => void) => (() => void); }; diff --git a/packages/demobank-ui/src/hooks/bank-state.ts b/packages/demobank-ui/src/hooks/bank-state.ts index 87f7a49f0..15daf9180 100644 --- a/packages/demobank-ui/src/hooks/bank-state.ts +++ b/packages/demobank-ui/src/hooks/bank-state.ts @@ -28,6 +28,7 @@ import { codecOptional, } from "@gnu-taler/taler-util"; import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser"; +import { AppLocation } from "../route.js"; export type ChallengeInProgess = | DeleteAccountChallenge @@ -41,6 +42,7 @@ type BaseChallenge = { id: string; operation: OpType; sent: AbsoluteTime; + location: AppLocation; info?: TalerCorebankApi.TanTransmission; request: ReqType; }; @@ -68,6 +70,7 @@ const codecForChallengeUpdatePassword = (): Codec => buildCodecForObject() .property("operation", codecForConstString("update-password")) .property("id", codecForString()) + .property("location", codecForAppLocation()) .property("sent", codecForAbsoluteTime) .property("info", codecOptional(codecForTanTransmission())) .property("request", codecForAny()) @@ -77,6 +80,7 @@ const codecForChallengeDeleteAccount = (): Codec => buildCodecForObject() .property("operation", codecForConstString("delete-account")) .property("id", codecForString()) + .property("location", codecForAppLocation()) .property("sent", codecForAbsoluteTime) .property("request", codecForString()) .property("info", codecOptional(codecForTanTransmission())) @@ -86,6 +90,7 @@ const codecForChallengeUpdateAccount = (): Codec => buildCodecForObject() .property("operation", codecForConstString("update-account")) .property("id", codecForString()) + .property("location", codecForAppLocation()) .property("sent", codecForAbsoluteTime) .property("info", codecOptional(codecForTanTransmission())) .property("request", codecForAny()) @@ -96,6 +101,7 @@ const codecForChallengeCreateTransaction = buildCodecForObject() .property("operation", codecForConstString("create-transaction")) .property("id", codecForString()) + .property("location", codecForAppLocation()) .property("sent", codecForAbsoluteTime) .property("info", codecOptional(codecForTanTransmission())) .property("request", codecForAny()) @@ -106,15 +112,19 @@ const codecForChallengeConfirmWithdrawal = buildCodecForObject() .property("operation", codecForConstString("confirm-withdrawal")) .property("id", codecForString()) + .property("location", codecForAppLocation()) .property("sent", codecForAbsoluteTime) .property("info", codecOptional(codecForTanTransmission())) .property("request", codecForString()) .build("ConfirmWithdrawalChallenge"); +const codecForAppLocation = codecForString as () => Codec + const codecForChallengeCashout = (): Codec => buildCodecForObject() .property("operation", codecForConstString("create-cashout")) .property("id", codecForString()) + .property("location", codecForAppLocation()) .property("sent", codecForAbsoluteTime) .property("info", codecOptional(codecForTanTransmission())) .property("request", codecForAny()) 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>; - routeChargeWallet: RouteDefinition>; - routeWireTransfer: RouteDefinition>; - routePublicAccounts: RouteDefinition>; - 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>; + routeSolveSecondFactor: RouteDefinition; } export type State = @@ -73,13 +81,21 @@ export namespace State { onAuthorizationRequired: () => void; onOperationCreated: (wopid: string) => void; onClose: () => void; - routeClose: RouteDefinition>; - routeChargeWallet: RouteDefinition>; - routeWireTransfer: RouteDefinition>; - routePublicAccounts: RouteDefinition>; - 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>; + routeSolveSecondFactor: RouteDefinition; } export interface InvalidIban { @@ -90,7 +106,7 @@ export namespace State { export interface UserNotFound { status: "login"; reason: "not-found" | "forbidden"; - routeRegister?: RouteDefinition>; + 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>; + routePublicAccounts: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const [settings, updateSettings] = usePreferences(); @@ -63,7 +63,7 @@ function ShowDemoInfo({ routePublicAccounts }: { } function ShowPedingOperation({ routeSolveSecondFactor }: { - routeSolveSecondFactor: RouteDefinition>; + 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>; + routeAccountDetails?: RouteDefinition; children: ComponentChildren; }): VNode { const { i18n } = useTranslationContext(); @@ -179,7 +179,7 @@ export function BankFrame({ function WelcomeAccount({ account, routeAccountDetails }: { account: string, - routeAccountDetails: RouteDefinition>; + 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>; + 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>; + 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>; + 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>; + 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>; + routeClose: RouteDefinition; } export interface Confirmed { status: "confirmed"; error: undefined; - routeClose: RouteDefinition>; + 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 { 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> { +}: 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>; - routeChargeWallet: RouteDefinition>; - routeWireTransfer: RouteDefinition>; + 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({ 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>; - 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(toAccount); - const [subject, setSubject] = useState(); - const [amount, setAmount] = useState(); + const [account, setAccount] = useState(withAccount); + const [subject, setSubject] = useState(withSubject); + const [amount, setAmount] = useState(withAmount); const [, updateBankState] = useBankState(); const [rawPaytoInput, rawPaytoInputSetter] = useState( @@ -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>; - routeMyAccountDelete: RouteDefinition>; - routeMyAccountPassword: RouteDefinition>; - routeMyAccountCashout: RouteDefinition>; + 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>; + routeCancel: RouteDefinition; }): VNode { const { i18n } = useTranslationContext(); const { config } = useBankCoreApiContext(); @@ -68,7 +68,7 @@ function RegistrationForm({ routeCancel, }: { onRegistrationSuccesful: (user: string, password: string) => void; - routeCancel: RouteDefinition>; + routeCancel: RouteDefinition; }): VNode { const [username, setUsername] = useState(); const [name, setName] = useState(); 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>; + 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({
-
+