@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.
Files changed (561) hide show
  1. package/README.md +119 -81
  2. package/lib/commonjs/core/models/payment-return-params.js +245 -20
  3. package/lib/commonjs/core/models/payment-return-params.js.map +1 -1
  4. package/lib/commonjs/core/models/pending-session-record.js +2 -0
  5. package/lib/commonjs/core/models/pending-session-record.js.map +1 -0
  6. package/lib/commonjs/core/services/hosted-flow-controller.js +333 -0
  7. package/lib/commonjs/core/services/hosted-flow-controller.js.map +1 -0
  8. package/lib/commonjs/core/services/hosted-flow-state.js +96 -0
  9. package/lib/commonjs/core/services/hosted-flow-state.js.map +1 -0
  10. package/lib/commonjs/index.js +42 -164
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/internal/hosted/bridge-message.js +107 -0
  13. package/lib/commonjs/internal/hosted/bridge-message.js.map +1 -0
  14. package/lib/commonjs/internal/hosted/hosted-url.js +41 -0
  15. package/lib/commonjs/internal/hosted/hosted-url.js.map +1 -0
  16. package/lib/commonjs/internal/index.js +0 -7
  17. package/lib/commonjs/internal/index.js.map +1 -1
  18. package/lib/commonjs/internal/redact-uri.js +59 -15
  19. package/lib/commonjs/internal/redact-uri.js.map +1 -1
  20. package/lib/commonjs/internal/secure-store-pending-session-store.js +20 -25
  21. package/lib/commonjs/internal/secure-store-pending-session-store.js.map +1 -1
  22. package/lib/commonjs/internal/url-parts.js +145 -0
  23. package/lib/commonjs/internal/url-parts.js.map +1 -0
  24. package/lib/commonjs/public/index.js +0 -37
  25. package/lib/commonjs/public/index.js.map +1 -1
  26. package/lib/commonjs/public/payment-result.js +16 -4
  27. package/lib/commonjs/public/payment-result.js.map +1 -1
  28. package/lib/commonjs/public/recovery-result.js +7 -18
  29. package/lib/commonjs/public/recovery-result.js.map +1 -1
  30. package/lib/commonjs/public/spare-link-config.js +41 -16
  31. package/lib/commonjs/public/spare-link-config.js.map +1 -1
  32. package/lib/commonjs/public/spare-link-event.js +27 -33
  33. package/lib/commonjs/public/spare-link-event.js.map +1 -1
  34. package/lib/commonjs/public/spare-link-instance.js +67 -77
  35. package/lib/commonjs/public/spare-link-instance.js.map +1 -1
  36. package/lib/commonjs/public/spare-link-session.js +2 -9
  37. package/lib/commonjs/public/spare-link-session.js.map +1 -1
  38. package/lib/commonjs/public/spare-link.js +0 -12
  39. package/lib/commonjs/public/spare-link.js.map +1 -1
  40. package/lib/commonjs/ui/hooks/{use-payment-flow-state.js → use-hosted-flow-state.js} +4 -4
  41. package/lib/commonjs/ui/hooks/use-hosted-flow-state.js.map +1 -0
  42. package/lib/commonjs/ui/hosted/hosted-payment-page.js +177 -0
  43. package/lib/commonjs/ui/hosted/hosted-payment-page.js.map +1 -0
  44. package/lib/commonjs/ui/hosted/hosted-payment-webview.js +168 -0
  45. package/lib/commonjs/ui/hosted/hosted-payment-webview.js.map +1 -0
  46. package/lib/commonjs/ui/screens/index.js +3 -17
  47. package/lib/commonjs/ui/screens/index.js.map +1 -1
  48. package/lib/commonjs/ui/screens/page-unavailable-screen.js +101 -0
  49. package/lib/commonjs/ui/screens/page-unavailable-screen.js.map +1 -0
  50. package/lib/commonjs/ui/spare-link-host.js +220 -234
  51. package/lib/commonjs/ui/spare-link-host.js.map +1 -1
  52. package/lib/commonjs/ui/widgets/index.js +3 -10
  53. package/lib/commonjs/ui/widgets/index.js.map +1 -1
  54. package/lib/commonjs/version.js +7 -5
  55. package/lib/commonjs/version.js.map +1 -1
  56. package/lib/module/core/models/payment-return-params.js +235 -20
  57. package/lib/module/core/models/payment-return-params.js.map +1 -1
  58. package/lib/module/core/models/pending-session-record.js +2 -0
  59. package/lib/module/core/models/pending-session-record.js.map +1 -0
  60. package/lib/module/core/services/hosted-flow-controller.js +328 -0
  61. package/lib/module/core/services/hosted-flow-controller.js.map +1 -0
  62. package/lib/module/core/services/hosted-flow-state.js +91 -0
  63. package/lib/module/core/services/hosted-flow-state.js.map +1 -0
  64. package/lib/module/index.js +8 -22
  65. package/lib/module/index.js.map +1 -1
  66. package/lib/module/internal/hosted/bridge-message.js +104 -0
  67. package/lib/module/internal/hosted/bridge-message.js.map +1 -0
  68. package/lib/module/internal/hosted/hosted-url.js +36 -0
  69. package/lib/module/internal/hosted/hosted-url.js.map +1 -0
  70. package/lib/module/internal/index.js +0 -1
  71. package/lib/module/internal/index.js.map +1 -1
  72. package/lib/module/internal/redact-uri.js +59 -15
  73. package/lib/module/internal/redact-uri.js.map +1 -1
  74. package/lib/module/internal/secure-store-pending-session-store.js +20 -25
  75. package/lib/module/internal/secure-store-pending-session-store.js.map +1 -1
  76. package/lib/module/internal/url-parts.js +139 -0
  77. package/lib/module/internal/url-parts.js.map +1 -0
  78. package/lib/module/public/index.js +2 -3
  79. package/lib/module/public/index.js.map +1 -1
  80. package/lib/module/public/payment-result.js +16 -4
  81. package/lib/module/public/payment-result.js.map +1 -1
  82. package/lib/module/public/recovery-result.js +7 -17
  83. package/lib/module/public/recovery-result.js.map +1 -1
  84. package/lib/module/public/spare-link-config.js +42 -15
  85. package/lib/module/public/spare-link-config.js.map +1 -1
  86. package/lib/module/public/spare-link-event.js +27 -33
  87. package/lib/module/public/spare-link-event.js.map +1 -1
  88. package/lib/module/public/spare-link-instance.js +68 -72
  89. package/lib/module/public/spare-link-instance.js.map +1 -1
  90. package/lib/module/public/spare-link-session.js +2 -9
  91. package/lib/module/public/spare-link-session.js.map +1 -1
  92. package/lib/module/public/spare-link.js +1 -1
  93. package/lib/module/public/spare-link.js.map +1 -1
  94. package/lib/module/ui/hooks/{use-payment-flow-state.js → use-hosted-flow-state.js} +3 -3
  95. package/lib/module/ui/hooks/use-hosted-flow-state.js.map +1 -0
  96. package/lib/module/ui/hosted/hosted-payment-page.js +175 -0
  97. package/lib/module/ui/hosted/hosted-payment-page.js.map +1 -0
  98. package/lib/module/ui/hosted/hosted-payment-webview.js +163 -0
  99. package/lib/module/ui/hosted/hosted-payment-webview.js.map +1 -0
  100. package/lib/module/ui/screens/index.js +1 -3
  101. package/lib/module/ui/screens/index.js.map +1 -1
  102. package/lib/module/ui/screens/page-unavailable-screen.js +97 -0
  103. package/lib/module/ui/screens/page-unavailable-screen.js.map +1 -0
  104. package/lib/module/ui/spare-link-host.js +221 -236
  105. package/lib/module/ui/spare-link-host.js.map +1 -1
  106. package/lib/module/ui/widgets/index.js +1 -2
  107. package/lib/module/ui/widgets/index.js.map +1 -1
  108. package/lib/module/version.js +7 -5
  109. package/lib/module/version.js.map +1 -1
  110. package/lib/typescript/commonjs/core/models/index.d.ts +1 -123
  111. package/lib/typescript/commonjs/core/models/index.d.ts.map +1 -1
  112. package/lib/typescript/commonjs/core/models/payment-return-params.d.ts +91 -8
  113. package/lib/typescript/commonjs/core/models/payment-return-params.d.ts.map +1 -1
  114. package/lib/typescript/commonjs/core/models/pending-session-record.d.ts +11 -0
  115. package/lib/typescript/commonjs/core/models/pending-session-record.d.ts.map +1 -0
  116. package/lib/typescript/commonjs/core/services/hosted-flow-controller.d.ts +119 -0
  117. package/lib/typescript/commonjs/core/services/hosted-flow-controller.d.ts.map +1 -0
  118. package/lib/typescript/commonjs/core/services/hosted-flow-state.d.ts +75 -0
  119. package/lib/typescript/commonjs/core/services/hosted-flow-state.d.ts.map +1 -0
  120. package/lib/typescript/commonjs/index.d.ts +5 -14
  121. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/internal/hosted/bridge-message.d.ts +44 -0
  123. package/lib/typescript/commonjs/internal/hosted/bridge-message.d.ts.map +1 -0
  124. package/lib/typescript/commonjs/internal/hosted/hosted-url.d.ts +30 -0
  125. package/lib/typescript/commonjs/internal/hosted/hosted-url.d.ts.map +1 -0
  126. package/lib/typescript/commonjs/internal/index.d.ts +0 -1
  127. package/lib/typescript/commonjs/internal/index.d.ts.map +1 -1
  128. package/lib/typescript/commonjs/internal/redact-uri.d.ts +21 -1
  129. package/lib/typescript/commonjs/internal/redact-uri.d.ts.map +1 -1
  130. package/lib/typescript/commonjs/internal/secure-store-pending-session-store.d.ts +3 -2
  131. package/lib/typescript/commonjs/internal/secure-store-pending-session-store.d.ts.map +1 -1
  132. package/lib/typescript/commonjs/internal/url-parts.d.ts +46 -0
  133. package/lib/typescript/commonjs/internal/url-parts.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/public/index.d.ts +4 -6
  135. package/lib/typescript/commonjs/public/index.d.ts.map +1 -1
  136. package/lib/typescript/commonjs/public/payment-result.d.ts +50 -12
  137. package/lib/typescript/commonjs/public/payment-result.d.ts.map +1 -1
  138. package/lib/typescript/commonjs/public/recovery-result.d.ts +11 -20
  139. package/lib/typescript/commonjs/public/recovery-result.d.ts.map +1 -1
  140. package/lib/typescript/commonjs/public/spare-link-config.d.ts +13 -31
  141. package/lib/typescript/commonjs/public/spare-link-config.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/public/spare-link-event.d.ts +29 -31
  143. package/lib/typescript/commonjs/public/spare-link-event.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/public/spare-link-host-api.d.ts +1 -12
  145. package/lib/typescript/commonjs/public/spare-link-host-api.d.ts.map +1 -1
  146. package/lib/typescript/commonjs/public/spare-link-instance.d.ts +26 -20
  147. package/lib/typescript/commonjs/public/spare-link-instance.d.ts.map +1 -1
  148. package/lib/typescript/commonjs/public/spare-link-session.d.ts +3 -8
  149. package/lib/typescript/commonjs/public/spare-link-session.d.ts.map +1 -1
  150. package/lib/typescript/commonjs/public/spare-link.d.ts +1 -1
  151. package/lib/typescript/commonjs/public/spare-link.d.ts.map +1 -1
  152. package/lib/typescript/commonjs/ui/hooks/use-hosted-flow-state.d.ts +9 -0
  153. package/lib/typescript/commonjs/ui/hooks/use-hosted-flow-state.d.ts.map +1 -0
  154. package/lib/typescript/commonjs/ui/hosted/hosted-payment-page.d.ts +17 -0
  155. package/lib/typescript/commonjs/ui/hosted/hosted-payment-page.d.ts.map +1 -0
  156. package/lib/typescript/commonjs/ui/hosted/hosted-payment-webview.d.ts +43 -0
  157. package/lib/typescript/commonjs/ui/hosted/hosted-payment-webview.d.ts.map +1 -0
  158. package/lib/typescript/commonjs/ui/screens/index.d.ts +1 -3
  159. package/lib/typescript/commonjs/ui/screens/index.d.ts.map +1 -1
  160. package/lib/typescript/commonjs/ui/screens/page-unavailable-screen.d.ts +18 -0
  161. package/lib/typescript/commonjs/ui/screens/page-unavailable-screen.d.ts.map +1 -0
  162. package/lib/typescript/commonjs/ui/spare-link-host.d.ts +4 -5
  163. package/lib/typescript/commonjs/ui/spare-link-host.d.ts.map +1 -1
  164. package/lib/typescript/commonjs/ui/widgets/index.d.ts +1 -2
  165. package/lib/typescript/commonjs/ui/widgets/index.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/version.d.ts +7 -5
  167. package/lib/typescript/commonjs/version.d.ts.map +1 -1
  168. package/lib/typescript/module/core/models/index.d.ts +1 -123
  169. package/lib/typescript/module/core/models/index.d.ts.map +1 -1
  170. package/lib/typescript/module/core/models/payment-return-params.d.ts +91 -8
  171. package/lib/typescript/module/core/models/payment-return-params.d.ts.map +1 -1
  172. package/lib/typescript/module/core/models/pending-session-record.d.ts +11 -0
  173. package/lib/typescript/module/core/models/pending-session-record.d.ts.map +1 -0
  174. package/lib/typescript/module/core/services/hosted-flow-controller.d.ts +119 -0
  175. package/lib/typescript/module/core/services/hosted-flow-controller.d.ts.map +1 -0
  176. package/lib/typescript/module/core/services/hosted-flow-state.d.ts +75 -0
  177. package/lib/typescript/module/core/services/hosted-flow-state.d.ts.map +1 -0
  178. package/lib/typescript/module/index.d.ts +5 -14
  179. package/lib/typescript/module/index.d.ts.map +1 -1
  180. package/lib/typescript/module/internal/hosted/bridge-message.d.ts +44 -0
  181. package/lib/typescript/module/internal/hosted/bridge-message.d.ts.map +1 -0
  182. package/lib/typescript/module/internal/hosted/hosted-url.d.ts +30 -0
  183. package/lib/typescript/module/internal/hosted/hosted-url.d.ts.map +1 -0
  184. package/lib/typescript/module/internal/index.d.ts +0 -1
  185. package/lib/typescript/module/internal/index.d.ts.map +1 -1
  186. package/lib/typescript/module/internal/redact-uri.d.ts +21 -1
  187. package/lib/typescript/module/internal/redact-uri.d.ts.map +1 -1
  188. package/lib/typescript/module/internal/secure-store-pending-session-store.d.ts +3 -2
  189. package/lib/typescript/module/internal/secure-store-pending-session-store.d.ts.map +1 -1
  190. package/lib/typescript/module/internal/url-parts.d.ts +46 -0
  191. package/lib/typescript/module/internal/url-parts.d.ts.map +1 -0
  192. package/lib/typescript/module/public/index.d.ts +4 -6
  193. package/lib/typescript/module/public/index.d.ts.map +1 -1
  194. package/lib/typescript/module/public/payment-result.d.ts +50 -12
  195. package/lib/typescript/module/public/payment-result.d.ts.map +1 -1
  196. package/lib/typescript/module/public/recovery-result.d.ts +11 -20
  197. package/lib/typescript/module/public/recovery-result.d.ts.map +1 -1
  198. package/lib/typescript/module/public/spare-link-config.d.ts +13 -31
  199. package/lib/typescript/module/public/spare-link-config.d.ts.map +1 -1
  200. package/lib/typescript/module/public/spare-link-event.d.ts +29 -31
  201. package/lib/typescript/module/public/spare-link-event.d.ts.map +1 -1
  202. package/lib/typescript/module/public/spare-link-host-api.d.ts +1 -12
  203. package/lib/typescript/module/public/spare-link-host-api.d.ts.map +1 -1
  204. package/lib/typescript/module/public/spare-link-instance.d.ts +26 -20
  205. package/lib/typescript/module/public/spare-link-instance.d.ts.map +1 -1
  206. package/lib/typescript/module/public/spare-link-session.d.ts +3 -8
  207. package/lib/typescript/module/public/spare-link-session.d.ts.map +1 -1
  208. package/lib/typescript/module/public/spare-link.d.ts +1 -1
  209. package/lib/typescript/module/public/spare-link.d.ts.map +1 -1
  210. package/lib/typescript/module/ui/hooks/use-hosted-flow-state.d.ts +9 -0
  211. package/lib/typescript/module/ui/hooks/use-hosted-flow-state.d.ts.map +1 -0
  212. package/lib/typescript/module/ui/hosted/hosted-payment-page.d.ts +17 -0
  213. package/lib/typescript/module/ui/hosted/hosted-payment-page.d.ts.map +1 -0
  214. package/lib/typescript/module/ui/hosted/hosted-payment-webview.d.ts +43 -0
  215. package/lib/typescript/module/ui/hosted/hosted-payment-webview.d.ts.map +1 -0
  216. package/lib/typescript/module/ui/screens/index.d.ts +1 -3
  217. package/lib/typescript/module/ui/screens/index.d.ts.map +1 -1
  218. package/lib/typescript/module/ui/screens/page-unavailable-screen.d.ts +18 -0
  219. package/lib/typescript/module/ui/screens/page-unavailable-screen.d.ts.map +1 -0
  220. package/lib/typescript/module/ui/spare-link-host.d.ts +4 -5
  221. package/lib/typescript/module/ui/spare-link-host.d.ts.map +1 -1
  222. package/lib/typescript/module/ui/widgets/index.d.ts +1 -2
  223. package/lib/typescript/module/ui/widgets/index.d.ts.map +1 -1
  224. package/lib/typescript/module/version.d.ts +7 -5
  225. package/lib/typescript/module/version.d.ts.map +1 -1
  226. package/package.json +24 -23
  227. package/plugins/with-spare-link.js +6 -26
  228. package/src/core/models/index.ts +1 -139
  229. package/src/core/models/payment-return-params.ts +269 -21
  230. package/src/core/models/pending-session-record.ts +10 -0
  231. package/src/core/services/hosted-flow-controller.ts +374 -0
  232. package/src/core/services/hosted-flow-state.ts +123 -0
  233. package/src/index.ts +20 -89
  234. package/src/internal/hosted/bridge-message.ts +106 -0
  235. package/src/internal/hosted/hosted-url.ts +33 -0
  236. package/src/internal/index.ts +0 -1
  237. package/src/internal/redact-uri.ts +69 -15
  238. package/src/internal/secure-store-pending-session-store.ts +28 -49
  239. package/src/internal/url-parts.ts +134 -0
  240. package/src/public/index.ts +2 -24
  241. package/src/public/payment-result.ts +50 -12
  242. package/src/public/recovery-result.ts +16 -25
  243. package/src/public/spare-link-config.ts +56 -43
  244. package/src/public/spare-link-event.ts +33 -42
  245. package/src/public/spare-link-host-api.ts +1 -14
  246. package/src/public/spare-link-instance.ts +57 -65
  247. package/src/public/spare-link-session.ts +4 -16
  248. package/src/public/spare-link.ts +1 -1
  249. package/src/ui/hooks/use-hosted-flow-state.ts +16 -0
  250. package/src/ui/hosted/hosted-payment-page.tsx +178 -0
  251. package/src/ui/hosted/hosted-payment-webview.tsx +164 -0
  252. package/src/ui/screens/index.ts +4 -6
  253. package/src/ui/screens/page-unavailable-screen.tsx +94 -0
  254. package/src/ui/spare-link-host.tsx +227 -247
  255. package/src/ui/widgets/index.ts +1 -2
  256. package/src/version.ts +7 -5
  257. package/CHANGELOG.md +0 -66
  258. package/lib/commonjs/core/client/link-api-client.js +0 -297
  259. package/lib/commonjs/core/client/link-api-client.js.map +0 -1
  260. package/lib/commonjs/core/errors/payment-api-error.js +0 -35
  261. package/lib/commonjs/core/errors/payment-api-error.js.map +0 -1
  262. package/lib/commonjs/core/models/link-session-status.js +0 -14
  263. package/lib/commonjs/core/models/link-session-status.js.map +0 -1
  264. package/lib/commonjs/core/models/payment-type.js +0 -45
  265. package/lib/commonjs/core/models/payment-type.js.map +0 -1
  266. package/lib/commonjs/core/models/wire-mappers.js +0 -277
  267. package/lib/commonjs/core/models/wire-mappers.js.map +0 -1
  268. package/lib/commonjs/core/services/consent-presenter.js +0 -150
  269. package/lib/commonjs/core/services/consent-presenter.js.map +0 -1
  270. package/lib/commonjs/core/services/execute-resume-if-needed.js +0 -216
  271. package/lib/commonjs/core/services/execute-resume-if-needed.js.map +0 -1
  272. package/lib/commonjs/core/services/multi-payment-rules-presenter.js +0 -151
  273. package/lib/commonjs/core/services/multi-payment-rules-presenter.js.map +0 -1
  274. package/lib/commonjs/core/services/payment-flow-controller.js +0 -547
  275. package/lib/commonjs/core/services/payment-flow-controller.js.map +0 -1
  276. package/lib/commonjs/core/services/payment-flow-state.js +0 -110
  277. package/lib/commonjs/core/services/payment-flow-state.js.map +0 -1
  278. package/lib/commonjs/core/services/payment-result-mapper.js +0 -49
  279. package/lib/commonjs/core/services/payment-result-mapper.js.map +0 -1
  280. package/lib/commonjs/core/services/presentation-utils.js +0 -11
  281. package/lib/commonjs/core/services/presentation-utils.js.map +0 -1
  282. package/lib/commonjs/core/services/redirect-buffer.js +0 -40
  283. package/lib/commonjs/core/services/redirect-buffer.js.map +0 -1
  284. package/lib/commonjs/core/services/user-friendly-messages.js +0 -46
  285. package/lib/commonjs/core/services/user-friendly-messages.js.map +0 -1
  286. package/lib/commonjs/internal/telemetry-collector.js +0 -80
  287. package/lib/commonjs/internal/telemetry-collector.js.map +0 -1
  288. package/lib/commonjs/public/constants.js +0 -21
  289. package/lib/commonjs/public/constants.js.map +0 -1
  290. package/lib/commonjs/public/spare-link-callbacks.js +0 -6
  291. package/lib/commonjs/public/spare-link-callbacks.js.map +0 -1
  292. package/lib/commonjs/ui/consent/charge-bearer-display.js +0 -99
  293. package/lib/commonjs/ui/consent/charge-bearer-display.js.map +0 -1
  294. package/lib/commonjs/ui/consent/consent-accordion.js +0 -94
  295. package/lib/commonjs/ui/consent/consent-accordion.js.map +0 -1
  296. package/lib/commonjs/ui/consent/consent-summary-section.js +0 -27
  297. package/lib/commonjs/ui/consent/consent-summary-section.js.map +0 -1
  298. package/lib/commonjs/ui/consent/cop-information.js +0 -168
  299. package/lib/commonjs/ui/consent/cop-information.js.map +0 -1
  300. package/lib/commonjs/ui/consent/international-payment-summary.js +0 -98
  301. package/lib/commonjs/ui/consent/international-payment-summary.js.map +0 -1
  302. package/lib/commonjs/ui/consent/label-value-rows.js +0 -59
  303. package/lib/commonjs/ui/consent/label-value-rows.js.map +0 -1
  304. package/lib/commonjs/ui/consent/multi-payment-rules-list.js +0 -130
  305. package/lib/commonjs/ui/consent/multi-payment-rules-list.js.map +0 -1
  306. package/lib/commonjs/ui/consent/multi-payment-summary.js +0 -99
  307. package/lib/commonjs/ui/consent/multi-payment-summary.js.map +0 -1
  308. package/lib/commonjs/ui/consent/single-payment-summary.js +0 -158
  309. package/lib/commonjs/ui/consent/single-payment-summary.js.map +0 -1
  310. package/lib/commonjs/ui/consent/terms-link.js +0 -35
  311. package/lib/commonjs/ui/consent/terms-link.js.map +0 -1
  312. package/lib/commonjs/ui/hooks/use-payment-flow-state.js.map +0 -1
  313. package/lib/commonjs/ui/payment-flow-page.js +0 -235
  314. package/lib/commonjs/ui/payment-flow-page.js.map +0 -1
  315. package/lib/commonjs/ui/screens/bank-selection-screen.js +0 -215
  316. package/lib/commonjs/ui/screens/bank-selection-screen.js.map +0 -1
  317. package/lib/commonjs/ui/screens/consent-details-screen.js +0 -124
  318. package/lib/commonjs/ui/screens/consent-details-screen.js.map +0 -1
  319. package/lib/commonjs/ui/screens/mandate-setup-success-screen.js +0 -79
  320. package/lib/commonjs/ui/screens/mandate-setup-success-screen.js.map +0 -1
  321. package/lib/commonjs/ui/widgets/layout-w-header.js +0 -106
  322. package/lib/commonjs/ui/widgets/layout-w-header.js.map +0 -1
  323. package/lib/commonjs/ui/widgets/stepper.js +0 -124
  324. package/lib/commonjs/ui/widgets/stepper.js.map +0 -1
  325. package/lib/module/core/client/link-api-client.js +0 -292
  326. package/lib/module/core/client/link-api-client.js.map +0 -1
  327. package/lib/module/core/errors/payment-api-error.js +0 -29
  328. package/lib/module/core/errors/payment-api-error.js.map +0 -1
  329. package/lib/module/core/models/link-session-status.js +0 -10
  330. package/lib/module/core/models/link-session-status.js.map +0 -1
  331. package/lib/module/core/models/payment-type.js +0 -36
  332. package/lib/module/core/models/payment-type.js.map +0 -1
  333. package/lib/module/core/models/wire-mappers.js +0 -263
  334. package/lib/module/core/models/wire-mappers.js.map +0 -1
  335. package/lib/module/core/services/consent-presenter.js +0 -140
  336. package/lib/module/core/services/consent-presenter.js.map +0 -1
  337. package/lib/module/core/services/execute-resume-if-needed.js +0 -211
  338. package/lib/module/core/services/execute-resume-if-needed.js.map +0 -1
  339. package/lib/module/core/services/multi-payment-rules-presenter.js +0 -146
  340. package/lib/module/core/services/multi-payment-rules-presenter.js.map +0 -1
  341. package/lib/module/core/services/payment-flow-controller.js +0 -544
  342. package/lib/module/core/services/payment-flow-controller.js.map +0 -1
  343. package/lib/module/core/services/payment-flow-state.js +0 -106
  344. package/lib/module/core/services/payment-flow-state.js.map +0 -1
  345. package/lib/module/core/services/payment-result-mapper.js +0 -45
  346. package/lib/module/core/services/payment-result-mapper.js.map +0 -1
  347. package/lib/module/core/services/presentation-utils.js +0 -7
  348. package/lib/module/core/services/presentation-utils.js.map +0 -1
  349. package/lib/module/core/services/redirect-buffer.js +0 -33
  350. package/lib/module/core/services/redirect-buffer.js.map +0 -1
  351. package/lib/module/core/services/user-friendly-messages.js +0 -42
  352. package/lib/module/core/services/user-friendly-messages.js.map +0 -1
  353. package/lib/module/internal/telemetry-collector.js +0 -75
  354. package/lib/module/internal/telemetry-collector.js.map +0 -1
  355. package/lib/module/public/constants.js +0 -17
  356. package/lib/module/public/constants.js.map +0 -1
  357. package/lib/module/public/spare-link-callbacks.js +0 -4
  358. package/lib/module/public/spare-link-callbacks.js.map +0 -1
  359. package/lib/module/ui/consent/charge-bearer-display.js +0 -95
  360. package/lib/module/ui/consent/charge-bearer-display.js.map +0 -1
  361. package/lib/module/ui/consent/consent-accordion.js +0 -90
  362. package/lib/module/ui/consent/consent-accordion.js.map +0 -1
  363. package/lib/module/ui/consent/consent-summary-section.js +0 -23
  364. package/lib/module/ui/consent/consent-summary-section.js.map +0 -1
  365. package/lib/module/ui/consent/cop-information.js +0 -165
  366. package/lib/module/ui/consent/cop-information.js.map +0 -1
  367. package/lib/module/ui/consent/international-payment-summary.js +0 -94
  368. package/lib/module/ui/consent/international-payment-summary.js.map +0 -1
  369. package/lib/module/ui/consent/label-value-rows.js +0 -55
  370. package/lib/module/ui/consent/label-value-rows.js.map +0 -1
  371. package/lib/module/ui/consent/multi-payment-rules-list.js +0 -125
  372. package/lib/module/ui/consent/multi-payment-rules-list.js.map +0 -1
  373. package/lib/module/ui/consent/multi-payment-summary.js +0 -95
  374. package/lib/module/ui/consent/multi-payment-summary.js.map +0 -1
  375. package/lib/module/ui/consent/single-payment-summary.js +0 -154
  376. package/lib/module/ui/consent/single-payment-summary.js.map +0 -1
  377. package/lib/module/ui/consent/terms-link.js +0 -31
  378. package/lib/module/ui/consent/terms-link.js.map +0 -1
  379. package/lib/module/ui/hooks/use-payment-flow-state.js.map +0 -1
  380. package/lib/module/ui/payment-flow-page.js +0 -232
  381. package/lib/module/ui/payment-flow-page.js.map +0 -1
  382. package/lib/module/ui/screens/bank-selection-screen.js +0 -211
  383. package/lib/module/ui/screens/bank-selection-screen.js.map +0 -1
  384. package/lib/module/ui/screens/consent-details-screen.js +0 -120
  385. package/lib/module/ui/screens/consent-details-screen.js.map +0 -1
  386. package/lib/module/ui/screens/mandate-setup-success-screen.js +0 -75
  387. package/lib/module/ui/screens/mandate-setup-success-screen.js.map +0 -1
  388. package/lib/module/ui/widgets/layout-w-header.js +0 -102
  389. package/lib/module/ui/widgets/layout-w-header.js.map +0 -1
  390. package/lib/module/ui/widgets/stepper.js +0 -120
  391. package/lib/module/ui/widgets/stepper.js.map +0 -1
  392. package/lib/typescript/commonjs/core/client/link-api-client.d.ts +0 -70
  393. package/lib/typescript/commonjs/core/client/link-api-client.d.ts.map +0 -1
  394. package/lib/typescript/commonjs/core/errors/payment-api-error.d.ts +0 -15
  395. package/lib/typescript/commonjs/core/errors/payment-api-error.d.ts.map +0 -1
  396. package/lib/typescript/commonjs/core/models/link-session-status.d.ts +0 -6
  397. package/lib/typescript/commonjs/core/models/link-session-status.d.ts.map +0 -1
  398. package/lib/typescript/commonjs/core/models/payment-type.d.ts +0 -18
  399. package/lib/typescript/commonjs/core/models/payment-type.d.ts.map +0 -1
  400. package/lib/typescript/commonjs/core/models/wire-mappers.d.ts +0 -19
  401. package/lib/typescript/commonjs/core/models/wire-mappers.d.ts.map +0 -1
  402. package/lib/typescript/commonjs/core/services/consent-presenter.d.ts +0 -67
  403. package/lib/typescript/commonjs/core/services/consent-presenter.d.ts.map +0 -1
  404. package/lib/typescript/commonjs/core/services/execute-resume-if-needed.d.ts +0 -32
  405. package/lib/typescript/commonjs/core/services/execute-resume-if-needed.d.ts.map +0 -1
  406. package/lib/typescript/commonjs/core/services/multi-payment-rules-presenter.d.ts +0 -9
  407. package/lib/typescript/commonjs/core/services/multi-payment-rules-presenter.d.ts.map +0 -1
  408. package/lib/typescript/commonjs/core/services/payment-flow-controller.d.ts +0 -146
  409. package/lib/typescript/commonjs/core/services/payment-flow-controller.d.ts.map +0 -1
  410. package/lib/typescript/commonjs/core/services/payment-flow-state.d.ts +0 -64
  411. package/lib/typescript/commonjs/core/services/payment-flow-state.d.ts.map +0 -1
  412. package/lib/typescript/commonjs/core/services/payment-result-mapper.d.ts +0 -5
  413. package/lib/typescript/commonjs/core/services/payment-result-mapper.d.ts.map +0 -1
  414. package/lib/typescript/commonjs/core/services/presentation-utils.d.ts +0 -5
  415. package/lib/typescript/commonjs/core/services/presentation-utils.d.ts.map +0 -1
  416. package/lib/typescript/commonjs/core/services/redirect-buffer.d.ts +0 -6
  417. package/lib/typescript/commonjs/core/services/redirect-buffer.d.ts.map +0 -1
  418. package/lib/typescript/commonjs/core/services/user-friendly-messages.d.ts +0 -6
  419. package/lib/typescript/commonjs/core/services/user-friendly-messages.d.ts.map +0 -1
  420. package/lib/typescript/commonjs/internal/telemetry-collector.d.ts +0 -2
  421. package/lib/typescript/commonjs/internal/telemetry-collector.d.ts.map +0 -1
  422. package/lib/typescript/commonjs/public/constants.d.ts +0 -12
  423. package/lib/typescript/commonjs/public/constants.d.ts.map +0 -1
  424. package/lib/typescript/commonjs/public/spare-link-callbacks.d.ts +0 -14
  425. package/lib/typescript/commonjs/public/spare-link-callbacks.d.ts.map +0 -1
  426. package/lib/typescript/commonjs/ui/consent/charge-bearer-display.d.ts +0 -5
  427. package/lib/typescript/commonjs/ui/consent/charge-bearer-display.d.ts.map +0 -1
  428. package/lib/typescript/commonjs/ui/consent/consent-accordion.d.ts +0 -10
  429. package/lib/typescript/commonjs/ui/consent/consent-accordion.d.ts.map +0 -1
  430. package/lib/typescript/commonjs/ui/consent/consent-summary-section.d.ts +0 -6
  431. package/lib/typescript/commonjs/ui/consent/consent-summary-section.d.ts.map +0 -1
  432. package/lib/typescript/commonjs/ui/consent/cop-information.d.ts +0 -6
  433. package/lib/typescript/commonjs/ui/consent/cop-information.d.ts.map +0 -1
  434. package/lib/typescript/commonjs/ui/consent/international-payment-summary.d.ts +0 -6
  435. package/lib/typescript/commonjs/ui/consent/international-payment-summary.d.ts.map +0 -1
  436. package/lib/typescript/commonjs/ui/consent/label-value-rows.d.ts +0 -10
  437. package/lib/typescript/commonjs/ui/consent/label-value-rows.d.ts.map +0 -1
  438. package/lib/typescript/commonjs/ui/consent/multi-payment-rules-list.d.ts +0 -15
  439. package/lib/typescript/commonjs/ui/consent/multi-payment-rules-list.d.ts.map +0 -1
  440. package/lib/typescript/commonjs/ui/consent/multi-payment-summary.d.ts +0 -6
  441. package/lib/typescript/commonjs/ui/consent/multi-payment-summary.d.ts.map +0 -1
  442. package/lib/typescript/commonjs/ui/consent/single-payment-summary.d.ts +0 -6
  443. package/lib/typescript/commonjs/ui/consent/single-payment-summary.d.ts.map +0 -1
  444. package/lib/typescript/commonjs/ui/consent/terms-link.d.ts +0 -2
  445. package/lib/typescript/commonjs/ui/consent/terms-link.d.ts.map +0 -1
  446. package/lib/typescript/commonjs/ui/hooks/use-payment-flow-state.d.ts +0 -9
  447. package/lib/typescript/commonjs/ui/hooks/use-payment-flow-state.d.ts.map +0 -1
  448. package/lib/typescript/commonjs/ui/payment-flow-page.d.ts +0 -20
  449. package/lib/typescript/commonjs/ui/payment-flow-page.d.ts.map +0 -1
  450. package/lib/typescript/commonjs/ui/screens/bank-selection-screen.d.ts +0 -15
  451. package/lib/typescript/commonjs/ui/screens/bank-selection-screen.d.ts.map +0 -1
  452. package/lib/typescript/commonjs/ui/screens/consent-details-screen.d.ts +0 -13
  453. package/lib/typescript/commonjs/ui/screens/consent-details-screen.d.ts.map +0 -1
  454. package/lib/typescript/commonjs/ui/screens/mandate-setup-success-screen.d.ts +0 -10
  455. package/lib/typescript/commonjs/ui/screens/mandate-setup-success-screen.d.ts.map +0 -1
  456. package/lib/typescript/commonjs/ui/widgets/layout-w-header.d.ts +0 -20
  457. package/lib/typescript/commonjs/ui/widgets/layout-w-header.d.ts.map +0 -1
  458. package/lib/typescript/commonjs/ui/widgets/stepper.d.ts +0 -15
  459. package/lib/typescript/commonjs/ui/widgets/stepper.d.ts.map +0 -1
  460. package/lib/typescript/module/core/client/link-api-client.d.ts +0 -70
  461. package/lib/typescript/module/core/client/link-api-client.d.ts.map +0 -1
  462. package/lib/typescript/module/core/errors/payment-api-error.d.ts +0 -15
  463. package/lib/typescript/module/core/errors/payment-api-error.d.ts.map +0 -1
  464. package/lib/typescript/module/core/models/link-session-status.d.ts +0 -6
  465. package/lib/typescript/module/core/models/link-session-status.d.ts.map +0 -1
  466. package/lib/typescript/module/core/models/payment-type.d.ts +0 -18
  467. package/lib/typescript/module/core/models/payment-type.d.ts.map +0 -1
  468. package/lib/typescript/module/core/models/wire-mappers.d.ts +0 -19
  469. package/lib/typescript/module/core/models/wire-mappers.d.ts.map +0 -1
  470. package/lib/typescript/module/core/services/consent-presenter.d.ts +0 -67
  471. package/lib/typescript/module/core/services/consent-presenter.d.ts.map +0 -1
  472. package/lib/typescript/module/core/services/execute-resume-if-needed.d.ts +0 -32
  473. package/lib/typescript/module/core/services/execute-resume-if-needed.d.ts.map +0 -1
  474. package/lib/typescript/module/core/services/multi-payment-rules-presenter.d.ts +0 -9
  475. package/lib/typescript/module/core/services/multi-payment-rules-presenter.d.ts.map +0 -1
  476. package/lib/typescript/module/core/services/payment-flow-controller.d.ts +0 -146
  477. package/lib/typescript/module/core/services/payment-flow-controller.d.ts.map +0 -1
  478. package/lib/typescript/module/core/services/payment-flow-state.d.ts +0 -64
  479. package/lib/typescript/module/core/services/payment-flow-state.d.ts.map +0 -1
  480. package/lib/typescript/module/core/services/payment-result-mapper.d.ts +0 -5
  481. package/lib/typescript/module/core/services/payment-result-mapper.d.ts.map +0 -1
  482. package/lib/typescript/module/core/services/presentation-utils.d.ts +0 -5
  483. package/lib/typescript/module/core/services/presentation-utils.d.ts.map +0 -1
  484. package/lib/typescript/module/core/services/redirect-buffer.d.ts +0 -6
  485. package/lib/typescript/module/core/services/redirect-buffer.d.ts.map +0 -1
  486. package/lib/typescript/module/core/services/user-friendly-messages.d.ts +0 -6
  487. package/lib/typescript/module/core/services/user-friendly-messages.d.ts.map +0 -1
  488. package/lib/typescript/module/internal/telemetry-collector.d.ts +0 -2
  489. package/lib/typescript/module/internal/telemetry-collector.d.ts.map +0 -1
  490. package/lib/typescript/module/public/constants.d.ts +0 -12
  491. package/lib/typescript/module/public/constants.d.ts.map +0 -1
  492. package/lib/typescript/module/public/spare-link-callbacks.d.ts +0 -14
  493. package/lib/typescript/module/public/spare-link-callbacks.d.ts.map +0 -1
  494. package/lib/typescript/module/ui/consent/charge-bearer-display.d.ts +0 -5
  495. package/lib/typescript/module/ui/consent/charge-bearer-display.d.ts.map +0 -1
  496. package/lib/typescript/module/ui/consent/consent-accordion.d.ts +0 -10
  497. package/lib/typescript/module/ui/consent/consent-accordion.d.ts.map +0 -1
  498. package/lib/typescript/module/ui/consent/consent-summary-section.d.ts +0 -6
  499. package/lib/typescript/module/ui/consent/consent-summary-section.d.ts.map +0 -1
  500. package/lib/typescript/module/ui/consent/cop-information.d.ts +0 -6
  501. package/lib/typescript/module/ui/consent/cop-information.d.ts.map +0 -1
  502. package/lib/typescript/module/ui/consent/international-payment-summary.d.ts +0 -6
  503. package/lib/typescript/module/ui/consent/international-payment-summary.d.ts.map +0 -1
  504. package/lib/typescript/module/ui/consent/label-value-rows.d.ts +0 -10
  505. package/lib/typescript/module/ui/consent/label-value-rows.d.ts.map +0 -1
  506. package/lib/typescript/module/ui/consent/multi-payment-rules-list.d.ts +0 -15
  507. package/lib/typescript/module/ui/consent/multi-payment-rules-list.d.ts.map +0 -1
  508. package/lib/typescript/module/ui/consent/multi-payment-summary.d.ts +0 -6
  509. package/lib/typescript/module/ui/consent/multi-payment-summary.d.ts.map +0 -1
  510. package/lib/typescript/module/ui/consent/single-payment-summary.d.ts +0 -6
  511. package/lib/typescript/module/ui/consent/single-payment-summary.d.ts.map +0 -1
  512. package/lib/typescript/module/ui/consent/terms-link.d.ts +0 -2
  513. package/lib/typescript/module/ui/consent/terms-link.d.ts.map +0 -1
  514. package/lib/typescript/module/ui/hooks/use-payment-flow-state.d.ts +0 -9
  515. package/lib/typescript/module/ui/hooks/use-payment-flow-state.d.ts.map +0 -1
  516. package/lib/typescript/module/ui/payment-flow-page.d.ts +0 -20
  517. package/lib/typescript/module/ui/payment-flow-page.d.ts.map +0 -1
  518. package/lib/typescript/module/ui/screens/bank-selection-screen.d.ts +0 -15
  519. package/lib/typescript/module/ui/screens/bank-selection-screen.d.ts.map +0 -1
  520. package/lib/typescript/module/ui/screens/consent-details-screen.d.ts +0 -13
  521. package/lib/typescript/module/ui/screens/consent-details-screen.d.ts.map +0 -1
  522. package/lib/typescript/module/ui/screens/mandate-setup-success-screen.d.ts +0 -10
  523. package/lib/typescript/module/ui/screens/mandate-setup-success-screen.d.ts.map +0 -1
  524. package/lib/typescript/module/ui/widgets/layout-w-header.d.ts +0 -20
  525. package/lib/typescript/module/ui/widgets/layout-w-header.d.ts.map +0 -1
  526. package/lib/typescript/module/ui/widgets/stepper.d.ts +0 -15
  527. package/lib/typescript/module/ui/widgets/stepper.d.ts.map +0 -1
  528. package/src/core/client/link-api-client.ts +0 -414
  529. package/src/core/errors/payment-api-error.ts +0 -35
  530. package/src/core/models/link-session-status.ts +0 -7
  531. package/src/core/models/payment-type.ts +0 -54
  532. package/src/core/models/wire-mappers.ts +0 -315
  533. package/src/core/services/consent-presenter.ts +0 -213
  534. package/src/core/services/execute-resume-if-needed.ts +0 -243
  535. package/src/core/services/multi-payment-rules-presenter.ts +0 -158
  536. package/src/core/services/payment-flow-controller.ts +0 -607
  537. package/src/core/services/payment-flow-state.ts +0 -124
  538. package/src/core/services/payment-result-mapper.ts +0 -41
  539. package/src/core/services/presentation-utils.ts +0 -4
  540. package/src/core/services/redirect-buffer.ts +0 -34
  541. package/src/core/services/user-friendly-messages.ts +0 -39
  542. package/src/internal/telemetry-collector.ts +0 -90
  543. package/src/public/constants.ts +0 -14
  544. package/src/public/spare-link-callbacks.ts +0 -20
  545. package/src/ui/consent/charge-bearer-display.tsx +0 -68
  546. package/src/ui/consent/consent-accordion.tsx +0 -89
  547. package/src/ui/consent/consent-summary-section.tsx +0 -19
  548. package/src/ui/consent/cop-information.tsx +0 -121
  549. package/src/ui/consent/international-payment-summary.tsx +0 -83
  550. package/src/ui/consent/label-value-rows.tsx +0 -50
  551. package/src/ui/consent/multi-payment-rules-list.tsx +0 -138
  552. package/src/ui/consent/multi-payment-summary.tsx +0 -82
  553. package/src/ui/consent/single-payment-summary.tsx +0 -123
  554. package/src/ui/consent/terms-link.tsx +0 -27
  555. package/src/ui/hooks/use-payment-flow-state.ts +0 -16
  556. package/src/ui/payment-flow-page.tsx +0 -254
  557. package/src/ui/screens/bank-selection-screen.tsx +0 -209
  558. package/src/ui/screens/consent-details-screen.tsx +0 -106
  559. package/src/ui/screens/mandate-setup-success-screen.tsx +0 -72
  560. package/src/ui/widgets/layout-w-header.tsx +0 -89
  561. package/src/ui/widgets/stepper.tsx +0 -126
