import { PaymentResult, PaymentSummary } from "./payment.js"; //#region src/plus/piPaymentOld/sdk/contracts/interaction.d.ts /** 可本地化文案的描述;由 UI 根据 key 和参数翻译。 */ interface PaymentMessageDescriptor { key: string; params?: Record; fallback?: string; } /** UI 文案既可引用本地化 key,也可安全透传厂商返回的原文。 */ type PaymentDisplayText = { kind: 'message'; message: PaymentMessageDescriptor; } | { kind: 'literal'; text: string; source: 'provider' | 'backend' | 'device'; }; /** SDK 归一化后的错误模型:诊断信息供日志,展示文案供 UI。 */ interface PaymentError { code: string | number; diagnosticMessage: string; displayMessage?: PaymentDisplayText; displayTitle?: PaymentDisplayText; displayDetail?: PaymentDisplayText; payment?: PaymentSummary; failureKind?: 'normal' | 'unknown' | 'timeout' | 'cancelled'; manualMarkable?: boolean; retryable?: boolean; printTimeoutable?: boolean; networkError?: boolean; raw?: unknown; } /** 动态交互动作;payload 由对应 Provider 定义并在提交时原样带回。 */ interface PaymentAction { id: string; type: string; label?: PaymentDisplayText; payload?: unknown; } /** 所有动态页面元素共有的稳定 key 与可选标签。 */ interface PaymentViewElementBase { key: string; label?: PaymentDisplayText; } /** Provider 下发给 UI 的中立渲染元素,避免 UI 依赖厂商协议。 */ type PaymentViewElement = (PaymentViewElementBase & { type: 'button'; variant?: 'primary' | 'default' | 'danger'; visibleAt?: number; /** action 已提交并被 UI 锁定时替换按钮文案。 */ pendingLabel?: PaymentDisplayText; /** Provider 根据 Flow 交互状态生成的持久禁用态。 */ disabled?: boolean; /** 持久等待态是否在按钮上展示 loading。 */ loading?: boolean; /** 提交动作前由 UI 展示的通用二次确认。 */ confirmation?: { title: PaymentDisplayText; message: PaymentDisplayText; confirmLabel: PaymentDisplayText; cancelLabel: PaymentDisplayText; confirmDanger?: boolean; }; action: PaymentAction; }) | (PaymentViewElementBase & { type: 'text'; text: PaymentDisplayText; tone?: 'normal' | 'warning' | 'danger'; }) | (PaymentViewElementBase & { type: 'step'; text: PaymentDisplayText; status: 'pending' | 'success' | 'failed'; /** pending 状态是否展示 loading;默认展示,provider 可按自身交互关闭。 */ showLoading?: boolean; }) | (PaymentViewElementBase & { type: 'image'; name?: string; data: string; encoding?: string; }) | (PaymentViewElementBase & { type: 'qrcode'; value: string; size?: number; title?: PaymentDisplayText; expiresAt?: number; /** 支持 `{time}` 占位符,由 UI 按剩余时间动态替换。 */ countdownText?: PaymentDisplayText; }) | (PaymentViewElementBase & { type: 'input'; name: string; value?: string; }); /** processing 页的完整动态渲染数据。 */ interface PaymentViewData { message?: PaymentDisplayText; variant?: 'loading' | 'warning' | 'error'; layouts: Array<{ layoutType: string; elements: PaymentViewElement[]; }>; details?: Record; detailsText?: PaymentDisplayText; } /** 签名确认阶段的数据和可提交动作。 */ interface PaymentSignatureData { message: PaymentDisplayText; merchantReceipt?: string | null; customerReceipt?: string | null; acceptAction?: PaymentAction; declineAction?: PaymentAction; } /** * Provider 已成功结算后仍需门店完成的本地复核。 * * 该协议只控制 UI 何时向宿主公布 success,不允许再向 Provider 提交 action, * 适用于 Adyen POS 这类“交易已成功、签名仅需人工核对”的场景。 */ interface PaymentPostSuccessReview { kind: 'signature'; title: PaymentDisplayText; message: PaymentDisplayText; acceptLabel: PaymentDisplayText; declineLabel: PaymentDisplayText; declineConfirmation: { title: PaymentDisplayText; message: PaymentDisplayText; confirmLabel: PaymentDisplayText; cancelLabel: PaymentDisplayText; }; } /** 不改变交易状态、但要求 UI 执行一次副作用的事件。 */ type PaymentEffectEvent = { type: 'effect'; effect: { type: 'print'; receipts: string[]; source: 'signature' | 'success' | 'failure'; }; } | { type: 'effect'; effect: { type: 'manualMark'; }; } | { type: 'effect'; effect: { type: 'printOnTimeout'; }; } | { type: 'effect'; effect: { type: 'postSuccessReview'; review: PaymentPostSuccessReview; }; }; /** Provider 原始报文诊断事件;仅供 UI 日志链路消费,不改变支付状态。 */ type PaymentDiagnosticEvent = { type: 'diagnostic'; level?: 'info' | 'error'; provider: string; name: string; payload: unknown; }; /** Flow 向 Session/UI 发送的完整事件联合;终态只有 success 或 failed。 */ type PaymentFlowEvent = PaymentEffectEvent | PaymentDiagnosticEvent | { type: 'processing'; data: PaymentViewData; payment?: PaymentSummary; } | { type: 'signature'; data: PaymentSignatureData; payment?: PaymentSummary; } | { type: 'success'; result: PaymentResult; } | { type: 'failed'; error: PaymentError; result?: PaymentResult; }; //#endregion export { PaymentAction, PaymentDisplayText, PaymentEffectEvent, PaymentError, PaymentFlowEvent, PaymentMessageDescriptor, PaymentSignatureData, PaymentViewData, PaymentViewElement };