← Files WixARCHIVED FILE

skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts

1.96 KB · Oct 8, 2026 · 12:02 UTC

↓ Download file

See the change to this file →

// React binding for the order-cart store. Works in any React root — Astro islands (several
// on one page share the same store) and SPAs alike.
import { useSyncExternalStore } from "react";
import {
  addOrderLine,
  getOrderCartState,
  goToOrderCheckout,
  isMenuOrderable,
  refreshOrderCart,
  removeLineFromOrder,
  setOrderCartOpen,
  subscribeOrderCart,
  updateOrderLineQuantity,
  type OrderCartState,
} from "../../wix/restaurants/order-store";
import type { MenuItem, OrderSelection } from "../../wix/restaurants/types";

const SERVER_STATE = getOrderCartState();

export interface UseOrderCart extends OrderCartState {
  itemCount: number;
  /**
   * Add a dish: the MenuItem DTO as rendered, the menu/section ids it is rendered under (the
   * fetchMenus tree — never looked up again), the quantity, and the visitor's selection (from
   * initialSelection(item) + toggleModifier; omit for a dish with nothing to choose).
   */
  addToOrder: (item: MenuItem, context: { menuId: string; sectionId: string }, quantity?: number, selection?: OrderSelection) => Promise<void>;
  /** false → this menu takes no online orders right now (no add control); null while unknown. */
  menuOrderable: (menuId: string) => boolean | null;
  updateQuantity: (lineItemId: string, quantity: number) => Promise<void>;
  removeLine: (lineItemId: string) => Promise<void>;
  checkout: () => Promise<void>;
  openCart: () => void;
  closeCart: () => void;
  refresh: () => Promise<void>;
}

export function useOrderCart(): UseOrderCart {
  const state = useSyncExternalStore(subscribeOrderCart, getOrderCartState, () => SERVER_STATE);
  return {
    ...state,
    itemCount: state.cart?.itemCount ?? 0,
    addToOrder: addOrderLine,
    menuOrderable: isMenuOrderable,
    updateQuantity: updateOrderLineQuantity,
    removeLine: removeLineFromOrder,
    checkout: goToOrderCheckout,
    openCart: () => setOrderCartOpen(true),
    closeCart: () => setOrderCartOpen(false),
    refresh: refreshOrderCart,
  };
}

SHA-256: fca03d4e0e9e8129b1efd5901976a063d02ab3c5ae36b9d630ed2fa94ad38b2d