@aglyn/plugins-commerce 1.0.0-beta.229 → 1.0.0-beta.231

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 (590) hide show
  1. package/package.json +13 -13
  2. package/src/index.d.ts +0 -1
  3. package/src/index.js +0 -1
  4. package/src/index.js.map +1 -1
  5. package/src/lib/barcode/barcode-decode.d.ts +71 -0
  6. package/src/lib/barcode/barcode-decode.js +498 -0
  7. package/src/lib/barcode/barcode-decode.js.map +1 -0
  8. package/src/lib/barcode/barcode-encode.d.ts +44 -0
  9. package/src/lib/barcode/barcode-encode.js +138 -0
  10. package/src/lib/barcode/barcode-encode.js.map +1 -0
  11. package/src/lib/barcode/barcode-scanner.component.d.ts +23 -0
  12. package/src/lib/barcode/barcode-scanner.component.js +260 -0
  13. package/src/lib/barcode/barcode-scanner.component.js.map +1 -0
  14. package/src/lib/barcode/scan-button.component.d.ts +10 -0
  15. package/src/lib/barcode/scan-button.component.js +62 -0
  16. package/src/lib/barcode/scan-button.component.js.map +1 -0
  17. package/src/lib/barcode/scanner-wedge.d.ts +35 -0
  18. package/src/lib/barcode/scanner-wedge.js +108 -0
  19. package/src/lib/barcode/scanner-wedge.js.map +1 -0
  20. package/src/lib/components/account.js +10 -1
  21. package/src/lib/components/account.js.map +1 -1
  22. package/src/lib/components/cart-extras.d.ts +45 -0
  23. package/src/lib/components/cart-extras.js +127 -0
  24. package/src/lib/components/cart-extras.js.map +1 -0
  25. package/src/lib/components/cart.js +82 -15
  26. package/src/lib/components/cart.js.map +1 -1
  27. package/src/lib/components/checkout-return-notice.d.ts +26 -0
  28. package/src/lib/components/checkout-return-notice.js +48 -0
  29. package/src/lib/components/checkout-return-notice.js.map +1 -0
  30. package/src/lib/components/commerce-console-page.js +124 -0
  31. package/src/lib/components/commerce-console-page.js.map +1 -1
  32. package/src/lib/components/commerce-console-sections.d.ts +1 -1
  33. package/src/lib/components/commerce-console-sections.js +4 -0
  34. package/src/lib/components/commerce-console-sections.js.map +1 -1
  35. package/src/lib/components/console/bulk-fulfill.d.ts +44 -0
  36. package/src/lib/components/console/bulk-fulfill.js +84 -0
  37. package/src/lib/components/console/bulk-fulfill.js.map +1 -0
  38. package/src/lib/components/console/customer-notifications-card.component.d.ts +19 -0
  39. package/src/lib/components/console/customer-notifications-card.component.js +149 -0
  40. package/src/lib/components/console/customer-notifications-card.component.js.map +1 -0
  41. package/src/lib/components/console/host-orders-card.component.js +84 -5
  42. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  43. package/src/lib/components/console/locations-card.component.js +164 -57
  44. package/src/lib/components/console/locations-card.component.js.map +1 -1
  45. package/src/lib/components/console/order-detail-dialog.component.js +209 -61
  46. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  47. package/src/lib/components/console/order-fulfillment-panel.component.d.ts +48 -0
  48. package/src/lib/components/console/order-fulfillment-panel.component.js +542 -0
  49. package/src/lib/components/console/order-fulfillment-panel.component.js.map +1 -0
  50. package/src/lib/components/console/order-invoice.component.d.ts +33 -0
  51. package/src/lib/components/console/order-invoice.component.js +81 -0
  52. package/src/lib/components/console/order-invoice.component.js.map +1 -0
  53. package/src/lib/components/console/order-receipt-resend.component.d.ts +21 -0
  54. package/src/lib/components/console/order-receipt-resend.component.js +203 -0
  55. package/src/lib/components/console/order-receipt-resend.component.js.map +1 -0
  56. package/src/lib/components/console/order-returns.component.d.ts +36 -0
  57. package/src/lib/components/console/order-returns.component.js +142 -0
  58. package/src/lib/components/console/order-returns.component.js.map +1 -0
  59. package/src/lib/components/console/order-shipping-actions.component.d.ts +54 -0
  60. package/src/lib/components/console/order-shipping-actions.component.js +149 -0
  61. package/src/lib/components/console/order-shipping-actions.component.js.map +1 -0
  62. package/src/lib/components/console/order-webhooks-card.component.d.ts +50 -0
  63. package/src/lib/components/console/order-webhooks-card.component.js +623 -0
  64. package/src/lib/components/console/order-webhooks-card.component.js.map +1 -0
  65. package/src/lib/components/console/order-zones.d.ts +155 -0
  66. package/src/lib/components/console/order-zones.js +40 -0
  67. package/src/lib/components/console/order-zones.js.map +1 -0
  68. package/src/lib/components/console/payment-methods-card.component.d.ts +67 -0
  69. package/src/lib/components/console/payment-methods-card.component.js +395 -0
  70. package/src/lib/components/console/payment-methods-card.component.js.map +1 -0
  71. package/src/lib/components/console/pos/pos-api.d.ts +124 -0
  72. package/src/lib/components/console/pos/pos-api.js +101 -0
  73. package/src/lib/components/console/pos/pos-api.js.map +1 -0
  74. package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +36 -0
  75. package/src/lib/components/console/pos/pos-cart-panel.component.js +160 -0
  76. package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -0
  77. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +39 -0
  78. package/src/lib/components/console/pos/pos-item-dialog.component.js +352 -0
  79. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -0
  80. package/src/lib/components/console/pos/pos-product-grid.component.d.ts +47 -0
  81. package/src/lib/components/console/pos/pos-product-grid.component.js +272 -0
  82. package/src/lib/components/console/pos/pos-product-grid.component.js.map +1 -0
  83. package/src/lib/components/console/pos/pos-receipt-panel.component.d.ts +27 -0
  84. package/src/lib/components/console/pos/pos-receipt-panel.component.js +282 -0
  85. package/src/lib/components/console/pos/pos-receipt-panel.component.js.map +1 -0
  86. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +53 -0
  87. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +445 -0
  88. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -0
  89. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +31 -0
  90. package/src/lib/components/console/pos/pos-tender-panel.component.js +640 -0
  91. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -0
  92. package/src/lib/components/console/pos/use-pos-display.d.ts +43 -0
  93. package/src/lib/components/console/pos/use-pos-display.js +161 -0
  94. package/src/lib/components/console/pos/use-pos-display.js.map +1 -0
  95. package/src/lib/components/console/pos-devices-card.component.d.ts +14 -0
  96. package/src/lib/components/console/pos-devices-card.component.js +546 -0
  97. package/src/lib/components/console/pos-devices-card.component.js.map +1 -0
  98. package/src/lib/components/console/pos-display/brand-screen.d.ts +33 -0
  99. package/src/lib/components/console/pos-display/brand-screen.js +85 -0
  100. package/src/lib/components/console/pos-display/brand-screen.js.map +1 -0
  101. package/src/lib/components/console/pos-display/cart-screen.d.ts +29 -0
  102. package/src/lib/components/console/pos-display/cart-screen.js +166 -0
  103. package/src/lib/components/console/pos-display/cart-screen.js.map +1 -0
  104. package/src/lib/components/console/pos-display/pairing-screen.d.ts +24 -0
  105. package/src/lib/components/console/pos-display/pairing-screen.js +127 -0
  106. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -0
  107. package/src/lib/components/console/pos-display/pos-display-api.d.ts +90 -0
  108. package/src/lib/components/console/pos-display/pos-display-api.js +140 -0
  109. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -0
  110. package/src/lib/components/console/pos-display/receipt-screen.d.ts +35 -0
  111. package/src/lib/components/console/pos-display/receipt-screen.js +200 -0
  112. package/src/lib/components/console/pos-display/receipt-screen.js.map +1 -0
  113. package/src/lib/components/console/pos-display/tip-screen.d.ts +36 -0
  114. package/src/lib/components/console/pos-display/tip-screen.js +211 -0
  115. package/src/lib/components/console/pos-display/tip-screen.js.map +1 -0
  116. package/src/lib/components/console/pos-display-page.component.d.ts +16 -0
  117. package/src/lib/components/console/pos-display-page.component.js +407 -0
  118. package/src/lib/components/console/pos-display-page.component.js.map +1 -0
  119. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.d.ts +40 -0
  120. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js +289 -0
  121. package/src/lib/components/console/pos-ops/pos-customer-lookup.component.js.map +1 -0
  122. package/src/lib/components/console/pos-ops/pos-last-receipt.component.d.ts +34 -0
  123. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js +61 -0
  124. package/src/lib/components/console/pos-ops/pos-last-receipt.component.js.map +1 -0
  125. package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +38 -0
  126. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +129 -0
  127. package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -0
  128. package/src/lib/components/console/pos-ops/pos-ops-api.d.ts +37 -0
  129. package/src/lib/components/console/pos-ops/pos-ops-api.js +60 -0
  130. package/src/lib/components/console/pos-ops/pos-ops-api.js.map +1 -0
  131. package/src/lib/components/console/pos-ops/pos-pin-pad.component.d.ts +48 -0
  132. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js +220 -0
  133. package/src/lib/components/console/pos-ops/pos-pin-pad.component.js.map +1 -0
  134. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.d.ts +63 -0
  135. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js +186 -0
  136. package/src/lib/components/console/pos-ops/pos-receipt-actions.component.js.map +1 -0
  137. package/src/lib/components/console/pos-ops/pos-receipt.d.ts +39 -0
  138. package/src/lib/components/console/pos-ops/pos-receipt.js +182 -0
  139. package/src/lib/components/console/pos-ops/pos-receipt.js.map +1 -0
  140. package/src/lib/components/console/pos-ops/pos-return-dialog.component.d.ts +40 -0
  141. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js +465 -0
  142. package/src/lib/components/console/pos-ops/pos-return-dialog.component.js.map +1 -0
  143. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.d.ts +29 -0
  144. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +253 -0
  145. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -0
  146. package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +34 -0
  147. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +494 -0
  148. package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -0
  149. package/src/lib/components/console/pos-ops/pos-shift-report.component.d.ts +37 -0
  150. package/src/lib/components/console/pos-ops/pos-shift-report.component.js +102 -0
  151. package/src/lib/components/console/pos-ops/pos-shift-report.component.js.map +1 -0
  152. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.d.ts +30 -0
  153. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js +277 -0
  154. package/src/lib/components/console/pos-ops/pos-staff-pins-card.component.js.map +1 -0
  155. package/src/lib/components/console/pos-ops/register-ops.d.ts +28 -0
  156. package/src/lib/components/console/pos-ops/register-ops.js +28 -0
  157. package/src/lib/components/console/pos-ops/register-ops.js.map +1 -0
  158. package/src/lib/components/console/pos-ops/use-pos-cashier.d.ts +46 -0
  159. package/src/lib/components/console/pos-ops/use-pos-cashier.js +128 -0
  160. package/src/lib/components/console/pos-ops/use-pos-cashier.js.map +1 -0
  161. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.d.ts +36 -0
  162. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js +64 -0
  163. package/src/lib/components/console/pos-ops/use-pos-sale-receipt.js.map +1 -0
  164. package/src/lib/components/console/pos-page.component.d.ts +13 -5
  165. package/src/lib/components/console/pos-page.component.js +729 -657
  166. package/src/lib/components/console/pos-page.component.js.map +1 -1
  167. package/src/lib/components/console/product-editor-dialog.component.js +51 -7
  168. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  169. package/src/lib/components/console/product-labels-dialog.component.d.ts +13 -0
  170. package/src/lib/components/console/product-labels-dialog.component.js +197 -0
  171. package/src/lib/components/console/product-labels-dialog.component.js.map +1 -0
  172. package/src/lib/components/console/product-register-fields.component.d.ts +19 -0
  173. package/src/lib/components/console/product-register-fields.component.js +241 -0
  174. package/src/lib/components/console/product-register-fields.component.js.map +1 -0
  175. package/src/lib/components/console/product-zones.d.ts +58 -2
  176. package/src/lib/components/console/product-zones.js +10 -2
  177. package/src/lib/components/console/product-zones.js.map +1 -1
  178. package/src/lib/components/console/products-hub-card.component.js +51 -11
  179. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  180. package/src/lib/components/console/register-hardware-card.component.d.ts +33 -0
  181. package/src/lib/components/console/register-hardware-card.component.js +826 -0
  182. package/src/lib/components/console/register-hardware-card.component.js.map +1 -0
  183. package/src/lib/components/console/registers-card.component.js +24 -5
  184. package/src/lib/components/console/registers-card.component.js.map +1 -1
  185. package/src/lib/components/console/return-actions.d.ts +38 -0
  186. package/src/lib/components/console/return-actions.js +76 -0
  187. package/src/lib/components/console/return-actions.js.map +1 -0
  188. package/src/lib/components/console/return-detail-dialog.component.d.ts +34 -0
  189. package/src/lib/components/console/return-detail-dialog.component.js +718 -0
  190. package/src/lib/components/console/return-detail-dialog.component.js.map +1 -0
  191. package/src/lib/components/console/return-settings-card.component.d.ts +34 -0
  192. package/src/lib/components/console/return-settings-card.component.js +195 -0
  193. package/src/lib/components/console/return-settings-card.component.js.map +1 -0
  194. package/src/lib/components/console/return-zones.d.ts +87 -0
  195. package/src/lib/components/console/return-zones.js +31 -0
  196. package/src/lib/components/console/return-zones.js.map +1 -0
  197. package/src/lib/components/console/returns-card.component.d.ts +45 -0
  198. package/src/lib/components/console/returns-card.component.js +159 -0
  199. package/src/lib/components/console/returns-card.component.js.map +1 -0
  200. package/src/lib/components/console/shipping-settings-card.component.js +161 -5
  201. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  202. package/src/lib/components/console/shippingeasy-card.component.d.ts +59 -0
  203. package/src/lib/components/console/shippingeasy-card.component.js +378 -0
  204. package/src/lib/components/console/shippingeasy-card.component.js.map +1 -0
  205. package/src/lib/components/console/shipstation-card.component.d.ts +35 -0
  206. package/src/lib/components/console/shipstation-card.component.js +345 -0
  207. package/src/lib/components/console/shipstation-card.component.js.map +1 -0
  208. package/src/lib/components/console/start-return-dialog.component.d.ts +40 -0
  209. package/src/lib/components/console/start-return-dialog.component.js +243 -0
  210. package/src/lib/components/console/start-return-dialog.component.js.map +1 -0
  211. package/src/lib/components/console/stock-movements-card.component.js +2 -1
  212. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  213. package/src/lib/components/console/store-settings-card.component.js +2 -66
  214. package/src/lib/components/console/store-settings-card.component.js.map +1 -1
  215. package/src/lib/components/console/store-zones.d.ts +42 -0
  216. package/src/lib/components/console/store-zones.js +39 -0
  217. package/src/lib/components/console/store-zones.js.map +1 -0
  218. package/src/lib/components/order-status.d.ts +36 -0
  219. package/src/lib/components/order-status.js +502 -0
  220. package/src/lib/components/order-status.js.map +1 -0
  221. package/src/lib/components/product-detail.js +44 -2
  222. package/src/lib/components/product-detail.js.map +1 -1
  223. package/src/lib/components/return-request.d.ts +32 -0
  224. package/src/lib/components/return-request.js +576 -0
  225. package/src/lib/components/return-request.js.map +1 -0
  226. package/src/lib/components/storefront-payment-appearance.d.ts +32 -0
  227. package/src/lib/components/storefront-payment-appearance.js +114 -0
  228. package/src/lib/components/storefront-payment-appearance.js.map +1 -0
  229. package/src/lib/components/storefront-payment-element.d.ts +57 -1
  230. package/src/lib/components/storefront-payment-element.js +332 -33
  231. package/src/lib/components/storefront-payment-element.js.map +1 -1
  232. package/src/lib/constants/order-status.d.ts +22 -0
  233. package/src/lib/constants/order-status.js +22 -0
  234. package/src/lib/constants/order-status.js.map +1 -0
  235. package/src/lib/constants/return-request.d.ts +27 -0
  236. package/src/lib/constants/return-request.js +32 -0
  237. package/src/lib/constants/return-request.js.map +1 -0
  238. package/src/lib/constants/stock-movement-query.js +2 -1
  239. package/src/lib/constants/stock-movement-query.js.map +1 -1
  240. package/src/lib/declarations.console-server.js +9 -0
  241. package/src/lib/declarations.console-server.js.map +1 -1
  242. package/src/lib/declarations.server.d.ts +2 -1
  243. package/src/lib/declarations.server.js +47 -1
  244. package/src/lib/declarations.server.js.map +1 -1
  245. package/src/lib/model/buyer-notifications.d.ts +59 -0
  246. package/src/lib/model/buyer-notifications.js +97 -0
  247. package/src/lib/model/buyer-notifications.js.map +1 -0
  248. package/src/lib/model/commerce-orders.d.ts +127 -1
  249. package/src/lib/model/commerce-orders.js +24 -15
  250. package/src/lib/model/commerce-orders.js.map +1 -1
  251. package/src/lib/model/commerce-payment-methods.d.ts +146 -0
  252. package/src/lib/model/commerce-payment-methods.js +247 -0
  253. package/src/lib/model/commerce-payment-methods.js.map +1 -0
  254. package/src/lib/model/commerce-pos-ops.d.ts +437 -0
  255. package/src/lib/model/commerce-pos-ops.js +721 -0
  256. package/src/lib/model/commerce-pos-ops.js.map +1 -0
  257. package/src/lib/model/commerce-pos.d.ts +263 -0
  258. package/src/lib/model/commerce-pos.js +375 -0
  259. package/src/lib/model/commerce-pos.js.map +1 -0
  260. package/src/lib/model/commerce-printers.d.ts +211 -0
  261. package/src/lib/model/commerce-printers.js +181 -0
  262. package/src/lib/model/commerce-printers.js.map +1 -0
  263. package/src/lib/model/commerce-receipt.d.ts +97 -0
  264. package/src/lib/model/commerce-receipt.js +180 -0
  265. package/src/lib/model/commerce-receipt.js.map +1 -0
  266. package/src/lib/model/commerce-returns.d.ts +207 -0
  267. package/src/lib/model/commerce-returns.js +300 -0
  268. package/src/lib/model/commerce-returns.js.map +1 -0
  269. package/src/lib/model/commerce-shipping.d.ts +44 -1
  270. package/src/lib/model/commerce-shipping.js +53 -9
  271. package/src/lib/model/commerce-shipping.js.map +1 -1
  272. package/src/lib/model/commerce-tax-engine.d.ts +90 -0
  273. package/src/lib/model/commerce-tax-engine.js +129 -0
  274. package/src/lib/model/commerce-tax-engine.js.map +1 -0
  275. package/src/lib/model/commerce.d.ts +88 -2
  276. package/src/lib/model/commerce.js +89 -1
  277. package/src/lib/model/commerce.js.map +1 -1
  278. package/src/lib/model/index.d.ts +15 -0
  279. package/src/lib/model/index.js +15 -0
  280. package/src/lib/model/index.js.map +1 -1
  281. package/src/lib/model/order-events.d.ts +154 -0
  282. package/src/lib/model/order-events.js +153 -0
  283. package/src/lib/model/order-events.js.map +1 -0
  284. package/src/lib/model/order-fulfillment.d.ts +117 -0
  285. package/src/lib/model/order-fulfillment.js +217 -0
  286. package/src/lib/model/order-fulfillment.js.map +1 -0
  287. package/src/lib/model/order-history.d.ts +58 -0
  288. package/src/lib/model/order-history.js +22 -0
  289. package/src/lib/model/order-history.js.map +1 -0
  290. package/src/lib/model/order-list-fields.d.ts +9 -1
  291. package/src/lib/model/order-list-fields.js +7 -1
  292. package/src/lib/model/order-list-fields.js.map +1 -1
  293. package/src/lib/model/order-shipping-export.d.ts +91 -0
  294. package/src/lib/model/order-shipping-export.js +192 -0
  295. package/src/lib/model/order-shipping-export.js.map +1 -0
  296. package/src/lib/model/order-status-view.d.ts +103 -0
  297. package/src/lib/model/order-status-view.js +156 -0
  298. package/src/lib/model/order-status-view.js.map +1 -0
  299. package/src/lib/model/order-webhooks.d.ts +142 -0
  300. package/src/lib/model/order-webhooks.js +91 -0
  301. package/src/lib/model/order-webhooks.js.map +1 -0
  302. package/src/lib/model/product-channel.d.ts +56 -0
  303. package/src/lib/model/product-channel.js +86 -0
  304. package/src/lib/model/product-channel.js.map +1 -0
  305. package/src/lib/model/product-modifiers.d.ts +80 -0
  306. package/src/lib/model/product-modifiers.js +140 -0
  307. package/src/lib/model/product-modifiers.js.map +1 -0
  308. package/src/lib/model/shippingeasy.d.ts +94 -0
  309. package/src/lib/model/shippingeasy.js +267 -0
  310. package/src/lib/model/shippingeasy.js.map +1 -0
  311. package/src/lib/model/shipstation.d.ts +125 -0
  312. package/src/lib/model/shipstation.js +399 -0
  313. package/src/lib/model/shipstation.js.map +1 -0
  314. package/src/lib/model/smart-collection-reads.d.ts +32 -0
  315. package/src/lib/model/smart-collection-reads.js +63 -0
  316. package/src/lib/model/smart-collection-reads.js.map +1 -0
  317. package/src/lib/model/tracking-url.d.ts +74 -0
  318. package/src/lib/model/tracking-url.js +159 -0
  319. package/src/lib/model/tracking-url.js.map +1 -0
  320. package/src/lib/plugin-config.d.ts +13 -0
  321. package/src/lib/plugin-config.js +77 -5
  322. package/src/lib/plugin-config.js.map +1 -1
  323. package/src/lib/plugin.js +23 -0
  324. package/src/lib/plugin.js.map +1 -1
  325. package/src/lib/pos-ops-config.d.ts +39 -0
  326. package/src/lib/pos-ops-config.js +88 -0
  327. package/src/lib/pos-ops-config.js.map +1 -0
  328. package/src/lib/printing/print-document.d.ts +106 -0
  329. package/src/lib/printing/print-document.js +464 -0
  330. package/src/lib/printing/print-document.js.map +1 -0
  331. package/src/lib/printing/product-labels.d.ts +58 -0
  332. package/src/lib/printing/product-labels.js +116 -0
  333. package/src/lib/printing/product-labels.js.map +1 -0
  334. package/src/lib/printing/render-epson.d.ts +57 -0
  335. package/src/lib/printing/render-epson.js +135 -0
  336. package/src/lib/printing/render-epson.js.map +1 -0
  337. package/src/lib/printing/render-star.d.ts +45 -0
  338. package/src/lib/printing/render-star.js +100 -0
  339. package/src/lib/printing/render-star.js.map +1 -0
  340. package/src/lib/printing/render-text.d.ts +25 -0
  341. package/src/lib/printing/render-text.js +53 -0
  342. package/src/lib/printing/render-text.js.map +1 -0
  343. package/src/lib/server/api-v1/openapi.js +27 -4
  344. package/src/lib/server/api-v1/openapi.js.map +1 -1
  345. package/src/lib/server/api-v1/order-view.d.ts +67 -0
  346. package/src/lib/server/api-v1/order-view.js +120 -0
  347. package/src/lib/server/api-v1/order-view.js.map +1 -0
  348. package/src/lib/server/api-v1/orders-and-products.js +58 -65
  349. package/src/lib/server/api-v1/orders-and-products.js.map +1 -1
  350. package/src/lib/server/billing-webhook.js +135 -28
  351. package/src/lib/server/billing-webhook.js.map +1 -1
  352. package/src/lib/server/cancel-order.js +29 -0
  353. package/src/lib/server/cancel-order.js.map +1 -1
  354. package/src/lib/server/carrier-rates-availability.d.ts +26 -0
  355. package/src/lib/server/carrier-rates-availability.js +76 -0
  356. package/src/lib/server/carrier-rates-availability.js.map +1 -0
  357. package/src/lib/server/carrier-shipping.d.ts +84 -0
  358. package/src/lib/server/carrier-shipping.js +135 -0
  359. package/src/lib/server/carrier-shipping.js.map +1 -0
  360. package/src/lib/server/cart-checkout.d.ts +2 -0
  361. package/src/lib/server/cart-checkout.js +226 -22
  362. package/src/lib/server/cart-checkout.js.map +1 -1
  363. package/src/lib/server/checkout-extras.d.ts +64 -0
  364. package/src/lib/server/checkout-extras.js +157 -0
  365. package/src/lib/server/checkout-extras.js.map +1 -0
  366. package/src/lib/server/{feed.d.ts → checkout-status.d.ts} +2 -7
  367. package/src/lib/server/checkout-status.js +111 -0
  368. package/src/lib/server/checkout-status.js.map +1 -0
  369. package/src/lib/server/checkout.js +86 -9
  370. package/src/lib/server/checkout.js.map +1 -1
  371. package/src/lib/server/draft-order.js +34 -5
  372. package/src/lib/server/draft-order.js.map +1 -1
  373. package/src/lib/server/fulfill-order.d.ts +127 -10
  374. package/src/lib/server/fulfill-order.js +451 -49
  375. package/src/lib/server/fulfill-order.js.map +1 -1
  376. package/src/lib/server/legacy-feed.d.ts +28 -0
  377. package/src/lib/server/legacy-feed.js +52 -0
  378. package/src/lib/server/legacy-feed.js.map +1 -0
  379. package/src/lib/server/native-checkout.d.ts +34 -15
  380. package/src/lib/server/native-checkout.js +32 -17
  381. package/src/lib/server/native-checkout.js.map +1 -1
  382. package/src/lib/server/order-event-host-emit.d.ts +23 -0
  383. package/src/lib/server/order-event-host-emit.js +30 -0
  384. package/src/lib/server/order-event-host-emit.js.map +1 -0
  385. package/src/lib/server/order-event-triggers.d.ts +37 -0
  386. package/src/lib/server/order-event-triggers.js +119 -0
  387. package/src/lib/server/order-event-triggers.js.map +1 -0
  388. package/src/lib/server/order-events.d.ts +62 -0
  389. package/src/lib/server/order-events.js +109 -0
  390. package/src/lib/server/order-events.js.map +1 -0
  391. package/src/lib/server/order-history.d.ts +23 -0
  392. package/src/lib/server/order-history.js +65 -0
  393. package/src/lib/server/order-history.js.map +1 -0
  394. package/src/lib/server/order-notifications.d.ts +185 -0
  395. package/src/lib/server/order-notifications.js +567 -0
  396. package/src/lib/server/order-notifications.js.map +1 -0
  397. package/src/lib/server/order-receipt-send.d.ts +39 -0
  398. package/src/lib/server/order-receipt-send.js +151 -0
  399. package/src/lib/server/order-receipt-send.js.map +1 -0
  400. package/src/lib/server/order-status-token.d.ts +31 -0
  401. package/src/lib/server/order-status-token.js +75 -0
  402. package/src/lib/server/order-status-token.js.map +1 -0
  403. package/src/lib/server/order-status.d.ts +58 -0
  404. package/src/lib/server/order-status.js +141 -0
  405. package/src/lib/server/order-status.js.map +1 -0
  406. package/src/lib/server/order-webhooks.d.ts +108 -0
  407. package/src/lib/server/order-webhooks.js +622 -0
  408. package/src/lib/server/order-webhooks.js.map +1 -0
  409. package/src/lib/server/orders-shipping-prepare.d.ts +26 -0
  410. package/src/lib/server/orders-shipping-prepare.js +121 -0
  411. package/src/lib/server/orders-shipping-prepare.js.map +1 -0
  412. package/src/lib/server/payment-method-domains.d.ts +209 -0
  413. package/src/lib/server/payment-method-domains.js +444 -0
  414. package/src/lib/server/payment-method-domains.js.map +1 -0
  415. package/src/lib/server/payment-methods.d.ts +77 -0
  416. package/src/lib/server/payment-methods.js +284 -0
  417. package/src/lib/server/payment-methods.js.map +1 -0
  418. package/src/lib/server/pos-auth.d.ts +50 -0
  419. package/src/lib/server/pos-auth.js +121 -0
  420. package/src/lib/server/pos-auth.js.map +1 -0
  421. package/src/lib/server/pos-customer.d.ts +49 -0
  422. package/src/lib/server/pos-customer.js +257 -0
  423. package/src/lib/server/pos-customer.js.map +1 -0
  424. package/src/lib/server/pos-display.d.ts +57 -0
  425. package/src/lib/server/pos-display.js +419 -0
  426. package/src/lib/server/pos-display.js.map +1 -0
  427. package/src/lib/server/pos-fee-month.d.ts +34 -0
  428. package/src/lib/server/pos-fee-month.js +36 -0
  429. package/src/lib/server/pos-fee-month.js.map +1 -0
  430. package/src/lib/server/pos-ops-gate.d.ts +161 -0
  431. package/src/lib/server/pos-ops-gate.js +295 -0
  432. package/src/lib/server/pos-ops-gate.js.map +1 -0
  433. package/src/lib/server/pos-ops-routes.d.ts +22 -0
  434. package/src/lib/server/pos-ops-routes.js +36 -0
  435. package/src/lib/server/pos-ops-routes.js.map +1 -0
  436. package/src/lib/server/pos-order.d.ts +1 -18
  437. package/src/lib/server/pos-order.js +222 -42
  438. package/src/lib/server/pos-order.js.map +1 -1
  439. package/src/lib/server/pos-payment.d.ts +39 -0
  440. package/src/lib/server/pos-payment.js +922 -0
  441. package/src/lib/server/pos-payment.js.map +1 -0
  442. package/src/lib/server/pos-print.d.ts +82 -0
  443. package/src/lib/server/pos-print.js +193 -0
  444. package/src/lib/server/pos-print.js.map +1 -0
  445. package/src/lib/server/pos-readers.d.ts +27 -0
  446. package/src/lib/server/pos-readers.js +276 -0
  447. package/src/lib/server/pos-readers.js.map +1 -0
  448. package/src/lib/server/pos-refund-authority.d.ts +60 -0
  449. package/src/lib/server/pos-refund-authority.js +72 -0
  450. package/src/lib/server/pos-refund-authority.js.map +1 -0
  451. package/src/lib/server/pos-return.d.ts +58 -0
  452. package/src/lib/server/pos-return.js +891 -0
  453. package/src/lib/server/pos-return.js.map +1 -0
  454. package/src/lib/server/pos-sale-stamp.d.ts +66 -0
  455. package/src/lib/server/pos-sale-stamp.js +84 -0
  456. package/src/lib/server/pos-sale-stamp.js.map +1 -0
  457. package/src/lib/server/pos-sale.d.ts +170 -0
  458. package/src/lib/server/pos-sale.js +461 -0
  459. package/src/lib/server/pos-sale.js.map +1 -0
  460. package/src/lib/server/pos-shift.d.ts +45 -0
  461. package/src/lib/server/pos-shift.js +484 -0
  462. package/src/lib/server/pos-shift.js.map +1 -0
  463. package/src/lib/server/pos-staff-pin.d.ts +26 -0
  464. package/src/lib/server/pos-staff-pin.js +339 -0
  465. package/src/lib/server/pos-staff-pin.js.map +1 -0
  466. package/src/lib/server/pos-stripe.d.ts +91 -0
  467. package/src/lib/server/pos-stripe.js +129 -0
  468. package/src/lib/server/pos-stripe.js.map +1 -0
  469. package/src/lib/server/pos-terminal-connection-token.d.ts +48 -0
  470. package/src/lib/server/pos-terminal-connection-token.js +166 -0
  471. package/src/lib/server/pos-terminal-connection-token.js.map +1 -0
  472. package/src/lib/server/pos-terminal.d.ts +218 -0
  473. package/src/lib/server/pos-terminal.js +1014 -0
  474. package/src/lib/server/pos-terminal.js.map +1 -0
  475. package/src/lib/server/print-queue.d.ts +124 -0
  476. package/src/lib/server/print-queue.js +301 -0
  477. package/src/lib/server/print-queue.js.map +1 -0
  478. package/src/lib/server/printer-poll.d.ts +75 -0
  479. package/src/lib/server/printer-poll.js +325 -0
  480. package/src/lib/server/printer-poll.js.map +1 -0
  481. package/src/lib/server/printer-secret.d.ts +39 -0
  482. package/src/lib/server/printer-secret.js +56 -0
  483. package/src/lib/server/printer-secret.js.map +1 -0
  484. package/src/lib/server/printers.d.ts +114 -0
  485. package/src/lib/server/printers.js +546 -0
  486. package/src/lib/server/printers.js.map +1 -0
  487. package/src/lib/server/product-ai-capability.d.ts +42 -0
  488. package/src/lib/server/product-ai-capability.js +159 -0
  489. package/src/lib/server/product-ai-capability.js.map +1 -0
  490. package/src/lib/server/product-catalog.d.ts +42 -0
  491. package/src/lib/server/product-catalog.js +305 -0
  492. package/src/lib/server/product-catalog.js.map +1 -0
  493. package/src/lib/server/product-drafts.d.ts +119 -0
  494. package/src/lib/server/product-drafts.js +384 -0
  495. package/src/lib/server/product-drafts.js.map +1 -0
  496. package/src/lib/server/refund.js +110 -45
  497. package/src/lib/server/refund.js.map +1 -1
  498. package/src/lib/server/reserve.js +2 -0
  499. package/src/lib/server/reserve.js.map +1 -1
  500. package/src/lib/server/return-status-action.d.ts +37 -0
  501. package/src/lib/server/return-status-action.js +57 -0
  502. package/src/lib/server/return-status-action.js.map +1 -0
  503. package/src/lib/server/returns.d.ts +119 -0
  504. package/src/lib/server/returns.js +938 -0
  505. package/src/lib/server/returns.js.map +1 -0
  506. package/src/lib/server/shipment-records.d.ts +36 -0
  507. package/src/lib/server/shipment-records.js +289 -0
  508. package/src/lib/server/shipment-records.js.map +1 -0
  509. package/src/lib/server/shipping-connector-gates.d.ts +40 -0
  510. package/src/lib/server/shipping-connector-gates.js +97 -0
  511. package/src/lib/server/shipping-connector-gates.js.map +1 -0
  512. package/src/lib/server/shipping-connectors.d.ts +29 -0
  513. package/src/lib/server/shipping-connectors.js +236 -0
  514. package/src/lib/server/shipping-connectors.js.map +1 -0
  515. package/src/lib/server/shippingeasy.d.ts +238 -0
  516. package/src/lib/server/shippingeasy.js +787 -0
  517. package/src/lib/server/shippingeasy.js.map +1 -0
  518. package/src/lib/server/shipstation.d.ts +129 -0
  519. package/src/lib/server/shipstation.js +483 -0
  520. package/src/lib/server/shipstation.js.map +1 -0
  521. package/src/lib/server/site-page-resolver.d.ts +5 -0
  522. package/src/lib/server/site-page-resolver.js +156 -1
  523. package/src/lib/server/site-page-resolver.js.map +1 -1
  524. package/src/lib/server/stock-levels.d.ts +21 -0
  525. package/src/lib/server/stock-levels.js +263 -0
  526. package/src/lib/server/stock-levels.js.map +1 -0
  527. package/src/lib/server/stripe-refund.d.ts +47 -0
  528. package/src/lib/server/stripe-refund.js +87 -0
  529. package/src/lib/server/stripe-refund.js.map +1 -0
  530. package/src/lib/server/supplier-update.js +46 -5
  531. package/src/lib/server/supplier-update.js.map +1 -1
  532. package/src/lib/server/tax-engine-quote.d.ts +47 -0
  533. package/src/lib/server/tax-engine-quote.js +105 -0
  534. package/src/lib/server/tax-engine-quote.js.map +1 -0
  535. package/src/lib/server.js +146 -2
  536. package/src/lib/server.js.map +1 -1
  537. package/src/lib/site.js +12 -0
  538. package/src/lib/site.js.map +1 -1
  539. package/src/lib/subprocessors.d.ts +26 -0
  540. package/src/lib/subprocessors.js +50 -0
  541. package/src/lib/subprocessors.js.map +1 -0
  542. package/src/lib/tenant-emails.js +461 -3
  543. package/src/lib/tenant-emails.js.map +1 -1
  544. package/src/lib/testing/fake-firestore.d.ts +45 -0
  545. package/src/lib/testing/fake-firestore.js +189 -0
  546. package/src/lib/testing/fake-firestore.js.map +1 -0
  547. package/src/lib/testing/memory-firestore.d.ts +123 -0
  548. package/src/lib/testing/memory-firestore.js +274 -0
  549. package/src/lib/testing/memory-firestore.js.map +1 -0
  550. package/src/lib/testing/pos-ops-harness.d.ts +50 -0
  551. package/src/lib/testing/pos-ops-harness.js +184 -0
  552. package/src/lib/testing/pos-ops-harness.js.map +1 -0
  553. package/src/lib/testing/pos-ops-memory-firestore.d.ts +55 -0
  554. package/src/lib/testing/pos-ops-memory-firestore.js +376 -0
  555. package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -0
  556. package/src/lib/transfer/records-transfer.d.ts +11 -1
  557. package/src/lib/transfer/records-transfer.js +127 -5
  558. package/src/lib/transfer/records-transfer.js.map +1 -1
  559. package/src/lib/transfer/records.server.d.ts +9 -2
  560. package/src/lib/transfer/records.server.js +58 -7
  561. package/src/lib/transfer/records.server.js.map +1 -1
  562. package/src/lib/transfer/register-transfer-resources.js +40 -1
  563. package/src/lib/transfer/register-transfer-resources.js.map +1 -1
  564. package/src/lib/transfer/register-transfer-ui.js +4 -1
  565. package/src/lib/transfer/register-transfer-ui.js.map +1 -1
  566. package/src/lib/transfer/shipping-presets.d.ts +23 -0
  567. package/src/lib/transfer/shipping-presets.js +156 -0
  568. package/src/lib/transfer/shipping-presets.js.map +1 -0
  569. package/src/lib/transfer/tracking-transfer.d.ts +101 -0
  570. package/src/lib/transfer/tracking-transfer.js +546 -0
  571. package/src/lib/transfer/tracking-transfer.js.map +1 -0
  572. package/src/lib/transfer/tracking.server.d.ts +37 -0
  573. package/src/lib/transfer/tracking.server.js +393 -0
  574. package/src/lib/transfer/tracking.server.js.map +1 -0
  575. package/src/lib/transfer/transfer-keys.d.ts +2 -1
  576. package/src/lib/transfer/transfer-keys.js +6 -2
  577. package/src/lib/transfer/transfer-keys.js.map +1 -1
  578. package/src/lib/utils/code128.d.ts +37 -0
  579. package/src/lib/utils/code128.js +199 -0
  580. package/src/lib/utils/code128.js.map +1 -0
  581. package/src/lib/utils/order-invoice.d.ts +55 -0
  582. package/src/lib/utils/order-invoice.js +127 -0
  583. package/src/lib/utils/order-invoice.js.map +1 -0
  584. package/src/lib/utils/use-checkout-return-notice.d.ts +34 -0
  585. package/src/lib/utils/use-checkout-return-notice.js +78 -0
  586. package/src/lib/utils/use-checkout-return-notice.js.map +1 -0
  587. package/src/lib/utils/use-storefront-purchase-event.js +4 -0
  588. package/src/lib/utils/use-storefront-purchase-event.js.map +1 -1
  589. package/src/lib/server/feed.js +0 -69
  590. package/src/lib/server/feed.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
