@aglyn/plugins-commerce 1.0.0-beta.232 → 1.0.0-beta.233
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +13 -13
- package/src/lib/components/cart-extras.d.ts +6 -0
- package/src/lib/components/cart-extras.js +4 -1
- package/src/lib/components/cart-extras.js.map +1 -1
- package/src/lib/components/cart-fulfillment.d.ts +117 -0
- package/src/lib/components/cart-fulfillment.js +367 -0
- package/src/lib/components/cart-fulfillment.js.map +1 -0
- package/src/lib/components/cart.js +52 -10
- package/src/lib/components/cart.js.map +1 -1
- package/src/lib/components/commerce-console-page.js +42 -1
- package/src/lib/components/commerce-console-page.js.map +1 -1
- package/src/lib/components/console/host-orders-card.component.js +38 -10
- package/src/lib/components/console/host-orders-card.component.js.map +1 -1
- package/src/lib/components/console/local-delivery-settings-card.component.d.ts +37 -0
- package/src/lib/components/console/local-delivery-settings-card.component.js +542 -0
- package/src/lib/components/console/local-delivery-settings-card.component.js.map +1 -0
- package/src/lib/components/console/locations-card.component.js +177 -3
- package/src/lib/components/console/locations-card.component.js.map +1 -1
- package/src/lib/components/console/order-detail-dialog.component.js +10 -0
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -1
- package/src/lib/components/console/order-local-fulfillment-panel.component.d.ts +44 -0
- package/src/lib/components/console/order-local-fulfillment-panel.component.js +265 -0
- package/src/lib/components/console/order-local-fulfillment-panel.component.js.map +1 -0
- package/src/lib/components/console/order-offline-notice.component.d.ts +12 -0
- package/src/lib/components/console/order-offline-notice.component.js +53 -0
- package/src/lib/components/console/order-offline-notice.component.js.map +1 -0
- package/src/lib/components/console/pickup-delivery-queue-card.component.d.ts +35 -0
- package/src/lib/components/console/pickup-delivery-queue-card.component.js +222 -0
- package/src/lib/components/console/pickup-delivery-queue-card.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-api.d.ts +24 -1
- package/src/lib/components/console/pos/pos-api.js +13 -0
- package/src/lib/components/console/pos/pos-api.js.map +1 -1
- package/src/lib/components/console/pos/pos-item-dialog.component.d.ts +12 -0
- package/src/lib/components/console/pos/pos-item-dialog.component.js +10 -8
- package/src/lib/components/console/pos/pos-item-dialog.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-kiosk-queue.component.d.ts +22 -0
- package/src/lib/components/console/pos/pos-kiosk-queue.component.js +168 -0
- package/src/lib/components/console/pos/pos-kiosk-queue.component.js.map +1 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.d.ts +18 -0
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js +116 -1
- package/src/lib/components/console/pos/pos-tender-dialogs.component.js.map +1 -1
- package/src/lib/components/console/pos/pos-tender-panel.component.d.ts +8 -0
- package/src/lib/components/console/pos/pos-tender-panel.component.js +77 -18
- package/src/lib/components/console/pos/pos-tender-panel.component.js.map +1 -1
- package/src/lib/components/console/pos/use-pos-display.d.ts +5 -2
- package/src/lib/components/console/pos/use-pos-display.js +3 -2
- package/src/lib/components/console/pos/use-pos-display.js.map +1 -1
- package/src/lib/components/console/pos-devices-card.component.js +2 -2
- package/src/lib/components/console/pos-devices-card.component.js.map +1 -1
- package/src/lib/components/console/pos-display/pairing-screen.d.ts +5 -2
- package/src/lib/components/console/pos-display/pairing-screen.js +7 -5
- package/src/lib/components/console/pos-display/pairing-screen.js.map +1 -1
- package/src/lib/components/console/pos-display/pos-display-api.d.ts +7 -1
- package/src/lib/components/console/pos-display/pos-display-api.js +7 -2
- package/src/lib/components/console/pos-display/pos-display-api.js.map +1 -1
- package/src/lib/components/console/pos-kiosk/kiosk-checkout.d.ts +41 -0
- package/src/lib/components/console/pos-kiosk/kiosk-checkout.js +275 -0
- package/src/lib/components/console/pos-kiosk/kiosk-checkout.js.map +1 -0
- package/src/lib/components/console/pos-kiosk/kiosk-menu.d.ts +32 -0
- package/src/lib/components/console/pos-kiosk/kiosk-menu.js +344 -0
- package/src/lib/components/console/pos-kiosk/kiosk-menu.js.map +1 -0
- package/src/lib/components/console/pos-kiosk/kiosk-staff.d.ts +12 -0
- package/src/lib/components/console/pos-kiosk/kiosk-staff.js +257 -0
- package/src/lib/components/console/pos-kiosk/kiosk-staff.js.map +1 -0
- package/src/lib/components/console/pos-kiosk/pos-kiosk-api.d.ts +114 -0
- package/src/lib/components/console/pos-kiosk/pos-kiosk-api.js +189 -0
- package/src/lib/components/console/pos-kiosk/pos-kiosk-api.js.map +1 -0
- package/src/lib/components/console/pos-kiosk/use-kiosk-idle.d.ts +16 -0
- package/src/lib/components/console/pos-kiosk/use-kiosk-idle.js +80 -0
- package/src/lib/components/console/pos-kiosk/use-kiosk-idle.js.map +1 -0
- package/src/lib/components/console/pos-kiosk-page.component.d.ts +28 -0
- package/src/lib/components/console/pos-kiosk-page.component.js +791 -0
- package/src/lib/components/console/pos-kiosk-page.component.js.map +1 -0
- package/src/lib/components/console/pos-offline/pos-offline-api.d.ts +44 -0
- package/src/lib/components/console/pos-offline/pos-offline-api.js +69 -0
- package/src/lib/components/console/pos-offline/pos-offline-api.js.map +1 -0
- package/src/lib/components/console/pos-offline/pos-offline-banner.component.d.ts +7 -0
- package/src/lib/components/console/pos-offline/pos-offline-banner.component.js +135 -0
- package/src/lib/components/console/pos-offline/pos-offline-banner.component.js.map +1 -0
- package/src/lib/components/console/pos-offline/pos-offline-checkout.component.d.ts +32 -0
- package/src/lib/components/console/pos-offline/pos-offline-checkout.component.js +287 -0
- package/src/lib/components/console/pos-offline/pos-offline-checkout.component.js.map +1 -0
- package/src/lib/components/console/pos-offline/pos-offline-store.d.ts +63 -0
- package/src/lib/components/console/pos-offline/pos-offline-store.js +145 -0
- package/src/lib/components/console/pos-offline/pos-offline-store.js.map +1 -0
- package/src/lib/components/console/pos-offline/register-offline.d.ts +24 -0
- package/src/lib/components/console/pos-offline/register-offline.js +24 -0
- package/src/lib/components/console/pos-offline/register-offline.js.map +1 -0
- package/src/lib/components/console/pos-offline/use-pos-offline.d.ts +85 -0
- package/src/lib/components/console/pos-offline/use-pos-offline.js +542 -0
- package/src/lib/components/console/pos-offline/use-pos-offline.js.map +1 -0
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js +72 -17
- package/src/lib/components/console/pos-ops/pos-shift-history-card.component.js.map +1 -1
- package/src/lib/components/console/pos-page.component.js +174 -27
- package/src/lib/components/console/pos-page.component.js.map +1 -1
- package/src/lib/components/console/products-hub-card.component.js +35 -10
- package/src/lib/components/console/products-hub-card.component.js.map +1 -1
- package/src/lib/components/console/shipping-settings-card.component.js +1 -1
- package/src/lib/components/console/shipping-settings-card.component.js.map +1 -1
- package/src/lib/components/console/stock-movements-card.component.js +48 -16
- package/src/lib/components/console/stock-movements-card.component.js.map +1 -1
- package/src/lib/components/console/store-zones.d.ts +8 -1
- package/src/lib/components/console/store-zones.js +11 -1
- package/src/lib/components/console/store-zones.js.map +1 -1
- package/src/lib/components/order-status.js +66 -0
- package/src/lib/components/order-status.js.map +1 -1
- package/src/lib/components/product-detail.js +42 -15
- package/src/lib/components/product-detail.js.map +1 -1
- package/src/lib/constants/local-fulfillment-list-query.d.ts +48 -0
- package/src/lib/constants/local-fulfillment-list-query.js +84 -0
- package/src/lib/constants/local-fulfillment-list-query.js.map +1 -0
- package/src/lib/constants/orders-list-query.d.ts +7 -2
- package/src/lib/constants/orders-list-query.js +89 -8
- package/src/lib/constants/orders-list-query.js.map +1 -1
- package/src/lib/constants/pos-shift-list-query.d.ts +22 -0
- package/src/lib/constants/pos-shift-list-query.js +115 -0
- package/src/lib/constants/pos-shift-list-query.js.map +1 -0
- package/src/lib/constants/product-list-query.d.ts +6 -1
- package/src/lib/constants/product-list-query.js +77 -8
- package/src/lib/constants/product-list-query.js.map +1 -1
- package/src/lib/constants/stock-movement-query.d.ts +3 -2
- package/src/lib/constants/stock-movement-query.js +52 -8
- package/src/lib/constants/stock-movement-query.js.map +1 -1
- package/src/lib/model/buyer-notifications.d.ts +5 -3
- package/src/lib/model/buyer-notifications.js +25 -4
- package/src/lib/model/buyer-notifications.js.map +1 -1
- package/src/lib/model/commerce-orders.d.ts +59 -0
- package/src/lib/model/commerce-orders.js.map +1 -1
- package/src/lib/model/commerce-pos-kiosk.d.ts +175 -0
- package/src/lib/model/commerce-pos-kiosk.js +147 -0
- package/src/lib/model/commerce-pos-kiosk.js.map +1 -0
- package/src/lib/model/commerce-pos-offline.d.ts +234 -0
- package/src/lib/model/commerce-pos-offline.js +301 -0
- package/src/lib/model/commerce-pos-offline.js.map +1 -0
- package/src/lib/model/commerce-pos-ops.d.ts +16 -6
- package/src/lib/model/commerce-pos-ops.js +12 -4
- package/src/lib/model/commerce-pos-ops.js.map +1 -1
- package/src/lib/model/commerce-pos.d.ts +13 -1
- package/src/lib/model/commerce-pos.js +5 -4
- package/src/lib/model/commerce-pos.js.map +1 -1
- package/src/lib/model/commerce-stock-holds.d.ts +24 -3
- package/src/lib/model/commerce-stock-holds.js +26 -8
- package/src/lib/model/commerce-stock-holds.js.map +1 -1
- package/src/lib/model/commerce.d.ts +3 -0
- package/src/lib/model/commerce.js.map +1 -1
- package/src/lib/model/index.d.ts +4 -0
- package/src/lib/model/index.js +4 -0
- package/src/lib/model/index.js.map +1 -1
- package/src/lib/model/local-fulfillment-settings.d.ts +178 -0
- package/src/lib/model/local-fulfillment-settings.js +361 -0
- package/src/lib/model/local-fulfillment-settings.js.map +1 -0
- package/src/lib/model/order-list-fields.d.ts +10 -1
- package/src/lib/model/order-list-fields.js +1 -0
- package/src/lib/model/order-list-fields.js.map +1 -1
- package/src/lib/model/order-local-fulfillment.d.ts +131 -0
- package/src/lib/model/order-local-fulfillment.js +125 -0
- package/src/lib/model/order-local-fulfillment.js.map +1 -0
- package/src/lib/model/order-shipping-export.js +4 -0
- package/src/lib/model/order-shipping-export.js.map +1 -1
- package/src/lib/model/order-status-view.d.ts +20 -1
- package/src/lib/model/order-status-view.js +60 -6
- package/src/lib/model/order-status-view.js.map +1 -1
- package/src/lib/plugin-config.js +6 -2
- package/src/lib/plugin-config.js.map +1 -1
- package/src/lib/plugin.js +8 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/pos-kiosk-config.d.ts +26 -0
- package/src/lib/pos-kiosk-config.js +59 -0
- package/src/lib/pos-kiosk-config.js.map +1 -0
- package/src/lib/server/api-v1/openapi.js +8 -0
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/api-v1/order-view.d.ts +19 -0
- package/src/lib/server/api-v1/order-view.js +35 -0
- package/src/lib/server/api-v1/order-view.js.map +1 -1
- package/src/lib/server/billing-webhook.js +238 -87
- package/src/lib/server/billing-webhook.js.map +1 -1
- package/src/lib/server/cart-checkout.d.ts +2 -0
- package/src/lib/server/cart-checkout.js +173 -13
- package/src/lib/server/cart-checkout.js.map +1 -1
- package/src/lib/server/checkout-extras.js +18 -4
- package/src/lib/server/checkout-extras.js.map +1 -1
- package/src/lib/server/checkout.js +71 -14
- package/src/lib/server/checkout.js.map +1 -1
- package/src/lib/server/local-fulfillment-status.d.ts +86 -0
- package/src/lib/server/local-fulfillment-status.js +379 -0
- package/src/lib/server/local-fulfillment-status.js.map +1 -0
- package/src/lib/server/local-fulfillment.d.ts +190 -0
- package/src/lib/server/local-fulfillment.js +580 -0
- package/src/lib/server/local-fulfillment.js.map +1 -0
- package/src/lib/server/membership-register.js +3 -1
- package/src/lib/server/membership-register.js.map +1 -1
- package/src/lib/server/order-notifications.js +61 -0
- package/src/lib/server/order-notifications.js.map +1 -1
- package/src/lib/server/pos-display.d.ts +27 -1
- package/src/lib/server/pos-display.js +50 -9
- package/src/lib/server/pos-display.js.map +1 -1
- package/src/lib/server/pos-kiosk-principal.d.ts +29 -0
- package/src/lib/server/pos-kiosk-principal.js +42 -0
- package/src/lib/server/pos-kiosk-principal.js.map +1 -0
- package/src/lib/server/pos-kiosk.d.ts +54 -0
- package/src/lib/server/pos-kiosk.js +972 -0
- package/src/lib/server/pos-kiosk.js.map +1 -0
- package/src/lib/server/pos-offline-sync.d.ts +85 -0
- package/src/lib/server/pos-offline-sync.js +765 -0
- package/src/lib/server/pos-offline-sync.js.map +1 -0
- package/src/lib/server/pos-order.js +22 -4
- package/src/lib/server/pos-order.js.map +1 -1
- package/src/lib/server/pos-payment.d.ts +6 -0
- package/src/lib/server/pos-payment.js +225 -6
- package/src/lib/server/pos-payment.js.map +1 -1
- package/src/lib/server/pos-print.js +5 -0
- package/src/lib/server/pos-print.js.map +1 -1
- package/src/lib/server/pos-return.js +27 -0
- package/src/lib/server/pos-return.js.map +1 -1
- package/src/lib/server/pos-sale.d.ts +6 -0
- package/src/lib/server/pos-sale.js +2 -0
- package/src/lib/server/pos-sale.js.map +1 -1
- package/src/lib/server/pos-shift.js +8 -1
- package/src/lib/server/pos-shift.js.map +1 -1
- package/src/lib/server/refund.js +3 -0
- package/src/lib/server/refund.js.map +1 -1
- package/src/lib/server/stock-hold.d.ts +9 -1
- package/src/lib/server/stock-hold.js +15 -7
- package/src/lib/server/stock-hold.js.map +1 -1
- package/src/lib/server.js +16 -0
- package/src/lib/server.js.map +1 -1
- package/src/lib/tenant-emails.js +161 -0
- package/src/lib/tenant-emails.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/order-status.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { mdiTruckCheckOutline } from '@aglyn/shared-data-mdi'\nimport Alert from '@mui/material/Alert'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Chip from '@mui/material/Chip'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Divider from '@mui/material/Divider'\nimport Link from '@mui/material/Link'\nimport Paper from '@mui/material/Paper'\nimport Stack from '@mui/material/Stack'\nimport Step from '@mui/material/Step'\nimport StepLabel from '@mui/material/StepLabel'\nimport Stepper from '@mui/material/Stepper'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useEffect, useState } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { ORDER_STATUS_COMPONENT_ID } from '../constants/order-status'\nimport {\n formatOrderMoney,\n type OrderStatusView,\n} from '../model'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = ORDER_STATUS_COMPONENT_ID\n\nexport interface OrderStatusProps {\n heading?: string\n}\n\ntype LoadState =\n | { kind: 'loading' }\n | { kind: 'missing'; message: string }\n | { kind: 'ready'; view: OrderStatusView }\n\nfunction dateLabel(atMs: number | null): string {\n if (!atMs) return ''\n return new Date(atMs).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\n/**\n * The guest order-status page (AGL-3610): what a buyer sees when they open\n * the \"View your order\" link in any order email. The commerce page resolver\n * serves it at `/order-status` inside the site's own header and footer; a\n * merchant can also place it on a page of their own design at that address.\n *\n * The order is read AFTER hydration from `?o=&t=` — the page itself is the\n * same for every buyer and may be cached, the order never is — through\n * `/api/commerce/order-status`, which verifies the signed link and returns an\n * allow-listed projection (no email, phone or address).\n */\nconst OrderStatus = forwardRef<HTMLDivElement, OrderStatusProps>((props, ref) => {\n const { heading, ...rest } = props\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const siteFetch = Aglyn.useSiteFetch()\n const [state, setState] = useState<LoadState>({ kind: 'loading' })\n\n useEffect(() => {\n if (!hostId) return\n const params = new URLSearchParams(window.location.search)\n const orderId = params.get('o') ?? ''\n const token = params.get('t') ?? ''\n if (!orderId || !token) {\n setState({\n kind: 'missing',\n message: 'Open this page from the link in your order email.',\n })\n return\n }\n let live = true\n siteFetch(\n `/api/commerce/order-status?hostId=${encodeURIComponent(hostId)}` +\n `&o=${encodeURIComponent(orderId)}&t=${encodeURIComponent(token)}`,\n )\n .then(async (response) => {\n const payload = await response.json().catch(() => ({}))\n if (!live) return\n if (!response.ok) {\n setState({\n kind: 'missing',\n message: String(payload?.error ?? 'We could not find that order.'),\n })\n return\n }\n setState({ kind: 'ready', view: payload as OrderStatusView })\n })\n .catch(() => {\n if (live) {\n setState({\n kind: 'missing',\n message: 'Your order could not be loaded. Check your connection and try again.',\n })\n }\n })\n return () => {\n live = false\n }\n }, [hostId, siteFetch])\n\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n { p: 3, border: '1px dashed', borderColor: 'divider', borderRadius: 1 },\n ...nodeSx,\n ]}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Order status — a buyer’s order, shipments and tracking render here'}\n </Typography>\n </Box>\n )\n }\n\n if (state.kind === 'loading') {\n return (\n <Box ref={ref} {...rest} sx={[{ py: 6, textAlign: 'center' }, ...nodeSx]}>\n <CircularProgress size={28} aria-label=\"Loading your order\" />\n </Box>\n )\n }\n\n if (state.kind === 'missing') {\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 560 }, ...nodeSx]}>\n <Typography variant=\"h4\" component=\"h1\" gutterBottom>\n {heading || 'Your order'}\n </Typography>\n <Alert severity=\"info\">{state.message}</Alert>\n </Box>\n )\n }\n\n const { view } = state\n const money = (cents: number) => formatOrderMoney(cents, view.currency)\n const activeStep = Math.max(\n 0,\n view.steps.reduce((last, step, index) => (step.done ? index : last), 0),\n )\n const cancelled = view.status === 'cancelled'\n\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 720 }, ...nodeSx]}>\n <Stack spacing={3}>\n <Stack spacing={1}>\n {view.storeName ? (\n <Typography variant=\"overline\" color=\"text.secondary\">\n {view.storeName}\n </Typography>\n ) : null}\n <Stack direction=\"row\" spacing={1.5} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"h4\" component=\"h1\">\n {heading || `Order ${view.number}`}\n </Typography>\n <Chip\n label={view.statusLabel}\n color={cancelled || view.status === 'refunded' ? 'default' : 'primary'}\n size=\"small\"\n />\n </Stack>\n {view.createdAtMs ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Placed ${dateLabel(view.createdAtMs)}`}\n </Typography>\n ) : null}\n </Stack>\n\n <Stepper activeStep={activeStep} alternativeLabel>\n {view.steps.map((step) => (\n <Step key={step.key} completed={step.done}>\n <StepLabel\n optional={\n step.atMs ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {dateLabel(step.atMs)}\n </Typography>\n ) : undefined\n }\n >\n {step.label}\n </StepLabel>\n </Step>\n ))}\n </Stepper>\n\n {view.shipments.length ? (\n <Stack spacing={1.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {view.shipments.length === 1 ? 'Shipment' : 'Shipments'}\n </Typography>\n {view.shipments.map((shipment, index) => (\n <Paper key={shipment.id || index} variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={1}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap' }}\n >\n <Typography variant=\"subtitle2\">\n {[\n view.shipments.length > 1 ? `Package ${index + 1}` : 'Package',\n dateLabel(shipment.atMs) ? `shipped ${dateLabel(shipment.atMs)}` : '',\n ]\n .filter(Boolean)\n .join(' · ')}\n </Typography>\n {shipment.trackingUrl ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n href={shipment.trackingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {'Track package'}\n </Button>\n ) : null}\n </Stack>\n {shipment.trackingNumber ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {[shipment.carrier, shipment.trackingNumber].filter(Boolean).join(' ')}\n </Typography>\n ) : null}\n <Typography variant=\"body2\">\n {shipment.lines.map((line) => `${line.quantity}× ${line.name}`).join(', ')}\n </Typography>\n </Stack>\n </Paper>\n ))}\n </Stack>\n ) : null}\n\n <Stack spacing={1}>\n <Typography variant=\"h6\" component=\"h2\">\n {'Items'}\n </Typography>\n {view.lines.map((line, index) => (\n <Stack key={index} direction=\"row\" spacing={2} sx={{ justifyContent: 'space-between' }}>\n <Box>\n <Typography\n variant=\"body2\"\n sx={line.refunded ? { textDecoration: 'line-through' } : undefined}\n >\n {`${line.quantity}× ${line.name}`}\n {line.variantLabel ? ` (${line.variantLabel})` : ''}\n </Typography>\n {line.refunded ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n ) : !cancelled && line.shippedQuantity > 0 && line.shippedQuantity < line.quantity ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${line.shippedQuantity} of ${line.quantity} shipped`}\n </Typography>\n ) : null}\n </Box>\n <Typography variant=\"body2\">{money(line.amountCents)}</Typography>\n </Stack>\n ))}\n <Divider />\n {(\n [\n ['Subtotal', view.totals.itemsCents],\n ['Discount', -view.totals.discountCents],\n ['Shipping', view.totals.shippingCents],\n // Optional lines the buyer took at checkout (AGL-3635), by name.\n ...(view.extras ?? []).map((extra) => [extra.label, extra.amountCents]),\n ['Tax', view.totals.taxCents],\n ] as Array<[string, number]>\n )\n .filter(([label, cents]) => label === 'Subtotal' || cents !== 0)\n .map(([label, cents]) => (\n <Stack key={label} direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(cents)}\n </Typography>\n </Stack>\n ))}\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"subtitle1\">{'Total'}</Typography>\n <Typography variant=\"subtitle1\">{money(view.totals.totalCents)}</Typography>\n </Stack>\n {view.totals.refundedCents > 0 ? (\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(-view.totals.refundedCents)}\n </Typography>\n </Stack>\n ) : null}\n </Stack>\n\n {view.actions.length ? (\n <Stack direction=\"row\" spacing={1} sx={{ flexWrap: 'wrap' }}>\n {view.actions.map((action) => (\n <Button key={action.id} variant=\"outlined\" href={action.url}>\n {action.label}\n </Button>\n ))}\n </Stack>\n ) : null}\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Questions about your order? Reply to your order email'}\n {view.storeName ? ` or contact ${view.storeName}` : ''}\n {'.'}\n </Typography>\n <Link href=\"/\" variant=\"body2\">\n {'Continue shopping'}\n </Link>\n </Stack>\n </Box>\n )\n})\nOrderStatus.displayName = 'OrderStatus'\n\nexport const schema: Aglyn.ComponentSchema<OrderStatusProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Order status',\n description:\n 'A buyer’s order, shipments and tracking, opened from the link in their order emails.',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'heading',\n label: 'Heading',\n description: 'Shown above the order. Defaults to the order number.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Order status',\n pluginId: BUNDLE_ID,\n description: 'The buyer’s order status, for the /order-status page',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: {},\n },\n },\n]\n\nexport default OrderStatus\n"],"names":["Aglyn","mdiTruckCheckOutline","Alert","Box","Button","Chip","CircularProgress","Divider","Link","Paper","Stack","Step","StepLabel","Stepper","Typography","forwardRef","useEffect","useState","BUNDLE_ID","ORDER_STATUS_COMPONENT_ID","formatOrderMoney","generatePresetId","ID","dateLabel","atMs","Date","toLocaleDateString","undefined","month","day","year","OrderStatus","props","ref","view","heading","rest","nodeSx","Array","isArray","hostId","useSite","siteFetch","useSiteFetch","state","setState","kind","params","URLSearchParams","window","location","search","orderId","get","token","message","live","encodeURIComponent","then","response","payload","json","catch","ok","String","error","sx","p","border","borderColor","borderRadius","variant","color","py","textAlign","size","aria-label","maxWidth","component","gutterBottom","severity","money","cents","currency","activeStep","Math","max","steps","reduce","last","step","index","done","cancelled","status","spacing","storeName","direction","alignItems","flexWrap","number","label","statusLabel","createdAtMs","alternativeLabel","map","completed","optional","key","shipments","length","shipment","justifyContent","filter","Boolean","join","trackingUrl","href","target","rel","trackingNumber","carrier","lines","line","quantity","name","id","refunded","textDecoration","variantLabel","shippedQuantity","amountCents","totals","itemsCents","discountCents","shippingCents","extras","extra","taxCents","totalCents","refundedCents","actions","action","url","displayName","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","FieldComponentType","TEXT_FIELD","presets","type","NodeType","PRESET","data","componentId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/order-status.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { mdiTruckCheckOutline } from '@aglyn/shared-data-mdi'\nimport Alert from '@mui/material/Alert'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Chip from '@mui/material/Chip'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Divider from '@mui/material/Divider'\nimport Link from '@mui/material/Link'\nimport Paper from '@mui/material/Paper'\nimport Stack from '@mui/material/Stack'\nimport Step from '@mui/material/Step'\nimport StepLabel from '@mui/material/StepLabel'\nimport Stepper from '@mui/material/Stepper'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useEffect, useState } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { ORDER_STATUS_COMPONENT_ID } from '../constants/order-status'\nimport {\n formatOrderMoney,\n type OrderStatusView,\n} from '../model'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = ORDER_STATUS_COMPONENT_ID\n\nexport interface OrderStatusProps {\n heading?: string\n}\n\ntype LoadState =\n | { kind: 'loading' }\n | { kind: 'missing'; message: string }\n | { kind: 'ready'; view: OrderStatusView }\n\nfunction dateLabel(atMs: number | null): string {\n if (!atMs) return ''\n return new Date(atMs).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\n/**\n * The guest order-status page (AGL-3610): what a buyer sees when they open\n * the \"View your order\" link in any order email. The commerce page resolver\n * serves it at `/order-status` inside the site's own header and footer; a\n * merchant can also place it on a page of their own design at that address.\n *\n * The order is read AFTER hydration from `?o=&t=` — the page itself is the\n * same for every buyer and may be cached, the order never is — through\n * `/api/commerce/order-status`, which verifies the signed link and returns an\n * allow-listed projection (no email, phone or address).\n */\nconst OrderStatus = forwardRef<HTMLDivElement, OrderStatusProps>((props, ref) => {\n const { heading, ...rest } = props\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const siteFetch = Aglyn.useSiteFetch()\n const [state, setState] = useState<LoadState>({ kind: 'loading' })\n\n useEffect(() => {\n if (!hostId) return\n const params = new URLSearchParams(window.location.search)\n const orderId = params.get('o') ?? ''\n const token = params.get('t') ?? ''\n if (!orderId || !token) {\n setState({\n kind: 'missing',\n message: 'Open this page from the link in your order email.',\n })\n return\n }\n let live = true\n siteFetch(\n `/api/commerce/order-status?hostId=${encodeURIComponent(hostId)}` +\n `&o=${encodeURIComponent(orderId)}&t=${encodeURIComponent(token)}`,\n )\n .then(async (response) => {\n const payload = await response.json().catch(() => ({}))\n if (!live) return\n if (!response.ok) {\n setState({\n kind: 'missing',\n message: String(payload?.error ?? 'We could not find that order.'),\n })\n return\n }\n setState({ kind: 'ready', view: payload as OrderStatusView })\n })\n .catch(() => {\n if (live) {\n setState({\n kind: 'missing',\n message: 'Your order could not be loaded. Check your connection and try again.',\n })\n }\n })\n return () => {\n live = false\n }\n }, [hostId, siteFetch])\n\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n { p: 3, border: '1px dashed', borderColor: 'divider', borderRadius: 1 },\n ...nodeSx,\n ]}\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Order status — a buyer’s order, shipments and tracking render here'}\n </Typography>\n </Box>\n )\n }\n\n if (state.kind === 'loading') {\n return (\n <Box ref={ref} {...rest} sx={[{ py: 6, textAlign: 'center' }, ...nodeSx]}>\n <CircularProgress size={28} aria-label=\"Loading your order\" />\n </Box>\n )\n }\n\n if (state.kind === 'missing') {\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 560 }, ...nodeSx]}>\n <Typography variant=\"h4\" component=\"h1\" gutterBottom>\n {heading || 'Your order'}\n </Typography>\n <Alert severity=\"info\">{state.message}</Alert>\n </Box>\n )\n }\n\n const { view } = state\n const money = (cents: number) => formatOrderMoney(cents, view.currency)\n const activeStep = Math.max(\n 0,\n view.steps.reduce((last, step, index) => (step.done ? index : last), 0),\n )\n const cancelled = view.status === 'cancelled'\n\n return (\n <Box ref={ref} {...rest} sx={[{ maxWidth: 720 }, ...nodeSx]}>\n <Stack spacing={3}>\n <Stack spacing={1}>\n {view.storeName ? (\n <Typography variant=\"overline\" color=\"text.secondary\">\n {view.storeName}\n </Typography>\n ) : null}\n <Stack direction=\"row\" spacing={1.5} sx={{ alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography variant=\"h4\" component=\"h1\">\n {heading || `Order ${view.number}`}\n </Typography>\n <Chip\n label={view.statusLabel}\n color={cancelled || view.status === 'refunded' ? 'default' : 'primary'}\n size=\"small\"\n />\n </Stack>\n {view.createdAtMs ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {`Placed ${dateLabel(view.createdAtMs)}`}\n </Typography>\n ) : null}\n </Stack>\n\n <Stepper activeStep={activeStep} alternativeLabel>\n {view.steps.map((step) => (\n <Step key={step.key} completed={step.done}>\n <StepLabel\n optional={\n step.atMs ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {dateLabel(step.atMs)}\n </Typography>\n ) : undefined\n }\n >\n {step.label}\n </StepLabel>\n </Step>\n ))}\n </Stepper>\n\n {/* Where to collect it, or when it is coming (AGL-3624). */}\n {view.pickup ? (\n <Paper variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={0.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {view.pickup.status === 'picked_up' ? 'Picked up' : 'Pickup'}\n </Typography>\n <Typography variant=\"body2\">\n {[view.pickup.locationName, view.pickup.address].filter(Boolean).join(', ')}\n </Typography>\n {view.pickup.status === 'preparing' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'We’re preparing your order and will email you when it’s ready.'}\n </Typography>\n ) : null}\n {view.pickup.hours && view.pickup.status !== 'picked_up' ? (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ whiteSpace: 'pre-line' }}>\n {view.pickup.hours}\n </Typography>\n ) : null}\n {view.pickup.instructions && view.pickup.status !== 'picked_up' ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {view.pickup.instructions}\n </Typography>\n ) : null}\n </Stack>\n </Paper>\n ) : null}\n {view.localDelivery ? (\n <Paper variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={0.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {'Local delivery'}\n </Typography>\n <Typography variant=\"body2\">{view.localDelivery.statusLabel}</Typography>\n {view.localDelivery.windowLabel ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {view.localDelivery.windowLabel}\n </Typography>\n ) : null}\n </Stack>\n </Paper>\n ) : null}\n\n {view.shipments.length ? (\n <Stack spacing={1.5}>\n <Typography variant=\"h6\" component=\"h2\">\n {view.shipments.length === 1 ? 'Shipment' : 'Shipments'}\n </Typography>\n {view.shipments.map((shipment, index) => (\n <Paper key={shipment.id || index} variant=\"outlined\" sx={{ p: 2 }}>\n <Stack spacing={1}>\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap' }}\n >\n <Typography variant=\"subtitle2\">\n {[\n view.shipments.length > 1 ? `Package ${index + 1}` : 'Package',\n dateLabel(shipment.atMs) ? `shipped ${dateLabel(shipment.atMs)}` : '',\n ]\n .filter(Boolean)\n .join(' · ')}\n </Typography>\n {shipment.trackingUrl ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n href={shipment.trackingUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {'Track package'}\n </Button>\n ) : null}\n </Stack>\n {shipment.trackingNumber ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {[shipment.carrier, shipment.trackingNumber].filter(Boolean).join(' ')}\n </Typography>\n ) : null}\n <Typography variant=\"body2\">\n {shipment.lines.map((line) => `${line.quantity}× ${line.name}`).join(', ')}\n </Typography>\n </Stack>\n </Paper>\n ))}\n </Stack>\n ) : null}\n\n <Stack spacing={1}>\n <Typography variant=\"h6\" component=\"h2\">\n {'Items'}\n </Typography>\n {view.lines.map((line, index) => (\n <Stack key={index} direction=\"row\" spacing={2} sx={{ justifyContent: 'space-between' }}>\n <Box>\n <Typography\n variant=\"body2\"\n sx={line.refunded ? { textDecoration: 'line-through' } : undefined}\n >\n {`${line.quantity}× ${line.name}`}\n {line.variantLabel ? ` (${line.variantLabel})` : ''}\n </Typography>\n {line.refunded ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n ) : !cancelled && line.shippedQuantity > 0 && line.shippedQuantity < line.quantity ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`${line.shippedQuantity} of ${line.quantity} shipped`}\n </Typography>\n ) : null}\n </Box>\n <Typography variant=\"body2\">{money(line.amountCents)}</Typography>\n </Stack>\n ))}\n <Divider />\n {(\n [\n ['Subtotal', view.totals.itemsCents],\n ['Discount', -view.totals.discountCents],\n ['Shipping', view.totals.shippingCents],\n // Optional lines the buyer took at checkout (AGL-3635), by name.\n ...(view.extras ?? []).map((extra) => [extra.label, extra.amountCents]),\n ['Tax', view.totals.taxCents],\n ] as Array<[string, number]>\n )\n .filter(([label, cents]) => label === 'Subtotal' || cents !== 0)\n .map(([label, cents]) => (\n <Stack key={label} direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(cents)}\n </Typography>\n </Stack>\n ))}\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"subtitle1\">{'Total'}</Typography>\n <Typography variant=\"subtitle1\">{money(view.totals.totalCents)}</Typography>\n </Stack>\n {view.totals.refundedCents > 0 ? (\n <Stack direction=\"row\" sx={{ justifyContent: 'space-between' }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Refunded'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {money(-view.totals.refundedCents)}\n </Typography>\n </Stack>\n ) : null}\n </Stack>\n\n {view.actions.length ? (\n <Stack direction=\"row\" spacing={1} sx={{ flexWrap: 'wrap' }}>\n {view.actions.map((action) => (\n <Button key={action.id} variant=\"outlined\" href={action.url}>\n {action.label}\n </Button>\n ))}\n </Stack>\n ) : null}\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Questions about your order? Reply to your order email'}\n {view.storeName ? ` or contact ${view.storeName}` : ''}\n {'.'}\n </Typography>\n <Link href=\"/\" variant=\"body2\">\n {'Continue shopping'}\n </Link>\n </Stack>\n </Box>\n )\n})\nOrderStatus.displayName = 'OrderStatus'\n\nexport const schema: Aglyn.ComponentSchema<OrderStatusProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Order status',\n description:\n 'A buyer’s order, shipments and tracking, opened from the link in their order emails.',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'heading',\n label: 'Heading',\n description: 'Shown above the order. Defaults to the order number.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Order status',\n pluginId: BUNDLE_ID,\n description: 'The buyer’s order status, for the /order-status page',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiTruckCheckOutline.path, sx: { color: 'success.main' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: {},\n },\n },\n]\n\nexport default OrderStatus\n"],"names":["Aglyn","mdiTruckCheckOutline","Alert","Box","Button","Chip","CircularProgress","Divider","Link","Paper","Stack","Step","StepLabel","Stepper","Typography","forwardRef","useEffect","useState","BUNDLE_ID","ORDER_STATUS_COMPONENT_ID","formatOrderMoney","generatePresetId","ID","dateLabel","atMs","Date","toLocaleDateString","undefined","month","day","year","OrderStatus","props","ref","view","heading","rest","nodeSx","Array","isArray","hostId","useSite","siteFetch","useSiteFetch","state","setState","kind","params","URLSearchParams","window","location","search","orderId","get","token","message","live","encodeURIComponent","then","response","payload","json","catch","ok","String","error","sx","p","border","borderColor","borderRadius","variant","color","py","textAlign","size","aria-label","maxWidth","component","gutterBottom","severity","money","cents","currency","activeStep","Math","max","steps","reduce","last","step","index","done","cancelled","status","spacing","storeName","direction","alignItems","flexWrap","number","label","statusLabel","createdAtMs","alternativeLabel","map","completed","optional","key","pickup","locationName","address","filter","Boolean","join","hours","whiteSpace","instructions","localDelivery","windowLabel","shipments","length","shipment","justifyContent","trackingUrl","href","target","rel","trackingNumber","carrier","lines","line","quantity","name","id","refunded","textDecoration","variantLabel","shippedQuantity","amountCents","totals","itemsCents","discountCents","shippingCents","extras","extra","taxCents","totalCents","refundedCents","actions","action","url","displayName","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","FieldComponentType","TEXT_FIELD","presets","type","NodeType","PRESET","data","componentId"],"mappings":";;;AAAA;;;;;;;;;;;;;;;CAeC,GAED,YAAYA,WAAW,eAAc;AACrC,SAASC,oBAAoB,QAAQ,yBAAwB;AAC7D,OAAOC,WAAW,sBAAqB;AACvC,OAAOC,SAAS,oBAAmB;AACnC,OAAOC,YAAY,uBAAsB;AACzC,OAAOC,UAAU,qBAAoB;AACrC,OAAOC,sBAAsB,iCAAgC;AAC7D,OAAOC,aAAa,wBAAuB;AAC3C,OAAOC,UAAU,qBAAoB;AACrC,OAAOC,WAAW,sBAAqB;AACvC,OAAOC,WAAW,sBAAqB;AACvC,OAAOC,UAAU,qBAAoB;AACrC,OAAOC,eAAe,0BAAyB;AAC/C,OAAOC,aAAa,wBAAuB;AAC3C,OAAOC,gBAAgB,2BAA0B;AACjD,SAASC,UAAU,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AACvD,SAASC,SAAS,QAAQ,gCAA4B;AACtD,SAASC,yBAAyB,QAAQ,+BAA2B;AACrE,SACEC,gBAAgB,QAEX,oBAAU;AACjB,SAASC,gBAAgB,QAAQ,iCAA6B;AAE9D,iEAAiE;AACjE,OAAO,MAAMC,KAAwBH,0BAAyB;AAW9D,SAASI,UAAUC,IAAmB;IACpC,IAAI,CAACA,MAAM,OAAO;IAClB,OAAO,IAAIC,KAAKD,MAAME,kBAAkB,CAACC,WAAW;QAClDC,OAAO;QACPC,KAAK;QACLC,MAAM;IACR;AACF;AAEA;;;;;;;;;;CAUC,GACD,MAAMC,4BAAchB,WAA6C,CAACiB,OAAOC;QAsQvDC;IArQhB,MAAM,EAAEC,OAAO,EAAW,GAAGH,OAATI,wCAASJ;;;IAC7B,MAAMK,SAASC,MAAMC,OAAO,CAACP,KAAK,CAAC,KAAK,IAAIA,KAAK,CAAC,KAAK,GAAG;QAACA,KAAK,CAAC,KAAK;KAAC;IACvE,MAAM,EAAEQ,MAAM,EAAE,GAAGxC,MAAMyC,OAAO;IAChC,MAAMC,YAAY1C,MAAM2C,YAAY;IACpC,MAAM,CAACC,OAAOC,SAAS,GAAG5B,SAAoB;QAAE6B,MAAM;IAAU;IAEhE9B,UAAU;YAGQ+B,aACFA;QAHd,IAAI,CAACP,QAAQ;QACb,MAAMO,SAAS,IAAIC,gBAAgBC,OAAOC,QAAQ,CAACC,MAAM;QACzD,MAAMC,WAAUL,cAAAA,OAAOM,GAAG,CAAC,gBAAXN,cAAmB;QACnC,MAAMO,SAAQP,eAAAA,OAAOM,GAAG,CAAC,gBAAXN,eAAmB;QACjC,IAAI,CAACK,WAAW,CAACE,OAAO;YACtBT,SAAS;gBACPC,MAAM;gBACNS,SAAS;YACX;YACA;QACF;QACA,IAAIC,OAAO;QACXd,UACE,CAAC,kCAAkC,EAAEe,mBAAmBjB,SAAS,GAC/D,CAAC,GAAG,EAAEiB,mBAAmBL,SAAS,GAAG,EAAEK,mBAAmBH,QAAQ,EAEnEI,IAAI,CAAC,OAAOC;YACX,MAAMC,UAAU,MAAMD,SAASE,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;YACpD,IAAI,CAACN,MAAM;YACX,IAAI,CAACG,SAASI,EAAE,EAAE;;gBAChBlB,SAAS;oBACPC,MAAM;oBACNS,SAASS,eAAOJ,2BAAAA,QAASK,KAAK,mBAAI;gBACpC;gBACA;YACF;YACApB,SAAS;gBAAEC,MAAM;gBAASZ,MAAM0B;YAA2B;QAC7D,GACCE,KAAK,CAAC;YACL,IAAIN,MAAM;gBACRX,SAAS;oBACPC,MAAM;oBACNS,SAAS;gBACX;YACF;QACF;QACF,OAAO;YACLC,OAAO;QACT;IACF,GAAG;QAAChB;QAAQE;KAAU;IAEtB,IAAI,CAACF,QAAQ;QACX,qBACE,KAACrC;YACC8B,KAAKA;WACDG;YACJ8B,IAAI;gBACF;oBAAEC,GAAG;oBAAGC,QAAQ;oBAAcC,aAAa;oBAAWC,cAAc;gBAAE;mBACnEjC;aACJ;sBAED,cAAA,KAACvB;gBAAWyD,SAAQ;gBAAQC,OAAM;0BAC/B;;;IAIT;IAEA,IAAI5B,MAAME,IAAI,KAAK,WAAW;QAC5B,qBACE,KAAC3C;YAAI8B,KAAKA;WAASG;YAAM8B,IAAI;gBAAC;oBAAEO,IAAI;oBAAGC,WAAW;gBAAS;mBAAMrC;aAAO;sBACtE,cAAA,KAAC/B;gBAAiBqE,MAAM;gBAAIC,cAAW;;;IAG7C;IAEA,IAAIhC,MAAME,IAAI,KAAK,WAAW;QAC5B,qBACE,MAAC3C;YAAI8B,KAAKA;WAASG;YAAM8B,IAAI;gBAAC;oBAAEW,UAAU;gBAAI;mBAAMxC;aAAO;;8BACzD,KAACvB;oBAAWyD,SAAQ;oBAAKO,WAAU;oBAAKC,YAAY;8BACjD5C,WAAW;;8BAEd,KAACjC;oBAAM8E,UAAS;8BAAQpC,MAAMW,OAAO;;;;IAG3C;IAEA,MAAM,EAAErB,IAAI,EAAE,GAAGU;IACjB,MAAMqC,QAAQ,CAACC,QAAkB9D,iBAAiB8D,OAAOhD,KAAKiD,QAAQ;IACtE,MAAMC,aAAaC,KAAKC,GAAG,CACzB,GACApD,KAAKqD,KAAK,CAACC,MAAM,CAAC,CAACC,MAAMC,MAAMC,QAAWD,KAAKE,IAAI,GAAGD,QAAQF,MAAO;IAEvE,MAAMI,YAAY3D,KAAK4D,MAAM,KAAK;IAElC,qBACE,KAAC3F;QAAI8B,KAAKA;OAASG;QAAM8B,IAAI;YAAC;gBAAEW,UAAU;YAAI;eAAMxC;SAAO;kBACzD,cAAA,MAAC3B;YAAMqF,SAAS;;8BACd,MAACrF;oBAAMqF,SAAS;;wBACb7D,KAAK8D,SAAS,iBACb,KAAClF;4BAAWyD,SAAQ;4BAAWC,OAAM;sCAClCtC,KAAK8D,SAAS;6BAEf;sCACJ,MAACtF;4BAAMuF,WAAU;4BAAMF,SAAS;4BAAK7B,IAAI;gCAAEgC,YAAY;gCAAUC,UAAU;4BAAO;;8CAChF,KAACrF;oCAAWyD,SAAQ;oCAAKO,WAAU;8CAChC3C,WAAW,CAAC,MAAM,EAAED,KAAKkE,MAAM,EAAE;;8CAEpC,KAAC/F;oCACCgG,OAAOnE,KAAKoE,WAAW;oCACvB9B,OAAOqB,aAAa3D,KAAK4D,MAAM,KAAK,aAAa,YAAY;oCAC7DnB,MAAK;;;;wBAGRzC,KAAKqE,WAAW,iBACf,KAACzF;4BAAWyD,SAAQ;4BAAQC,OAAM;sCAC/B,CAAC,OAAO,EAAEjD,UAAUW,KAAKqE,WAAW,GAAG;6BAExC;;;8BAGN,KAAC1F;oBAAQuE,YAAYA;oBAAYoB,gBAAgB;8BAC9CtE,KAAKqD,KAAK,CAACkB,GAAG,CAAC,CAACf,qBACf,KAAC/E;4BAAoB+F,WAAWhB,KAAKE,IAAI;sCACvC,cAAA,KAAChF;gCACC+F,UACEjB,KAAKlE,IAAI,iBACP,KAACV;oCAAWyD,SAAQ;oCAAUC,OAAM;8CACjCjD,UAAUmE,KAAKlE,IAAI;qCAEpBG;0CAGL+D,KAAKW,KAAK;;2BAVJX,KAAKkB,GAAG;;gBAiBtB1E,KAAK2E,MAAM,iBACV,KAACpG;oBAAM8D,SAAQ;oBAAWL,IAAI;wBAAEC,GAAG;oBAAE;8BACnC,cAAA,MAACzD;wBAAMqF,SAAS;;0CACd,KAACjF;gCAAWyD,SAAQ;gCAAKO,WAAU;0CAChC5C,KAAK2E,MAAM,CAACf,MAAM,KAAK,cAAc,cAAc;;0CAEtD,KAAChF;gCAAWyD,SAAQ;0CACjB;oCAACrC,KAAK2E,MAAM,CAACC,YAAY;oCAAE5E,KAAK2E,MAAM,CAACE,OAAO;iCAAC,CAACC,MAAM,CAACC,SAASC,IAAI,CAAC;;4BAEvEhF,KAAK2E,MAAM,CAACf,MAAM,KAAK,4BACtB,KAAChF;gCAAWyD,SAAQ;gCAAQC,OAAM;0CAC/B;iCAED;4BACHtC,KAAK2E,MAAM,CAACM,KAAK,IAAIjF,KAAK2E,MAAM,CAACf,MAAM,KAAK,4BAC3C,KAAChF;gCAAWyD,SAAQ;gCAAQC,OAAM;gCAAiBN,IAAI;oCAAEkD,YAAY;gCAAW;0CAC7ElF,KAAK2E,MAAM,CAACM,KAAK;iCAElB;4BACHjF,KAAK2E,MAAM,CAACQ,YAAY,IAAInF,KAAK2E,MAAM,CAACf,MAAM,KAAK,4BAClD,KAAChF;gCAAWyD,SAAQ;gCAAQC,OAAM;0CAC/BtC,KAAK2E,MAAM,CAACQ,YAAY;iCAEzB;;;qBAGN;gBACHnF,KAAKoF,aAAa,iBACjB,KAAC7G;oBAAM8D,SAAQ;oBAAWL,IAAI;wBAAEC,GAAG;oBAAE;8BACnC,cAAA,MAACzD;wBAAMqF,SAAS;;0CACd,KAACjF;gCAAWyD,SAAQ;gCAAKO,WAAU;0CAChC;;0CAEH,KAAChE;gCAAWyD,SAAQ;0CAASrC,KAAKoF,aAAa,CAAChB,WAAW;;4BAC1DpE,KAAKoF,aAAa,CAACC,WAAW,iBAC7B,KAACzG;gCAAWyD,SAAQ;gCAAQC,OAAM;0CAC/BtC,KAAKoF,aAAa,CAACC,WAAW;iCAE/B;;;qBAGN;gBAEHrF,KAAKsF,SAAS,CAACC,MAAM,iBACpB,MAAC/G;oBAAMqF,SAAS;;sCACd,KAACjF;4BAAWyD,SAAQ;4BAAKO,WAAU;sCAChC5C,KAAKsF,SAAS,CAACC,MAAM,KAAK,IAAI,aAAa;;wBAE7CvF,KAAKsF,SAAS,CAACf,GAAG,CAAC,CAACiB,UAAU/B,sBAC7B,KAAClF;gCAAiC8D,SAAQ;gCAAWL,IAAI;oCAAEC,GAAG;gCAAE;0CAC9D,cAAA,MAACzD;oCAAMqF,SAAS;;sDACd,MAACrF;4CACCuF,WAAU;4CACVF,SAAS;4CACT7B,IAAI;gDAAEgC,YAAY;gDAAUyB,gBAAgB;gDAAiBxB,UAAU;4CAAO;;8DAE9E,KAACrF;oDAAWyD,SAAQ;8DACjB;wDACCrC,KAAKsF,SAAS,CAACC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE9B,QAAQ,GAAG,GAAG;wDACrDpE,UAAUmG,SAASlG,IAAI,IAAI,CAAC,QAAQ,EAAED,UAAUmG,SAASlG,IAAI,GAAG,GAAG;qDACpE,CACEwF,MAAM,CAACC,SACPC,IAAI,CAAC;;gDAETQ,SAASE,WAAW,iBACnB,KAACxH;oDACCuE,MAAK;oDACLJ,SAAQ;oDACRsD,MAAMH,SAASE,WAAW;oDAC1BE,QAAO;oDACPC,KAAI;8DAEH;qDAED;;;wCAELL,SAASM,cAAc,iBACtB,KAAClH;4CAAWyD,SAAQ;4CAAQC,OAAM;sDAC/B;gDAACkD,SAASO,OAAO;gDAAEP,SAASM,cAAc;6CAAC,CAAChB,MAAM,CAACC,SAASC,IAAI,CAAC;6CAElE;sDACJ,KAACpG;4CAAWyD,SAAQ;sDACjBmD,SAASQ,KAAK,CAACzB,GAAG,CAAC,CAAC0B,OAAS,GAAGA,KAAKC,QAAQ,CAAC,EAAE,EAAED,KAAKE,IAAI,EAAE,EAAEnB,IAAI,CAAC;;;;+BAjC/DQ,SAASY,EAAE,IAAI3C;;qBAuC7B;8BAEJ,MAACjF;oBAAMqF,SAAS;;sCACd,KAACjF;4BAAWyD,SAAQ;4BAAKO,WAAU;sCAChC;;wBAEF5C,KAAKgG,KAAK,CAACzB,GAAG,CAAC,CAAC0B,MAAMxC,sBACrB,MAACjF;gCAAkBuF,WAAU;gCAAMF,SAAS;gCAAG7B,IAAI;oCAAEyD,gBAAgB;gCAAgB;;kDACnF,MAACxH;;0DACC,MAACW;gDACCyD,SAAQ;gDACRL,IAAIiE,KAAKI,QAAQ,GAAG;oDAAEC,gBAAgB;gDAAe,IAAI7G;;oDAExD,GAAGwG,KAAKC,QAAQ,CAAC,EAAE,EAAED,KAAKE,IAAI,EAAE;oDAChCF,KAAKM,YAAY,GAAG,CAAC,EAAE,EAAEN,KAAKM,YAAY,CAAC,CAAC,CAAC,GAAG;;;4CAElDN,KAAKI,QAAQ,iBACZ,KAACzH;gDAAWyD,SAAQ;gDAAUC,OAAM;0DACjC;iDAED,CAACqB,aAAasC,KAAKO,eAAe,GAAG,KAAKP,KAAKO,eAAe,GAAGP,KAAKC,QAAQ,iBAChF,KAACtH;gDAAWyD,SAAQ;gDAAUC,OAAM;0DACjC,GAAG2D,KAAKO,eAAe,CAAC,IAAI,EAAEP,KAAKC,QAAQ,CAAC,QAAQ,CAAC;iDAEtD;;;kDAEN,KAACtH;wCAAWyD,SAAQ;kDAASU,MAAMkD,KAAKQ,WAAW;;;+BAnBzChD;sCAsBd,KAACpF;wBAEC;4BACE;gCAAC;gCAAY2B,KAAK0G,MAAM,CAACC,UAAU;6BAAC;4BACpC;gCAAC;gCAAY,CAAC3G,KAAK0G,MAAM,CAACE,aAAa;6BAAC;4BACxC;gCAAC;gCAAY5G,KAAK0G,MAAM,CAACG,aAAa;6BAAC;4BACvC,iEAAiE;+BAC9D,EAAC7G,eAAAA,KAAK8G,MAAM,YAAX9G,eAAe,EAAE,EAAEuE,GAAG,CAAC,CAACwC,QAAU;oCAACA,MAAM5C,KAAK;oCAAE4C,MAAMN,WAAW;iCAAC;4BACtE;gCAAC;gCAAOzG,KAAK0G,MAAM,CAACM,QAAQ;6BAAC;yBAC9B,CAEAlC,MAAM,CAAC,CAAC,CAACX,OAAOnB,MAAM,GAAKmB,UAAU,cAAcnB,UAAU,GAC7DuB,GAAG,CAAC,CAAC,CAACJ,OAAOnB,MAAM,iBAClB,MAACxE;gCAAkBuF,WAAU;gCAAM/B,IAAI;oCAAEyD,gBAAgB;gCAAgB;;kDACvE,KAAC7G;wCAAWyD,SAAQ;wCAAQC,OAAM;kDAC/B6B;;kDAEH,KAACvF;wCAAWyD,SAAQ;wCAAQC,OAAM;kDAC/BS,MAAMC;;;+BALCmB;sCAShB,MAAC3F;4BAAMuF,WAAU;4BAAM/B,IAAI;gCAAEyD,gBAAgB;4BAAgB;;8CAC3D,KAAC7G;oCAAWyD,SAAQ;8CAAa;;8CACjC,KAACzD;oCAAWyD,SAAQ;8CAAaU,MAAM/C,KAAK0G,MAAM,CAACO,UAAU;;;;wBAE9DjH,KAAK0G,MAAM,CAACQ,aAAa,GAAG,kBAC3B,MAAC1I;4BAAMuF,WAAU;4BAAM/B,IAAI;gCAAEyD,gBAAgB;4BAAgB;;8CAC3D,KAAC7G;oCAAWyD,SAAQ;oCAAQC,OAAM;8CAC/B;;8CAEH,KAAC1D;oCAAWyD,SAAQ;oCAAQC,OAAM;8CAC/BS,MAAM,CAAC/C,KAAK0G,MAAM,CAACQ,aAAa;;;6BAGnC;;;gBAGLlH,KAAKmH,OAAO,CAAC5B,MAAM,iBAClB,KAAC/G;oBAAMuF,WAAU;oBAAMF,SAAS;oBAAG7B,IAAI;wBAAEiC,UAAU;oBAAO;8BACvDjE,KAAKmH,OAAO,CAAC5C,GAAG,CAAC,CAAC6C,uBACjB,KAAClJ;4BAAuBmE,SAAQ;4BAAWsD,MAAMyB,OAAOC,GAAG;sCACxDD,OAAOjD,KAAK;2BADFiD,OAAOhB,EAAE;qBAKxB;8BAEJ,MAACxH;oBAAWyD,SAAQ;oBAAQC,OAAM;;wBAC/B;wBACAtC,KAAK8D,SAAS,GAAG,CAAC,YAAY,EAAE9D,KAAK8D,SAAS,EAAE,GAAG;wBACnD;;;8BAEH,KAACxF;oBAAKqH,MAAK;oBAAItD,SAAQ;8BACpB;;;;;AAKX;AACAxC,YAAYyH,WAAW,GAAG;AAE1B,OAAO,MAAMC,SAAkD;IAC7DC,KAAKpI;IACLqI,UAAUzI;IACVsI,aAAa;IACbI,aACE;IACFC,UAAU7J,MAAM8J,iBAAiB,CAACC,QAAQ;IAC1CC,MAAM;QAAEC,MAAMhK,qBAAqBgK,IAAI;QAAE/F,IAAI;YAAEM,OAAO;QAAe;IAAE;IACvE0F,OAAO;QAAEC,aAAanK,MAAMoK,YAAY,CAACC,OAAO;IAAC;IACjDC,YAAY;QACV;YACEjC,MAAM;YACNhC,OAAO;YACPuD,aAAa;YACb9E,WAAW9E,MAAMuK,kBAAkB,CAACC,UAAU;QAChD;KACD;AACH,EAAC;AAED,OAAO,MAAMC,UAAgC;IAC3C;QACEf,KAAKrI,iBAAiBC;QACtBoJ,MAAM1K,MAAM2K,QAAQ,CAACC,MAAM;QAC3BpB,aAAa;QACbG,UAAUzI;QACV0I,aAAa;QACbC,UAAU7J,MAAM8J,iBAAiB,CAACC,QAAQ;QAC1CC,MAAM;YAAEC,MAAMhK,qBAAqBgK,IAAI;YAAE/F,IAAI;gBAAEM,OAAO;YAAe;QAAE;QACvEqG,MAAM;YACJnB,KAAK;YACLoB,aAAaxJ;YACbqI,UAAUzI;YACVc,OAAO,CAAC;QACV;IACF;CACD,CAAA;AAED,eAAeD,YAAW"}
|
|
@@ -38,6 +38,7 @@ import { BUNDLE_ID } from "../constants/bundle-common.js";
|
|
|
38
38
|
import { generatePresetId } from "../utils/generate-preset-id.js";
|
|
39
39
|
import { useStorefrontPurchaseEvent } from "../utils/use-storefront-purchase-event.js";
|
|
40
40
|
import { CART_UPDATED_EVENT } from "./cart.js";
|
|
41
|
+
import { CartFulfillmentChoice, useCartFulfillment } from "./cart-fulfillment.js";
|
|
41
42
|
import { ID as PRODUCT_REVIEWS_ID } from "./product-reviews.js";
|
|
42
43
|
import { ID as RELATED_PRODUCTS_ID } from "./related-products.js";
|
|
43
44
|
import { readLocalWishlist, toggleWishlist } from "./wishlist.js";
|
|
@@ -128,7 +129,7 @@ function slugFromLocation() {
|
|
|
128
129
|
* variant. Resolves its product from the /products/{slug} URL unless a
|
|
129
130
|
* slug prop pins it; sample data on the inert canvas.
|
|
130
131
|
*/ const ProductDetail = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
131
|
-
var _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
|
|
132
|
+
var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6;
|
|
132
133
|
var _site_pageData_commerce, _site_pageData;
|
|
133
134
|
const { slug: slugProp, buyLabel, hideDescription, showCoupon } = props, rest = _object_without_properties_loose(props, [
|
|
134
135
|
"slug",
|
|
@@ -292,7 +293,14 @@ function slugFromLocation() {
|
|
|
292
293
|
* the same key, so the server replays the original session instead of
|
|
293
294
|
* opening a second one (for a subscription product, a second RECURRING
|
|
294
295
|
* subscription).
|
|
295
|
-
*/
|
|
296
|
+
*/ // Pickup or the store's own delivery (AGL-3624), for a one-time sale; the
|
|
297
|
+
// server offers nothing for a product with nothing physical to collect.
|
|
298
|
+
const fulfillment = useCartFulfillment(hostId, (_ref = resolved == null ? void 0 : resolved.id) != null ? _ref : '[]', resolved && variant && !(resolved.subscription && (!resolved.subscriptionOptional || billing === 'subscribe')) ? {
|
|
299
|
+
productId: resolved.id,
|
|
300
|
+
variantId: variant.id,
|
|
301
|
+
quantity
|
|
302
|
+
} : null);
|
|
303
|
+
const attemptKey = useRef('');
|
|
296
304
|
useEffect(()=>{
|
|
297
305
|
attemptKey.current = '';
|
|
298
306
|
// `coupon` is in here because it CHANGES THE PRICE. Without it a shopper
|
|
@@ -307,7 +315,8 @@ function slugFromLocation() {
|
|
|
307
315
|
billing,
|
|
308
316
|
shipTo,
|
|
309
317
|
shipPostal,
|
|
310
|
-
coupon
|
|
318
|
+
coupon,
|
|
319
|
+
fulfillment.signature
|
|
311
320
|
]);
|
|
312
321
|
const handleBuy = async ()=>{
|
|
313
322
|
if (!hostId || !resolved || !variant || status === 'sending') return;
|
|
@@ -333,10 +342,12 @@ function slugFromLocation() {
|
|
|
333
342
|
quantity
|
|
334
343
|
}, resolved.subscriptionOptional ? {
|
|
335
344
|
billing
|
|
336
|
-
} : {}, shipTo ? {
|
|
345
|
+
} : {}, shipTo && !fulfillment.request ? {
|
|
337
346
|
shippingCountry: shipTo
|
|
338
|
-
} : {}, shipPostal.trim() ? {
|
|
347
|
+
} : {}, shipPostal.trim() && !fulfillment.request ? {
|
|
339
348
|
shippingPostalCode: shipPostal.trim()
|
|
349
|
+
} : {}, fulfillment.request ? {
|
|
350
|
+
fulfillment: fulfillment.request
|
|
340
351
|
} : {}, coupon.trim() ? {
|
|
341
352
|
couponCode: coupon.trim()
|
|
342
353
|
} : {}))
|
|
@@ -386,19 +397,26 @@ function slugFromLocation() {
|
|
|
386
397
|
}
|
|
387
398
|
// Buy-now's half of AGL-2019. The server's own 501 wording is not
|
|
388
399
|
// rendered to a visitor; this surface is public.
|
|
400
|
+
if (payload == null ? void 0 : payload.fulfillmentChanged) {
|
|
401
|
+
var _ref2;
|
|
402
|
+
fulfillment.reload();
|
|
403
|
+
setMessage(String((_ref2 = payload == null ? void 0 : payload.error) != null ? _ref2 : ''));
|
|
404
|
+
setStatus('error');
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
389
407
|
if (isPaymentsNotConfigured(response.status)) {
|
|
390
408
|
setMessage(storefrontPaymentsNotConfiguredText());
|
|
391
409
|
setStatus('unconfigured');
|
|
392
410
|
return;
|
|
393
411
|
}
|
|
394
412
|
if (payload == null ? void 0 : payload.needsShippingCountry) {
|
|
395
|
-
var
|
|
413
|
+
var _ref3;
|
|
396
414
|
var _payload_shippingCountries;
|
|
397
415
|
if (payload == null ? void 0 : payload.needsShippingPostalCode) setAskPostal(true);
|
|
398
416
|
setShipCountries(((_payload_shippingCountries = payload.shippingCountries) == null ? void 0 : _payload_shippingCountries.length) ? payload.shippingCountries : [
|
|
399
417
|
...CommerceModel.CHECKOUT_SHIPPING_COUNTRIES
|
|
400
418
|
]);
|
|
401
|
-
setMessage(String((
|
|
419
|
+
setMessage(String((_ref3 = payload == null ? void 0 : payload.error) != null ? _ref3 : ''));
|
|
402
420
|
// An unserved destination is a refusal and reads as one; being
|
|
403
421
|
// asked the first time is not.
|
|
404
422
|
setStatus(shipTo ? 'error' : 'ask');
|
|
@@ -480,7 +498,7 @@ function slugFromLocation() {
|
|
|
480
498
|
// schema.org `image` array below is read out of band by a crawler, where
|
|
481
499
|
// an absolute URL is the point. That one wants `absoluteMediaSrc` with
|
|
482
500
|
// the site's own origin, which is the tenant page's job (AGL-1725).
|
|
483
|
-
const galleryImage = Aglyn.siteRelativeMediaSrc((
|
|
501
|
+
const galleryImage = Aglyn.siteRelativeMediaSrc((_ref1 = (_ref2 = variant == null ? void 0 : variant.imageUrl) != null ? _ref2 : resolved.mediaUrls[activeImage]) != null ? _ref1 : resolved.mediaUrls[0], {
|
|
484
502
|
hostId
|
|
485
503
|
});
|
|
486
504
|
// Subscription framing (AGL-545): subscription-only products price as
|
|
@@ -507,7 +525,7 @@ function slugFromLocation() {
|
|
|
507
525
|
offers: {
|
|
508
526
|
'@type': 'Offer',
|
|
509
527
|
priceCurrency: 'USD',
|
|
510
|
-
price: String((
|
|
528
|
+
price: String((_ref3 = variant == null ? void 0 : variant.priceUsd) != null ? _ref3 : 0),
|
|
511
529
|
availability: (variant == null ? void 0 : variant.soldOut) ? 'https://schema.org/OutOfStock' : 'https://schema.org/InStock'
|
|
512
530
|
}
|
|
513
531
|
}) : null;
|
|
@@ -624,7 +642,7 @@ function slugFromLocation() {
|
|
|
624
642
|
children: [
|
|
625
643
|
/*#__PURE__*/ _jsx(Typography, {
|
|
626
644
|
variant: "h6",
|
|
627
|
-
children: `$${(
|
|
645
|
+
children: `$${(_ref4 = variant == null ? void 0 : variant.priceUsd) != null ? _ref4 : 0}${subscribing ? intervalSuffix : ''}`
|
|
628
646
|
}),
|
|
629
647
|
subscribing && (subscription == null ? void 0 : subscription.trialDays) ? /*#__PURE__*/ _jsx(Typography, {
|
|
630
648
|
variant: "caption",
|
|
@@ -679,11 +697,11 @@ function slugFromLocation() {
|
|
|
679
697
|
children: [
|
|
680
698
|
/*#__PURE__*/ _jsx(ToggleButton, {
|
|
681
699
|
value: "once",
|
|
682
|
-
children: `One-time $${(
|
|
700
|
+
children: `One-time $${(_ref5 = variant == null ? void 0 : variant.priceUsd) != null ? _ref5 : 0}`
|
|
683
701
|
}),
|
|
684
702
|
/*#__PURE__*/ _jsx(ToggleButton, {
|
|
685
703
|
value: "subscribe",
|
|
686
|
-
children: `Subscribe $${(
|
|
704
|
+
children: `Subscribe $${(_ref6 = variant == null ? void 0 : variant.priceUsd) != null ? _ref6 : 0}${intervalSuffix}`
|
|
687
705
|
})
|
|
688
706
|
]
|
|
689
707
|
}) : null,
|
|
@@ -755,7 +773,7 @@ function slugFromLocation() {
|
|
|
755
773
|
// the control latches off rather than inviting a retry that
|
|
756
774
|
// cannot succeed (AGL-2019).
|
|
757
775
|
status === 'unconfigured' || // Asked but unanswered: the server would only refuse again.
|
|
758
|
-
shipCountries !== null && !shipTo || askPostal && !shipPostal.trim(),
|
|
776
|
+
fulfillment.method === 'shipping' && shipCountries !== null && !shipTo || fulfillment.method === 'shipping' && askPostal && !shipPostal.trim() || !fulfillment.ready,
|
|
759
777
|
onClick: handleBuy,
|
|
760
778
|
sx: {
|
|
761
779
|
flex: 1
|
|
@@ -788,7 +806,16 @@ function slugFromLocation() {
|
|
|
788
806
|
onCancel: ()=>setNativeCheckout(null)
|
|
789
807
|
})
|
|
790
808
|
}) : null,
|
|
791
|
-
|
|
809
|
+
fulfillment.offered ? /*#__PURE__*/ _jsx(Box, {
|
|
810
|
+
sx: {
|
|
811
|
+
mb: 2
|
|
812
|
+
},
|
|
813
|
+
children: /*#__PURE__*/ _jsx(CartFulfillmentChoice, {
|
|
814
|
+
state: fulfillment,
|
|
815
|
+
formatCents: (cents)=>`$${(cents / 100).toFixed(2)}`
|
|
816
|
+
})
|
|
817
|
+
}) : null,
|
|
818
|
+
shipCountries && fulfillment.method === 'shipping' ? /*#__PURE__*/ _jsx(TextField, {
|
|
792
819
|
select: true,
|
|
793
820
|
label: "Ship to",
|
|
794
821
|
value: shipTo,
|
|
@@ -807,7 +834,7 @@ function slugFromLocation() {
|
|
|
807
834
|
}, code);
|
|
808
835
|
})
|
|
809
836
|
}) : null,
|
|
810
|
-
askPostal ? /*#__PURE__*/ _jsx(TextField, {
|
|
837
|
+
askPostal && fulfillment.method === 'shipping' ? /*#__PURE__*/ _jsx(TextField, {
|
|
811
838
|
label: "Postal code",
|
|
812
839
|
value: shipPostal,
|
|
813
840
|
onChange: (event)=>setShipPostal(event.target.value),
|