taler-typescript-core

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

commit 8965ef07c3ca06e3c53060968352e9ca683013dd
parent 318d7ba24624b5840bb9a838ede520cca0e0aa27
Author: Sebastian <sebasjm@gmail.com>
Date:   Mon,  6 Jan 2025 19:56:39 -0300

handle unsupported payto://taler

Diffstat:
Mpackages/bank-ui/src/pages/OperationState/views.tsx | 4++++
Mpackages/bank-ui/src/pages/PaytoWireTransferForm.tsx | 18++++++++++++------
Mpackages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx | 4++++
Mpackages/kyc-ui/src/pages/TriggerKyc.tsx | 28++++++++++++++--------------
Mpackages/merchant-backoffice-ui/src/components/modal/index.tsx | 8+++++---
Mpackages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx | 3++-
Mpackages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx | 8+++++++-
Mpackages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx | 3+++
8 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/packages/bank-ui/src/pages/OperationState/views.tsx b/packages/bank-ui/src/pages/OperationState/views.tsx @@ -240,6 +240,10 @@ export function NeedConfirmationView({ ); } switch (details.account.targetType) { + case "taler": { + // FIXME: support wire transfer to wallet + return <div>not yet supported</div>; + } case "iban": { const name = details.account.params["receiver-name"]; return ( diff --git a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx @@ -166,11 +166,13 @@ export function PaytoWireTransferForm({ ? undefined : p.targetType === "iban" ? p.iban - : p.targetType === "bitcoin" - ? p.address - : p.targetType === "x-taler-bank" - ? p.account - : assertUnreachable(p); + : p.targetType === "taler" + ? undefined // FIXME: unsupported payto:// + : p.targetType === "bitcoin" + ? p.address + : p.targetType === "x-taler-bank" + ? p.account + : assertUnreachable(p); } else { if (!account || !subject) return; let payto; @@ -317,6 +319,10 @@ export function PaytoWireTransferForm({ onChange={() => { if (parsed && parsed.isKnown) { switch (parsed.targetType) { + case "taler": { + // FIXME: unsupported payto + break; + } case "iban": { setAccount(parsed.iban); break; @@ -543,7 +549,7 @@ export function PaytoWireTransferForm({ <b style={{ color: "red" }}> *</b> </label> <div class="mt-2"> - <textarea + <textarea type="textarea" rows={3} 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" diff --git a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx @@ -272,6 +272,10 @@ export function WithdrawalConfirmationQuestion({ ); } switch (details.account.targetType) { + case "taler": { + // FIXME: support wire transfer to wallet + return <div>not yet supported</div>; + } case "iban": { const name = details.account.params["receiver-name"]; diff --git a/packages/kyc-ui/src/pages/TriggerKyc.tsx b/packages/kyc-ui/src/pages/TriggerKyc.tsx @@ -74,7 +74,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { { id: ".amount" as UIHandlerId, type: "amount", - currency: config.currency, + currency: config.config.currency, label: i18n.str`Amount`, required: true, converterId: "Taler.Amount", @@ -113,7 +113,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { const [form, state] = useFormState<FormType>( shape, { - amount: Amounts.parseOrThrow(`${config.currency}:1000000`), + amount: Amounts.parseOrThrow(`${config.config.currency}:1000000`), }, (st) => { const partialErrors = undefinedIfEmpty<FormErrors<FormType>>({}); @@ -322,7 +322,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000000`), + Amounts.parseOrThrow(`${config.config.currency}:1000000`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -334,7 +334,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000010`), + Amounts.parseOrThrow(`${config.config.currency}:1000010`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -346,7 +346,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000020`), + Amounts.parseOrThrow(`${config.config.currency}:1000020`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -358,7 +358,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000030`), + Amounts.parseOrThrow(`${config.config.currency}:1000030`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -370,7 +370,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000040`), + Amounts.parseOrThrow(`${config.config.currency}:1000040`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -382,7 +382,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000050`), + Amounts.parseOrThrow(`${config.config.currency}:1000050`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -394,7 +394,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000060`), + Amounts.parseOrThrow(`${config.config.currency}:1000060`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -406,7 +406,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000070`), + Amounts.parseOrThrow(`${config.config.currency}:1000070`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -418,7 +418,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000080`), + Amounts.parseOrThrow(`${config.config.currency}:1000080`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -430,7 +430,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000090`), + Amounts.parseOrThrow(`${config.config.currency}:1000090`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -442,7 +442,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000100`), + Amounts.parseOrThrow(`${config.config.currency}:1000100`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" @@ -454,7 +454,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <Button type="submit" handler={triggerAmount( - Amounts.parseOrThrow(`${config.currency}:1000110`), + Amounts.parseOrThrow(`${config.config.currency}:1000110`), )} // disabled={!submitHandler} class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold 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" diff --git a/packages/merchant-backoffice-ui/src/components/modal/index.tsx b/packages/merchant-backoffice-ui/src/components/modal/index.tsx @@ -461,9 +461,11 @@ export function ValidBankAccount({ ? origin.targetPath : origin.targetType === "iban" ? origin.iban - : origin.targetType === "bitcoin" - ? `${origin.address.substring(0, 8)}...` - : origin.account; + : origin.targetType === "taler" + ? origin.reservePub + : origin.targetType === "bitcoin" + ? `${origin.address.substring(0, 8)}...` + : origin.account; return ( <ConfirmModal diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx @@ -107,12 +107,13 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { const emptyList: Record< PaytoType | "unknown", { parsed: PaytoUri; acc: Entity }[] - > = { bitcoin: [], "x-taler-bank": [], iban: [], unknown: [] }; + > = { bitcoin: [], "x-taler-bank": [], iban: [], taler: [], unknown: [] }; const accountsByType = accounts.reduce((prev, acc) => { const parsed = parsePaytoUri(acc.payto_uri); if (!parsed) return prev; //skip if ( parsed.targetType !== "bitcoin" && + parsed.targetType !== "taler" && parsed.targetType !== "x-taler-bank" && parsed.targetType !== "iban" ) { diff --git a/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx b/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx @@ -20,6 +20,7 @@ import { AmountString, parsePaytoUri, PaytoUriIBAN, + PaytoUriTaler, PaytoUriTalerBank, PaytoUriUnknown, segwitMinAmount, @@ -156,7 +157,7 @@ function IBANAccountInfoTable({ subject, }: { subject: string; - payto: PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank; + payto: PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank | PaytoUriTaler; }) { const { i18n } = useTranslationContext(); const api = useBackendContext(); @@ -195,6 +196,11 @@ function IBANAccountInfoTable({ ) : undefined} <Row name={i18n.str`IBAN`} value={payto.iban} /> </Fragment> + ) : payto.targetType === "taler" ? ( + <Fragment> + <Row name={i18n.str`Exchange`} value={payto.exchange} /> + <Row name={i18n.str`Reserve Pub`} value={payto.reservePub} /> + </Fragment> ) : undefined; const receiver = diff --git a/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx b/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx @@ -400,6 +400,9 @@ function describeAccount(paytoUri: string): string { case "iban": { return p.iban; } + case "taler": { + return p.reservePub; + } case "x-taler-bank": { return `${p.host}/${p.account}`; }