+ import { IconButton, InputAdornment, SvgIcon } from "@mui/material";
19
+ import { mdiBarcodeScan } from "@aglyn/shared-data-mdi";
20
+ import { useCallback, useState } from "react";
21
+ import { BarcodeScanner } from "./barcode-scanner.component.js";
22
+ /**
23
+ * The camera scan button that sits at the end of a search or barcode field
24
+ * (AGL-3619): it opens the camera scanner and hands back the code, the way a
25
+ * keyboard-mode scanner would have typed it.
26
+ */ export function ScanAdornment(props) {
27
+ const { label, onScan } = props;
28
+ const [open, setOpen] = useState(false);
29
+ const close = useCallback(()=>setOpen(false), []);
30
+ const detected = useCallback((code)=>{
31
+ setOpen(false);
32
+ onScan(code);
33
+ }, [
34
+ onScan
35
+ ]);
36
+ return /*#__PURE__*/ _jsxs(InputAdornment, {
37
+ position: "end",
38
+ children: [
39
+ /*#__PURE__*/ _jsx(IconButton, {
40
+ size: "small",
41
+ edge: "end",
42
+ "aria-label": label,
43
+ onClick: ()=>setOpen(true),
44
+ children: /*#__PURE__*/ _jsx(SvgIcon, {
45
+ fontSize: "small",
46
+ children: /*#__PURE__*/ _jsx("path", {
47
+ d: mdiBarcodeScan.path
48
+ })
49
+ })
50
+ }),
51
+ open ? /*#__PURE__*/ _jsx(BarcodeScanner, {
52
+ open: true,
53
+ title: label,
54
+ onClose: close,
55
+ onDetected: detected
56
+ }) : null
57
+ ]
58
+ });
59
+ }
60
+ export default ScanAdornment;
61
+
62
+ //# sourceMappingURL=scan-button.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/barcode/scan-button.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { IconButton, InputAdornment, SvgIcon } from '@mui/material'\nimport { mdiBarcodeScan } from '@aglyn/shared-data-mdi'\nimport { useCallback, useState } from 'react'\nimport { BarcodeScanner } from './barcode-scanner.component'\n\n/**\n * The camera scan button that sits at the end of a search or barcode field\n * (AGL-3619): it opens the camera scanner and hands back the code, the way a\n * keyboard-mode scanner would have typed it.\n */\nexport function ScanAdornment(props: { label: string; onScan: (code: string) => void }) {\n const { label, onScan } = props\n const [open, setOpen] = useState(false)\n const close = useCallback(() => setOpen(false), [])\n const detected = useCallback(\n (code: string) => {\n setOpen(false)\n onScan(code)\n },\n [onScan],\n )\n return (\n <InputAdornment position=\"end\">\n <IconButton size=\"small\" edge=\"end\" aria-label={label} onClick={() => setOpen(true)}>\n <SvgIcon fontSize=\"small\">\n <path d={mdiBarcodeScan.path} />\n </SvgIcon>\n </IconButton>\n {open ? <BarcodeScanner open title={label} onClose={close} onDetected={detected} /> : null}\n </InputAdornment>\n )\n}\n\nexport default ScanAdornment\n"],"names":["IconButton","InputAdornment","SvgIcon","mdiBarcodeScan","useCallback","useState","BarcodeScanner","ScanAdornment","props","label","onScan","open","setOpen","close","detected","code","position","size","edge","aria-label","onClick","fontSize","path","d","title","onClose","onDetected"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAEA,SAASA,UAAU,EAAEC,cAAc,EAAEC,OAAO,QAAQ,gBAAe;AACnE,SAASC,cAAc,QAAQ,yBAAwB;AACvD,SAASC,WAAW,EAAEC,QAAQ,QAAQ,QAAO;AAC7C,SAASC,cAAc,QAAQ,iCAA6B;AAE5D;;;;CAIC,GACD,OAAO,SAASC,cAAcC,KAAwD;IACpF,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAAGF;IAC1B,MAAM,CAACG,MAAMC,QAAQ,GAAGP,SAAS;IACjC,MAAMQ,QAAQT,YAAY,IAAMQ,QAAQ,QAAQ,EAAE;IAClD,MAAME,WAAWV,YACf,CAACW;QACCH,QAAQ;QACRF,OAAOK;IACT,GACA;QAACL;KAAO;IAEV,qBACE,MAACT;QAAee,UAAS;;0BACvB,KAAChB;gBAAWiB,MAAK;gBAAQC,MAAK;gBAAMC,cAAYV;gBAAOW,SAAS,IAAMR,QAAQ;0BAC5E,cAAA,KAACV;oBAAQmB,UAAS;8BAChB,cAAA,KAACC;wBAAKC,GAAGpB,eAAemB,IAAI;;;;YAG/BX,qBAAO,KAACL;gBAAeK,IAAI;gBAACa,OAAOf;gBAAOgB,SAASZ;gBAAOa,YAAYZ;iBAAe;;;AAG5F;AAEA,eAAeP,cAAa"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * USB and Bluetooth barcode scanners in keyboard mode (AGL-3619).
3
+ *
4
+ * A scanner is a keyboard that types very fast and presses Enter. When the
5
+ * register's search box has focus that already works: the code lands in the
6
+ * box and Enter looks it up. But a cashier who just tapped a product, a
7
+ * quantity stepper or a tender button has moved focus off the box, and a
8
+ * scan then went nowhere. This listens on the whole page for that burst —
9
+ * printable keys at machine speed, ending in Enter — while no text field
10
+ * has focus, and hands the code to the same lookup.
11
+ *
12
+ * A person typing is never mistaken for a scanner: a human gap between keys
13
+ * resets the buffer, and anything typed into a field is left to the field.
14
+ */
15
+ /** Longest gap between a scanner's keystrokes; people type at 80 ms and up. */
16
+ export declare const WEDGE_MAX_GAP_MS = 50;
17
+ /** Shortest code a scan can be (EAN-8 is 8; a short SKU label might be 4). */
18
+ export declare const WEDGE_MIN_LENGTH = 4;
19
+ export interface WedgeDetector {
20
+ /** Feeds one key; answers the scanned code when this key completed one. */
21
+ push(key: string, atMs: number): string | null;
22
+ reset(): void;
23
+ }
24
+ export declare function createWedgeDetector(options?: {
25
+ maxGapMs?: number;
26
+ minLength?: number;
27
+ }): WedgeDetector;
28
+ /** True when the key is going into something that takes text. */
29
+ export declare function typingIntoField(target: EventTarget | null): boolean;
30
+ /**
31
+ * Calls `onScan` with each code a keyboard-mode scanner types while no text
32
+ * field has focus. Off while `enabled` is false (a dialog that takes cash is
33
+ * open, say).
34
+ */
35
+ export declare function useScannerWedge(onScan: (code: string) => void, enabled?: boolean): void;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { useEffect, useRef } from "react";
18
+ /**
19
+ * USB and Bluetooth barcode scanners in keyboard mode (AGL-3619).
20
+ *
21
+ * A scanner is a keyboard that types very fast and presses Enter. When the
22
+ * register's search box has focus that already works: the code lands in the
23
+ * box and Enter looks it up. But a cashier who just tapped a product, a
24
+ * quantity stepper or a tender button has moved focus off the box, and a
25
+ * scan then went nowhere. This listens on the whole page for that burst —
26
+ * printable keys at machine speed, ending in Enter — while no text field
27
+ * has focus, and hands the code to the same lookup.
28
+ *
29
+ * A person typing is never mistaken for a scanner: a human gap between keys
30
+ * resets the buffer, and anything typed into a field is left to the field.
31
+ */ /** Longest gap between a scanner's keystrokes; people type at 80 ms and up. */ export const WEDGE_MAX_GAP_MS = 50;
32
+ /** Shortest code a scan can be (EAN-8 is 8; a short SKU label might be 4). */ export const WEDGE_MIN_LENGTH = 4;
33
+ export function createWedgeDetector(options = {}) {
34
+ var _options_maxGapMs, _options_minLength;
35
+ const maxGapMs = (_options_maxGapMs = options.maxGapMs) != null ? _options_maxGapMs : WEDGE_MAX_GAP_MS;
36
+ const minLength = (_options_minLength = options.minLength) != null ? _options_minLength : WEDGE_MIN_LENGTH;
37
+ let buffer = '';
38
+ let lastAtMs = -Infinity;
39
+ return {
40
+ push (key, atMs) {
41
+ const gap = atMs - lastAtMs;
42
+ lastAtMs = atMs;
43
+ if (key === 'Enter') {
44
+ const code = gap <= maxGapMs && buffer.length >= minLength ? buffer : null;
45
+ buffer = '';
46
+ return code;
47
+ }
48
+ if (key.length !== 1) {
49
+ // Shift (for capitals) arrives between a scanner's keys and is not a break.
50
+ if (key !== 'Shift') buffer = '';
51
+ return null;
52
+ }
53
+ buffer = gap <= maxGapMs ? buffer + key : key;
54
+ return null;
55
+ },
56
+ reset () {
57
+ buffer = '';
58
+ lastAtMs = -Infinity;
59
+ }
60
+ };
61
+ }
62
+ /** True when the key is going into something that takes text. */ export function typingIntoField(target) {
63
+ const element = target;
64
+ if (!element || typeof element.tagName !== 'string') return false;
65
+ if (element.isContentEditable) return true;
66
+ const tag = element.tagName.toLowerCase();
67
+ if (tag === 'textarea' || tag === 'select') return true;
68
+ if (tag !== 'input') return false;
69
+ const type = String(element.type || 'text').toLowerCase();
70
+ return ![
71
+ 'button',
72
+ 'checkbox',
73
+ 'radio',
74
+ 'submit',
75
+ 'reset',
76
+ 'range',
77
+ 'color',
78
+ 'file'
79
+ ].includes(type);
80
+ }
81
+ /**
82
+ * Calls `onScan` with each code a keyboard-mode scanner types while no text
83
+ * field has focus. Off while `enabled` is false (a dialog that takes cash is
84
+ * open, say).
85
+ */ export function useScannerWedge(onScan, enabled = true) {
86
+ const handler = useRef(onScan);
87
+ handler.current = onScan;
88
+ useEffect(()=>{
89
+ if (!enabled || typeof window === 'undefined') return;
90
+ const detector = createWedgeDetector();
91
+ const listener = (event)=>{
92
+ if (event.ctrlKey || event.metaKey || event.altKey) return detector.reset();
93
+ if (typingIntoField(event.target)) return detector.reset();
94
+ const code = detector.push(event.key, Date.now());
95
+ if (code) {
96
+ // The Enter must not also press the focused button.
97
+ event.preventDefault();
98
+ handler.current(code);
99
+ }
100
+ };
101
+ window.addEventListener('keydown', listener, true);
102
+ return ()=>window.removeEventListener('keydown', listener, true);
103
+ }, [
104
+ enabled
105
+ ]);
106
+ }
107
+
108
+ //# sourceMappingURL=scanner-wedge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/barcode/scanner-wedge.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { useEffect, useRef } from 'react'\n\n/**\n * USB and Bluetooth barcode scanners in keyboard mode (AGL-3619).\n *\n * A scanner is a keyboard that types very fast and presses Enter. When the\n * register's search box has focus that already works: the code lands in the\n * box and Enter looks it up. But a cashier who just tapped a product, a\n * quantity stepper or a tender button has moved focus off the box, and a\n * scan then went nowhere. This listens on the whole page for that burst —\n * printable keys at machine speed, ending in Enter — while no text field\n * has focus, and hands the code to the same lookup.\n *\n * A person typing is never mistaken for a scanner: a human gap between keys\n * resets the buffer, and anything typed into a field is left to the field.\n */\n\n/** Longest gap between a scanner's keystrokes; people type at 80 ms and up. */\nexport const WEDGE_MAX_GAP_MS = 50\n\n/** Shortest code a scan can be (EAN-8 is 8; a short SKU label might be 4). */\nexport const WEDGE_MIN_LENGTH = 4\n\nexport interface WedgeDetector {\n /** Feeds one key; answers the scanned code when this key completed one. */\n push(key: string, atMs: number): string | null\n reset(): void\n}\n\nexport function createWedgeDetector(\n options: { maxGapMs?: number; minLength?: number } = {},\n): WedgeDetector {\n const maxGapMs = options.maxGapMs ?? WEDGE_MAX_GAP_MS\n const minLength = options.minLength ?? WEDGE_MIN_LENGTH\n let buffer = ''\n let lastAtMs = -Infinity\n return {\n push(key, atMs) {\n const gap = atMs - lastAtMs\n lastAtMs = atMs\n if (key === 'Enter') {\n const code = gap <= maxGapMs && buffer.length >= minLength ? buffer : null\n buffer = ''\n return code\n }\n if (key.length !== 1) {\n // Shift (for capitals) arrives between a scanner's keys and is not a break.\n if (key !== 'Shift') buffer = ''\n return null\n }\n buffer = gap <= maxGapMs ? buffer + key : key\n return null\n },\n reset() {\n buffer = ''\n lastAtMs = -Infinity\n },\n }\n}\n\n/** True when the key is going into something that takes text. */\nexport function typingIntoField(target: EventTarget | null): boolean {\n const element = target as HTMLElement | null\n if (!element || typeof element.tagName !== 'string') return false\n if (element.isContentEditable) return true\n const tag = element.tagName.toLowerCase()\n if (tag === 'textarea' || tag === 'select') return true\n if (tag !== 'input') return false\n const type = String((element as HTMLInputElement).type || 'text').toLowerCase()\n return !['button', 'checkbox', 'radio', 'submit', 'reset', 'range', 'color', 'file'].includes(type)\n}\n\n/**\n * Calls `onScan` with each code a keyboard-mode scanner types while no text\n * field has focus. Off while `enabled` is false (a dialog that takes cash is\n * open, say).\n */\nexport function useScannerWedge(onScan: (code: string) => void, enabled = true): void {\n const handler = useRef(onScan)\n handler.current = onScan\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return\n const detector = createWedgeDetector()\n const listener = (event: KeyboardEvent) => {\n if (event.ctrlKey || event.metaKey || event.altKey) return detector.reset()\n if (typingIntoField(event.target)) return detector.reset()\n const code = detector.push(event.key, Date.now())\n if (code) {\n // The Enter must not also press the focused button.\n event.preventDefault()\n handler.current(code)\n }\n }\n window.addEventListener('keydown', listener, true)\n return () => window.removeEventListener('keydown', listener, true)\n }, [enabled])\n}\n"],"names":["useEffect","useRef","WEDGE_MAX_GAP_MS","WEDGE_MIN_LENGTH","createWedgeDetector","options","maxGapMs","minLength","buffer","lastAtMs","Infinity","push","key","atMs","gap","code","length","reset","typingIntoField","target","element","tagName","isContentEditable","tag","toLowerCase","type","String","includes","useScannerWedge","onScan","enabled","handler","current","window","detector","listener","event","ctrlKey","metaKey","altKey","Date","now","preventDefault","addEventListener","removeEventListener"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,SAAS,EAAEC,MAAM,QAAQ,QAAO;AAEzC;;;;;;;;;;;;;CAaC,GAED,6EAA6E,GAC7E,OAAO,MAAMC,mBAAmB,GAAE;AAElC,4EAA4E,GAC5E,OAAO,MAAMC,mBAAmB,EAAC;AAQjC,OAAO,SAASC,oBACdC,UAAqD,CAAC,CAAC;QAEtCA,mBACCA;IADlB,MAAMC,YAAWD,oBAAAA,QAAQC,QAAQ,YAAhBD,oBAAoBH;IACrC,MAAMK,aAAYF,qBAAAA,QAAQE,SAAS,YAAjBF,qBAAqBF;IACvC,IAAIK,SAAS;IACb,IAAIC,WAAW,CAACC;IAChB,OAAO;QACLC,MAAKC,GAAG,EAAEC,IAAI;YACZ,MAAMC,MAAMD,OAAOJ;YACnBA,WAAWI;YACX,IAAID,QAAQ,SAAS;gBACnB,MAAMG,OAAOD,OAAOR,YAAYE,OAAOQ,MAAM,IAAIT,YAAYC,SAAS;gBACtEA,SAAS;gBACT,OAAOO;YACT;YACA,IAAIH,IAAII,MAAM,KAAK,GAAG;gBACpB,4EAA4E;gBAC5E,IAAIJ,QAAQ,SAASJ,SAAS;gBAC9B,OAAO;YACT;YACAA,SAASM,OAAOR,WAAWE,SAASI,MAAMA;YAC1C,OAAO;QACT;QACAK;YACET,SAAS;YACTC,WAAW,CAACC;QACd;IACF;AACF;AAEA,+DAA+D,GAC/D,OAAO,SAASQ,gBAAgBC,MAA0B;IACxD,MAAMC,UAAUD;IAChB,IAAI,CAACC,WAAW,OAAOA,QAAQC,OAAO,KAAK,UAAU,OAAO;IAC5D,IAAID,QAAQE,iBAAiB,EAAE,OAAO;IACtC,MAAMC,MAAMH,QAAQC,OAAO,CAACG,WAAW;IACvC,IAAID,QAAQ,cAAcA,QAAQ,UAAU,OAAO;IACnD,IAAIA,QAAQ,SAAS,OAAO;IAC5B,MAAME,OAAOC,OAAO,AAACN,QAA6BK,IAAI,IAAI,QAAQD,WAAW;IAC7E,OAAO,CAAC;QAAC;QAAU;QAAY;QAAS;QAAU;QAAS;QAAS;QAAS;KAAO,CAACG,QAAQ,CAACF;AAChG;AAEA;;;;CAIC,GACD,OAAO,SAASG,gBAAgBC,MAA8B,EAAEC,UAAU,IAAI;IAC5E,MAAMC,UAAU9B,OAAO4B;IACvBE,QAAQC,OAAO,GAAGH;IAClB7B,UAAU;QACR,IAAI,CAAC8B,WAAW,OAAOG,WAAW,aAAa;QAC/C,MAAMC,WAAW9B;QACjB,MAAM+B,WAAW,CAACC;YAChB,IAAIA,MAAMC,OAAO,IAAID,MAAME,OAAO,IAAIF,MAAMG,MAAM,EAAE,OAAOL,SAASjB,KAAK;YACzE,IAAIC,gBAAgBkB,MAAMjB,MAAM,GAAG,OAAOe,SAASjB,KAAK;YACxD,MAAMF,OAAOmB,SAASvB,IAAI,CAACyB,MAAMxB,GAAG,EAAE4B,KAAKC,GAAG;YAC9C,IAAI1B,MAAM;gBACR,oDAAoD;gBACpDqB,MAAMM,cAAc;gBACpBX,QAAQC,OAAO,CAACjB;YAClB;QACF;QACAkB,OAAOU,gBAAgB,CAAC,WAAWR,UAAU;QAC7C,OAAO,IAAMF,OAAOW,mBAAmB,CAAC,WAAWT,UAAU;IAC/D,GAAG;QAACL;KAAQ;AACd"}
@@ -18,6 +18,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
18
18
  * limitations under the License.
