@voyant-travel/finance-react 0.119.5

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 (517) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +75 -0
  3. package/dist/admin/booking-invoices-widget.d.ts +19 -0
  4. package/dist/admin/booking-invoices-widget.d.ts.map +1 -0
  5. package/dist/admin/booking-invoices-widget.js +204 -0
  6. package/dist/admin/booking-payment-policy-widget.d.ts +21 -0
  7. package/dist/admin/booking-payment-policy-widget.d.ts.map +1 -0
  8. package/dist/admin/booking-payment-policy-widget.js +128 -0
  9. package/dist/admin/booking-pending-payment-sessions-widget.d.ts +24 -0
  10. package/dist/admin/booking-pending-payment-sessions-widget.d.ts.map +1 -0
  11. package/dist/admin/booking-pending-payment-sessions-widget.js +139 -0
  12. package/dist/admin/credit-note-dialog.d.ts +9 -0
  13. package/dist/admin/credit-note-dialog.d.ts.map +1 -0
  14. package/dist/admin/credit-note-dialog.js +70 -0
  15. package/dist/admin/finance-shared.d.ts +7 -0
  16. package/dist/admin/finance-shared.d.ts.map +1 -0
  17. package/dist/admin/finance-shared.js +30 -0
  18. package/dist/admin/index.d.ts +99 -0
  19. package/dist/admin/index.d.ts.map +1 -0
  20. package/dist/admin/index.js +286 -0
  21. package/dist/admin/invoice-detail-host.d.ts +19 -0
  22. package/dist/admin/invoice-detail-host.d.ts.map +1 -0
  23. package/dist/admin/invoice-detail-host.js +147 -0
  24. package/dist/admin/invoice-detail-sections.d.ts +31 -0
  25. package/dist/admin/invoice-detail-sections.d.ts.map +1 -0
  26. package/dist/admin/invoice-detail-sections.js +109 -0
  27. package/dist/admin/invoice-detail-skeleton.d.ts +11 -0
  28. package/dist/admin/invoice-detail-skeleton.d.ts.map +1 -0
  29. package/dist/admin/invoice-detail-skeleton.js +33 -0
  30. package/dist/admin/line-item-dialog.d.ts +10 -0
  31. package/dist/admin/line-item-dialog.d.ts.map +1 -0
  32. package/dist/admin/line-item-dialog.js +91 -0
  33. package/dist/admin/pages/invoice-detail.d.ts +8 -0
  34. package/dist/admin/pages/invoice-detail.d.ts.map +1 -0
  35. package/dist/admin/pages/invoice-detail.js +11 -0
  36. package/dist/admin/pages/invoices-index.d.ts +8 -0
  37. package/dist/admin/pages/invoices-index.d.ts.map +1 -0
  38. package/dist/admin/pages/invoices-index.js +14 -0
  39. package/dist/admin/pages/payment-detail.d.ts +8 -0
  40. package/dist/admin/pages/payment-detail.d.ts.map +1 -0
  41. package/dist/admin/pages/payment-detail.js +11 -0
  42. package/dist/admin/pages/payments-index.d.ts +9 -0
  43. package/dist/admin/pages/payments-index.d.ts.map +1 -0
  44. package/dist/admin/pages/payments-index.js +21 -0
  45. package/dist/admin/pages/profitability.d.ts +10 -0
  46. package/dist/admin/pages/profitability.d.ts.map +1 -0
  47. package/dist/admin/pages/profitability.js +32 -0
  48. package/dist/admin/pages/supplier-invoice-detail.d.ts +20 -0
  49. package/dist/admin/pages/supplier-invoice-detail.d.ts.map +1 -0
  50. package/dist/admin/pages/supplier-invoice-detail.js +102 -0
  51. package/dist/admin/pages/supplier-invoices-index.d.ts +9 -0
  52. package/dist/admin/pages/supplier-invoices-index.d.ts.map +1 -0
  53. package/dist/admin/pages/supplier-invoices-index.js +16 -0
  54. package/dist/admin/payment-detail-host.d.ts +12 -0
  55. package/dist/admin/payment-detail-host.d.ts.map +1 -0
  56. package/dist/admin/payment-detail-host.js +108 -0
  57. package/dist/admin/payment-detail-skeleton.d.ts +8 -0
  58. package/dist/admin/payment-detail-skeleton.d.ts.map +1 -0
  59. package/dist/admin/payment-detail-skeleton.js +15 -0
  60. package/dist/admin/payment-dialog.d.ts +9 -0
  61. package/dist/admin/payment-dialog.d.ts.map +1 -0
  62. package/dist/admin/payment-dialog.js +99 -0
  63. package/dist/admin/record-payment-dialog.d.ts +16 -0
  64. package/dist/admin/record-payment-dialog.d.ts.map +1 -0
  65. package/dist/admin/record-payment-dialog.js +219 -0
  66. package/dist/admin/supplier-payment-policy-widget.d.ts +18 -0
  67. package/dist/admin/supplier-payment-policy-widget.d.ts.map +1 -0
  68. package/dist/admin/supplier-payment-policy-widget.js +31 -0
  69. package/dist/admin/use-supplier-picker.d.ts +19 -0
  70. package/dist/admin/use-supplier-picker.d.ts.map +1 -0
  71. package/dist/admin/use-supplier-picker.js +30 -0
  72. package/dist/checkout-components/collect-payment-dialog.d.ts +45 -0
  73. package/dist/checkout-components/collect-payment-dialog.d.ts.map +1 -0
  74. package/dist/checkout-components/collect-payment-dialog.js +121 -0
  75. package/dist/checkout-components/payment-link-landing-page.d.ts +76 -0
  76. package/dist/checkout-components/payment-link-landing-page.d.ts.map +1 -0
  77. package/dist/checkout-components/payment-link-landing-page.js +173 -0
  78. package/dist/checkout-components/payment-step.d.ts +42 -0
  79. package/dist/checkout-components/payment-step.d.ts.map +1 -0
  80. package/dist/checkout-components/payment-step.js +113 -0
  81. package/dist/checkout-hooks/index.d.ts +5 -0
  82. package/dist/checkout-hooks/index.d.ts.map +1 -0
  83. package/dist/checkout-hooks/index.js +4 -0
  84. package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts +20 -0
  85. package/dist/checkout-hooks/use-checkout-payment-link-config.d.ts.map +1 -0
  86. package/dist/checkout-hooks/use-checkout-payment-link-config.js +26 -0
  87. package/dist/checkout-hooks/use-collect-payment.d.ts +227 -0
  88. package/dist/checkout-hooks/use-collect-payment.d.ts.map +1 -0
  89. package/dist/checkout-hooks/use-collect-payment.js +80 -0
  90. package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts +308 -0
  91. package/dist/checkout-hooks/use-initiate-checkout-collection.d.ts.map +1 -0
  92. package/dist/checkout-hooks/use-initiate-checkout-collection.js +35 -0
  93. package/dist/checkout-hooks/use-preview-checkout-collection.d.ts +65 -0
  94. package/dist/checkout-hooks/use-preview-checkout-collection.d.ts.map +1 -0
  95. package/dist/checkout-hooks/use-preview-checkout-collection.js +27 -0
  96. package/dist/checkout-i18n/en.d.ts +3 -0
  97. package/dist/checkout-i18n/en.d.ts.map +1 -0
  98. package/dist/checkout-i18n/en.js +127 -0
  99. package/dist/checkout-i18n/index.d.ts +5 -0
  100. package/dist/checkout-i18n/index.d.ts.map +1 -0
  101. package/dist/checkout-i18n/index.js +3 -0
  102. package/dist/checkout-i18n/messages.d.ts +121 -0
  103. package/dist/checkout-i18n/messages.d.ts.map +1 -0
  104. package/dist/checkout-i18n/messages.js +1 -0
  105. package/dist/checkout-i18n/provider.d.ts +26 -0
  106. package/dist/checkout-i18n/provider.d.ts.map +1 -0
  107. package/dist/checkout-i18n/provider.js +41 -0
  108. package/dist/checkout-i18n/ro.d.ts +3 -0
  109. package/dist/checkout-i18n/ro.d.ts.map +1 -0
  110. package/dist/checkout-i18n/ro.js +127 -0
  111. package/dist/checkout-types.d.ts +53 -0
  112. package/dist/checkout-types.d.ts.map +1 -0
  113. package/dist/checkout-types.js +1 -0
  114. package/dist/checkout-ui.d.ts +7 -0
  115. package/dist/checkout-ui.d.ts.map +1 -0
  116. package/dist/checkout-ui.js +4 -0
  117. package/dist/checkout.d.ts +5 -0
  118. package/dist/checkout.d.ts.map +1 -0
  119. package/dist/checkout.js +3 -0
  120. package/dist/client.d.ts +16 -0
  121. package/dist/client.d.ts.map +1 -0
  122. package/dist/client.js +79 -0
  123. package/dist/components/accountant-portal/body.d.ts +8 -0
  124. package/dist/components/accountant-portal/body.d.ts.map +1 -0
  125. package/dist/components/accountant-portal/body.js +114 -0
  126. package/dist/components/accountant-portal/widgets.d.ts +13 -0
  127. package/dist/components/accountant-portal/widgets.d.ts.map +1 -0
  128. package/dist/components/accountant-portal/widgets.js +27 -0
  129. package/dist/components/accountant-portal.d.ts +10 -0
  130. package/dist/components/accountant-portal.d.ts.map +1 -0
  131. package/dist/components/accountant-portal.js +22 -0
  132. package/dist/components/accountant-share-dialog.d.ts +6 -0
  133. package/dist/components/accountant-share-dialog.d.ts.map +1 -0
  134. package/dist/components/accountant-share-dialog.js +53 -0
  135. package/dist/components/async-combobox.d.ts +33 -0
  136. package/dist/components/async-combobox.d.ts.map +1 -0
  137. package/dist/components/async-combobox.js +100 -0
  138. package/dist/components/booking-invoice-dialog.d.ts +63 -0
  139. package/dist/components/booking-invoice-dialog.d.ts.map +1 -0
  140. package/dist/components/booking-invoice-dialog.js +383 -0
  141. package/dist/components/cost-categories-page.d.ts +5 -0
  142. package/dist/components/cost-categories-page.d.ts.map +1 -0
  143. package/dist/components/cost-categories-page.js +30 -0
  144. package/dist/components/invoice-action-ledger-card.d.ts +15 -0
  145. package/dist/components/invoice-action-ledger-card.d.ts.map +1 -0
  146. package/dist/components/invoice-action-ledger-card.js +76 -0
  147. package/dist/components/invoice-bulk-actions.d.ts +10 -0
  148. package/dist/components/invoice-bulk-actions.d.ts.map +1 -0
  149. package/dist/components/invoice-bulk-actions.js +19 -0
  150. package/dist/components/invoice-detail-page/cards.d.ts +44 -0
  151. package/dist/components/invoice-detail-page/cards.d.ts.map +1 -0
  152. package/dist/components/invoice-detail-page/cards.js +43 -0
  153. package/dist/components/invoice-detail-page/header.d.ts +15 -0
  154. package/dist/components/invoice-detail-page/header.d.ts.map +1 -0
  155. package/dist/components/invoice-detail-page/header.js +30 -0
  156. package/dist/components/invoice-detail-page/notes-dialogs.d.ts +28 -0
  157. package/dist/components/invoice-detail-page/notes-dialogs.d.ts.map +1 -0
  158. package/dist/components/invoice-detail-page/notes-dialogs.js +104 -0
  159. package/dist/components/invoice-detail-page/primitives.d.ts +47 -0
  160. package/dist/components/invoice-detail-page/primitives.d.ts.map +1 -0
  161. package/dist/components/invoice-detail-page/primitives.js +76 -0
  162. package/dist/components/invoice-detail-page-with-action-ledger.d.ts +7 -0
  163. package/dist/components/invoice-detail-page-with-action-ledger.d.ts.map +1 -0
  164. package/dist/components/invoice-detail-page-with-action-ledger.js +11 -0
  165. package/dist/components/invoice-detail-page.d.ts +46 -0
  166. package/dist/components/invoice-detail-page.d.ts.map +1 -0
  167. package/dist/components/invoice-detail-page.js +134 -0
  168. package/dist/components/invoice-dialog.d.ts +9 -0
  169. package/dist/components/invoice-dialog.d.ts.map +1 -0
  170. package/dist/components/invoice-dialog.js +145 -0
  171. package/dist/components/invoice-number-series-dialog.d.ts +9 -0
  172. package/dist/components/invoice-number-series-dialog.d.ts.map +1 -0
  173. package/dist/components/invoice-number-series-dialog.js +134 -0
  174. package/dist/components/invoice-number-series-format.d.ts +3 -0
  175. package/dist/components/invoice-number-series-format.d.ts.map +1 -0
  176. package/dist/components/invoice-number-series-format.js +4 -0
  177. package/dist/components/invoice-number-series-page.d.ts +5 -0
  178. package/dist/components/invoice-number-series-page.d.ts.map +1 -0
  179. package/dist/components/invoice-number-series-page.js +55 -0
  180. package/dist/components/invoice-table-parts.d.ts +25 -0
  181. package/dist/components/invoice-table-parts.d.ts.map +1 -0
  182. package/dist/components/invoice-table-parts.js +32 -0
  183. package/dist/components/invoices-page-skeleton.d.ts +5 -0
  184. package/dist/components/invoices-page-skeleton.d.ts.map +1 -0
  185. package/dist/components/invoices-page-skeleton.js +13 -0
  186. package/dist/components/invoices-page.d.ts +6 -0
  187. package/dist/components/invoices-page.d.ts.map +1 -0
  188. package/dist/components/invoices-page.js +145 -0
  189. package/dist/components/payment-detail-page.d.ts +47 -0
  190. package/dist/components/payment-detail-page.d.ts.map +1 -0
  191. package/dist/components/payment-detail-page.js +90 -0
  192. package/dist/components/payment-policy-form.d.ts +49 -0
  193. package/dist/components/payment-policy-form.d.ts.map +1 -0
  194. package/dist/components/payment-policy-form.js +82 -0
  195. package/dist/components/payments-page/controls.d.ts +23 -0
  196. package/dist/components/payments-page/controls.d.ts.map +1 -0
  197. package/dist/components/payments-page/controls.js +20 -0
  198. package/dist/components/payments-page-skeleton.d.ts +5 -0
  199. package/dist/components/payments-page-skeleton.d.ts.map +1 -0
  200. package/dist/components/payments-page-skeleton.js +13 -0
  201. package/dist/components/payments-page.d.ts +20 -0
  202. package/dist/components/payments-page.d.ts.map +1 -0
  203. package/dist/components/payments-page.js +143 -0
  204. package/dist/components/profitability-page/sections.d.ts +24 -0
  205. package/dist/components/profitability-page/sections.d.ts.map +1 -0
  206. package/dist/components/profitability-page/sections.js +43 -0
  207. package/dist/components/profitability-page.d.ts +13 -0
  208. package/dist/components/profitability-page.d.ts.map +1 -0
  209. package/dist/components/profitability-page.js +175 -0
  210. package/dist/components/record-booking-payment-dialog/shared.d.ts +54 -0
  211. package/dist/components/record-booking-payment-dialog/shared.d.ts.map +1 -0
  212. package/dist/components/record-booking-payment-dialog/shared.js +47 -0
  213. package/dist/components/record-booking-payment-dialog.d.ts +4 -0
  214. package/dist/components/record-booking-payment-dialog.d.ts.map +1 -0
  215. package/dist/components/record-booking-payment-dialog.js +256 -0
  216. package/dist/components/supplier-invoice-detail-page/dialogs.d.ts +34 -0
  217. package/dist/components/supplier-invoice-detail-page/dialogs.d.ts.map +1 -0
  218. package/dist/components/supplier-invoice-detail-page/dialogs.js +119 -0
  219. package/dist/components/supplier-invoice-detail-page/shared.d.ts +64 -0
  220. package/dist/components/supplier-invoice-detail-page/shared.d.ts.map +1 -0
  221. package/dist/components/supplier-invoice-detail-page/shared.js +70 -0
  222. package/dist/components/supplier-invoice-detail-page.d.ts +4 -0
  223. package/dist/components/supplier-invoice-detail-page.d.ts.map +1 -0
  224. package/dist/components/supplier-invoice-detail-page.js +101 -0
  225. package/dist/components/supplier-invoice-form-dialog.d.ts +45 -0
  226. package/dist/components/supplier-invoice-form-dialog.d.ts.map +1 -0
  227. package/dist/components/supplier-invoice-form-dialog.js +102 -0
  228. package/dist/components/supplier-invoices-page.d.ts +14 -0
  229. package/dist/components/supplier-invoices-page.d.ts.map +1 -0
  230. package/dist/components/supplier-invoices-page.js +69 -0
  231. package/dist/components/supplier-payment-dialog.d.ts +7 -0
  232. package/dist/components/supplier-payment-dialog.d.ts.map +1 -0
  233. package/dist/components/supplier-payment-dialog.js +103 -0
  234. package/dist/components/taxes-page/policy-profile-sheet.d.ts +8 -0
  235. package/dist/components/taxes-page/policy-profile-sheet.d.ts.map +1 -0
  236. package/dist/components/taxes-page/policy-profile-sheet.js +52 -0
  237. package/dist/components/taxes-page/policy-rule-sheet.d.ts +10 -0
  238. package/dist/components/taxes-page/policy-rule-sheet.d.ts.map +1 -0
  239. package/dist/components/taxes-page/policy-rule-sheet.js +137 -0
  240. package/dist/components/taxes-page/shared.d.ts +128 -0
  241. package/dist/components/taxes-page/shared.d.ts.map +1 -0
  242. package/dist/components/taxes-page/shared.js +288 -0
  243. package/dist/components/taxes-page/sheets.d.ts +4 -0
  244. package/dist/components/taxes-page/sheets.d.ts.map +1 -0
  245. package/dist/components/taxes-page/sheets.js +3 -0
  246. package/dist/components/taxes-page/tax-sheet.d.ts +9 -0
  247. package/dist/components/taxes-page/tax-sheet.d.ts.map +1 -0
  248. package/dist/components/taxes-page/tax-sheet.js +108 -0
  249. package/dist/components/taxes-page.d.ts +4 -0
  250. package/dist/components/taxes-page.d.ts.map +1 -0
  251. package/dist/components/taxes-page.js +165 -0
  252. package/dist/hooks/index.d.ts +53 -0
  253. package/dist/hooks/index.d.ts.map +1 -0
  254. package/dist/hooks/index.js +52 -0
  255. package/dist/hooks/use-accountant-share-mutation.d.ts +20 -0
  256. package/dist/hooks/use-accountant-share-mutation.d.ts.map +1 -0
  257. package/dist/hooks/use-accountant-share-mutation.js +27 -0
  258. package/dist/hooks/use-accountant-shares.d.ts +13 -0
  259. package/dist/hooks/use-accountant-shares.d.ts.map +1 -0
  260. package/dist/hooks/use-accountant-shares.js +8 -0
  261. package/dist/hooks/use-admin-booking-payments.d.ts +30 -0
  262. package/dist/hooks/use-admin-booking-payments.d.ts.map +1 -0
  263. package/dist/hooks/use-admin-booking-payments.js +18 -0
  264. package/dist/hooks/use-all-payments.d.ts +35 -0
  265. package/dist/hooks/use-all-payments.d.ts.map +1 -0
  266. package/dist/hooks/use-all-payments.js +12 -0
  267. package/dist/hooks/use-booking-guarantees.d.ts +82 -0
  268. package/dist/hooks/use-booking-guarantees.d.ts.map +1 -0
  269. package/dist/hooks/use-booking-guarantees.js +46 -0
  270. package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts +44 -0
  271. package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.d.ts.map +1 -0
  272. package/dist/hooks/use-booking-payment-schedule-regenerate-mutation.js +27 -0
  273. package/dist/hooks/use-booking-payment-schedules.d.ts +63 -0
  274. package/dist/hooks/use-booking-payment-schedules.d.ts.map +1 -0
  275. package/dist/hooks/use-booking-payment-schedules.js +47 -0
  276. package/dist/hooks/use-cost-categories.d.ts +14 -0
  277. package/dist/hooks/use-cost-categories.d.ts.map +1 -0
  278. package/dist/hooks/use-cost-categories.js +9 -0
  279. package/dist/hooks/use-cost-category-mutation.d.ts +31 -0
  280. package/dist/hooks/use-cost-category-mutation.d.ts.map +1 -0
  281. package/dist/hooks/use-cost-category-mutation.js +27 -0
  282. package/dist/hooks/use-departure-profitability.d.ts +56 -0
  283. package/dist/hooks/use-departure-profitability.d.ts.map +1 -0
  284. package/dist/hooks/use-departure-profitability.js +12 -0
  285. package/dist/hooks/use-finance-action-ledger.d.ts +94 -0
  286. package/dist/hooks/use-finance-action-ledger.d.ts.map +1 -0
  287. package/dist/hooks/use-finance-action-ledger.js +20 -0
  288. package/dist/hooks/use-invoice-attachment-mutation.d.ts +43 -0
  289. package/dist/hooks/use-invoice-attachment-mutation.d.ts.map +1 -0
  290. package/dist/hooks/use-invoice-attachment-mutation.js +39 -0
  291. package/dist/hooks/use-invoice-attachments.d.ts +18 -0
  292. package/dist/hooks/use-invoice-attachments.d.ts.map +1 -0
  293. package/dist/hooks/use-invoice-attachments.js +12 -0
  294. package/dist/hooks/use-invoice-bulk-status-mutation.d.ts +51 -0
  295. package/dist/hooks/use-invoice-bulk-status-mutation.d.ts.map +1 -0
  296. package/dist/hooks/use-invoice-bulk-status-mutation.js +66 -0
  297. package/dist/hooks/use-invoice-credit-note-mutation.d.ts +38 -0
  298. package/dist/hooks/use-invoice-credit-note-mutation.d.ts.map +1 -0
  299. package/dist/hooks/use-invoice-credit-note-mutation.js +35 -0
  300. package/dist/hooks/use-invoice-credit-notes.d.ts +17 -0
  301. package/dist/hooks/use-invoice-credit-notes.d.ts.map +1 -0
  302. package/dist/hooks/use-invoice-credit-notes.js +12 -0
  303. package/dist/hooks/use-invoice-fx-rate.d.ts +19 -0
  304. package/dist/hooks/use-invoice-fx-rate.d.ts.map +1 -0
  305. package/dist/hooks/use-invoice-fx-rate.js +13 -0
  306. package/dist/hooks/use-invoice-line-item-mutation.d.ts +40 -0
  307. package/dist/hooks/use-invoice-line-item-mutation.d.ts.map +1 -0
  308. package/dist/hooks/use-invoice-line-item-mutation.js +42 -0
  309. package/dist/hooks/use-invoice-line-items.d.ts +17 -0
  310. package/dist/hooks/use-invoice-line-items.d.ts.map +1 -0
  311. package/dist/hooks/use-invoice-line-items.js +12 -0
  312. package/dist/hooks/use-invoice-mutation.d.ts +225 -0
  313. package/dist/hooks/use-invoice-mutation.d.ts.map +1 -0
  314. package/dist/hooks/use-invoice-mutation.js +121 -0
  315. package/dist/hooks/use-invoice-note-mutation.d.ts +11 -0
  316. package/dist/hooks/use-invoice-note-mutation.d.ts.map +1 -0
  317. package/dist/hooks/use-invoice-note-mutation.js +23 -0
  318. package/dist/hooks/use-invoice-notes.d.ts +13 -0
  319. package/dist/hooks/use-invoice-notes.d.ts.map +1 -0
  320. package/dist/hooks/use-invoice-notes.js +12 -0
  321. package/dist/hooks/use-invoice-number-series-mutation.d.ts +62 -0
  322. package/dist/hooks/use-invoice-number-series-mutation.d.ts.map +1 -0
  323. package/dist/hooks/use-invoice-number-series-mutation.js +39 -0
  324. package/dist/hooks/use-invoice-number-series.d.ts +28 -0
  325. package/dist/hooks/use-invoice-number-series.d.ts.map +1 -0
  326. package/dist/hooks/use-invoice-number-series.js +12 -0
  327. package/dist/hooks/use-invoice-payment-mutation.d.ts +29 -0
  328. package/dist/hooks/use-invoice-payment-mutation.d.ts.map +1 -0
  329. package/dist/hooks/use-invoice-payment-mutation.js +35 -0
  330. package/dist/hooks/use-invoice-payments.d.ts +21 -0
  331. package/dist/hooks/use-invoice-payments.d.ts.map +1 -0
  332. package/dist/hooks/use-invoice-payments.js +12 -0
  333. package/dist/hooks/use-invoice.d.ts +32 -0
  334. package/dist/hooks/use-invoice.d.ts.map +1 -0
  335. package/dist/hooks/use-invoice.js +12 -0
  336. package/dist/hooks/use-invoices.d.ts +36 -0
  337. package/dist/hooks/use-invoices.d.ts.map +1 -0
  338. package/dist/hooks/use-invoices.js +12 -0
  339. package/dist/hooks/use-payment-mutation.d.ts +57 -0
  340. package/dist/hooks/use-payment-mutation.d.ts.map +1 -0
  341. package/dist/hooks/use-payment-mutation.js +59 -0
  342. package/dist/hooks/use-payment-session-mutation.d.ts +205 -0
  343. package/dist/hooks/use-payment-session-mutation.d.ts.map +1 -0
  344. package/dist/hooks/use-payment-session-mutation.js +38 -0
  345. package/dist/hooks/use-payment-sessions.d.ts +97 -0
  346. package/dist/hooks/use-payment-sessions.d.ts.map +1 -0
  347. package/dist/hooks/use-payment-sessions.js +17 -0
  348. package/dist/hooks/use-payment.d.ts +31 -0
  349. package/dist/hooks/use-payment.d.ts.map +1 -0
  350. package/dist/hooks/use-payment.js +12 -0
  351. package/dist/hooks/use-product-profitability.d.ts +52 -0
  352. package/dist/hooks/use-product-profitability.d.ts.map +1 -0
  353. package/dist/hooks/use-product-profitability.js +12 -0
  354. package/dist/hooks/use-public-booking-documents.d.ts +29 -0
  355. package/dist/hooks/use-public-booking-documents.d.ts.map +1 -0
  356. package/dist/hooks/use-public-booking-documents.js +12 -0
  357. package/dist/hooks/use-public-booking-payment-options.d.ts +47 -0
  358. package/dist/hooks/use-public-booking-payment-options.d.ts.map +1 -0
  359. package/dist/hooks/use-public-booking-payment-options.js +12 -0
  360. package/dist/hooks/use-public-booking-payments.d.ts +24 -0
  361. package/dist/hooks/use-public-booking-payments.d.ts.map +1 -0
  362. package/dist/hooks/use-public-booking-payments.js +12 -0
  363. package/dist/hooks/use-public-finance-document-by-reference.d.ts +27 -0
  364. package/dist/hooks/use-public-finance-document-by-reference.d.ts.map +1 -0
  365. package/dist/hooks/use-public-finance-document-by-reference.js +12 -0
  366. package/dist/hooks/use-public-payment-session-mutation.d.ts +82 -0
  367. package/dist/hooks/use-public-payment-session-mutation.d.ts.map +1 -0
  368. package/dist/hooks/use-public-payment-session-mutation.js +33 -0
  369. package/dist/hooks/use-public-payment-session.d.ts +73 -0
  370. package/dist/hooks/use-public-payment-session.d.ts.map +1 -0
  371. package/dist/hooks/use-public-payment-session.js +12 -0
  372. package/dist/hooks/use-public-voucher-validation-mutation.d.ts +23 -0
  373. package/dist/hooks/use-public-voucher-validation-mutation.d.ts.map +1 -0
  374. package/dist/hooks/use-public-voucher-validation-mutation.js +17 -0
  375. package/dist/hooks/use-supplier-invoice-attachments.d.ts +17 -0
  376. package/dist/hooks/use-supplier-invoice-attachments.d.ts.map +1 -0
  377. package/dist/hooks/use-supplier-invoice-attachments.js +12 -0
  378. package/dist/hooks/use-supplier-invoice-mutation.d.ts +353 -0
  379. package/dist/hooks/use-supplier-invoice-mutation.d.ts.map +1 -0
  380. package/dist/hooks/use-supplier-invoice-mutation.js +81 -0
  381. package/dist/hooks/use-supplier-invoice-payments.d.ts +26 -0
  382. package/dist/hooks/use-supplier-invoice-payments.d.ts.map +1 -0
  383. package/dist/hooks/use-supplier-invoice-payments.js +12 -0
  384. package/dist/hooks/use-supplier-invoice.d.ts +65 -0
  385. package/dist/hooks/use-supplier-invoice.d.ts.map +1 -0
  386. package/dist/hooks/use-supplier-invoice.js +12 -0
  387. package/dist/hooks/use-supplier-invoices.d.ts +36 -0
  388. package/dist/hooks/use-supplier-invoices.d.ts.map +1 -0
  389. package/dist/hooks/use-supplier-invoices.js +12 -0
  390. package/dist/hooks/use-supplier-payment-mutation.d.ts +55 -0
  391. package/dist/hooks/use-supplier-payment-mutation.d.ts.map +1 -0
  392. package/dist/hooks/use-supplier-payment-mutation.js +35 -0
  393. package/dist/hooks/use-supplier-payments.d.ts +27 -0
  394. package/dist/hooks/use-supplier-payments.d.ts.map +1 -0
  395. package/dist/hooks/use-supplier-payments.js +12 -0
  396. package/dist/hooks/use-traveler-profitability.d.ts +24 -0
  397. package/dist/hooks/use-traveler-profitability.d.ts.map +1 -0
  398. package/dist/hooks/use-traveler-profitability.js +11 -0
  399. package/dist/hooks/use-voucher-mutation.d.ts +105 -0
  400. package/dist/hooks/use-voucher-mutation.d.ts.map +1 -0
  401. package/dist/hooks/use-voucher-mutation.js +50 -0
  402. package/dist/hooks/use-voucher.d.ts +38 -0
  403. package/dist/hooks/use-voucher.d.ts.map +1 -0
  404. package/dist/hooks/use-voucher.js +17 -0
  405. package/dist/hooks/use-vouchers.d.ts +34 -0
  406. package/dist/hooks/use-vouchers.d.ts.map +1 -0
  407. package/dist/hooks/use-vouchers.js +18 -0
  408. package/dist/i18n/en/invoices.d.ts +278 -0
  409. package/dist/i18n/en/invoices.d.ts.map +1 -0
  410. package/dist/i18n/en/invoices.js +277 -0
  411. package/dist/i18n/en/numberingAndPayments.d.ts +387 -0
  412. package/dist/i18n/en/numberingAndPayments.d.ts.map +1 -0
  413. package/dist/i18n/en/numberingAndPayments.js +386 -0
  414. package/dist/i18n/en/profitability.d.ts +147 -0
  415. package/dist/i18n/en/profitability.d.ts.map +1 -0
  416. package/dist/i18n/en/profitability.js +146 -0
  417. package/dist/i18n/en/suppliers.d.ts +187 -0
  418. package/dist/i18n/en/suppliers.d.ts.map +1 -0
  419. package/dist/i18n/en/suppliers.js +186 -0
  420. package/dist/i18n/en.d.ts +998 -0
  421. package/dist/i18n/en.d.ts.map +1 -0
  422. package/dist/i18n/en.js +22 -0
  423. package/dist/i18n/index.d.ts +5 -0
  424. package/dist/i18n/index.d.ts.map +1 -0
  425. package/dist/i18n/index.js +3 -0
  426. package/dist/i18n/messages/core.d.ts +18 -0
  427. package/dist/i18n/messages/core.d.ts.map +1 -0
  428. package/dist/i18n/messages/core.js +30 -0
  429. package/dist/i18n/messages/invoices.d.ts +252 -0
  430. package/dist/i18n/messages/invoices.d.ts.map +1 -0
  431. package/dist/i18n/messages/invoices.js +1 -0
  432. package/dist/i18n/messages/numberingAndPayments.d.ts +277 -0
  433. package/dist/i18n/messages/numberingAndPayments.d.ts.map +1 -0
  434. package/dist/i18n/messages/numberingAndPayments.js +1 -0
  435. package/dist/i18n/messages/profitability.d.ts +151 -0
  436. package/dist/i18n/messages/profitability.d.ts.map +1 -0
  437. package/dist/i18n/messages/profitability.js +1 -0
  438. package/dist/i18n/messages/suppliers.d.ts +167 -0
  439. package/dist/i18n/messages/suppliers.d.ts.map +1 -0
  440. package/dist/i18n/messages/suppliers.js +1 -0
  441. package/dist/i18n/messages.d.ts +29 -0
  442. package/dist/i18n/messages.d.ts.map +1 -0
  443. package/dist/i18n/messages.js +1 -0
  444. package/dist/i18n/provider.d.ts +2018 -0
  445. package/dist/i18n/provider.d.ts.map +1 -0
  446. package/dist/i18n/provider.js +44 -0
  447. package/dist/i18n/ro/invoices.d.ts +278 -0
  448. package/dist/i18n/ro/invoices.d.ts.map +1 -0
  449. package/dist/i18n/ro/invoices.js +277 -0
  450. package/dist/i18n/ro/numberingAndPayments.d.ts +387 -0
  451. package/dist/i18n/ro/numberingAndPayments.d.ts.map +1 -0
  452. package/dist/i18n/ro/numberingAndPayments.js +386 -0
  453. package/dist/i18n/ro/profitability.d.ts +147 -0
  454. package/dist/i18n/ro/profitability.d.ts.map +1 -0
  455. package/dist/i18n/ro/profitability.js +146 -0
  456. package/dist/i18n/ro/suppliers.d.ts +187 -0
  457. package/dist/i18n/ro/suppliers.d.ts.map +1 -0
  458. package/dist/i18n/ro/suppliers.js +186 -0
  459. package/dist/i18n/ro.d.ts +998 -0
  460. package/dist/i18n/ro.d.ts.map +1 -0
  461. package/dist/i18n/ro.js +22 -0
  462. package/dist/index.d.ts +11 -0
  463. package/dist/index.d.ts.map +1 -0
  464. package/dist/index.js +9 -0
  465. package/dist/operations.d.ts +484 -0
  466. package/dist/operations.d.ts.map +1 -0
  467. package/dist/operations.js +52 -0
  468. package/dist/provider.d.ts +2 -0
  469. package/dist/provider.d.ts.map +1 -0
  470. package/dist/provider.js +1 -0
  471. package/dist/query-keys.d.ts +195 -0
  472. package/dist/query-keys.d.ts.map +1 -0
  473. package/dist/query-keys.js +49 -0
  474. package/dist/query-options/public-reporting.d.ts +2129 -0
  475. package/dist/query-options/public-reporting.d.ts.map +1 -0
  476. package/dist/query-options/public-reporting.js +193 -0
  477. package/dist/query-options-action-ledger.d.ts +382 -0
  478. package/dist/query-options-action-ledger.d.ts.map +1 -0
  479. package/dist/query-options-action-ledger.js +36 -0
  480. package/dist/query-options.d.ts +2057 -0
  481. package/dist/query-options.d.ts.map +1 -0
  482. package/dist/query-options.js +328 -0
  483. package/dist/schemas/accountant.d.ts +168 -0
  484. package/dist/schemas/accountant.d.ts.map +1 -0
  485. package/dist/schemas/accountant.js +53 -0
  486. package/dist/schemas/action-ledger.d.ts +206 -0
  487. package/dist/schemas/action-ledger.d.ts.map +1 -0
  488. package/dist/schemas/action-ledger.js +83 -0
  489. package/dist/schemas/common.d.ts +17 -0
  490. package/dist/schemas/common.d.ts.map +1 -0
  491. package/dist/schemas/common.js +10 -0
  492. package/dist/schemas/invoice.d.ts +1451 -0
  493. package/dist/schemas/invoice.d.ts.map +1 -0
  494. package/dist/schemas/invoice.js +438 -0
  495. package/dist/schemas/profitability.d.ts +333 -0
  496. package/dist/schemas/profitability.d.ts.map +1 -0
  497. package/dist/schemas/profitability.js +84 -0
  498. package/dist/schemas/public.d.ts +481 -0
  499. package/dist/schemas/public.d.ts.map +1 -0
  500. package/dist/schemas/public.js +9 -0
  501. package/dist/schemas/responses.d.ts +632 -0
  502. package/dist/schemas/responses.d.ts.map +1 -0
  503. package/dist/schemas/responses.js +27 -0
  504. package/dist/schemas/supplier.d.ts +226 -0
  505. package/dist/schemas/supplier.d.ts.map +1 -0
  506. package/dist/schemas/supplier.js +103 -0
  507. package/dist/schemas/vouchers.d.ts +283 -0
  508. package/dist/schemas/vouchers.d.ts.map +1 -0
  509. package/dist/schemas/vouchers.js +49 -0
  510. package/dist/schemas.d.ts +10 -0
  511. package/dist/schemas.d.ts.map +1 -0
  512. package/dist/schemas.js +9 -0
  513. package/dist/ui.d.ts +27 -0
  514. package/dist/ui.d.ts.map +1 -0
  515. package/dist/ui.js +26 -0
  516. package/package.json +181 -0
  517. package/src/styles.css +12 -0