@@ -1,146 +0,0 @@
1
- "use strict";
2
-
3
- import { PaymentType } from "../models/payment-type.js";
4
- import { formatAmount } from "./presentation-utils.js";
5
- function present(value, fallback = '—') {
6
- const v = value?.trim();
7
- return v ? v : fallback;
8
- }
9
- function presentInt(value, fallback = '—') {
10
- if (value === undefined) return fallback;
11
- return String(value);
12
- }
13
- function formatDate(raw) {
14
- if (!raw?.trim()) return '—';
15
- const parsed = new Date(raw.trim());
16
- if (Number.isNaN(parsed.getTime())) return raw.trim();
17
- const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
18
- const day = String(parsed.getUTCDate()).padStart(2, '0');
19
- const month = months[parsed.getUTCMonth()];
20
- return `${day} ${month} ${parsed.getUTCFullYear()}`;
21
- }
22
- function definedSchedule(type, instructions) {
23
- const isFixed = type === PaymentType.fixedDefinedSchedule;
24
- const amountLabel = isFixed ? 'Amount' : 'Max Amount';
25
- const schedule = instructions.paymentSchedule ?? [];
26
- const rows = [];
27
- for (const entry of schedule) {
28
- const amountDto = isFixed ? entry.amount : entry.maxAmount;
29
- rows.push({
30
- label: amountLabel,
31
- value: formatAmount(amountDto)
32
- });
33
- rows.push({
34
- label: 'Date',
35
- value: formatDate(entry.paymentExecutionDate)
36
- });
37
- }
38
- return rows;
39
- }
40
- function periodicSchedule(type, instructions) {
41
- const isFixed = type === PaymentType.fixedPeriodicSchedule;
42
- const periodic = instructions.periodicSchedule;
43
- const amountDto = isFixed ? periodic?.amount : periodic?.maxAmount;
44
- const amountLabel = isFixed ? 'Amount' : 'Max per Payment';
45
- const rows = [{
46
- label: amountLabel,
47
- value: formatAmount(amountDto)
48
- }, {
49
- label: 'First Payment Date',
50
- value: formatDate(periodic?.startDate)
51
- }, {
52
- label: 'Payment repeats every',
53
- value: present(periodic?.frequency)
54
- }, {
55
- label: 'Stop payment on',
56
- value: formatDate(periodic?.endDate)
57
- }, {
58
- label: 'Total number of payments',
59
- value: presentInt(instructions.maxCumulativeNumberOfPayments)
60
- }];
61
- if (!isFixed) {
62
- rows.push({
63
- label: 'Total Value Allowed',
64
- value: formatAmount(instructions.maxCumulativeAmount)
65
- });
66
- }
67
- return rows;
68
- }
69
- function fixedOnDemand(instructions) {
70
- const periodic = instructions.periodicSchedule;
71
- const frequency = periodic?.frequency;
72
- return [{
73
- label: 'Amount',
74
- value: formatAmount(periodic?.amount)
75
- }, {
76
- label: 'Total number of payments allowed',
77
- value: presentInt(instructions.maxCumulativeNumberOfPayments)
78
- }, {
79
- label: 'Total Value Allowed',
80
- value: formatAmount(instructions.maxCumulativeAmount)
81
- }, {
82
- label: 'Limits Every',
83
- value: present(frequency)
84
- }, {
85
- label: `Max Value per ${present(frequency)}`,
86
- value: formatAmount(periodic?.controls?.maxCumulativeAmountPerPeriod)
87
- }, {
88
- label: `Max Payments per ${present(frequency)}`,
89
- value: presentInt(periodic?.controls?.maxCumulativeNumberOfPaymentsPerPeriod)
90
- }, {
91
- label: 'Expiry Date',
92
- value: formatDate(periodic?.endDate)
93
- }];
94
- }
95
- function variableOnDemand(instructions) {
96
- const periodic = instructions.periodicSchedule;
97
- const frequency = periodic?.frequency;
98
- return [{
99
- label: 'First Payment Date',
100
- value: formatDate(periodic?.startDate)
101
- }, {
102
- label: 'Expiry Date',
103
- value: formatDate(periodic?.endDate)
104
- }, {
105
- label: 'Max per Payment',
106
- value: formatAmount(periodic?.maxAmount)
107
- }, {
108
- label: 'Total number of payments allowed',
109
- value: presentInt(instructions.maxCumulativeNumberOfPayments)
110
- }, {
111
- label: 'Total Value Allowed',
112
- value: formatAmount(instructions.maxCumulativeAmount)
113
- }, {
114
- label: 'Limits Every',
115
- value: present(frequency)
116
- }, {
117
- label: `Max Value per ${present(frequency)}`,
118
- value: formatAmount(periodic?.controls?.maxCumulativeAmountPerPeriod)
119
- }, {
120
- label: `Max Payments per ${present(frequency)}`,
121
- value: presentInt(periodic?.controls?.maxCumulativeNumberOfPaymentsPerPeriod)
122
- }];
123
- }
124
- export function buildMultiPaymentRules(type, instructions) {
125
- switch (type) {
126
- case PaymentType.fixedDefinedSchedule:
127
- case PaymentType.variableDefinedSchedule:
128
- return definedSchedule(type, instructions);
129
- case PaymentType.fixedPeriodicSchedule:
130
- case PaymentType.variablePeriodicSchedule:
131
- return periodicSchedule(type, instructions);
132
- case PaymentType.fixedOnDemand:
133
- return fixedOnDemand(instructions);
134
- case PaymentType.variableOnDemand:
135
- return variableOnDemand(instructions);
136
- default:
137
- return [];
138
- }
139
- }
140
- export function rulesSectionTitle(type) {
141
- if (type === PaymentType.fixedDefinedSchedule || type === PaymentType.variableDefinedSchedule) {
142
- return 'Payment schedule';
143
- }
144
- return 'Payment rules';
145
- }
146
- //# sourceMappingURL=multi-payment-rules-presenter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["PaymentType","formatAmount","present","value","fallback","v","trim","presentInt","undefined","String","formatDate","raw","parsed","Date","Number","isNaN","getTime","months","day","getUTCDate","padStart","month","getUTCMonth","getUTCFullYear","definedSchedule","type","instructions","isFixed","fixedDefinedSchedule","amountLabel","schedule","paymentSchedule","rows","entry","amountDto","amount","maxAmount","push","label","paymentExecutionDate","periodicSchedule","fixedPeriodicSchedule","periodic","startDate","frequency","endDate","maxCumulativeNumberOfPayments","maxCumulativeAmount","fixedOnDemand","controls","maxCumulativeAmountPerPeriod","maxCumulativeNumberOfPaymentsPerPeriod","variableOnDemand","buildMultiPaymentRules","variableDefinedSchedule","variablePeriodicSchedule","rulesSectionTitle"],"sourceRoot":"../../../../src","sources":["core/services/multi-payment-rules-presenter.ts"],"mappings":"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","ignoreList":[]}
@@ -1,544 +0,0 @@
1
- "use strict";
2
-
3
- import { createLogger } from "../../internal/logger.js";
4
- import { redactPaymentReturnUri } from "../../internal/redact-uri.js";
5
- import { DEFAULT_AWAITING_CALLBACK_POLL_MS, DEFAULT_AWAITING_CALLBACK_TIMEOUT_MS } from "../../public/constants.js";
6
-
7
- /** Simple string tag for internal controller callbacks — not the public SpareLinkEvent. */
8
-
9
- import { isPaymentApiError } from "../errors/payment-api-error.js";
10
- import { isBankCallbackReceivedStatus } from "../models/link-session-status.js";
11
- import { extractPaymentReturnErrorCode } from "../models/payment-return-params.js";
12
- import { supportsConfirmationOfPayee } from "../models/payment-type.js";
13
- import { PaymentFlowStates } from "./payment-flow-state.js";
14
-
15
- /** Minimum surface required from a `Clock` injected for testability. */
16
-
17
- const REAL_CLOCK = {
18
- now: () => Date.now()
19
- };
20
-
21
- /**
22
- * Number of consecutive `pollStatus` transport failures we tolerate before
23
- * giving up and transitioning to `failed('network_error')`. Bounds the request
24
- * volume against a flaky network during the 5-minute awaiting-callback window.
25
- */
26
- const POLL_STATUS_MAX_CONSECUTIVE_FAILURES = 5;
27
- const log = createLogger('PaymentFlowController');
28
- const TERMINAL_PHASES = new Set(['succeeded', 'failed', 'cancelled']);
29
- function isTerminal(phase) {
30
- return TERMINAL_PHASES.has(phase);
31
- }
32
-
33
- /**
34
- * Drives the payment flow state machine. Exposes a `subscribe`/`unsubscribe`
35
- * API so React's `useSyncExternalStore` can bridge to a hook.
36
- *
37
- * `subscribe` fires the listener synchronously with the current state so new
38
- * subscribers don't miss the initial snapshot.
39
- */
40
- export class PaymentFlowController {
41
- _state = PaymentFlowStates.idle();
42
- _listeners = new Set();
43
-
44
- /** Last provider the user selected — retained so success/awaiting states that
45
- * arrive without it (poll/callback) can still report `bankId`. */
46
-
47
- _disposed = false;
48
- /** Re-entrance guard — second `hydrate()` returns the in-flight promise. */
49
-
50
- /** Consecutive `pollStatus` transport failures since the last successful response. */
51
- _pollStatusConsecutiveFailures = 0;
52
- constructor(opts) {
53
- this.sessionToken = opts.sessionToken;
54
- this.apiClient = opts.apiClient;
55
- if (opts.pendingSessionStore) this.pendingSessionStore = opts.pendingSessionStore;
56
- this.awaitingCallbackTimeoutMs = opts.awaitingCallbackTimeoutMs ?? DEFAULT_AWAITING_CALLBACK_TIMEOUT_MS;
57
- this.environment = opts.environment ?? 'production';
58
- this.awaitingCallbackPollMs = opts.awaitingCallbackPollMs ?? DEFAULT_AWAITING_CALLBACK_POLL_MS;
59
- this.clock = opts.clock ?? REAL_CLOCK;
60
- if (opts.collectTelemetry) this.collectTelemetry = opts.collectTelemetry;
61
- this.uuid = opts.uuid ?? fallbackUuid;
62
- if (opts.onEvent) this.onEventCallback = opts.onEvent;
63
- }
64
-
65
- // ---- Subscription API ----------------------------------------------------
66
-
67
- get state() {
68
- return this._state;
69
- }
70
- get awaitingCallbackStartedAtMs() {
71
- return this._awaitingCallbackStartedAtMs;
72
- }
73
-
74
- /**
75
- * Register a listener. The listener is invoked synchronously with the
76
- * current state so new subscribers have the initial snapshot, then again
77
- * on every subsequent change.
78
- */
79
- subscribe(listener) {
80
- this._listeners.add(listener);
81
- try {
82
- listener(this._state);
83
- } catch {
84
- // swallow — listener bugs never break the controller
85
- }
86
- return () => {
87
- this._listeners.delete(listener);
88
- };
89
- }
90
- setState(next) {
91
- if (this._disposed) return;
92
- this._state = next;
93
- if (isTerminal(next.phase)) {
94
- this.cancelCallbackTimeout();
95
- this._consentIdempotencyKey = undefined;
96
- }
97
- for (const l of this._listeners) {
98
- try {
99
- l(next);
100
- } catch {
101
- // listener exceptions never break the controller
102
- }
103
- }
104
- }
105
- fireEvent(event) {
106
- try {
107
- this.onEventCallback?.(event);
108
- } catch {
109
- // swallow integrator errors
110
- }
111
- }
112
-
113
- // ---- Timers --------------------------------------------------------------
114
-
115
- cancelCallbackTimeout() {
116
- if (this._callbackTimer) {
117
- clearTimeout(this._callbackTimer);
118
- this._callbackTimer = undefined;
119
- }
120
- }
121
- startCallbackTimeout() {
122
- this.cancelCallbackTimeout();
123
- this._callbackTimer = setTimeout(() => {
124
- if (this._state.phase !== 'awaitingCallback') return;
125
- void this.reportError('session_timeout');
126
- }, this.awaitingCallbackTimeoutMs);
127
- }
128
-
129
- // ---- Phase transitions ---------------------------------------------------
130
-
131
- /**
132
- * `GET /link` + `GET /link/providers`, then transitions to bankSelection.
133
- * Re-entrant: a second concurrent call returns the in-flight promise instead
134
- * of firing duplicate requests.
135
- */
136
- hydrate() {
137
- if (this._disposed) return Promise.resolve();
138
- if (this._hydratePromise) return this._hydratePromise;
139
- this._hydratePromise = this._doHydrate().finally(() => {
140
- this._hydratePromise = undefined;
141
- });
142
- return this._hydratePromise;
143
- }
144
- async _doHydrate() {
145
- log.info('hydrate: starting session hydration');
146
- this.setState(PaymentFlowStates.hydrating());
147
- try {
148
- const [session, providers] = await Promise.all([this.apiClient.getSession(this.sessionToken), this.apiClient.getProviders(this.sessionToken)]);
149
- log.info(`hydrate: loaded session with ${providers.length} provider(s)`);
150
- this.setState(PaymentFlowStates.bankSelection({
151
- session,
152
- providers
153
- }));
154
- this.fireEvent('sessionLoaded');
155
- } catch (err) {
156
- log.severe(`hydrate: failed — ${err instanceof Error ? err.message : String(err)}`);
157
- const code = isPaymentApiError(err) ? err.code : 'hydration_error';
158
- const message = err instanceof Error ? err.message : String(err);
159
- this.setState(PaymentFlowStates.failed({
160
- errorCode: code,
161
- errorMessage: message
162
- }));
163
- throw err;
164
- }
165
- }
166
-
167
- /** Move bankSelection → consentDetails. */
168
- selectBank(bankId) {
169
- log.info(`selectBank: bankId=${bankId}`);
170
- const current = this._state;
171
- const session = current.session;
172
- if (!session) {
173
- throw new Error('Cannot select bank before session is loaded.');
174
- }
175
- const provider = current.providers.find(p => p.id === bankId);
176
- if (!provider) {
177
- log.severe(`selectBank: unknown bankId=${bankId}`);
178
- throw new Error(`Unknown bank id: ${bankId}`);
179
- }
180
- // Retained so success states reached via poll/callback (which don't carry
181
- // the provider) still resolve a `bankId` in the PaymentResult.
182
- this._selectedProvider = provider;
183
- const willLoadCop = this.shouldPerformCop(session);
184
- this.setState(PaymentFlowStates.consentDetails({
185
- session,
186
- selectedProvider: provider,
187
- isCopLoading: willLoadCop,
188
- copApplicable: willLoadCop
189
- }));
190
- if (willLoadCop) {
191
- this.loadCopInBackground(session, provider);
192
- }
193
- }
194
-
195
- /**
196
- * Best-effort Confirmation-of-Payee fetch — never blocks {@link selectBank}
197
- * or fails the flow. Mirrors the Flutter controller: gated to UAE + un-verified
198
- * sessions, and the result is merged into the consentDetails state only if the
199
- * user is still on that screen for the same provider. Ported from
200
- * `payment_flow_controller.dart:_loadCopInBackground`.
201
- */
202
- loadCopInBackground(session, provider) {
203
- void (async () => {
204
- const cop = await this.getCoP(provider.id);
205
- if (this._state.phase !== 'consentDetails') return;
206
- if (this._state.selectedProvider?.id !== provider.id) return;
207
- this.setState(PaymentFlowStates.consentDetails({
208
- session,
209
- selectedProvider: provider,
210
- ...(cop ? {
211
- copResponse: cop
212
- } : {}),
213
- isCopLoading: false,
214
- copApplicable: true
215
- }));
216
- })();
217
- }
218
- shouldPerformCop(session) {
219
- if (this.apiClient.tenantHeader !== 'UAE') return false;
220
- if (session.request.isCopVerified === true) return false;
221
- if (!supportsConfirmationOfPayee(session.request)) return false;
222
- return true;
223
- }
224
-
225
- /** `POST /link/consent`, persists pending record, transitions to redirecting. */
226
- async confirmConsent() {
227
- log.info('confirmConsent: posting consent');
228
- const selectedProvider = this._state.selectedProvider;
229
- if (!selectedProvider) {
230
- log.severe('confirmConsent: no provider selected');
231
- throw new Error('Cannot confirm consent without a selected provider.');
232
- }
233
- this.fireEvent('consentStarted');
234
- if (!this._consentIdempotencyKey) {
235
- this._consentIdempotencyKey = this.uuid();
236
- }
237
-
238
- // Best-effort telemetry before posting consent.
239
- await this.postTelemetryAutomatic();
240
- let consent;
241
- try {
242
- consent = await this.apiClient.postConsent({
243
- linkToken: this.sessionToken,
244
- bankId: selectedProvider.id,
245
- idempotencyKey: this._consentIdempotencyKey
246
- });
247
- } catch (err) {
248
- // Without this the flow would be stranded in `consentDetails` with no
249
- // terminal state — the caller's catch assumes we already transitioned.
250
- const code = isPaymentApiError(err) ? err.code : 'consent_failed';
251
- const message = err instanceof Error ? err.message : String(err);
252
- this.setState(PaymentFlowStates.failed({
253
- errorCode: code,
254
- errorMessage: message
255
- }));
256
- void this.patchTokenBestEffort('error', code);
257
- throw err;
258
- }
259
- if (this.pendingSessionStore) {
260
- try {
261
- const merchantRef = this._state.session?.request?.merchantReference;
262
- await this.pendingSessionStore.save({
263
- sessionId: this.sessionToken,
264
- selectedBankId: selectedProvider.id,
265
- authorizationUrl: consent.redirectUrl,
266
- consentAt: this.clock.now(),
267
- recoveryAttempts: 0,
268
- ...(merchantRef ? {
269
- merchantRef
270
- } : {})
271
- });
272
- } catch {
273
- log.warning('confirmConsent: store.save() failed — continuing');
274
- // store failures should not block the flow
275
- }
276
- }
277
- log.info('confirmConsent: → redirecting');
278
- this.setState(PaymentFlowStates.redirecting({
279
- consent,
280
- selectedProvider
281
- }));
282
- }
283
-
284
- /**
285
- * Parses a callback URI and transitions to succeeded / failed. Accepts either
286
- * a `URL` instance or a string. A malformed URI resolves to
287
- * `failed('invalid_callback')` instead of throwing.
288
- */
289
- handleCallback(uri) {
290
- log.info(`handleCallback: received URI=${redactPaymentReturnUri(typeof uri === 'string' ? uri : uri.toString())}`);
291
- // Deep-link callbacks are commonly re-delivered (cold start + warm
292
- // foreground). Once the flow is terminal, ignore further callbacks so we
293
- // never re-transition and re-fire terminal callbacks.
294
- if (isTerminal(this._state.phase)) return;
295
- let url;
296
- if (typeof uri === 'string') {
297
- try {
298
- url = new URL(uri);
299
- } catch {
300
- this.setState(PaymentFlowStates.failed({
301
- errorCode: 'invalid_callback',
302
- errorMessage: 'The callback URI could not be parsed.'
303
- }));
304
- return;
305
- }
306
- } else {
307
- url = uri;
308
- }
309
- this.fireEvent('bankCallbackReceived');
310
- const params = url.searchParams;
311
-
312
- // Prefer the new `error_code` query param over legacy `error`. Also accept
313
- // `status=failure` with no other code as `authorize_failed`.
314
- const error = extractPaymentReturnErrorCode(params);
315
- if (error) {
316
- const description = params.get('error_description') ?? undefined;
317
- this.setState(PaymentFlowStates.failed({
318
- errorCode: error,
319
- ...(description ? {
320
- errorMessage: description
321
- } : {})
322
- }));
323
- return;
324
- }
325
- const exchangeCode = params.get('exchange_code') ?? undefined;
326
- const linkSessionId = params.get('session_id') ?? undefined;
327
- const merchantRef = params.get('merchantRef') ?? undefined;
328
- if (exchangeCode) {
329
- this.setState(PaymentFlowStates.succeeded({
330
- exchangeCode,
331
- ...(linkSessionId ? {
332
- linkSessionId
333
- } : {}),
334
- ...(merchantRef ? {
335
- merchantRef
336
- } : {}),
337
- ...(this._selectedProvider ? {
338
- selectedProvider: this._selectedProvider
339
- } : {}),
340
- ...(this._state.session ? {
341
- session: this._state.session
342
- } : {})
343
- }));
344
- return;
345
- }
346
- this.setState(PaymentFlowStates.failed({
347
- errorCode: 'invalid_callback',
348
- errorMessage: 'The callback URI is missing required parameters.'
349
- }));
350
- }
351
-
352
- /** Best-effort cancel — PATCH /link with action=cancel, then transitions to cancelled. */
353
- async cancel() {
354
- log.info('cancel: user cancelled the payment flow');
355
- await this.patchTokenBestEffort('cancel');
356
- this.setState(PaymentFlowStates.cancelled());
357
- }
358
-
359
- /** Best-effort error report — sets failed state immediately, PATCH is fire-and-forget. */
360
- async reportError(code) {
361
- log.severe(`reportError: reporting error code=${code}`);
362
- this.setState(PaymentFlowStates.failed({
363
- errorCode: code
364
- }));
365
- // Fire-and-forget; we already transitioned.
366
- void this.patchTokenBestEffort('error', code);
367
- }
368
- async patchTokenBestEffort(action, errorCode) {
369
- try {
370
- await this.apiClient.patchToken({
371
- linkToken: this.sessionToken,
372
- action,
373
- ...(errorCode ? {
374
- errorCode
375
- } : {})
376
- });
377
- } catch {
378
- // swallow — PATCH is best-effort
379
- }
380
- }
381
-
382
- /**
383
- * UI calls this after handing off to the bank — starts the 5-minute timeout
384
- * and pins the awaiting-callback start time.
385
- */
386
- setAwaitingCallbackState(args = {}) {
387
- this._awaitingCallbackStartedAtMs ??= this.clock.now();
388
- this.setState(PaymentFlowStates.awaitingCallback({
389
- ...(args.providerName ? {
390
- providerName: args.providerName
391
- } : {}),
392
- ...(this._state.session ? {
393
- session: this._state.session
394
- } : {}),
395
- ...(this._selectedProvider ? {
396
- selectedProvider: this._selectedProvider
397
- } : {})
398
- }));
399
- this.startCallbackTimeout();
400
- }
401
-
402
- /**
403
- * Best-effort status polling. Transitions to a terminal state on
404
- * `completed | failed | cancelled | expired`; otherwise leaves the flow in
405
- * the current phase. After {@link POLL_STATUS_MAX_CONSECUTIVE_FAILURES}
406
- * consecutive transport failures the controller gives up with
407
- * `failed('network_error')` to stop hammering an unreachable backend.
408
- */
409
- async pollStatus() {
410
- // A status response can land after a bank callback or the timeout has
411
- // already resolved the flow; never overwrite a terminal state.
412
- if (isTerminal(this._state.phase)) return;
413
- try {
414
- const status = await this.apiClient.getStatus(this.sessionToken);
415
- this._pollStatusConsecutiveFailures = 0;
416
- // Re-check: the await above yields, so a terminal callback may have
417
- // arrived while the request was in flight.
418
- if (isTerminal(this._state.phase)) return;
419
- switch (status.status) {
420
- case 'completed':
421
- this.setState(PaymentFlowStates.succeeded({
422
- ...(status.linkSessionId ? {
423
- linkSessionId: status.linkSessionId
424
- } : {}),
425
- ...(this._selectedProvider ? {
426
- selectedProvider: this._selectedProvider
427
- } : {}),
428
- ...(this._state.session ? {
429
- session: this._state.session
430
- } : {})
431
- }));
432
- return;
433
- case 'failed':
434
- this.setState(PaymentFlowStates.failed({
435
- errorCode: status.failureCode ?? 'session_failed'
436
- }));
437
- return;
438
- case 'cancelled':
439
- this.setState(PaymentFlowStates.cancelled());
440
- return;
441
- case 'expired':
442
- this.setState(PaymentFlowStates.failed({
443
- errorCode: 'session_expired'
444
- }));
445
- return;
446
- default:
447
- // Non-terminal. In sandbox, only treat `callback_received` as success —
448
- // the bank has actually returned. `redirected` means consent was posted
449
- // but the user may not have authorized yet; auto-success there caused
450
- // false positives on cold-start recovery.
451
- if (this.environment === 'sandbox' && this._state.phase === 'awaitingCallback' && isBankCallbackReceivedStatus(status.status)) {
452
- this.setState(PaymentFlowStates.succeeded({
453
- ...(status.linkSessionId ? {
454
- linkSessionId: status.linkSessionId
455
- } : {}),
456
- ...(this._selectedProvider ? {
457
- selectedProvider: this._selectedProvider
458
- } : {}),
459
- ...(this._state.session ? {
460
- session: this._state.session
461
- } : {})
462
- }));
463
- }
464
- return;
465
- }
466
- } catch {
467
- this._pollStatusConsecutiveFailures += 1;
468
- log.warning(`pollStatus: failed (${this._pollStatusConsecutiveFailures}/${POLL_STATUS_MAX_CONSECUTIVE_FAILURES})`);
469
- if (this._pollStatusConsecutiveFailures >= POLL_STATUS_MAX_CONSECUTIVE_FAILURES) {
470
- if (isTerminal(this._state.phase) || this._state.phase !== 'awaitingCallback') return;
471
- this.setState(PaymentFlowStates.failed({
472
- errorCode: 'network_error',
473
- errorMessage: 'Unable to reach the Spare backend after multiple attempts.'
474
- }));
475
- }
476
- }
477
- }
478
-
479
- /** Best-effort telemetry — never throws, never changes state. */
480
- async postTelemetry(payload) {
481
- try {
482
- await this.apiClient.postTelemetry({
483
- linkToken: this.sessionToken,
484
- payload
485
- });
486
- } catch (err) {
487
- log.warning(`postTelemetry: best-effort telemetry failed — ${err instanceof Error ? err.message : String(err)}`);
488
- }
489
- }
490
-
491
- /** Best-effort CoP — returns result or null on failure. */
492
- async getCoP(providerId) {
493
- try {
494
- return await this.apiClient.getConfirmPayee(this.sessionToken, providerId);
495
- } catch {
496
- return null;
497
- }
498
- }
499
- async postTelemetryAutomatic() {
500
- if (!this.collectTelemetry) return;
501
- log.fine('postTelemetryAutomatic: collecting and posting device telemetry');
502
- try {
503
- const payload = await this.collectTelemetry();
504
- await this.apiClient.postTelemetry({
505
- linkToken: this.sessionToken,
506
- payload
507
- });
508
- } catch (err) {
509
- log.warning(`postTelemetryAutomatic: failed — ${err instanceof Error ? err.message : String(err)}`);
510
- }
511
- }
512
-
513
- /** Returns the active providers list — convenience for the UI layer. */
514
- get providers() {
515
- return this._state.providers;
516
- }
517
-
518
- /** Returns the active session, if any. */
519
- get session() {
520
- return this._state.session;
521
- }
522
-
523
- /**
524
- * Releases resources: cancels timers, clears listeners, and aborts the
525
- * underlying API client's in-flight fetches. Idempotent.
526
- */
527
- dispose() {
528
- if (this._disposed) return;
529
- log.info('dispose: releasing apiClient');
530
- this._disposed = true;
531
- this.cancelCallbackTimeout();
532
- this._listeners.clear();
533
- this.apiClient.dispose();
534
- }
535
- }
536
- function fallbackUuid() {
537
- const bytes = new Uint8Array(16);
538
- for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);
539
- bytes[6] = (bytes[6] ?? 0) & 0x0f | 0x40;
540
- bytes[8] = (bytes[8] ?? 0) & 0x3f | 0x80;
541
- const hex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');
542
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
543
- }
544
- //# sourceMappingURL=payment-flow-controller.js.map