19
19
  */ import * as Aglyn from "@aglyn/aglyn";
20
20
  import { trackEvent } from "@aglyn/aglyn/app-utils/analytics-events";
21
+ import * as CommerceModel from "../model/index.js";
21
22
  import { mdiAccountCircleOutline } from "@aglyn/shared-data-mdi";
22
23
  import Alert from "@mui/material/Alert";
23
24
  import Box from "@mui/material/Box";
@@ -33,6 +34,7 @@ import TextField from "@mui/material/TextField";
33
34
  import Typography from "@mui/material/Typography";
34
35
  import { forwardRef, useCallback, useEffect, useState } from "react";
35
36
  import { BUNDLE_ID } from "../constants/bundle-common.js";
37
+ import { returnRequestHref } from "../constants/return-request.js";
36
38
  import { generatePresetId } from "../utils/generate-preset-id.js";
37
39
  // Component ids are persisted in screen documents; never rename.
38
40
  export const ID = 'customer-account';
@@ -395,7 +397,14 @@ const usd = (cents)=>`$${(cents / 100).toFixed(2)}`;
395
397
  /*#__PURE__*/ _jsx(Typography, {
396
398
  variant: "body2",
397
399
  children: usd(order.totalCents)
398
- })
400
+ }),
401
+ CommerceModel.RETURNABLE_ORDER_STATUSES.includes(order.status) ? // The member's session authorizes the return page, so the
402
+ // link carries no token (AGL-3611).
403
+ /*#__PURE__*/ _jsx(Button, {
404
+ size: "small",
405
+ href: returnRequestHref(order.id),
406
+ children: 'Request a return'
407
+ }) : null
399
408
  ]
