taler-typescript-core

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

commit f074734752fbf2b853a6b067ea5b267d1838fef5
parent f9b69342f8eb457f708fcdd9c280ed8608a481e7
Author: Sebastian <sebasjm@taler-systems.com>
Date:   Mon,  9 Feb 2026 12:24:59 -0300

fix #11016

Diffstat:
Mpackages/merchant-backoffice-ui/src/paths/newAccount/index.tsx | 43++++++++++++++++++++++++++++++++++++++++---
1 file changed, 40 insertions(+), 3 deletions(-)

diff --git a/packages/merchant-backoffice-ui/src/paths/newAccount/index.tsx b/packages/merchant-backoffice-ui/src/paths/newAccount/index.tsx @@ -16,6 +16,11 @@ import { assertUnreachable, + buildCodecForObject, + Codec, + codecForBoolean, + codecForString, + codecOptional, Duration, HttpStatusCode, InstanceConfigurationMessage, @@ -23,11 +28,13 @@ import { TanChannel, } from "@gnu-taler/taler-util"; import { + buildStorageKey, ButtonBetterBulma, LocalNotificationBannerBulma, undefinedIfEmpty, useChallengeHandler, useLocalNotificationBetter, + useLocalStorage, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; @@ -68,11 +75,28 @@ interface Props { onCancel: () => void; onCreated: () => void; } + +export const codecForNewAccount = (): Codec<Partial<Account>> => + buildCodecForObject<Partial<Account>>() + .property("id", codecOptional(codecForString())) + .property("name", codecOptional(codecForString())) + .property("email", codecOptional(codecForString())) + .property("phone", codecOptional(codecForString())) + .property("tos", codecOptional(codecForBoolean())) + .build("AccountForm"); + +const NEWACCOUNT_STATE_KEY = buildStorageKey( + `merchant-newaccount`, + codecForNewAccount(), +); + export function NewAccount({ onCancel, onCreated }: Props): VNode { const { i18n } = useTranslationContext(); - const { state: session, lib, logIn, config } = useSessionContext(); + const { lib, logIn, config } = useSessionContext(); + + const { value: savedForm, update: saveForm } = useLocalStorage(NEWACCOUNT_STATE_KEY, {}); - const [value, setValue] = useState<Partial<Account>>({}); + const [value, setValue] = useState<Partial<Account>>(savedForm); const serverRequiresEmail = config.mandatory_tan_channels?.indexOf(TanChannel.EMAIL) !== -1; @@ -123,6 +147,15 @@ export function NewAccount({ onCancel, onCreated }: Props): VNode { tos: next.tos ?? false, }; setValue(v); + + const saved: Partial<Account> = { + id: next.id, + name: next.name, + email: next.email, + phone: next.phone, + tos: next.tos, + }; + saveForm(saved) } const [notification, safeFunctionHandler] = useLocalNotificationBetter(); @@ -161,6 +194,7 @@ export function NewAccount({ onCancel, onCreated }: Props): VNode { if (success) { logIn(req.id, success.access_token); } + saveForm({}) onCreated(); }; create.onFail = (fail) => { @@ -277,7 +311,10 @@ export function NewAccount({ onCancel, onCreated }: Props): VNode { borderTop: 0, }} > - <button class="button" type="button" onClick={onCancel}> + <button class="button" type="button" onClick={() => { + saveForm({}) + onCancel() + }}> <i18n.Translate>Cancel</i18n.Translate> </button> <ButtonBetterBulma onClick={create} type="submit">