@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,344 @@
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 { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ import Box from "@mui/material/Box";
20
+ import Button from "@mui/material/Button";
21
+ import Card from "@mui/material/Card";
22
+ import CardActionArea from "@mui/material/CardActionArea";
23
+ import CardContent from "@mui/material/CardContent";
24
+ import Chip from "@mui/material/Chip";
25
+ import CircularProgress from "@mui/material/CircularProgress";
26
+ import Divider from "@mui/material/Divider";
27
+ import Drawer from "@mui/material/Drawer";
28
+ import IconButton from "@mui/material/IconButton";
29
+ import Stack from "@mui/material/Stack";
30
+ import Typography from "@mui/material/Typography";
31
+ import * as CommerceModel from "../../../model/index.js";
32
+ import { displayMoney } from "../pos-display/pos-display-api.js";
33
+ /** The lowest price a product sells at, for its tile. */ export function kioskFromCents(product) {
34
+ var _ref;
35
+ var _product_variants_;
36
+ return product.variants.reduce((low, variant)=>Math.min(low, variant.priceCents), (_ref = (_product_variants_ = product.variants[0]) == null ? void 0 : _product_variants_.priceCents) != null ? _ref : 0);
37
+ }
38
+ export function kioskProductSoldOut(product) {
39
+ return product.variants.length > 0 && product.variants.every((variant)=>variant.soldOut);
40
+ }
41
+ /**
42
+ * The menu (AGL-3623): category chips, the product tiles, and the cart bar.
43
+ * A category chip asks the server for that category; nothing is filtered
44
+ * out of a list already loaded.
45
+ */ export function KioskMenu({ catalog, loading, categoryId, onCategory, onProduct, lines, currency, onReview, onQuantity, cartOpen, onCartOpen, busy }) {
46
+ var _ref, _ref1;
47
+ const count = lines.reduce((sum, line)=>sum + line.quantity, 0);
48
+ const estimate = lines.reduce((sum, line)=>sum + line.unitCents * line.quantity, 0);
49
+ const money = (cents)=>displayMoney(cents, currency);
50
+ const products = (_ref = catalog == null ? void 0 : catalog.products) != null ? _ref : [];
51
+ return /*#__PURE__*/ _jsxs(Box, {
52
+ sx: {
53
+ minHeight: '100dvh',
54
+ display: 'flex',
55
+ flexDirection: 'column'
56
+ },
57
+ children: [
58
+ /*#__PURE__*/ _jsxs(Box, {
59
+ component: "nav",
60
+ "aria-label": "Categories",
61
+ sx: {
62
+ display: 'flex',
63
+ gap: 1,
64
+ overflowX: 'auto',
65
+ p: 2,
66
+ borderBottom: 1,
67
+ borderColor: 'divider'
68
+ },
69
+ children: [
70
+ /*#__PURE__*/ _jsx(Chip, {
71
+ label: "All",
72
+ color: categoryId ? 'default' : 'primary',
73
+ variant: categoryId ? 'outlined' : 'filled',
74
+ "aria-pressed": !categoryId,
75
+ onClick: ()=>onCategory(null),
76
+ sx: (theme)=>_extends({
77
+ minHeight: theme.spacing(6),
78
+ px: 1
79
+ }, theme.typography.subtitle1)
80
+ }),
81
+ ((_ref1 = catalog == null ? void 0 : catalog.categories) != null ? _ref1 : []).map((category)=>/*#__PURE__*/ _jsx(Chip, {
82
+ label: category.name,
83
+ color: categoryId === category.id ? 'primary' : 'default',
84
+ variant: categoryId === category.id ? 'filled' : 'outlined',
85
+ "aria-pressed": categoryId === category.id,
86
+ onClick: ()=>onCategory(category.id),
87
+ sx: (theme)=>_extends({
88
+ minHeight: theme.spacing(6),
89
+ px: 1
90
+ }, theme.typography.subtitle1)
91
+ }, category.id))
92
+ ]
93
+ }),
94
+ /*#__PURE__*/ _jsx(Box, {
95
+ sx: {
96
+ flex: 1,
97
+ p: 2,
98
+ pb: 14
99
+ },
100
+ children: loading ? /*#__PURE__*/ _jsx(Box, {
101
+ sx: {
102
+ display: 'grid',
103
+ placeItems: 'center',
104
+ py: 8
105
+ },
106
+ children: /*#__PURE__*/ _jsx(CircularProgress, {
107
+ "aria-label": "Loading the menu"
108
+ })
109
+ }) : products.length === 0 ? /*#__PURE__*/ _jsx(Typography, {
110
+ variant: "h6",
111
+ color: "text.secondary",
112
+ sx: {
113
+ textAlign: 'center',
114
+ py: 8
115
+ },
116
+ children: 'Nothing here yet. Try another category.'
117
+ }) : /*#__PURE__*/ _jsx(Box, {
118
+ sx: (theme)=>({
119
+ display: 'grid',
120
+ gap: 2,
121
+ gridTemplateColumns: `repeat(auto-fill, minmax(${theme.spacing(22)}, 1fr))`
122
+ }),
123
+ children: products.map((product)=>{
124
+ const soldOut = kioskProductSoldOut(product);
125
+ const several = product.variants.length > 1;
126
+ return /*#__PURE__*/ _jsx(Card, {
127
+ variant: "outlined",
128
+ children: /*#__PURE__*/ _jsxs(CardActionArea, {
129
+ disabled: soldOut,
130
+ onClick: ()=>onProduct(product),
131
+ sx: {
132
+ height: '100%',
133
+ display: 'flex',
134
+ flexDirection: 'column',
135
+ alignItems: 'stretch'
136
+ },
137
+ children: [
138
+ product.imageUrl ? /*#__PURE__*/ _jsx(Box, {
139
+ component: "img",
140
+ src: product.imageUrl,
141
+ alt: "",
142
+ loading: "lazy",
143
+ sx: {
144
+ width: '100%',
145
+ aspectRatio: '4 / 3',
146
+ objectFit: 'cover',
147
+ display: 'block'
148
+ }
149
+ }) : null,
150
+ /*#__PURE__*/ _jsxs(CardContent, {
151
+ sx: {
152
+ flex: 1
153
+ },
154
+ children: [
155
+ /*#__PURE__*/ _jsx(Typography, {
156
+ variant: "subtitle1",
157
+ component: "h2",
158
+ children: product.name
159
+ }),
160
+ /*#__PURE__*/ _jsx(Typography, {
161
+ variant: "body2",
162
+ color: soldOut ? 'text.disabled' : 'text.secondary',
163
+ children: soldOut ? 'Sold out' : `${several ? 'From ' : ''}${money(kioskFromCents(product))}`
164
+ })
165
+ ]
166
+ })
167
+ ]
168
+ })
169
+ }, product.id);
170
+ })
171
+ })
172
+ }),
173
+ count > 0 ? /*#__PURE__*/ _jsxs(Box, {
174
+ sx: (theme)=>({
175
+ position: 'fixed',
176
+ left: 0,
177
+ right: 0,
178
+ bottom: 0,
179
+ p: 2,
180
+ bgcolor: 'background.paper',
181
+ borderTop: 1,
182
+ borderColor: 'divider',
183
+ display: 'flex',
184
+ gap: 2,
185
+ zIndex: theme.zIndex.appBar
186
+ }),
187
+ children: [
188
+ /*#__PURE__*/ _jsx(Button, {
189
+ variant: "outlined",
190
+ size: "large",
191
+ onClick: ()=>onCartOpen(true),
192
+ sx: (theme)=>_extends({
193
+ minHeight: theme.spacing(8)
194
+ }, theme.typography.h6),
195
+ children: `Cart (${count})`
196
+ }),
197
+ /*#__PURE__*/ _jsx(Button, {
198
+ variant: "contained",
199
+ size: "large",
200
+ disabled: busy,
201
+ onClick: onReview,
202
+ sx: (theme)=>_extends({
203
+ flex: 1,
204
+ minHeight: theme.spacing(8)
205
+ }, theme.typography.h6),
206
+ children: busy ? 'Getting your total…' : `Checkout · ${money(estimate)}`
207
+ })
208
+ ]
209
+ }) : null,
210
+ /*#__PURE__*/ _jsx(Drawer, {
211
+ anchor: "right",
212
+ open: cartOpen,
213
+ onClose: ()=>onCartOpen(false),
214
+ slotProps: {
215
+ paper: {
216
+ sx: (theme)=>({
217
+ width: `min(100vw, ${theme.spacing(60)})`,
218
+ p: 2
219
+ })
220
+ }
221
+ },
222
+ children: /*#__PURE__*/ _jsxs(Stack, {
223
+ spacing: 2,
224
+ sx: {
225
+ height: '100%'
226
+ },
227
+ children: [
228
+ /*#__PURE__*/ _jsx(Typography, {
229
+ variant: "h5",
230
+ component: "h2",
231
+ children: 'Your order'
232
+ }),
233
+ /*#__PURE__*/ _jsxs(Stack, {
234
+ spacing: 1,
235
+ divider: /*#__PURE__*/ _jsx(Divider, {
236
+ flexItem: true
237
+ }),
238
+ sx: {
239
+ flex: 1,
240
+ overflowY: 'auto'
241
+ },
242
+ children: [
243
+ lines.map((line)=>/*#__PURE__*/ _jsxs(Stack, {
244
+ direction: "row",
245
+ spacing: 1,
246
+ sx: {
247
+ alignItems: 'center'
248
+ },
249
+ children: [
250
+ /*#__PURE__*/ _jsxs(Box, {
251
+ sx: {
252
+ flex: 1,
253
+ minWidth: 0
254
+ },
255
+ children: [
256
+ /*#__PURE__*/ _jsx(Typography, {
257
+ variant: "subtitle1",
258
+ children: line.name
259
+ }),
260
+ line.label ? /*#__PURE__*/ _jsx(Typography, {
261
+ variant: "body2",
262
+ color: "text.secondary",
263
+ children: line.label
264
+ }) : null,
265
+ /*#__PURE__*/ _jsx(Typography, {
266
+ variant: "body2",
267
+ children: money(line.unitCents * line.quantity)
268
+ })
269
+ ]
270
+ }),
271
+ /*#__PURE__*/ _jsx(IconButton, {
272
+ "aria-label": `One fewer ${line.name}`,
273
+ onClick: ()=>onQuantity(line.key, line.quantity - 1),
274
+ sx: (theme)=>({
275
+ width: theme.spacing(7),
276
+ height: theme.spacing(7),
277
+ border: 1,
278
+ borderColor: 'divider'
279
+ }),
280
+ children: '−'
281
+ }),
282
+ /*#__PURE__*/ _jsx(Typography, {
283
+ variant: "h6",
284
+ component: "span",
285
+ "aria-label": "Quantity",
286
+ sx: {
287
+ minWidth: (theme)=>theme.spacing(4),
288
+ textAlign: 'center'
289
+ },
290
+ children: line.quantity
291
+ }),
292
+ /*#__PURE__*/ _jsx(IconButton, {
293
+ "aria-label": `One more ${line.name}`,
294
+ disabled: line.quantity >= CommerceModel.POS_KIOSK_MAX_QUANTITY,
295
+ onClick: ()=>onQuantity(line.key, line.quantity + 1),
296
+ sx: (theme)=>({
297
+ width: theme.spacing(7),
298
+ height: theme.spacing(7),
299
+ border: 1,
300
+ borderColor: 'divider'
301
+ }),
302
+ children: '+'
303
+ })
304
+ ]
305
+ }, line.key)),
306
+ lines.length === 0 ? /*#__PURE__*/ _jsx(Typography, {
307
+ color: "text.secondary",
308
+ children: 'Your cart is empty.'
309
+ }) : null
310
+ ]
311
+ }),
312
+ /*#__PURE__*/ _jsx(Typography, {
313
+ variant: "body2",
314
+ color: "text.secondary",
315
+ children: 'Tax is added at checkout.'
316
+ }),
317
+ /*#__PURE__*/ _jsx(Button, {
318
+ variant: "contained",
319
+ size: "large",
320
+ disabled: busy || lines.length === 0,
321
+ onClick: ()=>{
322
+ onCartOpen(false);
323
+ onReview();
324
+ },
325
+ sx: (theme)=>_extends({
326
+ minHeight: theme.spacing(8)
327
+ }, theme.typography.h6),
328
+ children: `Checkout · ${money(estimate)}`
329
+ }),
330
+ /*#__PURE__*/ _jsx(Button, {
331
+ onClick: ()=>onCartOpen(false),
332
+ sx: (theme)=>({
333
+ minHeight: theme.spacing(7)
334
+ }),
335
+ children: 'Keep ordering'
336
+ })
337
+ ]
338
+ })
339
+ })
340
+ ]
341
+ });
342
+ }
343
+
344
+ //# sourceMappingURL=kiosk-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-kiosk/kiosk-menu.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 Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Card from '@mui/material/Card'\nimport CardActionArea from '@mui/material/CardActionArea'\nimport CardContent from '@mui/material/CardContent'\nimport Chip from '@mui/material/Chip'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Divider from '@mui/material/Divider'\nimport Drawer from '@mui/material/Drawer'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport * as CommerceModel from '../../../model'\nimport { displayMoney } from '../pos-display/pos-display-api'\n\n/** A cart line on the kiosk: what is sent, plus what the screen shows. */\nexport interface KioskCartLine extends CommerceModel.PosKioskLine {\n /** Merges the same item with the same choices. */\n key: string\n name: string\n label?: string\n /** The catalog's price per unit, modifiers included: an estimate until checkout. */\n unitCents: number\n}\n\n/** The lowest price a product sells at, for its tile. */\nexport function kioskFromCents(product: CommerceModel.PosKioskProduct): number {\n return product.variants.reduce(\n (low, variant) => Math.min(low, variant.priceCents),\n product.variants[0]?.priceCents ?? 0,\n )\n}\n\nexport function kioskProductSoldOut(product: CommerceModel.PosKioskProduct): boolean {\n return product.variants.length > 0 && product.variants.every((variant) => variant.soldOut)\n}\n\n/**\n * The menu (AGL-3623): category chips, the product tiles, and the cart bar.\n * A category chip asks the server for that category; nothing is filtered\n * out of a list already loaded.\n */\nexport function KioskMenu({\n catalog,\n loading,\n categoryId,\n onCategory,\n onProduct,\n lines,\n currency,\n onReview,\n onQuantity,\n cartOpen,\n onCartOpen,\n busy,\n}: {\n catalog: CommerceModel.PosKioskCatalog | null\n loading: boolean\n categoryId: string | null\n onCategory: (categoryId: string | null) => void\n onProduct: (product: CommerceModel.PosKioskProduct) => void\n lines: KioskCartLine[]\n currency: string\n onReview: () => void\n onQuantity: (key: string, quantity: number) => void\n cartOpen: boolean\n onCartOpen: (open: boolean) => void\n busy: boolean\n}) {\n const count = lines.reduce((sum, line) => sum + line.quantity, 0)\n const estimate = lines.reduce((sum, line) => sum + line.unitCents * line.quantity, 0)\n const money = (cents: number) => displayMoney(cents, currency)\n const products = catalog?.products ?? []\n return (\n <Box sx={{ minHeight: '100dvh', display: 'flex', flexDirection: 'column' }}>\n <Box\n component=\"nav\"\n aria-label=\"Categories\"\n sx={{ display: 'flex', gap: 1, overflowX: 'auto', p: 2, borderBottom: 1, borderColor: 'divider' }}\n >\n <Chip\n label=\"All\"\n color={categoryId ? 'default' : 'primary'}\n variant={categoryId ? 'outlined' : 'filled'}\n aria-pressed={!categoryId}\n onClick={() => onCategory(null)}\n sx={(theme) => ({ minHeight: theme.spacing(6), px: 1, ...theme.typography.subtitle1 })}\n />\n {(catalog?.categories ?? []).map((category) => (\n <Chip\n key={category.id}\n label={category.name}\n color={categoryId === category.id ? 'primary' : 'default'}\n variant={categoryId === category.id ? 'filled' : 'outlined'}\n aria-pressed={categoryId === category.id}\n onClick={() => onCategory(category.id)}\n sx={(theme) => ({ minHeight: theme.spacing(6), px: 1, ...theme.typography.subtitle1 })}\n />\n ))}\n </Box>\n <Box sx={{ flex: 1, p: 2, pb: 14 }}>\n {loading ? (\n <Box sx={{ display: 'grid', placeItems: 'center', py: 8 }}>\n <CircularProgress aria-label=\"Loading the menu\" />\n </Box>\n ) : products.length === 0 ? (\n <Typography variant=\"h6\" color=\"text.secondary\" sx={{ textAlign: 'center', py: 8 }}>\n {'Nothing here yet. Try another category.'}\n </Typography>\n ) : (\n <Box\n sx={(theme) => ({\n display: 'grid',\n gap: 2,\n gridTemplateColumns: `repeat(auto-fill, minmax(${theme.spacing(22)}, 1fr))`,\n })}\n >\n {products.map((product) => {\n const soldOut = kioskProductSoldOut(product)\n const several = product.variants.length > 1\n return (\n <Card key={product.id} variant=\"outlined\">\n <CardActionArea\n disabled={soldOut}\n onClick={() => onProduct(product)}\n sx={{ height: '100%', display: 'flex', flexDirection: 'column', alignItems: 'stretch' }}\n >\n {product.imageUrl ? (\n <Box\n component=\"img\"\n src={product.imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{ width: '100%', aspectRatio: '4 / 3', objectFit: 'cover', display: 'block' }}\n />\n ) : null}\n <CardContent sx={{ flex: 1 }}>\n <Typography variant=\"subtitle1\" component=\"h2\">\n {product.name}\n </Typography>\n <Typography variant=\"body2\" color={soldOut ? 'text.disabled' : 'text.secondary'}>\n {soldOut\n ? 'Sold out'\n : `${several ? 'From ' : ''}${money(kioskFromCents(product))}`}\n </Typography>\n </CardContent>\n </CardActionArea>\n </Card>\n )\n })}\n </Box>\n )}\n </Box>\n {count > 0 ? (\n <Box\n sx={(theme) => ({\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n p: 2,\n bgcolor: 'background.paper',\n borderTop: 1,\n borderColor: 'divider',\n display: 'flex',\n gap: 2,\n zIndex: theme.zIndex.appBar,\n })}\n >\n <Button\n variant=\"outlined\"\n size=\"large\"\n onClick={() => onCartOpen(true)}\n sx={(theme) => ({ minHeight: theme.spacing(8), ...theme.typography.h6 })}\n >\n {`Cart (${count})`}\n </Button>\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={busy}\n onClick={onReview}\n sx={(theme) => ({ flex: 1, minHeight: theme.spacing(8), ...theme.typography.h6 })}\n >\n {busy ? 'Getting your total…' : `Checkout · ${money(estimate)}`}\n </Button>\n </Box>\n ) : null}\n <Drawer\n anchor=\"right\"\n open={cartOpen}\n onClose={() => onCartOpen(false)}\n slotProps={{ paper: { sx: (theme) => ({ width: `min(100vw, ${theme.spacing(60)})`, p: 2 }) } }}\n >\n <Stack spacing={2} sx={{ height: '100%' }}>\n <Typography variant=\"h5\" component=\"h2\">\n {'Your order'}\n </Typography>\n <Stack spacing={1} divider={<Divider flexItem />} sx={{ flex: 1, overflowY: 'auto' }}>\n {lines.map((line) => (\n <Stack key={line.key} direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle1\">{line.name}</Typography>\n {line.label ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {line.label}\n </Typography>\n ) : null}\n <Typography variant=\"body2\">{money(line.unitCents * line.quantity)}</Typography>\n </Box>\n <IconButton\n aria-label={`One fewer ${line.name}`}\n onClick={() => onQuantity(line.key, line.quantity - 1)}\n sx={(theme) => ({ width: theme.spacing(7), height: theme.spacing(7), border: 1, borderColor: 'divider' })}\n >\n {'−'}\n </IconButton>\n <Typography variant=\"h6\" component=\"span\" aria-label=\"Quantity\" sx={{ minWidth: (theme) => theme.spacing(4), textAlign: 'center' }}>\n {line.quantity}\n </Typography>\n <IconButton\n aria-label={`One more ${line.name}`}\n disabled={line.quantity >= CommerceModel.POS_KIOSK_MAX_QUANTITY}\n onClick={() => onQuantity(line.key, line.quantity + 1)}\n sx={(theme) => ({ width: theme.spacing(7), height: theme.spacing(7), border: 1, borderColor: 'divider' })}\n >\n {'+'}\n </IconButton>\n </Stack>\n ))}\n {lines.length === 0 ? (\n <Typography color=\"text.secondary\">{'Your cart is empty.'}</Typography>\n ) : null}\n </Stack>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Tax is added at checkout.'}\n </Typography>\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={busy || lines.length === 0}\n onClick={() => {\n onCartOpen(false)\n onReview()\n }}\n sx={(theme) => ({ minHeight: theme.spacing(8), ...theme.typography.h6 })}\n >\n {`Checkout · ${money(estimate)}`}\n </Button>\n <Button onClick={() => onCartOpen(false)} sx={(theme) => ({ minHeight: theme.spacing(7) })}>\n {'Keep ordering'}\n </Button>\n </Stack>\n </Drawer>\n </Box>\n )\n}\n"],"names":["Box","Button","Card","CardActionArea","CardContent","Chip","CircularProgress","Divider","Drawer","IconButton","Stack","Typography","CommerceModel","displayMoney","kioskFromCents","product","variants","reduce","low","variant","Math","min","priceCents","kioskProductSoldOut","length","every","soldOut","KioskMenu","catalog","loading","categoryId","onCategory","onProduct","lines","currency","onReview","onQuantity","cartOpen","onCartOpen","busy","count","sum","line","quantity","estimate","unitCents","money","cents","products","sx","minHeight","display","flexDirection","component","aria-label","gap","overflowX","p","borderBottom","borderColor","label","color","aria-pressed","onClick","theme","spacing","px","typography","subtitle1","categories","map","category","name","id","flex","pb","placeItems","py","textAlign","gridTemplateColumns","several","disabled","height","alignItems","imageUrl","src","alt","width","aspectRatio","objectFit","position","left","right","bottom","bgcolor","borderTop","zIndex","appBar","size","h6","anchor","open","onClose","slotProps","paper","divider","flexItem","overflowY","direction","minWidth","key","border","POS_KIOSK_MAX_QUANTITY"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Staff unlock (AGL-3623): a corner button, then the staff PIN the register
3
+ * uses, checked on the server. No names are listed — the screen faces the
4
+ * public — and a right PIN opens the kiosk's settings for a few minutes:
5
+ * which card reader it sends payments to, and leaving kiosk mode.
6
+ */
7
+ export declare function KioskStaffControl({ token, onExit, onUnauthorized, }: {
8
+ token: string;
9
+ /** Kiosk mode was left: the device is unpaired. */
10
+ onExit: () => void;
11
+ onUnauthorized: () => void;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,257 @@
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, Fragment as _Fragment } from "react/jsx-runtime";
18
+ import Alert from "@mui/material/Alert";
19
+ import Button from "@mui/material/Button";
20
+ import Dialog from "@mui/material/Dialog";
21
+ import DialogActions from "@mui/material/DialogActions";
22
+ import DialogContent from "@mui/material/DialogContent";
23
+ import DialogContentText from "@mui/material/DialogContentText";
24
+ import DialogTitle from "@mui/material/DialogTitle";
25
+ import MenuItem from "@mui/material/MenuItem";
26
+ import Stack from "@mui/material/Stack";
27
+ import TextField from "@mui/material/TextField";
28
+ import { useEffect, useState } from "react";
29
+ import { kioskApi } from "./pos-kiosk-api.js";
30
+ /**
31
+ * Staff unlock (AGL-3623): a corner button, then the staff PIN the register
32
+ * uses, checked on the server. No names are listed — the screen faces the
33
+ * public — and a right PIN opens the kiosk's settings for a few minutes:
34
+ * which card reader it sends payments to, and leaving kiosk mode.
35
+ */ export function KioskStaffControl({ token, onExit, onUnauthorized }) {
36
+ var _view_readerId;
37
+ const [stage, setStage] = useState('closed');
38
+ const [pin, setPin] = useState('');
39
+ const [unlock, setUnlock] = useState(null);
40
+ const [view, setView] = useState(null);
41
+ const [error, setError] = useState(null);
42
+ const [busy, setBusy] = useState(false);
43
+ const [confirmExit, setConfirmExit] = useState(false);
44
+ const close = ()=>{
45
+ setStage('closed');
46
+ setPin('');
47
+ setUnlock(null);
48
+ setView(null);
49
+ setError(null);
50
+ setConfirmExit(false);
51
+ };
52
+ // The unlock lapses on its own: the settings close with it.
53
+ useEffect(()=>{
54
+ if (!unlock) return undefined;
55
+ const timer = setTimeout(close, Math.max(0, unlock.expiresAtMs - Date.now()));
56
+ return ()=>clearTimeout(timer);
57
+ }, [
58
+ unlock
59
+ ]);
60
+ const submitPin = async (event)=>{
61
+ var _opened_value;
62
+ event.preventDefault();
63
+ if (busy || pin.length < 4) return;
64
+ setBusy(true);
65
+ setError(null);
66
+ const result = await kioskApi.unlock(token, pin);
67
+ setPin('');
68
+ if (!result.ok || !result.value) {
69
+ var _result_error, _result_error1;
70
+ setBusy(false);
71
+ if (result.status === 401 && /not paired/i.test((_result_error = result.error) != null ? _result_error : '')) return onUnauthorized();
72
+ setError((_result_error1 = result.error) != null ? _result_error1 : 'That PIN is not right.');
73
+ return;
74
+ }
75
+ const opened = await kioskApi.settings(token, result.value.unlock);
76
+ setBusy(false);
77
+ setUnlock(result.value);
78
+ setView((_opened_value = opened.value) != null ? _opened_value : null);
79
+ setStage('settings');
80
+ };
81
+ const chooseReader = async (readerId)=>{
82
+ var _result_error;
83
+ if (!unlock) return;
84
+ setBusy(true);
85
+ const result = await kioskApi.setReader(token, unlock.unlock, readerId);
86
+ setBusy(false);
87
+ if (result.ok && result.value) setView(result.value);
88
+ else setError((_result_error = result.error) != null ? _result_error : 'The card reader could not be changed.');
89
+ };
90
+ const exit = async ()=>{
91
+ if (!unlock) return;
92
+ setBusy(true);
93
+ const result = await kioskApi.exit(token, unlock.unlock);
94
+ setBusy(false);
95
+ if (!result.ok) {
96
+ var _result_error;
97
+ setError((_result_error = result.error) != null ? _result_error : 'Kiosk mode could not be turned off.');
98
+ return;
99
+ }
100
+ close();
101
+ onExit();
102
+ };
103
+ return /*#__PURE__*/ _jsxs(_Fragment, {
104
+ children: [
105
+ /*#__PURE__*/ _jsx(Button, {
106
+ size: "small",
107
+ color: "inherit",
108
+ onClick: ()=>setStage('pin'),
109
+ sx: (theme)=>({
110
+ position: 'fixed',
111
+ left: theme.spacing(1),
112
+ top: theme.spacing(1),
113
+ opacity: 0.4
114
+ }),
115
+ children: 'Staff'
116
+ }),
117
+ /*#__PURE__*/ _jsx(Dialog, {
118
+ open: stage === 'pin',
119
+ onClose: ()=>busy ? undefined : close(),
120
+ maxWidth: "xs",
121
+ fullWidth: true,
122
+ children: /*#__PURE__*/ _jsxs("form", {
123
+ onSubmit: submitPin,
124
+ children: [
125
+ /*#__PURE__*/ _jsx(DialogTitle, {
126
+ children: 'Staff unlock'
127
+ }),
128
+ /*#__PURE__*/ _jsx(DialogContent, {
129
+ children: /*#__PURE__*/ _jsxs(Stack, {
130
+ spacing: 2,
131
+ sx: {
132
+ pt: 1
133
+ },
134
+ children: [
135
+ /*#__PURE__*/ _jsx(DialogContentText, {
136
+ children: 'Enter your register PIN.'
137
+ }),
138
+ /*#__PURE__*/ _jsx(TextField, {
139
+ value: pin,
140
+ onChange: (event)=>setPin(event.target.value.replace(/\D/g, '').slice(0, 6)),
141
+ type: "password",
142
+ autoFocus: true,
143
+ autoComplete: "off",
144
+ slotProps: {
145
+ htmlInput: {
146
+ inputMode: 'numeric',
147
+ pattern: '[0-9]*',
148
+ maxLength: 6,
149
+ 'aria-label': 'Staff PIN'
150
+ }
151
+ }
152
+ }),
153
+ error ? /*#__PURE__*/ _jsx(Alert, {
154
+ severity: "error",
155
+ children: error
156
+ }) : null
157
+ ]
158
+ })
159
+ }),
160
+ /*#__PURE__*/ _jsxs(DialogActions, {
161
+ children: [
162
+ /*#__PURE__*/ _jsx(Button, {
163
+ onClick: close,
164
+ disabled: busy,
165
+ children: 'Cancel'
166
+ }),
167
+ /*#__PURE__*/ _jsx(Button, {
168
+ type: "submit",
169
+ variant: "contained",
170
+ disabled: busy || pin.length < 4,
171
+ children: busy ? 'Checking…' : 'Unlock'
172
+ })
173
+ ]
174
+ })
175
+ ]
176
+ })
177
+ }),
178
+ /*#__PURE__*/ _jsxs(Dialog, {
179
+ open: stage === 'settings',
180
+ onClose: ()=>busy ? undefined : close(),
181
+ maxWidth: "xs",
182
+ fullWidth: true,
183
+ children: [
184
+ /*#__PURE__*/ _jsx(DialogTitle, {
185
+ children: (view == null ? void 0 : view.label) || 'Kiosk settings'
186
+ }),
187
+ /*#__PURE__*/ _jsx(DialogContent, {
188
+ children: /*#__PURE__*/ _jsxs(Stack, {
189
+ spacing: 2,
190
+ sx: {
191
+ pt: 1
192
+ },
193
+ children: [
194
+ view && view.readers.length > 0 ? /*#__PURE__*/ _jsxs(TextField, {
195
+ select: true,
196
+ label: "Card reader",
197
+ value: (_view_readerId = view.readerId) != null ? _view_readerId : '',
198
+ disabled: busy,
199
+ onChange: (event)=>void chooseReader(event.target.value),
200
+ children: [
201
+ /*#__PURE__*/ _jsx(MenuItem, {
202
+ value: "",
203
+ children: 'None — pay at counter only'
204
+ }),
205
+ view.readers.map((reader)=>/*#__PURE__*/ _jsx(MenuItem, {
206
+ value: reader.id,
207
+ children: `${reader.label} (${reader.status})`
208
+ }, reader.id))
209
+ ]
210
+ }) : /*#__PURE__*/ _jsx(DialogContentText, {
211
+ children: 'No card reader is assigned to this register.'
212
+ }),
213
+ confirmExit ? /*#__PURE__*/ _jsx(Alert, {
214
+ severity: "warning",
215
+ children: 'This unpairs the kiosk. To use it again, show a new kiosk code on the register.'
216
+ }) : null,
217
+ error ? /*#__PURE__*/ _jsx(Alert, {
218
+ severity: "error",
219
+ children: error
220
+ }) : null
221
+ ]
222
+ })
223
+ }),
224
+ /*#__PURE__*/ _jsxs(DialogActions, {
225
+ children: [
226
+ confirmExit ? /*#__PURE__*/ _jsx(Button, {
227
+ color: "error",
228
+ variant: "contained",
229
+ disabled: busy,
230
+ onClick: ()=>void exit(),
231
+ children: 'Exit kiosk mode'
232
+ }) : /*#__PURE__*/ _jsx(Button, {
233
+ color: "error",
234
+ disabled: busy,
235
+ onClick: ()=>setConfirmExit(true),
236
+ children: 'Exit kiosk mode'
237
+ }),
238
+ /*#__PURE__*/ _jsx(Button, {
239
+ onClick: ()=>window.location.reload(),
240
+ disabled: busy,
241
+ children: 'Reload'
242
+ }),
243
+ /*#__PURE__*/ _jsx(Button, {
244
+ variant: "contained",
245
+ onClick: close,
246
+ disabled: busy,
247
+ children: 'Done'
248
+ })
249
+ ]
250
+ })
251
+ ]
252
+ })
253
+ ]
254
+ });
255
+ }
256
+
257
+ //# sourceMappingURL=kiosk-staff.js.map