taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 13facb53b38a9434e217288e11a4f3a41a7e587c
parent fb5a6ea285bd03d05e4a99083d940452911ec6e7
Author: Sebastian <sebasjm@gmail.com>
Date:   Wed,  5 Nov 2025 12:06:43 -0300

fix #10543

Diffstat:
Mpackages/bank-ui/src/pages/LoginForm.tsx | 22++++++++++++++--------
Mpackages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx | 22+++++++++++++++++-----
Mpackages/bank-ui/src/pages/admin/CreateNewAccount.tsx | 2+-
Mpackages/bank-ui/src/pages/regional/ConversionConfig.tsx | 2+-
4 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/packages/bank-ui/src/pages/LoginForm.tsx b/packages/bank-ui/src/pages/LoginForm.tsx @@ -23,6 +23,7 @@ import { createRFC8959AccessTokenEncoded, } from "@gnu-taler/taler-util"; import { + Attention, ButtonBetter, LocalNotificationBanner, RouteDefinition, @@ -154,16 +155,20 @@ export function LoginForm({ /> ); } - + const onlyThisUser = fixedUser || session.state.status !== "loggedOut"; return ( <div class="flex min-h-full flex-col justify-center "> <LocalNotificationBanner notification={notification} /> - <div class="mt-10 sm:mx-auto sm:w-full sm:max-w-sm"> + <div class="sm:mx-auto sm:w-full sm:max-w-sm"> + {session.state.status !== "expired" ? undefined : ( + <Attention title={i18n.str`Session expired`} type="warning" /> + )} <form - class="space-y-6" + class="mt-10 space-y-6" noValidate onSubmit={(e) => { e.preventDefault(); + e.stopPropagation(); }} autoCapitalize="none" autoCorrect="off" @@ -177,13 +182,13 @@ export function LoginForm({ </label> <div class="mt-2"> <input - ref={doAutoFocus} + ref={onlyThisUser ? undefined : doAutoFocus} type="text" name="username" id="username" class="block w-full disabled:bg-gray-200 rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" value={username ?? ""} - disabled={fixedUser} + disabled={onlyThisUser} enterkeyhint="next" placeholder="identification" autocomplete="username" @@ -215,6 +220,7 @@ export function LoginForm({ name="password" id="password" autocomplete="current-password" + ref={!onlyThisUser ? undefined : doAutoFocus} class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6" enterkeyhint="send" value={password ?? ""} @@ -235,12 +241,12 @@ export function LoginForm({ {session.state.status !== "loggedOut" ? ( <div class="flex justify-between"> <ButtonBetter - type="submit" + type="button" name="cancel" class="rounded-md bg-white-600 px-3 py-1.5 text-sm font-semibold leading-6 text-black shadow-sm hover:bg-gray-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600" onClick={logout} > - <i18n.Translate>Cancel</i18n.Translate> + <i18n.Translate>Forget</i18n.Translate> </ButtonBetter> <ButtonBetter @@ -249,7 +255,7 @@ export function LoginForm({ class="rounded-md bg-indigo-600 disabled:bg-gray-300 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" onClick={login} > - <i18n.Translate>Check</i18n.Translate> + <i18n.Translate>Verify</i18n.Translate> </ButtonBetter> </div> ) : ( diff --git a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx @@ -31,7 +31,7 @@ import { useBankCoreApiContext, useChallengeHandler, useLocalNotificationBetter, - useTranslationContext + useTranslationContext, } from "@gnu-taler/web-util/browser"; import { ComponentChildren, Fragment, VNode, h } from "preact"; import { mutate } from "swr"; @@ -86,7 +86,7 @@ function useComponentState(opid: string) { }); const abort = safeFunctionHandler( - api.abortWithdrawalById, + api.abortWithdrawalById.bind(api), !creds ? undefined : [creds, opid], ); @@ -172,7 +172,7 @@ export function WithdrawalConfirmationQuestion({ </h3> <div class="mt-3 text-sm leading-6"> <ShouldBeSameUser username={details.username}> - <div class="grid grid-cols-1 gap-x-8 gap-y-8 pt-10 md:grid-cols-2 bg-gray-100 my-4 px-4 pb-4 rounded-lg"> + <div class="grid grid-cols-1 gap-x-8 gap-y-8 pt-4 md:grid-cols-2 bg-gray-100 my-4 px-4 pb-4 rounded-lg"> <form class="bg-white shadow-sm ring-1 ring-gray-900/5 sm:rounded-xl md:col-span-2" autoCapitalize="none" @@ -416,18 +416,30 @@ export function ShouldBeSameUser({ if (credentials.status === "loggedOut") { return ( <Fragment> - <Attention type="info" title={i18n.str`Authentication required`} /> + <Attention type="info" title={i18n.str`Authentication required`} ></Attention> <LoginForm currentUser={username} fixedUser /> </Fragment> ); } + if (credentials.status === "expired") { + return ( + <LoginForm currentUser={username} fixedUser /> + ); + } if (credentials.username !== username) { return ( <Fragment> <Attention type="warning" title={i18n.str`This operation was created with another username`} - /> + > + <p> + <i18n.Translate> + You are currently logged in with user "{credentials.username}" and + the operation was made with user "{username}" + </i18n.Translate> + </p> + </Attention> <LoginForm currentUser={username} fixedUser /> </Fragment> ); diff --git a/packages/bank-ui/src/pages/admin/CreateNewAccount.tsx b/packages/bank-ui/src/pages/admin/CreateNewAccount.tsx @@ -60,7 +60,7 @@ export function CreateNewAccount({ const [notification, safeFunctionHandler] = useLocalNotificationBetter(); const create = safeFunctionHandler( - api.createAccount, + api.createAccount.bind(api), !submitAccount || !token ? undefined : [token, submitAccount], ); create.onSuccess = (success, token, account) => { diff --git a/packages/bank-ui/src/pages/regional/ConversionConfig.tsx b/packages/bank-ui/src/pages/regional/ConversionConfig.tsx @@ -227,7 +227,7 @@ function useComponentState({ const cashoutCalc = calculationResult?.cashout; const update = safeFunctionHandler( - conversion.updateConversionRate, + conversion.updateConversionRate.bind(conversion), !creds || status.status === "fail" ? undefined : [creds.token, status.result.conv],