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

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 (266) hide show
  1. package/package.json +13 -13
  2. package/src/lib/components/cart-extras.d.ts +6 -0
  3. package/src/lib/components/cart-extras.js +4 -1
  4. package/src/lib/components/cart-extras.js.map +1 -1
  5. package/src/lib/components/cart-fulfillment.d.ts +117 -0
  6. package/src/lib/components/cart-fulfillment.js +367 -0
  7. package/src/lib/components/cart-fulfillment.js.map +1 -0
  8. package/src/lib/components/cart.js +52 -10
  9. package/src/lib/components/cart.js.map +1 -1
  10. package/src/lib/components/commerce-console-page.js +42 -1
  11. package/src/lib/components/commerce-console-page.js.map +1 -1
  12. package/src/lib/components/console/catalog-organization-card.component.js +1 -0
  13. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  14. package/src/lib/components/console/host-orders-card.component.js +42 -11
  15. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  16. package/src/lib/components/console/local-delivery-settings-card.component.d.ts +37 -0
  17. package/src/lib/components/console/local-delivery-settings-card.component.js +542 -0
  18. package/src/lib/components/console/local-delivery-settings-card.component.js.map +1 -0
  19. package/src/lib/components/console/locations-card.component.js +177 -3
  20. package/src/lib/components/console/locations-card.component.js.map +1 -1
  21. package/src/lib/components/console/order-detail-dialog.component.js +10 -0
  22. package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
  23. package/src/lib/components/console/order-local-fulfillment-panel.component.d.ts +44 -0
  24. package/src/lib/components/console/order-local-fulfillment-panel.component.js +265 -0
  25. package/src/lib/components/console/order-local-fulfillment-panel.component.js.map +1 -0
  26. package/src/lib/components/console/order-offline-notice.component.d.ts +12 -0
  27. package/src/lib/components/console/order-offline-notice.component.js +53 -0
  28. package/src/lib/components/console/order-offline-notice.component.js.map +1 -0
  29. package/src/lib/components/console/pickup-delivery-queue-card.component.d.ts +35 -0
  30. package/src/lib/components/console/pickup-delivery-queue-card.component.js +222 -0
  31. package/src/lib/components/console/pickup-delivery-queue-card.component.js.map +1 -0
  32. package/src/lib/components/console/pos/pos-api.d.ts +24 -1
  33. package/src/lib/components/console/pos/pos-api.js +13 -0
  34. package/src/lib/components/console/pos/pos-api.js.map +1 -1
  35. package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +12 -0
  36. package/src/lib/components/console/pos/pos-item-dialog.component.js +10 -8
  37. package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -1
  38. package/src/lib/components/console/pos/pos-kiosk-queue.component.d.ts +22 -0
  39. package/src/lib/components/console/pos/pos-kiosk-queue.component.js +168 -0
  40. package/src/lib/components/console/pos/pos-kiosk-queue.component.js.map +1 -0
  41. package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +18 -0
  42. package/src/lib/components/console/pos/pos-tender-dialogs.component.js +116 -1
  43. package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -1
  44. package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +8 -0
  45. package/src/lib/components/console/pos/pos-tender-panel.component.js +77 -18
  46. package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -1
  47. package/src/lib/components/console/pos/use-pos-display.d.ts +5 -2
  48. package/src/lib/components/console/pos/use-pos-display.js +3 -2
  49. package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
  50. package/src/lib/components/console/pos-devices-card.component.js +2 -2
  51. package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
  52. package/src/lib/components/console/pos-display/pairing-screen.d.ts +5 -2
  53. package/src/lib/components/console/pos-display/pairing-screen.js +7 -5
  54. package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -1
  55. package/src/lib/components/console/pos-display/pos-display-api.d.ts +7 -1
  56. package/src/lib/components/console/pos-display/pos-display-api.js +7 -2
  57. package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
  58. package/src/lib/components/console/pos-kiosk/kiosk-checkout.d.ts +41 -0
  59. package/src/lib/components/console/pos-kiosk/kiosk-checkout.js +275 -0
  60. package/src/lib/components/console/pos-kiosk/kiosk-checkout.js.map +1 -0
  61. package/src/lib/components/console/pos-kiosk/kiosk-menu.d.ts +32 -0
  62. package/src/lib/components/console/pos-kiosk/kiosk-menu.js +344 -0
  63. package/src/lib/components/console/pos-kiosk/kiosk-menu.js.map +1 -0
  64. package/src/lib/components/console/pos-kiosk/kiosk-staff.d.ts +12 -0
  65. package/src/lib/components/console/pos-kiosk/kiosk-staff.js +257 -0
  66. package/src/lib/components/console/pos-kiosk/kiosk-staff.js.map +1 -0
  67. package/src/lib/components/console/pos-kiosk/pos-kiosk-api.d.ts +114 -0
  68. package/src/lib/components/console/pos-kiosk/pos-kiosk-api.js +189 -0
  69. package/src/lib/components/console/pos-kiosk/pos-kiosk-api.js.map +1 -0
  70. package/src/lib/components/console/pos-kiosk/use-kiosk-idle.d.ts +16 -0
  71. package/src/lib/components/console/pos-kiosk/use-kiosk-idle.js +80 -0
  72. package/src/lib/components/console/pos-kiosk/use-kiosk-idle.js.map +1 -0
  73. package/src/lib/components/console/pos-kiosk-page.component.d.ts +28 -0
  74. package/src/lib/components/console/pos-kiosk-page.component.js +791 -0
  75. package/src/lib/components/console/pos-kiosk-page.component.js.map +1 -0
  76. package/src/lib/components/console/pos-offline/pos-offline-api.d.ts +44 -0
  77. package/src/lib/components/console/pos-offline/pos-offline-api.js +69 -0
  78. package/src/lib/components/console/pos-offline/pos-offline-api.js.map +1 -0
  79. package/src/lib/components/console/pos-offline/pos-offline-banner.component.d.ts +7 -0
  80. package/src/lib/components/console/pos-offline/pos-offline-banner.component.js +135 -0
  81. package/src/lib/components/console/pos-offline/pos-offline-banner.component.js.map +1 -0
  82. package/src/lib/components/console/pos-offline/pos-offline-checkout.component.d.ts +32 -0
  83. package/src/lib/components/console/pos-offline/pos-offline-checkout.component.js +287 -0
  84. package/src/lib/components/console/pos-offline/pos-offline-checkout.component.js.map +1 -0
  85. package/src/lib/components/console/pos-offline/pos-offline-store.d.ts +63 -0
  86. package/src/lib/components/console/pos-offline/pos-offline-store.js +145 -0
  87. package/src/lib/components/console/pos-offline/pos-offline-store.js.map +1 -0
  88. package/src/lib/components/console/pos-offline/register-offline.d.ts +24 -0
  89. package/src/lib/components/console/pos-offline/register-offline.js +24 -0
  90. package/src/lib/components/console/pos-offline/register-offline.js.map +1 -0
  91. package/src/lib/components/console/pos-offline/use-pos-offline.d.ts +85 -0
  92. package/src/lib/components/console/pos-offline/use-pos-offline.js +542 -0
  93. package/src/lib/components/console/pos-offline/use-pos-offline.js.map +1 -0
  94. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +72 -17
  95. package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -1
  96. package/src/lib/components/console/pos-page.component.js +228 -51
  97. package/src/lib/components/console/pos-page.component.js.map +1 -1
  98. package/src/lib/components/console/pos-zones.d.ts +23 -0
  99. package/src/lib/components/console/pos-zones.js +31 -0
  100. package/src/lib/components/console/pos-zones.js.map +1 -0
  101. package/src/lib/components/console/product-editor-dialog.component.js +10 -64
  102. package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
  103. package/src/lib/components/console/products-hub-card.component.js +46 -30
  104. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  105. package/src/lib/components/console/shipping-settings-card.component.js +1 -1
  106. package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
  107. package/src/lib/components/console/stock-movements-card.component.js +48 -16
  108. package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
  109. package/src/lib/components/console/store-zones.d.ts +8 -1
  110. package/src/lib/components/console/store-zones.js +11 -1
  111. package/src/lib/components/console/store-zones.js.map +1 -1
  112. package/src/lib/components/console/storefront-tax-summary-card.component.js +1 -0
  113. package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -1
  114. package/src/lib/components/order-status.js +66 -0
  115. package/src/lib/components/order-status.js.map +1 -1
  116. package/src/lib/components/product-detail.js +42 -15
  117. package/src/lib/components/product-detail.js.map +1 -1
  118. package/src/lib/constants/local-fulfillment-list-query.d.ts +48 -0
  119. package/src/lib/constants/local-fulfillment-list-query.js +84 -0
  120. package/src/lib/constants/local-fulfillment-list-query.js.map +1 -0
  121. package/src/lib/constants/orders-list-query.d.ts +7 -2
  122. package/src/lib/constants/orders-list-query.js +89 -8
  123. package/src/lib/constants/orders-list-query.js.map +1 -1
  124. package/src/lib/constants/pos-shift-list-query.d.ts +22 -0
  125. package/src/lib/constants/pos-shift-list-query.js +115 -0
  126. package/src/lib/constants/pos-shift-list-query.js.map +1 -0
  127. package/src/lib/constants/product-list-query.d.ts +6 -1
  128. package/src/lib/constants/product-list-query.js +77 -8
  129. package/src/lib/constants/product-list-query.js.map +1 -1
  130. package/src/lib/constants/stock-movement-query.d.ts +3 -2
  131. package/src/lib/constants/stock-movement-query.js +52 -8
  132. package/src/lib/constants/stock-movement-query.js.map +1 -1
  133. package/src/lib/declarations.server.js +21 -0
  134. package/src/lib/declarations.server.js.map +1 -1
  135. package/src/lib/model/buyer-notifications.d.ts +5 -3
  136. package/src/lib/model/buyer-notifications.js +25 -4
  137. package/src/lib/model/buyer-notifications.js.map +1 -1
  138. package/src/lib/model/commerce-orders.d.ts +103 -1
  139. package/src/lib/model/commerce-orders.js +2 -1
  140. package/src/lib/model/commerce-orders.js.map +1 -1
  141. package/src/lib/model/commerce-pos-kiosk.d.ts +175 -0
  142. package/src/lib/model/commerce-pos-kiosk.js +147 -0
  143. package/src/lib/model/commerce-pos-kiosk.js.map +1 -0
  144. package/src/lib/model/commerce-pos-offline.d.ts +234 -0
  145. package/src/lib/model/commerce-pos-offline.js +301 -0
  146. package/src/lib/model/commerce-pos-offline.js.map +1 -0
  147. package/src/lib/model/commerce-pos-ops.d.ts +16 -6
  148. package/src/lib/model/commerce-pos-ops.js +12 -4
  149. package/src/lib/model/commerce-pos-ops.js.map +1 -1
  150. package/src/lib/model/commerce-pos.d.ts +13 -1
  151. package/src/lib/model/commerce-pos.js +5 -4
  152. package/src/lib/model/commerce-pos.js.map +1 -1
  153. package/src/lib/model/commerce-stock-holds.d.ts +24 -3
  154. package/src/lib/model/commerce-stock-holds.js +26 -8
  155. package/src/lib/model/commerce-stock-holds.js.map +1 -1
  156. package/src/lib/model/commerce.d.ts +7 -1
  157. package/src/lib/model/commerce.js.map +1 -1
  158. package/src/lib/model/index.d.ts +5 -0
  159. package/src/lib/model/index.js +5 -0
  160. package/src/lib/model/index.js.map +1 -1
  161. package/src/lib/model/local-fulfillment-settings.d.ts +178 -0
  162. package/src/lib/model/local-fulfillment-settings.js +361 -0
  163. package/src/lib/model/local-fulfillment-settings.js.map +1 -0
  164. package/src/lib/model/order-list-fields.d.ts +10 -1
  165. package/src/lib/model/order-list-fields.js +1 -0
  166. package/src/lib/model/order-list-fields.js.map +1 -1
  167. package/src/lib/model/order-local-fulfillment.d.ts +131 -0
  168. package/src/lib/model/order-local-fulfillment.js +125 -0
  169. package/src/lib/model/order-local-fulfillment.js.map +1 -0
  170. package/src/lib/model/order-shipping-export.js +4 -0
  171. package/src/lib/model/order-shipping-export.js.map +1 -1
  172. package/src/lib/model/order-status-view.d.ts +20 -1
  173. package/src/lib/model/order-status-view.js +60 -6
  174. package/src/lib/model/order-status-view.js.map +1 -1
  175. package/src/lib/model/product-write.d.ts +186 -0
  176. package/src/lib/model/product-write.js +116 -0
  177. package/src/lib/model/product-write.js.map +1 -0
  178. package/src/lib/plugin-config.js +6 -2
  179. package/src/lib/plugin-config.js.map +1 -1
  180. package/src/lib/plugin.js +11 -0
  181. package/src/lib/plugin.js.map +1 -1
  182. package/src/lib/pos-kiosk-config.d.ts +26 -0
  183. package/src/lib/pos-kiosk-config.js +59 -0
  184. package/src/lib/pos-kiosk-config.js.map +1 -0
  185. package/src/lib/server/api-v1/openapi.js +8 -0
  186. package/src/lib/server/api-v1/openapi.js.map +1 -1
  187. package/src/lib/server/api-v1/order-view.d.ts +19 -0
  188. package/src/lib/server/api-v1/order-view.js +35 -0
  189. package/src/lib/server/api-v1/order-view.js.map +1 -1
  190. package/src/lib/server/billing-webhook.js +238 -87
  191. package/src/lib/server/billing-webhook.js.map +1 -1
  192. package/src/lib/server/cart-checkout.d.ts +2 -0
  193. package/src/lib/server/cart-checkout.js +173 -13
  194. package/src/lib/server/cart-checkout.js.map +1 -1
  195. package/src/lib/server/channel-order-updates.d.ts +50 -0
  196. package/src/lib/server/channel-order-updates.js +290 -0
  197. package/src/lib/server/channel-order-updates.js.map +1 -0
  198. package/src/lib/server/channel-orders.d.ts +85 -0
  199. package/src/lib/server/channel-orders.js +543 -0
  200. package/src/lib/server/channel-orders.js.map +1 -0
  201. package/src/lib/server/checkout-extras.js +18 -4
  202. package/src/lib/server/checkout-extras.js.map +1 -1
  203. package/src/lib/server/checkout.js +71 -14
  204. package/src/lib/server/checkout.js.map +1 -1
  205. package/src/lib/server/local-fulfillment-status.d.ts +86 -0
  206. package/src/lib/server/local-fulfillment-status.js +379 -0
  207. package/src/lib/server/local-fulfillment-status.js.map +1 -0
  208. package/src/lib/server/local-fulfillment.d.ts +190 -0
  209. package/src/lib/server/local-fulfillment.js +580 -0
  210. package/src/lib/server/local-fulfillment.js.map +1 -0
  211. package/src/lib/server/membership-register.js +3 -1
  212. package/src/lib/server/membership-register.js.map +1 -1
  213. package/src/lib/server/order-notifications.js +61 -0
  214. package/src/lib/server/order-notifications.js.map +1 -1
  215. package/src/lib/server/pos-display.d.ts +27 -1
  216. package/src/lib/server/pos-display.js +50 -9
  217. package/src/lib/server/pos-display.js.map +1 -1
  218. package/src/lib/server/pos-kiosk-principal.d.ts +29 -0
  219. package/src/lib/server/pos-kiosk-principal.js +42 -0
  220. package/src/lib/server/pos-kiosk-principal.js.map +1 -0
  221. package/src/lib/server/pos-kiosk.d.ts +54 -0
  222. package/src/lib/server/pos-kiosk.js +972 -0
  223. package/src/lib/server/pos-kiosk.js.map +1 -0
  224. package/src/lib/server/pos-offline-sync.d.ts +85 -0
  225. package/src/lib/server/pos-offline-sync.js +765 -0
  226. package/src/lib/server/pos-offline-sync.js.map +1 -0
  227. package/src/lib/server/pos-order.js +22 -4
  228. package/src/lib/server/pos-order.js.map +1 -1
  229. package/src/lib/server/pos-payment.d.ts +6 -0
  230. package/src/lib/server/pos-payment.js +225 -6
  231. package/src/lib/server/pos-payment.js.map +1 -1
  232. package/src/lib/server/pos-print.js +5 -0
  233. package/src/lib/server/pos-print.js.map +1 -1
  234. package/src/lib/server/pos-return.js +27 -0
  235. package/src/lib/server/pos-return.js.map +1 -1
  236. package/src/lib/server/pos-sale.d.ts +6 -0
  237. package/src/lib/server/pos-sale.js +2 -0
  238. package/src/lib/server/pos-sale.js.map +1 -1
  239. package/src/lib/server/pos-shift.js +8 -1
  240. package/src/lib/server/pos-shift.js.map +1 -1
  241. package/src/lib/server/product-catalog.js +5 -1
  242. package/src/lib/server/product-catalog.js.map +1 -1
  243. package/src/lib/server/product-drafts.d.ts +5 -1
  244. package/src/lib/server/product-drafts.js +3 -3
  245. package/src/lib/server/product-drafts.js.map +1 -1
  246. package/src/lib/server/product-writer.d.ts +19 -0
  247. package/src/lib/server/product-writer.js +261 -0
  248. package/src/lib/server/product-writer.js.map +1 -0
  249. package/src/lib/server/products-write.d.ts +61 -0
  250. package/src/lib/server/products-write.js +375 -0
  251. package/src/lib/server/products-write.js.map +1 -0
  252. package/src/lib/server/refund.js +3 -0
  253. package/src/lib/server/refund.js.map +1 -1
  254. package/src/lib/server/stock-hold.d.ts +9 -1
  255. package/src/lib/server/stock-hold.js +15 -7
  256. package/src/lib/server/stock-hold.js.map +1 -1
  257. package/src/lib/server.js +21 -0
  258. package/src/lib/server.js.map +1 -1
  259. package/src/lib/tenant-emails.js +161 -0
  260. package/src/lib/tenant-emails.js.map +1 -1
  261. package/src/lib/testing/memory-firestore.d.ts +16 -3
  262. package/src/lib/testing/memory-firestore.js +11 -3
  263. package/src/lib/testing/memory-firestore.js.map +1 -1
  264. package/src/lib/transfer/products.server.d.ts +5 -0
  265. package/src/lib/transfer/products.server.js +2 -2
  266. package/src/lib/transfer/products.server.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-kiosk/kiosk-staff.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 Alert from '@mui/material/Alert'\nimport Button from '@mui/material/Button'\nimport Dialog from '@mui/material/Dialog'\nimport DialogActions from '@mui/material/DialogActions'\nimport DialogContent from '@mui/material/DialogContent'\nimport DialogContentText from '@mui/material/DialogContentText'\nimport DialogTitle from '@mui/material/DialogTitle'\nimport MenuItem from '@mui/material/MenuItem'\nimport Stack from '@mui/material/Stack'\nimport TextField from '@mui/material/TextField'\nimport { type FormEvent, useEffect, useState } from 'react'\nimport { kioskApi, type PosKioskSettingsView } from './pos-kiosk-api'\n\n/**\n * Staff unlock (AGL-3623): a corner button, then the staff PIN the register\n * uses, checked on the server. No names are listed — the screen faces the\n * public — and a right PIN opens the kiosk's settings for a few minutes:\n * which card reader it sends payments to, and leaving kiosk mode.\n */\nexport function KioskStaffControl({\n token,\n onExit,\n onUnauthorized,\n}: {\n token: string\n /** Kiosk mode was left: the device is unpaired. */\n onExit: () => void\n onUnauthorized: () => void\n}) {\n const [stage, setStage] = useState<'closed' | 'pin' | 'settings'>('closed')\n const [pin, setPin] = useState('')\n const [unlock, setUnlock] = useState<{ unlock: string; expiresAtMs: number } | null>(null)\n const [view, setView] = useState<PosKioskSettingsView | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [confirmExit, setConfirmExit] = useState(false)\n\n const close = () => {\n setStage('closed')\n setPin('')\n setUnlock(null)\n setView(null)\n setError(null)\n setConfirmExit(false)\n }\n\n // The unlock lapses on its own: the settings close with it.\n useEffect(() => {\n if (!unlock) return undefined\n const timer = setTimeout(close, Math.max(0, unlock.expiresAtMs - Date.now()))\n return () => clearTimeout(timer)\n }, [unlock])\n\n const submitPin = async (event: FormEvent) => {\n event.preventDefault()\n if (busy || pin.length < 4) return\n setBusy(true)\n setError(null)\n const result = await kioskApi.unlock(token, pin)\n setPin('')\n if (!result.ok || !result.value) {\n setBusy(false)\n if (result.status === 401 && /not paired/i.test(result.error ?? '')) return onUnauthorized()\n setError(result.error ?? 'That PIN is not right.')\n return\n }\n const opened = await kioskApi.settings(token, result.value.unlock)\n setBusy(false)\n setUnlock(result.value)\n setView(opened.value ?? null)\n setStage('settings')\n }\n\n const chooseReader = async (readerId: string) => {\n if (!unlock) return\n setBusy(true)\n const result = await kioskApi.setReader(token, unlock.unlock, readerId)\n setBusy(false)\n if (result.ok && result.value) setView(result.value)\n else setError(result.error ?? 'The card reader could not be changed.')\n }\n\n const exit = async () => {\n if (!unlock) return\n setBusy(true)\n const result = await kioskApi.exit(token, unlock.unlock)\n setBusy(false)\n if (!result.ok) {\n setError(result.error ?? 'Kiosk mode could not be turned off.')\n return\n }\n close()\n onExit()\n }\n\n return (\n <>\n <Button\n size=\"small\"\n color=\"inherit\"\n onClick={() => setStage('pin')}\n sx={(theme) => ({ position: 'fixed', left: theme.spacing(1), top: theme.spacing(1), opacity: 0.4 })}\n >\n {'Staff'}\n </Button>\n <Dialog open={stage === 'pin'} onClose={() => (busy ? undefined : close())} maxWidth=\"xs\" fullWidth>\n <form onSubmit={submitPin}>\n <DialogTitle>{'Staff unlock'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <DialogContentText>{'Enter your register PIN.'}</DialogContentText>\n <TextField\n value={pin}\n onChange={(event) => setPin(event.target.value.replace(/\\D/g, '').slice(0, 6))}\n type=\"password\"\n autoFocus\n autoComplete=\"off\"\n slotProps={{ htmlInput: { inputMode: 'numeric', pattern: '[0-9]*', maxLength: 6, 'aria-label': 'Staff PIN' } }}\n />\n {error ? <Alert severity=\"error\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={close} disabled={busy}>\n {'Cancel'}\n </Button>\n <Button type=\"submit\" variant=\"contained\" disabled={busy || pin.length < 4}>\n {busy ? 'Checking…' : 'Unlock'}\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n <Dialog open={stage === 'settings'} onClose={() => (busy ? undefined : close())} maxWidth=\"xs\" fullWidth>\n <DialogTitle>{view?.label || 'Kiosk settings'}</DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n {view && view.readers.length > 0 ? (\n <TextField\n select\n label=\"Card reader\"\n value={view.readerId ?? ''}\n disabled={busy}\n onChange={(event) => void chooseReader(event.target.value)}\n >\n <MenuItem value=\"\">{'None — pay at counter only'}</MenuItem>\n {view.readers.map((reader) => (\n <MenuItem key={reader.id} value={reader.id}>\n {`${reader.label} (${reader.status})`}\n </MenuItem>\n ))}\n </TextField>\n ) : (\n <DialogContentText>{'No card reader is assigned to this register.'}</DialogContentText>\n )}\n {confirmExit ? (\n <Alert severity=\"warning\">\n {'This unpairs the kiosk. To use it again, show a new kiosk code on the register.'}\n </Alert>\n ) : null}\n {error ? <Alert severity=\"error\">{error}</Alert> : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n {confirmExit ? (\n <Button color=\"error\" variant=\"contained\" disabled={busy} onClick={() => void exit()}>\n {'Exit kiosk mode'}\n </Button>\n ) : (\n <Button color=\"error\" disabled={busy} onClick={() => setConfirmExit(true)}>\n {'Exit kiosk mode'}\n </Button>\n )}\n <Button onClick={() => window.location.reload()} disabled={busy}>\n {'Reload'}\n </Button>\n <Button variant=\"contained\" onClick={close} disabled={busy}>\n {'Done'}\n </Button>\n </DialogActions>\n </Dialog>\n </>\n )\n}\n"],"names":["Alert","Button","Dialog","DialogActions","DialogContent","DialogContentText","DialogTitle","MenuItem","Stack","TextField","useEffect","useState","kioskApi","KioskStaffControl","token","onExit","onUnauthorized","view","stage","setStage","pin","setPin","unlock","setUnlock","setView","error","setError","busy","setBusy","confirmExit","setConfirmExit","close","undefined","timer","setTimeout","Math","max","expiresAtMs","Date","now","clearTimeout","submitPin","event","opened","preventDefault","length","result","ok","value","status","test","settings","chooseReader","readerId","setReader","exit","size","color","onClick","sx","theme","position","left","spacing","top","opacity","open","onClose","maxWidth","fullWidth","form","onSubmit","pt","onChange","target","replace","slice","type","autoFocus","autoComplete","slotProps","htmlInput","inputMode","pattern","maxLength","severity","disabled","variant","label","readers","select","map","reader","id","window","location","reload"],"mappings":"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"}
@@ -0,0 +1,114 @@
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
+ import type * as CommerceModel from '../../../model';
18
+ /**
19
+ * The self-service kiosk's half of `/api/commerce/pos-kiosk` (AGL-3623).
20
+ *
21
+ * Every call carries the kiosk's device token — the customer display's
22
+ * header, because a kiosk is paired exactly like one — and never a staff
23
+ * session. 401 means the kiosk was unpaired (or its register removed), which
24
+ * the page reads as "pair again".
25
+ */
26
+ export declare const POS_KIOSK_ENDPOINT = "/api/commerce/pos-kiosk";
27
+ /**
28
+ * Where the kiosk's token lives on the device: the ONE thing it stores.
29
+ * Nothing a customer chooses or types is ever written to storage.
30
+ */
31
+ export declare const POS_KIOSK_TOKEN_KEY = "aglyn.posKioskToken";
32
+ export interface PosKioskResult<T> {
33
+ ok: boolean;
34
+ /** The HTTP status, or 0 when the request never landed. */
35
+ status: number;
36
+ value?: T;
37
+ error?: string;
38
+ }
39
+ export declare function readKioskToken(): string | null;
40
+ export declare function storeKioskToken(token: string | null): void;
41
+ /** Every key the kiosk could own on this origin starts with this. */
42
+ export declare const POS_KIOSK_STORAGE_PREFIX = "aglyn.posKiosk";
43
+ /**
44
+ * The idle reset's storage sweep: every kiosk key in local and session
45
+ * storage but the device token. The kiosk keeps a customer's cart, email and
46
+ * phone in memory only, so on a working kiosk this finds nothing; it is the
47
+ * guarantee that nothing a customer chose outlives their turn should a later
48
+ * change ever persist some of it. Other pages' keys on the console origin
49
+ * are not the kiosk's to touch.
50
+ */
51
+ export declare function clearKioskCustomerStorage(): void;
52
+ export declare const kioskApi: {
53
+ context: (token: string) => Promise<PosKioskResult<CommerceModel.PosKioskContext>>;
54
+ catalog: (token: string, categoryId: string | null) => Promise<PosKioskResult<CommerceModel.PosKioskCatalog>>;
55
+ sale: (token: string, orderId: string) => Promise<PosKioskResult<{
56
+ sale: CommerceModel.PosKioskSale;
57
+ }>>;
58
+ checkout: (token: string, lines: CommerceModel.PosKioskLine[], attemptKey: string) => Promise<PosKioskResult<{
59
+ sale: CommerceModel.PosKioskSale;
60
+ }>>;
61
+ pay: (token: string, input: {
62
+ orderId: string;
63
+ method: "reader" | "tap";
64
+ tipChoice: "percent" | "custom" | "none";
65
+ tipPercent?: number;
66
+ tipCents?: number;
67
+ }, attemptKey: string) => Promise<PosKioskResult<{
68
+ sale: CommerceModel.PosKioskSale;
69
+ paymentId?: string;
70
+ clientSecret?: string;
71
+ paymentIntentId?: string;
72
+ }>>;
73
+ paymentStatus: (token: string, orderId: string, paymentId: string) => Promise<PosKioskResult<{
74
+ sale: CommerceModel.PosKioskSale;
75
+ }>>;
76
+ cancelPayment: (token: string, orderId: string, paymentId: string) => Promise<PosKioskResult<{
77
+ sale: CommerceModel.PosKioskSale;
78
+ }>>;
79
+ simulate: (token: string, orderId: string, paymentId: string) => Promise<PosKioskResult<{
80
+ sale: CommerceModel.PosKioskSale;
81
+ }>>;
82
+ counter: (token: string, orderId: string) => Promise<PosKioskResult<{
83
+ sale: CommerceModel.PosKioskSale;
84
+ }>>;
85
+ receipt: (token: string, input: {
86
+ orderId: string;
87
+ channel: CommerceModel.PosReceiptChannel;
88
+ to?: string;
89
+ marketingOptIn?: boolean;
90
+ }) => Promise<PosKioskResult<{
91
+ ok: true;
92
+ }>>;
93
+ abandon: (token: string, orderId: string) => Promise<PosKioskResult<{
94
+ sale: CommerceModel.PosKioskSale;
95
+ }>>;
96
+ unlock: (token: string, pin: string) => Promise<PosKioskResult<{
97
+ unlock: string;
98
+ expiresAtMs: number;
99
+ }>>;
100
+ settings: (token: string, unlock: string) => Promise<PosKioskResult<PosKioskSettingsView>>;
101
+ setReader: (token: string, unlock: string, readerId: string) => Promise<PosKioskResult<PosKioskSettingsView>>;
102
+ exit: (token: string, unlock: string) => Promise<PosKioskResult<{
103
+ ok: true;
104
+ }>>;
105
+ };
106
+ export interface PosKioskSettingsView {
107
+ readers: Array<{
108
+ id: string;
109
+ label: string;
110
+ status: string;
111
+ }>;
112
+ readerId: string | null;
113
+ label: string;
114
+ }
@@ -0,0 +1,189 @@
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
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
17
+ import { POS_DISPLAY_TOKEN_HEADER } from "../pos-display/pos-display-api.js";
18
+ /**
19
+ * The self-service kiosk's half of `/api/commerce/pos-kiosk` (AGL-3623).
20
+ *
21
+ * Every call carries the kiosk's device token — the customer display's
22
+ * header, because a kiosk is paired exactly like one — and never a staff
23
+ * session. 401 means the kiosk was unpaired (or its register removed), which
24
+ * the page reads as "pair again".
25
+ */ export const POS_KIOSK_ENDPOINT = '/api/commerce/pos-kiosk';
26
+ /**
27
+ * Where the kiosk's token lives on the device: the ONE thing it stores.
28
+ * Nothing a customer chooses or types is ever written to storage.
29
+ */ export const POS_KIOSK_TOKEN_KEY = 'aglyn.posKioskToken';
30
+ export function readKioskToken() {
31
+ try {
32
+ return window.localStorage.getItem(POS_KIOSK_TOKEN_KEY) || null;
33
+ } catch (unused) {
34
+ return null;
35
+ }
36
+ }
37
+ export function storeKioskToken(token) {
38
+ try {
39
+ if (token) window.localStorage.setItem(POS_KIOSK_TOKEN_KEY, token);
40
+ else window.localStorage.removeItem(POS_KIOSK_TOKEN_KEY);
41
+ } catch (unused) {
42
+ // Storage blocked: the kiosk works until it reloads, then asks for a code.
43
+ }
44
+ }
45
+ /** Every key the kiosk could own on this origin starts with this. */ export const POS_KIOSK_STORAGE_PREFIX = 'aglyn.posKiosk';
46
+ /**
47
+ * The idle reset's storage sweep: every kiosk key in local and session
48
+ * storage but the device token. The kiosk keeps a customer's cart, email and
49
+ * phone in memory only, so on a working kiosk this finds nothing; it is the
50
+ * guarantee that nothing a customer chose outlives their turn should a later
51
+ * change ever persist some of it. Other pages' keys on the console origin
52
+ * are not the kiosk's to touch.
53
+ */ export function clearKioskCustomerStorage() {
54
+ for (const pick of [
55
+ ()=>window.localStorage,
56
+ ()=>window.sessionStorage
57
+ ]){
58
+ try {
59
+ const storage = pick();
60
+ const keys = [];
61
+ for(let index = 0; index < storage.length; index++){
62
+ const key = storage.key(index);
63
+ if (key && key.startsWith(POS_KIOSK_STORAGE_PREFIX) && key !== POS_KIOSK_TOKEN_KEY) keys.push(key);
64
+ }
65
+ for (const key of keys)storage.removeItem(key);
66
+ } catch (unused) {
67
+ // Blocked storage holds nothing to clear.
68
+ }
69
+ }
70
+ }
71
+ async function call(token, init) {
72
+ const headers = {
73
+ [POS_DISPLAY_TOKEN_HEADER]: token
74
+ };
75
+ if (init.method === 'POST') {
76
+ headers['Content-Type'] = 'application/json';
77
+ if (init.attemptKey) headers['Idempotency-Key'] = init.attemptKey;
78
+ }
79
+ try {
80
+ const response = await fetch(init.method === 'GET' ? `${POS_KIOSK_ENDPOINT}?${new URLSearchParams(init.query).toString()}` : POS_KIOSK_ENDPOINT, _extends({
81
+ method: init.method,
82
+ headers,
83
+ cache: 'no-store'
84
+ }, init.method === 'POST' ? {
85
+ body: JSON.stringify(init.body)
86
+ } : {}));
87
+ const payload = await response.json().catch(()=>null);
88
+ if (!response.ok) {
89
+ var _ref;
90
+ return {
91
+ ok: false,
92
+ status: response.status,
93
+ error: String((_ref = payload == null ? void 0 : payload['error']) != null ? _ref : 'Something went wrong. Try again.')
94
+ };
95
+ }
96
+ return {
97
+ ok: true,
98
+ status: response.status,
99
+ value: payload != null ? payload : {}
100
+ };
101
+ } catch (unused) {
102
+ return {
103
+ ok: false,
104
+ status: 0,
105
+ error: 'No connection. Try again.'
106
+ };
107
+ }
108
+ }
109
+ const post = (token, body, attemptKey)=>call(token, _extends({
110
+ method: 'POST',
111
+ body
112
+ }, attemptKey ? {
113
+ attemptKey
114
+ } : {}));
115
+ export const kioskApi = {
116
+ context: (token)=>call(token, {
117
+ method: 'GET',
118
+ query: {
119
+ action: 'context'
120
+ }
121
+ }),
122
+ catalog: (token, categoryId)=>call(token, {
123
+ method: 'GET',
124
+ query: _extends({
125
+ action: 'catalog'
126
+ }, categoryId ? {
127
+ categoryId
128
+ } : {})
129
+ }),
130
+ sale: (token, orderId)=>call(token, {
131
+ method: 'GET',
132
+ query: {
133
+ action: 'sale',
134
+ orderId
135
+ }
136
+ }),
137
+ checkout: (token, lines, attemptKey)=>post(token, {
138
+ action: 'checkout',
139
+ lines
140
+ }, attemptKey),
141
+ pay: (token, input, attemptKey)=>post(token, _extends({
142
+ action: 'pay'
143
+ }, input), attemptKey),
144
+ paymentStatus: (token, orderId, paymentId)=>post(token, {
145
+ action: 'payment-status',
146
+ orderId,
147
+ paymentId
148
+ }),
149
+ cancelPayment: (token, orderId, paymentId)=>post(token, {
150
+ action: 'cancel-payment',
151
+ orderId,
152
+ paymentId
153
+ }),
154
+ simulate: (token, orderId, paymentId)=>post(token, {
155
+ action: 'simulate',
156
+ orderId,
157
+ paymentId
158
+ }),
159
+ counter: (token, orderId)=>post(token, {
160
+ action: 'counter',
161
+ orderId
162
+ }),
163
+ receipt: (token, input)=>post(token, _extends({
164
+ action: 'receipt'
165
+ }, input)),
166
+ abandon: (token, orderId)=>post(token, {
167
+ action: 'abandon',
168
+ orderId
169
+ }),
170
+ unlock: (token, pin)=>post(token, {
171
+ action: 'unlock',
172
+ pin
173
+ }),
174
+ settings: (token, unlock)=>post(token, {
175
+ action: 'settings',
176
+ unlock
177
+ }),
178
+ setReader: (token, unlock, readerId)=>post(token, {
179
+ action: 'set-reader',
180
+ unlock,
181
+ readerId
182
+ }),
183
+ exit: (token, unlock)=>post(token, {
184
+ action: 'exit',
185
+ unlock
186
+ })
187
+ };
188
+
189
+ //# sourceMappingURL=pos-kiosk-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-kiosk/pos-kiosk-api.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\nimport type * as CommerceModel from '../../../model'\nimport { POS_DISPLAY_TOKEN_HEADER } from '../pos-display/pos-display-api'\n\n/**\n * The self-service kiosk's half of `/api/commerce/pos-kiosk` (AGL-3623).\n *\n * Every call carries the kiosk's device token — the customer display's\n * header, because a kiosk is paired exactly like one — and never a staff\n * session. 401 means the kiosk was unpaired (or its register removed), which\n * the page reads as \"pair again\".\n */\nexport const POS_KIOSK_ENDPOINT = '/api/commerce/pos-kiosk'\n\n/**\n * Where the kiosk's token lives on the device: the ONE thing it stores.\n * Nothing a customer chooses or types is ever written to storage.\n */\nexport const POS_KIOSK_TOKEN_KEY = 'aglyn.posKioskToken'\n\nexport interface PosKioskResult<T> {\n ok: boolean\n /** The HTTP status, or 0 when the request never landed. */\n status: number\n value?: T\n error?: string\n}\n\nexport function readKioskToken(): string | null {\n try {\n return window.localStorage.getItem(POS_KIOSK_TOKEN_KEY) || null\n } catch {\n return null\n }\n}\n\nexport function storeKioskToken(token: string | null): void {\n try {\n if (token) window.localStorage.setItem(POS_KIOSK_TOKEN_KEY, token)\n else window.localStorage.removeItem(POS_KIOSK_TOKEN_KEY)\n } catch {\n // Storage blocked: the kiosk works until it reloads, then asks for a code.\n }\n}\n\n/** Every key the kiosk could own on this origin starts with this. */\nexport const POS_KIOSK_STORAGE_PREFIX = 'aglyn.posKiosk'\n\n/**\n * The idle reset's storage sweep: every kiosk key in local and session\n * storage but the device token. The kiosk keeps a customer's cart, email and\n * phone in memory only, so on a working kiosk this finds nothing; it is the\n * guarantee that nothing a customer chose outlives their turn should a later\n * change ever persist some of it. Other pages' keys on the console origin\n * are not the kiosk's to touch.\n */\nexport function clearKioskCustomerStorage(): void {\n for (const pick of [() => window.localStorage, () => window.sessionStorage]) {\n try {\n const storage = pick()\n const keys: string[] = []\n for (let index = 0; index < storage.length; index++) {\n const key = storage.key(index)\n if (key && key.startsWith(POS_KIOSK_STORAGE_PREFIX) && key !== POS_KIOSK_TOKEN_KEY) keys.push(key)\n }\n for (const key of keys) storage.removeItem(key)\n } catch {\n // Blocked storage holds nothing to clear.\n }\n }\n}\n\nasync function call<T>(\n token: string,\n init: { method: 'GET'; query: Record<string, string> } | { method: 'POST'; body: Record<string, unknown>; attemptKey?: string },\n): Promise<PosKioskResult<T>> {\n const headers: Record<string, string> = { [POS_DISPLAY_TOKEN_HEADER]: token }\n if (init.method === 'POST') {\n headers['Content-Type'] = 'application/json'\n if (init.attemptKey) headers['Idempotency-Key'] = init.attemptKey\n }\n try {\n const response = await fetch(\n init.method === 'GET'\n ? `${POS_KIOSK_ENDPOINT}?${new URLSearchParams(init.query).toString()}`\n : POS_KIOSK_ENDPOINT,\n {\n method: init.method,\n headers,\n cache: 'no-store',\n ...(init.method === 'POST' ? { body: JSON.stringify(init.body) } : {}),\n },\n )\n const payload = (await response.json().catch(() => null)) as Record<string, unknown> | null\n if (!response.ok) {\n return {\n ok: false,\n status: response.status,\n error: String(payload?.['error'] ?? 'Something went wrong. Try again.'),\n }\n }\n return { ok: true, status: response.status, value: (payload ?? {}) as T }\n } catch {\n return { ok: false, status: 0, error: 'No connection. Try again.' }\n }\n}\n\nconst post = <T>(token: string, body: Record<string, unknown>, attemptKey?: string) =>\n call<T>(token, { method: 'POST', body, ...(attemptKey ? { attemptKey } : {}) })\n\nexport const kioskApi = {\n context: (token: string) => call<CommerceModel.PosKioskContext>(token, { method: 'GET', query: { action: 'context' } }),\n catalog: (token: string, categoryId: string | null) =>\n call<CommerceModel.PosKioskCatalog>(token, {\n method: 'GET',\n query: { action: 'catalog', ...(categoryId ? { categoryId } : {}) },\n }),\n sale: (token: string, orderId: string) =>\n call<{ sale: CommerceModel.PosKioskSale }>(token, { method: 'GET', query: { action: 'sale', orderId } }),\n checkout: (token: string, lines: CommerceModel.PosKioskLine[], attemptKey: string) =>\n post<{ sale: CommerceModel.PosKioskSale }>(token, { action: 'checkout', lines }, attemptKey),\n pay: (\n token: string,\n input: {\n orderId: string\n method: 'reader' | 'tap'\n tipChoice: 'percent' | 'custom' | 'none'\n tipPercent?: number\n tipCents?: number\n },\n attemptKey: string,\n ) =>\n post<{ sale: CommerceModel.PosKioskSale; paymentId?: string; clientSecret?: string; paymentIntentId?: string }>(\n token,\n { action: 'pay', ...input },\n attemptKey,\n ),\n paymentStatus: (token: string, orderId: string, paymentId: string) =>\n post<{ sale: CommerceModel.PosKioskSale }>(token, { action: 'payment-status', orderId, paymentId }),\n cancelPayment: (token: string, orderId: string, paymentId: string) =>\n post<{ sale: CommerceModel.PosKioskSale }>(token, { action: 'cancel-payment', orderId, paymentId }),\n simulate: (token: string, orderId: string, paymentId: string) =>\n post<{ sale: CommerceModel.PosKioskSale }>(token, { action: 'simulate', orderId, paymentId }),\n counter: (token: string, orderId: string) =>\n post<{ sale: CommerceModel.PosKioskSale }>(token, { action: 'counter', orderId }),\n receipt: (\n token: string,\n input: { orderId: string; channel: CommerceModel.PosReceiptChannel; to?: string; marketingOptIn?: boolean },\n ) => post<{ ok: true }>(token, { action: 'receipt', ...input }),\n abandon: (token: string, orderId: string) =>\n post<{ sale: CommerceModel.PosKioskSale }>(token, { action: 'abandon', orderId }),\n unlock: (token: string, pin: string) => post<{ unlock: string; expiresAtMs: number }>(token, { action: 'unlock', pin }),\n settings: (token: string, unlock: string) =>\n post<PosKioskSettingsView>(token, { action: 'settings', unlock }),\n setReader: (token: string, unlock: string, readerId: string) =>\n post<PosKioskSettingsView>(token, { action: 'set-reader', unlock, readerId }),\n exit: (token: string, unlock: string) => post<{ ok: true }>(token, { action: 'exit', unlock }),\n}\n\nexport interface PosKioskSettingsView {\n readers: Array<{ id: string; label: string; status: string }>\n readerId: string | null\n label: string\n}\n"],"names":["POS_DISPLAY_TOKEN_HEADER","POS_KIOSK_ENDPOINT","POS_KIOSK_TOKEN_KEY","readKioskToken","window","localStorage","getItem","storeKioskToken","token","setItem","removeItem","POS_KIOSK_STORAGE_PREFIX","clearKioskCustomerStorage","pick","sessionStorage","storage","keys","index","length","key","startsWith","push","call","init","headers","method","attemptKey","response","fetch","URLSearchParams","query","toString","cache","body","JSON","stringify","payload","json","catch","ok","status","error","String","value","post","kioskApi","context","action","catalog","categoryId","sale","orderId","checkout","lines","pay","input","paymentStatus","paymentId","cancelPayment","simulate","counter","receipt","abandon","unlock","pin","settings","setReader","readerId","exit"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The kiosk's idle clock (AGL-3623). While `active`, every touch, click or
3
+ * key restarts it; after `idleSeconds` of nothing it starts a visible
4
+ * `warningSeconds` countdown ("Still there?"), and when that runs out it
5
+ * calls `onExpire` — the page's reset, which clears the cart and anything
6
+ * the customer typed. A touch during the countdown cancels it.
7
+ */
8
+ export declare function useKioskIdle(options: {
9
+ active: boolean;
10
+ idleSeconds: number;
11
+ warningSeconds: number;
12
+ onExpire: () => void;
13
+ }): {
14
+ warning: number | null;
15
+ stillHere: () => void;
16
+ };
@@ -0,0 +1,80 @@
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 { useCallback, useEffect, useRef, useState } from "react";
18
+ /**
19
+ * The kiosk's idle clock (AGL-3623). While `active`, every touch, click or
20
+ * key restarts it; after `idleSeconds` of nothing it starts a visible
21
+ * `warningSeconds` countdown ("Still there?"), and when that runs out it
22
+ * calls `onExpire` — the page's reset, which clears the cart and anything
23
+ * the customer typed. A touch during the countdown cancels it.
24
+ */ export function useKioskIdle(options) {
25
+ const { active, idleSeconds, warningSeconds } = options;
26
+ const [warning, setWarning] = useState(null);
27
+ const lastTouch = useRef(Date.now());
28
+ const expire = useRef(options.onExpire);
29
+ expire.current = options.onExpire;
30
+ const stillHere = useCallback(()=>{
31
+ lastTouch.current = Date.now();
32
+ setWarning(null);
33
+ }, []);
34
+ useEffect(()=>{
35
+ if (!active) {
36
+ setWarning(null);
37
+ return undefined;
38
+ }
39
+ lastTouch.current = Date.now();
40
+ const touched = ()=>{
41
+ lastTouch.current = Date.now();
42
+ setWarning((current)=>current === null ? current : null);
43
+ };
44
+ const events = [
45
+ 'pointerdown',
46
+ 'keydown',
47
+ 'touchstart',
48
+ 'wheel'
49
+ ];
50
+ for (const event of events)window.addEventListener(event, touched, {
51
+ passive: true
52
+ });
53
+ const timer = setInterval(()=>{
54
+ const idleFor = (Date.now() - lastTouch.current) / 1000;
55
+ if (idleFor < idleSeconds) return;
56
+ const left = Math.ceil(idleSeconds + warningSeconds - idleFor);
57
+ if (left <= 0) {
58
+ lastTouch.current = Date.now();
59
+ setWarning(null);
60
+ expire.current();
61
+ return;
62
+ }
63
+ setWarning(left);
64
+ }, 1000);
65
+ return ()=>{
66
+ clearInterval(timer);
67
+ for (const event of events)window.removeEventListener(event, touched);
68
+ };
69
+ }, [
70
+ active,
71
+ idleSeconds,
72
+ warningSeconds
73
+ ]);
74
+ return {
75
+ warning,
76
+ stillHere
77
+ };
78
+ }
79
+
80
+ //# sourceMappingURL=use-kiosk-idle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-kiosk/use-kiosk-idle.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 { useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * The kiosk's idle clock (AGL-3623). While `active`, every touch, click or\n * key restarts it; after `idleSeconds` of nothing it starts a visible\n * `warningSeconds` countdown (\"Still there?\"), and when that runs out it\n * calls `onExpire` — the page's reset, which clears the cart and anything\n * the customer typed. A touch during the countdown cancels it.\n */\nexport function useKioskIdle(options: {\n active: boolean\n idleSeconds: number\n warningSeconds: number\n onExpire: () => void\n}): { warning: number | null; stillHere: () => void } {\n const { active, idleSeconds, warningSeconds } = options\n const [warning, setWarning] = useState<number | null>(null)\n const lastTouch = useRef(Date.now())\n const expire = useRef(options.onExpire)\n expire.current = options.onExpire\n\n const stillHere = useCallback(() => {\n lastTouch.current = Date.now()\n setWarning(null)\n }, [])\n\n useEffect(() => {\n if (!active) {\n setWarning(null)\n return undefined\n }\n lastTouch.current = Date.now()\n const touched = () => {\n lastTouch.current = Date.now()\n setWarning((current) => (current === null ? current : null))\n }\n const events = ['pointerdown', 'keydown', 'touchstart', 'wheel'] as const\n for (const event of events) window.addEventListener(event, touched, { passive: true })\n const timer = setInterval(() => {\n const idleFor = (Date.now() - lastTouch.current) / 1000\n if (idleFor < idleSeconds) return\n const left = Math.ceil(idleSeconds + warningSeconds - idleFor)\n if (left <= 0) {\n lastTouch.current = Date.now()\n setWarning(null)\n expire.current()\n return\n }\n setWarning(left)\n }, 1000)\n return () => {\n clearInterval(timer)\n for (const event of events) window.removeEventListener(event, touched)\n }\n }, [active, idleSeconds, warningSeconds])\n\n return { warning, stillHere }\n}\n"],"names":["useCallback","useEffect","useRef","useState","useKioskIdle","options","active","idleSeconds","warningSeconds","warning","setWarning","lastTouch","Date","now","expire","onExpire","current","stillHere","undefined","touched","events","event","window","addEventListener","passive","timer","setInterval","idleFor","left","Math","ceil","clearInterval","removeEventListener"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEhE;;;;;;CAMC,GACD,OAAO,SAASC,aAAaC,OAK5B;IACC,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAEC,cAAc,EAAE,GAAGH;IAChD,MAAM,CAACI,SAASC,WAAW,GAAGP,SAAwB;IACtD,MAAMQ,YAAYT,OAAOU,KAAKC,GAAG;IACjC,MAAMC,SAASZ,OAAOG,QAAQU,QAAQ;IACtCD,OAAOE,OAAO,GAAGX,QAAQU,QAAQ;IAEjC,MAAME,YAAYjB,YAAY;QAC5BW,UAAUK,OAAO,GAAGJ,KAAKC,GAAG;QAC5BH,WAAW;IACb,GAAG,EAAE;IAELT,UAAU;QACR,IAAI,CAACK,QAAQ;YACXI,WAAW;YACX,OAAOQ;QACT;QACAP,UAAUK,OAAO,GAAGJ,KAAKC,GAAG;QAC5B,MAAMM,UAAU;YACdR,UAAUK,OAAO,GAAGJ,KAAKC,GAAG;YAC5BH,WAAW,CAACM,UAAaA,YAAY,OAAOA,UAAU;QACxD;QACA,MAAMI,SAAS;YAAC;YAAe;YAAW;YAAc;SAAQ;QAChE,KAAK,MAAMC,SAASD,OAAQE,OAAOC,gBAAgB,CAACF,OAAOF,SAAS;YAAEK,SAAS;QAAK;QACpF,MAAMC,QAAQC,YAAY;YACxB,MAAMC,UAAU,AAACf,CAAAA,KAAKC,GAAG,KAAKF,UAAUK,OAAO,AAAD,IAAK;YACnD,IAAIW,UAAUpB,aAAa;YAC3B,MAAMqB,OAAOC,KAAKC,IAAI,CAACvB,cAAcC,iBAAiBmB;YACtD,IAAIC,QAAQ,GAAG;gBACbjB,UAAUK,OAAO,GAAGJ,KAAKC,GAAG;gBAC5BH,WAAW;gBACXI,OAAOE,OAAO;gBACd;YACF;YACAN,WAAWkB;QACb,GAAG;QACH,OAAO;YACLG,cAAcN;YACd,KAAK,MAAMJ,SAASD,OAAQE,OAAOU,mBAAmB,CAACX,OAAOF;QAChE;IACF,GAAG;QAACb;QAAQC;QAAaC;KAAe;IAExC,OAAO;QAAEC;QAASQ;IAAU;AAC9B"}
@@ -0,0 +1,28 @@
1
+ import type { ConsolePublicPageProps } from '@aglyn/aglyn';
2
+ import * as CommerceModel from '../../model';
3
+ import { type PosItemChoice } from './pos/pos-item-dialog.component';
4
+ import { type KioskCartLine } from './pos-kiosk/kiosk-menu';
5
+ /** How often the kiosk asks after a card payment in flight. */
6
+ export declare const POS_KIOSK_PAYMENT_POLL_MS = 1500;
7
+ /** A product as the register's item sheet takes it, from the kiosk's catalog. */
8
+ export declare function kioskItemProduct(product: CommerceModel.PosKioskProduct): CommerceModel.HostProduct & {
9
+ $id: string;
10
+ };
11
+ /** The cart line a choice makes: same item and choices merge. */
12
+ export declare function kioskCartLine(product: CommerceModel.PosKioskProduct, choice: PosItemChoice): KioskCartLine;
13
+ /**
14
+ * The self-service kiosk (AGL-3623), served at `/kiosk/commerce/pos-kiosk`
15
+ * with no staff session: a customer builds their own order and pays on the
16
+ * register's card reader or Tap to Pay, or sends it to the counter.
17
+ *
18
+ * It holds one secret — the kiosk token from pairing — and everything the
19
+ * customer chooses or types lives in this component's memory only. The idle
20
+ * reset (and "Done", and "Start over") voids an unpaid order, drops the
21
+ * cart, the tip and any email or phone, sweeps the kiosk's storage keys, and
22
+ * remounts every screen, so the next customer finds nothing of the last.
23
+ */
24
+ declare function PosKioskPage(_props: ConsolePublicPageProps): import("react").JSX.Element;
25
+ declare namespace PosKioskPage {
26
+ var displayName: string;
27
+ }
28
+ export default PosKioskPage;