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:
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>