@@ -0,0 +1,121 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { buildPaymentLinkUrl } from "@voyant-travel/finance/payment-link";
4
+ import { formatMessage } from "@voyant-travel/i18n";
5
+ import { Button } from "@voyant-travel/ui/components/button";
6
+ import { CurrencyCombobox } from "@voyant-travel/ui/components/currency-combobox";
7
+ import { CurrencyInput } from "@voyant-travel/ui/components/currency-input";
8
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@voyant-travel/ui/components/dialog";
9
+ import { Label } from "@voyant-travel/ui/components/label";
10
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@voyant-travel/ui/components/select";
11
+ import { CheckCircle2, Copy, ExternalLink, Loader2, X } from "lucide-react";
12
+ import { useEffect, useMemo, useRef, useState } from "react";
13
+ import { toast } from "sonner";
14
+ import { useCheckoutPaymentLinkConfig, useCollectPayment } from "../checkout-hooks/index.js";
15
+ import { useCheckoutUiMessagesOrDefault } from "../checkout-i18n/provider.js";
16
+ import { useBookingPaymentSchedules } from "../hooks/use-booking-payment-schedules.js";
17
+ const FULL_AMOUNT_VALUE = "__full__";
18
+ export function CollectPaymentDialog({ open, onOpenChange, bookingId, defaultCurrency, defaultAmountCents, defaultPayerEmail, defaultPayerName, defaultPayerLanguage, returnUrl, cancelUrl, cardProvider, }) {
19
+ const messages = useCheckoutUiMessagesOrDefault().collectPaymentDialog;
20
+ const [amountCents, setAmountCents] = useState(defaultAmountCents ?? 0);
21
+ const [scheduleId, setScheduleId] = useState(FULL_AMOUNT_VALUE);
22
+ const [currency, setCurrency] = useState(defaultCurrency);
23
+ const [result, setResult] = useState(null);
24
+ const schedulesQuery = useBookingPaymentSchedules(bookingId, { enabled: open });
25
+ // Only the open schedules are useful pre-fills. Paid / waived /
26
+ // cancelled / expired wouldn't represent money the customer still
27
+ // needs to send.
28
+ const schedules = useMemo(() => (schedulesQuery.data?.data ?? []).filter((s) => s.status === "pending" || s.status === "due"), [schedulesQuery.data?.data]);
29
+ const collect = useCollectPayment(bookingId, {
30
+ cardProvider,
31
+ payerEmail: defaultPayerEmail,
32
+ payerName: defaultPayerName,
33
+ payerLanguage: defaultPayerLanguage,
34
+ returnUrl,
35
+ cancelUrl,
36
+ });
37
+ // Re-seed the amount from the latest props only on the closed→open
38
+ // transition. Watching state mid-flight would clobber manual edits.
39
+ const wasOpenRef = useRef(false);
40
+ useEffect(() => {
41
+ if (open && !wasOpenRef.current) {
42
+ setAmountCents(defaultAmountCents ?? 0);
43
+ setScheduleId(FULL_AMOUNT_VALUE);
44
+ setCurrency(defaultCurrency);
45
+ }
46
+ wasOpenRef.current = open;
47
+ }, [open, defaultAmountCents, defaultCurrency]);
48
+ function reset() {
49
+ setAmountCents(defaultAmountCents ?? 0);
50
+ setScheduleId(FULL_AMOUNT_VALUE);
51
+ setCurrency(defaultCurrency);
52
+ setResult(null);
53
+ collect.reset();
54
+ }
55
+ async function submit() {
56
+ if (amountCents <= 0) {
57
+ toast.error(messages.validation.amountAboveZero);
58
+ return;
59
+ }
60
+ try {
61
+ const data = await collect.mutateAsync({ choice: { type: "hold" }, amountCents });
62
+ setResult(data);
63
+ toast.success(messages.validation.linkReady);
64
+ }
65
+ catch (err) {
66
+ toast.error(err.message);
67
+ }
68
+ }
69
+ return (_jsx(Dialog, { open: open, onOpenChange: (next) => {
70
+ onOpenChange(next);
71
+ if (!next)
72
+ reset();
73
+ }, children: _jsxs(DialogContent, { className: "max-w-lg gap-0 p-0", children: [_jsxs(DialogHeader, { className: "border-b px-6 py-4", children: [_jsx(DialogTitle, { children: messages.title }), _jsx(DialogDescription, { children: messages.description })] }), result ? (_jsx("div", { className: "px-6 py-5", children: _jsx(ResultPanel, { result: result }) })) : (_jsxs("div", { className: "flex flex-col gap-4 px-6 py-5", children: [schedules.length > 0 ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "collect-schedule", children: messages.scheduleLabel }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Select, { value: scheduleId, onValueChange: (v) => {
74
+ const next = v ?? FULL_AMOUNT_VALUE;
75
+ setScheduleId(next);
76
+ if (next !== FULL_AMOUNT_VALUE) {
77
+ const schedule = schedules.find((s) => s.id === next);
78
+ if (schedule) {
79
+ setAmountCents(schedule.amountCents);
80
+ setCurrency(schedule.currency);
81
+ }
82
+ }
83
+ }, children: [_jsx(SelectTrigger, { id: "collect-schedule", className: "w-full", children: _jsx(SelectValue, { placeholder: messages.scheduleCustomPlaceholder }) }), _jsx(SelectContent, { children: schedules.map((schedule) => (_jsx(SelectItem, { value: schedule.id, children: formatScheduleOption(schedule, messages.scheduleTypeLabels) }, schedule.id))) })] }), scheduleId !== FULL_AMOUNT_VALUE ? (_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": messages.scheduleClear, onClick: () => {
84
+ setScheduleId(FULL_AMOUNT_VALUE);
85
+ setAmountCents(defaultAmountCents ?? 0);
86
+ setCurrency(defaultCurrency);
87
+ }, children: _jsx(X, { className: "h-4 w-4" }) })) : null] })] })) : null, scheduleId === FULL_AMOUNT_VALUE ? (_jsxs("div", { className: "grid grid-cols-[1fr_minmax(8rem,12rem)] gap-3", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "collect-amount", children: messages.amountLabelShort }), _jsx(CurrencyInput, { id: "collect-amount", value: amountCents, onChange: (next) => setAmountCents(next ?? 0), currency: currency })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "collect-currency", children: messages.currencyLabel }), _jsx(CurrencyCombobox, { value: currency, onChange: (next) => setCurrency(next ?? defaultCurrency) })] })] })) : null] })), _jsx("div", { className: "flex items-center justify-end gap-2 px-6 pb-6", children: result ? (_jsx(Button, { onClick: () => onOpenChange(false), children: messages.done })) : (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), disabled: collect.isPending, children: messages.cancel }), _jsxs(Button, { onClick: submit, disabled: collect.isPending || amountCents <= 0, children: [collect.isPending && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), messages.generateLink] })] })) })] }) }));
88
+ }
89
+ function formatAmount(cents, currency) {
90
+ if (cents <= 0)
91
+ return `0 ${currency}`;
92
+ try {
93
+ return new Intl.NumberFormat(undefined, { style: "currency", currency }).format(cents / 100);
94
+ }
95
+ catch {
96
+ return `${(cents / 100).toFixed(2)} ${currency}`;
97
+ }
98
+ }
99
+ function formatScheduleOption(schedule, typeLabels) {
100
+ const typeLabel = typeLabels[schedule.scheduleType] ?? schedule.scheduleType;
101
+ const amount = formatAmount(schedule.amountCents, schedule.currency);
102
+ return `${typeLabel} • ${amount} • ${schedule.dueDate}`;
103
+ }
104
+ function ResultPanel({ result }) {
105
+ const messages = useCheckoutUiMessagesOrDefault().collectPaymentDialog;
106
+ const configQuery = useCheckoutPaymentLinkConfig();
107
+ const sessionId = result.paymentSession?.id ?? null;
108
+ const landingUrl = sessionId && typeof window !== "undefined"
109
+ ? buildPaymentLinkUrl(sessionId, {
110
+ baseUrl: configQuery.data?.publicCheckoutBaseUrl ?? window.location.origin,
111
+ })
112
+ : null;
113
+ if (!landingUrl) {
114
+ return (_jsx("div", { className: "rounded-xl border border-amber-500/40 bg-amber-500/5 p-5 text-sm", children: formatMessage(messages.result.noLink, {
115
+ sessionId: sessionId ?? messages.result.noSession,
116
+ }) }));
117
+ }
118
+ return (_jsxs("div", { className: "flex flex-col gap-4 rounded-xl border bg-card p-5", children: [_jsxs("div", { className: "flex items-center gap-2 text-emerald-700", children: [_jsx(CheckCircle2, { className: "h-5 w-5" }), _jsx("span", { className: "font-medium", children: messages.result.ready })] }), _jsx("p", { className: "text-muted-foreground text-sm", children: messages.result.body }), _jsxs("div", { className: "flex items-center gap-2 rounded-md border bg-muted/30 p-3 font-mono text-xs", children: [_jsx("span", { className: "flex-1 break-all", children: landingUrl }), _jsx("button", { type: "button", "aria-label": messages.result.copyLink, className: "text-muted-foreground hover:text-foreground", onClick: () => {
119
+ navigator.clipboard?.writeText(landingUrl).catch(() => undefined);
120
+ }, children: _jsx(Copy, { className: "h-3.5 w-3.5" }) }), _jsx("a", { href: landingUrl, target: "_blank", rel: "noreferrer", "aria-label": messages.result.openLink, className: "text-muted-foreground hover:text-foreground", children: _jsx(ExternalLink, { className: "h-3.5 w-3.5" }) })] })] }));
121
+ }
@@ -0,0 +1,76 @@
1
+ import type { PublicPaymentSession } from "@voyant-travel/finance/public-validation";
2
+ import { type ReactNode } from "react";
3
+ /**
4
+ * Universal landing page rendered at `/pay/:sessionId`. The customer lands
5
+ * here from a payment-link email (or after returning from the processor's
6
+ * hosted checkout). Vertical-agnostic — same component for a flight order,
7
+ * a hotel deposit, or a cruise balance.
8
+ *
9
+ * The parent owns:
10
+ * - fetching `PublicPaymentSession` from `/v1/public/payment-sessions/:id`
11
+ * (typically via `usePublicPaymentSession` from `@voyant-travel/finance-react`)
12
+ * - re-fetching after the user returns from the processor (the processor
13
+ * redirects back to `session.returnUrl`; the page re-mounts and the
14
+ * latest status is shown)
15
+ * - sourcing the bank-transfer block from template config
16
+ *
17
+ * See `docs/architecture/payments-architecture.md` §Core Rule 4.
18
+ */
19
+ export interface PaymentLinkLandingPageProps {
20
+ session: PublicPaymentSession;
21
+ /** Bank-transfer instructions block — template-supplied per deployment. */
22
+ bankTransferInstructions?: BankTransferInstructions;
23
+ /** Header slot (logo, brand name, optional support contact). */
24
+ brandHeader?: ReactNode;
25
+ /** Footer slot (T&Cs link, support contact, privacy). */
26
+ brandFooter?: ReactNode;
27
+ /**
28
+ * Fired when the customer clicks "Pay by card" — the parent typically
29
+ * redirects to `session.redirectUrl` (the processor's hosted checkout).
30
+ */
31
+ onPayByCard?: () => void;
32
+ /**
33
+ * Optional human-readable description shown above the amount. Sourced
34
+ * from the booking / invoice / vertical context (the session record
35
+ * itself doesn't carry a description today).
36
+ */
37
+ description?: string;
38
+ /**
39
+ * Optional structured summary slot rendered above the payment methods.
40
+ * Templates use this to surface vertical-specific context (itinerary
41
+ * cards with thumbnails for trips, line items for invoices, etc.).
42
+ */
43
+ summary?: ReactNode;
44
+ /**
45
+ * Hide the raw `session.notes` paragraph in the header. Templates set this
46
+ * when the `summary` slot already conveys the same content in a
47
+ * structured form (so customers don't see the same data twice).
48
+ */
49
+ suppressNotes?: boolean;
50
+ /**
51
+ * Fired when the customer clicks "Try again" on a failed payment.
52
+ * Should create a fresh `payment_session` (the original one is dead)
53
+ * and redirect the customer to its landing page. The parent typically
54
+ * POSTs to `/v1/public/payment-link/:sessionId/retry` and navigates to
55
+ * `/pay/{newSessionId}` with the result. When omitted, the failed
56
+ * panel renders no retry CTA at all (clearer than a button that
57
+ * re-opens the dead processor URL).
58
+ */
59
+ onRetry?: () => Promise<void> | void;
60
+ }
61
+ export interface BankTransferInstructions {
62
+ beneficiaryName: string;
63
+ iban: string;
64
+ bic?: string;
65
+ bankName?: string;
66
+ /**
67
+ * Reference the customer must include in their wire so finance can
68
+ * reconcile the inbound transfer. Defaults to the session's
69
+ * `externalReference` / `clientReference` / `id` when not supplied.
70
+ */
71
+ reference?: string;
72
+ /** Free-text notes — surfaced under the IBAN block. */
73
+ notes?: string;
74
+ }
75
+ export declare function PaymentLinkLandingPage({ session, bankTransferInstructions, brandHeader, brandFooter, onPayByCard, onRetry, description, summary, suppressNotes, }: PaymentLinkLandingPageProps): import("react/jsx-runtime").JSX.Element;
76
+ //# sourceMappingURL=payment-link-landing-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-link-landing-page.d.ts","sourceRoot":"","sources":["../../src/checkout-components/payment-link-landing-page.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAA;AAcpF,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAahD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,oBAAoB,CAAA;IAC7B,2EAA2E;IAC3E,wBAAwB,CAAC,EAAE,wBAAwB,CAAA;IACnD,gEAAgE;IAChE,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,yDAAyD;IACzD,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACrC;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,wBAAwB,EACxB,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,WAAW,EACX,OAAO,EACP,aAAa,GACd,EAAE,2BAA2B,2CAe7B"}
@@ -0,0 +1,173 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { formatMessage } from "@voyant-travel/i18n";
4
+ import { Button } from "@voyant-travel/ui/components/button";
5
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@voyant-travel/ui/components/tabs";
6
+ import { cn } from "@voyant-travel/ui/lib/utils";
7
+ import { Building2, CheckCircle2, CircleAlert, Copy, CreditCard, ExternalLink, Loader2, } from "lucide-react";
8
+ import { useState } from "react";
9
+ import { useCheckoutUiI18nOrDefault, useCheckoutUiMessagesOrDefault, } from "../checkout-i18n/provider.js";
10
+ export function PaymentLinkLandingPage({ session, bankTransferInstructions, brandHeader, brandFooter, onPayByCard, onRetry, description, summary, suppressNotes, }) {
11
+ return (_jsxs("div", { className: "mx-auto flex min-h-screen w-full max-w-2xl flex-col gap-6 px-4 py-8", children: [brandHeader, _jsx(Header, { session: session, description: description, suppressNotes: suppressNotes }), summary ? _jsx("div", { children: summary }) : null, _jsx(Body, { session: session, bankTransferInstructions: bankTransferInstructions, onPayByCard: onPayByCard, onRetry: onRetry }), brandFooter] }));
12
+ }
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ function Header({ session, description, suppressNotes, }) {
15
+ const i18n = useCheckoutUiI18nOrDefault();
16
+ const messages = i18n.messages.paymentLinkLandingPage;
17
+ return (_jsxs("header", { className: "flex flex-col gap-2 border-b pb-4", children: [_jsx("h1", { className: "font-semibold text-2xl", children: description ?? defaultDescription(session, messages) }), !suppressNotes && session.notes ? (_jsx("p", { className: "whitespace-pre-line text-muted-foreground text-sm", children: session.notes })) : null, _jsxs("div", { className: "flex items-baseline gap-3", children: [_jsx("span", { className: "font-semibold text-3xl tabular-nums", children: i18n.formatCurrency(session.amountCents / 100, session.currency) }), session.expiresAt && session.status !== "paid" && (_jsx("span", { className: "text-muted-foreground text-sm", children: formatMessage(messages.expires, {
18
+ date: i18n.formatDateTime(session.expiresAt, {
19
+ day: "numeric",
20
+ month: "short",
21
+ hour: "2-digit",
22
+ minute: "2-digit",
23
+ }),
24
+ }) }))] })] }));
25
+ }
26
+ function Body({ session, bankTransferInstructions, onPayByCard, onRetry, }) {
27
+ const messages = useCheckoutUiMessagesOrDefault().paymentLinkLandingPage;
28
+ // Terminal states — short-circuit body to a status panel.
29
+ if (session.status === "paid")
30
+ return _jsx(TerminalState, { status: "paid", reason: null });
31
+ if (session.status === "failed") {
32
+ return (_jsx(TerminalState, { status: "failed", reason: session.failureMessage ?? null, onRetry: onRetry }));
33
+ }
34
+ if (session.status === "expired")
35
+ return _jsx(TerminalState, { status: "expired", reason: null });
36
+ if (session.status === "cancelled")
37
+ return _jsx(TerminalState, { status: "cancelled", reason: null });
38
+ if (session.status === "processing" || session.status === "authorized") {
39
+ return _jsx(ProcessingState, {});
40
+ }
41
+ const cardAvailable = Boolean(session.redirectUrl) ||
42
+ Boolean(session.provider) ||
43
+ session.status === "requires_redirect";
44
+ const bankAvailable = Boolean(bankTransferInstructions);
45
+ // No method available — soft fallback (rare; signals a misconfigured
46
+ // session that has neither a redirect URL nor a bank-transfer block).
47
+ if (!cardAvailable && !bankAvailable) {
48
+ return (_jsxs("div", { className: "rounded-xl border border-amber-500/40 bg-amber-500/5 p-5 text-sm", children: [_jsx("p", { className: "font-medium", children: messages.noMethods.title }), _jsx("p", { className: "mt-2 text-muted-foreground", children: messages.noMethods.body })] }));
49
+ }
50
+ // Single method — render inline without tabs.
51
+ if (cardAvailable && !bankAvailable) {
52
+ return _jsx(CardPanel, { session: session, onPayByCard: onPayByCard });
53
+ }
54
+ if (bankAvailable && !cardAvailable && bankTransferInstructions) {
55
+ return _jsx(BankTransferPanel, { session: session, instructions: bankTransferInstructions });
56
+ }
57
+ // Both methods — tab strip.
58
+ return (_jsxs(Tabs, { defaultValue: "card", className: "w-full", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-2", children: [_jsxs(TabsTrigger, { value: "card", children: [_jsx(CreditCard, { className: "mr-2 h-4 w-4" }), messages.cardTab] }), _jsxs(TabsTrigger, { value: "bank", children: [_jsx(Building2, { className: "mr-2 h-4 w-4" }), messages.bankTab] })] }), _jsx(TabsContent, { value: "card", className: "mt-4", children: _jsx(CardPanel, { session: session, onPayByCard: onPayByCard }) }), _jsx(TabsContent, { value: "bank", className: "mt-4", children: bankTransferInstructions && (_jsx(BankTransferPanel, { session: session, instructions: bankTransferInstructions })) })] }));
59
+ }
60
+ function CardPanel({ session, onPayByCard, }) {
61
+ const i18n = useCheckoutUiI18nOrDefault();
62
+ const messages = i18n.messages.paymentLinkLandingPage;
63
+ const [starting, setStarting] = useState(false);
64
+ const [error, setError] = useState(null);
65
+ const handleClick = async () => {
66
+ if (onPayByCard) {
67
+ onPayByCard();
68
+ return;
69
+ }
70
+ if (session.redirectUrl) {
71
+ window.location.href = session.redirectUrl;
72
+ return;
73
+ }
74
+ // Lazy-start the configured processor. The template exposes a public
75
+ // endpoint that calls e.g. `netopia.startPaymentSession` on demand and
76
+ // returns the redirect URL.
77
+ setStarting(true);
78
+ setError(null);
79
+ try {
80
+ const res = await fetch(`/api/v1/public/payment-link/${session.id}/start-card`, {
81
+ method: "POST",
82
+ headers: { Accept: "application/json" },
83
+ });
84
+ const body = (await res.json());
85
+ if (!res.ok || !body.data?.redirectUrl) {
86
+ throw new Error(body.error ?? messages.card.startFailed);
87
+ }
88
+ window.location.href = body.data.redirectUrl;
89
+ }
90
+ catch (err) {
91
+ setError(err.message);
92
+ setStarting(false);
93
+ }
94
+ };
95
+ return (_jsxs("div", { className: "rounded-xl border bg-card p-5 shadow-sm", children: [_jsx("p", { className: "mb-4 text-muted-foreground text-sm", children: messages.card.description }), _jsxs(Button, { className: "w-full", disabled: starting, onClick: handleClick, children: [starting && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), formatMessage(messages.card.payAmount, {
96
+ amount: i18n.formatCurrency(session.amountCents / 100, session.currency),
97
+ }), !starting && _jsx(ExternalLink, { className: "ml-2 h-4 w-4" })] }), error && (_jsx("p", { className: "mt-3 text-destructive text-xs", children: formatMessage(messages.card.errorAdvice, { message: error }) }))] }));
98
+ }
99
+ function BankTransferPanel({ session, instructions, }) {
100
+ const i18n = useCheckoutUiI18nOrDefault();
101
+ const messages = i18n.messages.paymentLinkLandingPage;
102
+ const reference = instructions.reference ?? session.externalReference ?? session.clientReference ?? session.id;
103
+ return (_jsxs("div", { className: "rounded-xl border bg-card p-5 shadow-sm", children: [_jsx("p", { className: "mb-4 text-muted-foreground text-sm", children: formatMessage(messages.bank.instructions, {
104
+ amount: i18n.formatCurrency(session.amountCents / 100, session.currency),
105
+ }) }), _jsxs("dl", { className: "grid grid-cols-1 gap-2 text-sm", children: [_jsx(Row, { label: messages.bank.beneficiary, children: instructions.beneficiaryName }), _jsx(Row, { label: messages.bank.iban, copyValue: instructions.iban, children: _jsx("span", { className: "font-mono", children: instructions.iban }) }), instructions.bic && (_jsx(Row, { label: messages.bank.bicSwift, copyValue: instructions.bic, children: _jsx("span", { className: "font-mono", children: instructions.bic }) })), instructions.bankName && _jsx(Row, { label: messages.bank.bank, children: instructions.bankName }), _jsx(Row, { label: messages.bank.reference, copyValue: reference, children: _jsx("span", { className: "font-mono", children: reference }) })] }), instructions.notes && (_jsx("p", { className: "mt-4 text-muted-foreground text-xs", children: instructions.notes }))] }));
106
+ }
107
+ function Row({ label, children, copyValue, }) {
108
+ return (_jsxs("div", { className: "flex items-baseline justify-between gap-3 border-b py-1.5 last:border-b-0", children: [_jsx("dt", { className: "text-muted-foreground text-xs uppercase tracking-wider", children: label }), _jsxs("dd", { className: "flex items-center gap-2", children: [children, copyValue && _jsx(CopyButton, { value: copyValue })] })] }));
109
+ }
110
+ function CopyButton({ value }) {
111
+ const messages = useCheckoutUiMessagesOrDefault().paymentLinkLandingPage;
112
+ const [copied, setCopied] = useState(false);
113
+ return (_jsx("button", { type: "button", "aria-label": copied ? messages.copy.copied : formatMessage(messages.copy.copyValue, { value }), className: "text-muted-foreground transition-colors hover:text-foreground", onClick: async () => {
114
+ try {
115
+ await navigator.clipboard?.writeText(value);
116
+ setCopied(true);
117
+ setTimeout(() => setCopied(false), 1500);
118
+ }
119
+ catch {
120
+ // Older browsers without clipboard API — no-op; the value is still
121
+ // visible and selectable for manual copy.
122
+ }
123
+ }, children: copied ? (_jsx(CheckCircle2, { className: "h-3.5 w-3.5 text-emerald-600" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) }));
124
+ }
125
+ function TerminalState({ status, reason, onRetry, }) {
126
+ const messages = useCheckoutUiMessagesOrDefault().paymentLinkLandingPage;
127
+ const [retrying, setRetrying] = useState(false);
128
+ const [retryError, setRetryError] = useState(null);
129
+ const cfg = {
130
+ paid: {
131
+ icon: _jsx(CheckCircle2, { className: "h-10 w-10 text-emerald-600" }),
132
+ title: messages.terminal.paid.title,
133
+ body: messages.terminal.paid.body,
134
+ tone: "border-emerald-500/40 bg-emerald-500/5",
135
+ },
136
+ failed: {
137
+ icon: _jsx(CircleAlert, { className: "h-10 w-10 text-destructive" }),
138
+ title: messages.terminal.failed.title,
139
+ body: reason ?? messages.terminal.failed.body,
140
+ tone: "border-destructive/40 bg-destructive/5",
141
+ },
142
+ expired: {
143
+ icon: _jsx(CircleAlert, { className: "h-10 w-10 text-amber-600" }),
144
+ title: messages.terminal.expired.title,
145
+ body: messages.terminal.expired.body,
146
+ tone: "border-amber-500/40 bg-amber-500/5",
147
+ },
148
+ cancelled: {
149
+ icon: _jsx(CircleAlert, { className: "h-10 w-10 text-muted-foreground" }),
150
+ title: messages.terminal.cancelled.title,
151
+ body: messages.terminal.cancelled.body,
152
+ tone: "border-border bg-muted/20",
153
+ },
154
+ }[status];
155
+ return (_jsxs("div", { className: cn("flex flex-col items-center gap-3 rounded-xl border p-8 text-center", cfg.tone), children: [cfg.icon, _jsx("h2", { className: "font-semibold text-lg", children: cfg.title }), _jsx("p", { className: "max-w-md text-muted-foreground text-sm", children: cfg.body }), status === "failed" && onRetry && (_jsxs(_Fragment, { children: [_jsxs(Button, { className: "mt-2", disabled: retrying, onClick: async () => {
156
+ setRetrying(true);
157
+ setRetryError(null);
158
+ try {
159
+ await onRetry();
160
+ }
161
+ catch (err) {
162
+ setRetryError(err.message);
163
+ setRetrying(false);
164
+ }
165
+ }, children: [retrying && _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), messages.terminal.tryAgain] }), retryError && _jsx("p", { className: "text-destructive text-xs", children: retryError })] }))] }));
166
+ }
167
+ function ProcessingState() {
168
+ const messages = useCheckoutUiMessagesOrDefault().paymentLinkLandingPage;
169
+ return (_jsxs("div", { className: "flex flex-col items-center gap-3 rounded-xl border bg-card p-8 text-center", children: [_jsx(Loader2, { className: "h-10 w-10 animate-spin text-muted-foreground" }), _jsx("h2", { className: "font-semibold text-lg", children: messages.processing.title }), _jsx("p", { className: "max-w-md text-muted-foreground text-sm", children: messages.processing.body })] }));
170
+ }
171
+ function defaultDescription(session, messages) {
172
+ return messages.descriptions[session.targetType] ?? messages.descriptions.default;
173
+ }
@@ -0,0 +1,42 @@
1
+ import { type ReactNode } from "react";
2
+ import type { PaymentStepExtraOption as CheckoutPaymentStepExtraOption, PaymentChoice, PaymentStepCapabilities, SavedPaymentAccount } from "../checkout-types.js";
3
+ /**
4
+ * UI-side extension of the `PaymentStepExtraOption` from finance-react —
5
+ * adds an optional `icon` slot since the icon is a presentation concern.
6
+ */
7
+ export interface PaymentStepExtraOption extends CheckoutPaymentStepExtraOption {
8
+ icon?: ReactNode;
9
+ }
10
+ export interface PaymentStepProps {
11
+ value: PaymentChoice | null;
12
+ onChange: (next: PaymentChoice | null) => void;
13
+ /**
14
+ * What the active processor / template actually offers. Each `false`
15
+ * value hides its section. Honest — no invented capability strings.
16
+ */
17
+ capabilities: PaymentStepCapabilities;
18
+ /** Saved methods on file — surfaced when `capabilities.chargeSavedCard` is true. */
19
+ savedMethods?: SavedPaymentAccount[];
20
+ loadingSavedMethods?: boolean;
21
+ /**
22
+ * Vertical-specific always-available options. Rendered after the
23
+ * capability-gated sections, before the universal Hold option.
24
+ */
25
+ extraOptions?: ReadonlyArray<PaymentStepExtraOption>;
26
+ /** Hide the universal "Hold — pay later" option (some verticals don't support it). */
27
+ hideHoldOption?: boolean;
28
+ }
29
+ /**
30
+ * Admin-side payment picker. Renders the sections the parent has wired:
31
+ *
32
+ * - Saved cards on file ← capabilities.chargeSavedCard
33
+ * - Charge a new card now ← capabilities.newCard
34
+ * - Vertical-specific extras ← always rendered (e.g. "Issue on credit")
35
+ * - Hold — generate payment link ← always rendered (unless hideHoldOption)
36
+ *
37
+ * The customer's card-vs-bank-transfer decision happens on the public
38
+ * `/pay/:sessionId` landing page, not here. That keeps the admin UI to
39
+ * three real choices: charge now, vertical action, or hold + share link.
40
+ */
41
+ export declare function PaymentStep({ value, onChange, capabilities, savedMethods, loadingSavedMethods, extraOptions, hideHoldOption, }: PaymentStepProps): import("react/jsx-runtime").JSX.Element;
42
+ //# sourceMappingURL=payment-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-step.d.ts","sourceRoot":"","sources":["../../src/checkout-components/payment-step.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAEhD,OAAO,KAAK,EACV,sBAAsB,IAAI,8BAA8B,EACxD,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,sBAAsB,CAAA;AAE7B;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,8BAA8B;IAC5E,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAA;IAE9C;;;OAGG;IACH,YAAY,EAAE,uBAAuB,CAAA;IAErC,oFAAoF;IACpF,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACpC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;;OAGG;IACH,YAAY,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAA;IAEpD,sFAAsF;IACtF,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,EAAE,gBAAgB,2CA2BlB"}
@@ -0,0 +1,113 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { formatMessage } from "@voyant-travel/i18n";
4
+ import { Input } from "@voyant-travel/ui/components/input";
5
+ import { Label } from "@voyant-travel/ui/components/label";
6
+ import { RadioGroup, RadioGroupItem } from "@voyant-travel/ui/components/radio-group";
7
+ import { cn } from "@voyant-travel/ui/lib/utils";
8
+ import { Banknote, CreditCard, Wallet } from "lucide-react";
9
+ import { useState } from "react";
10
+ import { useCheckoutUiMessagesOrDefault } from "../checkout-i18n/provider.js";
11
+ /**
12
+ * Admin-side payment picker. Renders the sections the parent has wired:
13
+ *
14
+ * - Saved cards on file ← capabilities.chargeSavedCard
15
+ * - Charge a new card now ← capabilities.newCard
16
+ * - Vertical-specific extras ← always rendered (e.g. "Issue on credit")
17
+ * - Hold — generate payment link ← always rendered (unless hideHoldOption)
18
+ *
19
+ * The customer's card-vs-bank-transfer decision happens on the public
20
+ * `/pay/:sessionId` landing page, not here. That keeps the admin UI to
21
+ * three real choices: charge now, vertical action, or hold + share link.
22
+ */
23
+ export function PaymentStep({ value, onChange, capabilities, savedMethods, loadingSavedMethods, extraOptions, hideHoldOption, }) {
24
+ const messages = useCheckoutUiMessagesOrDefault().paymentStep;
25
+ return (_jsxs("div", { className: "flex flex-col gap-5", children: [_jsxs("div", { children: [_jsx("h2", { className: "font-semibold text-base", children: messages.title }), _jsx("p", { className: "text-muted-foreground text-sm", children: messages.description })] }), capabilities.chargeSavedCard && (_jsx(SavedMethodsSection, { loading: loadingSavedMethods, methods: savedMethods ?? [], selectedId: value?.type === "saved_method" ? value.method.id : null, onSelect: (method) => onChange({ type: "saved_method", method }) })), _jsx(AltMethodsSection, { value: value, onChange: onChange, showNewCard: !!capabilities.newCard, extraOptions: extraOptions ?? [], hideHoldOption: hideHoldOption })] }));
26
+ }
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+ function SavedMethodsSection({ loading, methods, selectedId, onSelect, }) {
29
+ const messages = useCheckoutUiMessagesOrDefault().paymentStep.savedMethods;
30
+ return (_jsxs("section", { className: "rounded-xl border bg-card p-5 shadow-sm", children: [_jsxs("header", { className: "mb-3 flex items-center justify-between", children: [_jsx("h3", { className: "font-medium text-sm", children: messages.title }), methods.length > 0 && (_jsx("span", { className: "text-muted-foreground text-xs", children: formatMessage(messages.countOnFile, { count: methods.length }) }))] }), loading ? (_jsx("div", { className: "h-16 animate-pulse rounded-md bg-muted/40" })) : methods.length === 0 ? (_jsx("div", { className: "rounded-md border border-dashed p-4 text-center text-muted-foreground text-xs", children: messages.empty })) : (_jsx("ul", { className: "flex flex-col gap-2", children: methods.map((m) => {
31
+ const selected = selectedId === m.id;
32
+ return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => onSelect(m), className: cn("flex w-full items-center gap-3 rounded-md border bg-background p-3 text-left transition-colors", selected
33
+ ? "border-primary ring-2 ring-primary/20"
34
+ : "hover:border-primary/40 hover:bg-accent/30"), children: [_jsx(BrandTile, { brand: m.brand }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col leading-tight", children: [_jsxs("span", { className: "font-medium text-sm", children: [m.label, m.last4 && (_jsxs(_Fragment, { children: [" ···· ", _jsx("span", { className: "font-mono", children: m.last4 })] })), m.isDefault && (_jsx("span", { className: "ml-2 rounded-full bg-primary/10 px-1.5 py-0.5 font-medium text-[9px] text-primary uppercase tracking-wider", children: messages.defaultBadge }))] }), m.expiryMonth && m.expiryYear && (_jsx("span", { className: "text-muted-foreground text-xs", children: formatMessage(messages.expires, {
35
+ month: String(m.expiryMonth).padStart(2, "0"),
36
+ year: m.expiryYear,
37
+ }) }))] }), selected && (_jsx("span", { className: "font-medium text-primary text-xs", children: messages.selected }))] }) }, m.id));
38
+ }) }))] }));
39
+ }
40
+ function AltMethodsSection({ value, onChange, showNewCard, extraOptions, hideHoldOption, }) {
41
+ const messages = useCheckoutUiMessagesOrDefault().paymentStep.otherOptions;
42
+ const [newCardName, setNewCardName] = useState("");
43
+ const [newCardNumber, setNewCardNumber] = useState("");
44
+ const [newCardExp, setNewCardExp] = useState("");
45
+ const activeId = (() => {
46
+ if (value == null)
47
+ return null;
48
+ if (value.type === "saved_method")
49
+ return null;
50
+ if (value.type === "new_card")
51
+ return "new_card";
52
+ if (value.type === "hold")
53
+ return "hold";
54
+ if (value.type === "extra")
55
+ return `extra:${value.optionId}`;
56
+ return null;
57
+ })();
58
+ const setAlt = (id) => {
59
+ if (id === "hold") {
60
+ onChange({ type: "hold" });
61
+ }
62
+ else if (id === "new_card") {
63
+ onChange({
64
+ type: "new_card",
65
+ cardToken: tokenizeNewCard(newCardNumber),
66
+ ...(newCardName ? { cardholderName: newCardName } : {}),
67
+ ...(newCardExp ? { expiry: newCardExp } : {}),
68
+ });
69
+ }
70
+ else if (id.startsWith("extra:")) {
71
+ onChange({ type: "extra", optionId: id.slice("extra:".length) });
72
+ }
73
+ };
74
+ return (_jsxs("section", { className: "rounded-xl border bg-card p-5 shadow-sm", children: [_jsx("header", { className: "mb-3 flex items-center justify-between", children: _jsx("h3", { className: "font-medium text-sm", children: messages.title }) }), _jsxs(RadioGroup, { value: activeId ?? "__none", onValueChange: (v) => {
75
+ if (!v)
76
+ return;
77
+ if (v === "new_card" || v === "hold" || v.startsWith("extra:")) {
78
+ setAlt(v);
79
+ }
80
+ }, className: "flex flex-col gap-2", children: [showNewCard && (_jsx(AltRow, { id: "new_card", icon: _jsx(CreditCard, { className: "h-4 w-4 text-muted-foreground" }), title: messages.newCard.title, body: messages.newCard.body, active: activeId === "new_card", children: activeId === "new_card" && (_jsxs("div", { className: "mt-3 grid grid-cols-1 gap-3 md:grid-cols-3", children: [_jsx(Field, { label: messages.newCard.cardholderName, children: _jsx(Input, { value: newCardName, onChange: (e) => {
81
+ setNewCardName(e.target.value);
82
+ if (value?.type === "new_card") {
83
+ onChange({ ...value, cardholderName: e.target.value });
84
+ }
85
+ } }) }), _jsx(Field, { label: messages.newCard.cardNumber, children: _jsx(Input, { inputMode: "numeric", placeholder: messages.newCard.cardNumberPlaceholder, value: newCardNumber, onChange: (e) => {
86
+ setNewCardNumber(e.target.value);
87
+ if (value?.type === "new_card") {
88
+ onChange({ ...value, cardToken: tokenizeNewCard(e.target.value) });
89
+ }
90
+ } }) }), _jsx(Field, { label: messages.newCard.expiry, children: _jsx(Input, { value: newCardExp, onChange: (e) => {
91
+ setNewCardExp(e.target.value);
92
+ if (value?.type === "new_card") {
93
+ onChange({ ...value, expiry: e.target.value });
94
+ }
95
+ }, placeholder: messages.newCard.expiryPlaceholder }) })] })) })), extraOptions.map((opt) => (_jsx(AltRow, { id: `extra:${opt.id}`, icon: opt.icon, title: opt.label, body: opt.description, active: activeId === `extra:${opt.id}` }, opt.id))), !hideHoldOption && (_jsx(AltRow, { id: "hold", icon: _jsx(Wallet, { className: "h-4 w-4 text-muted-foreground" }), title: messages.hold.title, body: messages.hold.body, active: activeId === "hold" }))] }), showNewCard && (_jsxs("p", { className: "mt-4 flex items-start gap-1.5 text-[11px] text-muted-foreground", children: [_jsx(Banknote, { className: "mt-0.5 h-3 w-3" }), messages.cardSecurityNote] }))] }));
96
+ }
97
+ function AltRow({ id, icon, title, body, active, children, }) {
98
+ const inputId = `payment-step-${id}`;
99
+ return (_jsxs("div", { className: cn("flex items-start gap-3 rounded-md border bg-background p-3 transition-colors", active ? "border-primary bg-primary/5" : "hover:border-primary/40"), children: [_jsx(RadioGroupItem, { id: inputId, value: id, className: "mt-0.5" }), _jsxs("label", { htmlFor: inputId, className: "flex min-w-0 flex-1 cursor-pointer flex-col gap-1", children: [_jsxs("span", { className: "flex items-center gap-2 font-medium text-sm", children: [icon, title] }), _jsx("span", { className: "text-muted-foreground text-xs", children: body }), children] })] }));
100
+ }
101
+ function Field({ label, children }) {
102
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-[11px] uppercase tracking-wider text-muted-foreground", children: label }), children] }));
103
+ }
104
+ function BrandTile({ brand }) {
105
+ const messages = useCheckoutUiMessagesOrDefault().paymentStep.otherOptions;
106
+ return (_jsx("span", { className: "flex h-9 w-12 shrink-0 items-center justify-center rounded-md border bg-muted/30 font-mono text-[10px] uppercase tracking-wider", children: (brand ?? messages.brandFallback).slice(0, 4) }));
107
+ }
108
+ function tokenizeNewCard(number) {
109
+ // Demo "tokenization" — in production the processor's hosted form
110
+ // returns an opaque token; we never see the PAN here.
111
+ const last4 = number.replace(/\D/g, "").slice(-4) || "0000";
112
+ return `tok_demo_new_${last4}`;
113
+ }
@@ -0,0 +1,5 @@
1
+ export { type CheckoutPaymentLinkConfig, useCheckoutPaymentLinkConfig, } from "./use-checkout-payment-link-config.js";
2
+ export { type CollectPaymentInput, type UseCollectPaymentOptions, useCollectPayment, } from "./use-collect-payment.js";
3
+ export { useInitiateCheckoutCollection } from "./use-initiate-checkout-collection.js";
4
+ export { usePreviewCheckoutCollection } from "./use-preview-checkout-collection.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkout-hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,yBAAyB,EAC9B,4BAA4B,GAC7B,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAA;AACrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { useCheckoutPaymentLinkConfig, } from "./use-checkout-payment-link-config.js";
2
+ export { useCollectPayment, } from "./use-collect-payment.js";
3
+ export { useInitiateCheckoutCollection } from "./use-initiate-checkout-collection.js";
4
+ export { usePreviewCheckoutCollection } from "./use-preview-checkout-collection.js";
@@ -0,0 +1,20 @@
1
+ export interface CheckoutPaymentLinkConfig {
2
+ publicCheckoutBaseUrl?: string | null;
3
+ bankTransfer: {
4
+ provider?: string | null;
5
+ beneficiary: string;
6
+ iban: string;
7
+ bankName?: string | null;
8
+ currency?: string | null;
9
+ notes?: string | null;
10
+ } | null;
11
+ }
12
+ /**
13
+ * Fetch the template-side bank-transfer block for the public payment-link
14
+ * landing page. Templates expose this at
15
+ * `/v1/public/payment-link-config` (added to `publicPaths`); when the
16
+ * endpoint is unavailable or unconfigured, callers fall back to hiding
17
+ * the bank-transfer tab.
18
+ */
19
+ export declare function useCheckoutPaymentLinkConfig(): import("@tanstack/react-query").UseQueryResult<CheckoutPaymentLinkConfig, Error>;
20
+ //# sourceMappingURL=use-checkout-payment-link-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-checkout-payment-link-config.d.ts","sourceRoot":"","sources":["../../src/checkout-hooks/use-checkout-payment-link-config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,yBAAyB;IACxC,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,YAAY,EAAE;QACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACtB,GAAG,IAAI,CAAA;CACT;AAMD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,qFAe3C"}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useVoyantFinanceContext } from "../provider.js";
4
+ /**
5
+ * Fetch the template-side bank-transfer block for the public payment-link
6
+ * landing page. Templates expose this at
7
+ * `/v1/public/payment-link-config` (added to `publicPaths`); when the
8
+ * endpoint is unavailable or unconfigured, callers fall back to hiding
9
+ * the bank-transfer tab.
10
+ */
11
+ export function useCheckoutPaymentLinkConfig() {
12
+ const { baseUrl, fetcher } = useVoyantFinanceContext();
13
+ return useQuery({
14
+ queryKey: ["checkout-payment-link-config"],
15
+ queryFn: async () => {
16
+ const response = await fetcher(`${baseUrl}/v1/public/payment-link-config`, {
17
+ headers: { Accept: "application/json" },
18
+ });
19
+ if (!response.ok)
20
+ throw new Error(`config fetch failed: ${response.status}`);
21
+ const body = (await response.json());
22
+ return body.data;
23
+ },
24
+ staleTime: 5 * 60 * 1000,
25
+ });
26
+ }