taler-typescript-core

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

commit 2c455f4c2d211b9832ea4c9f066da6e07cbe2654
parent fd453253756916dc8d81a38294b22920fd4e91a2
Author: Florian Dold <dold@taler.net>
Date:   Tue,  3 Nov 2026 09:39:33 +0100

wallet-webui: link to purchases from payment transaction details

Diffstat:
Mpackages/wallet-webui/src/routes/transaction-model.ts | 7+++++++
Mpackages/wallet-webui/src/screens/TransactionDetailScreen.tsx | 21+++++++++++++++++++++
2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/packages/wallet-webui/src/routes/transaction-model.ts b/packages/wallet-webui/src/routes/transaction-model.ts @@ -75,6 +75,7 @@ export interface TransactionDetailView extends TransactionHistoryView { label: string; }; peerShareUri?: string; + fulfillmentUrl?: string; order?: OrderSummaryView; } @@ -786,6 +787,11 @@ export function transactionDetailView( label: /* Translators: Bank-account authentication uses a small transfer from the specified account to prove control of it. KYC means identity verification. */ i18n.str`View authentication transfer`, }; } + const fulfillmentUrl = + transaction.type === TransactionType.Payment && + safeWebUrl(transaction.contractTerms?.fulfillment_url) + ? transaction.contractTerms.fulfillment_url + : undefined; const order = transaction.type === TransactionType.Payment && transaction.contractTerms ? orderSummaryView( @@ -889,6 +895,7 @@ export function transactionDetailView( ...(externalAction ? { externalAction } : {}), ...(continuationAction ? { continuationAction } : {}), ...(peerShareUri ? { peerShareUri } : {}), + ...(fulfillmentUrl ? { fulfillmentUrl } : {}), ...(order ? { order } : {}), }; } diff --git a/packages/wallet-webui/src/screens/TransactionDetailScreen.tsx b/packages/wallet-webui/src/screens/TransactionDetailScreen.tsx @@ -258,6 +258,27 @@ export function TransactionDetailScreen(props: { heading={i18n.str`Order details`} /> )} + {transaction.fulfillmentUrl && ( + <a + href={transaction.fulfillmentUrl} + target="_blank" + rel="noopener noreferrer" + class="inline-block rounded-full px-4 py-3 font-semibold text-primary underline hover:bg-secondaryContainer" + onClick={(event) => { + if ( + event.ctrlKey || + event.metaKey || + event.shiftKey || + event.altKey + ) + return; + event.preventDefault(); + props.onOpenExternal(transaction.fulfillmentUrl!); + }} + > + {i18n.str`Go to purchase`} + </a> + )} {props.paymentReview?.state === "loading" && ( <Card> <p role="status">{i18n.str`Loading payment details…`}</p>