From d5dd478510872cc7711221887dda743a3cb897dd Mon Sep 17 00:00:00 2001 From: Aaron Schubert Date: Tue, 11 Aug 2026 13:35:31 +0100 Subject: [PATCH] feat(point-of-sale): add paymentmethodselected intercept types Assisted-By: devx/815595f2-0ce0-49e1-87fc-903983c87fa6 --- .changeset/pos-intercept-payment-method.md | 5 +++ .../src/surfaces/point-of-sale/events.ts | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 .changeset/pos-intercept-payment-method.md diff --git a/.changeset/pos-intercept-payment-method.md b/.changeset/pos-intercept-payment-method.md new file mode 100644 index 0000000000..cd56071139 --- /dev/null +++ b/.changeset/pos-intercept-payment-method.md @@ -0,0 +1,5 @@ +--- +'@shopify/ui-extensions': minor +--- + +Add `paymentmethodselected` intercept types for POS payment blocking workflows. diff --git a/packages/ui-extensions/src/surfaces/point-of-sale/events.ts b/packages/ui-extensions/src/surfaces/point-of-sale/events.ts index 85894cc601..6681289ec0 100644 --- a/packages/ui-extensions/src/surfaces/point-of-sale/events.ts +++ b/packages/ui-extensions/src/surfaces/point-of-sale/events.ts @@ -4,6 +4,7 @@ import type { CashTrackingSessionCompleteEvent, } from './events/cash-tracking-session-events'; import type {Cart} from './types/cart'; +import type {MoneyV2} from './types/money'; /** * Canonical event-name constants for POS host events. Prefer these over string @@ -25,6 +26,7 @@ export const POS_EVENT_NAMES = { */ export const POS_INTERCEPT_NAMES = { BEFORE_CHECKOUT: 'beforecheckout', + PAYMENT_METHOD_SELECTED: 'paymentmethodselected', } as const; /** @@ -56,6 +58,7 @@ export interface ShopifyEventMap { */ export interface ShopifyInterceptMap { [POS_INTERCEPT_NAMES.BEFORE_CHECKOUT]: BeforeCheckoutEvent; + [POS_INTERCEPT_NAMES.PAYMENT_METHOD_SELECTED]: PaymentMethodSelectedEvent; } /** @@ -69,6 +72,44 @@ export interface BeforeCheckoutEvent extends Event { readonly cart: Cart; } +/** + * The kind of payment method being attempted. + * + * @private + */ +export type InterceptedPaymentMethodType = 'cash'; + +/** + * Identifies the payment method being attempted. + * + * `type` alone identifies singleton methods (for example `cash`). `identifier` + * disambiguates method types a shop can have several of (for example custom + * payment methods) as they become interceptable. + * + * @private + */ +export interface InterceptedPaymentMethod { + readonly type: InterceptedPaymentMethodType; + + /** Present when `type` alone is ambiguous. Matching is exact on the pair. */ + readonly identifier?: string; +} + +/** + * Dispatched when staff selects a payment method on the payments screen. + * + * @private + */ +export interface PaymentMethodSelectedEvent extends Event { + readonly type: typeof POS_INTERCEPT_NAMES.PAYMENT_METHOD_SELECTED; + + /** The payment method staff selected. */ + readonly paymentMethod: InterceptedPaymentMethod; + + /** The amount this tender would charge, in presentment currency. */ + readonly amount: MoneyV2; +} + /** @private */ export type ShopifyInterceptor = ( event: TEvent,