@aglyn/plugins-commerce 1.0.0-beta.285 → 1.0.0-beta.288
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.
- package/README.md +1 -1
- package/package.json +13 -13
- package/src/lib/components/cart.js +25 -12
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/commerce-console-page.js +70 -13
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +2 -1
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-webhooks-card.component.js +1 -1
- package/src/lib/components/console/order-webhooks-card.component.js.map +1 -1
- package/src/lib/components/console/payment-methods-card.component.js +1 -1
- package/src/lib/components/console/payment-methods-card.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-cart-panel.component.d.ts +5 -0
- package/src/lib/components/console/pos/pos-cart-panel.component.js +18 -12
- package/src/lib/components/console/pos/pos-cart-panel.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-api.d.ts +76 -5
- package/src/lib/components/console/pos/pos-hardware-api.js +53 -11
- package/src/lib/components/console/pos/pos-hardware-api.js.map +1 -1
- package/src/lib/components/console/pos/pos-hardware-buyer.component.d.ts +18 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js +629 -0
- package/src/lib/components/console/pos/pos-hardware-buyer.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.d.ts +162 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js +122 -0
- package/src/lib/components/console/pos/pos-hardware-sale-api.js.map +1 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.d.ts +39 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js +251 -0
- package/src/lib/components/console/pos/pos-hardware-sale-terms.component.js.map +1 -0
- package/src/lib/components/console/pos/use-pos-display.js +50 -0
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
- package/src/lib/components/console/pos-cellular-control.component.d.ts +41 -0
- package/src/lib/components/console/pos-cellular-control.component.js +211 -0
- package/src/lib/components/console/pos-cellular-control.component.js.map +1 -0
- package/src/lib/components/console/pos-devices-card.component.d.ts +9 -1
- package/src/lib/components/console/pos-devices-card.component.js +47 -15
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +6 -0
- package/src/lib/components/console/pos-display/pos-display-api.js +8 -1
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
- package/src/lib/components/console/pos-display-page.component.d.ts +13 -0
- package/src/lib/components/console/pos-display-page.component.js +44 -2
- package/src/lib/components/console/pos-display-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-card.component.d.ts +12 -4
- package/src/lib/components/console/pos-hardware-card.component.js +157 -36
- package/src/lib/components/console/pos-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js +360 -80
- package/src/lib/components/console/pos-hardware-orders-staff-page.component.js.map +1 -1
- package/src/lib/components/console/pos-hardware-terms-page.component.d.ts +34 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js +257 -0
- package/src/lib/components/console/pos-hardware-terms-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.d.ts +27 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js +104 -0
- package/src/lib/components/console/pos-hardware-terms-sign-page.component.js.map +1 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.d.ts +24 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js +205 -0
- package/src/lib/components/console/pos-hardware-waiting-card.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js +297 -201
- package/src/lib/components/console/pos-ops/pos-check-in-dialog.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.d.ts +3 -0
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js +260 -92
- package/src/lib/components/console/pos-ops/pos-check-ins-card.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.d.ts +9 -0
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js +15 -6
- package/src/lib/components/console/pos-ops/pos-operations-bar.component.js.map +1 -1
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.d.ts +25 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js +136 -0
- package/src/lib/components/console/pos-ops/pos-rain-check-dialog.component.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.d.ts +6 -0
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js +48 -31
- package/src/lib/components/console/pos-ops/pos-shift-panel.component.js.map +1 -1
- package/src/lib/components/console/pos-page.component.d.ts +1 -1
- package/src/lib/components/console/pos-page.component.js +63 -12
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js +1 -1
- package/src/lib/components/console/pos-reader-splash-setting.component.js.map +1 -1
- package/src/lib/components/console/product-check-in-fields.component.d.ts +4 -2
- package/src/lib/components/console/product-check-in-fields.component.js +60 -14
- package/src/lib/components/console/product-check-in-fields.component.js.map +1 -1
- package/src/lib/components/console/product-editor-dialog.component.js +44 -1
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -1
- package/src/lib/components/console/product-hardware-sku-field.component.d.ts +19 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js +92 -0
- package/src/lib/components/console/product-hardware-sku-field.component.js.map +1 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.d.ts +22 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js +94 -0
- package/src/lib/components/console/product-kiosk-offer-field.component.js.map +1 -0
- package/src/lib/components/console/product-register-fields.component.d.ts +4 -0
- package/src/lib/components/console/product-register-fields.component.js +31 -2
- package/src/lib/components/console/product-register-fields.component.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +11 -2
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/register-hardware-card.component.d.ts +11 -0
- package/src/lib/components/console/register-hardware-card.component.js +56 -27
- package/src/lib/components/console/register-hardware-card.component.js.map +1 -1
- package/src/lib/components/console/reservation-guests-dialog.component.d.ts +28 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js +189 -0
- package/src/lib/components/console/reservation-guests-dialog.component.js.map +1 -0
- package/src/lib/components/console/reservations-card.component.d.ts +9 -0
- package/src/lib/components/console/reservations-card.component.js +158 -23
- package/src/lib/components/console/reservations-card.component.js.map +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js +1 -1
- package/src/lib/components/console/shippingeasy-card.component.js.map +1 -1
- package/src/lib/components/console/shipstation-card.component.d.ts +1 -1
- package/src/lib/components/console/shipstation-card.component.js +3 -3
- package/src/lib/components/console/shipstation-card.component.js.map +1 -1
- package/src/lib/components/product-detail.d.ts +4 -0
- package/src/lib/components/product-detail.js +40 -5
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/components/product-reviews.js +28 -11
- package/src/lib/components/product-reviews.js.map +1 -1
- package/src/lib/components/reservation-widget.js +28 -5
- package/src/lib/components/reservation-widget.js.map +1 -1
- package/src/lib/components/use-day-picker.d.ts +25 -0
- package/src/lib/components/use-day-picker.js +57 -0
- package/src/lib/components/use-day-picker.js.map +1 -0
- package/src/lib/constants/operator-alerts.d.ts +55 -0
- package/src/lib/constants/operator-alerts.js +156 -1
- package/src/lib/constants/operator-alerts.js.map +1 -1
- package/src/lib/declarations.console-server.js +54 -1
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +4 -2
- package/src/lib/declarations.js +15 -4
- package/src/lib/declarations.js.map +1 -1
- package/src/lib/declarations.server.js +9 -0
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/model/commerce-cart.d.ts +9 -1
- package/src/lib/model/commerce-cart.js +4 -3
- package/src/lib/model/commerce-cart.js.map +1 -1
- package/src/lib/model/commerce-check-in-product.d.ts +26 -0
- package/src/lib/model/commerce-check-in-product.js +64 -2
- package/src/lib/model/commerce-check-in-product.js.map +1 -1
- package/src/lib/model/commerce-check-in-record.d.ts +127 -0
- package/src/lib/model/commerce-check-in-record.js +36 -0
- package/src/lib/model/commerce-check-in-record.js.map +1 -0
- package/src/lib/model/commerce-check-in.d.ts +91 -87
- package/src/lib/model/commerce-check-in.js +186 -62
- package/src/lib/model/commerce-check-in.js.map +1 -1
- package/src/lib/model/commerce-kiosk-offer.d.ts +31 -0
- package/src/lib/model/commerce-kiosk-offer.js +35 -0
- package/src/lib/model/commerce-kiosk-offer.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +76 -0
- package/src/lib/model/commerce-orders.js +6 -0
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-pos-day-report.d.ts +54 -1
- package/src/lib/model/commerce-pos-day-report.js +39 -2
- package/src/lib/model/commerce-pos-day-report.js.map +1 -1
- package/src/lib/model/commerce-pos-offline.d.ts +1 -1
- package/src/lib/model/commerce-pos-offline.js +6 -1
- package/src/lib/model/commerce-pos-offline.js.map +1 -1
- package/src/lib/model/commerce-pos-ops.js +3 -2
- package/src/lib/model/commerce-pos-ops.js.map +1 -1
- package/src/lib/model/commerce-pos.d.ts +36 -3
- package/src/lib/model/commerce-pos.js +14 -6
- package/src/lib/model/commerce-pos.js.map +1 -1
- package/src/lib/model/commerce-receipt.js +3 -2
- package/src/lib/model/commerce-receipt.js.map +1 -1
- package/src/lib/model/commerce-reservations.d.ts +69 -4
- package/src/lib/model/commerce-reservations.js +57 -5
- package/src/lib/model/commerce-reservations.js.map +1 -1
- package/src/lib/model/commerce.d.ts +66 -0
- package/src/lib/model/commerce.js +15 -0
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/order-list-fields.d.ts +11 -0
- package/src/lib/model/order-list-fields.js +17 -1
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/own-store-tax-summary.d.ts +152 -0
- package/src/lib/model/own-store-tax-summary.js +288 -0
- package/src/lib/model/own-store-tax-summary.js.map +1 -0
- package/src/lib/model/plugin-permissions.d.ts +74 -0
- package/src/lib/model/plugin-permissions.js +224 -7
- package/src/lib/model/plugin-permissions.js.map +1 -1
- package/src/lib/model/pos-cellular.d.ts +223 -0
- package/src/lib/model/pos-cellular.js +293 -0
- package/src/lib/model/pos-cellular.js.map +1 -0
- package/src/lib/model/pos-hardware-in-person.d.ts +98 -0
- package/src/lib/model/pos-hardware-in-person.js +224 -0
- package/src/lib/model/pos-hardware-in-person.js.map +1 -0
- package/src/lib/model/pos-hardware-tax-summary.d.ts +166 -0
- package/src/lib/model/pos-hardware-tax-summary.js +225 -0
- package/src/lib/model/pos-hardware-tax-summary.js.map +1 -0
- package/src/lib/model/pos-hardware-terms.d.ts +74 -0
- package/src/lib/model/pos-hardware-terms.js +115 -0
- package/src/lib/model/pos-hardware-terms.js.map +1 -0
- package/src/lib/model/pos-hardware.d.ts +349 -7
- package/src/lib/model/pos-hardware.js +291 -20
- package/src/lib/model/pos-hardware.js.map +1 -1
- package/src/lib/model/product-write.d.ts +10 -0
- package/src/lib/model/product-write.js +4 -2
- package/src/lib/model/product-write.js.map +1 -1
- package/src/lib/model/workspace-site-permissions.d.ts +26 -0
- package/src/lib/model/workspace-site-permissions.js +81 -0
- package/src/lib/model/workspace-site-permissions.js.map +1 -0
- package/src/lib/plugin.js +16 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/billing-webhook.js +25 -1
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cancel-order.js +7 -5
- package/src/lib/server/cancel-order.js.map +1 -1
- package/src/lib/server/cart-checkout.js +20 -8
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/cart.js +29 -0
- package/src/lib/server/cart.js.map +1 -1
- package/src/lib/server/checkout.js +42 -13
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/collection-membership.d.ts +4 -0
- package/src/lib/server/collection-membership.js +5 -10
- package/src/lib/server/collection-membership.js.map +1 -1
- package/src/lib/server/commerce-site-keys.d.ts +48 -0
- package/src/lib/server/commerce-site-keys.js +61 -0
- package/src/lib/server/commerce-site-keys.js.map +1 -0
- package/src/lib/server/draft-order.js +8 -5
- package/src/lib/server/draft-order.js.map +1 -1
- package/src/lib/server/fulfill-order.js +7 -5
- package/src/lib/server/fulfill-order.js.map +1 -1
- package/src/lib/server/gift-cards.js +8 -5
- package/src/lib/server/gift-cards.js.map +1 -1
- package/src/lib/server/local-fulfillment-status.js +9 -6
- package/src/lib/server/local-fulfillment-status.js.map +1 -1
- package/src/lib/server/member-post.js +6 -5
- package/src/lib/server/member-post.js.map +1 -1
- package/src/lib/server/membership-admin-password.d.ts +4 -2
- package/src/lib/server/membership-admin-password.js +10 -8
- package/src/lib/server/membership-admin-password.js.map +1 -1
- package/src/lib/server/membership-admin-remove.d.ts +7 -5
- package/src/lib/server/membership-admin-remove.js +9 -9
- package/src/lib/server/membership-admin-remove.js.map +1 -1
- package/src/lib/server/order-notifications.js +5 -2
- package/src/lib/server/order-notifications.js.map +1 -1
- package/src/lib/server/order-print.js +7 -5
- package/src/lib/server/order-print.js.map +1 -1
- package/src/lib/server/order-receipt-send.js +8 -5
- package/src/lib/server/order-receipt-send.js.map +1 -1
- package/src/lib/server/order-webhooks.js +8 -8
- package/src/lib/server/order-webhooks.js.map +1 -1
- package/src/lib/server/orders-shipping-prepare.js +9 -6
- package/src/lib/server/orders-shipping-prepare.js.map +1 -1
- package/src/lib/server/own-store-tax-return-source.d.ts +47 -0
- package/src/lib/server/own-store-tax-return-source.js +312 -0
- package/src/lib/server/own-store-tax-return-source.js.map +1 -0
- package/src/lib/server/payment-methods.js +13 -9
- package/src/lib/server/payment-methods.js.map +1 -1
- package/src/lib/server/pos-auth.d.ts +37 -6
- package/src/lib/server/pos-auth.js +40 -15
- package/src/lib/server/pos-auth.js.map +1 -1
- package/src/lib/server/pos-cellular-billing.d.ts +81 -0
- package/src/lib/server/pos-cellular-billing.js +711 -0
- package/src/lib/server/pos-cellular-billing.js.map +1 -0
- package/src/lib/server/pos-cellular-notify.d.ts +47 -0
- package/src/lib/server/pos-cellular-notify.js +150 -0
- package/src/lib/server/pos-cellular-notify.js.map +1 -0
- package/src/lib/server/pos-cellular.d.ts +88 -0
- package/src/lib/server/pos-cellular.js +339 -0
- package/src/lib/server/pos-cellular.js.map +1 -0
- package/src/lib/server/pos-check-in.d.ts +5 -1
- package/src/lib/server/pos-check-in.js +296 -28
- package/src/lib/server/pos-check-in.js.map +1 -1
- package/src/lib/server/pos-day-report.js +29 -3
- package/src/lib/server/pos-day-report.js.map +1 -1
- package/src/lib/server/pos-display.d.ts +16 -0
- package/src/lib/server/pos-display.js +129 -2
- package/src/lib/server/pos-display.js.map +1 -1
- package/src/lib/server/pos-hardware-admin.d.ts +10 -1
- package/src/lib/server/pos-hardware-admin.js +250 -84
- package/src/lib/server/pos-hardware-admin.js.map +1 -1
- package/src/lib/server/pos-hardware-attach.d.ts +105 -0
- package/src/lib/server/pos-hardware-attach.js +443 -0
- package/src/lib/server/pos-hardware-attach.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-lookup.d.ts +58 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js +180 -0
- package/src/lib/server/pos-hardware-buyer-lookup.js.map +1 -0
- package/src/lib/server/pos-hardware-buyer-record.d.ts +29 -0
- package/src/lib/server/pos-hardware-buyer-record.js +86 -0
- package/src/lib/server/pos-hardware-buyer-record.js.map +1 -0
- package/src/lib/server/pos-hardware-cancel.d.ts +58 -0
- package/src/lib/server/pos-hardware-cancel.js +147 -0
- package/src/lib/server/pos-hardware-cancel.js.map +1 -0
- package/src/lib/server/pos-hardware-closure-notices.d.ts +27 -0
- package/src/lib/server/pos-hardware-closure-notices.js +85 -0
- package/src/lib/server/pos-hardware-closure-notices.js.map +1 -0
- package/src/lib/server/pos-hardware-closure.d.ts +60 -0
- package/src/lib/server/pos-hardware-closure.js +153 -0
- package/src/lib/server/pos-hardware-closure.js.map +1 -0
- package/src/lib/server/pos-hardware-in-person.d.ts +61 -0
- package/src/lib/server/pos-hardware-in-person.js +236 -0
- package/src/lib/server/pos-hardware-in-person.js.map +1 -0
- package/src/lib/server/pos-hardware-notify.d.ts +40 -2
- package/src/lib/server/pos-hardware-notify.js +195 -14
- package/src/lib/server/pos-hardware-notify.js.map +1 -1
- package/src/lib/server/pos-hardware-readers.d.ts +115 -0
- package/src/lib/server/pos-hardware-readers.js +430 -0
- package/src/lib/server/pos-hardware-readers.js.map +1 -0
- package/src/lib/server/pos-hardware-returns.d.ts +116 -0
- package/src/lib/server/pos-hardware-returns.js +502 -0
- package/src/lib/server/pos-hardware-returns.js.map +1 -0
- package/src/lib/server/pos-hardware-sale-fields.d.ts +28 -0
- package/src/lib/server/pos-hardware-sale-fields.js +44 -0
- package/src/lib/server/pos-hardware-sale-fields.js.map +1 -0
- package/src/lib/server/pos-hardware-sale.d.ts +54 -0
- package/src/lib/server/pos-hardware-sale.js +369 -0
- package/src/lib/server/pos-hardware-sale.js.map +1 -0
- package/src/lib/server/pos-hardware-tax-return-source.d.ts +99 -0
- package/src/lib/server/pos-hardware-tax-return-source.js +462 -0
- package/src/lib/server/pos-hardware-tax-return-source.js.map +1 -0
- package/src/lib/server/pos-hardware-terms.d.ts +64 -0
- package/src/lib/server/pos-hardware-terms.js +154 -0
- package/src/lib/server/pos-hardware-terms.js.map +1 -0
- package/src/lib/server/pos-hardware-user-eraser.d.ts +3 -0
- package/src/lib/server/pos-hardware-user-eraser.js +31 -7
- package/src/lib/server/pos-hardware-user-eraser.js.map +1 -1
- package/src/lib/server/pos-hardware-webhook.d.ts +5 -0
- package/src/lib/server/pos-hardware-webhook.js +51 -6
- package/src/lib/server/pos-hardware-webhook.js.map +1 -1
- package/src/lib/server/pos-hardware.d.ts +74 -1
- package/src/lib/server/pos-hardware.js +175 -10
- package/src/lib/server/pos-hardware.js.map +1 -1
- package/src/lib/server/pos-kiosk.d.ts +2 -0
- package/src/lib/server/pos-kiosk.js +17 -12
- package/src/lib/server/pos-kiosk.js.map +1 -1
- package/src/lib/server/pos-offline-card-order.d.ts +64 -0
- package/src/lib/server/pos-offline-card-order.js +102 -0
- package/src/lib/server/pos-offline-card-order.js.map +1 -0
- package/src/lib/server/pos-offline-card-reconcile.d.ts +67 -1
- package/src/lib/server/pos-offline-card-reconcile.js +215 -18
- package/src/lib/server/pos-offline-card-reconcile.js.map +1 -1
- package/src/lib/server/pos-offline-sync.d.ts +39 -0
- package/src/lib/server/pos-offline-sync.js +190 -55
- package/src/lib/server/pos-offline-sync.js.map +1 -1
- package/src/lib/server/pos-ops-gate.d.ts +28 -9
- package/src/lib/server/pos-ops-gate.js +50 -19
- package/src/lib/server/pos-ops-gate.js.map +1 -1
- package/src/lib/server/pos-ops-routes.js +24 -0
- package/src/lib/server/pos-ops-routes.js.map +1 -1
- package/src/lib/server/pos-order-refund-ids.d.ts +28 -0
- package/src/lib/server/pos-order-refund-ids.js +31 -0
- package/src/lib/server/pos-order-refund-ids.js.map +1 -0
- package/src/lib/server/pos-order.js +52 -49
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.js +1 -1
- package/src/lib/server/pos-payment.js.map +1 -1
- package/src/lib/server/pos-reader-splash-admin.js +30 -32
- package/src/lib/server/pos-reader-splash-admin.js.map +1 -1
- package/src/lib/server/pos-reader-splash-images-route.d.ts +17 -0
- package/src/lib/server/pos-reader-splash-images-route.js +113 -0
- package/src/lib/server/pos-reader-splash-images-route.js.map +1 -0
- package/src/lib/server/pos-reader-splash-images.d.ts +51 -0
- package/src/lib/server/pos-reader-splash-images.js +123 -0
- package/src/lib/server/pos-reader-splash-images.js.map +1 -0
- package/src/lib/server/pos-reader-splash.d.ts +68 -1
- package/src/lib/server/pos-reader-splash.js +182 -11
- package/src/lib/server/pos-reader-splash.js.map +1 -1
- package/src/lib/server/pos-readers.d.ts +29 -0
- package/src/lib/server/pos-readers.js +134 -35
- package/src/lib/server/pos-readers.js.map +1 -1
- package/src/lib/server/pos-refund-authority.d.ts +3 -1
- package/src/lib/server/pos-refund-authority.js +3 -2
- package/src/lib/server/pos-refund-authority.js.map +1 -1
- package/src/lib/server/pos-return.d.ts +10 -0
- package/src/lib/server/pos-return.js +29 -7
- package/src/lib/server/pos-return.js.map +1 -1
- package/src/lib/server/pos-sale.js +6 -1
- package/src/lib/server/pos-sale.js.map +1 -1
- package/src/lib/server/pos-shift.js +11 -0
- package/src/lib/server/pos-shift.js.map +1 -1
- package/src/lib/server/pos-staff-pin.js +29 -24
- package/src/lib/server/pos-staff-pin.js.map +1 -1
- package/src/lib/server/pos-terminal.d.ts +14 -4
- package/src/lib/server/pos-terminal.js +34 -38
- package/src/lib/server/pos-terminal.js.map +1 -1
- package/src/lib/server/printers.d.ts +7 -3
- package/src/lib/server/printers.js +18 -12
- package/src/lib/server/printers.js.map +1 -1
- package/src/lib/server/product-drafts.d.ts +11 -1
- package/src/lib/server/product-drafts.js +12 -8
- package/src/lib/server/product-drafts.js.map +1 -1
- package/src/lib/server/product.d.ts +15 -1
- package/src/lib/server/product.js +16 -3
- package/src/lib/server/product.js.map +1 -1
- package/src/lib/server/products-write.d.ts +26 -2
- package/src/lib/server/products-write.js +19 -7
- package/src/lib/server/products-write.js.map +1 -1
- package/src/lib/server/refund.js +55 -42
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/reservation-availability-query.d.ts +8 -0
- package/src/lib/server/reservation-availability-query.js +11 -1
- package/src/lib/server/reservation-availability-query.js.map +1 -1
- package/src/lib/server/reservation-availability.d.ts +1 -1
- package/src/lib/server/reservation-availability.js +7 -2
- package/src/lib/server/reservation-availability.js.map +1 -1
- package/src/lib/server/reservation-guests.d.ts +32 -0
- package/src/lib/server/reservation-guests.js +285 -0
- package/src/lib/server/reservation-guests.js.map +1 -0
- package/src/lib/server/reservation-walk-in.d.ts +11 -1
- package/src/lib/server/reservation-walk-in.js +56 -12
- package/src/lib/server/reservation-walk-in.js.map +1 -1
- package/src/lib/server/reserve.js +18 -5
- package/src/lib/server/reserve.js.map +1 -1
- package/src/lib/server/returns.js +9 -6
- package/src/lib/server/returns.js.map +1 -1
- package/src/lib/server/reviews.d.ts +22 -2
- package/src/lib/server/reviews.js +88 -20
- package/src/lib/server/reviews.js.map +1 -1
- package/src/lib/server/shipping-connectors.js +10 -11
- package/src/lib/server/shipping-connectors.js.map +1 -1
- package/src/lib/server/site-page-resolver.js +20 -3
- package/src/lib/server/site-page-resolver.js.map +1 -1
- package/src/lib/server/store-day.d.ts +33 -0
- package/src/lib/server/store-day.js +46 -0
- package/src/lib/server/store-day.js.map +1 -0
- package/src/lib/server/store-setup-ai-writer.d.ts +2 -1
- package/src/lib/server/store-setup-ai-writer.js +5 -6
- package/src/lib/server/store-setup-ai-writer.js.map +1 -1
- package/src/lib/server/storefront-tax.d.ts +13 -0
- package/src/lib/server/storefront-tax.js +8 -1
- package/src/lib/server/storefront-tax.js.map +1 -1
- package/src/lib/server/tax-return-source.d.ts +32 -3
- package/src/lib/server/tax-return-source.js +99 -20
- package/src/lib/server/tax-return-source.js.map +1 -1
- package/src/lib/server.js +100 -2
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/fake-firestore.js +58 -16
- package/src/lib/testing/fake-firestore.js.map +1 -1
- package/src/lib/testing/pos-ops-memory-firestore.js +18 -4
- package/src/lib/testing/pos-ops-memory-firestore.js.map +1 -1
- package/src/lib/testing/site-register-permissions.d.ts +29 -0
- package/src/lib/testing/site-register-permissions.js +38 -0
- package/src/lib/testing/site-register-permissions.js.map +1 -0
- package/src/lib/transfer/tracking.server.js +8 -5
- package/src/lib/transfer/tracking.server.js.map +1 -1
- package/src/lib/utils/add-to-cart.d.ts +2 -0
- package/src/lib/utils/add-to-cart.js +6 -3
- package/src/lib/utils/add-to-cart.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-page.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport type { ConsolePluginPageProps } from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport {\n PRODUCT_LIST_BASE,\n PRODUCT_LIST_QUERY,\n} from '../../constants/product-list-query'\nimport { NextPageTitle } from '@aglyn/shared-ui-next/contexts/next-page-title-provider'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport type { ListFilterRequest } from '@aglyn/shared-ui-jsx/const/list-filter'\nimport { planListQuery } from '@aglyn/shared-ui-jsx/const/list-query-plan'\nimport { useViewportFill } from '@aglyn/shared-ui-jsx/hooks/use-viewport-fill'\nimport { nameSearchNormalizers } from '@aglyn/aglyn/app-utils/name-search'\nimport {\n Badge,\n Box,\n Button,\n Drawer,\n MenuItem,\n Stack,\n TextField,\n Typography,\n useMediaQuery,\n useTheme,\n} from '@mui/material'\nimport {\n collection,\n getDocs,\n limit,\n query,\n where,\n} from 'firebase/firestore'\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport { useFirestoreCollection } from '@aglyn/tenant-feature-instance'\nimport { listQueryConstraints } from '@aglyn/tenant-feature-instance/hooks/use-list-query'\nimport { useOrgPlan } from '@aglyn/tenant-feature-instance'\nimport {\n newAttemptKey,\n openPosSale,\n posRegisterContext,\n posTender,\n PosRequestError,\n usd,\n type PosRegisterContext,\n type PosSaleSummary,\n} from './pos/pos-api'\nimport { PosCartPanel, type RegisterLine } from './pos/pos-cart-panel.component'\nimport { ScanAdornment } from '../../barcode/scan-button.component'\nimport { useScannerWedge } from '../../barcode/scanner-wedge'\nimport {\n PosCustomerLookup,\n PosLastReceipt,\n PosOperationsBar,\n usePosCashier,\n usePosOpsSettings,\n type PosSelectedCustomer,\n} from './pos-ops/register-ops'\nimport { POS_QUICK_KEYS, POS_TOUCH_PX, PosProductGrid } from './pos/pos-product-grid.component'\nimport { PosItemDialog, posItemNeedsChoice, type PosItemChoice } from './pos/pos-item-dialog.component'\nimport { PosReceiptPanel } from './pos/pos-receipt-panel.component'\nimport { PosTenderPanel } from './pos/pos-tender-panel.component'\nimport { PosKioskQueue } from './pos/pos-kiosk-queue.component'\nimport { posDisplayTipCents, usePosDisplay } from './pos/use-pos-display'\nimport { posRegistersSettingsHref, usePosPairing } from './pos/pos-pairing.component'\nimport {\n type ConsoleWidgetSlotRenderer,\n useConsoleWidgetSlot,\n} from '@aglyn/aglyn/app-utils/console-widget-slot-context'\nimport { POS_ORDERS_ZONE } from './pos-zones'\nimport { PosOfflineBanner, PosOfflineCheckout, usePosOffline } from './pos-offline/register-offline'\n\n/** The till sells active products only; every read of the catalog asks it. */\nconst SELLABLE: ListFilterRequest = { field: 'status', op: 'equals', value: 'active' }\n\n/**\n * How many products the till's grid shows. The grid is a picker, not the\n * catalog: typing narrows it on the query, so a name reaches every product.\n */\nconst POS_GRID_CEILING = 500\n\n/**\n * The products hub's query (AGL-3321), narrowed to what the till may sell:\n * live products (`deletedAt == null`, the list's scope), `status == active`,\n * and any typed word as the search on `nameTokens` — or, for a scan, the\n * whole scanned code as a SKU or barcode clause. Every shape is one the hub's\n * composites already serve.\n */\nexport function posProductPlan(options: {\n search?: string\n code?: { field: 'barcodes' | 'skus'; value: string }\n /** A category chip (AGL-3607): served by the storefront's own composite. */\n categoryId?: string\n /** The Quick keys chip (AGL-3607): products marked `posQuickKey`. */\n quickKeys?: boolean\n}) {\n const typed = options.search?.trim()\n const plan = planListQuery(\n POS_GRID_QUERY,\n {\n base: PRODUCT_LIST_BASE,\n clauses: [\n SELLABLE,\n ...(options.code\n ? [{ field: options.code.field, op: 'contains', value: options.code.value }]\n : []),\n ...(options.categoryId\n ? [{ field: 'categoryIds', op: 'contains', value: options.categoryId }]\n : []),\n ],\n // A chip and a typed word are both array clauses, and Firestore takes\n // one: with a chip on, the word narrows by name prefix instead.\n search: typed && !options.categoryId ? [typed] : [],\n },\n nameSearchNormalizers,\n )\n // The Quick keys chip (AGL-3607) is a boolean equality the list planner\n // does not model, added beside the scope and status it composes with —\n // `deletedAt ==, status ==, posQuickKey ==, nameLower ASC` is declared in\n // the index file. A typed word searches the whole catalog instead: a\n // cashier who types is looking past the quick keys.\n if (options.quickKeys && !typed && !options.code) {\n return {\n ...plan,\n filters: [...plan.filters, { path: 'posQuickKey', op: '==', value: true }],\n } as typeof plan\n }\n return plan\n}\n\n/**\n * The grid's query: the products hub's, plus the category a chip picks\n * (AGL-3607). `categoryIds CONTAINS, nameLower ASC` is a composite the\n * storefront catalog already declares.\n */\nexport const POS_GRID_QUERY = {\n ...PRODUCT_LIST_QUERY,\n fields: [\n ...PRODUCT_LIST_QUERY.fields,\n {\n column: 'categoryIds',\n kind: 'exact' as const,\n path: 'categoryIds',\n tokensPath: 'categoryIds',\n operators: ['contains'],\n },\n ],\n} as typeof PRODUCT_LIST_QUERY\n\n/**\n * POS register (AGL-312, AGL-3607): a tablet-first sale surface — the\n * product grid with search, scan and category chips, the basket, and a\n * tender panel that takes one or more payments against an open sale (cash,\n * card reader, a native Tap to Pay bridge, a typed card, the QR link, gift\n * cards and room charges) until the balance is zero. A paired customer\n * display mirrors the basket and takes the tip and the receipt (AGL-3608).\n *\n * On a wide screen (900px and up) the grid and the register sit side by\n * side; below that the register is a bottom sheet behind a sticky total bar.\n */\n/*\n * `managePos` is NOT read here. The nav item in `plugin.ts` declares it and\n * the shell refuses the route before this component is constructed, so a\n * reader without the key never reaches this file and there is no unpermitted\n * state for it to render — the same arrangement the entitlement gate has.\n *\n * Re-adding a check off the `permissions` prop would be a second answer to a\n * settled question, and a laxer one: a prop absent because the map has not\n * landed reads as permitted here, while the shell holds the route on that\n * same condition rather than guessing. The server routes remain the\n * enforcement point for every sale and every payment.\n */\n/** Where a register device remembers the category chip it was left on. */\nconst POS_CATEGORY_KEY = 'aglyn.pos.category'\n\n/** The basket line an item-sheet choice makes: label and estimate from the product. */\nexport function registerLineFor(\n product: any,\n choice: PosItemChoice,\n): RegisterLine {\n const { variant, modifiers, quantity } = choice\n const resolved = CommerceModel.resolveLineModifiers(product, modifiers)\n const picked = resolved.ok ? resolved.modifiers : []\n const label = CommerceModel.lineLabelWithModifiers(\n Object.keys(variant.options ?? {}).length\n ? Object.values(variant.options ?? {}).join(' / ')\n : undefined,\n picked,\n )\n return {\n productId: product.$id,\n ...(variant.id !== 'default' ? { variantId: variant.id } : {}),\n name: product.name,\n ...(label ? { variantLabel: label } : {}),\n unitAmountCents:\n Math.round(Number(variant.priceUsd) * 100) + (resolved.ok ? resolved.extraCents : 0),\n quantity,\n ...(modifiers.length ? { modifiers } : {}),\n }\n}\n\n/** Same product, variant and choices: the lines that merge into one. */\nfunction lineKey(line: Pick<RegisterLine, 'productId' | 'variantId' | 'modifiers'>): string {\n return `${line.productId}:${line.variantId ?? ''}:${CommerceModel.modifierSelectionKey(line.modifiers)}`\n}\n\n/**\n * The register's zone (AGL-3644), drawn again only when what it is handed\n * changes: the till redraws on every tap, and the shell's renderer is not\n * memoized (the order dialog's reasoning).\n */\nconst PosOrdersZone = memo(function PosOrdersZone(props: {\n renderer: ConsoleWidgetSlotRenderer\n hostId: string\n registerId: string | null\n}) {\n const { renderer: Renderer, hostId, registerId } = props\n return <Renderer slot={POS_ORDERS_ZONE.id} hostId={hostId} orgId={undefined} registerId={registerId} />\n})\n\nexport function PosConsolePage({ hostId, basePath }: ConsolePluginPageProps) {\n const WidgetSlot = useConsoleWidgetSlot()\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const theme = useTheme()\n const wide = useMediaQuery(theme.breakpoints.up('md'))\n\n const [search, setSearch] = useState('')\n // The chip a register opens on is remembered per device: a counter that\n // rings from its quick keys reopens on them.\n const [categoryId, setCategoryIdState] = useState(() => {\n try {\n return window.localStorage.getItem(POS_CATEGORY_KEY) ?? ''\n } catch {\n return ''\n }\n })\n const setCategoryId = useCallback((id: string) => {\n setCategoryIdState(id)\n try {\n window.localStorage.setItem(POS_CATEGORY_KEY, id)\n } catch {\n // Storage blocked: the chip still works for this visit.\n }\n }, [])\n const gridPlan = useMemo(\n () =>\n categoryId === POS_QUICK_KEYS\n ? posProductPlan({ search, quickKeys: true })\n : posProductPlan({ search, categoryId }),\n [search, categoryId],\n )\n const { data: productDocs } = useFirestoreCollection<any>(\n /*\n * The till's grid, narrowed by the QUERY rather than by the rows it\n * happened to fetch (AGL-2501, AGL-2292, AGL-3321): the first five\n * hundred SELLABLE products by name, and a typed name reaches the whole\n * catalog. The scan does not come through here — see `handleSearchEnter`.\n */\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(gridPlan),\n limit(POS_GRID_CEILING),\n ),\n [firestore, hostId, gridPlan],\n { idField: '$id' },\n )\n const { data: categoryDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'productCategories'), limit(30)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'locations'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { org, ready: planReady } = useOrgPlan(hostId)\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n // Only registers within the plan cap can transact (AGL-482), and not until\n // the org doc has arrived (AGL-1064). Per SITE (AGL-1775).\n const registerCap = Aglyn.checkHostRegisterQuota(org, hostId, registers.length).limit\n const withinCap = CommerceModel.registersWithinCap(registers, registerCap)\n const usableRegisters = planReady ? registers.filter((r: any) => withinCap.has(r.$id)) : []\n /*\n * The stays a sale can be charged to, asked for BY STATUS (AGL-3321).\n */\n const { data: reservationDocs } = useFirestoreCollection<any>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'reservations'),\n where('status', '==', 'checked_in'),\n limit(100),\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const openStays = reservationDocs ?? []\n\n const [lines, setLines] = useState<RegisterLine[]>([])\n const [discountPct, setDiscountPct] = useState(0)\n // The customer the lookup attached (AGL-3609); their email is the sale's.\n const [customer, setCustomer] = useState<PosSelectedCustomer | null>(null)\n const customerEmail = customer?.email ?? ''\n const [locationId, setLocationId] = useState('')\n const [registerId, setRegisterId] = useState('')\n useEffect(() => {\n if (registerId || usableRegisters.length === 0) return\n const first = usableRegisters[0]\n setRegisterId(first.$id)\n if (first.locationId) setLocationId(first.locationId)\n }, [usableRegisters, registerId])\n const registerName = String(\n usableRegisters.find((register: any) => register.$id === registerId)?.name ?? '',\n )\n // Who is ringing (AGL-3609): a PIN-switched cashier, and the idle lock.\n const opsSettings = usePosOpsSettings(hostId)\n const cashier = usePosCashier({\n hostId,\n registerId,\n autoLockMinutes: opsSettings.autoLockMinutes,\n })\n // The last completed sale, whose receipt can still be printed (AGL-3609).\n const [lastReceipt, setLastReceipt] = useState<{ orderId: string } | null>(null)\n\n const [context, setContext] = useState<PosRegisterContext | null>(null)\n // Keyed on the uid, not the user object: a session refresh hands back a\n // new object for the same person, and re-reading the context on every one\n // would re-render the register in a loop.\n const userRef = useRef(user)\n userRef.current = user\n const uid = user?.uid ?? ''\n useEffect(() => {\n const signedIn = userRef.current\n if (!signedIn) return\n let active = true\n posRegisterContext(signedIn, hostId)\n .then((answer) => {\n // Only a whole answer: a register that half-knows its tenders would\n // offer one the server then refuses.\n if (active && answer?.settings && answer?.terminal) setContext(answer)\n })\n .catch(() => undefined)\n return () => {\n active = false\n }\n }, [uid, hostId])\n\n /** The open sale, once the basket has been priced and payment started. */\n const [sale, setSale] = useState<PosSaleSummary | null>(null)\n const [saleLines, setSaleLines] = useState<RegisterLine[]>([])\n const [opening, setOpening] = useState(false)\n const [sheetOpen, setSheetOpen] = useState(false)\n const display = usePosDisplay(user, hostId, registerId)\n\n /**\n * One key per basket (AGL-1691): minted on the first Charge and retired\n * whenever the basket changes, so a retried Charge finds the same sale and\n * ringing the same coffee twice is two sales.\n */\n const attemptKey = useRef('')\n const fill = useViewportFill({ min: 480 })\n useEffect(() => {\n attemptKey.current = ''\n }, [lines, discountPct])\n\n const products = useMemo(\n () =>\n [...(productDocs ?? [])].map((product: any) => ({\n ...CommerceModel.liftLegacyProduct(product),\n $id: product.$id,\n })),\n [productDocs],\n )\n /*\n * THE OFFLINE REGISTER (AGL-3625): the catalog and the site's offline rules\n * kept on this device, the queue of cash sales rung without a connection,\n * and the sync that records them once it returns.\n */\n const loadCatalog = useCallback(\n async () =>\n (\n await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(posProductPlan({})),\n limit(POS_GRID_CEILING),\n ),\n )\n ).docs.map((snapshot) => ({ ...(snapshot.data() as Record<string, unknown>), $id: snapshot.id })),\n [firestore, hostId],\n )\n const liveRegister = usableRegisters.find((register: any) => register.$id === registerId)\n const offline = usePosOffline({\n hostId,\n user,\n registerId,\n openShiftId: liveRegister ? (liveRegister.openShiftId ?? null) : undefined,\n locationId,\n ...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {}),\n liveProducts: products,\n loadCatalog,\n })\n const [offlineCheckout, setOfflineCheckout] = useState(false)\n /** Open sales left unpaid when the connection dropped, voided once it returns. */\n const strandedSales = useRef<string[]>([])\n useEffect(() => {\n if (offline.offline || !user || !strandedSales.current.length) return\n const orderIds = strandedSales.current.splice(0)\n for (const orderId of orderIds) {\n void posTender(user, hostId, orderId, 'void').catch(() => undefined)\n }\n }, [offline.offline, user, hostId])\n const sellProducts = useMemo(\n () => (offline.offline && offline.ready ? offline.gridProducts(search, categoryId, POS_QUICK_KEYS) : products),\n [offline, search, categoryId, products],\n )\n const productsById = useMemo(\n () => new Map<string, any>(sellProducts.map((product: any) => [product.$id, product] as const)),\n [sellProducts],\n )\n /** AGL-2357: warns, never blocks. */\n const shortfalls = useMemo(\n () =>\n lines.map((line) => {\n const product: any = productsById.get(line.productId)\n if (!product) return null\n return CommerceModel.stockShortfall(\n product,\n line.variantId ?? product.variants?.[0]?.id,\n line.quantity,\n )\n }),\n [lines, productsById],\n )\n\n const itemsCents = lines.reduce((sum, line) => sum + line.unitAmountCents * line.quantity, 0)\n const discountCents = Math.round((itemsCents * discountPct) / 100)\n const estimateCents = itemsCents - discountCents\n const units = lines.reduce((sum, line) => sum + line.quantity, 0)\n\n const notify = useCallback(\n (message: string, variant: 'success' | 'error' | 'warning' | 'info') => {\n enqueueSnackbar(message, { variant, persist: false, allowDuplicate: true })\n },\n [enqueueSnackbar],\n )\n\n /**\n * A pairing code for a customer display or a self-service kiosk (AGL-3623),\n * through the same flow the POS devices card offers (AGL-3712).\n */\n const onPairingError = useCallback((message: string) => notify(message, 'error'), [notify])\n const pairingFlow = usePosPairing({ user, hostId, onError: onPairingError })\n\n /**\n * Adds a line, or more of an identical one: the same product, variant and\n * modifiers merge, so two oat lattes are one line of two and an oat latte\n * beside a whole-milk one stays two lines.\n */\n const addProduct = useCallback(\n (product: any, variant?: any, modifiers: CommerceModel.ModifierSelection[] = [], quantity = 1) => {\n const next = registerLineFor(product, {\n variant: variant ?? product.variants[0],\n modifiers,\n quantity,\n })\n setLines((prev) => {\n const existing = prev.find((line) => lineKey(line) === lineKey(next))\n if (existing) {\n return prev.map((line) =>\n line === existing\n ? { ...line, quantity: Math.min(99, line.quantity + next.quantity) }\n : line,\n )\n }\n return [...prev, next]\n })\n },\n [],\n )\n\n /** The item sheet: a product to add, or a basket line to change. */\n const [itemSheet, setItemSheet] = useState<{\n product: any\n editIndex?: number\n initial?: { variantId?: string; modifiers?: CommerceModel.ModifierSelection[]; quantity: number }\n } | null>(null)\n // Every product rung up this sale, so a line can be reopened after the\n // grid has moved on to another category or search.\n const productCache = useRef(new Map<string, any>())\n const tapProduct = useCallback(\n (product: any, variant?: any) => {\n productCache.current.set(product.$id, product)\n if (posItemNeedsChoice(product) && !(variant && CommerceModel.productModifierGroups(product).length === 0)) {\n setItemSheet({\n product,\n ...(variant ? { initial: { variantId: variant.id, quantity: 1 } } : {}),\n })\n return\n }\n addProduct(product, variant)\n },\n [addProduct],\n )\n const basketCounts = useMemo(() => {\n const counts = new Map<string, number>()\n for (const line of lines) counts.set(line.productId, (counts.get(line.productId) ?? 0) + line.quantity)\n return counts\n }, [lines])\n\n /**\n * The barcode wedge: a LOOKUP against the whole catalog (AGL-2501),\n * barcode first, and a miss says so.\n */\n const lookupCode = useCallback(async (scanned: string) => {\n const needle = scanned.trim().toLowerCase()\n if (!needle || sale) return\n if (offline.offline) {\n const found = offline.findByCode(needle)\n if (!found) return void notify(`No product matches “${scanned.trim()}”`, 'warning')\n tapProduct(found.product, found.variant)\n setSearch('')\n return\n }\n const lookup = async (field: 'barcodes' | 'skus') => {\n const found = await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(posProductPlan({ code: { field, value: needle } })),\n limit(1),\n ),\n )\n return found.docs[0]\n }\n let hit: Awaited<ReturnType<typeof lookup>>\n try {\n hit = (await lookup('barcodes')) ?? (await lookup('skus'))\n } catch (error) {\n console.error(error)\n offline.reportNetworkFailure()\n return void notify('Could not reach the catalog — try again', 'warning')\n }\n if (!hit) return void notify(`No product matches “${scanned.trim()}”`, 'warning')\n const product = { ...CommerceModel.liftLegacyProduct(hit.data() as any), $id: hit.id }\n const variant =\n product.variants.find(\n (item: any) =>\n item.barcode?.trim().toLowerCase() === needle || item.sku?.trim().toLowerCase() === needle,\n ) ?? product.variants[0]\n // A scanned variant is the variant; a product with modifiers still asks\n // for them, with that variant already picked.\n tapProduct(product, variant)\n setSearch('')\n }, [sale, firestore, hostId, tapProduct, notify, offline])\n const handleSearchEnter = useCallback(() => lookupCode(search), [lookupCode, search])\n // A scanner fired while focus is on a product or a button (AGL-3619), and\n // the camera; neither while a sale is taking payment or an item is open.\n useScannerWedge((code) => void lookupCode(code), !sale && !itemSheet)\n const scanAdornment = useMemo(\n () => <ScanAdornment label=\"Scan a barcode with the camera\" onScan={(code) => void lookupCode(code)} />,\n [lookupCode],\n )\n\n /** Prices the basket on the server and opens the sale for payment. */\n // A ref, not `opening`: two taps inside one React batch both read the\n // pre-click state, and only a ref is written before the second reads it\n // (the AGL-1682 lesson).\n const chargeInFlight = useRef(false)\n const charge = useCallback(async () => {\n if (chargeInFlight.current || lines.length === 0 || !user) return\n if (!registerId) return void notify('Select a register before taking payment', 'warning')\n // Offline, the basket rings as a cash sale kept on this register (AGL-3625).\n if (offline.offline) {\n if (!offline.ready) return void notify(offline.unavailableReason ?? 'Offline selling is unavailable', 'warning')\n setOfflineCheckout(true)\n return\n }\n if (!attemptKey.current) attemptKey.current = newAttemptKey()\n chargeInFlight.current = true\n setOpening(true)\n try {\n const opened = await openPosSale(user, attemptKey.current, {\n hostId,\n registerId,\n lines,\n discountPct,\n ...(customerEmail ? { customerEmail } : {}),\n ...(customer ? { customer } : {}),\n ...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {}),\n ...(locationId ? { locationId } : {}),\n })\n setSaleLines(lines)\n setSale({\n orderId: opened.orderId,\n status: 'pending',\n totalCents: opened.totals.totalCents,\n paidCents: 0,\n dueCents: opened.totals.totalCents,\n tenderableCents: opened.totals.totalCents,\n tipCents: 0,\n payments: [],\n })\n setSheetOpen(true)\n } catch (error) {\n if (error instanceof PosRequestError) {\n notify(error.message, 'error')\n } else {\n // The request never reached the server: the register is offline.\n offline.reportNetworkFailure()\n notify('The register lost its connection. Charge again to take cash offline.', 'warning')\n }\n } finally {\n chargeInFlight.current = false\n setOpening(false)\n }\n }, [lines, user, registerId, hostId, discountPct, customerEmail, customer, cashier.assertion, locationId, notify, offline])\n\n const resetSale = useCallback(() => {\n if (sale?.status === 'paid') setLastReceipt({ orderId: sale.orderId })\n setSale(null)\n setSaleLines([])\n setLines([])\n setDiscountPct(0)\n setCustomer(null)\n setSheetOpen(false)\n }, [sale])\n\n // The customer display mirrors the basket while nothing else is on it.\n const mirrored = sale ? saleLines : lines\n // Whether the display was last left showing a basket. A paid sale leaves it\n // on the thank-you the server wrote, which an empty new basket must not\n // cut short with the idle screen; the next item added takes it over.\n // True at first, so a register that opens empty clears whatever a previous\n // session left on the screen.\n const displayShowsBasket = useRef(true)\n // The tip picked for the payment about to be taken; the ledger has it only\n // once that payment is recorded. Gone with the sale.\n const [pendingTipCents, setPendingTipCents] = useState(0)\n useEffect(() => {\n if (!sale || sale.status === 'paid') setPendingTipCents(0)\n }, [sale])\n useEffect(() => {\n if (sale?.status === 'paid') displayShowsBasket.current = false\n }, [sale?.status])\n useEffect(() => {\n if (!display.connected || display.asking) return\n if (sale?.payments.some((payment) => payment.status === 'pending' && payment.method === 'card_present')) {\n return\n }\n if (sale?.status === 'paid') return\n if (!mirrored.length && !displayShowsBasket.current) return\n const timer = setTimeout(() => {\n displayShowsBasket.current = mirrored.length > 0\n void display.show(\n mirrored.length\n ? {\n mode: 'cart',\n cart: {\n lines: mirrored.map((line) => ({\n name: line.name,\n ...(line.variantLabel ? { variantLabel: line.variantLabel } : {}),\n quantity: line.quantity,\n amountCents: line.unitAmountCents * line.quantity,\n })),\n itemsCents,\n discountCents,\n taxCents: sale ? Math.max(0, sale.totalCents - estimateCents) : 0,\n totalCents: sale ? sale.totalCents : estimateCents,\n ...(sale\n ? {\n paidCents: sale.paidCents,\n dueCents: sale.dueCents,\n tipCents: posDisplayTipCents(sale, pendingTipCents),\n }\n : {}),\n },\n }\n : { mode: 'idle' },\n )\n }, 400)\n return () => clearTimeout(timer)\n }, [display, mirrored, sale, itemsCents, discountCents, estimateCents, pendingTipCents])\n\n const registersHref = posRegistersSettingsHref(basePath)\n const registerPicker = !planReady ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Checking your plan…'}\n </Typography>\n ) : usableRegisters.length === 0 ? (\n registers.length > 0 ? (\n <Typography variant=\"body2\" color=\"warning.main\">\n {'Your registers exceed your plan — remove extras or upgrade in Billing to take payments.'}\n </Typography>\n ) : (\n // A way there, not a path to follow by hand (AGL-3712).\n <Stack spacing={1} sx={{ alignItems: 'flex-start' }}>\n <Typography variant=\"body2\" color=\"warning.main\">\n {'No POS register yet. Add one before taking payments.'}\n </Typography>\n {registersHref ? (\n <Button size=\"small\" variant=\"outlined\" href={registersHref}>\n {'Add a register'}\n </Button>\n ) : null}\n </Stack>\n )\n ) : usableRegisters.length > 1 ? (\n <TextField\n label=\"Register\"\n value={registerId}\n onChange={(event) => setRegisterId(event.target.value)}\n size=\"small\"\n select\n disabled={Boolean(sale)}\n >\n {usableRegisters.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {usableRegisters[0]?.name}\n </Typography>\n )\n\n /**\n * On a narrow screen the register's bar owns the bottom edge, so it moves\n * the console's floating launchers clear of itself through the shell's\n * `--aglyn-dock-inset-bottom` seam; a launcher left in the corner sat on\n * top of Charge.\n */\n const bottomBarRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n const node = bottomBarRef.current\n if (wide || !node) return undefined\n const root = document.documentElement\n const property = '--aglyn-dock-inset-bottom'\n const publish = () => {\n root.style.setProperty(property, `${Math.round(node.getBoundingClientRect().height) + 20}px`)\n }\n publish()\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(publish)\n observer?.observe(node)\n return () => {\n observer?.disconnect()\n root.style.removeProperty(property)\n }\n }, [wide])\n\n const registerPanel = (\n <Stack spacing={1.5} sx={{ minHeight: 0, flex: 1 }}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"h6\" sx={{ flex: 1 }}>\n {'Register'}\n </Typography>\n {registerId ? (\n <Button\n size=\"small\"\n onClick={() => void pairingFlow.open(registerId, 'display')}\n >\n {display.connected ? 'Display connected' : 'Pair display'}\n </Button>\n ) : null}\n </Stack>\n {registerPicker}\n {(locationDocs?.length ?? 0) > 1 ? (\n <TextField\n label=\"Location\"\n value={locationId}\n onChange={(event) => setLocationId(event.target.value)}\n size=\"small\"\n select\n disabled={Boolean(sale)}\n >\n {(locationDocs ?? []).map((location: any) => (\n <MenuItem key={location.$id} value={location.$id}>\n {location.name}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {registerId ? (\n <PosOperationsBar\n hostId={hostId}\n registerId={registerId}\n {...(registerName ? { registerName } : {})}\n cashier={cashier}\n onExchange={(returned) =>\n setCustomer(\n returned.email || returned.name\n ? { kind: 'none', id: '', name: returned.name ?? '', email: returned.email, phone: null }\n : null,\n )\n }\n />\n ) : null}\n <PosCartPanel\n lines={sale ? saleLines : lines}\n shortfalls={sale ? [] : shortfalls}\n onQuantity={(index, quantity) =>\n setLines((prev) =>\n quantity <= 0\n ? prev.filter((_line, at) => at !== index)\n : prev.map((line, at) => (at === index ? { ...line, quantity: Math.min(99, quantity) } : line)),\n )\n }\n onRemove={(index) => setLines((prev) => prev.filter((_line, at) => at !== index))}\n onEdit={(index) => {\n const line = lines[index]\n const product = line\n ? (productCache.current.get(line.productId) ?? productsById.get(line.productId))\n : undefined\n if (!line || !product) return\n setItemSheet({\n product,\n editIndex: index,\n initial: {\n ...(line.variantId ? { variantId: line.variantId } : {}),\n ...(line.modifiers ? { modifiers: line.modifiers } : {}),\n quantity: line.quantity,\n },\n })\n }}\n discountPct={discountPct}\n onDiscountPct={setDiscountPct}\n customer={\n sale ? null : (\n <PosCustomerLookup\n hostId={hostId}\n value={customer}\n onChange={setCustomer}\n registerId={registerId}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n />\n )\n }\n locked={Boolean(sale)}\n />\n {sale && user ? (\n sale.status === 'paid' ? (\n <PosReceiptPanel\n user={user}\n hostId={hostId}\n sale={sale}\n context={context}\n display={display}\n onNewSale={resetSale}\n registerId={registerId}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n notify={notify}\n />\n ) : (\n <PosTenderPanel\n user={user}\n hostId={hostId}\n registerId={registerId}\n sale={sale}\n context={context}\n stays={openStays}\n display={display}\n onSale={setSale}\n onVoided={() => {\n setSale(null)\n setSaleLines([])\n }}\n onTipChange={setPendingTipCents}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n notify={notify}\n offline={offline.offline}\n {...(offline.ready\n ? {\n onSellOffline: () => {\n // The server's open sale took no payment; it is voided once\n // the connection returns, and the basket rings offline.\n strandedSales.current.push(sale.orderId)\n setSale(null)\n setSaleLines([])\n setOfflineCheckout(true)\n },\n }\n : {})}\n />\n )\n ) : (\n <>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <Typography variant=\"h6\">{'Due'}</Typography>\n <Typography variant=\"h6\">{usd(estimateCents)}</Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Tax is added when you charge.'}\n </Typography>\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={opening || lines.length === 0 || !registerId}\n onClick={() => void charge()}\n sx={{ minHeight: 56 }}\n >\n {opening\n ? 'Pricing…'\n : offline.offline\n ? `Cash ${usd(offline.totalsFor(lines, discountPct)?.totalCents ?? estimateCents)} (offline)`\n : `Charge ${usd(estimateCents)}`}\n </Button>\n {lastReceipt ? (\n <PosLastReceipt\n hostId={hostId}\n orderId={lastReceipt.orderId}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n />\n ) : null}\n </>\n )}\n </Stack>\n )\n\n return (\n <>\n <NextPageTitle screen={'POS'} />\n <Box\n ref={fill.ref}\n sx={{\n display: 'flex',\n // From under the console's header, nav and page title down to\n // where the page's padding and footer begin, so the whole page fits\n // the window (AGL-3679, AGL-3710).\n height: fill.height,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ flex: 1, p: 2, overflowY: 'auto', pb: wide ? 2 : 12 }}>\n <Box sx={{ mb: 2, '&:empty': { display: 'none' } }}>\n <PosOfflineBanner offline={offline} />\n </Box>\n {/* \"Pay at counter\" orders from this register's kiosks (AGL-3623). */}\n {registerId ? (\n <PosKioskQueue\n user={user}\n hostId={hostId}\n registerId={registerId}\n disabled={Boolean(sale)}\n onTake={(next, nextLines) => {\n setSaleLines(nextLines)\n setSale(next)\n setSheetOpen(true)\n }}\n notify={notify}\n />\n ) : null}\n {/* Orders other channels send to the counter (AGL-3644). */}\n {WidgetSlot ? <PosOrdersZone renderer={WidgetSlot} hostId={hostId} registerId={registerId || null} /> : null}\n <PosProductGrid\n search={search}\n onSearch={setSearch}\n onSearchEnter={() => void handleSearchEnter()}\n scanAdornment={scanAdornment}\n categories={(categoryDocs ?? []).map((category: any) => ({\n $id: category.$id,\n name: String(category.name ?? 'Category'),\n }))}\n categoryId={categoryId}\n onCategory={setCategoryId}\n notices={gridPlan.notices}\n hostId={hostId}\n products={sellProducts}\n basketCounts={basketCounts}\n onTap={(product) => {\n if (sale) return void notify('Finish or void the open sale first', 'info')\n tapProduct(product)\n }}\n />\n </Box>\n {wide ? (\n <Box\n sx={{\n width: { md: 400, lg: 440 },\n borderLeft: 1,\n borderColor: 'divider',\n display: 'flex',\n flexDirection: 'column',\n p: 2,\n overflowY: 'auto',\n }}\n >\n {registerPanel}\n </Box>\n ) : null}\n </Box>\n {!wide ? (\n <>\n <Box\n ref={bottomBarRef}\n sx={{\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n p: 1.5,\n bgcolor: 'background.paper',\n borderTop: 1,\n borderColor: 'divider',\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n zIndex: theme.zIndex.appBar,\n }}\n >\n <Badge badgeContent={units} color=\"primary\">\n <Button\n variant=\"outlined\"\n onClick={() => setSheetOpen(true)}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {sale ? 'Payment' : 'Cart'}\n </Button>\n </Badge>\n <Typography variant=\"h6\" sx={{ flex: 1, textAlign: 'right' }}>\n {usd(sale ? sale.dueCents : estimateCents)}\n </Typography>\n {!sale ? (\n <Button\n variant=\"contained\"\n disabled={opening || lines.length === 0 || !registerId}\n onClick={() => void charge()}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {'Charge'}\n </Button>\n ) : null}\n </Box>\n <Drawer\n anchor=\"bottom\"\n open={sheetOpen}\n onClose={() => setSheetOpen(false)}\n slotProps={{ paper: { sx: { maxHeight: '90dvh', p: 2, borderTopLeftRadius: 16, borderTopRightRadius: 16 } } }}\n >\n {registerPanel}\n </Drawer>\n </>\n ) : null}\n <PosItemDialog\n product={itemSheet?.product ?? null}\n initial={itemSheet?.initial}\n onClose={() => setItemSheet(null)}\n onConfirm={(choice) => {\n const sheet = itemSheet\n setItemSheet(null)\n if (!sheet) return\n if (sheet.editIndex === undefined) {\n addProduct(sheet.product, choice.variant, choice.modifiers, choice.quantity)\n return\n }\n const at = sheet.editIndex\n setLines((prev) =>\n prev.map((line, index) => (index === at ? registerLineFor(sheet.product, choice) : line)),\n )\n }}\n {...(itemSheet?.editIndex !== undefined\n ? {\n onRemove: () => {\n const at = itemSheet.editIndex\n setItemSheet(null)\n setLines((prev) => prev.filter((_line, index) => index !== at))\n },\n }\n : {})}\n />\n <PosOfflineCheckout\n open={offlineCheckout}\n offline={offline}\n hostId={hostId}\n lines={lines}\n discountPct={discountPct}\n customer={customer}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n onClose={() => setOfflineCheckout(false)}\n onRung={() => undefined}\n onDone={() => {\n setOfflineCheckout(false)\n setLines([])\n setDiscountPct(0)\n setCustomer(null)\n setSheetOpen(false)\n }}\n />\n {pairingFlow.dialog}\n </>\n )\n}\nPosConsolePage.displayName = 'PosConsolePage'\n\nexport default PosConsolePage\n"],"names":["Aglyn","CommerceModel","PRODUCT_LIST_BASE","PRODUCT_LIST_QUERY","NextPageTitle","useSnackbar","planListQuery","useViewportFill","nameSearchNormalizers","Badge","Box","Button","Drawer","MenuItem","Stack","TextField","Typography","useMediaQuery","useTheme","collection","getDocs","limit","query","where","memo","useCallback","useEffect","useMemo","useRef","useState","useFirestore","useUser","useFirestoreCollection","listQueryConstraints","useOrgPlan","newAttemptKey","openPosSale","posRegisterContext","posTender","PosRequestError","usd","PosCartPanel","ScanAdornment","useScannerWedge","PosCustomerLookup","PosLastReceipt","PosOperationsBar","usePosCashier","usePosOpsSettings","POS_QUICK_KEYS","POS_TOUCH_PX","PosProductGrid","PosItemDialog","posItemNeedsChoice","PosReceiptPanel","PosTenderPanel","PosKioskQueue","posDisplayTipCents","usePosDisplay","posRegistersSettingsHref","usePosPairing","useConsoleWidgetSlot","POS_ORDERS_ZONE","PosOfflineBanner","PosOfflineCheckout","usePosOffline","SELLABLE","field","op","value","POS_GRID_CEILING","posProductPlan","options","typed","search","trim","plan","POS_GRID_QUERY","base","clauses","code","categoryId","quickKeys","filters","path","fields","column","kind","tokensPath","operators","POS_CATEGORY_KEY","registerLineFor","product","choice","variant","modifiers","quantity","resolved","resolveLineModifiers","picked","ok","label","lineLabelWithModifiers","Object","keys","length","values","join","undefined","productId","$id","id","variantId","name","variantLabel","unitAmountCents","Math","round","Number","priceUsd","extraCents","lineKey","line","modifierSelectionKey","PosOrdersZone","props","renderer","Renderer","hostId","registerId","slot","orgId","PosConsolePage","basePath","liveRegister","usableRegisters","offline","WidgetSlot","firestore","data","user","enqueueSnackbar","theme","wide","breakpoints","up","setSearch","setCategoryIdState","window","localStorage","getItem","setCategoryId","setItem","gridPlan","productDocs","idField","categoryDocs","locationDocs","registerDocs","org","ready","planReady","registers","sort","a","b","String","localeCompare","registerCap","checkHostRegisterQuota","withinCap","registersWithinCap","filter","r","has","reservationDocs","openStays","lines","setLines","discountPct","setDiscountPct","customer","setCustomer","customerEmail","email","locationId","setLocationId","setRegisterId","first","registerName","find","register","opsSettings","cashier","autoLockMinutes","lastReceipt","setLastReceipt","context","setContext","userRef","current","uid","signedIn","active","then","answer","settings","terminal","catch","sale","setSale","saleLines","setSaleLines","opening","setOpening","sheetOpen","setSheetOpen","display","attemptKey","fill","min","products","map","liftLegacyProduct","loadCatalog","docs","snapshot","openShiftId","assertion","cashierAssertion","liveProducts","offlineCheckout","setOfflineCheckout","strandedSales","orderIds","splice","orderId","sellProducts","gridProducts","productsById","Map","shortfalls","get","stockShortfall","variants","itemsCents","reduce","sum","discountCents","estimateCents","units","notify","message","persist","allowDuplicate","onPairingError","pairingFlow","onError","addProduct","next","prev","existing","itemSheet","setItemSheet","productCache","tapProduct","set","productModifierGroups","initial","basketCounts","counts","lookupCode","scanned","needle","toLowerCase","found","findByCode","lookup","hit","error","console","reportNetworkFailure","item","barcode","sku","handleSearchEnter","scanAdornment","onScan","chargeInFlight","charge","unavailableReason","opened","status","totalCents","totals","paidCents","dueCents","tenderableCents","tipCents","payments","resetSale","mirrored","displayShowsBasket","pendingTipCents","setPendingTipCents","connected","asking","some","payment","method","timer","setTimeout","show","mode","cart","amountCents","taxCents","max","clearTimeout","registersHref","registerPicker","color","spacing","sx","alignItems","size","href","onChange","event","target","select","disabled","Boolean","bottomBarRef","node","root","document","documentElement","property","publish","style","setProperty","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","removeProperty","registerPanel","minHeight","flex","direction","onClick","open","location","onExchange","returned","phone","onQuantity","index","_line","at","onRemove","onEdit","editIndex","onDiscountPct","locked","onNewSale","cashierName","stays","onSale","onVoided","onTipChange","onSellOffline","push","justifyContent","totalsFor","screen","ref","overflow","p","overflowY","pb","mb","onTake","nextLines","onSearch","onSearchEnter","categories","category","onCategory","notices","onTap","width","md","lg","borderLeft","borderColor","flexDirection","position","left","right","bottom","bgcolor","borderTop","gap","zIndex","appBar","badgeContent","textAlign","anchor","onClose","slotProps","paper","maxHeight","borderTopLeftRadius","borderTopRightRadius","onConfirm","sheet","onRung","onDone","dialog","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-page.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport type { ConsolePluginPageProps } from '@aglyn/aglyn'\nimport * as CommerceModel from '../../model'\nimport { posPermissionRefusal, type PosPermission } from '../../model/plugin-permissions'\nimport {\n PRODUCT_LIST_BASE,\n PRODUCT_LIST_QUERY,\n} from '../../constants/product-list-query'\nimport { NextPageTitle } from '@aglyn/shared-ui-next/contexts/next-page-title-provider'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport type { ListFilterRequest } from '@aglyn/shared-ui-jsx/const/list-filter'\nimport { planListQuery } from '@aglyn/shared-ui-jsx/const/list-query-plan'\nimport { useViewportFill } from '@aglyn/shared-ui-jsx/hooks/use-viewport-fill'\nimport { nameSearchNormalizers } from '@aglyn/aglyn/app-utils/name-search'\nimport {\n Badge,\n Box,\n Button,\n Drawer,\n MenuItem,\n Stack,\n TextField,\n Typography,\n useMediaQuery,\n useTheme,\n} from '@mui/material'\nimport {\n collection,\n getDocs,\n limit,\n query,\n where,\n} from 'firebase/firestore'\nimport { lazy, memo, Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFirestore, useUser } from '@aglyn/tenant-feature-instance'\nimport { useFirestoreCollection } from '@aglyn/tenant-feature-instance'\nimport { listQueryConstraints } from '@aglyn/tenant-feature-instance/hooks/use-list-query'\nimport { useOrgPlan } from '@aglyn/tenant-feature-instance'\nimport {\n newAttemptKey,\n openPosSale,\n posRegisterContext,\n posTender,\n PosRequestError,\n usd,\n type PosRegisterContext,\n type PosSaleSummary,\n} from './pos/pos-api'\nimport { PosCartPanel, type RegisterLine } from './pos/pos-cart-panel.component'\nimport { ScanAdornment } from '../../barcode/scan-button.component'\nimport { useScannerWedge } from '../../barcode/scanner-wedge'\nimport {\n PosCustomerLookup,\n PosLastReceipt,\n PosOperationsBar,\n usePosCashier,\n usePosOpsSettings,\n type PosSelectedCustomer,\n} from './pos-ops/register-ops'\nimport { POS_QUICK_KEYS, POS_TOUCH_PX, PosProductGrid } from './pos/pos-product-grid.component'\nimport { PosItemDialog, posItemNeedsChoice, type PosItemChoice } from './pos/pos-item-dialog.component'\nimport { PosReceiptPanel } from './pos/pos-receipt-panel.component'\nimport { PosTenderPanel } from './pos/pos-tender-panel.component'\nimport { PosKioskQueue } from './pos/pos-kiosk-queue.component'\nimport { posDisplayTipCents, usePosDisplay } from './pos/use-pos-display'\nimport { posRegistersSettingsHref, usePosPairing } from './pos/pos-pairing.component'\nimport {\n type ConsoleWidgetSlotRenderer,\n useConsoleWidgetSlot,\n} from '@aglyn/aglyn/app-utils/console-widget-slot-context'\nimport { POS_ORDERS_ZONE } from './pos-zones'\nimport { isPosHardwareSkuId } from '../../model/pos-hardware'\n\n/**\n * Card reader sales at the platform's own store (AGL-4038): attaching the\n * buyer and the To attach list. Its own chunk, and it draws nothing on any\n * store but that one.\n */\nconst PosHardwareBuyer = lazy(() => import('./pos/pos-hardware-buyer.component'))\nimport { PosOfflineBanner, PosOfflineCheckout, usePosOffline } from './pos-offline/register-offline'\n\n/** The till sells active products only; every read of the catalog asks it. */\nconst SELLABLE: ListFilterRequest = { field: 'status', op: 'equals', value: 'active' }\n\n/**\n * How many products the till's grid shows. The grid is a picker, not the\n * catalog: typing narrows it on the query, so a name reaches every product.\n */\nconst POS_GRID_CEILING = 500\n\n/**\n * The products hub's query (AGL-3321), narrowed to what the till may sell:\n * live products (`deletedAt == null`, the list's scope), `status == active`,\n * and any typed word as the search on `nameTokens` — or, for a scan, the\n * whole scanned code as a SKU or barcode clause. Every shape is one the hub's\n * composites already serve.\n */\nexport function posProductPlan(options: {\n search?: string\n code?: { field: 'barcodes' | 'skus'; value: string }\n /** A category chip (AGL-3607): served by the storefront's own composite. */\n categoryId?: string\n /** The Quick keys chip (AGL-3607): products marked `posQuickKey`. */\n quickKeys?: boolean\n}) {\n const typed = options.search?.trim()\n const plan = planListQuery(\n POS_GRID_QUERY,\n {\n base: PRODUCT_LIST_BASE,\n clauses: [\n SELLABLE,\n ...(options.code\n ? [{ field: options.code.field, op: 'contains', value: options.code.value }]\n : []),\n ...(options.categoryId\n ? [{ field: 'categoryIds', op: 'contains', value: options.categoryId }]\n : []),\n ],\n // A chip and a typed word are both array clauses, and Firestore takes\n // one: with a chip on, the word narrows by name prefix instead.\n search: typed && !options.categoryId ? [typed] : [],\n },\n nameSearchNormalizers,\n )\n // The Quick keys chip (AGL-3607) is a boolean equality the list planner\n // does not model, added beside the scope and status it composes with —\n // `deletedAt ==, status ==, posQuickKey ==, nameLower ASC` is declared in\n // the index file. A typed word searches the whole catalog instead: a\n // cashier who types is looking past the quick keys.\n if (options.quickKeys && !typed && !options.code) {\n return {\n ...plan,\n filters: [...plan.filters, { path: 'posQuickKey', op: '==', value: true }],\n } as typeof plan\n }\n return plan\n}\n\n/**\n * The grid's query: the products hub's, plus the category a chip picks\n * (AGL-3607). `categoryIds CONTAINS, nameLower ASC` is a composite the\n * storefront catalog already declares.\n */\nexport const POS_GRID_QUERY = {\n ...PRODUCT_LIST_QUERY,\n fields: [\n ...PRODUCT_LIST_QUERY.fields,\n {\n column: 'categoryIds',\n kind: 'exact' as const,\n path: 'categoryIds',\n tokensPath: 'categoryIds',\n operators: ['contains'],\n },\n ],\n} as typeof PRODUCT_LIST_QUERY\n\n/**\n * POS register (AGL-312, AGL-3607): a tablet-first sale surface — the\n * product grid with search, scan and category chips, the basket, and a\n * tender panel that takes one or more payments against an open sale (cash,\n * card reader, a native Tap to Pay bridge, a typed card, the QR link, gift\n * cards and room charges) until the balance is zero. A paired customer\n * display mirrors the basket and takes the tip and the receipt (AGL-3608).\n *\n * On a wide screen (900px and up) the grid and the register sit side by\n * side; below that the register is a bottom sheet behind a sticky total bar.\n */\n/*\n * `managePos` is NOT read here. The nav item in `plugin.ts` declares it and\n * the shell refuses the route before this component is constructed, so a\n * reader without the key never reaches this file and there is no unpermitted\n * state for it to render — the same arrangement the entitlement gate has.\n *\n * Re-adding a check off the `permissions` prop would be a second answer to a\n * settled question, and a laxer one: a prop absent because the map has not\n * landed reads as permitted here, while the shell holds the route on that\n * same condition rather than guessing. The server routes remain the\n * enforcement point for every sale and every payment.\n */\n/** Where a register device remembers the category chip it was left on. */\nconst POS_CATEGORY_KEY = 'aglyn.pos.category'\n\n/** The basket line an item-sheet choice makes: label and estimate from the product. */\nexport function registerLineFor(\n product: any,\n choice: PosItemChoice,\n): RegisterLine {\n const { variant, modifiers, quantity } = choice\n const resolved = CommerceModel.resolveLineModifiers(product, modifiers)\n const picked = resolved.ok ? resolved.modifiers : []\n const label = CommerceModel.lineLabelWithModifiers(\n Object.keys(variant.options ?? {}).length\n ? Object.values(variant.options ?? {}).join(' / ')\n : undefined,\n picked,\n )\n return {\n productId: product.$id,\n ...(variant.id !== 'default' ? { variantId: variant.id } : {}),\n name: product.name,\n ...(label ? { variantLabel: label } : {}),\n unitAmountCents:\n Math.round(Number(variant.priceUsd) * 100) + (resolved.ok ? resolved.extraCents : 0),\n quantity,\n ...(modifiers.length ? { modifiers } : {}),\n }\n}\n\n/** Same product, variant and choices: the lines that merge into one. */\nfunction lineKey(line: Pick<RegisterLine, 'productId' | 'variantId' | 'modifiers'>): string {\n return `${line.productId}:${line.variantId ?? ''}:${CommerceModel.modifierSelectionKey(line.modifiers)}`\n}\n\n/**\n * The register's zone (AGL-3644), drawn again only when what it is handed\n * changes: the till redraws on every tap, and the shell's renderer is not\n * memoized (the order dialog's reasoning).\n */\nconst PosOrdersZone = memo(function PosOrdersZone(props: {\n renderer: ConsoleWidgetSlotRenderer\n hostId: string\n registerId: string | null\n}) {\n const { renderer: Renderer, hostId, registerId } = props\n return <Renderer slot={POS_ORDERS_ZONE.id} hostId={hostId} orgId={undefined} registerId={registerId} />\n})\n\nexport function PosConsolePage({ hostId, basePath, permissions }: ConsolePluginPageProps) {\n /*\n * The register's FINER keys (AGL-4047) — discounts, returns, the drawer —\n * are read here, unlike `managePos` above: the shell admits anyone who may\n * use the register, and these say which of its controls are theirs. Only an\n * explicit refusal disables one; a map without the key follows `managePos`,\n * which the shell already confirmed. The routes refuse either way.\n */\n const refusedReason = (key: PosPermission): string | undefined =>\n permissions?.[key] === false ? posPermissionRefusal(key) : undefined\n const blockedControls = {\n returns: refusedReason('posRefund'),\n shift: refusedReason('posCashDrawer'),\n }\n const discountBlocked = refusedReason('posDiscount')\n const WidgetSlot = useConsoleWidgetSlot()\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const theme = useTheme()\n const wide = useMediaQuery(theme.breakpoints.up('md'))\n\n const [search, setSearch] = useState('')\n // The chip a register opens on is remembered per device: a counter that\n // rings from its quick keys reopens on them.\n const [categoryId, setCategoryIdState] = useState(() => {\n try {\n return window.localStorage.getItem(POS_CATEGORY_KEY) ?? ''\n } catch {\n return ''\n }\n })\n const setCategoryId = useCallback((id: string) => {\n setCategoryIdState(id)\n try {\n window.localStorage.setItem(POS_CATEGORY_KEY, id)\n } catch {\n // Storage blocked: the chip still works for this visit.\n }\n }, [])\n const gridPlan = useMemo(\n () =>\n categoryId === POS_QUICK_KEYS\n ? posProductPlan({ search, quickKeys: true })\n : posProductPlan({ search, categoryId }),\n [search, categoryId],\n )\n const { data: productDocs } = useFirestoreCollection<any>(\n /*\n * The till's grid, narrowed by the QUERY rather than by the rows it\n * happened to fetch (AGL-2501, AGL-2292, AGL-3321): the first five\n * hundred SELLABLE products by name, and a typed name reaches the whole\n * catalog. The scan does not come through here — see `handleSearchEnter`.\n */\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(gridPlan),\n limit(POS_GRID_CEILING),\n ),\n [firestore, hostId, gridPlan],\n { idField: '$id' },\n )\n const { data: categoryDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'productCategories'), limit(30)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: locationDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'locations'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { data: registerDocs } = useFirestoreCollection<any>(\n () => query(collection(firestore, 'hosts', hostId, 'registers'), limit(25)),\n [firestore, hostId],\n { idField: '$id' },\n )\n const { org, ready: planReady } = useOrgPlan(hostId)\n const registers = [...(registerDocs ?? [])].sort((a: any, b: any) =>\n String(a.name ?? '').localeCompare(String(b.name ?? '')),\n )\n // Only registers within the plan cap can transact (AGL-482), and not until\n // the org doc has arrived (AGL-1064). Per SITE (AGL-1775).\n const registerCap = Aglyn.checkHostRegisterQuota(org, hostId, registers.length).limit\n const withinCap = CommerceModel.registersWithinCap(registers, registerCap)\n const usableRegisters = planReady ? registers.filter((r: any) => withinCap.has(r.$id)) : []\n /*\n * The stays a sale can be charged to, asked for BY STATUS (AGL-3321).\n */\n const { data: reservationDocs } = useFirestoreCollection<any>(\n () =>\n query(\n collection(firestore, 'hosts', hostId, 'reservations'),\n where('status', '==', 'checked_in'),\n limit(100),\n ),\n [firestore, hostId],\n { idField: '$id' },\n )\n const openStays = reservationDocs ?? []\n\n const [lines, setLines] = useState<RegisterLine[]>([])\n const [discountPct, setDiscountPct] = useState(0)\n // The customer the lookup attached (AGL-3609); their email is the sale's.\n const [customer, setCustomer] = useState<PosSelectedCustomer | null>(null)\n const customerEmail = customer?.email ?? ''\n const [locationId, setLocationId] = useState('')\n const [registerId, setRegisterId] = useState('')\n useEffect(() => {\n if (registerId || usableRegisters.length === 0) return\n const first = usableRegisters[0]\n setRegisterId(first.$id)\n if (first.locationId) setLocationId(first.locationId)\n }, [usableRegisters, registerId])\n const registerName = String(\n usableRegisters.find((register: any) => register.$id === registerId)?.name ?? '',\n )\n // Who is ringing (AGL-3609): a PIN-switched cashier, and the idle lock.\n const opsSettings = usePosOpsSettings(hostId)\n const cashier = usePosCashier({\n hostId,\n registerId,\n autoLockMinutes: opsSettings.autoLockMinutes,\n })\n // The last completed sale, whose receipt can still be printed (AGL-3609).\n const [lastReceipt, setLastReceipt] = useState<{ orderId: string } | null>(null)\n\n const [context, setContext] = useState<PosRegisterContext | null>(null)\n // Keyed on the uid, not the user object: a session refresh hands back a\n // new object for the same person, and re-reading the context on every one\n // would re-render the register in a loop.\n const userRef = useRef(user)\n userRef.current = user\n const uid = user?.uid ?? ''\n useEffect(() => {\n const signedIn = userRef.current\n if (!signedIn) return\n let active = true\n posRegisterContext(signedIn, hostId)\n .then((answer) => {\n // Only a whole answer: a register that half-knows its tenders would\n // offer one the server then refuses.\n if (active && answer?.settings && answer?.terminal) setContext(answer)\n })\n .catch(() => undefined)\n return () => {\n active = false\n }\n }, [uid, hostId])\n\n /** The open sale, once the basket has been priced and payment started. */\n const [sale, setSale] = useState<PosSaleSummary | null>(null)\n const [saleLines, setSaleLines] = useState<RegisterLine[]>([])\n const [opening, setOpening] = useState(false)\n const [sheetOpen, setSheetOpen] = useState(false)\n const display = usePosDisplay(user, hostId, registerId)\n\n /**\n * One key per basket (AGL-1691): minted on the first Charge and retired\n * whenever the basket changes, so a retried Charge finds the same sale and\n * ringing the same coffee twice is two sales.\n */\n const attemptKey = useRef('')\n const fill = useViewportFill({ min: 480 })\n useEffect(() => {\n attemptKey.current = ''\n }, [lines, discountPct])\n\n const products = useMemo(\n () =>\n [...(productDocs ?? [])].map((product: any) => ({\n ...CommerceModel.liftLegacyProduct(product),\n $id: product.$id,\n })),\n [productDocs],\n )\n /*\n * THE OFFLINE REGISTER (AGL-3625): the catalog and the site's offline rules\n * kept on this device, the queue of cash sales rung without a connection,\n * and the sync that records them once it returns.\n */\n const loadCatalog = useCallback(\n async () =>\n (\n await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(posProductPlan({})),\n limit(POS_GRID_CEILING),\n ),\n )\n ).docs.map((snapshot) => ({ ...(snapshot.data() as Record<string, unknown>), $id: snapshot.id })),\n [firestore, hostId],\n )\n const liveRegister = usableRegisters.find((register: any) => register.$id === registerId)\n const offline = usePosOffline({\n hostId,\n user,\n registerId,\n openShiftId: liveRegister ? (liveRegister.openShiftId ?? null) : undefined,\n locationId,\n ...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {}),\n liveProducts: products,\n loadCatalog,\n })\n const [offlineCheckout, setOfflineCheckout] = useState(false)\n /** Open sales left unpaid when the connection dropped, voided once it returns. */\n const strandedSales = useRef<string[]>([])\n useEffect(() => {\n if (offline.offline || !user || !strandedSales.current.length) return\n const orderIds = strandedSales.current.splice(0)\n for (const orderId of orderIds) {\n void posTender(user, hostId, orderId, 'void').catch(() => undefined)\n }\n }, [offline.offline, user, hostId])\n const sellProducts = useMemo(\n () => (offline.offline && offline.ready ? offline.gridProducts(search, categoryId, POS_QUICK_KEYS) : products),\n [offline, search, categoryId, products],\n )\n const productsById = useMemo(\n () => new Map<string, any>(sellProducts.map((product: any) => [product.$id, product] as const)),\n [sellProducts],\n )\n // Whether the sale on the register sells a card reader (AGL-4038): only\n // the platform's own store names hardware on a product, and only there\n // does the buyer step draw.\n const saleSellsHardware = useMemo(\n () =>\n (sale ? saleLines : lines).some((line) => isPosHardwareSkuId(productsById.get(line.productId)?.hardwareSku)),\n [sale, saleLines, lines, productsById],\n )\n // Only a store whose catalog names hardware asks whether it is the seller.\n const storeSellsHardware = useMemo(\n () => products.some((product: { hardwareSku?: unknown }) => isPosHardwareSkuId(product.hardwareSku)),\n [products],\n )\n /** AGL-2357: warns, never blocks. */\n const shortfalls = useMemo(\n () =>\n lines.map((line) => {\n const product: any = productsById.get(line.productId)\n if (!product) return null\n return CommerceModel.stockShortfall(\n product,\n line.variantId ?? product.variants?.[0]?.id,\n line.quantity,\n )\n }),\n [lines, productsById],\n )\n\n const itemsCents = lines.reduce((sum, line) => sum + line.unitAmountCents * line.quantity, 0)\n const discountCents = Math.round((itemsCents * discountPct) / 100)\n const estimateCents = itemsCents - discountCents\n const units = lines.reduce((sum, line) => sum + line.quantity, 0)\n\n const notify = useCallback(\n (message: string, variant: 'success' | 'error' | 'warning' | 'info') => {\n enqueueSnackbar(message, { variant, persist: false, allowDuplicate: true })\n },\n [enqueueSnackbar],\n )\n\n /**\n * A pairing code for a customer display or a self-service kiosk (AGL-3623),\n * through the same flow the POS devices card offers (AGL-3712).\n */\n const onPairingError = useCallback((message: string) => notify(message, 'error'), [notify])\n const pairingFlow = usePosPairing({ user, hostId, onError: onPairingError })\n\n /**\n * Adds a line, or more of an identical one: the same product, variant and\n * modifiers merge, so two oat lattes are one line of two and an oat latte\n * beside a whole-milk one stays two lines.\n */\n const addProduct = useCallback(\n (product: any, variant?: any, modifiers: CommerceModel.ModifierSelection[] = [], quantity = 1) => {\n const next = registerLineFor(product, {\n variant: variant ?? product.variants[0],\n modifiers,\n quantity,\n })\n setLines((prev) => {\n const existing = prev.find((line) => lineKey(line) === lineKey(next))\n if (existing) {\n return prev.map((line) =>\n line === existing\n ? { ...line, quantity: Math.min(99, line.quantity + next.quantity) }\n : line,\n )\n }\n return [...prev, next]\n })\n },\n [],\n )\n\n /** The item sheet: a product to add, or a basket line to change. */\n const [itemSheet, setItemSheet] = useState<{\n product: any\n editIndex?: number\n initial?: { variantId?: string; modifiers?: CommerceModel.ModifierSelection[]; quantity: number }\n } | null>(null)\n // Every product rung up this sale, so a line can be reopened after the\n // grid has moved on to another category or search.\n const productCache = useRef(new Map<string, any>())\n const tapProduct = useCallback(\n (product: any, variant?: any) => {\n productCache.current.set(product.$id, product)\n if (posItemNeedsChoice(product) && !(variant && CommerceModel.productModifierGroups(product).length === 0)) {\n setItemSheet({\n product,\n ...(variant ? { initial: { variantId: variant.id, quantity: 1 } } : {}),\n })\n return\n }\n addProduct(product, variant)\n },\n [addProduct],\n )\n const basketCounts = useMemo(() => {\n const counts = new Map<string, number>()\n for (const line of lines) counts.set(line.productId, (counts.get(line.productId) ?? 0) + line.quantity)\n return counts\n }, [lines])\n\n /**\n * The barcode wedge: a LOOKUP against the whole catalog (AGL-2501),\n * barcode first, and a miss says so.\n */\n const lookupCode = useCallback(async (scanned: string) => {\n const needle = scanned.trim().toLowerCase()\n if (!needle || sale) return\n if (offline.offline) {\n const found = offline.findByCode(needle)\n if (!found) return void notify(`No product matches “${scanned.trim()}”`, 'warning')\n tapProduct(found.product, found.variant)\n setSearch('')\n return\n }\n const lookup = async (field: 'barcodes' | 'skus') => {\n const found = await getDocs(\n query(\n collection(firestore, 'hosts', hostId, 'products'),\n ...listQueryConstraints(posProductPlan({ code: { field, value: needle } })),\n limit(1),\n ),\n )\n return found.docs[0]\n }\n let hit: Awaited<ReturnType<typeof lookup>>\n try {\n hit = (await lookup('barcodes')) ?? (await lookup('skus'))\n } catch (error) {\n console.error(error)\n offline.reportNetworkFailure()\n return void notify('Could not reach the catalog — try again', 'warning')\n }\n if (!hit) return void notify(`No product matches “${scanned.trim()}”`, 'warning')\n const product = { ...CommerceModel.liftLegacyProduct(hit.data() as any), $id: hit.id }\n const variant =\n product.variants.find(\n (item: any) =>\n item.barcode?.trim().toLowerCase() === needle || item.sku?.trim().toLowerCase() === needle,\n ) ?? product.variants[0]\n // A scanned variant is the variant; a product with modifiers still asks\n // for them, with that variant already picked.\n tapProduct(product, variant)\n setSearch('')\n }, [sale, firestore, hostId, tapProduct, notify, offline])\n const handleSearchEnter = useCallback(() => lookupCode(search), [lookupCode, search])\n // A scanner fired while focus is on a product or a button (AGL-3619), and\n // the camera; neither while a sale is taking payment or an item is open.\n useScannerWedge((code) => void lookupCode(code), !sale && !itemSheet)\n const scanAdornment = useMemo(\n () => <ScanAdornment label=\"Scan a barcode with the camera\" onScan={(code) => void lookupCode(code)} />,\n [lookupCode],\n )\n\n /** Prices the basket on the server and opens the sale for payment. */\n // A ref, not `opening`: two taps inside one React batch both read the\n // pre-click state, and only a ref is written before the second reads it\n // (the AGL-1682 lesson).\n const chargeInFlight = useRef(false)\n const charge = useCallback(async () => {\n if (chargeInFlight.current || lines.length === 0 || !user) return\n if (!registerId) return void notify('Select a register before taking payment', 'warning')\n // Offline, the basket rings as a cash sale kept on this register (AGL-3625).\n if (offline.offline) {\n if (!offline.ready) return void notify(offline.unavailableReason ?? 'Offline selling is unavailable', 'warning')\n setOfflineCheckout(true)\n return\n }\n if (!attemptKey.current) attemptKey.current = newAttemptKey()\n chargeInFlight.current = true\n setOpening(true)\n try {\n const opened = await openPosSale(user, attemptKey.current, {\n hostId,\n registerId,\n lines,\n discountPct,\n ...(customerEmail ? { customerEmail } : {}),\n ...(customer ? { customer } : {}),\n ...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {}),\n ...(locationId ? { locationId } : {}),\n })\n setSaleLines(lines)\n setSale({\n orderId: opened.orderId,\n status: 'pending',\n totalCents: opened.totals.totalCents,\n paidCents: 0,\n dueCents: opened.totals.totalCents,\n tenderableCents: opened.totals.totalCents,\n tipCents: 0,\n payments: [],\n })\n setSheetOpen(true)\n } catch (error) {\n if (error instanceof PosRequestError) {\n notify(error.message, 'error')\n } else {\n // The request never reached the server: the register is offline.\n offline.reportNetworkFailure()\n notify('The register lost its connection. Charge again to take cash offline.', 'warning')\n }\n } finally {\n chargeInFlight.current = false\n setOpening(false)\n }\n }, [lines, user, registerId, hostId, discountPct, customerEmail, customer, cashier.assertion, locationId, notify, offline])\n\n const resetSale = useCallback(() => {\n if (sale?.status === 'paid') setLastReceipt({ orderId: sale.orderId })\n setSale(null)\n setSaleLines([])\n setLines([])\n setDiscountPct(0)\n setCustomer(null)\n setSheetOpen(false)\n }, [sale])\n\n // The customer display mirrors the basket while nothing else is on it.\n const mirrored = sale ? saleLines : lines\n // Whether the display was last left showing a basket. A paid sale leaves it\n // on the thank-you the server wrote, which an empty new basket must not\n // cut short with the idle screen; the next item added takes it over.\n // True at first, so a register that opens empty clears whatever a previous\n // session left on the screen.\n const displayShowsBasket = useRef(true)\n // The tip picked for the payment about to be taken; the ledger has it only\n // once that payment is recorded. Gone with the sale.\n const [pendingTipCents, setPendingTipCents] = useState(0)\n useEffect(() => {\n if (!sale || sale.status === 'paid') setPendingTipCents(0)\n }, [sale])\n useEffect(() => {\n if (sale?.status === 'paid') displayShowsBasket.current = false\n }, [sale?.status])\n useEffect(() => {\n if (!display.connected || display.asking) return\n if (sale?.payments.some((payment) => payment.status === 'pending' && payment.method === 'card_present')) {\n return\n }\n if (sale?.status === 'paid') return\n if (!mirrored.length && !displayShowsBasket.current) return\n const timer = setTimeout(() => {\n displayShowsBasket.current = mirrored.length > 0\n void display.show(\n mirrored.length\n ? {\n mode: 'cart',\n cart: {\n lines: mirrored.map((line) => ({\n name: line.name,\n ...(line.variantLabel ? { variantLabel: line.variantLabel } : {}),\n quantity: line.quantity,\n amountCents: line.unitAmountCents * line.quantity,\n })),\n itemsCents,\n discountCents,\n taxCents: sale ? Math.max(0, sale.totalCents - estimateCents) : 0,\n totalCents: sale ? sale.totalCents : estimateCents,\n ...(sale\n ? {\n paidCents: sale.paidCents,\n dueCents: sale.dueCents,\n tipCents: posDisplayTipCents(sale, pendingTipCents),\n }\n : {}),\n },\n }\n : { mode: 'idle' },\n )\n }, 400)\n return () => clearTimeout(timer)\n }, [display, mirrored, sale, itemsCents, discountCents, estimateCents, pendingTipCents])\n\n const registersHref = posRegistersSettingsHref(basePath)\n const registerPicker = !planReady ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Checking your plan…'}\n </Typography>\n ) : usableRegisters.length === 0 ? (\n registers.length > 0 ? (\n <Typography variant=\"body2\" color=\"warning.main\">\n {'Your registers exceed your plan — remove extras or upgrade in Billing to take payments.'}\n </Typography>\n ) : (\n // A way there, not a path to follow by hand (AGL-3712).\n <Stack spacing={1} sx={{ alignItems: 'flex-start' }}>\n <Typography variant=\"body2\" color=\"warning.main\">\n {'No POS register yet. Add one before taking payments.'}\n </Typography>\n {registersHref ? (\n <Button size=\"small\" variant=\"outlined\" href={registersHref}>\n {'Add a register'}\n </Button>\n ) : null}\n </Stack>\n )\n ) : usableRegisters.length > 1 ? (\n <TextField\n label=\"Register\"\n value={registerId}\n onChange={(event) => setRegisterId(event.target.value)}\n size=\"small\"\n select\n disabled={Boolean(sale)}\n >\n {usableRegisters.map((register: any) => (\n <MenuItem key={register.$id} value={register.$id}>\n {register.name}\n </MenuItem>\n ))}\n </TextField>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {usableRegisters[0]?.name}\n </Typography>\n )\n\n /**\n * On a narrow screen the register's bar owns the bottom edge, so it moves\n * the console's floating launchers clear of itself through the shell's\n * `--aglyn-dock-inset-bottom` seam; a launcher left in the corner sat on\n * top of Charge.\n */\n const bottomBarRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n const node = bottomBarRef.current\n if (wide || !node) return undefined\n const root = document.documentElement\n const property = '--aglyn-dock-inset-bottom'\n const publish = () => {\n root.style.setProperty(property, `${Math.round(node.getBoundingClientRect().height) + 20}px`)\n }\n publish()\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(publish)\n observer?.observe(node)\n return () => {\n observer?.disconnect()\n root.style.removeProperty(property)\n }\n }, [wide])\n\n const registerPanel = (\n <Stack spacing={1.5} sx={{ minHeight: 0, flex: 1 }}>\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }}>\n <Typography variant=\"h6\" sx={{ flex: 1 }}>\n {'Register'}\n </Typography>\n {registerId ? (\n <Button\n size=\"small\"\n onClick={() => void pairingFlow.open(registerId, 'display')}\n >\n {display.connected ? 'Display connected' : 'Pair display'}\n </Button>\n ) : null}\n </Stack>\n {registerPicker}\n {(locationDocs?.length ?? 0) > 1 ? (\n <TextField\n label=\"Location\"\n value={locationId}\n onChange={(event) => setLocationId(event.target.value)}\n size=\"small\"\n select\n disabled={Boolean(sale)}\n >\n {(locationDocs ?? []).map((location: any) => (\n <MenuItem key={location.$id} value={location.$id}>\n {location.name}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {registerId ? (\n <PosOperationsBar\n hostId={hostId}\n registerId={registerId}\n {...(registerName ? { registerName } : {})}\n cashier={cashier}\n blocked={blockedControls}\n onExchange={(returned) =>\n setCustomer(\n returned.email || returned.name\n ? { kind: 'none', id: '', name: returned.name ?? '', email: returned.email, phone: null }\n : null,\n )\n }\n />\n ) : null}\n <PosCartPanel\n {...(discountBlocked ? { discountBlocked } : {})}\n lines={sale ? saleLines : lines}\n shortfalls={sale ? [] : shortfalls}\n onQuantity={(index, quantity) =>\n setLines((prev) =>\n quantity <= 0\n ? prev.filter((_line, at) => at !== index)\n : prev.map((line, at) => (at === index ? { ...line, quantity: Math.min(99, quantity) } : line)),\n )\n }\n onRemove={(index) => setLines((prev) => prev.filter((_line, at) => at !== index))}\n onEdit={(index) => {\n const line = lines[index]\n const product = line\n ? (productCache.current.get(line.productId) ?? productsById.get(line.productId))\n : undefined\n if (!line || !product) return\n setItemSheet({\n product,\n editIndex: index,\n initial: {\n ...(line.variantId ? { variantId: line.variantId } : {}),\n ...(line.modifiers ? { modifiers: line.modifiers } : {}),\n quantity: line.quantity,\n },\n })\n }}\n discountPct={discountPct}\n onDiscountPct={setDiscountPct}\n customer={\n <>\n {sale ? null : (\n <PosCustomerLookup\n hostId={hostId}\n value={customer}\n onChange={setCustomer}\n registerId={registerId}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n />\n )}\n {user && storeSellsHardware ? (\n <Suspense fallback={null}>\n <PosHardwareBuyer\n user={user}\n hostId={hostId}\n saleOrderId={sale && saleSellsHardware ? sale.orderId : null}\n notify={notify}\n />\n </Suspense>\n ) : null}\n </>\n }\n locked={Boolean(sale)}\n />\n {sale && user ? (\n sale.status === 'paid' ? (\n <PosReceiptPanel\n user={user}\n hostId={hostId}\n sale={sale}\n context={context}\n display={display}\n onNewSale={resetSale}\n registerId={registerId}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n notify={notify}\n />\n ) : (\n <PosTenderPanel\n user={user}\n hostId={hostId}\n registerId={registerId}\n sale={sale}\n context={context}\n stays={openStays}\n display={display}\n onSale={setSale}\n onVoided={() => {\n setSale(null)\n setSaleLines([])\n }}\n onTipChange={setPendingTipCents}\n {...(cashier.assertion ? { cashierAssertion: cashier.assertion } : {})}\n notify={notify}\n offline={offline.offline}\n {...(offline.ready\n ? {\n onSellOffline: () => {\n // The server's open sale took no payment; it is voided once\n // the connection returns, and the basket rings offline.\n strandedSales.current.push(sale.orderId)\n setSale(null)\n setSaleLines([])\n setOfflineCheckout(true)\n },\n }\n : {})}\n />\n )\n ) : (\n <>\n <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>\n <Typography variant=\"h6\">{'Due'}</Typography>\n <Typography variant=\"h6\">{usd(estimateCents)}</Typography>\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Tax is added when you charge.'}\n </Typography>\n <Button\n variant=\"contained\"\n size=\"large\"\n disabled={opening || lines.length === 0 || !registerId}\n onClick={() => void charge()}\n sx={{ minHeight: 56 }}\n >\n {opening\n ? 'Pricing…'\n : offline.offline\n ? `Cash ${usd(offline.totalsFor(lines, discountPct)?.totalCents ?? estimateCents)} (offline)`\n : `Charge ${usd(estimateCents)}`}\n </Button>\n {lastReceipt ? (\n <PosLastReceipt\n hostId={hostId}\n orderId={lastReceipt.orderId}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n />\n ) : null}\n </>\n )}\n </Stack>\n )\n\n return (\n <>\n <NextPageTitle screen={'POS'} />\n <Box\n ref={fill.ref}\n sx={{\n display: 'flex',\n // From under the console's header, nav and page title down to\n // where the page's padding and footer begin, so the whole page fits\n // the window (AGL-3679, AGL-3710).\n height: fill.height,\n overflow: 'hidden',\n }}\n >\n <Box sx={{ flex: 1, p: 2, overflowY: 'auto', pb: wide ? 2 : 12 }}>\n <Box sx={{ mb: 2, '&:empty': { display: 'none' } }}>\n <PosOfflineBanner offline={offline} />\n </Box>\n {/* \"Pay at counter\" orders from this register's kiosks (AGL-3623). */}\n {registerId ? (\n <PosKioskQueue\n user={user}\n hostId={hostId}\n registerId={registerId}\n disabled={Boolean(sale)}\n onTake={(next, nextLines) => {\n setSaleLines(nextLines)\n setSale(next)\n setSheetOpen(true)\n }}\n notify={notify}\n />\n ) : null}\n {/* Orders other channels send to the counter (AGL-3644). */}\n {WidgetSlot ? <PosOrdersZone renderer={WidgetSlot} hostId={hostId} registerId={registerId || null} /> : null}\n <PosProductGrid\n search={search}\n onSearch={setSearch}\n onSearchEnter={() => void handleSearchEnter()}\n scanAdornment={scanAdornment}\n categories={(categoryDocs ?? []).map((category: any) => ({\n $id: category.$id,\n name: String(category.name ?? 'Category'),\n }))}\n categoryId={categoryId}\n onCategory={setCategoryId}\n notices={gridPlan.notices}\n hostId={hostId}\n products={sellProducts}\n basketCounts={basketCounts}\n onTap={(product) => {\n if (sale) return void notify('Finish or void the open sale first', 'info')\n tapProduct(product)\n }}\n />\n </Box>\n {wide ? (\n <Box\n sx={{\n width: { md: 400, lg: 440 },\n borderLeft: 1,\n borderColor: 'divider',\n display: 'flex',\n flexDirection: 'column',\n p: 2,\n overflowY: 'auto',\n }}\n >\n {registerPanel}\n </Box>\n ) : null}\n </Box>\n {!wide ? (\n <>\n <Box\n ref={bottomBarRef}\n sx={{\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n p: 1.5,\n bgcolor: 'background.paper',\n borderTop: 1,\n borderColor: 'divider',\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n zIndex: theme.zIndex.appBar,\n }}\n >\n <Badge badgeContent={units} color=\"primary\">\n <Button\n variant=\"outlined\"\n onClick={() => setSheetOpen(true)}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {sale ? 'Payment' : 'Cart'}\n </Button>\n </Badge>\n <Typography variant=\"h6\" sx={{ flex: 1, textAlign: 'right' }}>\n {usd(sale ? sale.dueCents : estimateCents)}\n </Typography>\n {!sale ? (\n <Button\n variant=\"contained\"\n disabled={opening || lines.length === 0 || !registerId}\n onClick={() => void charge()}\n sx={{ minHeight: POS_TOUCH_PX }}\n >\n {'Charge'}\n </Button>\n ) : null}\n </Box>\n <Drawer\n anchor=\"bottom\"\n open={sheetOpen}\n onClose={() => setSheetOpen(false)}\n slotProps={{ paper: { sx: { maxHeight: '90dvh', p: 2, borderTopLeftRadius: 16, borderTopRightRadius: 16 } } }}\n >\n {registerPanel}\n </Drawer>\n </>\n ) : null}\n <PosItemDialog\n product={itemSheet?.product ?? null}\n initial={itemSheet?.initial}\n onClose={() => setItemSheet(null)}\n onConfirm={(choice) => {\n const sheet = itemSheet\n setItemSheet(null)\n if (!sheet) return\n if (sheet.editIndex === undefined) {\n addProduct(sheet.product, choice.variant, choice.modifiers, choice.quantity)\n return\n }\n const at = sheet.editIndex\n setLines((prev) =>\n prev.map((line, index) => (index === at ? registerLineFor(sheet.product, choice) : line)),\n )\n }}\n {...(itemSheet?.editIndex !== undefined\n ? {\n onRemove: () => {\n const at = itemSheet.editIndex\n setItemSheet(null)\n setLines((prev) => prev.filter((_line, index) => index !== at))\n },\n }\n : {})}\n />\n <PosOfflineCheckout\n open={offlineCheckout}\n offline={offline}\n hostId={hostId}\n lines={lines}\n discountPct={discountPct}\n customer={customer}\n {...(registerName ? { registerName } : {})}\n {...(cashier.cashier ? { cashierName: cashier.cashier.name } : {})}\n onClose={() => setOfflineCheckout(false)}\n onRung={() => undefined}\n onDone={() => {\n setOfflineCheckout(false)\n setLines([])\n setDiscountPct(0)\n setCustomer(null)\n setSheetOpen(false)\n }}\n />\n {pairingFlow.dialog}\n </>\n )\n}\nPosConsolePage.displayName = 'PosConsolePage'\n\nexport default PosConsolePage\n"],"names":["Aglyn","CommerceModel","posPermissionRefusal","PRODUCT_LIST_BASE","PRODUCT_LIST_QUERY","NextPageTitle","useSnackbar","planListQuery","useViewportFill","nameSearchNormalizers","Badge","Box","Button","Drawer","MenuItem","Stack","TextField","Typography","useMediaQuery","useTheme","collection","getDocs","limit","query","where","lazy","memo","Suspense","useCallback","useEffect","useMemo","useRef","useState","useFirestore","useUser","useFirestoreCollection","listQueryConstraints","useOrgPlan","newAttemptKey","openPosSale","posRegisterContext","posTender","PosRequestError","usd","PosCartPanel","ScanAdornment","useScannerWedge","PosCustomerLookup","PosLastReceipt","PosOperationsBar","usePosCashier","usePosOpsSettings","POS_QUICK_KEYS","POS_TOUCH_PX","PosProductGrid","PosItemDialog","posItemNeedsChoice","PosReceiptPanel","PosTenderPanel","PosKioskQueue","posDisplayTipCents","usePosDisplay","posRegistersSettingsHref","usePosPairing","useConsoleWidgetSlot","POS_ORDERS_ZONE","isPosHardwareSkuId","PosHardwareBuyer","PosOfflineBanner","PosOfflineCheckout","usePosOffline","SELLABLE","field","op","value","POS_GRID_CEILING","posProductPlan","options","typed","search","trim","plan","POS_GRID_QUERY","base","clauses","code","categoryId","quickKeys","filters","path","fields","column","kind","tokensPath","operators","POS_CATEGORY_KEY","registerLineFor","product","choice","variant","modifiers","quantity","resolved","resolveLineModifiers","picked","ok","label","lineLabelWithModifiers","Object","keys","length","values","join","undefined","productId","$id","id","variantId","name","variantLabel","unitAmountCents","Math","round","Number","priceUsd","extraCents","lineKey","line","modifierSelectionKey","PosOrdersZone","props","renderer","Renderer","hostId","registerId","slot","orgId","PosConsolePage","basePath","permissions","liveRegister","usableRegisters","offline","refusedReason","key","blockedControls","returns","shift","discountBlocked","WidgetSlot","firestore","data","user","enqueueSnackbar","theme","wide","breakpoints","up","setSearch","setCategoryIdState","window","localStorage","getItem","setCategoryId","setItem","gridPlan","productDocs","idField","categoryDocs","locationDocs","registerDocs","org","ready","planReady","registers","sort","a","b","String","localeCompare","registerCap","checkHostRegisterQuota","withinCap","registersWithinCap","filter","r","has","reservationDocs","openStays","lines","setLines","discountPct","setDiscountPct","customer","setCustomer","customerEmail","email","locationId","setLocationId","setRegisterId","first","registerName","find","register","opsSettings","cashier","autoLockMinutes","lastReceipt","setLastReceipt","context","setContext","userRef","current","uid","signedIn","active","then","answer","settings","terminal","catch","sale","setSale","saleLines","setSaleLines","opening","setOpening","sheetOpen","setSheetOpen","display","attemptKey","fill","min","products","map","liftLegacyProduct","loadCatalog","docs","snapshot","openShiftId","assertion","cashierAssertion","liveProducts","offlineCheckout","setOfflineCheckout","strandedSales","orderIds","splice","orderId","sellProducts","gridProducts","productsById","Map","saleSellsHardware","some","get","hardwareSku","storeSellsHardware","shortfalls","stockShortfall","variants","itemsCents","reduce","sum","discountCents","estimateCents","units","notify","message","persist","allowDuplicate","onPairingError","pairingFlow","onError","addProduct","next","prev","existing","itemSheet","setItemSheet","productCache","tapProduct","set","productModifierGroups","initial","basketCounts","counts","lookupCode","scanned","needle","toLowerCase","found","findByCode","lookup","hit","error","console","reportNetworkFailure","item","barcode","sku","handleSearchEnter","scanAdornment","onScan","chargeInFlight","charge","unavailableReason","opened","status","totalCents","totals","paidCents","dueCents","tenderableCents","tipCents","payments","resetSale","mirrored","displayShowsBasket","pendingTipCents","setPendingTipCents","connected","asking","payment","method","timer","setTimeout","show","mode","cart","amountCents","taxCents","max","clearTimeout","registersHref","registerPicker","color","spacing","sx","alignItems","size","href","onChange","event","target","select","disabled","Boolean","bottomBarRef","node","root","document","documentElement","property","publish","style","setProperty","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","removeProperty","registerPanel","minHeight","flex","direction","onClick","open","location","blocked","onExchange","returned","phone","onQuantity","index","_line","at","onRemove","onEdit","editIndex","onDiscountPct","fallback","saleOrderId","locked","onNewSale","cashierName","stays","onSale","onVoided","onTipChange","onSellOffline","push","justifyContent","totalsFor","screen","ref","overflow","p","overflowY","pb","mb","onTake","nextLines","onSearch","onSearchEnter","categories","category","onCategory","notices","onTap","width","md","lg","borderLeft","borderColor","flexDirection","position","left","right","bottom","bgcolor","borderTop","gap","zIndex","appBar","badgeContent","textAlign","anchor","onClose","slotProps","paper","maxHeight","borderTopLeftRadius","borderTopRightRadius","onConfirm","sheet","onRung","onDone","dialog","displayName"],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ import { PosReaderSplashRequestError, readerSplashStatus, saveReaderSplash } fro
|
|
|
35
35
|
image.src = src;
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
const NOT_ALLOWED = 'Only an admin or editor with the "
|
|
38
|
+
const NOT_ALLOWED = 'Only an admin or editor with the "Registers and devices" point of sale permission can change the readers.';
|
|
39
39
|
/**
|
|
40
40
|
* "Reader start-up screen" on the POS devices card (AGL-4048): what the
|
|
41
41
|
* store's Stripe smart readers show while they wait for a payment. The
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-reader-splash-setting.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { useMediaPicker, type PickedMedia } from '@aglyn/aglyn/app-utils/media-picker-context'\nimport { BlockedControl } from '@aglyn/shared-ui-jsx/components/blocked-control.component'\nimport { PrerequisiteNotice } from '@aglyn/shared-ui-jsx/components/prerequisite-notice.component'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useConsoleHostRoute, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Alert,\n Box,\n Button,\n FormControlLabel,\n Radio,\n RadioGroup,\n Stack,\n Typography,\n} from '@mui/material'\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n POS_READER_SPLASH_LARGEST,\n posReaderSplashArtworkProblem,\n type PosReaderSplashChoice,\n type PosReaderSplashStatus,\n} from '../../model/pos-reader-splash'\nimport {\n PosReaderSplashRequestError,\n readerSplashStatus,\n saveReaderSplash,\n} from './pos/pos-reader-splash-api'\n\nexport interface PosReaderSplashSettingProps {\n hostId: string\n /** Whether the viewer may change the site's readers (`managePos`, admin or editor). */\n canManagePos: boolean\n}\n\n/** An image's pixel size, read in the browser before anything is saved. */\nfunction imageSize(src: string): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n const image = new Image()\n image.onload = () => resolve({ width: image.naturalWidth, height: image.naturalHeight })\n image.onerror = () => resolve(null)\n image.src = src\n })\n}\n\nconst NOT_ALLOWED = 'Only an admin or editor with the \"Use the point of sale\" permission can change the readers.'\n\n/**\n * \"Reader start-up screen\" on the POS devices card (AGL-4048): what the\n * store's Stripe smart readers show while they wait for a payment. The\n * platform's default screen, the workspace's logo on a white screen, or a\n * full-screen portrait image from the media library. A white-label\n * workspace is never offered the platform's screen and shows its own logo\n * unless it picks an image.\n *\n * The server applies the choice to the store's readers when it is saved\n * (and again when this opens and finds the logo changed since); readers\n * pick it up within about ten minutes.\n */\nexport function PosReaderSplashSetting({ hostId, canManagePos }: PosReaderSplashSettingProps) {\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const { pickMedia } = useMediaPicker()\n const { orgSlug } = useConsoleHostRoute(hostId)\n const [status, setStatus] = useState<PosReaderSplashStatus | null>(null)\n const [busy, setBusy] = useState(false)\n const [picked, setPicked] = useState<PickedMedia | null>(null)\n const uid = user?.uid ?? ''\n\n useEffect(() => {\n if (!user) return\n let active = true\n readerSplashStatus(user, hostId)\n .then((answer) => {\n if (active) setStatus(answer)\n })\n .catch(() => {\n if (active) setStatus(null)\n })\n return () => {\n active = false\n }\n // Keyed on the person, not the session object (see the register page).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, hostId])\n\n const save = useCallback(\n async (choice: PosReaderSplashChoice, image?: { mediaScope: string; mediaId: string }) => {\n if (!user) return\n setBusy(true)\n try {\n const answer = await saveReaderSplash(user, hostId, choice, image)\n setStatus(answer)\n if (!answer.problem) {\n enqueueSnackbar(\n answer.locationReady\n ? 'Saved. Your readers show it within about ten minutes.'\n : 'Saved. Your readers show it once you add one.',\n { variant: 'success', persist: false },\n )\n }\n } catch (error) {\n enqueueSnackbar(\n error instanceof PosReaderSplashRequestError ? error.message : 'The start-up screen could not be saved',\n { variant: 'warning', persist: false },\n )\n } finally {\n setBusy(false)\n }\n },\n [user, hostId, enqueueSnackbar],\n )\n\n const chooseImage = async () => {\n const media = await pickMedia?.({ kind: 'image' })\n if (!media) return\n if (!media.mediaId || !media.mediaScope) {\n enqueueSnackbar('Choose an image from your media library.', { variant: 'warning', persist: false })\n return\n }\n const size = await imageSize(media.url)\n const problem = posReaderSplashArtworkProblem({\n contentType: media.contentType ?? null,\n width: size?.width ?? 0,\n height: size?.height ?? 0,\n })\n if (problem) {\n enqueueSnackbar(problem, { variant: 'warning', persist: false })\n return\n }\n setPicked(media)\n await save('image', { mediaScope: media.mediaScope, mediaId: media.mediaId })\n }\n\n if (!status?.available) return null\n\n const blockedReason = !canManagePos ? NOT_ALLOWED : busy ? 'Saving…' : null\n const hasLogo = Boolean(status.logoUrl)\n const profileHref = orgSlug ? `/${orgSlug}/settings/profile` : undefined\n const brand = status.productName\n const preview =\n status.effectiveChoice === 'logo' ? status.logoUrl : status.effectiveChoice === 'image' ? (picked?.url ?? status.image?.url ?? null) : null\n\n return (\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\">{'Reader start-up screen'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'What your card readers show while they wait for a payment.'}\n </Typography>\n <RadioGroup\n value={status.effectiveChoice}\n onChange={(event) => {\n const choice = event.target.value as PosReaderSplashChoice\n if (choice === 'image') {\n if (status.image) void save('image', { mediaScope: status.image.mediaScope, mediaId: status.image.mediaId })\n else void chooseImage()\n return\n }\n void save(choice)\n }}\n >\n {status.whiteLabel ? null : (\n <FormControlLabel\n value=\"platform\"\n disabled={Boolean(blockedReason)}\n control={<Radio size=\"small\" />}\n label={\n <Stack>\n <Typography variant=\"body2\">{`The ${brand} start-up screen`}</Typography>\n {status.platformReady ? null : (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Until it is ready, your readers show their standard screen.'}\n </Typography>\n )}\n </Stack>\n }\n />\n )}\n <FormControlLabel\n value=\"logo\"\n disabled={Boolean(blockedReason) || !hasLogo}\n control={<Radio size=\"small\" />}\n label={\n <Stack>\n <Typography variant=\"body2\">{'Your logo'}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Your organization profile’s logo, centered on a white screen.'}\n </Typography>\n </Stack>\n }\n />\n <FormControlLabel\n value=\"image\"\n disabled={Boolean(blockedReason)}\n control={<Radio size=\"small\" />}\n label={\n <Stack>\n <Typography variant=\"body2\">{'Your own image'}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`A full-screen portrait image from your media library, at least ${POS_READER_SPLASH_LARGEST.width} × ${POS_READER_SPLASH_LARGEST.height} pixels.`}\n </Typography>\n </Stack>\n }\n />\n </RadioGroup>\n {hasLogo ? null : (\n <PrerequisiteNotice\n href={profileHref}\n actionLabel=\"Organization profile\"\n severity={status.effectiveChoice === 'logo' ? 'warning' : 'info'}\n >\n {'Add a logo to your organization profile to show it on your card readers.'}\n </PrerequisiteNotice>\n )}\n {status.effectiveChoice === 'image' ? (\n <Box>\n <BlockedControl blocked={Boolean(blockedReason)} reason={blockedReason ?? ''}>\n <Button size=\"small\" onClick={() => void chooseImage()}>\n {status.image ? 'Choose another image' : 'Choose image'}\n </Button>\n </BlockedControl>\n </Box>\n ) : null}\n {preview ? (\n <Box\n component=\"img\"\n src={preview}\n alt=\"\"\n sx={(theme) => ({\n alignSelf: 'flex-start',\n maxWidth: theme.spacing(16),\n maxHeight: theme.spacing(16),\n objectFit: 'contain',\n borderRadius: 1,\n border: 1,\n borderColor: 'divider',\n })}\n />\n ) : null}\n {status.problem && !(status.effectiveChoice === 'logo' && !hasLogo) ? (\n <Alert severity=\"warning\">{status.problem}</Alert>\n ) : (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {!status.locationReady\n ? 'Your readers show it once you add your first one.'\n : status.appliedAtMs\n ? `Sent to your readers ${new Date(status.appliedAtMs).toLocaleString()}. Readers update within about ten minutes.`\n : 'Readers update within about ten minutes of a change.'}\n </Typography>\n )}\n </Stack>\n )\n}\nPosReaderSplashSetting.displayName = 'PosReaderSplashSetting'\n\nexport default PosReaderSplashSetting\n"],"names":["useMediaPicker","BlockedControl","PrerequisiteNotice","useSnackbar","useConsoleHostRoute","useUser","Alert","Box","Button","FormControlLabel","Radio","RadioGroup","Stack","Typography","useCallback","useEffect","useState","POS_READER_SPLASH_LARGEST","posReaderSplashArtworkProblem","PosReaderSplashRequestError","readerSplashStatus","saveReaderSplash","imageSize","src","Promise","resolve","image","Image","onload","width","naturalWidth","height","naturalHeight","onerror","NOT_ALLOWED","PosReaderSplashSetting","hostId","canManagePos","picked","status","data","user","enqueueSnackbar","pickMedia","orgSlug","setStatus","busy","setBusy","setPicked","uid","active","then","answer","catch","save","choice","problem","locationReady","variant","persist","error","message","chooseImage","media","kind","mediaId","mediaScope","size","url","contentType","available","blockedReason","hasLogo","Boolean","logoUrl","profileHref","undefined","brand","productName","preview","effectiveChoice","spacing","color","value","onChange","event","target","whiteLabel","disabled","control","label","platformReady","href","actionLabel","severity","blocked","reason","onClick","component","alt","sx","theme","alignSelf","maxWidth","maxHeight","objectFit","borderRadius","border","borderColor","appliedAtMs","Date","toLocaleString","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../libs/plugins/commerce/src/lib/components/console/pos-reader-splash-setting.component.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { useMediaPicker, type PickedMedia } from '@aglyn/aglyn/app-utils/media-picker-context'\nimport { BlockedControl } from '@aglyn/shared-ui-jsx/components/blocked-control.component'\nimport { PrerequisiteNotice } from '@aglyn/shared-ui-jsx/components/prerequisite-notice.component'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useConsoleHostRoute, useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Alert,\n Box,\n Button,\n FormControlLabel,\n Radio,\n RadioGroup,\n Stack,\n Typography,\n} from '@mui/material'\nimport { useCallback, useEffect, useState } from 'react'\nimport {\n POS_READER_SPLASH_LARGEST,\n posReaderSplashArtworkProblem,\n type PosReaderSplashChoice,\n type PosReaderSplashStatus,\n} from '../../model/pos-reader-splash'\nimport {\n PosReaderSplashRequestError,\n readerSplashStatus,\n saveReaderSplash,\n} from './pos/pos-reader-splash-api'\n\nexport interface PosReaderSplashSettingProps {\n hostId: string\n /** Whether the viewer may change the site's readers (`managePos`, admin or editor). */\n canManagePos: boolean\n}\n\n/** An image's pixel size, read in the browser before anything is saved. */\nfunction imageSize(src: string): Promise<{ width: number; height: number } | null> {\n return new Promise((resolve) => {\n const image = new Image()\n image.onload = () => resolve({ width: image.naturalWidth, height: image.naturalHeight })\n image.onerror = () => resolve(null)\n image.src = src\n })\n}\n\nconst NOT_ALLOWED =\n 'Only an admin or editor with the \"Registers and devices\" point of sale permission can change the readers.'\n\n/**\n * \"Reader start-up screen\" on the POS devices card (AGL-4048): what the\n * store's Stripe smart readers show while they wait for a payment. The\n * platform's default screen, the workspace's logo on a white screen, or a\n * full-screen portrait image from the media library. A white-label\n * workspace is never offered the platform's screen and shows its own logo\n * unless it picks an image.\n *\n * The server applies the choice to the store's readers when it is saved\n * (and again when this opens and finds the logo changed since); readers\n * pick it up within about ten minutes.\n */\nexport function PosReaderSplashSetting({ hostId, canManagePos }: PosReaderSplashSettingProps) {\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const { pickMedia } = useMediaPicker()\n const { orgSlug } = useConsoleHostRoute(hostId)\n const [status, setStatus] = useState<PosReaderSplashStatus | null>(null)\n const [busy, setBusy] = useState(false)\n const [picked, setPicked] = useState<PickedMedia | null>(null)\n const uid = user?.uid ?? ''\n\n useEffect(() => {\n if (!user) return\n let active = true\n readerSplashStatus(user, hostId)\n .then((answer) => {\n if (active) setStatus(answer)\n })\n .catch(() => {\n if (active) setStatus(null)\n })\n return () => {\n active = false\n }\n // Keyed on the person, not the session object (see the register page).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uid, hostId])\n\n const save = useCallback(\n async (choice: PosReaderSplashChoice, image?: { mediaScope: string; mediaId: string }) => {\n if (!user) return\n setBusy(true)\n try {\n const answer = await saveReaderSplash(user, hostId, choice, image)\n setStatus(answer)\n if (!answer.problem) {\n enqueueSnackbar(\n answer.locationReady\n ? 'Saved. Your readers show it within about ten minutes.'\n : 'Saved. Your readers show it once you add one.',\n { variant: 'success', persist: false },\n )\n }\n } catch (error) {\n enqueueSnackbar(\n error instanceof PosReaderSplashRequestError ? error.message : 'The start-up screen could not be saved',\n { variant: 'warning', persist: false },\n )\n } finally {\n setBusy(false)\n }\n },\n [user, hostId, enqueueSnackbar],\n )\n\n const chooseImage = async () => {\n const media = await pickMedia?.({ kind: 'image' })\n if (!media) return\n if (!media.mediaId || !media.mediaScope) {\n enqueueSnackbar('Choose an image from your media library.', { variant: 'warning', persist: false })\n return\n }\n const size = await imageSize(media.url)\n const problem = posReaderSplashArtworkProblem({\n contentType: media.contentType ?? null,\n width: size?.width ?? 0,\n height: size?.height ?? 0,\n })\n if (problem) {\n enqueueSnackbar(problem, { variant: 'warning', persist: false })\n return\n }\n setPicked(media)\n await save('image', { mediaScope: media.mediaScope, mediaId: media.mediaId })\n }\n\n if (!status?.available) return null\n\n const blockedReason = !canManagePos ? NOT_ALLOWED : busy ? 'Saving…' : null\n const hasLogo = Boolean(status.logoUrl)\n const profileHref = orgSlug ? `/${orgSlug}/settings/profile` : undefined\n const brand = status.productName\n const preview =\n status.effectiveChoice === 'logo' ? status.logoUrl : status.effectiveChoice === 'image' ? (picked?.url ?? status.image?.url ?? null) : null\n\n return (\n <Stack spacing={1}>\n <Typography variant=\"subtitle2\">{'Reader start-up screen'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'What your card readers show while they wait for a payment.'}\n </Typography>\n <RadioGroup\n value={status.effectiveChoice}\n onChange={(event) => {\n const choice = event.target.value as PosReaderSplashChoice\n if (choice === 'image') {\n if (status.image) void save('image', { mediaScope: status.image.mediaScope, mediaId: status.image.mediaId })\n else void chooseImage()\n return\n }\n void save(choice)\n }}\n >\n {status.whiteLabel ? null : (\n <FormControlLabel\n value=\"platform\"\n disabled={Boolean(blockedReason)}\n control={<Radio size=\"small\" />}\n label={\n <Stack>\n <Typography variant=\"body2\">{`The ${brand} start-up screen`}</Typography>\n {status.platformReady ? null : (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Until it is ready, your readers show their standard screen.'}\n </Typography>\n )}\n </Stack>\n }\n />\n )}\n <FormControlLabel\n value=\"logo\"\n disabled={Boolean(blockedReason) || !hasLogo}\n control={<Radio size=\"small\" />}\n label={\n <Stack>\n <Typography variant=\"body2\">{'Your logo'}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Your organization profile’s logo, centered on a white screen.'}\n </Typography>\n </Stack>\n }\n />\n <FormControlLabel\n value=\"image\"\n disabled={Boolean(blockedReason)}\n control={<Radio size=\"small\" />}\n label={\n <Stack>\n <Typography variant=\"body2\">{'Your own image'}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`A full-screen portrait image from your media library, at least ${POS_READER_SPLASH_LARGEST.width} × ${POS_READER_SPLASH_LARGEST.height} pixels.`}\n </Typography>\n </Stack>\n }\n />\n </RadioGroup>\n {hasLogo ? null : (\n <PrerequisiteNotice\n href={profileHref}\n actionLabel=\"Organization profile\"\n severity={status.effectiveChoice === 'logo' ? 'warning' : 'info'}\n >\n {'Add a logo to your organization profile to show it on your card readers.'}\n </PrerequisiteNotice>\n )}\n {status.effectiveChoice === 'image' ? (\n <Box>\n <BlockedControl blocked={Boolean(blockedReason)} reason={blockedReason ?? ''}>\n <Button size=\"small\" onClick={() => void chooseImage()}>\n {status.image ? 'Choose another image' : 'Choose image'}\n </Button>\n </BlockedControl>\n </Box>\n ) : null}\n {preview ? (\n <Box\n component=\"img\"\n src={preview}\n alt=\"\"\n sx={(theme) => ({\n alignSelf: 'flex-start',\n maxWidth: theme.spacing(16),\n maxHeight: theme.spacing(16),\n objectFit: 'contain',\n borderRadius: 1,\n border: 1,\n borderColor: 'divider',\n })}\n />\n ) : null}\n {status.problem && !(status.effectiveChoice === 'logo' && !hasLogo) ? (\n <Alert severity=\"warning\">{status.problem}</Alert>\n ) : (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {!status.locationReady\n ? 'Your readers show it once you add your first one.'\n : status.appliedAtMs\n ? `Sent to your readers ${new Date(status.appliedAtMs).toLocaleString()}. Readers update within about ten minutes.`\n : 'Readers update within about ten minutes of a change.'}\n </Typography>\n )}\n </Stack>\n )\n}\nPosReaderSplashSetting.displayName = 'PosReaderSplashSetting'\n\nexport default PosReaderSplashSetting\n"],"names":["useMediaPicker","BlockedControl","PrerequisiteNotice","useSnackbar","useConsoleHostRoute","useUser","Alert","Box","Button","FormControlLabel","Radio","RadioGroup","Stack","Typography","useCallback","useEffect","useState","POS_READER_SPLASH_LARGEST","posReaderSplashArtworkProblem","PosReaderSplashRequestError","readerSplashStatus","saveReaderSplash","imageSize","src","Promise","resolve","image","Image","onload","width","naturalWidth","height","naturalHeight","onerror","NOT_ALLOWED","PosReaderSplashSetting","hostId","canManagePos","picked","status","data","user","enqueueSnackbar","pickMedia","orgSlug","setStatus","busy","setBusy","setPicked","uid","active","then","answer","catch","save","choice","problem","locationReady","variant","persist","error","message","chooseImage","media","kind","mediaId","mediaScope","size","url","contentType","available","blockedReason","hasLogo","Boolean","logoUrl","profileHref","undefined","brand","productName","preview","effectiveChoice","spacing","color","value","onChange","event","target","whiteLabel","disabled","control","label","platformReady","href","actionLabel","severity","blocked","reason","onClick","component","alt","sx","theme","alignSelf","maxWidth","maxHeight","objectFit","borderRadius","border","borderColor","appliedAtMs","Date","toLocaleString","displayName"],"mappings":"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"}
|
|
@@ -9,10 +9,12 @@ export interface ProductCheckInFieldsProps {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Check-in at the window (AGL-4043): whether each item sold of this product
|
|
12
|
-
* is somebody to check in on the day it
|
|
12
|
+
* is somebody to check in on the day it is for — a day pass, a camping
|
|
13
13
|
* spot, parking — and how many people one item admits. A product with
|
|
14
14
|
* options can turn it on or off per variant ("Spectator" needs no
|
|
15
|
-
* wristband) and give a variant its own number of people.
|
|
15
|
+
* wristband) and give a variant its own number of people. "Ask the buyer
|
|
16
|
+
* which day" lets an online buyer pick the day (a pass bought ahead);
|
|
17
|
+
* without an answer it is the day they buy.
|
|
16
18
|
*
|
|
17
19
|
* Memoized on its own props like every section of this editor (AGL-3423).
|
|
18
20
|
*/
|