@zappie/theme-base 0.1.0 → 0.1.2
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/CHANGELOG.md +39 -0
- package/README.md +26 -53
- package/dist/address.js +99 -2
- package/dist/address.js.map +7 -1
- package/dist/cart/address-sheet.js +143 -0
- package/dist/cart/address-sheet.js.map +7 -0
- package/dist/cart/cart-issues.js +72 -0
- package/dist/cart/cart-issues.js.map +7 -0
- package/dist/cart/cart-line-groups.js +34 -0
- package/dist/cart/cart-line-groups.js.map +7 -0
- package/dist/{chunk-FB5DRCU7.js → cart/cart-line.js} +9 -70
- package/dist/cart/cart-line.js.map +7 -0
- package/dist/cart/cart-lines.js +27 -0
- package/dist/cart/cart-lines.js.map +7 -0
- package/dist/cart/cart-schedule.js +24 -0
- package/dist/cart/cart-schedule.js.map +7 -0
- package/dist/cart/cart-sheet.js +35 -0
- package/dist/cart/cart-sheet.js.map +7 -0
- package/dist/cart/checkout-cta.js +81 -0
- package/dist/cart/checkout-cta.js.map +7 -0
- package/dist/cart/checkout-state.js +74 -0
- package/dist/cart/checkout-state.js.map +7 -0
- package/dist/cart/clear-cart.js +44 -0
- package/dist/cart/clear-cart.js.map +7 -0
- package/dist/cart/customer-details.js +70 -0
- package/dist/cart/customer-details.js.map +7 -0
- package/dist/cart/delivery-distance.js +22 -0
- package/dist/cart/delivery-distance.js.map +7 -0
- package/dist/cart/empty-cart.js +14 -0
- package/dist/cart/empty-cart.js.map +7 -0
- package/dist/cart/fulfilment-panel.js +83 -0
- package/dist/cart/fulfilment-panel.js.map +7 -0
- package/dist/cart/line-editor.js +35 -0
- package/dist/cart/line-editor.js.map +7 -0
- package/dist/cart/line-options.js +96 -0
- package/dist/cart/line-options.js.map +7 -0
- package/dist/cart/loading.js +17 -0
- package/dist/cart/loading.js.map +7 -0
- package/dist/cart/promo-sheet.js +103 -0
- package/dist/cart/promo-sheet.js.map +7 -0
- package/dist/cart/region-picker.js +40 -0
- package/dist/cart/region-picker.js.map +7 -0
- package/dist/cart/rewards-sheet.js +86 -0
- package/dist/cart/rewards-sheet.js.map +7 -0
- package/dist/cart/schedule-sheet.js +87 -0
- package/dist/cart/schedule-sheet.js.map +7 -0
- package/dist/{chunk-JFEI2OUZ.js → cart/theme-class.js} +7 -5
- package/dist/cart/theme-class.js.map +7 -0
- package/dist/cart/totals.js +81 -0
- package/dist/cart/totals.js.map +7 -0
- package/dist/cart/use-address-selection.js +130 -0
- package/dist/cart/use-address-selection.js.map +7 -0
- package/dist/cart.js +21 -1069
- package/dist/cart.js.map +7 -1
- package/dist/catalogue/catalogue-cart.js +25 -0
- package/dist/catalogue/catalogue-cart.js.map +7 -0
- package/dist/catalogue/catalogue-header.js +88 -0
- package/dist/catalogue/catalogue-header.js.map +7 -0
- package/dist/catalogue/catalogue-pages.js +68 -0
- package/dist/catalogue/catalogue-pages.js.map +7 -0
- package/dist/catalogue/catalogue-search.js +89 -0
- package/dist/catalogue/catalogue-search.js.map +7 -0
- package/dist/catalogue/category-navigation.js +98 -0
- package/dist/catalogue/category-navigation.js.map +7 -0
- package/dist/catalogue/category-section.js +113 -0
- package/dist/catalogue/category-section.js.map +7 -0
- package/dist/catalogue/info-banners.js +148 -0
- package/dist/catalogue/info-banners.js.map +7 -0
- package/dist/catalogue/item-tile.js +55 -0
- package/dist/catalogue/item-tile.js.map +7 -0
- package/dist/catalogue/loader.js +136 -0
- package/dist/catalogue/loader.js.map +7 -0
- package/dist/{chunk-USSLDBDY.js → catalogue/presentation.js} +12 -9
- package/dist/catalogue/presentation.js.map +7 -0
- package/dist/catalogue/saved-catalogue-sync.js +115 -0
- package/dist/catalogue/saved-catalogue-sync.js.map +7 -0
- package/dist/catalogue/types.js +1 -0
- package/dist/catalogue/types.js.map +7 -0
- package/dist/catalogue/use-catalogue-data.js +88 -0
- package/dist/catalogue/use-catalogue-data.js.map +7 -0
- package/dist/catalogue/use-category-scroll.js +115 -0
- package/dist/catalogue/use-category-scroll.js.map +7 -0
- package/dist/catalogue/use-item-opener.js +46 -0
- package/dist/catalogue/use-item-opener.js.map +7 -0
- package/dist/catalogue/use-search-source.js +132 -0
- package/dist/catalogue/use-search-source.js.map +7 -0
- package/dist/catalogue.js +26 -1216
- package/dist/catalogue.js.map +7 -1
- package/dist/checkout.js +149 -2
- package/dist/checkout.js.map +7 -1
- package/dist/host-bridge.js +22 -2
- package/dist/host-bridge.js.map +7 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +7 -1
- package/dist/item/configurator-commit.js +15 -0
- package/dist/item/configurator-commit.js.map +7 -0
- package/dist/item/configurator-draft.js +63 -0
- package/dist/item/configurator-draft.js.map +7 -0
- package/dist/item/configurator.js +135 -0
- package/dist/item/configurator.js.map +7 -0
- package/dist/item/note.js +65 -0
- package/dist/item/note.js.map +7 -0
- package/dist/item/variant-status.js +23 -0
- package/dist/item/variant-status.js.map +7 -0
- package/dist/item-frame.js +60 -3
- package/dist/item-frame.js.map +7 -1
- package/dist/item.js +11 -11
- package/dist/item.js.map +7 -1
- package/dist/navigation.js +39 -2
- package/dist/navigation.js.map +7 -1
- package/dist/url-navigation-state.js +61 -0
- package/dist/url-navigation-state.js.map +7 -0
- package/dist/{chunk-ILOCSCZL.js → url-navigation.js} +12 -89
- package/dist/url-navigation.js.map +7 -0
- package/package.json +8 -7
- package/dist/chunk-2MV6KU3R.js +0 -352
- package/dist/chunk-2MV6KU3R.js.map +0 -1
- package/dist/chunk-FB5DRCU7.js.map +0 -1
- package/dist/chunk-IG63ONID.js +0 -139
- package/dist/chunk-IG63ONID.js.map +0 -1
- package/dist/chunk-ILOCSCZL.js.map +0 -1
- package/dist/chunk-JFEI2OUZ.js.map +0 -1
- package/dist/chunk-NTJONY3N.js +0 -95
- package/dist/chunk-NTJONY3N.js.map +0 -1
- package/dist/chunk-QWST2TA2.js +0 -22
- package/dist/chunk-QWST2TA2.js.map +0 -1
- package/dist/chunk-USSLDBDY.js.map +0 -1
- package/dist/chunk-VIAJ27YC.js +0 -59
- package/dist/chunk-VIAJ27YC.js.map +0 -1
package/dist/catalogue.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/catalogue/catalogue-cart.tsx","../src/catalogue/catalogue-header.tsx","../src/catalogue/catalogue-search.tsx","../src/catalogue/category-navigation.tsx","../src/catalogue/item-tile.tsx","../src/catalogue/category-section.tsx","../src/catalogue/info-banners.tsx","../src/catalogue/catalogue-pages.ts","../src/catalogue/saved-catalogue-sync.ts","../src/catalogue/loader.ts","../src/catalogue/use-catalogue-data.ts","../src/catalogue/use-category-scroll.ts","../src/catalogue/use-item-opener.ts","../src/catalogue/use-search-source.ts","../src/catalogue/catalogue.tsx"],"names":["jsxs","jsx","useState","useEffect","Fragment","Overlay","source","useRef","useCallback","useOverlay","useMemo","useZappie"],"mappings":"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","file":"catalogue.js","sourcesContent":["import type { Money, Zappie } from \"@zappie/sdk\";\n\nexport function CatalogueCart({\n action,\n count,\n subtotal,\n client,\n onOpen,\n}: {\n action: \"Place\" | \"Schedule\" | \"View\";\n count: number;\n subtotal?: Money;\n client: Zappie;\n onOpen(): void;\n}) {\n if (count === 0) {\n return null;\n }\n return (\n <button type=\"button\" className=\"z-base-catalogue-cart\" onClick={onOpen}>\n {action} Order · {count} items ·{\" \"}\n {subtotal ? client.format.money(subtotal) : \"Calculating…\"}\n </button>\n );\n}\n","import { OpenStatus } from \"@zappie/foundations\";\nimport type { Branch, CartLine, MenuSection } from \"@zappie/sdk\";\nimport { useEffect, useState } from \"react\";\nimport { ClearCart } from \"../cart/clear-cart\";\nimport type { CatalogueLayoutMode, CatalogueSlots } from \"./types\";\n\nexport function CatalogueHeader({\n branch,\n storeName,\n menus,\n selectedMenuId,\n cartLines,\n cartOpen,\n fulfilmentMode,\n layout,\n slots,\n onOpenCart,\n onOpenBranchDetails,\n onSelectMenu,\n onOpenBranchFinder,\n onSwitchFulfilment,\n onSetLayout,\n}: {\n branch?: Branch;\n storeName?: string;\n menus?: MenuSection[];\n selectedMenuId?: string;\n cartLines: readonly CartLine[];\n cartOpen: boolean;\n fulfilmentMode: \"pickup\" | \"delivery\";\n layout: CatalogueLayoutMode;\n slots?: CatalogueSlots;\n onOpenCart(): void;\n onOpenBranchDetails(): void;\n onSelectMenu(menuId: string): void;\n onOpenBranchFinder(): void;\n onSwitchFulfilment(): void;\n onSetLayout(layout: CatalogueLayoutMode): void;\n}) {\n const [canShare, setCanShare] = useState(false);\n useEffect(() => setCanShare(typeof navigator.share === \"function\"), []);\n const ToolbarAction = slots?.ToolbarAction;\n return (\n <header>\n <h2 tabIndex={-1} id=\"base-catalogue-heading\">\n Menu\n </h2>\n <button\n type=\"button\"\n aria-label={`Open cart${cartLines.length ? `, ${cartLines.length} items` : \"\"}`}\n onClick={onOpenCart}\n >\n Cart\n </button>\n {branch && (\n <button\n type=\"button\"\n onClick={onOpenBranchDetails}\n aria-label=\"View opening hours\"\n >\n <OpenStatus branch={branch}>\n {({ isOpen, label }) =>\n branch.isOpen === isOpen\n ? label\n : branch.isOpen\n ? \"Open\"\n : \"Temporarily closed\"\n }\n </OpenStatus>\n </button>\n )}\n {selectedMenuId && (\n <label>\n Menu\n <select\n value={selectedMenuId}\n onChange={(event) => onSelectMenu(event.target.value)}\n >\n {menus?.map((menu) => (\n <option key={menu.id} value={menu.id}>\n {menu.name} (\n {cartLines\n .filter((line) => line.menuId === menu.id)\n .reduce((sum, line) => sum + line.quantity, 0)}{\" \"}\n added)\n </option>\n ))}\n </select>\n </label>\n )}\n <button type=\"button\" onClick={onOpenBranchFinder}>\n Change branch\n </button>\n <button type=\"button\" onClick={onSwitchFulfilment}>\n {fulfilmentMode === \"pickup\" ? \"Delivery\" : \"Pickup\"}\n </button>\n {canShare && (\n <button\n type=\"button\"\n onClick={() => {\n if (navigator.share) {\n void navigator\n .share({\n url: window.location.href,\n ...(storeName ? { title: storeName } : {}),\n })\n .catch(() => {});\n }\n }}\n >\n Share menu\n </button>\n )}\n {ToolbarAction && (\n <ToolbarAction layout={layout} setLayout={onSetLayout} />\n )}\n {cartLines.length > 0 && !cartOpen && <ClearCart />}\n </header>\n );\n}\n","import { Overlay, Search } from \"@zappie/foundations\";\nimport type { Item } from \"@zappie/sdk\";\nimport { Fragment } from \"react\";\nimport type { useSearchSource } from \"./use-search-source\";\n\nexport function CatalogueSearch({\n search,\n open,\n themeClass,\n onOpen,\n onSelectItem,\n onSelectCategory,\n}: {\n search: ReturnType<typeof useSearchSource>;\n open: boolean;\n themeClass?: string;\n onOpen(): void;\n onSelectItem(item: Item): void;\n onSelectCategory(categoryId: string): void;\n}) {\n const content = (\n <Search.Root\n source={search.source}\n query={search.query}\n onQueryChange={search.setQuery}\n onSelect={(result) => {\n if (result.type === \"item\") {\n onSelectItem(result.item);\n } else {\n onSelectCategory(result.category.id);\n }\n }}\n >\n <Search.Input\n aria-label=\"Search menu\"\n placeholder=\"Search menu\"\n onFocus={onOpen}\n />\n {search.query && (\n <button type=\"button\" onClick={() => search.setQuery(\"\")}>\n Clear search\n </button>\n )}\n {open && search.query && (\n <Search.Results>\n {({ results, error, retry }) => (\n <Fragment>\n {search.source.isLoading && <p role=\"status\">Searching…</p>}\n {error && (\n <p role=\"alert\">\n {error}\n <button type=\"button\" onClick={retry}>\n Retry search\n </button>\n </p>\n )}\n {!search.source.isLoading && !error && !results.length && (\n <p>No results</p>\n )}\n {search.hasMore && (\n <button\n type=\"button\"\n disabled={search.source.isLoading}\n onClick={search.loadMore}\n >\n More search results\n </button>\n )}\n {results.map((result, index) => (\n <Search.Result\n key={\n result.type === \"item\" ? result.item.id : result.category.id\n }\n index={index}\n >\n {result.type === \"item\" ? (\n <Fragment>\n {result.item.name}\n {!result.item.isAvailable && (\n <span>{result.item.stockLabel ?? \"Unavailable\"}</span>\n )}\n </Fragment>\n ) : (\n result.category.name\n )}\n </Search.Result>\n ))}\n </Fragment>\n )}\n </Search.Results>\n )}\n </Search.Root>\n );\n return (\n <Fragment>\n <div className=\"z-base-search-desktop\">{content}</div>\n <Overlay.Root param=\"catalogue_search\" id=\"search\" presentation=\"sheet\">\n <Overlay.Trigger className=\"z-base-search-mobile\">\n Search menu\n </Overlay.Trigger>\n <Overlay.Content\n data-zappie-theme=\"base\"\n className={[\"z-base-cart z-base-editor\", themeClass]\n .filter(Boolean)\n .join(\" \")}\n >\n <Overlay.Title>Search menu</Overlay.Title>\n <Overlay.Close>Close search</Overlay.Close>\n {content}\n </Overlay.Content>\n </Overlay.Root>\n </Fragment>\n );\n}\n","import { Overlay, useOverlay } from \"@zappie/foundations\";\nimport type { Category } from \"@zappie/sdk\";\nimport { Fragment, useEffect, useState } from \"react\";\nimport type { CatalogueSlots } from \"./types\";\n\nexport function CategoryNavigation({\n categories,\n active,\n themeClass,\n slots,\n onSelect,\n onFocusCategory,\n}: {\n categories: readonly Category[];\n active?: string;\n themeClass?: string;\n slots?: CatalogueSlots;\n onSelect(categoryId: string): void;\n onFocusCategory(categoryId: string): void;\n}) {\n const overlay = useOverlay(\"catalogue_categories\", \"categories\");\n const [filter, setFilter] = useState(\"\");\n const [pending, setPending] = useState<string>();\n const CategoryTab = slots?.CategoryTab;\n useEffect(() => {\n if (pending && !overlay.isOpen) {\n const frame = requestAnimationFrame(() => {\n setPending(undefined);\n onSelect(pending);\n onFocusCategory(pending);\n });\n return () => cancelAnimationFrame(frame);\n }\n }, [pending, overlay.isOpen, onSelect, onFocusCategory]);\n const filtered = categories.filter((category) =>\n category.name.toLowerCase().includes(filter.toLowerCase()),\n );\n return (\n <Fragment>\n <Overlay.Root\n param=\"catalogue_categories\"\n id=\"categories\"\n presentation={{ base: \"sheet\", lg: \"dialog\" }}\n >\n <Overlay.Trigger>Browse categories</Overlay.Trigger>\n <Overlay.Content\n data-zappie-theme=\"base\"\n className={[\"z-base-cart z-base-editor\", themeClass]\n .filter(Boolean)\n .join(\" \")}\n >\n <Overlay.Title>Browse categories</Overlay.Title>\n <Overlay.Close>Close categories</Overlay.Close>\n <input\n aria-label=\"Filter categories\"\n value={filter}\n onChange={(event) => setFilter(event.target.value)}\n />\n {filtered.map((category) => (\n <button\n key={category.id}\n type=\"button\"\n onClick={() => {\n setPending(category.id);\n overlay.close();\n }}\n >\n {category.name}\n </button>\n ))}\n {filtered.length === 0 && <p>No matching categories</p>}\n </Overlay.Content>\n </Overlay.Root>\n <nav aria-label=\"Categories\" className=\"z-base-category-nav\">\n {categories.map((category) => (\n <a\n key={category.id}\n href={`#base-category-${category.id}`}\n aria-current={active === category.id ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n onSelect(category.id);\n }}\n >\n {CategoryTab ? (\n <CategoryTab\n category={category}\n active={active === category.id}\n />\n ) : (\n category.name\n )}\n </a>\n ))}\n </nav>\n </Fragment>\n );\n}\n","import type { CartLine, Item, Zappie } from \"@zappie/sdk\";\nimport { Description, ItemImage } from \"./presentation\";\nimport type { CatalogueLayoutMode } from \"./types\";\n\nexport function BaseItemTile({\n item,\n lines,\n href,\n layout,\n priority,\n client,\n onOpen,\n}: {\n item: Item;\n lines: readonly CartLine[];\n href: string;\n layout: CatalogueLayoutMode;\n priority: boolean;\n client: Zappie;\n onOpen(): void;\n}) {\n const price = item.price;\n return (\n <a\n href={href}\n className=\"z-base-item-tile\"\n onClick={(event) => {\n event.preventDefault();\n event.currentTarget.focus({ preventScroll: true });\n onOpen();\n }}\n >\n <ItemImage\n src={item.images[0]}\n sizes={layout === \"LIST\" ? \"100vw\" : \"(min-width: 768px) 33vw, 50vw\"}\n priority={priority}\n />\n <span className=\"z-base-item-name\">{item.name}</span>\n {item.description && <Description value={item.description} />}\n {item.promo && <span>{item.promo.name}</span>}\n {item.compareAtPrice && (\n <del>{client.format.money(item.compareAtPrice)}</del>\n )}\n {price && (\n <span className=\"z-base-amount\">\n {item.variants.some(\n (variant) => variant.price.amountMinor !== price.amountMinor,\n )\n ? \"From \"\n : \"\"}\n {client.format.money(price)}\n </span>\n )}\n {(item.stockLabel || !item.isAvailable) && (\n <span>{item.stockLabel ?? \"Unavailable\"}</span>\n )}\n {lines.map((line) => (\n <span key={line.id}>{line.quantity} added</span>\n ))}\n </a>\n );\n}\n","import { Cart } from \"@zappie/foundations\";\nimport type { Category, Item, Menu, Zappie } from \"@zappie/sdk\";\nimport { countEvent } from \"@zappie/sdk/visits\";\nimport type { MutableRefObject } from \"react\";\nimport { CartLine } from \"../cart/cart-line\";\nimport { BaseItemTile } from \"./item-tile\";\nimport { Description } from \"./presentation\";\nimport type { CatalogueLayoutMode, CatalogueSlots } from \"./types\";\n\nexport function CategorySection({\n category,\n categoryIndex,\n catalogue,\n menuId,\n layout,\n slots,\n sections,\n cartOpen,\n client,\n busy,\n hasMore,\n itemHref,\n onOpen,\n onLoadMore,\n}: {\n category: Category;\n categoryIndex: number;\n catalogue: Menu;\n menuId?: string;\n layout: CatalogueLayoutMode;\n slots?: CatalogueSlots;\n sections: MutableRefObject<Map<string, HTMLElement>>;\n cartOpen: boolean;\n client: Zappie;\n busy: boolean;\n hasMore: boolean;\n itemHref(itemId: string, menuId?: string): string;\n onOpen(item: Item): void;\n onLoadMore(): void;\n}) {\n const CategoryHeader = slots?.CategoryHeader;\n const Tile = slots?.Tile;\n const columns = slots?.layout?.columns;\n const baseColumns = typeof columns === \"object\" ? columns.base : columns;\n const mediumColumns = typeof columns === \"object\" ? columns.medium : columns;\n const largeColumns = typeof columns === \"object\" ? columns.large : columns;\n return (\n <section\n id={`base-category-${category.id}`}\n className=\"z-base-category\"\n data-unloaded={category.itemIds.length === 0}\n ref={(node) => {\n if (node) {\n sections.current.set(category.id, node);\n } else {\n sections.current.delete(category.id);\n }\n }}\n >\n <h3 tabIndex={-1}>\n {CategoryHeader ? (\n <CategoryHeader category={category} />\n ) : (\n category.name\n )}\n </h3>\n {category.description && <Description value={category.description} />}\n <Cart.Root\n className=\"z-base-item-list\"\n data-layout={layout}\n data-columns={baseColumns}\n data-columns-medium={mediumColumns}\n data-columns-large={largeColumns}\n data-density={slots?.layout?.density}\n >\n {category.itemIds.map((id, index) => {\n const item = catalogue.items[id];\n if (!item) {\n return null;\n }\n const lines = client.cart.lines.filter((line) => line.itemId === id);\n const href = itemHref(item.id, menuId);\n return (\n <div key={id}>\n {Tile ? (\n <Tile\n item={item}\n {...(menuId !== undefined ? { menuId } : {})}\n href={href}\n quantityInCart={lines.reduce(\n (sum, line) => sum + line.quantity,\n 0,\n )}\n onAdd={() => {\n // An item the cart refuses as-is (required choices, an\n // ambiguous variant) opens the item to be configured.\n try {\n client.cart.add(item.id, {\n ...(menuId !== undefined ? { menuId } : {}),\n });\n countEvent(\"add\");\n } catch {\n onOpen(item);\n }\n }}\n onOpen={() => onOpen(item)}\n />\n ) : (\n <BaseItemTile\n item={item}\n lines={lines}\n href={href}\n layout={layout}\n priority={categoryIndex === 0 && index < 4}\n client={client}\n onOpen={() => onOpen(item)}\n />\n )}\n {!cartOpen &&\n lines.map((line) => <CartLine key={line.id} line={line} />)}\n </div>\n );\n })}\n </Cart.Root>\n {hasMore && (\n <button type=\"button\" disabled={busy} onClick={onLoadMore}>\n Load more {category.name}\n </button>\n )}\n </section>\n );\n}\n","\"use client\";\nimport {\n createSanitizeRichText,\n splitInfoBanner,\n} from \"@zappie/foundations/rich-text\";\nimport { parseRichText } from \"@zappie/foundations/rich-text/browser\";\nimport { useEffect, useRef, useState } from \"react\";\nconst sanitize = createSanitizeRichText(parseRichText);\n/** Safe rich text with touch scrolling, explicit controls and pausable rotation. */\nexport function InfoBanners({ value }: { value?: string }) {\n const [banners, setBanners] = useState<string[]>([]);\n const [index, setIndex] = useState(0);\n const [expanded, setExpanded] = useState<Record<number, boolean>>({});\n const [paused, setPaused] = useState(false);\n const viewport = useRef<HTMLDivElement>(null);\n const interacted = useRef(false);\n useEffect(() => {\n setBanners(\n splitInfoBanner(value)\n .map(sanitize)\n .filter((banner) => banner.replace(/<[^>]*>/g, \"\").trim()),\n );\n setIndex(0);\n setExpanded({});\n interacted.current = false;\n }, [value]);\n function select(next: number, interaction = true) {\n interacted.current ||= interaction;\n setExpanded({});\n viewport.current?.children[next]?.scrollIntoView({\n block: \"nearest\",\n inline: \"start\",\n behavior: \"instant\",\n });\n setIndex(next);\n }\n const isExpanded = Object.values(expanded).some(Boolean);\n useEffect(() => {\n if (paused || isExpanded || banners.length < 2) {\n return;\n }\n const interval = setInterval(() => {\n const node = viewport.current;\n if (\n !node ||\n interacted.current ||\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ||\n node.scrollWidth <= node.clientWidth\n ) {\n return;\n }\n select((index + 1) % banners.length, false);\n }, 5000);\n return () => clearInterval(interval);\n }, [index, paused, isExpanded, banners.length]);\n if (!banners.length) {\n return null;\n }\n return (\n <section\n aria-label=\"Menu information\"\n onMouseEnter={() => setPaused(true)}\n onMouseLeave={() => setPaused(false)}\n onFocus={() => setPaused(true)}\n onBlur={() => setPaused(false)}\n >\n <div\n className=\"z-base-info-banners\"\n ref={viewport}\n onPointerDown={() => {\n interacted.current = true;\n }}\n onScroll={() => {\n const node = viewport.current;\n if (node?.children[0]) {\n setIndex(\n Math.round(\n node.scrollLeft /\n node.children[0].getBoundingClientRect().width,\n ),\n );\n }\n }}\n >\n {banners.map((banner, position) => (\n <article key={banner + position}>\n <div\n className=\"z-base-info-copy\"\n data-expanded={Boolean(expanded[position])}\n dangerouslySetInnerHTML={{ __html: banner }}\n />\n <button\n type=\"button\"\n aria-expanded={Boolean(expanded[position])}\n onClick={() =>\n setExpanded((current) => ({\n ...current,\n [position]: !current[position],\n }))\n }\n >\n Show {expanded[position] ? \"less\" : \"more\"}\n </button>\n </article>\n ))}\n </div>\n {banners.length > 1 && (\n <div>\n <button\n type=\"button\"\n aria-label=\"Previous information\"\n disabled={index === 0}\n onClick={() => select(index - 1)}\n >\n Previous\n </button>\n <button\n type=\"button\"\n aria-label=\"Next information\"\n disabled={index >= banners.length - 1}\n onClick={() => select(index + 1)}\n >\n Next\n </button>\n {banners.map((_, position) => (\n <button\n key={position}\n type=\"button\"\n aria-label={`Go to banner ${position + 1}`}\n aria-current={index === position ? \"true\" : undefined}\n onClick={() => select(position)}\n >\n {position + 1}\n </button>\n ))}\n </div>\n )}\n </section>\n );\n}\n","import type { CategoryPage, Menu, Zappie } from \"@zappie/sdk\";\nimport type { SavedCatalogue } from \"@zappie/sdk/persist/catalogue\";\n\nexport type SavedPage = SavedCatalogue[\"pages\"][number];\nexport type PageState = { next?: string | undefined; done: boolean };\n\nexport const pageKey = (menuId: string, categoryId: string) =>\n `${menuId}:${categoryId}`;\n\nexport function pageState(nextCursor?: string): PageState {\n return { ...(nextCursor ? { next: nextCursor } : {}), done: !nextCursor };\n}\n\n/** Adds a page's items to their categories without dropping ones already reached. */\nexport function mergePage(menu: Menu, page: CategoryPage): Menu {\n return {\n ...menu,\n items: { ...menu.items, ...page.menu.items },\n categories: menu.categories.map((category) => {\n const incoming = page.menu.categories.find(\n (value) => value.id === category.id,\n );\n return incoming\n ? {\n ...category,\n itemIds: [...new Set([...category.itemIds, ...incoming.itemIds])],\n }\n : category;\n }),\n completeness: \"partial\",\n };\n}\n\nexport function readSavedPages(\n client: Zappie,\n menuId: string,\n branchId: string,\n saved: readonly SavedPage[],\n signal: AbortSignal,\n): Promise<SavedPage[]> {\n return Promise.all(\n saved.map(async (entry) => ({\n ...entry,\n page: await client.menu.page(menuId, entry.categoryId, {\n branch: branchId,\n signal,\n ...(entry.cursor ? { cursor: entry.cursor } : {}),\n }),\n })),\n );\n}\n\n/**\n * Only the refreshed categories are replaced, so pages reached while the\n * refresh ran stay; a refreshed category drops items no longer listed.\n */\nexport function replaceRefreshedCategories(\n menu: Menu,\n refreshed: readonly SavedPage[],\n): Menu {\n const fresh = new Map<string, string[]>();\n let next = menu;\n for (const { categoryId, page } of refreshed) {\n const ids = page.menu.categories.find((c) => c.id === categoryId)?.itemIds;\n fresh.set(categoryId, [...(fresh.get(categoryId) ?? []), ...(ids ?? [])]);\n next = { ...next, items: { ...next.items, ...page.menu.items } };\n }\n return {\n ...next,\n categories: next.categories.map((category) => {\n const ids = fresh.get(category.id);\n return ids ? { ...category, itemIds: ids } : category;\n }),\n };\n}\n\n/** Swaps each refreshed page into the saved list in place. */\nexport function replaceSavedPages(\n saved: SavedPage[],\n refreshed: readonly SavedPage[],\n) {\n for (const page of refreshed) {\n const index = saved.findIndex(\n (entry) =>\n entry.categoryId === page.categoryId && entry.cursor === page.cursor,\n );\n if (index >= 0) {\n saved[index] = page;\n }\n }\n}\n","import type { Menu, Zappie } from \"@zappie/sdk\";\nimport type { SavedCatalogue } from \"@zappie/sdk/persist/catalogue\";\nimport {\n pageKey,\n pageState,\n readSavedPages,\n replaceRefreshedCategories,\n replaceSavedPages,\n type PageState,\n type SavedPage,\n} from \"./catalogue-pages\";\n\n/** The loader's mutable read state, shared with the saved-catalogue sync. */\nexport type LoaderState = {\n menu: Menu;\n mode: \"eager\" | \"progressive\" | null;\n complete: boolean;\n // Replaced on resume: an effect can be cleaned up and run again (React\n // StrictMode, <Activity>) without the loader being recreated.\n abort: AbortController;\n readonly pages: Map<string, PageState>;\n readonly savedPages: SavedPage[];\n};\n\ntype Scope = SavedCatalogue[\"scope\"];\n\nasync function loadResources(client: Zappie, scope: Scope) {\n const [persistence, selected] = await Promise.all([\n import(\"@zappie/sdk/persist/catalogue\"),\n import(\"@zappie/sdk/transport/selected-menu\"),\n ]);\n return {\n saved: persistence.createSavedCatalogue(client, scope),\n selected: selected.createSelectedMenuReader(client),\n };\n}\n\nexport type CatalogueResources = Awaited<ReturnType<typeof loadResources>>;\n\nexport function createSavedCatalogueSync({\n client,\n state,\n scope,\n revision,\n publish,\n}: {\n client: Zappie;\n state: LoaderState;\n scope: Scope;\n /** Host catalogue revision; a saved copy at this revision is not refreshed. */\n revision?: string | undefined;\n publish?: ((menu: Menu) => void) | undefined;\n}) {\n let resources: CatalogueResources | undefined;\n function snapshot(): SavedCatalogue {\n return {\n scope,\n menu: state.menu,\n coverage: { menuIds: [scope.menuId], complete: state.complete },\n pages: [...state.savedPages],\n etag: state.menu.version,\n savedAt: Date.now(),\n ...(revision ? { revision } : {}),\n };\n }\n async function save() {\n if (await resources!.saved.publish(snapshot()).catch(() => true)) {\n state.abort.signal.throwIfAborted();\n publish?.(state.menu);\n }\n }\n async function refresh() {\n if (state.complete) {\n const response = await resources!.selected.read(scope, {\n signal: state.abort.signal,\n });\n state.abort.signal.throwIfAborted();\n if (\"notModified\" in response) {\n return;\n }\n state.menu = response.menu;\n await save();\n return;\n }\n const refreshed = await readSavedPages(\n client,\n scope.menuId,\n scope.branchId,\n state.savedPages,\n state.abort.signal,\n );\n state.abort.signal.throwIfAborted();\n state.menu = replaceRefreshedCategories(state.menu, refreshed);\n for (const { categoryId, page } of refreshed) {\n state.pages.set(\n pageKey(scope.menuId, categoryId),\n pageState(page.nextCursor),\n );\n }\n replaceSavedPages(state.savedPages, refreshed);\n await save();\n }\n return {\n get resources() {\n return resources;\n },\n /** Shows the current menu now; saving runs behind it and never fails a read. */\n emit() {\n state.abort.signal.throwIfAborted();\n publish?.(state.menu);\n void resources?.saved.publish(snapshot()).catch(() => {});\n },\n async restore() {\n resources = await loadResources(client, scope);\n const value = await resources.saved.restore();\n state.abort.signal.throwIfAborted();\n if (!value) {\n return false;\n }\n state.menu = value.menu;\n state.complete = value.coverage.complete;\n state.mode = state.complete ? \"eager\" : \"progressive\";\n state.savedPages.push(...value.pages);\n for (const saved of value.pages) {\n state.pages.set(\n pageKey(scope.menuId, saved.categoryId),\n pageState(saved.page.nextCursor),\n );\n }\n publish?.(state.menu);\n if (!revision || value.revision !== revision) {\n void refresh().catch(() => {});\n }\n return true;\n },\n };\n}\n","import type { Menu, Zappie } from \"@zappie/sdk\";\nimport { mergePage, pageKey, pageState } from \"./catalogue-pages\";\nimport {\n createSavedCatalogueSync,\n type LoaderState,\n} from \"./saved-catalogue-sync\";\nexport type CatalogueStrategy = (\n metadata: Menu,\n sample?: Menu,\n) => \"eager\" | \"progressive\" | null;\n/** Screen-local read state; never marks a progressive catalogue as complete. */\nexport function createCatalogueLoader(\n client: Zappie,\n metadata: Menu,\n resolve: CatalogueStrategy,\n publish?: (menu: Menu) => void,\n orderContext: \"delivery\" | \"pickup\" | \"dineIn\" = \"delivery\",\n /** Host catalogue revision; a saved copy at this revision is not refreshed. */\n revision?: string,\n) {\n const state: LoaderState = {\n menu: metadata,\n mode: resolve(metadata),\n complete: false,\n abort: new AbortController(),\n pages: new Map(),\n savedPages: [],\n };\n const scope = {\n store: client.config.store,\n branchId: metadata.branchId,\n orderContext,\n menuId: metadata.menus?.[0]?.id ?? metadata.id,\n };\n const saved = createSavedCatalogueSync({\n client,\n state,\n scope,\n revision,\n publish,\n });\n const pending = new Map<string, Promise<Menu>>();\n let eager: Promise<Menu> | undefined;\n // The complete read starts beside the size probe rather than after it, and\n // is cancelled if the probe's measurement rejects eager loading.\n let speculative: AbortController | undefined;\n function readEager(signal: AbortSignal = state.abort.signal) {\n eager ??= saved\n .resources!.selected.read(scope, { signal })\n .then(async (response) => {\n signal.throwIfAborted();\n if (\"notModified\" in response) {\n throw new Error(\"Unexpected conditional selected-menu response\");\n }\n state.complete = true;\n state.menu = response.menu;\n saved.emit();\n return state.menu;\n })\n .catch((failure: unknown) => {\n eager = undefined;\n throw failure;\n });\n return eager;\n }\n function speculate() {\n if (eager) {\n return;\n }\n speculative = new AbortController();\n const cancel = () => speculative?.abort();\n state.abort.signal.addEventListener(\"abort\", cancel, { once: true });\n void readEager(speculative.signal).catch(() => {});\n }\n async function readPage(\n menuId: string,\n categoryId: string,\n key: string,\n cursor: string | undefined,\n ) {\n const page = await client.menu.page(menuId, categoryId, {\n branch: metadata.branchId,\n signal: state.abort.signal,\n ...(cursor ? { cursor } : {}),\n });\n state.abort.signal.throwIfAborted();\n // The size probe is a real first page: it renders before any\n // complete read the measurement approves.\n if (!state.complete) {\n state.menu = mergePage(state.menu, page);\n }\n state.savedPages.push({ categoryId, ...(cursor ? { cursor } : {}), page });\n saved.emit();\n state.pages.set(key, pageState(page.nextCursor));\n if (state.mode === null) {\n state.mode = resolve(metadata, page.menu) ?? \"progressive\";\n if (state.mode !== \"eager\") {\n speculative?.abort();\n eager = undefined;\n }\n }\n return state.menu;\n }\n // Restoring starts with the loader, not at the first reach; any failure to\n // restore (no IndexedDB, a chunk error) falls back to the network.\n const initialized = saved.restore().catch(() => false);\n return {\n get value() {\n return state.menu;\n },\n get mode() {\n return state.mode;\n },\n hasMore(menuId: string, categoryId: string) {\n return (\n state.mode !== \"eager\" &&\n !state.pages.get(pageKey(menuId, categoryId))?.done\n );\n },\n /** True when reaching this category would neither read nor change. */\n isLoaded(menuId: string, categoryId: string) {\n return (\n state.complete ||\n (state.mode !== \"eager\" && state.pages.has(pageKey(menuId, categoryId)))\n );\n },\n async reach(\n menuId: string,\n categoryId: string,\n more = false,\n ): Promise<Menu> {\n const key = pageKey(menuId, categoryId);\n const warm = await initialized;\n if (state.complete || (warm && state.pages.has(key) && !more)) {\n return state.menu;\n }\n if (state.mode === \"eager\") {\n return readEager();\n }\n const existing = pending.get(key);\n if (existing) {\n return existing;\n }\n const loaded = state.pages.get(key);\n if (loaded && (!more || loaded.done)) {\n return state.menu;\n }\n if (state.mode === null) {\n speculate();\n }\n const request = readPage(menuId, categoryId, key, loaded?.next);\n pending.set(key, request);\n try {\n return await request;\n } finally {\n pending.delete(key);\n }\n },\n /** Aborts in-flight reads; `resume()` makes the loader usable again. */\n dispose() {\n state.abort.abort();\n },\n resume() {\n if (state.abort.signal.aborted) {\n state.abort = new AbortController();\n }\n },\n };\n}\n","import type { Menu, Zappie } from \"@zappie/sdk\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createCatalogueLoader, type CatalogueStrategy } from \"./loader\";\n\nexport function useCatalogueData({\n client,\n initialMenu,\n selectedMenuId,\n fulfilmentMode,\n resolveStrategy,\n revision,\n}: {\n client: Zappie;\n initialMenu: Menu;\n selectedMenuId: string;\n fulfilmentMode: \"pickup\" | \"delivery\";\n resolveStrategy: CatalogueStrategy;\n revision?: string;\n}) {\n const [catalogue, setCatalogue] = useState(initialMenu);\n const show = useCallback(\n (value: Menu) =>\n setCatalogue({\n ...value,\n ...(initialMenu.menus ? { menus: initialMenu.menus } : {}),\n categories: initialMenu.categories.map(\n (category) =>\n value.categories.find((loaded) => loaded.id === category.id) ??\n category,\n ),\n }),\n [initialMenu],\n );\n const loader = useMemo(() => {\n const selected = initialMenu.menus?.find(\n (source) => source.id === selectedMenuId,\n );\n const scoped = {\n ...initialMenu,\n ...(selected ? { menus: [selected] } : {}),\n categories: initialMenu.categories.filter(\n (category) => !selected || selected.categoryIds.includes(category.id),\n ),\n };\n return createCatalogueLoader(\n client,\n scoped,\n resolveStrategy,\n show,\n fulfilmentMode,\n revision,\n );\n }, [\n client,\n initialMenu,\n selectedMenuId,\n fulfilmentMode,\n resolveStrategy,\n revision,\n show,\n ]);\n useEffect(() => {\n loader.resume();\n return () => loader.dispose();\n }, [loader]);\n const source =\n catalogue.menus?.find((value) => value.id === selectedMenuId) ??\n catalogue.menus?.[0];\n const categories = useMemo(\n () =>\n catalogue.categories.filter((category) =>\n source?.categoryIds.includes(category.id),\n ),\n [catalogue.categories, source],\n );\n const [error, setError] = useState<string>();\n const [busy, setBusy] = useState(false);\n const reach = useCallback(\n async (categoryId: string, more = false) => {\n if (!source || (!more && loader.isLoaded(source.id, categoryId))) {\n return;\n }\n setBusy(true);\n setError(undefined);\n try {\n show(await loader.reach(source.id, categoryId, more));\n } catch (failure) {\n if (!(failure instanceof Error) || failure.name !== \"AbortError\") {\n setError(\"Catalogue could not load. Try again.\");\n }\n } finally {\n setBusy(false);\n }\n },\n [loader, source, show],\n );\n return { catalogue, source, categories, loader, error, busy, reach };\n}\n","import type { Category } from \"@zappie/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport function useCategoryScroll({\n categories,\n selectedCategoryId,\n itemOpen,\n menuId,\n menuLayout,\n reach,\n onSelectCategory,\n}: {\n categories: readonly Category[];\n selectedCategoryId?: string;\n itemOpen: boolean;\n menuId?: string;\n menuLayout?: string;\n reach(categoryId: string): Promise<void>;\n onSelectCategory(categoryId: string): void;\n}) {\n const [active, setActive] = useState(selectedCategoryId ?? categories[0]?.id);\n const activeRef = useRef(active);\n activeRef.current = active;\n const sections = useRef(new Map<string, HTMLElement>());\n const wanted = useRef<string>(undefined);\n const reading = useRef(false);\n const reachLatest = useCallback(\n (categoryId: string) => {\n wanted.current = categoryId;\n if (reading.current) {\n return;\n }\n reading.current = true;\n void (async () => {\n try {\n while (wanted.current) {\n const next = wanted.current;\n wanted.current = undefined;\n await reach(next);\n }\n } finally {\n reading.current = false;\n }\n })();\n },\n [reach],\n );\n useEffect(() => {\n if (itemOpen) {\n return;\n }\n const id = selectedCategoryId ?? categories[0]?.id;\n if (id) {\n setActive(id);\n void reach(id);\n }\n }, [menuId, selectedCategoryId, itemOpen, reach, categories]);\n useEffect(() => {\n if (itemOpen) {\n return;\n }\n let frame = 0;\n const select = () => {\n frame = 0;\n let id = categories[0]?.id;\n for (const category of categories) {\n const top = sections.current\n .get(category.id)\n ?.getBoundingClientRect().top;\n if (top === undefined) {\n continue;\n }\n if (top > 200) {\n break;\n }\n id = category.id;\n }\n if (\n window.scrollY + window.innerHeight >=\n document.documentElement.scrollHeight - 2\n ) {\n id = categories.at(-1)?.id ?? id;\n }\n if (id && id !== activeRef.current) {\n setActive(id);\n reachLatest(id);\n }\n };\n const onScroll = () => {\n if (!frame) {\n frame = requestAnimationFrame(select);\n }\n };\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(frame);\n };\n }, [categories, itemOpen, reachLatest]);\n const selectCategory = useCallback(\n (id: string) => {\n setActive(id);\n onSelectCategory(id);\n sections.current.get(id)?.scrollIntoView({ block: \"start\" });\n void reach(id);\n },\n [onSelectCategory, reach],\n );\n const previousLayout = useRef(menuLayout);\n useEffect(() => {\n if (previousLayout.current !== menuLayout && active) {\n sections.current.get(active)?.scrollIntoView({ block: \"start\" });\n }\n previousLayout.current = menuLayout;\n }, [menuLayout, active]);\n const focusCategory = useCallback((id: string) => {\n sections.current.get(id)?.querySelector(\"h3\")?.focus();\n }, []);\n return {\n active,\n sections,\n selectCategory,\n focusCategory,\n };\n}\n","import { useOverlay } from \"@zappie/foundations\";\nimport type { Item, MenuSection } from \"@zappie/sdk\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { CatalogueNavigation } from \"../navigation\";\n\nexport function useItemOpener({\n navigation,\n source,\n clearSearch,\n}: {\n navigation: CatalogueNavigation;\n source?: MenuSection;\n clearSearch(): void;\n}) {\n const searchOverlay = useOverlay(\"catalogue_search\", \"search\");\n const [pendingItem, setPendingItem] = useState<Item>();\n const open = useCallback(\n async (item: Item) => {\n if (searchOverlay.isOpen) {\n setPendingItem(item);\n searchOverlay.close();\n return;\n }\n const placement =\n item.placements?.find((value) => value.menuId === source?.id) ??\n item.placements?.[0];\n const menuId = placement?.menuId ?? source?.id;\n if (menuId) {\n clearSearch();\n await navigation.openItem({\n itemId: item.id,\n item,\n menuId,\n ...(placement ? { categoryId: placement.categoryId } : {}),\n });\n }\n },\n [clearSearch, navigation, searchOverlay, source],\n );\n useEffect(() => {\n if (pendingItem && !searchOverlay.isOpen) {\n const frame = requestAnimationFrame(() => {\n setPendingItem(undefined);\n void open(pendingItem);\n });\n return () => cancelAnimationFrame(frame);\n }\n }, [pendingItem, searchOverlay.isOpen, open]);\n return open;\n}\n","\"use client\";\nimport { createSearchIndex, type SearchResult } from \"@zappie/foundations\";\nimport type { Menu, SearchPage } from \"@zappie/sdk\";\nimport { useZappie } from \"@zappie/sdk/react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\n/** Loaded matches win; remote fallback never hydrates a complete catalogue. */\nexport function useSearchSource(menu: Menu, enabled: boolean) {\n const client = useZappie();\n const [query, setQuery] = useState(\"\");\n const [composing, setComposing] = useState(false);\n const [attempt, setAttempt] = useState(0);\n const [cursor, setCursor] = useState<string>();\n const [remote, setRemote] = useState<{\n query: string;\n page?: SearchPage;\n error?: string;\n loading?: boolean;\n }>({ query: \"\" });\n const index = useMemo(() => createSearchIndex(menu), [menu]);\n const local = useMemo(() => index(query), [index, query]);\n const hasLocalItems = local.some((result) => result.type === \"item\");\n useEffect(() => {\n if (!enabled || composing || !query.trim() || hasLocalItems) {\n return;\n }\n const abort = new AbortController();\n const timer = setTimeout(() => {\n setRemote((previous) => ({\n ...(cursor && previous.query === query ? previous : {}),\n query,\n loading: true,\n }));\n void client.menu\n .search(query, {\n branch: menu.branchId,\n signal: abort.signal,\n ...(cursor ? { cursor } : {}),\n })\n .then(\n (page) => {\n if (!abort.signal.aborted) {\n setRemote((previous) => {\n if (!cursor || previous.query !== query || !previous.page) {\n return { query, page };\n }\n return {\n query,\n page: {\n ...page,\n menu: {\n ...page.menu,\n items: {\n ...previous.page.menu.items,\n ...page.menu.items,\n },\n categories: [\n ...new Map(\n [\n ...previous.page.menu.categories,\n ...page.menu.categories,\n ].map((category) => [category.id, category]),\n ).values(),\n ],\n },\n },\n };\n });\n }\n },\n () => {\n if (!abort.signal.aborted) {\n setRemote((previous) => ({\n ...(cursor && previous.query === query ? previous : {}),\n query,\n loading: false,\n error: \"Search could not load. Try again.\",\n }));\n }\n },\n );\n }, 500);\n return () => {\n clearTimeout(timer);\n abort.abort();\n };\n }, [\n client,\n menu.branchId,\n query,\n enabled,\n composing,\n hasLocalItems,\n attempt,\n cursor,\n ]);\n const current =\n !composing && remote.query === query && !hasLocalItems ? remote : undefined;\n const results = useMemo(() => {\n const values: SearchResult[] = [...local];\n for (const item of Object.values(current?.page?.menu.items ?? {})) {\n if (\n !values.some(\n (result) => result.type === \"item\" && result.item.id === item.id,\n )\n ) {\n values.push({ type: \"item\", item, score: 0 });\n }\n }\n for (const category of current?.page?.menu.categories ?? []) {\n if (\n category.name\n .toLocaleLowerCase()\n .includes(query.trim().toLocaleLowerCase()) &&\n !values.some(\n (result) =>\n result.type === \"category\" && result.category.id === category.id,\n )\n ) {\n values.push({ type: \"category\", category, score: 0 });\n }\n }\n return values;\n }, [local, current?.page, query]);\n return {\n query,\n setQuery: (value: string) => {\n setCursor(undefined);\n setQuery(value);\n },\n hasMore: Boolean(current?.page?.nextCursor),\n loadMore: () => {\n if (!current?.loading && current?.page?.nextCursor) {\n setCursor(current.page.nextCursor);\n }\n },\n source: {\n results,\n isLoading: current?.loading ?? false,\n ...(current?.error ? { error: current.error } : {}),\n retry: () => setAttempt((value) => value + 1),\n onCompositionChange: setComposing,\n },\n };\n}\n","\"use client\";\nimport { useOverlay } from \"@zappie/foundations\";\nimport {\n useCart,\n useCartCatalogue,\n useStore,\n useZappie,\n} from \"@zappie/sdk/react\";\nimport { useCallback, useState } from \"react\";\nimport { ThemeClassProvider } from \"../cart/theme-class\";\nimport { useBaseHostBridge } from \"../host-bridge\";\nimport { useCatalogueNavigation } from \"../navigation\";\nimport { CatalogueCart } from \"./catalogue-cart\";\nimport { CatalogueHeader } from \"./catalogue-header\";\nimport { CatalogueSearch } from \"./catalogue-search\";\nimport { CategoryNavigation } from \"./category-navigation\";\nimport { CategorySection } from \"./category-section\";\nimport { InfoBanners } from \"./info-banners\";\nimport type { CatalogueProps } from \"./types\";\nimport { useCatalogueData } from \"./use-catalogue-data\";\nimport { useCategoryScroll } from \"./use-category-scroll\";\nimport { useItemOpener } from \"./use-item-opener\";\nimport { useSearchSource } from \"./use-search-source\";\n\nexport type * from \"./types\";\n\nexport function Catalogue({\n initialMenu,\n resolveStrategy,\n themeClass,\n orderAction = \"View\",\n menuNotice,\n revision,\n slots,\n}: CatalogueProps) {\n const client = useZappie();\n const fulfilmentMode =\n useBaseHostBridge().fulfilmentMode === \"pickup\" ? \"pickup\" : \"delivery\";\n const navigation = useCatalogueNavigation();\n const store = useStore();\n const cart = useCart();\n const cartOverlay = useOverlay(\"modal_id\", \"review-menu\");\n useCartCatalogue();\n const selectedMenuId =\n navigation.location.menuId ?? initialMenu.menus?.[0]?.id ?? initialMenu.id;\n const data = useCatalogueData({\n client,\n initialMenu,\n selectedMenuId,\n fulfilmentMode,\n resolveStrategy,\n ...(revision !== undefined ? { revision } : {}),\n });\n const layout = navigation.location.menuLayout ?? \"GRID\";\n const [searchOpen, setSearchOpen] = useState(false);\n const search = useSearchSource(data.catalogue, searchOpen);\n const clearSearch = useCallback(() => {\n setSearchOpen(false);\n search.setQuery(\"\");\n }, [search.setQuery]);\n const openItem = useItemOpener({\n navigation,\n ...(data.source !== undefined ? { source: data.source } : {}),\n clearSearch,\n });\n const categories = useCategoryScroll({\n categories: data.categories,\n ...(navigation.location.categoryId !== undefined\n ? { selectedCategoryId: navigation.location.categoryId }\n : {}),\n itemOpen: Boolean(navigation.location.item),\n ...(data.source?.id !== undefined ? { menuId: data.source.id } : {}),\n ...(navigation.location.menuLayout !== undefined\n ? { menuLayout: navigation.location.menuLayout }\n : {}),\n reach: data.reach,\n onSelectCategory: (categoryId) => navigation.selectCategory(categoryId),\n });\n const branch = store.data?.branches.find(\n (value) => value.id === data.catalogue.branchId,\n );\n const BeforeList = slots?.BeforeList;\n const AfterList = slots?.AfterList;\n return (\n <ThemeClassProvider value={themeClass}>\n <section\n className={[\"z-base-catalogue\", themeClass].filter(Boolean).join(\" \")}\n data-zappie-theme=\"base\"\n aria-label=\"Catalogue\"\n >\n <CatalogueHeader\n {...(branch !== undefined ? { branch } : {})}\n {...(store.data?.name !== undefined\n ? { storeName: store.data.name }\n : {})}\n {...(data.catalogue.menus !== undefined\n ? { menus: data.catalogue.menus }\n : {})}\n {...(data.source?.id !== undefined\n ? { selectedMenuId: data.source.id }\n : {})}\n cartLines={cart.lines}\n cartOpen={cartOverlay.isOpen}\n fulfilmentMode={fulfilmentMode}\n layout={layout}\n {...(slots !== undefined ? { slots } : {})}\n onOpenCart={() => void navigation.openCart()}\n onOpenBranchDetails={() => void navigation.openBranchDetails?.()}\n onSelectMenu={(menuId) => navigation.selectMenu(menuId)}\n onOpenBranchFinder={() => void navigation.openBranchFinder()}\n onSwitchFulfilment={() => {\n void navigation.switchFulfilment(\n fulfilmentMode === \"pickup\" ? \"delivery\" : \"pickup\",\n );\n }}\n onSetLayout={(value) => navigation.setLayout(value)}\n />\n {menuNotice && <p role=\"status\">{menuNotice}</p>}\n <InfoBanners\n {...(data.source?.infoBanner\n ? { value: data.source.infoBanner }\n : {})}\n />\n {BeforeList && <BeforeList menu={data.catalogue} />}\n <CatalogueSearch\n search={search}\n open={searchOpen}\n {...(themeClass !== undefined ? { themeClass } : {})}\n onOpen={() => setSearchOpen(true)}\n onSelectItem={(item) => void openItem(item)}\n onSelectCategory={categories.selectCategory}\n />\n <CategoryNavigation\n categories={data.categories}\n {...(categories.active !== undefined\n ? { active: categories.active }\n : {})}\n {...(themeClass !== undefined ? { themeClass } : {})}\n {...(slots !== undefined ? { slots } : {})}\n onSelect={categories.selectCategory}\n onFocusCategory={categories.focusCategory}\n />\n {data.error && (\n <p role=\"alert\">\n {data.error}\n <button\n onClick={() => {\n if (categories.active) {\n void data.reach(categories.active);\n }\n }}\n >\n Retry catalogue\n </button>\n </p>\n )}\n {!data.categories.length && <p>No items available</p>}\n {data.categories.map((category, index) => (\n <CategorySection\n key={category.id}\n category={category}\n categoryIndex={index}\n catalogue={data.catalogue}\n {...(data.source?.id !== undefined\n ? { menuId: data.source.id }\n : {})}\n layout={layout}\n {...(slots !== undefined ? { slots } : {})}\n sections={categories.sections}\n cartOpen={cartOverlay.isOpen}\n client={client}\n busy={data.busy}\n hasMore={Boolean(\n data.source && data.loader.hasMore(data.source.id, category.id),\n )}\n itemHref={(itemId, menuId) =>\n navigation.hrefFor({\n type: \"item\",\n itemId,\n ...(menuId !== undefined ? { menuId } : {}),\n categoryId: category.id,\n })\n }\n onOpen={(item) => void openItem(item)}\n onLoadMore={() => void data.reach(category.id, true)}\n />\n ))}\n {AfterList && <AfterList menu={data.catalogue} />}\n {data.busy && <p role=\"status\">Loading products…</p>}\n <CatalogueCart\n action={orderAction}\n count={cart.lines.reduce((sum, line) => sum + line.quantity, 0)}\n {...(cart.subtotal ? { subtotal: cart.subtotal } : {})}\n client={client}\n onOpen={() => void navigation.openCart()}\n />\n </section>\n </ThemeClassProvider>\n );\n}\n"]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/catalogue/catalogue.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\nimport { useOverlay } from \"@zappie/foundations\";\nimport {\n useCart,\n useCartCatalogue,\n useStore,\n useZappie,\n} from \"@zappie/sdk/react\";\nimport { useCallback, useState } from \"react\";\nimport { ThemeClassProvider } from \"../cart/theme-class\";\nimport { useBaseHostBridge } from \"../host-bridge\";\nimport { useCatalogueNavigation } from \"../navigation\";\nimport { CatalogueCart } from \"./catalogue-cart\";\nimport { CatalogueHeader } from \"./catalogue-header\";\nimport { CatalogueSearch } from \"./catalogue-search\";\nimport { CategoryNavigation } from \"./category-navigation\";\nimport { CategorySection } from \"./category-section\";\nimport { InfoBanners } from \"./info-banners\";\nimport type { CatalogueProps } from \"./types\";\nimport { useCatalogueData } from \"./use-catalogue-data\";\nimport { useCategoryScroll } from \"./use-category-scroll\";\nimport { useItemOpener } from \"./use-item-opener\";\nimport { useSearchSource } from \"./use-search-source\";\n\nexport type * from \"./types\";\n\nexport function Catalogue({\n initialMenu,\n resolveStrategy,\n themeClass,\n orderAction = \"View\",\n menuNotice,\n revision,\n slots,\n}: CatalogueProps) {\n const client = useZappie();\n const fulfilmentMode =\n useBaseHostBridge().fulfilmentMode === \"pickup\" ? \"pickup\" : \"delivery\";\n const navigation = useCatalogueNavigation();\n const store = useStore();\n const cart = useCart();\n const cartOverlay = useOverlay(\"modal_id\", \"review-menu\");\n useCartCatalogue();\n const selectedMenuId =\n navigation.location.menuId ?? initialMenu.menus?.[0]?.id ?? initialMenu.id;\n const data = useCatalogueData({\n client,\n initialMenu,\n selectedMenuId,\n fulfilmentMode,\n resolveStrategy,\n ...(revision !== undefined ? { revision } : {}),\n });\n const layout = navigation.location.menuLayout ?? \"GRID\";\n const [searchOpen, setSearchOpen] = useState(false);\n const search = useSearchSource(data.catalogue, searchOpen);\n const clearSearch = useCallback(() => {\n setSearchOpen(false);\n search.setQuery(\"\");\n }, [search.setQuery]);\n const openItem = useItemOpener({\n navigation,\n ...(data.source !== undefined ? { source: data.source } : {}),\n clearSearch,\n });\n const categories = useCategoryScroll({\n categories: data.categories,\n ...(navigation.location.categoryId !== undefined\n ? { selectedCategoryId: navigation.location.categoryId }\n : {}),\n itemOpen: Boolean(navigation.location.item),\n ...(data.source?.id !== undefined ? { menuId: data.source.id } : {}),\n ...(navigation.location.menuLayout !== undefined\n ? { menuLayout: navigation.location.menuLayout }\n : {}),\n reach: data.reach,\n onSelectCategory: (categoryId) => navigation.selectCategory(categoryId),\n });\n const branch = store.data?.branches.find(\n (value) => value.id === data.catalogue.branchId,\n );\n const BeforeList = slots?.BeforeList;\n const AfterList = slots?.AfterList;\n return (\n <ThemeClassProvider value={themeClass}>\n <section\n className={[\"z-base-catalogue\", themeClass].filter(Boolean).join(\" \")}\n data-zappie-theme=\"base\"\n aria-label=\"Catalogue\"\n >\n <CatalogueHeader\n {...(branch !== undefined ? { branch } : {})}\n {...(store.data?.name !== undefined\n ? { storeName: store.data.name }\n : {})}\n {...(data.catalogue.menus !== undefined\n ? { menus: data.catalogue.menus }\n : {})}\n {...(data.source?.id !== undefined\n ? { selectedMenuId: data.source.id }\n : {})}\n cartLines={cart.lines}\n cartOpen={cartOverlay.isOpen}\n fulfilmentMode={fulfilmentMode}\n layout={layout}\n {...(slots !== undefined ? { slots } : {})}\n onOpenCart={() => void navigation.openCart()}\n onOpenBranchDetails={() => void navigation.openBranchDetails?.()}\n onSelectMenu={(menuId) => navigation.selectMenu(menuId)}\n onOpenBranchFinder={() => void navigation.openBranchFinder()}\n onSwitchFulfilment={() => {\n void navigation.switchFulfilment(\n fulfilmentMode === \"pickup\" ? \"delivery\" : \"pickup\",\n );\n }}\n onSetLayout={(value) => navigation.setLayout(value)}\n />\n {menuNotice && <p role=\"status\">{menuNotice}</p>}\n <InfoBanners\n {...(data.source?.infoBanner\n ? { value: data.source.infoBanner }\n : {})}\n />\n {BeforeList && <BeforeList menu={data.catalogue} />}\n <CatalogueSearch\n search={search}\n open={searchOpen}\n {...(themeClass !== undefined ? { themeClass } : {})}\n onOpen={() => setSearchOpen(true)}\n onSelectItem={(item) => void openItem(item)}\n onSelectCategory={categories.selectCategory}\n />\n <CategoryNavigation\n categories={data.categories}\n {...(categories.active !== undefined\n ? { active: categories.active }\n : {})}\n {...(themeClass !== undefined ? { themeClass } : {})}\n {...(slots !== undefined ? { slots } : {})}\n onSelect={categories.selectCategory}\n onFocusCategory={categories.focusCategory}\n />\n {data.error && (\n <p role=\"alert\">\n {data.error}\n <button\n onClick={() => {\n if (categories.active) {\n void data.reach(categories.active);\n }\n }}\n >\n Retry catalogue\n </button>\n </p>\n )}\n {!data.categories.length && <p>No items available</p>}\n {data.categories.map((category, index) => (\n <CategorySection\n key={category.id}\n category={category}\n categoryIndex={index}\n catalogue={data.catalogue}\n {...(data.source?.id !== undefined\n ? { menuId: data.source.id }\n : {})}\n layout={layout}\n {...(slots !== undefined ? { slots } : {})}\n sections={categories.sections}\n cartOpen={cartOverlay.isOpen}\n client={client}\n busy={data.busy}\n hasMore={Boolean(\n data.source && data.loader.hasMore(data.source.id, category.id),\n )}\n itemHref={(itemId, menuId) =>\n navigation.hrefFor({\n type: \"item\",\n itemId,\n ...(menuId !== undefined ? { menuId } : {}),\n categoryId: category.id,\n })\n }\n onOpen={(item) => void openItem(item)}\n onLoadMore={() => void data.reach(category.id, true)}\n />\n ))}\n {AfterList && <AfterList menu={data.catalogue} />}\n {data.busy && <p role=\"status\">Loading products\u2026</p>}\n <CatalogueCart\n action={orderAction}\n count={cart.lines.reduce((sum, line) => sum + line.quantity, 0)}\n {...(cart.subtotal ? { subtotal: cart.subtotal } : {})}\n client={client}\n onOpen={() => void navigation.openCart()}\n />\n </section>\n </ThemeClassProvider>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/checkout.js
CHANGED
|
@@ -1,4 +1,151 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
// src/checkout.tsx
|
|
4
|
+
import {
|
|
5
|
+
CheckoutError,
|
|
6
|
+
checkoutFulfilment as wireCheckoutFulfilment
|
|
7
|
+
} from "@zappie/sdk/checkout";
|
|
8
|
+
import { currentSource } from "@zappie/sdk/visits";
|
|
9
|
+
import {
|
|
10
|
+
createContext,
|
|
11
|
+
useCallback,
|
|
12
|
+
useContext,
|
|
13
|
+
useMemo,
|
|
14
|
+
useSyncExternalStore
|
|
15
|
+
} from "react";
|
|
16
|
+
import { jsx } from "react/jsx-runtime";
|
|
17
|
+
var subscriptions = /* @__PURE__ */ new WeakMap();
|
|
18
|
+
var Context = createContext(null);
|
|
19
|
+
var idle = () => () => {
|
|
20
|
+
};
|
|
21
|
+
function CheckoutHandoffProvider({
|
|
22
|
+
handoff,
|
|
23
|
+
children
|
|
24
|
+
}) {
|
|
25
|
+
const subscribe = useCallback(
|
|
26
|
+
(listener) => (subscriptions.get(handoff) ?? idle)(listener),
|
|
27
|
+
[handoff]
|
|
28
|
+
);
|
|
29
|
+
const read = useCallback(() => handoff.customer, [handoff]);
|
|
30
|
+
const customer = useSyncExternalStore(subscribe, read, read);
|
|
31
|
+
const value = useMemo(
|
|
32
|
+
() => ({
|
|
33
|
+
...handoff.contactPhone !== void 0 ? { contactPhone: handoff.contactPhone } : {},
|
|
34
|
+
customer,
|
|
35
|
+
signIn: () => handoff.signIn(),
|
|
36
|
+
pay: (payload, details) => details ? handoff.pay(payload, details) : handoff.pay(payload)
|
|
37
|
+
}),
|
|
38
|
+
[customer, handoff]
|
|
39
|
+
);
|
|
40
|
+
return /* @__PURE__ */ jsx(Context.Provider, { value, children });
|
|
41
|
+
}
|
|
42
|
+
function useCheckoutHandoff() {
|
|
43
|
+
const handoff = useContext(Context);
|
|
44
|
+
if (!handoff) {
|
|
45
|
+
throw new Error("useCheckoutHandoff requires CheckoutHandoffProvider");
|
|
46
|
+
}
|
|
47
|
+
return handoff;
|
|
48
|
+
}
|
|
49
|
+
function customerName(customer) {
|
|
50
|
+
if (!customer) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const digits = customer.phone_masked?.replace(/\D/g, "") ?? "";
|
|
54
|
+
return {
|
|
55
|
+
...customer.given_name ? { name: customer.given_name } : {},
|
|
56
|
+
...digits.length >= 4 ? { phoneLast4: digits.slice(-4) } : {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function checkoutFulfilment(payload) {
|
|
60
|
+
const fulfilment = wireCheckoutFulfilment(payload.fulfilment);
|
|
61
|
+
if (fulfilment.type === "delivery") {
|
|
62
|
+
return { ...fulfilment, type: "delivery" };
|
|
63
|
+
}
|
|
64
|
+
if (fulfilment.type === "pickup") {
|
|
65
|
+
return { ...fulfilment, type: "pickup" };
|
|
66
|
+
}
|
|
67
|
+
throw new Error("Dine-in checkout is unavailable");
|
|
68
|
+
}
|
|
69
|
+
function createSdkCheckoutHandoff({
|
|
70
|
+
customer,
|
|
71
|
+
checkout,
|
|
72
|
+
branchId,
|
|
73
|
+
returnUrl,
|
|
74
|
+
cancelUrl,
|
|
75
|
+
attribution = currentSource
|
|
76
|
+
}) {
|
|
77
|
+
let source = customer.customer;
|
|
78
|
+
let current = customerName(source);
|
|
79
|
+
let attempt;
|
|
80
|
+
const readCustomer = () => {
|
|
81
|
+
if (source !== customer.customer) {
|
|
82
|
+
source = customer.customer;
|
|
83
|
+
current = customerName(source);
|
|
84
|
+
}
|
|
85
|
+
return current;
|
|
86
|
+
};
|
|
87
|
+
const handoff = {
|
|
88
|
+
contactPhone: true,
|
|
89
|
+
get customer() {
|
|
90
|
+
return readCustomer();
|
|
91
|
+
},
|
|
92
|
+
signIn() {
|
|
93
|
+
customer.signIn();
|
|
94
|
+
},
|
|
95
|
+
async pay(payload, details) {
|
|
96
|
+
const contactPhone = details?.contactPhone?.trim().replace(/\s+/g, "") ?? "";
|
|
97
|
+
const digest = JSON.stringify({ payload, contactPhone });
|
|
98
|
+
if (attempt?.digest !== digest) {
|
|
99
|
+
const visit = attribution();
|
|
100
|
+
attempt = {
|
|
101
|
+
digest,
|
|
102
|
+
key: crypto.randomUUID(),
|
|
103
|
+
returnUrl: returnUrl ?? `${location.origin}/checkout/return`,
|
|
104
|
+
cancelUrl: cancelUrl ?? location.href,
|
|
105
|
+
source: visit.source,
|
|
106
|
+
campaign: visit.campaign
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const request = {
|
|
110
|
+
branch_id: branchId,
|
|
111
|
+
menu_version: payload.menu_version,
|
|
112
|
+
lines: payload.lines,
|
|
113
|
+
fulfilment: checkoutFulfilment(payload),
|
|
114
|
+
...contactPhone ? { contact_phone: contactPhone } : {},
|
|
115
|
+
...payload.promo_code ? { promo_code: payload.promo_code } : {},
|
|
116
|
+
...attempt.source ? { source: attempt.source } : {},
|
|
117
|
+
...attempt.campaign ? { campaign: attempt.campaign } : {},
|
|
118
|
+
return_url: attempt.returnUrl,
|
|
119
|
+
cancel_url: attempt.cancelUrl
|
|
120
|
+
};
|
|
121
|
+
try {
|
|
122
|
+
const session = await checkout.open(request, attempt.key);
|
|
123
|
+
location.assign(session.url);
|
|
124
|
+
} catch (failure) {
|
|
125
|
+
if (failure instanceof CheckoutError && failure.apiCode === "customer_required") {
|
|
126
|
+
await handoff.signIn();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
throw failure;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
subscriptions.set(handoff, (listener) => {
|
|
134
|
+
const unsubscribe = customer.onChange((_state, next) => {
|
|
135
|
+
source = next;
|
|
136
|
+
current = customerName(next);
|
|
137
|
+
listener();
|
|
138
|
+
});
|
|
139
|
+
if (customer.state === "unknown") {
|
|
140
|
+
void customer.session().catch(() => void 0);
|
|
141
|
+
}
|
|
142
|
+
return unsubscribe;
|
|
143
|
+
});
|
|
144
|
+
return handoff;
|
|
145
|
+
}
|
|
146
|
+
export {
|
|
147
|
+
CheckoutHandoffProvider,
|
|
148
|
+
createSdkCheckoutHandoff,
|
|
149
|
+
useCheckoutHandoff
|
|
150
|
+
};
|
|
3
151
|
//# sourceMappingURL=checkout.js.map
|
|
4
|
-
//# sourceMappingURL=checkout.js.map
|
package/dist/checkout.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/checkout.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport type { CartModule } from \"@zappie/sdk\";\nimport {\n CheckoutError,\n checkoutFulfilment as wireCheckoutFulfilment,\n type CheckoutClient,\n type CheckoutRequest,\n} from \"@zappie/sdk/checkout\";\nimport type { CustomerClient, SessionCustomer } from \"@zappie/sdk/customer\";\nimport { currentSource } from \"@zappie/sdk/visits\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\n\nexport type CheckoutPayload = ReturnType<CartModule[\"toCheckoutPayload\"]>;\nexport type CheckoutHandoff = {\n contactPhone?: boolean;\n customer: { name?: string; phoneLast4?: string } | null;\n signIn(): Promise<void> | void;\n pay(\n payload: CheckoutPayload,\n details?: { contactPhone?: string },\n ): Promise<void>;\n};\n\nconst subscriptions = new WeakMap<\n CheckoutHandoff,\n (listener: () => void) => () => void\n>();\nconst Context = createContext<CheckoutHandoff | null>(null);\nconst idle = () => () => {};\n\nexport function CheckoutHandoffProvider({\n handoff,\n children,\n}: {\n handoff: CheckoutHandoff;\n children: ReactNode;\n}) {\n const subscribe = useCallback(\n (listener: () => void) => (subscriptions.get(handoff) ?? idle)(listener),\n [handoff],\n );\n const read = useCallback(() => handoff.customer, [handoff]);\n const customer = useSyncExternalStore(subscribe, read, read);\n const value = useMemo<CheckoutHandoff>(\n () => ({\n ...(handoff.contactPhone !== undefined\n ? { contactPhone: handoff.contactPhone }\n : {}),\n customer,\n signIn: () => handoff.signIn(),\n pay: (payload, details) =>\n details ? handoff.pay(payload, details) : handoff.pay(payload),\n }),\n [customer, handoff],\n );\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\nexport function useCheckoutHandoff() {\n const handoff = useContext(Context);\n if (!handoff) {\n throw new Error(\"useCheckoutHandoff requires CheckoutHandoffProvider\");\n }\n return handoff;\n}\n\nfunction customerName(customer: SessionCustomer | null) {\n if (!customer) {\n return null;\n }\n const digits = customer.phone_masked?.replace(/\\D/g, \"\") ?? \"\";\n return {\n ...(customer.given_name ? { name: customer.given_name } : {}),\n ...(digits.length >= 4 ? { phoneLast4: digits.slice(-4) } : {}),\n };\n}\n\nfunction checkoutFulfilment(payload: CheckoutPayload) {\n const fulfilment = wireCheckoutFulfilment(payload.fulfilment);\n if (fulfilment.type === \"delivery\") {\n return { ...fulfilment, type: \"delivery\" } as const;\n }\n if (fulfilment.type === \"pickup\") {\n return { ...fulfilment, type: \"pickup\" } as const;\n }\n throw new Error(\"Dine-in checkout is unavailable\");\n}\n\nexport function createSdkCheckoutHandoff({\n customer,\n checkout,\n branchId,\n returnUrl,\n cancelUrl,\n attribution = currentSource,\n}: {\n customer: CustomerClient;\n checkout: CheckoutClient;\n branchId: string;\n returnUrl?: string;\n cancelUrl?: string;\n attribution?: () => { source: string; campaign: string };\n}): CheckoutHandoff {\n let source = customer.customer;\n let current = customerName(source);\n // One attempt per cart and phone: a retry reuses the key and the exact body,\n // because the API refuses a reused key whose body changed.\n let attempt:\n | {\n digest: string;\n key: string;\n returnUrl: string;\n cancelUrl: string;\n source: string;\n campaign: string;\n }\n | undefined;\n const readCustomer = () => {\n if (source !== customer.customer) {\n source = customer.customer;\n current = customerName(source);\n }\n return current;\n };\n const handoff: CheckoutHandoff = {\n contactPhone: true,\n get customer() {\n return readCustomer();\n },\n signIn() {\n customer.signIn();\n },\n async pay(payload, details) {\n const contactPhone =\n details?.contactPhone?.trim().replace(/\\s+/g, \"\") ?? \"\";\n const digest = JSON.stringify({ payload, contactPhone });\n if (attempt?.digest !== digest) {\n const visit = attribution();\n attempt = {\n digest,\n key: crypto.randomUUID(),\n returnUrl: returnUrl ?? `${location.origin}/checkout/return`,\n cancelUrl: cancelUrl ?? location.href,\n source: visit.source,\n campaign: visit.campaign,\n };\n }\n const request: CheckoutRequest = {\n branch_id: branchId,\n menu_version: payload.menu_version,\n lines: payload.lines,\n fulfilment: checkoutFulfilment(payload),\n ...(contactPhone ? { contact_phone: contactPhone } : {}),\n ...(payload.promo_code ? { promo_code: payload.promo_code } : {}),\n ...(attempt.source ? { source: attempt.source } : {}),\n ...(attempt.campaign ? { campaign: attempt.campaign } : {}),\n return_url: attempt.returnUrl,\n cancel_url: attempt.cancelUrl,\n };\n try {\n const session = await checkout.open(request, attempt.key);\n location.assign(session.url);\n } catch (failure) {\n if (\n failure instanceof CheckoutError &&\n failure.apiCode === \"customer_required\"\n ) {\n await handoff.signIn();\n return;\n }\n throw failure;\n }\n },\n };\n subscriptions.set(handoff, (listener) => {\n const unsubscribe = customer.onChange((_state, next) => {\n source = next;\n current = customerName(next);\n listener();\n });\n // Without a CustomerProvider nothing else asks who is signed in.\n if (customer.state === \"unknown\") {\n void customer.session().catch(() => undefined);\n }\n return unsubscribe;\n });\n return handoff;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/host-bridge.js
CHANGED
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
// src/host-bridge.tsx
|
|
4
|
+
import { createContext, useContext } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
var Context = createContext(null);
|
|
7
|
+
function BaseHostBridgeProvider({
|
|
8
|
+
bridge,
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(Context.Provider, { value: bridge, children });
|
|
12
|
+
}
|
|
13
|
+
function useBaseHostBridge() {
|
|
14
|
+
const bridge = useContext(Context);
|
|
15
|
+
if (!bridge) {
|
|
16
|
+
throw new Error("useBaseHostBridge requires BaseHostBridgeProvider");
|
|
17
|
+
}
|
|
18
|
+
return bridge;
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
BaseHostBridgeProvider,
|
|
22
|
+
useBaseHostBridge
|
|
23
|
+
};
|
|
3
24
|
//# sourceMappingURL=host-bridge.js.map
|
|
4
|
-
//# sourceMappingURL=host-bridge.js.map
|
package/dist/host-bridge.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/host-bridge.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\nimport type { CartFulfilment, Money, OpeningTime } from \"@zappie/sdk\";\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nexport type { AddressSuggestion } from \"./address\";\nexport type HostPromo = {\n id: string;\n name: string;\n description: string;\n code: string;\n disabled: boolean;\n endsAt?: string;\n};\nexport type HostReward = {\n id: string;\n name: string;\n description: string;\n pointsCost: number;\n disabled: boolean;\n reward: string;\n};\nexport type HostAppliedReward = {\n redemptionId: string;\n perkId: string;\n name: string;\n pointsSpent: number;\n};\n/** Temporary Stage A integration. Themes never import host stores or payment implementations. */\nexport type BaseHostBridge = {\n /**\n * Host-optimised, responsive URLs for a merchant image at the given\n * `sizes`. Absent, themes load the original URL.\n */\n imageProps?(\n src: string,\n sizes: string,\n ): { src: string; srcSet?: string; sizes?: string };\n /**\n * Recoverable host synchronization or checkout failure for the cart screen.\n * Host checkout failures are reported here, so callers don't show them again.\n */\n error?: string | null;\n /** Host-owned mode capabilities during Stage A. */\n fulfilmentMode?: \"delivery\" | \"pickup\";\n scheduleMaxDays?: number;\n /** Delivery regions, when the branch prices delivery by region (else absent). */\n deliveryRegions?: { id: string; name: string; fee: Money }[];\n deliveryRegionId?: string;\n setDeliveryRegion?(id: string): void;\n /**\n * Details the business requires before payment (absent when it requires\n * none). Values start from the customer's profile; the host saves them to\n * the profile when the order is confirmed.\n */\n customerDetails?: {\n requiresEmail: boolean;\n values: CustomerDetailsValues;\n update(field: keyof CustomerDetailsValues, value: string): void;\n };\n /** Opening hours the host accepts scheduled orders in (may start later than the branch's). */\n scheduleOpeningTimes?: OpeningTime[];\n saveFulfilment?: (value: CartFulfilment) => void;\n availablePromos?: HostPromo[];\n rewards?: {\n balance: number;\n items: HostReward[];\n applied: HostAppliedReward[];\n busyPerkId?: string;\n redeem(perkId: string): Promise<void>;\n cancel(redemptionId: string): Promise<void>;\n };\n deliveryDistance?: {\n status: \"unknown\" | \"far\" | \"too_far\";\n message?: string;\n };\n /**\n * Switches the host between delivery and pickup. The host keeps a basket per\n * mode, so the cart remounts against the other basket; returns false when the\n * branch or menu does not allow the switch.\n */\n setFulfilmentMode(mode: \"delivery\" | \"pickup\"): boolean;\n};\nexport type CustomerDetailsValues = {\n firstName: string;\n lastName: string;\n email: string;\n};\nconst Context = createContext<BaseHostBridge | null>(null);\nexport function BaseHostBridgeProvider({\n bridge,\n children,\n}: {\n bridge: BaseHostBridge;\n children: ReactNode;\n}) {\n return <Context.Provider value={bridge}>{children}</Context.Provider>;\n}\nexport function useBaseHostBridge() {\n const bridge = useContext(Context);\n if (!bridge) {\n throw new Error(\"useBaseHostBridge requires BaseHostBridgeProvider\");\n }\n return bridge;\n}\n"],
|
|
5
|
+
"mappings": ";;;AAEA,SAAS,eAAe,kBAAkC;AA6FjD;AART,IAAM,UAAU,cAAqC,IAAI;AAClD,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AACF,GAGG;AACD,SAAO,oBAAC,QAAQ,UAAR,EAAiB,OAAO,QAAS,UAAS;AACpD;AACO,SAAS,oBAAoB;AAClC,QAAM,SAAS,WAAW,OAAO;AACjC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["export const BASE_THEME_ID = \"base-next\";\n"],
|
|
5
|
+
"mappings": ";AAAO,IAAM,gBAAgB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/item/configurator-commit.ts
|
|
2
|
+
function createConfiguratorCommit(client, line) {
|
|
3
|
+
if (!line) {
|
|
4
|
+
return void 0;
|
|
5
|
+
}
|
|
6
|
+
return (input) => {
|
|
7
|
+
const nextInput = { ...input };
|
|
8
|
+
delete nextInput.variantId;
|
|
9
|
+
return client.cart.update(line.id, nextInput);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
createConfiguratorCommit
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=configurator-commit.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/item/configurator-commit.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CartLine, CartLineInput, Zappie } from \"@zappie/sdk\";\n\nexport function createConfiguratorCommit(\n client: Zappie,\n line: CartLine | undefined,\n) {\n if (!line) {\n return undefined;\n }\n return (input: CartLineInput) => {\n const nextInput = { ...input };\n delete nextInput.variantId;\n return client.cart.update(line.id, nextInput);\n };\n}\n"],
|
|
5
|
+
"mappings": ";AAEO,SAAS,yBACd,QACA,MACA;AACA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,CAAC,UAAyB;AAC/B,UAAM,YAAY,EAAE,GAAG,MAAM;AAC7B,WAAO,UAAU;AACjB,WAAO,OAAO,KAAK,OAAO,KAAK,IAAI,SAAS;AAAA,EAC9C;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// src/item/configurator-draft.ts
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
function useConfiguratorDraft({
|
|
4
|
+
item,
|
|
5
|
+
menuId,
|
|
6
|
+
line,
|
|
7
|
+
scope
|
|
8
|
+
}) {
|
|
9
|
+
const key = `zappie:product-draft:${scope}:${item.id}:${menuId ?? ""}:${line?.id ?? "new"}`;
|
|
10
|
+
const initial = {
|
|
11
|
+
itemId: item.id,
|
|
12
|
+
...menuId !== void 0 ? { menuId } : {},
|
|
13
|
+
quantity: line?.quantity ?? item.quantity.min,
|
|
14
|
+
choices: line?.choices.map((choice) => ({ ...choice })) ?? [],
|
|
15
|
+
inputs: { ...line?.inputs },
|
|
16
|
+
note: line?.note ?? ""
|
|
17
|
+
};
|
|
18
|
+
const [value, setValue] = useState(initial);
|
|
19
|
+
const [restored, setRestored] = useState(false);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
try {
|
|
22
|
+
const saved = JSON.parse(sessionStorage.getItem(key) ?? "null");
|
|
23
|
+
if (saved?.itemId === item.id && saved?.menuId === menuId && Number.isFinite(saved.quantity) && Array.isArray(saved.choices) && saved.choices.every((choice) => {
|
|
24
|
+
if (!choice || typeof choice !== "object") {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const value2 = choice;
|
|
28
|
+
return typeof value2.groupId === "string" && typeof value2.choiceId === "string" && Number.isFinite(value2.quantity);
|
|
29
|
+
}) && saved.inputs && typeof saved.inputs === "object" && !Array.isArray(saved.inputs) && Object.values(saved.inputs).every(
|
|
30
|
+
(value2) => typeof value2 === "string" || typeof value2 === "boolean" || typeof value2 === "number" && Number.isFinite(value2)
|
|
31
|
+
) && typeof saved.note === "string") {
|
|
32
|
+
setValue({
|
|
33
|
+
...initial,
|
|
34
|
+
quantity: saved.quantity,
|
|
35
|
+
choices: saved.choices,
|
|
36
|
+
inputs: saved.inputs,
|
|
37
|
+
note: saved.note
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
} catch {
|
|
41
|
+
}
|
|
42
|
+
setRestored(true);
|
|
43
|
+
}, [key]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (restored) {
|
|
46
|
+
try {
|
|
47
|
+
sessionStorage.setItem(key, JSON.stringify(value));
|
|
48
|
+
} catch {
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}, [key, value, restored]);
|
|
52
|
+
const clear = () => {
|
|
53
|
+
try {
|
|
54
|
+
sessionStorage.removeItem(key);
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return { clear, restored, setValue, value };
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
useConfiguratorDraft
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=configurator-draft.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/item/configurator-draft.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CartLine, CartLineInput, Item } from \"@zappie/sdk\";\nimport { useEffect, useState } from \"react\";\n\nexport function useConfiguratorDraft({\n item,\n menuId,\n line,\n scope,\n}: {\n item: Item;\n menuId?: string;\n line?: CartLine;\n scope: string;\n}) {\n const key = `zappie:product-draft:${scope}:${item.id}:${menuId ?? \"\"}:${line?.id ?? \"new\"}`;\n const initial: CartLineInput = {\n itemId: item.id,\n ...(menuId !== undefined ? { menuId } : {}),\n quantity: line?.quantity ?? item.quantity.min,\n choices: line?.choices.map((choice) => ({ ...choice })) ?? [],\n inputs: { ...line?.inputs },\n note: line?.note ?? \"\",\n };\n const [value, setValue] = useState(initial);\n const [restored, setRestored] = useState(false);\n\n useEffect(() => {\n try {\n const saved = JSON.parse(sessionStorage.getItem(key) ?? \"null\");\n if (\n saved?.itemId === item.id &&\n saved?.menuId === menuId &&\n Number.isFinite(saved.quantity) &&\n Array.isArray(saved.choices) &&\n saved.choices.every((choice: unknown) => {\n if (!choice || typeof choice !== \"object\") {\n return false;\n }\n const value = choice as Record<string, unknown>;\n return (\n typeof value.groupId === \"string\" &&\n typeof value.choiceId === \"string\" &&\n Number.isFinite(value.quantity)\n );\n }) &&\n saved.inputs &&\n typeof saved.inputs === \"object\" &&\n !Array.isArray(saved.inputs) &&\n Object.values(saved.inputs).every(\n (value) =>\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value)),\n ) &&\n typeof saved.note === \"string\"\n ) {\n setValue({\n ...initial,\n quantity: saved.quantity,\n choices: saved.choices,\n inputs: saved.inputs,\n note: saved.note,\n });\n }\n } catch {\n // A draft is optional; storage failure never prevents configuring an item.\n }\n setRestored(true);\n }, [key]);\n\n useEffect(() => {\n if (restored) {\n try {\n sessionStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Keep the in-memory draft when storage is unavailable.\n }\n }\n }, [key, value, restored]);\n\n const clear = () => {\n try {\n sessionStorage.removeItem(key);\n } catch {\n // Saving the cart succeeded; a failed optional draft cleanup must not undo it.\n }\n };\n\n return { clear, restored, setValue, value };\n}\n"],
|
|
5
|
+
"mappings": ";AACA,SAAS,WAAW,gBAAgB;AAE7B,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,MAAM,wBAAwB,KAAK,IAAI,KAAK,EAAE,IAAI,UAAU,EAAE,IAAI,MAAM,MAAM,KAAK;AACzF,QAAM,UAAyB;AAAA,IAC7B,QAAQ,KAAK;AAAA,IACb,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,UAAU,MAAM,YAAY,KAAK,SAAS;AAAA,IAC1C,SAAS,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE,KAAK,CAAC;AAAA,IAC5D,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,IAC1B,MAAM,MAAM,QAAQ;AAAA,EACtB;AACA,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,OAAO;AAC1C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,eAAe,QAAQ,GAAG,KAAK,MAAM;AAC9D,UACE,OAAO,WAAW,KAAK,MACvB,OAAO,WAAW,UAClB,OAAO,SAAS,MAAM,QAAQ,KAC9B,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,MAAM,CAAC,WAAoB;AACvC,YAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,iBAAO;AAAA,QACT;AACA,cAAMA,SAAQ;AACd,eACE,OAAOA,OAAM,YAAY,YACzB,OAAOA,OAAM,aAAa,YAC1B,OAAO,SAASA,OAAM,QAAQ;AAAA,MAElC,CAAC,KACD,MAAM,UACN,OAAO,MAAM,WAAW,YACxB,CAAC,MAAM,QAAQ,MAAM,MAAM,KAC3B,OAAO,OAAO,MAAM,MAAM,EAAE;AAAA,QAC1B,CAACA,WACC,OAAOA,WAAU,YACjB,OAAOA,WAAU,aAChB,OAAOA,WAAU,YAAY,OAAO,SAASA,MAAK;AAAA,MACvD,KACA,OAAO,MAAM,SAAS,UACtB;AACA,iBAAS;AAAA,UACP,GAAG;AAAA,UACH,UAAU,MAAM;AAAA,UAChB,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,UACd,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AACA,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,GAAG,CAAC;AAER,YAAU,MAAM;AACd,QAAI,UAAU;AACZ,UAAI;AACF,uBAAe,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,MACnD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,OAAO,QAAQ,CAAC;AAEzB,QAAM,QAAQ,MAAM;AAClB,QAAI;AACF,qBAAe,WAAW,GAAG;AAAA,IAC/B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,UAAU,UAAU,MAAM;AAC5C;",
|
|
6
|
+
"names": ["value"]
|
|
7
|
+
}
|