400
409
  }, order.id);
401
410
  }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/account.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { trackEvent } from '@aglyn/aglyn/app-utils/analytics-events'\nimport * as CommerceModel from '../model'\nimport { mdiAccountCircleOutline } from '@aglyn/shared-data-mdi'\nimport Alert from '@mui/material/Alert'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Checkbox from '@mui/material/Checkbox'\nimport Chip from '@mui/material/Chip'\nimport Divider from '@mui/material/Divider'\nimport FormControlLabel from '@mui/material/FormControlLabel'\nimport MuiLink from '@mui/material/Link'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport TextField from '@mui/material/TextField'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useCallback, useEffect, useState } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = 'customer-account'\n\nexport interface CustomerAccountProps {\n signedOutHeading?: string\n}\n\ninterface AccountData {\n member: {\n email: string\n displayName: string\n addresses: CommerceModel.OrderAddress[]\n }\n downloads?: Array<{\n orderId: string\n productId: string\n productName: string\n url: string\n licenseKeys?: string[]\n }>\n subscriptions?: Array<{\n id: string\n productName: string\n status: string\n currentPeriodEndMs?: number | null\n }>\n orders: Array<{\n id: string\n number: string\n status: string\n totalCents: number\n createdAtMs: number\n itemsSummary: string\n tracking?: { carrier?: string; trackingNumber?: string }\n }>\n}\n\nconst usd = (cents: number) => `$${(cents / 100).toFixed(2)}`\n\n/**\n * Customer account block (AGL-294): signed-out visitors get sign-in /\n * create-account forms on the AGL-109 membership APIs; signed-in\n * members see their profile, address book, and order history (status +\n * tracking) with sign-out. Session lives in the httpOnly member cookie.\n */\nconst CustomerAccount = forwardRef<HTMLDivElement, CustomerAccountProps>(\n (props, ref) => {\n const { signedOutHeading, ...rest } = props\n // Node styles ride the renderer-merged sx; recompose (stack.ts pattern).\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const siteFetch = Aglyn.useSiteFetch()\n const [account, setAccount] = useState<AccountData | null | 'anonymous'>(\n null,\n )\n const [tab, setTab] = useState(0)\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [displayName, setDisplayName] = useState('')\n const [marketingConsent, setMarketingConsent] = useState(false)\n const [error, setError] = useState('')\n const [busy, setBusy] = useState(false)\n const [addressDraft, setAddressDraft] = useState<CommerceModel.OrderAddress | null>(\n null,\n )\n\n const refresh = useCallback(async () => {\n if (!hostId) return\n try {\n const response = await fetch(\n `/api/membership/account?hostId=${encodeURIComponent(hostId)}`,\n )\n if (response.status === 401) return setAccount('anonymous')\n if (response.ok) return setAccount(await response.json())\n setAccount('anonymous')\n } catch {\n setAccount('anonymous')\n }\n }, [hostId])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n const handleAuth = useCallback(async () => {\n if (!hostId || busy) return\n setBusy(true)\n setError('')\n try {\n const endpoint =\n tab === 0 ? '/api/membership/login' : '/api/membership/register'\n const response = await siteFetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n hostId,\n email,\n password,\n ...(tab === 1 && displayName ? { displayName } : {}),\n ...(tab === 1 && marketingConsent\n ? { marketingConsent: true }\n : {}),\n }),\n })\n const payload = await response.json().catch(() => ({}))\n if (!response.ok) {\n setError(String(payload?.error ?? 'Something went wrong'))\n return\n }\n if (tab === 1) {\n // Register does not set the cookie on every deployment; sign in\n // right after to be safe.\n await siteFetch('/api/membership/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, email, password }),\n }).catch(() => undefined)\n }\n /*\n * The host's own GA4 property, not Aglyn's (AGL-1591). Reported after\n * the response was accepted and never on a validation failure, which\n * is what makes the count mean \"an account door was completed\".\n *\n * The follow-up login above is deliberately NOT a second event: it is\n * a cookie repair for the registration that just happened, and\n * reporting it would give every new member both a `sign_up` and a\n * `login` in the same second — turning a returning-visitor metric into\n * a copy of the signup one.\n *\n * Not awaited: this branch re-renders in place rather than navigating,\n * so there is no teardown to lose the hit to.\n */\n trackEvent(tab === 1 ? 'sign_up' : 'login', { method: 'password' })\n await refresh()\n } finally {\n setBusy(false)\n }\n }, [\n hostId,\n busy,\n tab,\n email,\n password,\n displayName,\n marketingConsent,\n refresh,\n siteFetch,\n ])\n\n const handleSignOut = useCallback(async () => {\n if (!hostId) return\n await siteFetch('/api/membership/logout', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId }),\n }).catch(() => undefined)\n setAccount('anonymous')\n }, [hostId, siteFetch])\n\n const handleAddressSave = useCallback(async () => {\n if (!hostId || account === 'anonymous' || !account || !addressDraft) {\n return\n }\n const addresses = [...account.member.addresses, addressDraft].slice(-5)\n await siteFetch('/api/membership/account', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, addresses }),\n }).catch(() => undefined)\n setAddressDraft(null)\n await refresh()\n }, [hostId, account, addressDraft, refresh, siteFetch])\n\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n {\n p: 3,\n border: '1px dashed',\n borderColor: 'divider',\n borderRadius: 1,\n color: 'text.secondary',\n fontSize: 13,\n fontFamily: 'system-ui, sans-serif',\n },\n ...nodeSx,\n ]}\n >\n {'Customer account — sign-in and order history render here'}\n </Box>\n )\n }\n if (account === null) return <Box ref={ref} {...rest} />\n\n if (account === 'anonymous') {\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 420 }, ...nodeSx]}>\n {signedOutHeading ? (\n <Typography variant=\"h5\" gutterBottom>\n {signedOutHeading}\n </Typography>\n ) : null}\n <Tabs value={tab} onChange={(_event, value) => setTab(value)}>\n <Tab label=\"Sign in\" />\n <Tab label=\"Create account\" />\n </Tabs>\n <Box\n sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, mt: 2 }}\n >\n {tab === 1 ? (\n <TextField\n label=\"Name\"\n value={displayName}\n onChange={(event) => setDisplayName(event.target.value)}\n size=\"small\"\n />\n ) : null}\n <TextField\n label=\"Email\"\n type=\"email\"\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n size=\"small\"\n />\n <TextField\n label=\"Password\"\n type=\"password\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n size=\"small\"\n helperText={tab === 1 ? 'At least 8 characters' : undefined}\n />\n {tab === 1 ? (\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n checked={marketingConsent}\n onChange={(event) =>\n setMarketingConsent(event.target.checked)\n }\n />\n }\n label=\"Email me about offers and updates\"\n />\n ) : null}\n {error ? <Alert severity=\"error\">{error}</Alert> : null}\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={busy || !email || !password}\n onClick={handleAuth}\n >\n {busy ? 'Working…' : tab === 0 ? 'Sign in' : 'Create account'}\n </Button>\n {tab === 0 ? (\n // Recovery flow (AGL-552): the built-in /recover route (or\n // the host's designated recovery screen) handles the rest.\n <Typography variant=\"body2\">\n <MuiLink href=\"/recover\" underline=\"hover\">\n {'Forgot password?'}\n </MuiLink>\n </Typography>\n ) : null}\n </Box>\n </Box>\n )\n }\n\n return (\n <Box ref={ref} {...rest} sx={[{ display: 'flex', flexDirection: 'column', gap: 2 }, ...nodeSx]}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"h5\" sx={{ flex: 1 }}>\n {account.member.displayName || account.member.email}\n </Typography>\n <Button size=\"small\" onClick={handleSignOut}>\n {'Sign out'}\n </Button>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {account.member.email}\n </Typography>\n\n <Divider textAlign=\"left\">{'Orders'}</Divider>\n {account.orders.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No orders yet.'}\n </Typography>\n ) : (\n account.orders.map((order) => (\n <Box key={order.id} sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap>\n {`${order.number} · ${order.itemsSummary || 'Order'}`}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {new Date(order.createdAtMs).toLocaleDateString()}\n {order.tracking?.trackingNumber\n ? ` · ${order.tracking.carrier ?? ''} ${order.tracking.trackingNumber}`\n : ''}\n </Typography>\n </Box>\n <Chip\n label={order.status.replace('_', ' ')}\n size=\"small\"\n variant=\"outlined\"\n />\n <Typography variant=\"body2\">{usd(order.totalCents)}</Typography>\n </Box>\n ))\n )}\n\n {(account.subscriptions?.length ?? 0) > 0 ? (\n <>\n <Divider textAlign=\"left\">{'Subscriptions'}</Divider>\n {account.subscriptions!.map((subscription) => (\n <Box\n key={subscription.id}\n sx={{ display: 'flex', gap: 1, alignItems: 'center' }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1 }} noWrap>\n {subscription.productName}\n </Typography>\n <Chip\n label={subscription.status}\n size=\"small\"\n variant=\"outlined\"\n color={\n subscription.status === 'active' ? 'success' : 'default'\n }\n />\n <Button\n size=\"small\"\n onClick={async () => {\n const response = await siteFetch(\n '/api/commerce/subscription-portal',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId }),\n },\n ).catch(() => null)\n const payload = await response?.json().catch(() => ({}))\n if (payload?.url) window.location.assign(payload.url)\n }}\n >\n {'Manage'}\n </Button>\n </Box>\n ))}\n </>\n ) : null}\n {(account.downloads?.length ?? 0) > 0 ? (\n <>\n <Divider textAlign=\"left\">{'Downloads'}</Divider>\n {account.downloads!.map((download) => (\n <Box\n key={`${download.orderId}:${download.productId}`}\n sx={{ display: 'flex', gap: 1, alignItems: 'center' }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap>\n {download.productName}\n </Typography>\n {download.licenseKeys?.map((key) => (\n <Typography\n key={key}\n variant=\"caption\"\n sx={{ fontFamily: 'monospace', display: 'block' }}\n >\n {key}\n </Typography>\n ))}\n </Box>\n <Button size=\"small\" href={download.url}>\n {'Download'}\n </Button>\n </Box>\n ))}\n </>\n ) : null}\n\n <Divider textAlign=\"left\">{'Addresses'}</Divider>\n {account.member.addresses.map((address, index) => (\n <Typography key={index} variant=\"body2\" color=\"text.secondary\">\n {[\n address.name,\n address.line1,\n address.line2,\n `${address.city ?? ''} ${address.state ?? ''} ${address.postalCode ?? ''}`.trim(),\n address.country,\n ]\n .filter(Boolean)\n .join(', ')}\n </Typography>\n ))}\n {addressDraft ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n {(\n [\n ['name', 'Full name'],\n ['line1', 'Address'],\n ['line2', 'Apt / suite'],\n ['city', 'City'],\n ['state', 'State'],\n ['postalCode', 'Postal code'],\n ['country', 'Country (US)'],\n ] as const\n ).map(([field, label]) => (\n <TextField\n key={field}\n label={label}\n value={(addressDraft as any)[field] ?? ''}\n onChange={(event) =>\n setAddressDraft((prev) =>\n prev ? { ...prev, [field]: event.target.value } : prev,\n )\n }\n size=\"small\"\n />\n ))}\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button size=\"small\" onClick={() => setAddressDraft(null)}>\n {'Cancel'}\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n disabled={!addressDraft.line1 || !addressDraft.city}\n onClick={handleAddressSave}\n >\n {'Save address'}\n </Button>\n </Box>\n </Box>\n ) : (\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => setAddressDraft({})}\n >\n {'Add address'}\n </Button>\n )}\n </Box>\n )\n },\n)\nCustomerAccount.displayName = 'AglynCustomerAccount'\n\nexport const schema: Aglyn.ComponentSchema<CustomerAccountProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Customer account',\n description:\n 'Sign-in and account area — profile, addresses and order history.',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiAccountCircleOutline.path, sx: { color: '#2e7d32' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'signedOutHeading',\n label: 'Signed-out heading',\n description: 'Shown above the sign-in form.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Customer account',\n pluginId: BUNDLE_ID,\n description: 'Sign-in/up, profile, addresses, and order history',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiAccountCircleOutline.path, sx: { color: '#2e7d32' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: { signedOutHeading: 'Your account' },\n },\n },\n]\n\nexport default CustomerAccount\n"],"names":["Aglyn","trackEvent","mdiAccountCircleOutline","Alert","Box","Button","Checkbox","Chip","Divider","FormControlLabel","MuiLink","Tab","Tabs","TextField","Typography","forwardRef","useCallback","useEffect","useState","BUNDLE_ID","generatePresetId","ID","usd","cents","toFixed","CustomerAccount","props","ref","account","signedOutHeading","rest","nodeSx","Array","isArray","hostId","useSite","siteFetch","useSiteFetch","setAccount","tab","setTab","email","setEmail","password","setPassword","displayName","setDisplayName","marketingConsent","setMarketingConsent","error","setError","busy","setBusy","addressDraft","setAddressDraft","refresh","response","fetch","encodeURIComponent","status","ok","json","handleAuth","endpoint","method","headers","body","JSON","stringify","payload","catch","String","undefined","handleSignOut","handleAddressSave","addresses","member","slice","sx","p","border","borderColor","borderRadius","color","fontSize","fontFamily","maxWidth","variant","gutterBottom","value","onChange","_event","label","display","flexDirection","gap","mt","event","target","size","type","helperText","control","checked","severity","disabled","onClick","href","underline","alignItems","flex","textAlign","orders","length","map","order","minWidth","noWrap","number","itemsSummary","Date","createdAtMs","toLocaleDateString","tracking","trackingNumber","carrier","replace","totalCents","id","subscriptions","subscription","productName","url","window","location","assign","downloads","download","licenseKeys","key","orderId","productId","address","index","name","line1","line2","city","state","postalCode","trim","country","filter","Boolean","join","field","prev","alignSelf","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","component","FieldComponentType","TEXT_FIELD","presets","NodeType","PRESET","data","componentId"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/account.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { trackEvent } from '@aglyn/aglyn/app-utils/analytics-events'\nimport * as CommerceModel from '../model'\nimport { mdiAccountCircleOutline } from '@aglyn/shared-data-mdi'\nimport Alert from '@mui/material/Alert'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Checkbox from '@mui/material/Checkbox'\nimport Chip from '@mui/material/Chip'\nimport Divider from '@mui/material/Divider'\nimport FormControlLabel from '@mui/material/FormControlLabel'\nimport MuiLink from '@mui/material/Link'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport TextField from '@mui/material/TextField'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useCallback, useEffect, useState } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { returnRequestHref } from '../constants/return-request'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = 'customer-account'\n\nexport interface CustomerAccountProps {\n signedOutHeading?: string\n}\n\ninterface AccountData {\n member: {\n email: string\n displayName: string\n addresses: CommerceModel.OrderAddress[]\n }\n downloads?: Array<{\n orderId: string\n productId: string\n productName: string\n url: string\n licenseKeys?: string[]\n }>\n subscriptions?: Array<{\n id: string\n productName: string\n status: string\n currentPeriodEndMs?: number | null\n }>\n orders: Array<{\n id: string\n number: string\n status: string\n totalCents: number\n createdAtMs: number\n itemsSummary: string\n tracking?: { carrier?: string; trackingNumber?: string }\n }>\n}\n\nconst usd = (cents: number) => `$${(cents / 100).toFixed(2)}`\n\n/**\n * Customer account block (AGL-294): signed-out visitors get sign-in /\n * create-account forms on the AGL-109 membership APIs; signed-in\n * members see their profile, address book, and order history (status +\n * tracking) with sign-out. Session lives in the httpOnly member cookie.\n */\nconst CustomerAccount = forwardRef<HTMLDivElement, CustomerAccountProps>(\n (props, ref) => {\n const { signedOutHeading, ...rest } = props\n // Node styles ride the renderer-merged sx; recompose (stack.ts pattern).\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const siteFetch = Aglyn.useSiteFetch()\n const [account, setAccount] = useState<AccountData | null | 'anonymous'>(\n null,\n )\n const [tab, setTab] = useState(0)\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [displayName, setDisplayName] = useState('')\n const [marketingConsent, setMarketingConsent] = useState(false)\n const [error, setError] = useState('')\n const [busy, setBusy] = useState(false)\n const [addressDraft, setAddressDraft] = useState<CommerceModel.OrderAddress | null>(\n null,\n )\n\n const refresh = useCallback(async () => {\n if (!hostId) return\n try {\n const response = await fetch(\n `/api/membership/account?hostId=${encodeURIComponent(hostId)}`,\n )\n if (response.status === 401) return setAccount('anonymous')\n if (response.ok) return setAccount(await response.json())\n setAccount('anonymous')\n } catch {\n setAccount('anonymous')\n }\n }, [hostId])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n const handleAuth = useCallback(async () => {\n if (!hostId || busy) return\n setBusy(true)\n setError('')\n try {\n const endpoint =\n tab === 0 ? '/api/membership/login' : '/api/membership/register'\n const response = await siteFetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n hostId,\n email,\n password,\n ...(tab === 1 && displayName ? { displayName } : {}),\n ...(tab === 1 && marketingConsent\n ? { marketingConsent: true }\n : {}),\n }),\n })\n const payload = await response.json().catch(() => ({}))\n if (!response.ok) {\n setError(String(payload?.error ?? 'Something went wrong'))\n return\n }\n if (tab === 1) {\n // Register does not set the cookie on every deployment; sign in\n // right after to be safe.\n await siteFetch('/api/membership/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, email, password }),\n }).catch(() => undefined)\n }\n /*\n * The host's own GA4 property, not Aglyn's (AGL-1591). Reported after\n * the response was accepted and never on a validation failure, which\n * is what makes the count mean \"an account door was completed\".\n *\n * The follow-up login above is deliberately NOT a second event: it is\n * a cookie repair for the registration that just happened, and\n * reporting it would give every new member both a `sign_up` and a\n * `login` in the same second — turning a returning-visitor metric into\n * a copy of the signup one.\n *\n * Not awaited: this branch re-renders in place rather than navigating,\n * so there is no teardown to lose the hit to.\n */\n trackEvent(tab === 1 ? 'sign_up' : 'login', { method: 'password' })\n await refresh()\n } finally {\n setBusy(false)\n }\n }, [\n hostId,\n busy,\n tab,\n email,\n password,\n displayName,\n marketingConsent,\n refresh,\n siteFetch,\n ])\n\n const handleSignOut = useCallback(async () => {\n if (!hostId) return\n await siteFetch('/api/membership/logout', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId }),\n }).catch(() => undefined)\n setAccount('anonymous')\n }, [hostId, siteFetch])\n\n const handleAddressSave = useCallback(async () => {\n if (!hostId || account === 'anonymous' || !account || !addressDraft) {\n return\n }\n const addresses = [...account.member.addresses, addressDraft].slice(-5)\n await siteFetch('/api/membership/account', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, addresses }),\n }).catch(() => undefined)\n setAddressDraft(null)\n await refresh()\n }, [hostId, account, addressDraft, refresh, siteFetch])\n\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n {\n p: 3,\n border: '1px dashed',\n borderColor: 'divider',\n borderRadius: 1,\n color: 'text.secondary',\n fontSize: 13,\n fontFamily: 'system-ui, sans-serif',\n },\n ...nodeSx,\n ]}\n >\n {'Customer account — sign-in and order history render here'}\n </Box>\n )\n }\n if (account === null) return <Box ref={ref} {...rest} />\n\n if (account === 'anonymous') {\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 420 }, ...nodeSx]}>\n {signedOutHeading ? (\n <Typography variant=\"h5\" gutterBottom>\n {signedOutHeading}\n </Typography>\n ) : null}\n <Tabs value={tab} onChange={(_event, value) => setTab(value)}>\n <Tab label=\"Sign in\" />\n <Tab label=\"Create account\" />\n </Tabs>\n <Box\n sx={{ display: 'flex', flexDirection: 'column', gap: 1.5, mt: 2 }}\n >\n {tab === 1 ? (\n <TextField\n label=\"Name\"\n value={displayName}\n onChange={(event) => setDisplayName(event.target.value)}\n size=\"small\"\n />\n ) : null}\n <TextField\n label=\"Email\"\n type=\"email\"\n value={email}\n onChange={(event) => setEmail(event.target.value)}\n size=\"small\"\n />\n <TextField\n label=\"Password\"\n type=\"password\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n size=\"small\"\n helperText={tab === 1 ? 'At least 8 characters' : undefined}\n />\n {tab === 1 ? (\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n checked={marketingConsent}\n onChange={(event) =>\n setMarketingConsent(event.target.checked)\n }\n />\n }\n label=\"Email me about offers and updates\"\n />\n ) : null}\n {error ? <Alert severity=\"error\">{error}</Alert> : null}\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={busy || !email || !password}\n onClick={handleAuth}\n >\n {busy ? 'Working…' : tab === 0 ? 'Sign in' : 'Create account'}\n </Button>\n {tab === 0 ? (\n // Recovery flow (AGL-552): the built-in /recover route (or\n // the host's designated recovery screen) handles the rest.\n <Typography variant=\"body2\">\n <MuiLink href=\"/recover\" underline=\"hover\">\n {'Forgot password?'}\n </MuiLink>\n </Typography>\n ) : null}\n </Box>\n </Box>\n )\n }\n\n return (\n <Box ref={ref} {...rest} sx={[{ display: 'flex', flexDirection: 'column', gap: 2 }, ...nodeSx]}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"h5\" sx={{ flex: 1 }}>\n {account.member.displayName || account.member.email}\n </Typography>\n <Button size=\"small\" onClick={handleSignOut}>\n {'Sign out'}\n </Button>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {account.member.email}\n </Typography>\n\n <Divider textAlign=\"left\">{'Orders'}</Divider>\n {account.orders.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No orders yet.'}\n </Typography>\n ) : (\n account.orders.map((order) => (\n <Box key={order.id} sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap>\n {`${order.number} · ${order.itemsSummary || 'Order'}`}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {new Date(order.createdAtMs).toLocaleDateString()}\n {order.tracking?.trackingNumber\n ? ` · ${order.tracking.carrier ?? ''} ${order.tracking.trackingNumber}`\n : ''}\n </Typography>\n </Box>\n <Chip\n label={order.status.replace('_', ' ')}\n size=\"small\"\n variant=\"outlined\"\n />\n <Typography variant=\"body2\">{usd(order.totalCents)}</Typography>\n {CommerceModel.RETURNABLE_ORDER_STATUSES.includes(order.status) ? (\n // The member's session authorizes the return page, so the\n // link carries no token (AGL-3611).\n <Button size=\"small\" href={returnRequestHref(order.id)}>\n {'Request a return'}\n </Button>\n ) : null}\n </Box>\n ))\n )}\n\n {(account.subscriptions?.length ?? 0) > 0 ? (\n <>\n <Divider textAlign=\"left\">{'Subscriptions'}</Divider>\n {account.subscriptions!.map((subscription) => (\n <Box\n key={subscription.id}\n sx={{ display: 'flex', gap: 1, alignItems: 'center' }}\n >\n <Typography variant=\"body2\" sx={{ flex: 1 }} noWrap>\n {subscription.productName}\n </Typography>\n <Chip\n label={subscription.status}\n size=\"small\"\n variant=\"outlined\"\n color={\n subscription.status === 'active' ? 'success' : 'default'\n }\n />\n <Button\n size=\"small\"\n onClick={async () => {\n const response = await siteFetch(\n '/api/commerce/subscription-portal',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId }),\n },\n ).catch(() => null)\n const payload = await response?.json().catch(() => ({}))\n if (payload?.url) window.location.assign(payload.url)\n }}\n >\n {'Manage'}\n </Button>\n </Box>\n ))}\n </>\n ) : null}\n {(account.downloads?.length ?? 0) > 0 ? (\n <>\n <Divider textAlign=\"left\">{'Downloads'}</Divider>\n {account.downloads!.map((download) => (\n <Box\n key={`${download.orderId}:${download.productId}`}\n sx={{ display: 'flex', gap: 1, alignItems: 'center' }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"body2\" noWrap>\n {download.productName}\n </Typography>\n {download.licenseKeys?.map((key) => (\n <Typography\n key={key}\n variant=\"caption\"\n sx={{ fontFamily: 'monospace', display: 'block' }}\n >\n {key}\n </Typography>\n ))}\n </Box>\n <Button size=\"small\" href={download.url}>\n {'Download'}\n </Button>\n </Box>\n ))}\n </>\n ) : null}\n\n <Divider textAlign=\"left\">{'Addresses'}</Divider>\n {account.member.addresses.map((address, index) => (\n <Typography key={index} variant=\"body2\" color=\"text.secondary\">\n {[\n address.name,\n address.line1,\n address.line2,\n `${address.city ?? ''} ${address.state ?? ''} ${address.postalCode ?? ''}`.trim(),\n address.country,\n ]\n .filter(Boolean)\n .join(', ')}\n </Typography>\n ))}\n {addressDraft ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n {(\n [\n ['name', 'Full name'],\n ['line1', 'Address'],\n ['line2', 'Apt / suite'],\n ['city', 'City'],\n ['state', 'State'],\n ['postalCode', 'Postal code'],\n ['country', 'Country (US)'],\n ] as const\n ).map(([field, label]) => (\n <TextField\n key={field}\n label={label}\n value={(addressDraft as any)[field] ?? ''}\n onChange={(event) =>\n setAddressDraft((prev) =>\n prev ? { ...prev, [field]: event.target.value } : prev,\n )\n }\n size=\"small\"\n />\n ))}\n <Box sx={{ display: 'flex', gap: 1 }}>\n <Button size=\"small\" onClick={() => setAddressDraft(null)}>\n {'Cancel'}\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n disabled={!addressDraft.line1 || !addressDraft.city}\n onClick={handleAddressSave}\n >\n {'Save address'}\n </Button>\n </Box>\n </Box>\n ) : (\n <Button\n size=\"small\"\n sx={{ alignSelf: 'flex-start' }}\n onClick={() => setAddressDraft({})}\n >\n {'Add address'}\n </Button>\n )}\n </Box>\n )\n },\n)\nCustomerAccount.displayName = 'AglynCustomerAccount'\n\nexport const schema: Aglyn.ComponentSchema<CustomerAccountProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Customer account',\n description:\n 'Sign-in and account area — profile, addresses and order history.',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiAccountCircleOutline.path, sx: { color: '#2e7d32' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'signedOutHeading',\n label: 'Signed-out heading',\n description: 'Shown above the sign-in form.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Customer account',\n pluginId: BUNDLE_ID,\n description: 'Sign-in/up, profile, addresses, and order history',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiAccountCircleOutline.path, sx: { color: '#2e7d32' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: { signedOutHeading: 'Your account' },\n },\n },\n]\n\nexport default CustomerAccount\n"],"names":["Aglyn","trackEvent","CommerceModel","mdiAccountCircleOutline","Alert","Box","Button","Checkbox","Chip","Divider","FormControlLabel","MuiLink","Tab","Tabs","TextField","Typography","forwardRef","useCallback","useEffect","useState","BUNDLE_ID","returnRequestHref","generatePresetId","ID","usd","cents","toFixed","CustomerAccount","props","ref","account","signedOutHeading","rest","nodeSx","Array","isArray","hostId","useSite","siteFetch","useSiteFetch","setAccount","tab","setTab","email","setEmail","password","setPassword","displayName","setDisplayName","marketingConsent","setMarketingConsent","error","setError","busy","setBusy","addressDraft","setAddressDraft","refresh","response","fetch","encodeURIComponent","status","ok","json","handleAuth","endpoint","method","headers","body","JSON","stringify","payload","catch","String","undefined","handleSignOut","handleAddressSave","addresses","member","slice","sx","p","border","borderColor","borderRadius","color","fontSize","fontFamily","maxWidth","variant","gutterBottom","value","onChange","_event","label","display","flexDirection","gap","mt","event","target","size","type","helperText","control","checked","severity","disabled","onClick","href","underline","alignItems","flex","textAlign","orders","length","map","order","minWidth","noWrap","number","itemsSummary","Date","createdAtMs","toLocaleDateString","tracking","trackingNumber","carrier","replace","totalCents","RETURNABLE_ORDER_STATUSES","includes","id","subscriptions","subscription","productName","url","window","location","assign","downloads","download","licenseKeys","key","orderId","productId","address","index","name","line1","line2","city","state","postalCode","trim","country","filter","Boolean","join","field","prev","alignSelf","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","component","FieldComponentType","TEXT_FIELD","presets","NodeType","PRESET","data","componentId"],"mappings":";;;AAAA;;;;;;;;;;;;;;;CAeC,GAED,YAAYA,WAAW,eAAc;AACrC,SAASC,UAAU,QAAQ,0CAAyC;AACpE,YAAYC,mBAAmB,oBAAU;AACzC,SAASC,uBAAuB,QAAQ,yBAAwB;AAChE,OAAOC,WAAW,sBAAqB;AACvC,OAAOC,SAAS,oBAAmB;AACnC,OAAOC,YAAY,uBAAsB;AACzC,OAAOC,cAAc,yBAAwB;AAC7C,OAAOC,UAAU,qBAAoB;AACrC,OAAOC,aAAa,wBAAuB;AAC3C,OAAOC,sBAAsB,iCAAgC;AAC7D,OAAOC,aAAa,qBAAoB;AACxC,OAAOC,SAAS,oBAAmB;AACnC,OAAOC,UAAU,qBAAoB;AACrC,OAAOC,eAAe,0BAAyB;AAC/C,OAAOC,gBAAgB,2BAA0B;AACjD,SAASC,UAAU,EAAEC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AACpE,SAASC,SAAS,QAAQ,gCAA4B;AACtD,SAASC,iBAAiB,QAAQ,iCAA6B;AAC/D,SAASC,gBAAgB,QAAQ,iCAA6B;AAE9D,iEAAiE;AACjE,OAAO,MAAMC,KAAwB,mBAAkB;AAoCvD,MAAMC,MAAM,CAACC,QAAkB,CAAC,CAAC,EAAE,AAACA,CAAAA,QAAQ,GAAE,EAAGC,OAAO,CAAC,IAAI;AAE7D;;;;;CAKC,GACD,MAAMC,gCAAkBX,WACtB,CAACY,OAAOC;;QAoRAC,wBAwCAA;IA3TN,MAAM,EAAEC,gBAAgB,EAAW,GAAGH,OAATI,wCAASJ;;;IACtC,yEAAyE;IACzE,MAAMK,SAASC,MAAMC,OAAO,CAACP,KAAK,CAAC,KAAK,IAAIA,KAAK,CAAC,KAAK,GAAG;QAACA,KAAK,CAAC,KAAK;KAAC;IACvE,MAAM,EAAEQ,MAAM,EAAE,GAAGpC,MAAMqC,OAAO;IAChC,MAAMC,YAAYtC,MAAMuC,YAAY;IACpC,MAAM,CAACT,SAASU,WAAW,GAAGrB,SAC5B;IAEF,MAAM,CAACsB,KAAKC,OAAO,GAAGvB,SAAS;IAC/B,MAAM,CAACwB,OAAOC,SAAS,GAAGzB,SAAS;IACnC,MAAM,CAAC0B,UAAUC,YAAY,GAAG3B,SAAS;IACzC,MAAM,CAAC4B,aAAaC,eAAe,GAAG7B,SAAS;IAC/C,MAAM,CAAC8B,kBAAkBC,oBAAoB,GAAG/B,SAAS;IACzD,MAAM,CAACgC,OAAOC,SAAS,GAAGjC,SAAS;IACnC,MAAM,CAACkC,MAAMC,QAAQ,GAAGnC,SAAS;IACjC,MAAM,CAACoC,cAAcC,gBAAgB,GAAGrC,SACtC;IAGF,MAAMsC,UAAUxC,YAAY;QAC1B,IAAI,CAACmB,QAAQ;QACb,IAAI;YACF,MAAMsB,WAAW,MAAMC,MACrB,CAAC,+BAA+B,EAAEC,mBAAmBxB,SAAS;YAEhE,IAAIsB,SAASG,MAAM,KAAK,KAAK,OAAOrB,WAAW;YAC/C,IAAIkB,SAASI,EAAE,EAAE,OAAOtB,WAAW,MAAMkB,SAASK,IAAI;YACtDvB,WAAW;QACb,EAAE,eAAM;YACNA,WAAW;QACb;IACF,GAAG;QAACJ;KAAO;IAEXlB,UAAU;QACR,KAAKuC;IACP,GAAG;QAACA;KAAQ;IAEZ,MAAMO,aAAa/C,YAAY;QAC7B,IAAI,CAACmB,UAAUiB,MAAM;QACrBC,QAAQ;QACRF,SAAS;QACT,IAAI;YACF,MAAMa,WACJxB,QAAQ,IAAI,0BAA0B;YACxC,MAAMiB,WAAW,MAAMpB,UAAU2B,UAAU;gBACzCC,QAAQ;gBACRC,SAAS;oBAAE,gBAAgB;gBAAmB;gBAC9CC,MAAMC,KAAKC,SAAS,CAAC;oBACnBlC;oBACAO;oBACAE;mBACIJ,QAAQ,KAAKM,cAAc;oBAAEA;gBAAY,IAAI,CAAC,GAC9CN,QAAQ,KAAKQ,mBACb;oBAAEA,kBAAkB;gBAAK,IACzB,CAAC;YAET;YACA,MAAMsB,UAAU,MAAMb,SAASK,IAAI,GAAGS,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;YACpD,IAAI,CAACd,SAASI,EAAE,EAAE;;gBAChBV,SAASqB,eAAOF,2BAAAA,QAASpB,KAAK,mBAAI;gBAClC;YACF;YACA,IAAIV,QAAQ,GAAG;gBACb,gEAAgE;gBAChE,0BAA0B;gBAC1B,MAAMH,UAAU,yBAAyB;oBACvC4B,QAAQ;oBACRC,SAAS;wBAAE,gBAAgB;oBAAmB;oBAC9CC,MAAMC,KAAKC,SAAS,CAAC;wBAAElC;wBAAQO;wBAAOE;oBAAS;gBACjD,GAAG2B,KAAK,CAAC,IAAME;YACjB;YACA;;;;;;;;;;;;;SAaC,GACDzE,WAAWwC,QAAQ,IAAI,YAAY,SAAS;gBAAEyB,QAAQ;YAAW;YACjE,MAAMT;QACR,SAAU;YACRH,QAAQ;QACV;IACF,GAAG;QACDlB;QACAiB;QACAZ;QACAE;QACAE;QACAE;QACAE;QACAQ;QACAnB;KACD;IAED,MAAMqC,gBAAgB1D,YAAY;QAChC,IAAI,CAACmB,QAAQ;QACb,MAAME,UAAU,0BAA0B;YACxC4B,QAAQ;YACRC,SAAS;gBAAE,gBAAgB;YAAmB;YAC9CC,MAAMC,KAAKC,SAAS,CAAC;gBAAElC;YAAO;QAChC,GAAGoC,KAAK,CAAC,IAAME;QACflC,WAAW;IACb,GAAG;QAACJ;QAAQE;KAAU;IAEtB,MAAMsC,oBAAoB3D,YAAY;QACpC,IAAI,CAACmB,UAAUN,YAAY,eAAe,CAACA,WAAW,CAACyB,cAAc;YACnE;QACF;QACA,MAAMsB,YAAY;eAAI/C,QAAQgD,MAAM,CAACD,SAAS;YAAEtB;SAAa,CAACwB,KAAK,CAAC,CAAC;QACrE,MAAMzC,UAAU,2BAA2B;YACzC4B,QAAQ;YACRC,SAAS;gBAAE,gBAAgB;YAAmB;YAC9CC,MAAMC,KAAKC,SAAS,CAAC;gBAAElC;gBAAQyC;YAAU;QAC3C,GAAGL,KAAK,CAAC,IAAME;QACflB,gBAAgB;QAChB,MAAMC;IACR,GAAG;QAACrB;QAAQN;QAASyB;QAAcE;QAASnB;KAAU;IAEtD,IAAI,CAACF,QAAQ;QACX,qBACE,KAAC/B;YACCwB,KAAKA;WACDG;YACJgD,IAAI;gBACF;oBACEC,GAAG;oBACHC,QAAQ;oBACRC,aAAa;oBACbC,cAAc;oBACdC,OAAO;oBACPC,UAAU;oBACVC,YAAY;gBACd;mBACGtD;aACJ;sBAEA;;IAGP;IACA,IAAIH,YAAY,MAAM,qBAAO,KAACzB;QAAIwB,KAAKA;OAASG;IAEhD,IAAIF,YAAY,aAAa;QAC3B,qBACE,MAACzB;YAAIwB,KAAKA;WAASG;YAAMgD,IAAI;gBAAC;oBAAEQ,UAAU;gBAAI;mBAAMvD;aAAO;;gBACxDF,iCACC,KAAChB;oBAAW0E,SAAQ;oBAAKC,YAAY;8BAClC3D;qBAED;8BACJ,MAAClB;oBAAK8E,OAAOlD;oBAAKmD,UAAU,CAACC,QAAQF,QAAUjD,OAAOiD;;sCACpD,KAAC/E;4BAAIkF,OAAM;;sCACX,KAAClF;4BAAIkF,OAAM;;;;8BAEb,MAACzF;oBACC2E,IAAI;wBAAEe,SAAS;wBAAQC,eAAe;wBAAUC,KAAK;wBAAKC,IAAI;oBAAE;;wBAE/DzD,QAAQ,kBACP,KAAC3B;4BACCgF,OAAM;4BACNH,OAAO5C;4BACP6C,UAAU,CAACO,QAAUnD,eAAemD,MAAMC,MAAM,CAACT,KAAK;4BACtDU,MAAK;6BAEL;sCACJ,KAACvF;4BACCgF,OAAM;4BACNQ,MAAK;4BACLX,OAAOhD;4BACPiD,UAAU,CAACO,QAAUvD,SAASuD,MAAMC,MAAM,CAACT,KAAK;4BAChDU,MAAK;;sCAEP,KAACvF;4BACCgF,OAAM;4BACNQ,MAAK;4BACLX,OAAO9C;4BACP+C,UAAU,CAACO,QAAUrD,YAAYqD,MAAMC,MAAM,CAACT,KAAK;4BACnDU,MAAK;4BACLE,YAAY9D,QAAQ,IAAI,0BAA0BiC;;wBAEnDjC,QAAQ,kBACP,KAAC/B;4BACC8F,uBACE,KAACjG;gCACC8F,MAAK;gCACLI,SAASxD;gCACT2C,UAAU,CAACO,QACTjD,oBAAoBiD,MAAMC,MAAM,CAACK,OAAO;;4BAI9CX,OAAM;6BAEN;wBACH3C,sBAAQ,KAAC/C;4BAAMsG,UAAS;sCAASvD;6BAAiB;sCACnD,KAAC7C;4BACCmF,SAAQ;4BACRJ,OAAM;4BACNsB,UAAUtD,QAAQ,CAACV,SAAS,CAACE;4BAC7B+D,SAAS5C;sCAERX,OAAO,aAAaZ,QAAQ,IAAI,YAAY;;wBAE9CA,QAAQ,IACP,2DAA2D;wBAC3D,2DAA2D;sCAC3D,KAAC1B;4BAAW0E,SAAQ;sCAClB,cAAA,KAAC9E;gCAAQkG,MAAK;gCAAWC,WAAU;0CAChC;;6BAGH;;;;;IAIZ;IAEA,qBACE,MAACzG;QAAIwB,KAAKA;OAASG;QAAMgD,IAAI;YAAC;gBAAEe,SAAS;gBAAQC,eAAe;gBAAUC,KAAK;YAAE;eAAMhE;SAAO;;0BAC5F,MAAC5B;gBAAI2E,IAAI;oBAAEe,SAAS;oBAAQgB,YAAY;oBAAUd,KAAK;gBAAE;;kCACvD,KAAClF;wBAAW0E,SAAQ;wBAAKT,IAAI;4BAAEgC,MAAM;wBAAE;kCACpClF,QAAQgD,MAAM,CAAC/B,WAAW,IAAIjB,QAAQgD,MAAM,CAACnC,KAAK;;kCAErD,KAACrC;wBAAO+F,MAAK;wBAAQO,SAASjC;kCAC3B;;;;0BAGL,KAAC5D;gBAAW0E,SAAQ;gBAAQJ,OAAM;0BAC/BvD,QAAQgD,MAAM,CAACnC,KAAK;;0BAGvB,KAAClC;gBAAQwG,WAAU;0BAAQ;;YAC1BnF,QAAQoF,MAAM,CAACC,MAAM,KAAK,kBACzB,KAACpG;gBAAW0E,SAAQ;gBAAQJ,OAAM;0BAC/B;iBAGHvD,QAAQoF,MAAM,CAACE,GAAG,CAAC,CAACC;oBASFA;oBADTA;qCAPP,MAAChH;oBAAmB2E,IAAI;wBAAEe,SAAS;wBAAQE,KAAK;wBAAGc,YAAY;oBAAS;;sCACtE,MAAC1G;4BAAI2E,IAAI;gCAAEgC,MAAM;gCAAGM,UAAU;4BAAE;;8CAC9B,KAACvG;oCAAW0E,SAAQ;oCAAQ8B,MAAM;8CAC/B,GAAGF,MAAMG,MAAM,CAAC,GAAG,EAAEH,MAAMI,YAAY,IAAI,SAAS;;8CAEvD,MAAC1G;oCAAW0E,SAAQ;oCAAUJ,OAAM;;wCACjC,IAAIqC,KAAKL,MAAMM,WAAW,EAAEC,kBAAkB;wCAC9CP,EAAAA,kBAAAA,MAAMQ,QAAQ,qBAAdR,gBAAgBS,cAAc,IAC3B,CAAC,GAAG,GAAET,0BAAAA,MAAMQ,QAAQ,CAACE,OAAO,YAAtBV,0BAA0B,GAAG,CAAC,EAAEA,MAAMQ,QAAQ,CAACC,cAAc,EAAE,GACrE;;;;;sCAGR,KAACtH;4BACCsF,OAAOuB,MAAMxD,MAAM,CAACmE,OAAO,CAAC,KAAK;4BACjC3B,MAAK;4BACLZ,SAAQ;;sCAEV,KAAC1E;4BAAW0E,SAAQ;sCAASjE,IAAI6F,MAAMY,UAAU;;wBAChD/H,cAAcgI,yBAAyB,CAACC,QAAQ,CAACd,MAAMxD,MAAM,IAC5D,0DAA0D;wBAC1D,oCAAoC;sCACpC,KAACvD;4BAAO+F,MAAK;4BAAQQ,MAAMxF,kBAAkBgG,MAAMe,EAAE;sCAClD;6BAED;;mBAxBIf,MAAMe,EAAE;;YA6BrB,UAACtG,yBAAAA,QAAQuG,aAAa,qBAArBvG,uBAAuBqF,MAAM,mBAAI,KAAK,kBACtC;;kCACE,KAAC1G;wBAAQwG,WAAU;kCAAQ;;oBAC1BnF,QAAQuG,aAAa,CAAEjB,GAAG,CAAC,CAACkB,6BAC3B,MAACjI;4BAEC2E,IAAI;gCAAEe,SAAS;gCAAQE,KAAK;gCAAGc,YAAY;4BAAS;;8CAEpD,KAAChG;oCAAW0E,SAAQ;oCAAQT,IAAI;wCAAEgC,MAAM;oCAAE;oCAAGO,MAAM;8CAChDe,aAAaC,WAAW;;8CAE3B,KAAC/H;oCACCsF,OAAOwC,aAAazE,MAAM;oCAC1BwC,MAAK;oCACLZ,SAAQ;oCACRJ,OACEiD,aAAazE,MAAM,KAAK,WAAW,YAAY;;8CAGnD,KAACvD;oCACC+F,MAAK;oCACLO,SAAS;wCACP,MAAMlD,WAAW,MAAMpB,UACrB,qCACA;4CACE4B,QAAQ;4CACRC,SAAS;gDAAE,gBAAgB;4CAAmB;4CAC9CC,MAAMC,KAAKC,SAAS,CAAC;gDAAElC;4CAAO;wCAChC,GACAoC,KAAK,CAAC,IAAM;wCACd,MAAMD,UAAU,OAAMb,4BAAAA,SAAUK,IAAI,GAAGS,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;wCACrD,IAAID,2BAAAA,QAASiE,GAAG,EAAEC,OAAOC,QAAQ,CAACC,MAAM,CAACpE,QAAQiE,GAAG;oCACtD;8CAEC;;;2BA7BEF,aAAaF,EAAE;;iBAkCxB;YACH,WAACtG,qBAAAA,QAAQ8G,SAAS,qBAAjB9G,mBAAmBqF,MAAM,oBAAI,KAAK,kBAClC;;kCACE,KAAC1G;wBAAQwG,WAAU;kCAAQ;;oBAC1BnF,QAAQ8G,SAAS,CAAExB,GAAG,CAAC,CAACyB;4BASlBA;6CARL,MAACxI;4BAEC2E,IAAI;gCAAEe,SAAS;gCAAQE,KAAK;gCAAGc,YAAY;4BAAS;;8CAEpD,MAAC1G;oCAAI2E,IAAI;wCAAEgC,MAAM;wCAAGM,UAAU;oCAAE;;sDAC9B,KAACvG;4CAAW0E,SAAQ;4CAAQ8B,MAAM;sDAC/BsB,SAASN,WAAW;;yCAEtBM,wBAAAA,SAASC,WAAW,qBAApBD,sBAAsBzB,GAAG,CAAC,CAAC2B,oBAC1B,KAAChI;gDAEC0E,SAAQ;gDACRT,IAAI;oDAAEO,YAAY;oDAAaQ,SAAS;gDAAQ;0DAE/CgD;+CAJIA;;;8CAQX,KAACzI;oCAAO+F,MAAK;oCAAQQ,MAAMgC,SAASL,GAAG;8CACpC;;;2BAlBE,GAAGK,SAASG,OAAO,CAAC,CAAC,EAAEH,SAASI,SAAS,EAAE;;;iBAuBpD;0BAEJ,KAACxI;gBAAQwG,WAAU;0BAAQ;;YAC1BnF,QAAQgD,MAAM,CAACD,SAAS,CAACuC,GAAG,CAAC,CAAC8B,SAASC;oBAM/BD,eAAsBA,gBAAuBA;qCALpD,KAACnI;oBAAuB0E,SAAQ;oBAAQJ,OAAM;8BAC3C;wBACC6D,QAAQE,IAAI;wBACZF,QAAQG,KAAK;wBACbH,QAAQI,KAAK;wBACb,IAAGJ,gBAAAA,QAAQK,IAAI,YAAZL,gBAAgB,GAAG,CAAC,GAAEA,iBAAAA,QAAQM,KAAK,YAAbN,iBAAiB,GAAG,CAAC,GAAEA,sBAAAA,QAAQO,UAAU,YAAlBP,sBAAsB,IAAI,CAACQ,IAAI;wBAC/ER,QAAQS,OAAO;qBAChB,CACEC,MAAM,CAACC,SACPC,IAAI,CAAC;mBATOX;;YAYlB5F,6BACC,MAAClD;gBAAI2E,IAAI;oBAAEe,SAAS;oBAAQC,eAAe;oBAAUC,KAAK;gBAAE;;oBAExD;wBACE;4BAAC;4BAAQ;yBAAY;wBACrB;4BAAC;4BAAS;yBAAU;wBACpB;4BAAC;4BAAS;yBAAc;wBACxB;4BAAC;4BAAQ;yBAAO;wBAChB;4BAAC;4BAAS;yBAAQ;wBAClB;4BAAC;4BAAc;yBAAc;wBAC7B;4BAAC;4BAAW;yBAAe;qBAC5B,CACDmB,GAAG,CAAC,CAAC,CAAC2C,OAAOjE,MAAM;4BAIV;6CAHT,KAAChF;4BAECgF,OAAOA;4BACPH,KAAK,GAAE,sBAAA,AAACpC,YAAoB,CAACwG,MAAM,YAA5B,sBAAgC;4BACvCnE,UAAU,CAACO,QACT3C,gBAAgB,CAACwG,OACfA,OAAO,aAAKA;wCAAM,CAACD,MAAM,EAAE5D,MAAMC,MAAM,CAACT,KAAK;yCAAKqE;4BAGtD3D,MAAK;2BARA0D;;kCAWT,MAAC1J;wBAAI2E,IAAI;4BAAEe,SAAS;4BAAQE,KAAK;wBAAE;;0CACjC,KAAC3F;gCAAO+F,MAAK;gCAAQO,SAAS,IAAMpD,gBAAgB;0CACjD;;0CAEH,KAAClD;gCACC+F,MAAK;gCACLZ,SAAQ;gCACRJ,OAAM;gCACNsB,UAAU,CAACpD,aAAa8F,KAAK,IAAI,CAAC9F,aAAagG,IAAI;gCACnD3C,SAAShC;0CAER;;;;;+BAKP,KAACtE;gBACC+F,MAAK;gBACLrB,IAAI;oBAAEiF,WAAW;gBAAa;gBAC9BrD,SAAS,IAAMpD,gBAAgB,CAAC;0BAE/B;;;;AAKX;AAEF7B,gBAAgBoB,WAAW,GAAG;AAE9B,OAAO,MAAMmH,SAAsD;IACjEC,KAAK5I;IACL6I,UAAUhJ;IACV2B,aAAa;IACbsH,aACE;IACFC,UAAUtK,MAAMuK,iBAAiB,CAACC,QAAQ;IAC1CC,MAAM;QAAEC,MAAMvK,wBAAwBuK,IAAI;QAAE1F,IAAI;YAAEK,OAAO;QAAU;IAAE;IACrEsF,OAAO;QAAEC,aAAa5K,MAAM6K,YAAY,CAACC,OAAO;IAAC;IACjDC,YAAY;QACV;YACE3B,MAAM;YACNtD,OAAO;YACPuE,aAAa;YACbW,WAAWhL,MAAMiL,kBAAkB,CAACC,UAAU;QAChD;KACD;AACH,EAAC;AAED,OAAO,MAAMC,UAAgC;IAC3C;QACEhB,KAAK7I,iBAAiBC;QACtB+E,MAAMtG,MAAMoL,QAAQ,CAACC,MAAM;QAC3BtI,aAAa;QACbqH,UAAUhJ;QACViJ,aAAa;QACbC,UAAUtK,MAAMuK,iBAAiB,CAACC,QAAQ;QAC1CC,MAAM;YAAEC,MAAMvK,wBAAwBuK,IAAI;YAAE1F,IAAI;gBAAEK,OAAO;YAAU;QAAE;QACrEiG,MAAM;YACJnB,KAAK;YACLoB,aAAahK;YACb6I,UAAUhJ;YACVQ,OAAO;gBAAEG,kBAAkB;YAAe;QAC5C;IACF;CACD,CAAA;AAED,eAAeJ,gBAAe"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Optional lines another plugin offers at the cart (AGL-3635), as boxes the
19
+ * shopper ticks — package protection is the first. The offers come from
20
+ * `GET /api/commerce/cart-extras`, asked only while the cart is on screen
21
+ * and again whenever its lines change; the checkout asks the provider again
22
+ * for the price it charges, so what is shown here is never what is trusted.
23
+ * A store with no offering plugin gets an empty answer and draws nothing.
24
+ */
25
+ export interface CartExtraOffer {
26
+ id: string;
27
+ label: string;
28
+ description?: string;
29
+ amountCents: number;
30
+ defaultSelected: boolean;
31
+ termsUrl?: string;
32
+ }
33
+ export declare function useCartExtras(hostId: string | undefined, cartSignature: string): {
34
+ offers: CartExtraOffer[];
35
+ chosen: Record<string, boolean>;
36
+ chosenIds: string[];
37
+ toggle: (id: string, value: boolean) => void;
38
+ reload: () => void;
39
+ };
40
+ export declare function CartExtras(props: {
41
+ offers: CartExtraOffer[];
42
+ chosen: Record<string, boolean>;
43
+ onToggle: (id: string, value: boolean) => void;
44
+ formatCents: (cents: number) => string;
45
+ }): import("react").JSX.Element;
@@ -0,0 +1,127 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * @license
5
+ * Copyright 2026 Aglyn LLC
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */ import Box from "@mui/material/Box";
19
+ import Checkbox from "@mui/material/Checkbox";
20
+ import FormControlLabel from "@mui/material/FormControlLabel";
21
+ import Link from "@mui/material/Link";
22
+ import Typography from "@mui/material/Typography";
23
+ import { useCallback, useEffect, useMemo, useState } from "react";
24
+ export function useCartExtras(hostId, cartSignature) {
25
+ const [offers, setOffers] = useState([]);
26
+ const [chosen, setChosen] = useState({});
27
+ const [round, setRound] = useState(0);
28
+ useEffect(()=>{
29
+ if (!hostId || cartSignature === '[]') {
30
+ setOffers([]);
31
+ return;
32
+ }
33
+ let live = true;
34
+ fetch(`/api/commerce/cart-extras?hostId=${encodeURIComponent(hostId)}`).then((response)=>response.ok ? response.json() : {
35
+ extras: []
36
+ }).then((payload)=>{
37
+ if (!live) return;
38
+ const next = Array.isArray(payload == null ? void 0 : payload.extras) ? payload.extras : [];
39
+ setOffers(next);
40
+ // A box the shopper already touched keeps their answer.
41
+ setChosen((prior)=>Object.fromEntries(next.map((offer)=>{
42
+ var _prior_offer_id;
43
+ return [
44
+ offer.id,
45
+ (_prior_offer_id = prior[offer.id]) != null ? _prior_offer_id : offer.defaultSelected
46
+ ];
47
+ })));
48
+ }).catch(()=>live && setOffers([]));
49
+ return ()=>{
50
+ live = false;
51
+ };
52
+ }, [
53
+ hostId,
54
+ cartSignature,
55
+ round
56
+ ]);
57
+ const chosenIds = useMemo(()=>offers.filter((offer)=>chosen[offer.id]).map((offer)=>offer.id), [
58
+ offers,
59
+ chosen
60
+ ]);
61
+ const toggle = useCallback((id, value)=>{
62
+ setChosen((prior)=>_extends({}, prior, {
63
+ [id]: value
64
+ }));
65
+ }, []);
66
+ /** Asks again — after the checkout said an offer changed. */ const reload = useCallback(()=>setRound((value)=>value + 1), []);
67
+ return {
68
+ offers,
69
+ chosen,
70
+ chosenIds,
71
+ toggle,
72
+ reload
73
+ };
74
+ }
75
+ export function CartExtras(props) {
76
+ const { offers, chosen, onToggle, formatCents } = props;
77
+ if (!offers.length) return null;
78
+ return /*#__PURE__*/ _jsx(Box, {
79
+ sx: {
80
+ display: 'flex',
81
+ flexDirection: 'column',
82
+ gap: 0.5
83
+ },
84
+ children: offers.map((offer)=>{
85
+ var _offer_description;
86
+ return /*#__PURE__*/ _jsxs(Box, {
87
+ children: [
88
+ /*#__PURE__*/ _jsx(FormControlLabel, {
89
+ control: /*#__PURE__*/ _jsx(Checkbox, {
90
+ size: "small",
91
+ checked: Boolean(chosen[offer.id]),
92
+ onChange: (event)=>onToggle(offer.id, event.target.checked)
93
+ }),
94
+ label: /*#__PURE__*/ _jsx(Typography, {
95
+ variant: "body2",
96
+ children: `${offer.label} (${formatCents(offer.amountCents)})`
97
+ })
98
+ }),
99
+ offer.description || offer.termsUrl ? /*#__PURE__*/ _jsxs(Typography, {
100
+ variant: "caption",
101
+ color: "text.secondary",
102
+ component: "p",
103
+ sx: {
104
+ ml: 4
105
+ },
106
+ children: [
107
+ (_offer_description = offer.description) != null ? _offer_description : '',
108
+ offer.termsUrl ? /*#__PURE__*/ _jsxs(_Fragment, {
109
+ children: [
110
+ offer.description ? ' ' : '',
111
+ /*#__PURE__*/ _jsx(Link, {
112
+ href: offer.termsUrl,
113
+ target: "_blank",
114
+ rel: "noopener noreferrer",
115
+ children: 'Details'
116
+ })
117
+ ]
118
+ }) : null
119
+ ]
120
+ }) : null
121
+ ]
122
+ }, offer.id);
123
+ })
124
+ });
125
+ }
126
+
127
+ //# sourceMappingURL=cart-extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/cart-extras.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Box from '@mui/material/Box'\nimport Checkbox from '@mui/material/Checkbox'\nimport FormControlLabel from '@mui/material/FormControlLabel'\nimport Link from '@mui/material/Link'\nimport Typography from '@mui/material/Typography'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\n/**\n * Optional lines another plugin offers at the cart (AGL-3635), as boxes the\n * shopper ticks — package protection is the first. The offers come from\n * `GET /api/commerce/cart-extras`, asked only while the cart is on screen\n * and again whenever its lines change; the checkout asks the provider again\n * for the price it charges, so what is shown here is never what is trusted.\n * A store with no offering plugin gets an empty answer and draws nothing.\n */\n\nexport interface CartExtraOffer {\n id: string\n label: string\n description?: string\n amountCents: number\n defaultSelected: boolean\n termsUrl?: string\n}\n\nexport function useCartExtras(hostId: string | undefined, cartSignature: string) {\n const [offers, setOffers] = useState<CartExtraOffer[]>([])\n const [chosen, setChosen] = useState<Record<string, boolean>>({})\n const [round, setRound] = useState(0)\n useEffect(() => {\n if (!hostId || cartSignature === '[]') {\n setOffers([])\n return\n }\n let live = true\n fetch(`/api/commerce/cart-extras?hostId=${encodeURIComponent(hostId)}`)\n .then((response) => (response.ok ? response.json() : { extras: [] }))\n .then((payload: { extras?: CartExtraOffer[] }) => {\n if (!live) return\n const next = Array.isArray(payload?.extras) ? payload.extras : []\n setOffers(next)\n // A box the shopper already touched keeps their answer.\n setChosen((prior) =>\n Object.fromEntries(next.map((offer) => [offer.id, prior[offer.id] ?? offer.defaultSelected])),\n )\n })\n .catch(() => live && setOffers([]))\n return () => {\n live = false\n }\n }, [hostId, cartSignature, round])\n const chosenIds = useMemo(\n () => offers.filter((offer) => chosen[offer.id]).map((offer) => offer.id),\n [offers, chosen],\n )\n const toggle = useCallback((id: string, value: boolean) => {\n setChosen((prior) => ({ ...prior, [id]: value }))\n }, [])\n /** Asks again — after the checkout said an offer changed. */\n const reload = useCallback(() => setRound((value) => value + 1), [])\n return { offers, chosen, chosenIds, toggle, reload }\n}\n\nexport function CartExtras(props: {\n offers: CartExtraOffer[]\n chosen: Record<string, boolean>\n onToggle: (id: string, value: boolean) => void\n formatCents: (cents: number) => string\n}) {\n const { offers, chosen, onToggle, formatCents } = props\n if (!offers.length) return null\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>\n {offers.map((offer) => (\n <Box key={offer.id}>\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n checked={Boolean(chosen[offer.id])}\n onChange={(event) => onToggle(offer.id, event.target.checked)}\n />\n }\n label={\n <Typography variant=\"body2\">\n {`${offer.label} (${formatCents(offer.amountCents)})`}\n </Typography>\n }\n />\n {offer.description || offer.termsUrl ? (\n <Typography variant=\"caption\" color=\"text.secondary\" component=\"p\" sx={{ ml: 4 }}>\n {offer.description ?? ''}\n {offer.termsUrl ? (\n <>\n {offer.description ? ' ' : ''}\n <Link href={offer.termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {'Details'}\n </Link>\n </>\n ) : null}\n </Typography>\n ) : null}\n </Box>\n ))}\n </Box>\n )\n}\n"],"names":["Box","Checkbox","FormControlLabel","Link","Typography","useCallback","useEffect","useMemo","useState","useCartExtras","hostId","cartSignature","offers","setOffers","chosen","setChosen","round","setRound","live","fetch","encodeURIComponent","then","response","ok","json","extras","payload","next","Array","isArray","prior","Object","fromEntries","map","offer","id","defaultSelected","catch","chosenIds","filter","toggle","value","reload","CartExtras","props","onToggle","formatCents","length","sx","display","flexDirection","gap","control","size","checked","Boolean","onChange","event","target","label","variant","amountCents","description","termsUrl","color","component","ml","href","rel"],"mappings":"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"}