@spare-technologies/spare-link 0.1.0-beta.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +119 -81
- package/lib/commonjs/core/models/payment-return-params.js +245 -20
- package/lib/commonjs/core/models/payment-return-params.js.map +1 -1
- package/lib/commonjs/core/models/pending-session-record.js +2 -0
- package/lib/commonjs/core/models/pending-session-record.js.map +1 -0
- package/lib/commonjs/core/services/hosted-flow-controller.js +333 -0
- package/lib/commonjs/core/services/hosted-flow-controller.js.map +1 -0
- package/lib/commonjs/core/services/hosted-flow-state.js +96 -0
- package/lib/commonjs/core/services/hosted-flow-state.js.map +1 -0
- package/lib/commonjs/index.js +42 -164
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/internal/hosted/bridge-message.js +107 -0
- package/lib/commonjs/internal/hosted/bridge-message.js.map +1 -0
- package/lib/commonjs/internal/hosted/hosted-url.js +41 -0
- package/lib/commonjs/internal/hosted/hosted-url.js.map +1 -0
- package/lib/commonjs/internal/index.js +0 -7
- package/lib/commonjs/internal/index.js.map +1 -1
- package/lib/commonjs/internal/redact-uri.js +59 -15
- package/lib/commonjs/internal/redact-uri.js.map +1 -1
- package/lib/commonjs/internal/secure-store-pending-session-store.js +20 -25
- package/lib/commonjs/internal/secure-store-pending-session-store.js.map +1 -1
- package/lib/commonjs/internal/url-parts.js +145 -0
- package/lib/commonjs/internal/url-parts.js.map +1 -0
- package/lib/commonjs/public/index.js +0 -37
- package/lib/commonjs/public/index.js.map +1 -1
- package/lib/commonjs/public/payment-result.js +16 -4
- package/lib/commonjs/public/payment-result.js.map +1 -1
- package/lib/commonjs/public/recovery-result.js +7 -18
- package/lib/commonjs/public/recovery-result.js.map +1 -1
- package/lib/commonjs/public/spare-link-config.js +41 -16
- package/lib/commonjs/public/spare-link-config.js.map +1 -1
- package/lib/commonjs/public/spare-link-event.js +27 -33
- package/lib/commonjs/public/spare-link-event.js.map +1 -1
- package/lib/commonjs/public/spare-link-instance.js +67 -77
- package/lib/commonjs/public/spare-link-instance.js.map +1 -1
- package/lib/commonjs/public/spare-link-session.js +2 -9
- package/lib/commonjs/public/spare-link-session.js.map +1 -1
- package/lib/commonjs/public/spare-link.js +0 -12
- package/lib/commonjs/public/spare-link.js.map +1 -1
- package/lib/commonjs/ui/hooks/{use-payment-flow-state.js → use-hosted-flow-state.js} +4 -4
- package/lib/commonjs/ui/hooks/use-hosted-flow-state.js.map +1 -0
- package/lib/commonjs/ui/hosted/hosted-payment-page.js +177 -0
- package/lib/commonjs/ui/hosted/hosted-payment-page.js.map +1 -0
- package/lib/commonjs/ui/hosted/hosted-payment-webview.js +168 -0
- package/lib/commonjs/ui/hosted/hosted-payment-webview.js.map +1 -0
- package/lib/commonjs/ui/screens/index.js +3 -17
- package/lib/commonjs/ui/screens/index.js.map +1 -1
- package/lib/commonjs/ui/screens/page-unavailable-screen.js +101 -0
- package/lib/commonjs/ui/screens/page-unavailable-screen.js.map +1 -0
- package/lib/commonjs/ui/spare-link-host.js +220 -234
- package/lib/commonjs/ui/spare-link-host.js.map +1 -1
- package/lib/commonjs/ui/widgets/index.js +3 -10
- package/lib/commonjs/ui/widgets/index.js.map +1 -1
- package/lib/commonjs/version.js +7 -5
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/core/models/payment-return-params.js +235 -20
- package/lib/module/core/models/payment-return-params.js.map +1 -1
- package/lib/module/core/models/pending-session-record.js +2 -0
- package/lib/module/core/models/pending-session-record.js.map +1 -0
- package/lib/module/core/services/hosted-flow-controller.js +328 -0
- package/lib/module/core/services/hosted-flow-controller.js.map +1 -0
- package/lib/module/core/services/hosted-flow-state.js +91 -0
- package/lib/module/core/services/hosted-flow-state.js.map +1 -0
- package/lib/module/index.js +8 -22
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal/hosted/bridge-message.js +104 -0
- package/lib/module/internal/hosted/bridge-message.js.map +1 -0
- package/lib/module/internal/hosted/hosted-url.js +36 -0
- package/lib/module/internal/hosted/hosted-url.js.map +1 -0
- package/lib/module/internal/index.js +0 -1
- package/lib/module/internal/index.js.map +1 -1
- package/lib/module/internal/redact-uri.js +59 -15
- package/lib/module/internal/redact-uri.js.map +1 -1
- package/lib/module/internal/secure-store-pending-session-store.js +20 -25
- package/lib/module/internal/secure-store-pending-session-store.js.map +1 -1
- package/lib/module/internal/url-parts.js +139 -0
- package/lib/module/internal/url-parts.js.map +1 -0
- package/lib/module/public/index.js +2 -3
- package/lib/module/public/index.js.map +1 -1
- package/lib/module/public/payment-result.js +16 -4
- package/lib/module/public/payment-result.js.map +1 -1
- package/lib/module/public/recovery-result.js +7 -17
- package/lib/module/public/recovery-result.js.map +1 -1
- package/lib/module/public/spare-link-config.js +42 -15
- package/lib/module/public/spare-link-config.js.map +1 -1
- package/lib/module/public/spare-link-event.js +27 -33
- package/lib/module/public/spare-link-event.js.map +1 -1
- package/lib/module/public/spare-link-instance.js +68 -72
- package/lib/module/public/spare-link-instance.js.map +1 -1
- package/lib/module/public/spare-link-session.js +2 -9
- package/lib/module/public/spare-link-session.js.map +1 -1
- package/lib/module/public/spare-link.js +1 -1
- package/lib/module/public/spare-link.js.map +1 -1
- package/lib/module/ui/hooks/{use-payment-flow-state.js → use-hosted-flow-state.js} +3 -3
- package/lib/module/ui/hooks/use-hosted-flow-state.js.map +1 -0
- package/lib/module/ui/hosted/hosted-payment-page.js +175 -0
- package/lib/module/ui/hosted/hosted-payment-page.js.map +1 -0
- package/lib/module/ui/hosted/hosted-payment-webview.js +163 -0
- package/lib/module/ui/hosted/hosted-payment-webview.js.map +1 -0
- package/lib/module/ui/screens/index.js +1 -3
- package/lib/module/ui/screens/index.js.map +1 -1
- package/lib/module/ui/screens/page-unavailable-screen.js +97 -0
- package/lib/module/ui/screens/page-unavailable-screen.js.map +1 -0
- package/lib/module/ui/spare-link-host.js +221 -236
- package/lib/module/ui/spare-link-host.js.map +1 -1
- package/lib/module/ui/widgets/index.js +1 -2
- package/lib/module/ui/widgets/index.js.map +1 -1
- package/lib/module/version.js +7 -5
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/commonjs/core/models/index.d.ts +1 -123
- package/lib/typescript/commonjs/core/models/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/models/payment-return-params.d.ts +91 -8
- package/lib/typescript/commonjs/core/models/payment-return-params.d.ts.map +1 -1
- package/lib/typescript/commonjs/core/models/pending-session-record.d.ts +11 -0
- package/lib/typescript/commonjs/core/models/pending-session-record.d.ts.map +1 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-controller.d.ts +119 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-controller.d.ts.map +1 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-state.d.ts +75 -0
- package/lib/typescript/commonjs/core/services/hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +5 -14
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/hosted/bridge-message.d.ts +44 -0
- package/lib/typescript/commonjs/internal/hosted/bridge-message.d.ts.map +1 -0
- package/lib/typescript/commonjs/internal/hosted/hosted-url.d.ts +30 -0
- package/lib/typescript/commonjs/internal/hosted/hosted-url.d.ts.map +1 -0
- package/lib/typescript/commonjs/internal/index.d.ts +0 -1
- package/lib/typescript/commonjs/internal/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/redact-uri.d.ts +21 -1
- package/lib/typescript/commonjs/internal/redact-uri.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/secure-store-pending-session-store.d.ts +3 -2
- package/lib/typescript/commonjs/internal/secure-store-pending-session-store.d.ts.map +1 -1
- package/lib/typescript/commonjs/internal/url-parts.d.ts +46 -0
- package/lib/typescript/commonjs/internal/url-parts.d.ts.map +1 -0
- package/lib/typescript/commonjs/public/index.d.ts +4 -6
- package/lib/typescript/commonjs/public/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/payment-result.d.ts +50 -12
- package/lib/typescript/commonjs/public/payment-result.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/recovery-result.d.ts +11 -20
- package/lib/typescript/commonjs/public/recovery-result.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-config.d.ts +13 -31
- package/lib/typescript/commonjs/public/spare-link-config.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-event.d.ts +29 -31
- package/lib/typescript/commonjs/public/spare-link-event.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-host-api.d.ts +1 -12
- package/lib/typescript/commonjs/public/spare-link-host-api.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-instance.d.ts +26 -20
- package/lib/typescript/commonjs/public/spare-link-instance.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link-session.d.ts +3 -8
- package/lib/typescript/commonjs/public/spare-link-session.d.ts.map +1 -1
- package/lib/typescript/commonjs/public/spare-link.d.ts +1 -1
- package/lib/typescript/commonjs/public/spare-link.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/use-hosted-flow-state.d.ts +9 -0
- package/lib/typescript/commonjs/ui/hooks/use-hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-page.d.ts +17 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-page.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-webview.d.ts +43 -0
- package/lib/typescript/commonjs/ui/hosted/hosted-payment-webview.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/screens/index.d.ts +1 -3
- package/lib/typescript/commonjs/ui/screens/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/screens/page-unavailable-screen.d.ts +18 -0
- package/lib/typescript/commonjs/ui/screens/page-unavailable-screen.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/spare-link-host.d.ts +4 -5
- package/lib/typescript/commonjs/ui/spare-link-host.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/widgets/index.d.ts +1 -2
- package/lib/typescript/commonjs/ui/widgets/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/version.d.ts +7 -5
- package/lib/typescript/commonjs/version.d.ts.map +1 -1
- package/lib/typescript/module/core/models/index.d.ts +1 -123
- package/lib/typescript/module/core/models/index.d.ts.map +1 -1
- package/lib/typescript/module/core/models/payment-return-params.d.ts +91 -8
- package/lib/typescript/module/core/models/payment-return-params.d.ts.map +1 -1
- package/lib/typescript/module/core/models/pending-session-record.d.ts +11 -0
- package/lib/typescript/module/core/models/pending-session-record.d.ts.map +1 -0
- package/lib/typescript/module/core/services/hosted-flow-controller.d.ts +119 -0
- package/lib/typescript/module/core/services/hosted-flow-controller.d.ts.map +1 -0
- package/lib/typescript/module/core/services/hosted-flow-state.d.ts +75 -0
- package/lib/typescript/module/core/services/hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +5 -14
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/internal/hosted/bridge-message.d.ts +44 -0
- package/lib/typescript/module/internal/hosted/bridge-message.d.ts.map +1 -0
- package/lib/typescript/module/internal/hosted/hosted-url.d.ts +30 -0
- package/lib/typescript/module/internal/hosted/hosted-url.d.ts.map +1 -0
- package/lib/typescript/module/internal/index.d.ts +0 -1
- package/lib/typescript/module/internal/index.d.ts.map +1 -1
- package/lib/typescript/module/internal/redact-uri.d.ts +21 -1
- package/lib/typescript/module/internal/redact-uri.d.ts.map +1 -1
- package/lib/typescript/module/internal/secure-store-pending-session-store.d.ts +3 -2
- package/lib/typescript/module/internal/secure-store-pending-session-store.d.ts.map +1 -1
- package/lib/typescript/module/internal/url-parts.d.ts +46 -0
- package/lib/typescript/module/internal/url-parts.d.ts.map +1 -0
- package/lib/typescript/module/public/index.d.ts +4 -6
- package/lib/typescript/module/public/index.d.ts.map +1 -1
- package/lib/typescript/module/public/payment-result.d.ts +50 -12
- package/lib/typescript/module/public/payment-result.d.ts.map +1 -1
- package/lib/typescript/module/public/recovery-result.d.ts +11 -20
- package/lib/typescript/module/public/recovery-result.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-config.d.ts +13 -31
- package/lib/typescript/module/public/spare-link-config.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-event.d.ts +29 -31
- package/lib/typescript/module/public/spare-link-event.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-host-api.d.ts +1 -12
- package/lib/typescript/module/public/spare-link-host-api.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-instance.d.ts +26 -20
- package/lib/typescript/module/public/spare-link-instance.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link-session.d.ts +3 -8
- package/lib/typescript/module/public/spare-link-session.d.ts.map +1 -1
- package/lib/typescript/module/public/spare-link.d.ts +1 -1
- package/lib/typescript/module/public/spare-link.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/use-hosted-flow-state.d.ts +9 -0
- package/lib/typescript/module/ui/hooks/use-hosted-flow-state.d.ts.map +1 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-page.d.ts +17 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-page.d.ts.map +1 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-webview.d.ts +43 -0
- package/lib/typescript/module/ui/hosted/hosted-payment-webview.d.ts.map +1 -0
- package/lib/typescript/module/ui/screens/index.d.ts +1 -3
- package/lib/typescript/module/ui/screens/index.d.ts.map +1 -1
- package/lib/typescript/module/ui/screens/page-unavailable-screen.d.ts +18 -0
- package/lib/typescript/module/ui/screens/page-unavailable-screen.d.ts.map +1 -0
- package/lib/typescript/module/ui/spare-link-host.d.ts +4 -5
- package/lib/typescript/module/ui/spare-link-host.d.ts.map +1 -1
- package/lib/typescript/module/ui/widgets/index.d.ts +1 -2
- package/lib/typescript/module/ui/widgets/index.d.ts.map +1 -1
- package/lib/typescript/module/version.d.ts +7 -5
- package/lib/typescript/module/version.d.ts.map +1 -1
- package/package.json +24 -23
- package/plugins/with-spare-link.js +6 -26
- package/src/core/models/index.ts +1 -139
- package/src/core/models/payment-return-params.ts +269 -21
- package/src/core/models/pending-session-record.ts +10 -0
- package/src/core/services/hosted-flow-controller.ts +374 -0
- package/src/core/services/hosted-flow-state.ts +123 -0
- package/src/index.ts +20 -89
- package/src/internal/hosted/bridge-message.ts +106 -0
- package/src/internal/hosted/hosted-url.ts +33 -0
- package/src/internal/index.ts +0 -1
- package/src/internal/redact-uri.ts +69 -15
- package/src/internal/secure-store-pending-session-store.ts +28 -49
- package/src/internal/url-parts.ts +134 -0
- package/src/public/index.ts +2 -24
- package/src/public/payment-result.ts +50 -12
- package/src/public/recovery-result.ts +16 -25
- package/src/public/spare-link-config.ts +56 -43
- package/src/public/spare-link-event.ts +33 -42
- package/src/public/spare-link-host-api.ts +1 -14
- package/src/public/spare-link-instance.ts +57 -65
- package/src/public/spare-link-session.ts +4 -16
- package/src/public/spare-link.ts +1 -1
- package/src/ui/hooks/use-hosted-flow-state.ts +16 -0
- package/src/ui/hosted/hosted-payment-page.tsx +178 -0
- package/src/ui/hosted/hosted-payment-webview.tsx +164 -0
- package/src/ui/screens/index.ts +4 -6
- package/src/ui/screens/page-unavailable-screen.tsx +94 -0
- package/src/ui/spare-link-host.tsx +227 -247
- package/src/ui/widgets/index.ts +1 -2
- package/src/version.ts +7 -5
- package/CHANGELOG.md +0 -66
- package/lib/commonjs/core/client/link-api-client.js +0 -297
- package/lib/commonjs/core/client/link-api-client.js.map +0 -1
- package/lib/commonjs/core/errors/payment-api-error.js +0 -35
- package/lib/commonjs/core/errors/payment-api-error.js.map +0 -1
- package/lib/commonjs/core/models/link-session-status.js +0 -14
- package/lib/commonjs/core/models/link-session-status.js.map +0 -1
- package/lib/commonjs/core/models/payment-type.js +0 -45
- package/lib/commonjs/core/models/payment-type.js.map +0 -1
- package/lib/commonjs/core/models/wire-mappers.js +0 -277
- package/lib/commonjs/core/models/wire-mappers.js.map +0 -1
- package/lib/commonjs/core/services/consent-presenter.js +0 -150
- package/lib/commonjs/core/services/consent-presenter.js.map +0 -1
- package/lib/commonjs/core/services/execute-resume-if-needed.js +0 -216
- package/lib/commonjs/core/services/execute-resume-if-needed.js.map +0 -1
- package/lib/commonjs/core/services/multi-payment-rules-presenter.js +0 -151
- package/lib/commonjs/core/services/multi-payment-rules-presenter.js.map +0 -1
- package/lib/commonjs/core/services/payment-flow-controller.js +0 -547
- package/lib/commonjs/core/services/payment-flow-controller.js.map +0 -1
- package/lib/commonjs/core/services/payment-flow-state.js +0 -110
- package/lib/commonjs/core/services/payment-flow-state.js.map +0 -1
- package/lib/commonjs/core/services/payment-result-mapper.js +0 -49
- package/lib/commonjs/core/services/payment-result-mapper.js.map +0 -1
- package/lib/commonjs/core/services/presentation-utils.js +0 -11
- package/lib/commonjs/core/services/presentation-utils.js.map +0 -1
- package/lib/commonjs/core/services/redirect-buffer.js +0 -40
- package/lib/commonjs/core/services/redirect-buffer.js.map +0 -1
- package/lib/commonjs/core/services/user-friendly-messages.js +0 -46
- package/lib/commonjs/core/services/user-friendly-messages.js.map +0 -1
- package/lib/commonjs/internal/telemetry-collector.js +0 -80
- package/lib/commonjs/internal/telemetry-collector.js.map +0 -1
- package/lib/commonjs/public/constants.js +0 -21
- package/lib/commonjs/public/constants.js.map +0 -1
- package/lib/commonjs/public/spare-link-callbacks.js +0 -6
- package/lib/commonjs/public/spare-link-callbacks.js.map +0 -1
- package/lib/commonjs/ui/consent/charge-bearer-display.js +0 -99
- package/lib/commonjs/ui/consent/charge-bearer-display.js.map +0 -1
- package/lib/commonjs/ui/consent/consent-accordion.js +0 -94
- package/lib/commonjs/ui/consent/consent-accordion.js.map +0 -1
- package/lib/commonjs/ui/consent/consent-summary-section.js +0 -27
- package/lib/commonjs/ui/consent/consent-summary-section.js.map +0 -1
- package/lib/commonjs/ui/consent/cop-information.js +0 -168
- package/lib/commonjs/ui/consent/cop-information.js.map +0 -1
- package/lib/commonjs/ui/consent/international-payment-summary.js +0 -98
- package/lib/commonjs/ui/consent/international-payment-summary.js.map +0 -1
- package/lib/commonjs/ui/consent/label-value-rows.js +0 -59
- package/lib/commonjs/ui/consent/label-value-rows.js.map +0 -1
- package/lib/commonjs/ui/consent/multi-payment-rules-list.js +0 -130
- package/lib/commonjs/ui/consent/multi-payment-rules-list.js.map +0 -1
- package/lib/commonjs/ui/consent/multi-payment-summary.js +0 -99
- package/lib/commonjs/ui/consent/multi-payment-summary.js.map +0 -1
- package/lib/commonjs/ui/consent/single-payment-summary.js +0 -158
- package/lib/commonjs/ui/consent/single-payment-summary.js.map +0 -1
- package/lib/commonjs/ui/consent/terms-link.js +0 -35
- package/lib/commonjs/ui/consent/terms-link.js.map +0 -1
- package/lib/commonjs/ui/hooks/use-payment-flow-state.js.map +0 -1
- package/lib/commonjs/ui/payment-flow-page.js +0 -235
- package/lib/commonjs/ui/payment-flow-page.js.map +0 -1
- package/lib/commonjs/ui/screens/bank-selection-screen.js +0 -215
- package/lib/commonjs/ui/screens/bank-selection-screen.js.map +0 -1
- package/lib/commonjs/ui/screens/consent-details-screen.js +0 -124
- package/lib/commonjs/ui/screens/consent-details-screen.js.map +0 -1
- package/lib/commonjs/ui/screens/mandate-setup-success-screen.js +0 -79
- package/lib/commonjs/ui/screens/mandate-setup-success-screen.js.map +0 -1
- package/lib/commonjs/ui/widgets/layout-w-header.js +0 -106
- package/lib/commonjs/ui/widgets/layout-w-header.js.map +0 -1
- package/lib/commonjs/ui/widgets/stepper.js +0 -124
- package/lib/commonjs/ui/widgets/stepper.js.map +0 -1
- package/lib/module/core/client/link-api-client.js +0 -292
- package/lib/module/core/client/link-api-client.js.map +0 -1
- package/lib/module/core/errors/payment-api-error.js +0 -29
- package/lib/module/core/errors/payment-api-error.js.map +0 -1
- package/lib/module/core/models/link-session-status.js +0 -10
- package/lib/module/core/models/link-session-status.js.map +0 -1
- package/lib/module/core/models/payment-type.js +0 -36
- package/lib/module/core/models/payment-type.js.map +0 -1
- package/lib/module/core/models/wire-mappers.js +0 -263
- package/lib/module/core/models/wire-mappers.js.map +0 -1
- package/lib/module/core/services/consent-presenter.js +0 -140
- package/lib/module/core/services/consent-presenter.js.map +0 -1
- package/lib/module/core/services/execute-resume-if-needed.js +0 -211
- package/lib/module/core/services/execute-resume-if-needed.js.map +0 -1
- package/lib/module/core/services/multi-payment-rules-presenter.js +0 -146
- package/lib/module/core/services/multi-payment-rules-presenter.js.map +0 -1
- package/lib/module/core/services/payment-flow-controller.js +0 -544
- package/lib/module/core/services/payment-flow-controller.js.map +0 -1
- package/lib/module/core/services/payment-flow-state.js +0 -106
- package/lib/module/core/services/payment-flow-state.js.map +0 -1
- package/lib/module/core/services/payment-result-mapper.js +0 -45
- package/lib/module/core/services/payment-result-mapper.js.map +0 -1
- package/lib/module/core/services/presentation-utils.js +0 -7
- package/lib/module/core/services/presentation-utils.js.map +0 -1
- package/lib/module/core/services/redirect-buffer.js +0 -33
- package/lib/module/core/services/redirect-buffer.js.map +0 -1
- package/lib/module/core/services/user-friendly-messages.js +0 -42
- package/lib/module/core/services/user-friendly-messages.js.map +0 -1
- package/lib/module/internal/telemetry-collector.js +0 -75
- package/lib/module/internal/telemetry-collector.js.map +0 -1
- package/lib/module/public/constants.js +0 -17
- package/lib/module/public/constants.js.map +0 -1
- package/lib/module/public/spare-link-callbacks.js +0 -4
- package/lib/module/public/spare-link-callbacks.js.map +0 -1
- package/lib/module/ui/consent/charge-bearer-display.js +0 -95
- package/lib/module/ui/consent/charge-bearer-display.js.map +0 -1
- package/lib/module/ui/consent/consent-accordion.js +0 -90
- package/lib/module/ui/consent/consent-accordion.js.map +0 -1
- package/lib/module/ui/consent/consent-summary-section.js +0 -23
- package/lib/module/ui/consent/consent-summary-section.js.map +0 -1
- package/lib/module/ui/consent/cop-information.js +0 -165
- package/lib/module/ui/consent/cop-information.js.map +0 -1
- package/lib/module/ui/consent/international-payment-summary.js +0 -94
- package/lib/module/ui/consent/international-payment-summary.js.map +0 -1
- package/lib/module/ui/consent/label-value-rows.js +0 -55
- package/lib/module/ui/consent/label-value-rows.js.map +0 -1
- package/lib/module/ui/consent/multi-payment-rules-list.js +0 -125
- package/lib/module/ui/consent/multi-payment-rules-list.js.map +0 -1
- package/lib/module/ui/consent/multi-payment-summary.js +0 -95
- package/lib/module/ui/consent/multi-payment-summary.js.map +0 -1
- package/lib/module/ui/consent/single-payment-summary.js +0 -154
- package/lib/module/ui/consent/single-payment-summary.js.map +0 -1
- package/lib/module/ui/consent/terms-link.js +0 -31
- package/lib/module/ui/consent/terms-link.js.map +0 -1
- package/lib/module/ui/hooks/use-payment-flow-state.js.map +0 -1
- package/lib/module/ui/payment-flow-page.js +0 -232
- package/lib/module/ui/payment-flow-page.js.map +0 -1
- package/lib/module/ui/screens/bank-selection-screen.js +0 -211
- package/lib/module/ui/screens/bank-selection-screen.js.map +0 -1
- package/lib/module/ui/screens/consent-details-screen.js +0 -120
- package/lib/module/ui/screens/consent-details-screen.js.map +0 -1
- package/lib/module/ui/screens/mandate-setup-success-screen.js +0 -75
- package/lib/module/ui/screens/mandate-setup-success-screen.js.map +0 -1
- package/lib/module/ui/widgets/layout-w-header.js +0 -102
- package/lib/module/ui/widgets/layout-w-header.js.map +0 -1
- package/lib/module/ui/widgets/stepper.js +0 -120
- package/lib/module/ui/widgets/stepper.js.map +0 -1
- package/lib/typescript/commonjs/core/client/link-api-client.d.ts +0 -70
- package/lib/typescript/commonjs/core/client/link-api-client.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/errors/payment-api-error.d.ts +0 -15
- package/lib/typescript/commonjs/core/errors/payment-api-error.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/models/link-session-status.d.ts +0 -6
- package/lib/typescript/commonjs/core/models/link-session-status.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/models/payment-type.d.ts +0 -18
- package/lib/typescript/commonjs/core/models/payment-type.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/models/wire-mappers.d.ts +0 -19
- package/lib/typescript/commonjs/core/models/wire-mappers.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/consent-presenter.d.ts +0 -67
- package/lib/typescript/commonjs/core/services/consent-presenter.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/execute-resume-if-needed.d.ts +0 -32
- package/lib/typescript/commonjs/core/services/execute-resume-if-needed.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/multi-payment-rules-presenter.d.ts +0 -9
- package/lib/typescript/commonjs/core/services/multi-payment-rules-presenter.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/payment-flow-controller.d.ts +0 -146
- package/lib/typescript/commonjs/core/services/payment-flow-controller.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/payment-flow-state.d.ts +0 -64
- package/lib/typescript/commonjs/core/services/payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/payment-result-mapper.d.ts +0 -5
- package/lib/typescript/commonjs/core/services/payment-result-mapper.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/presentation-utils.d.ts +0 -5
- package/lib/typescript/commonjs/core/services/presentation-utils.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/redirect-buffer.d.ts +0 -6
- package/lib/typescript/commonjs/core/services/redirect-buffer.d.ts.map +0 -1
- package/lib/typescript/commonjs/core/services/user-friendly-messages.d.ts +0 -6
- package/lib/typescript/commonjs/core/services/user-friendly-messages.d.ts.map +0 -1
- package/lib/typescript/commonjs/internal/telemetry-collector.d.ts +0 -2
- package/lib/typescript/commonjs/internal/telemetry-collector.d.ts.map +0 -1
- package/lib/typescript/commonjs/public/constants.d.ts +0 -12
- package/lib/typescript/commonjs/public/constants.d.ts.map +0 -1
- package/lib/typescript/commonjs/public/spare-link-callbacks.d.ts +0 -14
- package/lib/typescript/commonjs/public/spare-link-callbacks.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/charge-bearer-display.d.ts +0 -5
- package/lib/typescript/commonjs/ui/consent/charge-bearer-display.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/consent-accordion.d.ts +0 -10
- package/lib/typescript/commonjs/ui/consent/consent-accordion.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/consent-summary-section.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/consent-summary-section.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/cop-information.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/cop-information.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/international-payment-summary.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/international-payment-summary.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/label-value-rows.d.ts +0 -10
- package/lib/typescript/commonjs/ui/consent/label-value-rows.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/multi-payment-rules-list.d.ts +0 -15
- package/lib/typescript/commonjs/ui/consent/multi-payment-rules-list.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/multi-payment-summary.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/multi-payment-summary.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/single-payment-summary.d.ts +0 -6
- package/lib/typescript/commonjs/ui/consent/single-payment-summary.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/consent/terms-link.d.ts +0 -2
- package/lib/typescript/commonjs/ui/consent/terms-link.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/hooks/use-payment-flow-state.d.ts +0 -9
- package/lib/typescript/commonjs/ui/hooks/use-payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/payment-flow-page.d.ts +0 -20
- package/lib/typescript/commonjs/ui/payment-flow-page.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/screens/bank-selection-screen.d.ts +0 -15
- package/lib/typescript/commonjs/ui/screens/bank-selection-screen.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/screens/consent-details-screen.d.ts +0 -13
- package/lib/typescript/commonjs/ui/screens/consent-details-screen.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/screens/mandate-setup-success-screen.d.ts +0 -10
- package/lib/typescript/commonjs/ui/screens/mandate-setup-success-screen.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/widgets/layout-w-header.d.ts +0 -20
- package/lib/typescript/commonjs/ui/widgets/layout-w-header.d.ts.map +0 -1
- package/lib/typescript/commonjs/ui/widgets/stepper.d.ts +0 -15
- package/lib/typescript/commonjs/ui/widgets/stepper.d.ts.map +0 -1
- package/lib/typescript/module/core/client/link-api-client.d.ts +0 -70
- package/lib/typescript/module/core/client/link-api-client.d.ts.map +0 -1
- package/lib/typescript/module/core/errors/payment-api-error.d.ts +0 -15
- package/lib/typescript/module/core/errors/payment-api-error.d.ts.map +0 -1
- package/lib/typescript/module/core/models/link-session-status.d.ts +0 -6
- package/lib/typescript/module/core/models/link-session-status.d.ts.map +0 -1
- package/lib/typescript/module/core/models/payment-type.d.ts +0 -18
- package/lib/typescript/module/core/models/payment-type.d.ts.map +0 -1
- package/lib/typescript/module/core/models/wire-mappers.d.ts +0 -19
- package/lib/typescript/module/core/models/wire-mappers.d.ts.map +0 -1
- package/lib/typescript/module/core/services/consent-presenter.d.ts +0 -67
- package/lib/typescript/module/core/services/consent-presenter.d.ts.map +0 -1
- package/lib/typescript/module/core/services/execute-resume-if-needed.d.ts +0 -32
- package/lib/typescript/module/core/services/execute-resume-if-needed.d.ts.map +0 -1
- package/lib/typescript/module/core/services/multi-payment-rules-presenter.d.ts +0 -9
- package/lib/typescript/module/core/services/multi-payment-rules-presenter.d.ts.map +0 -1
- package/lib/typescript/module/core/services/payment-flow-controller.d.ts +0 -146
- package/lib/typescript/module/core/services/payment-flow-controller.d.ts.map +0 -1
- package/lib/typescript/module/core/services/payment-flow-state.d.ts +0 -64
- package/lib/typescript/module/core/services/payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/module/core/services/payment-result-mapper.d.ts +0 -5
- package/lib/typescript/module/core/services/payment-result-mapper.d.ts.map +0 -1
- package/lib/typescript/module/core/services/presentation-utils.d.ts +0 -5
- package/lib/typescript/module/core/services/presentation-utils.d.ts.map +0 -1
- package/lib/typescript/module/core/services/redirect-buffer.d.ts +0 -6
- package/lib/typescript/module/core/services/redirect-buffer.d.ts.map +0 -1
- package/lib/typescript/module/core/services/user-friendly-messages.d.ts +0 -6
- package/lib/typescript/module/core/services/user-friendly-messages.d.ts.map +0 -1
- package/lib/typescript/module/internal/telemetry-collector.d.ts +0 -2
- package/lib/typescript/module/internal/telemetry-collector.d.ts.map +0 -1
- package/lib/typescript/module/public/constants.d.ts +0 -12
- package/lib/typescript/module/public/constants.d.ts.map +0 -1
- package/lib/typescript/module/public/spare-link-callbacks.d.ts +0 -14
- package/lib/typescript/module/public/spare-link-callbacks.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/charge-bearer-display.d.ts +0 -5
- package/lib/typescript/module/ui/consent/charge-bearer-display.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/consent-accordion.d.ts +0 -10
- package/lib/typescript/module/ui/consent/consent-accordion.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/consent-summary-section.d.ts +0 -6
- package/lib/typescript/module/ui/consent/consent-summary-section.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/cop-information.d.ts +0 -6
- package/lib/typescript/module/ui/consent/cop-information.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/international-payment-summary.d.ts +0 -6
- package/lib/typescript/module/ui/consent/international-payment-summary.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/label-value-rows.d.ts +0 -10
- package/lib/typescript/module/ui/consent/label-value-rows.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/multi-payment-rules-list.d.ts +0 -15
- package/lib/typescript/module/ui/consent/multi-payment-rules-list.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/multi-payment-summary.d.ts +0 -6
- package/lib/typescript/module/ui/consent/multi-payment-summary.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/single-payment-summary.d.ts +0 -6
- package/lib/typescript/module/ui/consent/single-payment-summary.d.ts.map +0 -1
- package/lib/typescript/module/ui/consent/terms-link.d.ts +0 -2
- package/lib/typescript/module/ui/consent/terms-link.d.ts.map +0 -1
- package/lib/typescript/module/ui/hooks/use-payment-flow-state.d.ts +0 -9
- package/lib/typescript/module/ui/hooks/use-payment-flow-state.d.ts.map +0 -1
- package/lib/typescript/module/ui/payment-flow-page.d.ts +0 -20
- package/lib/typescript/module/ui/payment-flow-page.d.ts.map +0 -1
- package/lib/typescript/module/ui/screens/bank-selection-screen.d.ts +0 -15
- package/lib/typescript/module/ui/screens/bank-selection-screen.d.ts.map +0 -1
- package/lib/typescript/module/ui/screens/consent-details-screen.d.ts +0 -13
- package/lib/typescript/module/ui/screens/consent-details-screen.d.ts.map +0 -1
- package/lib/typescript/module/ui/screens/mandate-setup-success-screen.d.ts +0 -10
- package/lib/typescript/module/ui/screens/mandate-setup-success-screen.d.ts.map +0 -1
- package/lib/typescript/module/ui/widgets/layout-w-header.d.ts +0 -20
- package/lib/typescript/module/ui/widgets/layout-w-header.d.ts.map +0 -1
- package/lib/typescript/module/ui/widgets/stepper.d.ts +0 -15
- package/lib/typescript/module/ui/widgets/stepper.d.ts.map +0 -1
- package/src/core/client/link-api-client.ts +0 -414
- package/src/core/errors/payment-api-error.ts +0 -35
- package/src/core/models/link-session-status.ts +0 -7
- package/src/core/models/payment-type.ts +0 -54
- package/src/core/models/wire-mappers.ts +0 -315
- package/src/core/services/consent-presenter.ts +0 -213
- package/src/core/services/execute-resume-if-needed.ts +0 -243
- package/src/core/services/multi-payment-rules-presenter.ts +0 -158
- package/src/core/services/payment-flow-controller.ts +0 -607
- package/src/core/services/payment-flow-state.ts +0 -124
- package/src/core/services/payment-result-mapper.ts +0 -41
- package/src/core/services/presentation-utils.ts +0 -4
- package/src/core/services/redirect-buffer.ts +0 -34
- package/src/core/services/user-friendly-messages.ts +0 -39
- package/src/internal/telemetry-collector.ts +0 -90
- package/src/public/constants.ts +0 -14
- package/src/public/spare-link-callbacks.ts +0 -20
- package/src/ui/consent/charge-bearer-display.tsx +0 -68
- package/src/ui/consent/consent-accordion.tsx +0 -89
- package/src/ui/consent/consent-summary-section.tsx +0 -19
- package/src/ui/consent/cop-information.tsx +0 -121
- package/src/ui/consent/international-payment-summary.tsx +0 -83
- package/src/ui/consent/label-value-rows.tsx +0 -50
- package/src/ui/consent/multi-payment-rules-list.tsx +0 -138
- package/src/ui/consent/multi-payment-summary.tsx +0 -82
- package/src/ui/consent/single-payment-summary.tsx +0 -123
- package/src/ui/consent/terms-link.tsx +0 -27
- package/src/ui/hooks/use-payment-flow-state.ts +0 -16
- package/src/ui/payment-flow-page.tsx +0 -254
- package/src/ui/screens/bank-selection-screen.tsx +0 -209
- package/src/ui/screens/consent-details-screen.tsx +0 -106
- package/src/ui/screens/mandate-setup-success-screen.tsx +0 -72
- package/src/ui/widgets/layout-w-header.tsx +0 -89
- package/src/ui/widgets/stepper.tsx +0 -126
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { launchBankRedirect as defaultLaunchBankRedirect } from '../../internal/bank-redirect';
|
|
2
|
+
import {
|
|
3
|
+
type HostedBridgeMessage,
|
|
4
|
+
parseHostedBridgeMessage,
|
|
5
|
+
} from '../../internal/hosted/bridge-message';
|
|
6
|
+
import { createLogger } from '../../internal/logger';
|
|
7
|
+
import { readPaymentReturn } from '../models/payment-return-params';
|
|
8
|
+
import { type HostedFlowState, HostedFlowStates, isTerminalPhase } from './hosted-flow-state';
|
|
9
|
+
|
|
10
|
+
const log = createLogger('HostedFlowController');
|
|
11
|
+
|
|
12
|
+
/** Opens a bank authorization URL outside the WebView. */
|
|
13
|
+
export type BankLauncher = (url: string) => Promise<void>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* How long the page has to become interactive, measured from when the webview
|
|
17
|
+
* mounts.
|
|
18
|
+
*
|
|
19
|
+
* A page can load and still never speak: its script can fail to fetch, or throw
|
|
20
|
+
* before it posts `spare.ready`. Nothing else would notice, and the payer would
|
|
21
|
+
* hold a blank frame for as long as they were willing to.
|
|
22
|
+
*
|
|
23
|
+
* Measured from the webview rather than from this controller, because a
|
|
24
|
+
* controller is built before the screen is: the sheet's animation and whatever
|
|
25
|
+
* the host waits on before rendering would otherwise be charged against the
|
|
26
|
+
* page's budget, and a page that merely loads slowly would be called unreachable.
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_READY_TIMEOUT_MS = 20_000;
|
|
29
|
+
|
|
30
|
+
export interface HostedFlowControllerOptions {
|
|
31
|
+
reference: string;
|
|
32
|
+
bankLauncher?: BankLauncher;
|
|
33
|
+
/** Override the readiness timeout. Tests set this alongside fake timers. */
|
|
34
|
+
readyTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Drives a hosted payment from the messages the page sends and the deep link
|
|
39
|
+
* the OS delivers when the payer comes back.
|
|
40
|
+
*
|
|
41
|
+
* The SDK makes no API calls of its own: the page creates the consent, and the
|
|
42
|
+
* merchant's backend reads the result. So this controller only ever reacts —
|
|
43
|
+
* which is why every transition here is guarded against arriving after the flow
|
|
44
|
+
* has already resolved.
|
|
45
|
+
*/
|
|
46
|
+
export class HostedFlowController {
|
|
47
|
+
readonly reference: string;
|
|
48
|
+
|
|
49
|
+
private readonly bankLauncher: BankLauncher;
|
|
50
|
+
private readonly listeners = new Set<() => void>();
|
|
51
|
+
private readonly readyTimeoutMs: number;
|
|
52
|
+
private currentState: HostedFlowState;
|
|
53
|
+
private readyTimer: ReturnType<typeof setTimeout> | undefined;
|
|
54
|
+
|
|
55
|
+
constructor(options: HostedFlowControllerOptions) {
|
|
56
|
+
this.reference = options.reference;
|
|
57
|
+
this.bankLauncher =
|
|
58
|
+
options.bankLauncher ?? ((url) => defaultLaunchBankRedirect({ authorizationUrl: url }));
|
|
59
|
+
this.readyTimeoutMs = options.readyTimeoutMs ?? DEFAULT_READY_TIMEOUT_MS;
|
|
60
|
+
this.currentState = HostedFlowStates.loading(options.reference);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Records that the webview carrying the page is on screen.
|
|
65
|
+
*
|
|
66
|
+
* Starts the clock the page has to become interactive. Called on mount rather
|
|
67
|
+
* than on load, so a document that never finishes arriving is covered too.
|
|
68
|
+
*/
|
|
69
|
+
reportPageMounted(): void {
|
|
70
|
+
if (this.currentState.phase !== 'loading') return;
|
|
71
|
+
this.watchForReadiness();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
get state(): HostedFlowState {
|
|
75
|
+
return this.currentState;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Subscribe to state changes. Returns an unsubscribe function. */
|
|
79
|
+
subscribe(listener: () => void): () => void {
|
|
80
|
+
this.listeners.add(listener);
|
|
81
|
+
return () => {
|
|
82
|
+
this.listeners.delete(listener);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Reacts to a message from the hosted page.
|
|
88
|
+
*
|
|
89
|
+
* Resolves to whether the message was understood, so a caller can log what it
|
|
90
|
+
* dropped. An unrecognised message is not a failure: the page keeps working
|
|
91
|
+
* and the payer is unaffected.
|
|
92
|
+
*/
|
|
93
|
+
async handleBridgeMessage(raw: unknown): Promise<boolean> {
|
|
94
|
+
const message: HostedBridgeMessage | null = parseHostedBridgeMessage(raw);
|
|
95
|
+
if (!message) {
|
|
96
|
+
log.info('dropped an unrecognised message from the hosted page');
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Only a page still on screen may drive the flow. The page posts on render,
|
|
101
|
+
// and a webview left behind a payer who has moved on can post again: a `ready`
|
|
102
|
+
// accepted while they are at their bank would drag the flow back to `hosted`,
|
|
103
|
+
// and the `openUrl` after it would open a second bank browser for a payment
|
|
104
|
+
// whose first authorization is already under way.
|
|
105
|
+
if (!this.isPagePresented()) {
|
|
106
|
+
log.info(`ignoring a '${message.type}' message from a page no longer on screen`);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
switch (message.type) {
|
|
111
|
+
case 'ready':
|
|
112
|
+
this.stopWatchingForReadiness();
|
|
113
|
+
this.moveTo(HostedFlowStates.hosted(this.reference, this.currentState.attempt));
|
|
114
|
+
break;
|
|
115
|
+
case 'openUrl':
|
|
116
|
+
await this.openBank(message.url);
|
|
117
|
+
break;
|
|
118
|
+
case 'cancel':
|
|
119
|
+
// The page spoke, so it is not unreachable whatever it went on to say.
|
|
120
|
+
this.stopWatchingForReadiness();
|
|
121
|
+
this.moveTo(HostedFlowStates.cancelled(this.reference, this.currentState.attempt));
|
|
122
|
+
break;
|
|
123
|
+
case 'error':
|
|
124
|
+
this.stopWatchingForReadiness();
|
|
125
|
+
this.moveTo(
|
|
126
|
+
HostedFlowStates.failed({
|
|
127
|
+
reference: this.reference,
|
|
128
|
+
errorCode: message.code,
|
|
129
|
+
attempt: this.currentState.attempt,
|
|
130
|
+
}),
|
|
131
|
+
);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Resolves the flow from the deep link the payer returned through.
|
|
139
|
+
*
|
|
140
|
+
* The outcome is read from the link rather than inferred: it is the only
|
|
141
|
+
* report of what the bank and the payment actually did.
|
|
142
|
+
*/
|
|
143
|
+
/** Whether the page is still the thing on screen and may still be believed. */
|
|
144
|
+
private isPagePresented(): boolean {
|
|
145
|
+
const phase = this.currentState.phase;
|
|
146
|
+
return phase === 'loading' || phase === 'hosted';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
handleReturn(uri: URL | string): void {
|
|
150
|
+
const { outcome, report } = readPaymentReturn(uri);
|
|
151
|
+
|
|
152
|
+
// A return that names a different payment is not this payment's business. The
|
|
153
|
+
// link is handed over by the OS and any app can send one, and a delayed
|
|
154
|
+
// callback for an earlier payment would otherwise resolve whichever one is
|
|
155
|
+
// open — with the wrong outcome attached to the wrong reference.
|
|
156
|
+
if (report.reference !== undefined && report.reference !== this.reference) {
|
|
157
|
+
log.warning('ignoring a return that names a different payment');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
this.stopWatchingForReadiness();
|
|
162
|
+
|
|
163
|
+
if (outcome === 'processed') {
|
|
164
|
+
this.moveTo(
|
|
165
|
+
HostedFlowStates.succeeded({
|
|
166
|
+
reference: this.reference,
|
|
167
|
+
attempt: this.currentState.attempt,
|
|
168
|
+
report,
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// `unknown` is not a failure. The service has statuses this version has not
|
|
175
|
+
// been taught, and a payment still being decided must not be reported as one
|
|
176
|
+
// that failed — abandoned says "ask your backend", which is the truth.
|
|
177
|
+
if (outcome === 'unknown') {
|
|
178
|
+
log.info('the return did not say what happened — reporting it as unresolved');
|
|
179
|
+
this.moveTo(HostedFlowStates.abandoned(this.reference, this.currentState.attempt));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
this.moveTo(
|
|
184
|
+
HostedFlowStates.failed({
|
|
185
|
+
reference: this.reference,
|
|
186
|
+
errorCode: report.errorCode ?? 'authorize_failed',
|
|
187
|
+
attempt: this.currentState.attempt,
|
|
188
|
+
report,
|
|
189
|
+
}),
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Records that the payment page could not be loaded.
|
|
195
|
+
*
|
|
196
|
+
* Only meaningful before the bank is opened. Once the payer is away, a load
|
|
197
|
+
* error is the WebView behind them and says nothing about their payment.
|
|
198
|
+
*
|
|
199
|
+
* Before the page has spoken this does not resolve the flow: nothing has been
|
|
200
|
+
* attempted, so the payer is offered the page again rather than told their
|
|
201
|
+
* payment failed.
|
|
202
|
+
*
|
|
203
|
+
* After it has spoken, it does. By then the payer may have chosen a bank and
|
|
204
|
+
* the page may have created a consent for it, and reloading from the start
|
|
205
|
+
* could create a second one while silently discarding what they entered.
|
|
206
|
+
*/
|
|
207
|
+
failToLoad(): void {
|
|
208
|
+
const phase = this.currentState.phase;
|
|
209
|
+
if (phase !== 'loading' && phase !== 'hosted') {
|
|
210
|
+
log.info('ignoring a page load error raised behind the payer');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.stopWatchingForReadiness();
|
|
214
|
+
|
|
215
|
+
if (phase === 'hosted') {
|
|
216
|
+
log.severe('the page failed after it had already started — not offering a reload');
|
|
217
|
+
this.moveTo(
|
|
218
|
+
HostedFlowStates.failed({
|
|
219
|
+
reference: this.reference,
|
|
220
|
+
// Not `page_unavailable`: that means the page was never reached and
|
|
221
|
+
// nothing was attempted. This page was working, and the payer may have
|
|
222
|
+
// got as far as a consent before its frame died — a different thing for
|
|
223
|
+
// a merchant to look into, and a different thing to show the payer.
|
|
224
|
+
errorCode: 'page_lost',
|
|
225
|
+
attempt: this.currentState.attempt,
|
|
226
|
+
}),
|
|
227
|
+
);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
this.moveTo(HostedFlowStates.unreachable(this.reference, this.currentState.attempt));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Asks for the page again after it could not be reached.
|
|
236
|
+
*
|
|
237
|
+
* The attempt is counted so the screen mounts a fresh webview: reusing the one
|
|
238
|
+
* that failed would show the payer the same dead frame.
|
|
239
|
+
*/
|
|
240
|
+
retry(): void {
|
|
241
|
+
if (this.currentState.phase !== 'unreachable') {
|
|
242
|
+
log.info('ignoring a retry for a payment that is not waiting on the page');
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const attempt = this.currentState.attempt + 1;
|
|
246
|
+
log.info(`asking for the payment page again (attempt ${attempt})`);
|
|
247
|
+
// The fresh webview reports itself mounted, which restarts the clock.
|
|
248
|
+
this.moveTo(HostedFlowStates.loading(this.reference, attempt));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Records that the payer gave up on a page that could not be reached.
|
|
253
|
+
*
|
|
254
|
+
* Reported as a failure rather than abandonment: the payer did not leave a
|
|
255
|
+
* payment in progress, the SDK never managed to present one.
|
|
256
|
+
*/
|
|
257
|
+
giveUp(): void {
|
|
258
|
+
if (this.currentState.phase !== 'unreachable') {
|
|
259
|
+
log.info('ignoring a give-up for a payment that is not waiting on the page');
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
this.stopWatchingForReadiness();
|
|
263
|
+
this.moveTo(
|
|
264
|
+
HostedFlowStates.failed({
|
|
265
|
+
reference: this.reference,
|
|
266
|
+
errorCode: 'page_unavailable',
|
|
267
|
+
attempt: this.currentState.attempt,
|
|
268
|
+
}),
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Records that the payer left before the flow resolved.
|
|
274
|
+
*
|
|
275
|
+
* A payment already at the bank may still complete after this, so it is
|
|
276
|
+
* reported as abandoned rather than failed: the merchant's backend, not the
|
|
277
|
+
* app, is what knows.
|
|
278
|
+
*/
|
|
279
|
+
abandon(): void {
|
|
280
|
+
this.stopWatchingForReadiness();
|
|
281
|
+
|
|
282
|
+
if (this.currentState.phase === 'unreachable') {
|
|
283
|
+
// Nothing was ever presented, so there is no payment that might still
|
|
284
|
+
// complete at the bank — which is what abandonment promises the merchant.
|
|
285
|
+
this.moveTo(
|
|
286
|
+
HostedFlowStates.failed({
|
|
287
|
+
reference: this.reference,
|
|
288
|
+
errorCode: 'page_unavailable',
|
|
289
|
+
attempt: this.currentState.attempt,
|
|
290
|
+
}),
|
|
291
|
+
);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
this.moveTo(HostedFlowStates.abandoned(this.reference, this.currentState.attempt));
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
dispose(): void {
|
|
299
|
+
this.stopWatchingForReadiness();
|
|
300
|
+
this.listeners.clear();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private watchForReadiness(): void {
|
|
304
|
+
this.stopWatchingForReadiness();
|
|
305
|
+
this.readyTimer = setTimeout(() => {
|
|
306
|
+
this.readyTimer = undefined;
|
|
307
|
+
if (this.currentState.phase !== 'loading') return;
|
|
308
|
+
log.severe('the payment page never became interactive — treating it as unreachable');
|
|
309
|
+
this.moveTo(HostedFlowStates.unreachable(this.reference, this.currentState.attempt));
|
|
310
|
+
}, this.readyTimeoutMs);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
private stopWatchingForReadiness(): void {
|
|
314
|
+
if (this.readyTimer === undefined) return;
|
|
315
|
+
clearTimeout(this.readyTimer);
|
|
316
|
+
this.readyTimer = undefined;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Opens the bank and waits for the payer to be sent back.
|
|
321
|
+
*
|
|
322
|
+
* The URL is opened exactly once, and never once the flow has resolved. The
|
|
323
|
+
* page posts on render, so a rebuild can repeat the message; opening a second
|
|
324
|
+
* browser — or one for a payment the payer has already left — would leave them
|
|
325
|
+
* authorizing in a window whose return nobody is waiting for.
|
|
326
|
+
*/
|
|
327
|
+
private async openBank(url: string): Promise<void> {
|
|
328
|
+
if (isTerminalPhase(this.currentState.phase)) {
|
|
329
|
+
log.info('not opening the bank for a payment that already resolved');
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (
|
|
333
|
+
this.currentState.phase === 'redirecting' ||
|
|
334
|
+
this.currentState.phase === 'awaitingCallback'
|
|
335
|
+
) {
|
|
336
|
+
log.info('bank already opened for this payment — ignoring');
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
this.stopWatchingForReadiness();
|
|
341
|
+
this.moveTo(HostedFlowStates.redirecting(this.reference, this.currentState.attempt));
|
|
342
|
+
|
|
343
|
+
try {
|
|
344
|
+
await this.bankLauncher(url);
|
|
345
|
+
this.moveTo(HostedFlowStates.awaitingCallback(this.reference, this.currentState.attempt));
|
|
346
|
+
} catch {
|
|
347
|
+
// The platform's message is not logged: a native launcher's error can carry
|
|
348
|
+
// the whole authorize URL back, `request_uri` and state included.
|
|
349
|
+
log.severe('could not open the bank');
|
|
350
|
+
this.moveTo(
|
|
351
|
+
HostedFlowStates.failed({
|
|
352
|
+
reference: this.reference,
|
|
353
|
+
errorCode: 'redirect_failed',
|
|
354
|
+
attempt: this.currentState.attempt,
|
|
355
|
+
}),
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
private moveTo(next: HostedFlowState): void {
|
|
361
|
+
if (isTerminalPhase(this.currentState.phase)) {
|
|
362
|
+
log.info('ignoring transition after the flow already resolved');
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
this.currentState = next;
|
|
366
|
+
for (const listener of this.listeners) {
|
|
367
|
+
try {
|
|
368
|
+
listener();
|
|
369
|
+
} catch {
|
|
370
|
+
/* a listener that throws must not stop the others from hearing */
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { PaymentReturnReport } from '../models/payment-return-params';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Where a hosted payment has got to.
|
|
5
|
+
*
|
|
6
|
+
* The phases the payer spends most of their time in — choosing a bank, reading
|
|
7
|
+
* the consent, confirming the payee — are all `hosted`: they happen inside the
|
|
8
|
+
* page, which does not report them, and the SDK has nothing to decide there.
|
|
9
|
+
*/
|
|
10
|
+
export type HostedFlowPhase =
|
|
11
|
+
/** The page is being fetched. Nothing is interactive yet. */
|
|
12
|
+
| 'loading'
|
|
13
|
+
/** The page is interactive and the payer is working through it. */
|
|
14
|
+
| 'hosted'
|
|
15
|
+
/**
|
|
16
|
+
* The page could not be loaded, or loaded and never became interactive.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately not terminal. Nothing has been attempted — no consent, no bank,
|
|
19
|
+
* no money — so the payer is offered the page again rather than told their
|
|
20
|
+
* payment failed, and the flow stays open while they decide.
|
|
21
|
+
*/
|
|
22
|
+
| 'unreachable'
|
|
23
|
+
/** A consent exists and the bank is being opened outside the WebView. */
|
|
24
|
+
| 'redirecting'
|
|
25
|
+
/** The bank has the payer. The next thing to happen is a deep link home. */
|
|
26
|
+
| 'awaitingCallback'
|
|
27
|
+
| 'succeeded'
|
|
28
|
+
| 'failed'
|
|
29
|
+
| 'cancelled'
|
|
30
|
+
/** The payer left before the flow resolved either way. */
|
|
31
|
+
| 'abandoned';
|
|
32
|
+
|
|
33
|
+
/** Immutable snapshot of a hosted payment. */
|
|
34
|
+
export interface HostedFlowState {
|
|
35
|
+
readonly phase: HostedFlowPhase;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The payment request this flow is paying. Also what the merchant's backend
|
|
39
|
+
* reads the authoritative result by.
|
|
40
|
+
*/
|
|
41
|
+
readonly reference: string;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Everything the return deep link reported — the merchant's reference, the
|
|
45
|
+
* payment id, the signature, the failure detail.
|
|
46
|
+
*
|
|
47
|
+
* Carried whole so a parameter added to the return contract reaches the caller
|
|
48
|
+
* without threading a new field through every factory below.
|
|
49
|
+
*/
|
|
50
|
+
readonly report?: PaymentReturnReport;
|
|
51
|
+
|
|
52
|
+
readonly errorCode?: string;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* How many times the page has been asked for, starting at 1.
|
|
56
|
+
*
|
|
57
|
+
* The screen keys the webview on this so a retry mounts a fresh one; reusing
|
|
58
|
+
* the failed instance would show the payer the same dead frame.
|
|
59
|
+
*/
|
|
60
|
+
readonly attempt: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const TERMINAL_PHASES: ReadonlySet<HostedFlowPhase> = new Set<HostedFlowPhase>([
|
|
64
|
+
'succeeded',
|
|
65
|
+
'failed',
|
|
66
|
+
'cancelled',
|
|
67
|
+
'abandoned',
|
|
68
|
+
]);
|
|
69
|
+
|
|
70
|
+
export function isTerminalPhase(phase: HostedFlowPhase): boolean {
|
|
71
|
+
return TERMINAL_PHASES.has(phase);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Factories for each phase, so no caller assembles a state by hand. */
|
|
75
|
+
export const HostedFlowStates = {
|
|
76
|
+
loading(reference: string, attempt = 1): HostedFlowState {
|
|
77
|
+
return { phase: 'loading', reference, attempt };
|
|
78
|
+
},
|
|
79
|
+
hosted(reference: string, attempt = 1): HostedFlowState {
|
|
80
|
+
return { phase: 'hosted', reference, attempt };
|
|
81
|
+
},
|
|
82
|
+
unreachable(reference: string, attempt = 1): HostedFlowState {
|
|
83
|
+
return { phase: 'unreachable', reference, attempt };
|
|
84
|
+
},
|
|
85
|
+
redirecting(reference: string, attempt = 1): HostedFlowState {
|
|
86
|
+
return { phase: 'redirecting', reference, attempt };
|
|
87
|
+
},
|
|
88
|
+
awaitingCallback(reference: string, attempt = 1): HostedFlowState {
|
|
89
|
+
return { phase: 'awaitingCallback', reference, attempt };
|
|
90
|
+
},
|
|
91
|
+
succeeded(args: {
|
|
92
|
+
reference: string;
|
|
93
|
+
report?: PaymentReturnReport;
|
|
94
|
+
attempt?: number;
|
|
95
|
+
}): HostedFlowState {
|
|
96
|
+
return {
|
|
97
|
+
phase: 'succeeded',
|
|
98
|
+
reference: args.reference,
|
|
99
|
+
attempt: args.attempt ?? 1,
|
|
100
|
+
...(args.report ? { report: args.report } : {}),
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
failed(args: {
|
|
104
|
+
reference: string;
|
|
105
|
+
errorCode: string;
|
|
106
|
+
report?: PaymentReturnReport;
|
|
107
|
+
attempt?: number;
|
|
108
|
+
}): HostedFlowState {
|
|
109
|
+
return {
|
|
110
|
+
phase: 'failed',
|
|
111
|
+
reference: args.reference,
|
|
112
|
+
errorCode: args.errorCode,
|
|
113
|
+
attempt: args.attempt ?? 1,
|
|
114
|
+
...(args.report ? { report: args.report } : {}),
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
cancelled(reference: string, attempt = 1): HostedFlowState {
|
|
118
|
+
return { phase: 'cancelled', reference, attempt };
|
|
119
|
+
},
|
|
120
|
+
abandoned(reference: string, attempt = 1): HostedFlowState {
|
|
121
|
+
return { phase: 'abandoned', reference, attempt };
|
|
122
|
+
},
|
|
123
|
+
} as const;
|
package/src/index.ts
CHANGED
|
@@ -4,110 +4,41 @@ export { SDK_VERSION } from './version';
|
|
|
4
4
|
|
|
5
5
|
export * from './public';
|
|
6
6
|
|
|
7
|
-
// Errors
|
|
8
|
-
export { PaymentApiError, isPaymentApiError } from './core/errors/payment-api-error';
|
|
9
|
-
|
|
10
|
-
// Models (camelCase SDK shapes)
|
|
11
|
-
export type {
|
|
12
|
-
CreatePaymentRequestInput,
|
|
13
|
-
AmountDto,
|
|
14
|
-
PaymentInstructions,
|
|
15
|
-
PaymentScheduleEntry,
|
|
16
|
-
PeriodicSchedule,
|
|
17
|
-
PeriodicControls,
|
|
18
|
-
CurrencyRequest,
|
|
19
|
-
LinkSessionResponse,
|
|
20
|
-
ConsentResponse,
|
|
21
|
-
LinkStatusResponse,
|
|
22
|
-
CopResponse,
|
|
23
|
-
TelemetryResponse,
|
|
24
|
-
PatchTokenResponse,
|
|
25
|
-
ProviderCountry,
|
|
26
|
-
ProviderSummary,
|
|
27
|
-
PendingSessionRecord,
|
|
28
|
-
} from './core/models';
|
|
29
|
-
|
|
30
7
|
// Bank-return URI helpers (handy for hosts implementing their own deep-link
|
|
31
8
|
// router that needs to know whether a URI belongs to the payment flow).
|
|
32
9
|
export {
|
|
10
|
+
type PaymentReturnReport,
|
|
33
11
|
isPaymentReturnCallbackUri,
|
|
12
|
+
readPaymentReturn,
|
|
34
13
|
extractPaymentReturnErrorCode,
|
|
14
|
+
extractPaymentReturnErrorDescription,
|
|
15
|
+
extractPaymentReturnErrorReason,
|
|
16
|
+
extractPaymentReturnPaymentId,
|
|
17
|
+
extractPaymentReturnMandateId,
|
|
18
|
+
extractPaymentReturnReference,
|
|
19
|
+
extractPaymentReturnMerchantRef,
|
|
20
|
+
extractPaymentReturnSignature,
|
|
21
|
+
isPaymentReturnSuccess,
|
|
22
|
+
paymentReturnParams,
|
|
35
23
|
} from './core/models/payment-return-params';
|
|
36
24
|
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
type PaymentFlowControllerOptions,
|
|
44
|
-
type Clock,
|
|
45
|
-
} from './core/services/payment-flow-controller';
|
|
46
|
-
export {
|
|
47
|
-
PaymentFlowStates,
|
|
48
|
-
type PaymentFlowPhase,
|
|
49
|
-
type PaymentFlowState,
|
|
50
|
-
} from './core/services/payment-flow-state';
|
|
25
|
+
// Types a caller reads off a result or a state, without the machinery that
|
|
26
|
+
// produces them. The orchestration internals — the controller, the raw webview,
|
|
27
|
+
// the phase hook, the individual screens — are deliberately not exported: they
|
|
28
|
+
// are how `SpareLinkHost` is built, not a surface anyone should build against,
|
|
29
|
+
// and exporting them makes every internal rename a breaking change.
|
|
30
|
+
export type { HostedFlowPhase, HostedFlowState } from './core/services/hosted-flow-state';
|
|
51
31
|
|
|
52
32
|
// Storage interface
|
|
53
33
|
export type { PendingSessionStore } from './core/services/pending-session-store';
|
|
34
|
+
export type { PendingSessionRecord } from './core/models';
|
|
54
35
|
|
|
55
|
-
//
|
|
56
|
-
export {
|
|
57
|
-
presentConsent,
|
|
58
|
-
summaryFromState,
|
|
59
|
-
formatAmount,
|
|
60
|
-
formatCop,
|
|
61
|
-
type ConsentSummaryData,
|
|
62
|
-
type SinglePaymentSummaryData,
|
|
63
|
-
type InternationalPaymentSummaryData,
|
|
64
|
-
type MultiPaymentSummaryData,
|
|
65
|
-
type ConsentDisplayData,
|
|
66
|
-
type CopDisplayData,
|
|
67
|
-
type CopMatchIndicator,
|
|
68
|
-
} from './core/services/consent-presenter';
|
|
69
|
-
|
|
70
|
-
export {
|
|
71
|
-
buildMultiPaymentRules,
|
|
72
|
-
rulesSectionTitle,
|
|
73
|
-
type LabelValueRow,
|
|
74
|
-
} from './core/services/multi-payment-rules-presenter';
|
|
75
|
-
|
|
76
|
-
export {
|
|
77
|
-
isMultiPayment,
|
|
78
|
-
isInternational,
|
|
79
|
-
supportsConfirmationOfPayee,
|
|
80
|
-
resolvedPaymentType,
|
|
81
|
-
consentUiVariant,
|
|
82
|
-
PaymentType,
|
|
83
|
-
type ConsentUiVariant,
|
|
84
|
-
} from './core/models/payment-type';
|
|
85
|
-
|
|
86
|
-
// UI surface
|
|
87
|
-
export {
|
|
88
|
-
SpareLinkHost,
|
|
89
|
-
type SpareLinkHostProps,
|
|
90
|
-
} from './ui/spare-link-host';
|
|
91
|
-
export { PaymentFlowPage, type PaymentFlowPageProps } from './ui/payment-flow-page';
|
|
92
|
-
export { usePaymentFlowState } from './ui/hooks/use-payment-flow-state';
|
|
93
|
-
export {
|
|
94
|
-
BankSelectionScreen,
|
|
95
|
-
type BankSelectionScreenProps,
|
|
96
|
-
ConsentDetailsScreen,
|
|
97
|
-
type ConsentDetailsScreenProps,
|
|
98
|
-
RedirectHandoffScreen,
|
|
99
|
-
ResumeProcessingScreen,
|
|
100
|
-
type ResumeProcessingScreenProps,
|
|
101
|
-
ResultScreen,
|
|
102
|
-
type ResultScreenProps,
|
|
103
|
-
MandateSetupSuccessScreen,
|
|
104
|
-
type MandateSetupSuccessScreenProps,
|
|
105
|
-
} from './ui/screens';
|
|
36
|
+
// UI surface: one component to mount, and the theme to match it.
|
|
37
|
+
export { SpareLinkHost, type SpareLinkHostProps } from './ui/spare-link-host';
|
|
106
38
|
export { Colors, Typography, Spacing, FONT_FAMILY } from './ui/theme';
|
|
107
39
|
|
|
108
40
|
// Native platform integration
|
|
109
41
|
export {
|
|
110
|
-
collectTelemetry,
|
|
111
42
|
launchBankRedirect,
|
|
112
43
|
type BankRedirectArgs,
|
|
113
44
|
SecureStorePendingSessionStore,
|