@swift-food-services/catering-widget 0.1.0-beta.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/CateringConfigContext.tsx","../src/api/baseUrl.ts","../src/api/client.ts","../src/api/endpoints/restaurants.ts","../src/api/endpoints/menu.ts","../src/api/endpoints/bundles.ts","../src/api/endpoints/pricing.ts","../src/api/endpoints/catering.ts","../src/api/endpoints/index.ts","../src/storage/storage.ts","../src/state/navigation.ts","../src/state/CateringStateContext.tsx","../src/state/CateringFilterContext.tsx","../src/shims/nextNavigation.ts","../src/shims/cateringService.ts","../src/constants/allergens.ts","../src/components/MenuItemModal.tsx","../src/components/TutorialTooltip.tsx","../src/utils/menuPdfUtils.ts","../src/pdf/CateringMenuPdf.tsx","../src/utils/catering-min-order-validation.ts","../src/components/catering-order-helpers.ts","../src/components/TimeSlotDropdown.tsx","../src/components/SessionEditor.tsx","../src/components/DateSessionNav.tsx","../src/shims/fetchWithAuth.ts","../src/shims/services.ts","../src/components/SelectedItemsByCategory.tsx","../src/components/ActiveSessionPanel.tsx","../src/config/googleMapsConfig.ts","../src/config/googleMaps.ts","../src/utils/google-maps-loader.ts","../src/hooks/useAddressAutocomplete.ts","../src/components/contact/PricingSummary.tsx","../src/components/ViewOrderModal.tsx","../src/components/MenuItemCard.tsx","../src/components/BundleCard.tsx","../src/components/modals/BundleDetailModal.tsx","../src/components/RestaurantMenuBrowser.tsx","../src/components/BundleBrowser.tsx","../src/components/MenuBrowserColumn.tsx","../src/components/AllMealSessionsItems.tsx","../src/components/modals/PdfDownloadModal.tsx","../src/components/modals/HalkinVenueModal.tsx","../src/components/contact/AddressAutocomplete.tsx","../src/components/contact/DeliveryAddressForm.tsx","../src/components/contact/ContactInfoForm.tsx","../src/components/contact/PromoCodeSection.tsx","../src/constants/api.ts","../src/components/CheckoutScreen.tsx","../src/components/modals/EmptySessionWarningModal.tsx","../src/components/modals/RemoveSessionConfirmModal.tsx","../src/components/modals/MinOrderModal.tsx","../src/components/modals/SwapItemModal.tsx","../src/components/modals/ValidationAlertModal.tsx","../src/components/hooks/useCateringTutorial.ts","../src/components/hooks/useCateringData.ts","../src/components/CateringOrderBuilder.tsx","../src/CateringWidget.tsx"],"names":["createContext","jsx","useContext","useState","useReducer","useEffect","useCallback","price","quantity","groupItemsByRestaurant","jsxs","X","Fragment","useRef","useMemo","highlightPadding","highlightExtendBottom","highlightViewportExtension","effectiveHighlightExtendBottom","createPortal","formatAllergen","StyleSheet","Page","Image","View","Text","Document","ChevronDown","Clock","formatTimeDisplay","Plus","ArrowLeftRight","Pencil","Trash2","Store","Tag","Package","formatTime","AlertTriangle","ShoppingBag","createRef","ChevronUp","DIETARY_ICON_MAP","Minus","closestSlotLabel","eventMinutes","isAvailable","Clock3","Info","ArrowLeft","ChevronLeft","ChevronRight","Search","enrichBundleItemAddons","ChefHat","Calendar","FileText","DollarSign","Users","MapPin","Check","Copy","ExternalLink","Building2","Percent","pdf","ArrowDown","ImageOff","MoreHorizontal"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\";\nimport type {\n Theme,\n InitialData,\n OrderCompleteResult,\n WidgetError,\n} from \"../types/public\";\nimport type { ApiEndpoints } from \"../api/endpoints\";\nimport type { Storage } from \"../storage/storage\";\n\nexport interface CateringConfig {\n publishableKey: string;\n partnerId: string;\n theme?: Theme;\n initialData?: InitialData;\n stickyTopOffset?: number;\n onReady?: () => void;\n onOrderComplete?: (result: OrderCompleteResult) => void;\n onError?: (error: WidgetError) => void;\n api: ApiEndpoints;\n storage: Storage;\n}\n\nconst CateringConfigContext = createContext<CateringConfig | null>(null);\n\nexport function CateringConfigProvider({\n value,\n children,\n}: {\n value: CateringConfig;\n children: ReactNode;\n}) {\n return (\n <CateringConfigContext.Provider value={value}>\n {children}\n </CateringConfigContext.Provider>\n );\n}\n\nexport function useCateringConfig(): CateringConfig {\n const ctx = useContext(CateringConfigContext);\n if (!ctx) {\n throw new Error(\n \"useCateringConfig must be used inside <CateringWidget>. \" +\n \"If you see this error, a component was rendered outside the widget tree.\"\n );\n }\n return ctx;\n}\n\nexport function useApiClient(): ApiEndpoints {\n return useCateringConfig().api;\n}\n\nexport function useStorage(): Storage {\n return useCateringConfig().storage;\n}\n","export const DEFAULT_API_BASE_URL = \"https://api.swiftfood.uk\";\n\nexport function resolveBaseUrl(override?: string): string {\n if (override) return override.replace(/\\/$/, \"\");\n const envUrl = process.env.SWIFT_WIDGET_API_URL || undefined;\n return (envUrl ?? DEFAULT_API_BASE_URL).replace(/\\/$/, \"\");\n}\n","import { resolveBaseUrl } from \"./baseUrl\";\nimport type { WidgetError } from \"../types/public\";\n\nexport interface ApiClientOptions {\n publishableKey: string;\n baseUrl?: string;\n}\n\nexport interface ApiClient {\n request(path: string, init?: RequestInit): Promise<Response>;\n requestJson<T>(path: string, init?: RequestInit): Promise<T>;\n}\n\nexport function createApiClient(opts: ApiClientOptions): ApiClient {\n const baseUrl = resolveBaseUrl(opts.baseUrl);\n\n const request = async (\n path: string,\n init: RequestInit = {}\n ): Promise<Response> => {\n const headers: Record<string, string> = {\n ...(init.headers as Record<string, string> | undefined),\n };\n if (opts.publishableKey) {\n headers[\"X-Partner-Key\"] = opts.publishableKey;\n }\n if (init.body && !(\"Content-Type\" in headers)) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return fetch(`${baseUrl}${path}`, { ...init, headers });\n };\n\n const requestJson = async <T>(\n path: string,\n init: RequestInit = {}\n ): Promise<T> => {\n const res = await request(path, init);\n if (!res.ok) {\n const err: WidgetError = {\n code: \"network_error\",\n message: `Request failed: ${res.status} ${res.statusText}`,\n };\n throw err;\n }\n return (await res.json()) as T;\n };\n\n return { request, requestJson };\n}\n","import type { ApiClient } from \"../client\";\n\nexport function createRestaurantsApi(client: ApiClient) {\n return {\n getRestaurant: (restaurantId: string): Promise<unknown> =>\n client.requestJson<unknown>(`/restaurants/${restaurantId}`),\n };\n}\n","import type { ApiClient } from \"../client\";\nimport type { SearchFilters, SearchResponse } from \"../../types/menu\";\n\nexport function createMenuApi(client: ApiClient) {\n return {\n getMenuItems: (): Promise<any> =>\n client.requestJson<any>(\"/menu-item/catering\"),\n\n getMenuItemsByRestaurant: async (\n restaurantId: string\n ): Promise<any[]> => {\n const data = await client.requestJson<{ menuItems?: any[] }>(\n `/menu-item/restaurant/${restaurantId}`\n );\n return data.menuItems ?? [];\n },\n\n searchMenuItems: (\n query: string,\n filters?: SearchFilters\n ): Promise<SearchResponse> => {\n const params = new URLSearchParams();\n params.append(\"q\", query || \"\");\n if (filters?.page) params.append(\"page\", filters.page.toString());\n if (filters?.limit) params.append(\"limit\", filters.limit.toString());\n if (filters?.marketId) params.append(\"marketId\", filters.marketId);\n if (filters?.categoryId) params.append(\"categoryId\", filters.categoryId);\n if (filters?.minRating)\n params.append(\"minRating\", filters.minRating.toString());\n if (filters?.maxPrice)\n params.append(\"maxPrice\", filters.maxPrice.toString());\n if (filters?.dietaryFilters)\n params.append(\"dietaryFilters\", filters.dietaryFilters.join(\",\"));\n if (filters?.allergens)\n params.append(\"excludeAllergens\", filters.allergens.join(\",\"));\n\n return client.requestJson<SearchResponse>(\n `/search?catering=true&${params.toString()}`\n );\n },\n };\n}\n","import type { ApiClient } from \"../client\";\nimport type { CateringBundleResponse } from \"../../types/bundle\";\n\nexport function createBundlesApi(client: ApiClient) {\n return {\n getBundleById: (bundleId: string): Promise<CateringBundleResponse> =>\n client.requestJson<CateringBundleResponse>(\n `/catering-bundles/${bundleId}`\n ),\n\n getCateringBundles: (): Promise<CateringBundleResponse[]> =>\n client.requestJson<CateringBundleResponse[]>(\n \"/catering-bundles?type=catering\"\n ),\n\n getBundlesByRestaurant: (\n restaurantId: string\n ): Promise<CateringBundleResponse[]> =>\n client.requestJson<CateringBundleResponse[]>(\n `/catering-bundles/restaurant/${restaurantId}`\n ),\n };\n}\n","import type { ApiClient } from \"../client\";\nimport type { CateringPricingResult, PromoCodeValidation } from \"../../types/pricing\";\nimport type { CateringRestaurantOrderRequest } from \"../../types/api/request\";\nimport type { MealSessionState, SelectedMenuItem } from \"../../types/session\";\n\nfunction groupItemsByRestaurant(\n orderItems: SelectedMenuItem[]\n): CateringRestaurantOrderRequest[] {\n const grouped = orderItems.reduce(\n (acc, { item, quantity }) => {\n const restaurantId =\n (item as { restaurant?: { restaurantId?: string } }).restaurant\n ?.restaurantId ||\n (item as { restaurantId?: string }).restaurantId ||\n \"unknown\";\n\n if (!acc[restaurantId]) {\n acc[restaurantId] = { restaurantId, items: [] };\n }\n\n acc[restaurantId].items.push({\n menuItemId: item.id,\n quantity,\n selectedAddons: (item as { selectedAddons?: unknown[] })\n .selectedAddons as\n | { name: string; quantity: number; groupTitle?: string }[]\n | undefined,\n groupTitle: (item as { groupTitle?: string }).groupTitle,\n });\n\n return acc;\n },\n {} as Record<\n string,\n {\n restaurantId: string;\n items: {\n menuItemId: string;\n quantity: number;\n selectedAddons?:\n | { name: string; quantity: number; groupTitle?: string }[]\n | undefined;\n groupTitle?: string;\n }[];\n }\n >\n );\n\n return Object.values(grouped).map((group) => ({\n restaurantId: group.restaurantId,\n menuItems: group.items.map((i) => ({\n menuItemId: i.menuItemId,\n quantity: i.quantity,\n selectedAddons: i.selectedAddons,\n groupTitle: i.groupTitle,\n })),\n specialInstructions: \"\",\n }));\n}\n\nexport function createPricingApi(client: ApiClient) {\n return {\n calculateCateringPricing: (\n orderItems: CateringRestaurantOrderRequest[],\n promoCodes?: string[],\n deliveryLocation?: { latitude: number; longitude: number }\n ): Promise<CateringPricingResult> =>\n client.requestJson<CateringPricingResult>(\n \"/pricing/catering-verify-cart\",\n {\n method: \"POST\",\n body: JSON.stringify({\n orderItems,\n promoCodes,\n ...(deliveryLocation && { deliveryLocation }),\n }),\n }\n ),\n\n calculateCateringPricingWithMealSessions: async (\n mealSessions: MealSessionState[],\n promoCodes?: string[],\n deliveryLocation?: { latitude: number; longitude: number }\n ): Promise<CateringPricingResult> => {\n const mealSessionRequests = mealSessions\n .filter((s) => s.orderItems.length > 0)\n .map((session, index) => ({\n sessionName: session.sessionName || `Session ${index + 1}`,\n sessionDate: session.sessionDate,\n eventTime: session.eventTime,\n guestCount: session.guestCount,\n specialRequirements: session.specialRequirements,\n orderItems: groupItemsByRestaurant(session.orderItems),\n }));\n\n try {\n return await client.requestJson<CateringPricingResult>(\n \"/pricing/catering-verify-cart\",\n {\n method: \"POST\",\n body: JSON.stringify({\n mealSessions: mealSessionRequests,\n promoCodes,\n ...(deliveryLocation && { deliveryLocation }),\n }),\n }\n );\n } catch (err) {\n const message =\n (err as { message?: string })?.message ||\n \"Failed to calculate pricing\";\n return {\n isValid: false,\n subtotal: 0,\n deliveryFee: 0,\n total: 0,\n error: message,\n } as CateringPricingResult;\n }\n },\n\n validatePromoCode: async (\n promoCode: string,\n orderItems: CateringRestaurantOrderRequest[]\n ): Promise<PromoCodeValidation> => {\n try {\n return await client.requestJson<PromoCodeValidation>(\n \"/promotions/validate-catering\",\n {\n method: \"POST\",\n body: JSON.stringify({ code: promoCode, orderItems }),\n }\n );\n } catch {\n return {\n valid: false,\n reason: \"Network error while validating promo code\",\n };\n }\n },\n\n validatePromoCodeWithMealSessions: async function (\n promoCode: string,\n mealSessions: MealSessionState[]\n ): Promise<PromoCodeValidation> {\n const allOrderItems = mealSessions.flatMap((s) =>\n groupItemsByRestaurant(s.orderItems)\n );\n return this.validatePromoCode(promoCode, allOrderItems);\n },\n };\n}\n","import type { ApiClient } from \"../client\";\nimport type { CateringOrderResponse, DeliveryTrackingDto } from \"../../types/api/response\";\nimport type { CreateCateringOrderRequest } from \"../../types/api/request\";\nimport type { ContactInfo } from \"../../types/checkout\";\n\nfunction normalizeUkPhoneToE164(phone: string): string {\n const trimmed = (phone || \"\").trim();\n if (!trimmed) throw new Error(\"Phone number is required\");\n\n const startsWithPlus = trimmed.startsWith(\"+\");\n const numeric = trimmed.replace(/\\D/g, \"\");\n const compact = startsWithPlus ? `+${numeric}` : numeric;\n\n let normalized = compact;\n if (!compact.startsWith(\"+\")) {\n if (compact.startsWith(\"0\")) normalized = `+44${compact.slice(1)}`;\n else if (compact.startsWith(\"44\")) normalized = `+${compact}`;\n else normalized = `+${compact}`;\n }\n if (!/^\\+?[1-9]\\d{1,14}$/.test(normalized)) {\n throw new Error(\"Invalid phone number format\");\n }\n return normalized;\n}\n\nasync function readErrorMessage(response: Response): Promise<string> {\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n const body = await response.json().catch(() => ({}));\n return (body?.message || body?.error || \"\").toString().trim();\n }\n return (await response.text().catch(() => \"\")).trim();\n}\n\nexport function createCateringApi(client: ApiClient) {\n const findOrCreateConsumerAccount = async (\n contactInfo: ContactInfo\n ): Promise<string> => {\n const checkResponse = await client.request(\n `/users/email/${encodeURIComponent(contactInfo.email)}`\n );\n\n if (checkResponse.ok) {\n const existingUser = await checkResponse.json();\n return existingUser.id;\n }\n\n if (checkResponse.status !== 404) {\n const lookupMessage = await readErrorMessage(checkResponse);\n throw new Error(\n lookupMessage ||\n `Failed to check user by email (status ${checkResponse.status})`\n );\n }\n\n const randomPassword = Math.random().toString(36).slice(-10) + \"A1\";\n const formattedPhone = normalizeUkPhoneToE164(contactInfo.phone);\n\n const createConsumerDto = {\n userDetails: {\n username: contactInfo.email.split(\"@\")[0] + \"_\" + Date.now(),\n password: randomPassword,\n email: contactInfo.email,\n phoneNumber: formattedPhone,\n role: \"customer\",\n },\n };\n const response = await client.request(`/consumer-user`, {\n method: \"POST\",\n body: JSON.stringify(createConsumerDto),\n });\n\n if (!response.ok) {\n const errorMessage = await readErrorMessage(response);\n throw new Error(\n errorMessage ||\n `Failed to create consumer account (status ${response.status})`\n );\n }\n\n const data = await response.json();\n return data.user.id;\n };\n\n const createAddress = async (\n userId: string,\n contactInfo: ContactInfo\n ): Promise<string> => {\n const createAddressDto = {\n userId,\n name: \"Catering Delivery Address\",\n addressLine1: contactInfo.addressLine1,\n addressLine2: contactInfo.addressLine2,\n city: contactInfo.city,\n zipcode: contactInfo.zipcode,\n location: {\n latitude: contactInfo.latitude || 0,\n longitude: contactInfo.longitude || 0,\n },\n };\n\n const response = await client.request(`/address`, {\n method: \"POST\",\n body: JSON.stringify(createAddressDto),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to create address\");\n }\n const data = await response.json();\n return data.id;\n };\n\n const submitOrder = (\n payload: CreateCateringOrderRequest\n ): Promise<{ orderId: string; accessToken: string } & Record<string, unknown>> =>\n client.requestJson<{ orderId: string; accessToken: string } & Record<string, unknown>>(\n \"/catering-orders\",\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n }\n );\n\n const getOrderByToken = (token: string): Promise<CateringOrderResponse> =>\n client.requestJson<CateringOrderResponse>(\n `/catering-orders/view/${token}`\n );\n\n const getDeliveryTracking = (\n mealSessionId: string\n ): Promise<DeliveryTrackingDto> =>\n client.requestJson<DeliveryTrackingDto>(\n `/catering-driver/track/${mealSessionId}`\n );\n\n return {\n findOrCreateConsumerAccount,\n createAddress,\n submitOrder,\n getOrderByToken,\n getDeliveryTracking,\n };\n}\n","import type { ApiClient } from \"../client\";\nimport { createRestaurantsApi } from \"./restaurants\";\nimport { createMenuApi } from \"./menu\";\nimport { createBundlesApi } from \"./bundles\";\nimport { createPricingApi } from \"./pricing\";\nimport { createCateringApi } from \"./catering\";\n\nexport function createApiEndpoints(client: ApiClient) {\n return {\n restaurants: createRestaurantsApi(client),\n menu: createMenuApi(client),\n bundles: createBundlesApi(client),\n pricing: createPricingApi(client),\n catering: createCateringApi(client),\n };\n}\n\nexport type ApiEndpoints = ReturnType<typeof createApiEndpoints>;\n","export interface Storage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n clear(): void;\n}\n\ninterface CreateStorageOptions {\n driver?: \"localStorage\" | \"memory\";\n}\n\nexport function createStorage(\n partnerId: string,\n opts: CreateStorageOptions = {}\n): Storage {\n const prefix = `swift:${partnerId}:catering:`;\n const driver = opts.driver ?? detectDriver();\n\n if (driver === \"memory\") {\n const mem = new Map<string, string>();\n return {\n getItem: (k) => mem.get(prefix + k) ?? null,\n setItem: (k, v) => void mem.set(prefix + k, v),\n removeItem: (k) => void mem.delete(prefix + k),\n clear: () => {\n for (const k of Array.from(mem.keys())) {\n if (k.startsWith(prefix)) mem.delete(k);\n }\n },\n };\n }\n\n return {\n getItem: (k) => localStorage.getItem(prefix + k),\n setItem: (k, v) => localStorage.setItem(prefix + k, v),\n removeItem: (k) => localStorage.removeItem(prefix + k),\n clear: () => {\n const toRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k && k.startsWith(prefix)) toRemove.push(k);\n }\n for (const k of toRemove) localStorage.removeItem(k);\n },\n };\n}\n\nfunction detectDriver(): \"localStorage\" | \"memory\" {\n try {\n if (typeof localStorage === \"undefined\") return \"memory\";\n const probe = \"__swift_probe__\";\n localStorage.setItem(probe, \"1\");\n localStorage.removeItem(probe);\n return \"localStorage\";\n } catch {\n return \"memory\";\n }\n}\n","export type WidgetView =\n | { kind: \"restaurant-list\" }\n | { kind: \"restaurant-menu\"; restaurantId: string }\n | { kind: \"checkout\" };\n\nexport type NavAction =\n | { kind: \"OPEN_RESTAURANT\"; restaurantId: string }\n | { kind: \"BACK_TO_LIST\" }\n | { kind: \"GO_TO_CHECKOUT\" };\n\nexport const initialView: WidgetView = { kind: \"restaurant-list\" };\n\nexport function navReducer(state: WidgetView, action: NavAction): WidgetView {\n switch (action.kind) {\n case \"OPEN_RESTAURANT\":\n return { kind: \"restaurant-menu\", restaurantId: action.restaurantId };\n case \"BACK_TO_LIST\":\n return { kind: \"restaurant-list\" };\n case \"GO_TO_CHECKOUT\":\n return { kind: \"checkout\" };\n default:\n return state;\n }\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useReducer,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { EventDetails, SelectedMenuItem, MealSessionState } from \"../types/session\";\nimport type { ContactInfo } from \"../types/checkout\";\nimport type { CorporateUser, Restaurant } from \"../types/restaurant\";\nimport { useCateringConfig, useStorage } from \"../config/CateringConfigContext\";\nimport type { InitialData } from \"../types/public\";\nimport {\n navReducer,\n initialView,\n type WidgetView,\n type NavAction,\n} from \"./navigation\";\n\nconst createDefaultSession = (): MealSessionState => ({\n sessionName: \"Main Event\",\n sessionDate: \"\",\n eventTime: \"\",\n orderItems: [],\n});\n\ninterface CateringStateContextValue {\n currentStep: number;\n eventDetails: EventDetails | null;\n contactInfo: ContactInfo | null;\n promoCodes: string[] | null;\n selectedRestaurants: Restaurant[];\n corporateUser: CorporateUser | null;\n restaurantPromotions: Record<string, any[]>;\n restaurantDiscounts: Record<string, { discount: number; promotion: any }>;\n\n mealSessions: MealSessionState[];\n activeSessionIndex: number;\n\n view: WidgetView;\n dispatchView: (action: NavAction) => void;\n\n addMealSession: (session: MealSessionState) => void;\n updateMealSession: (index: number, updates: Partial<MealSessionState>) => void;\n removeMealSession: (index: number) => void;\n setActiveSessionIndex: (index: number) => void;\n\n addMenuItem: (sessionIndex: number, item: SelectedMenuItem) => void;\n removeMenuItem: (sessionIndex: number, itemId: string) => void;\n removeMenuItemByIndex: (sessionIndex: number, itemIndex: number) => void;\n updateItemQuantity: (sessionIndex: number, itemId: string, quantity: number) => void;\n updateMenuItemByIndex: (sessionIndex: number, itemIndex: number, item: SelectedMenuItem) => void;\n\n getSessionTotal: (sessionIndex: number) => number;\n getSessionDiscount: (sessionIndex: number) => { promotions: any[] };\n getTotalPrice: () => number;\n\n getAllItems: () => SelectedMenuItem[];\n\n setCurrentStep: (step: number) => void;\n setEventDetails: (details: EventDetails) => void;\n setContactInfo: (info: ContactInfo) => void;\n setPromoCodes: (codes: string[]) => void;\n setSelectedRestaurants: (restaurants: Restaurant[]) => void;\n setCorporateUser: (user: CorporateUser | null) => void;\n setRestaurantPromotions: (promotions: Record<string, any[]>) => void;\n resetOrder: () => void;\n markOrderAsSubmitted: () => void;\n}\n\nconst CateringStateContext = createContext<CateringStateContextValue | undefined>(\n undefined\n);\n\nconst STORAGE_KEYS = {\n CURRENT_STEP: \"catering_current_step\",\n EVENT_DETAILS: \"catering_event_details\",\n MEAL_SESSIONS: \"catering_meal_sessions\",\n ACTIVE_SESSION_INDEX: \"catering_active_session_index\",\n CONTACT_INFO: \"catering_contact_info\",\n PROMO_CODES: \"catering_promo_codes\",\n SELECTED_RESTAURANTS: \"catering_selected_restaurants\",\n CORPORATE_USER: \"catering_corporate_user\",\n ORDER_SUBMITTED: \"catering_order_submitted\",\n RESTAURANT_PROMOTIONS: \"catering_restaurant_promotions\",\n SELECTED_ITEMS: \"catering_selected_items\",\n VIEW: \"catering_view\",\n};\n\nfunction applyInitialDataToEventDetails(\n data: InitialData | undefined\n): EventDetails | null {\n if (!data) return null;\n const address = data.deliveryAddress\n ? `${data.deliveryAddress.line1}${\n data.deliveryAddress.line2 ? \", \" + data.deliveryAddress.line2 : \"\"\n }, ${data.deliveryAddress.city}, ${data.deliveryAddress.postcode}`\n : \"\";\n return {\n eventType: \"\",\n eventDate: data.eventDate ?? \"\",\n eventTime: data.eventTime ?? \"\",\n guestCount: data.guestCount ?? 0,\n specialRequests: \"\",\n address,\n userType: \"guest\",\n };\n}\n\nfunction applyInitialDataToContact(\n data: InitialData | undefined\n): ContactInfo | null {\n if (!data) return null;\n const addr = data.deliveryAddress;\n const contact = data.contact;\n if (!addr && !contact) return null;\n return {\n organization: contact?.organization ?? \"\",\n fullName: contact?.name ?? \"\",\n email: contact?.email ?? \"\",\n phone: contact?.phone ?? \"\",\n addressLine1: addr?.line1 ?? \"\",\n addressLine2: addr?.line2,\n city: addr?.city ?? \"\",\n zipcode: addr?.postcode ?? \"\",\n latitude: addr?.lat,\n longitude: addr?.lng,\n };\n}\n\nexport function CateringStateProvider({ children }: { children: ReactNode }) {\n const storage = useStorage();\n const { initialData } = useCateringConfig();\n // Freeze initialData at first mount so later re-renders don't re-apply it.\n const [initialDataSnapshot] = useState<InitialData | undefined>(initialData);\n\n const [isHydrated, setIsHydrated] = useState(false);\n const [currentStep, setCurrentStepState] = useState(1);\n const [eventDetails, setEventDetailsState] = useState<EventDetails | null>(null);\n const [contactInfo, setContactInfoState] = useState<ContactInfo | null>(null);\n const [promoCodes, setPromoCodesState] = useState<string[]>([]);\n const [selectedRestaurants, setSelectedRestaurantsState] = useState<Restaurant[]>([]);\n const [corporateUser, setCorporateUserState] = useState<CorporateUser | null>(null);\n const [restaurantPromotions, setRestaurantPromotionsState] = useState<Record<string, any[]>>({});\n\n const [mealSessions, setMealSessionsState] = useState<MealSessionState[]>([]);\n const [activeSessionIndex, setActiveSessionIndexState] = useState(0);\n\n const [restaurantDiscounts] = useState<Record<string, { discount: number; promotion: any }>>({});\n\n const [view, dispatchView] = useReducer(\n navReducer,\n initialView,\n (fallback) => {\n try {\n const stored = storage.getItem(STORAGE_KEYS.VIEW);\n if (stored) return JSON.parse(stored) as WidgetView;\n } catch {\n // ignore\n }\n return fallback;\n }\n );\n\n useEffect(() => {\n try {\n storage.setItem(STORAGE_KEYS.VIEW, JSON.stringify(view));\n } catch {\n // ignore\n }\n }, [view, storage]);\n\n const getSessionTotal = useCallback((sessionIndex: number): number => {\n const session = mealSessions[sessionIndex];\n if (!session) return 0;\n\n return session.orderItems.reduce((total, { item, quantity }) => {\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const unitPrice = item.isDiscount && discountPrice > 0 ? discountPrice : price;\n const itemPrice = unitPrice * quantity;\n\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum, { price, quantity }) => sum + (price || 0) * (quantity || 0),\n 0\n );\n\n return total + itemPrice + addonTotal;\n }, 0);\n }, [mealSessions]);\n\n const getTotalPrice = useCallback((): number => {\n return mealSessions.reduce((sum, _, index) => sum + getSessionTotal(index), 0);\n }, [mealSessions, getSessionTotal]);\n\n const getSessionDiscount = useCallback((sessionIndex: number): { promotions: any[] } => {\n const session = mealSessions[sessionIndex];\n if (!session || session.orderItems.length === 0) return { promotions: [] };\n\n const byRestaurant: Record<string, { totalQty: number; subtotal: number }> = {};\n session.orderItems.forEach(({ item, quantity }) => {\n const rid = item.restaurantId;\n if (!byRestaurant[rid]) byRestaurant[rid] = { totalQty: 0, subtotal: 0 };\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const unitPrice = item.isDiscount && discountPrice > 0 ? discountPrice : price;\n byRestaurant[rid].totalQty += quantity;\n byRestaurant[rid].subtotal += unitPrice * quantity;\n });\n\n const qualifying: any[] = [];\n\n for (const [rid, cart] of Object.entries(byRestaurant)) {\n const promos = restaurantPromotions[rid];\n if (!promos || promos.length === 0) continue;\n\n for (const promo of promos) {\n if (promo.minOrderAmount && cart.subtotal < Number(promo.minOrderAmount)) continue;\n\n if (promo.promotionType === \"BUY_MORE_SAVE_MORE\" && promo.discountTiers?.length) {\n const qualifyingTier = promo.discountTiers.find((t: any) => cart.totalQty >= t.minQuantity);\n if (!qualifyingTier) continue;\n }\n\n qualifying.push(promo);\n }\n }\n\n return { promotions: qualifying };\n }, [mealSessions, restaurantPromotions]);\n\n const getAllItems = useCallback((): SelectedMenuItem[] => {\n return mealSessions.flatMap((session) => session.orderItems);\n }, [mealSessions]);\n\n useEffect(() => {\n try {\n const orderSubmitted = storage.getItem(STORAGE_KEYS.ORDER_SUBMITTED);\n\n if (orderSubmitted === \"true\") {\n storage.clear();\n setIsHydrated(true);\n return;\n }\n\n const savedStep = storage.getItem(STORAGE_KEYS.CURRENT_STEP);\n const savedEventDetails = storage.getItem(STORAGE_KEYS.EVENT_DETAILS);\n const savedMealSessions = storage.getItem(STORAGE_KEYS.MEAL_SESSIONS);\n const savedActiveSessionIndex = storage.getItem(STORAGE_KEYS.ACTIVE_SESSION_INDEX);\n const savedContactInfo = storage.getItem(STORAGE_KEYS.CONTACT_INFO);\n const savedPromoCodes = storage.getItem(STORAGE_KEYS.PROMO_CODES);\n const savedRestaurants = storage.getItem(STORAGE_KEYS.SELECTED_RESTAURANTS);\n const savedCorporateUser = storage.getItem(STORAGE_KEYS.CORPORATE_USER);\n const savedPromotions = storage.getItem(STORAGE_KEYS.RESTAURANT_PROMOTIONS);\n\n const legacySelectedItems = storage.getItem(STORAGE_KEYS.SELECTED_ITEMS);\n\n const hasPersistedState = Boolean(\n savedStep ||\n savedEventDetails ||\n savedContactInfo ||\n savedMealSessions ||\n legacySelectedItems\n );\n\n if (savedStep) setCurrentStepState(JSON.parse(savedStep));\n if (savedEventDetails) {\n setEventDetailsState(JSON.parse(savedEventDetails));\n } else if (!hasPersistedState) {\n const seeded = applyInitialDataToEventDetails(initialDataSnapshot);\n if (seeded) setEventDetailsState(seeded);\n }\n if (savedContactInfo) {\n setContactInfoState(JSON.parse(savedContactInfo));\n } else if (!hasPersistedState) {\n const seeded = applyInitialDataToContact(initialDataSnapshot);\n if (seeded) setContactInfoState(seeded);\n }\n if (savedPromoCodes) setPromoCodesState(JSON.parse(savedPromoCodes));\n if (savedRestaurants) setSelectedRestaurantsState(JSON.parse(savedRestaurants));\n if (savedCorporateUser) setCorporateUserState(JSON.parse(savedCorporateUser));\n if (savedPromotions) setRestaurantPromotionsState(JSON.parse(savedPromotions));\n\n if (savedMealSessions) {\n const sessions = JSON.parse(savedMealSessions) as MealSessionState[];\n const validSessions = sessions.filter(\n (s) => s.orderItems.length > 0 || s.sessionDate\n );\n if (validSessions.length === 0) {\n setMealSessionsState([createDefaultSession()]);\n } else {\n setMealSessionsState(validSessions);\n if (savedActiveSessionIndex) {\n const activeIndex = JSON.parse(savedActiveSessionIndex);\n setActiveSessionIndexState(Math.min(activeIndex, Math.max(0, validSessions.length - 1)));\n }\n }\n } else if (legacySelectedItems) {\n const items = JSON.parse(legacySelectedItems) as SelectedMenuItem[];\n const migratedSession: MealSessionState = {\n ...createDefaultSession(),\n orderItems: items,\n };\n setMealSessionsState([migratedSession]);\n storage.removeItem(STORAGE_KEYS.SELECTED_ITEMS);\n } else {\n setMealSessionsState([createDefaultSession()]);\n }\n } catch (error) {\n console.error(\"Error loading catering data from storage:\", error);\n } finally {\n setIsHydrated(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const saveMealSessions = (sessions: MealSessionState[]) => {\n storage.setItem(STORAGE_KEYS.MEAL_SESSIONS, JSON.stringify(sessions));\n };\n\n const addMealSession = (session: MealSessionState) => {\n setMealSessionsState((prev) => {\n const updated = [...prev, session];\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const updateMealSession = (index: number, updates: Partial<MealSessionState>) => {\n setMealSessionsState((prev) => {\n if (index < 0 || index >= prev.length) return prev;\n const updated = [...prev];\n updated[index] = { ...updated[index]!, ...updates };\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const removeMealSession = (index: number) => {\n setMealSessionsState((prev) => {\n if (prev.length <= 1) {\n const reset = [createDefaultSession()];\n saveMealSessions(reset);\n return reset;\n }\n const updated = prev.filter((_, i) => i !== index);\n saveMealSessions(updated);\n\n if (activeSessionIndex >= updated.length) {\n setActiveSessionIndexState(updated.length - 1);\n storage.setItem(STORAGE_KEYS.ACTIVE_SESSION_INDEX, JSON.stringify(updated.length - 1));\n }\n\n return updated;\n });\n };\n\n const setActiveSessionIndex = (index: number) => {\n setActiveSessionIndexState(index);\n storage.setItem(STORAGE_KEYS.ACTIVE_SESSION_INDEX, JSON.stringify(index));\n };\n\n const addMenuItem = (sessionIndex: number, newItem: SelectedMenuItem) => {\n const validQuantity = Math.max(newItem.quantity, 1);\n\n setMealSessionsState((prev) => {\n if (sessionIndex < 0 || sessionIndex >= prev.length) return prev;\n\n const session = prev[sessionIndex]!;\n const existingIndex = session.orderItems.findIndex((i) => {\n if (i.item.id !== newItem.item.id) return false;\n if (i.bundleId !== newItem.bundleId) return false;\n\n const existingAddons = i.item.selectedAddons || [];\n const newAddons = newItem.item.selectedAddons || [];\n\n if (existingAddons.length !== newAddons.length) return false;\n\n return existingAddons.every((existingAddon) =>\n newAddons.some(\n (newAddon) =>\n newAddon.name === existingAddon.name &&\n newAddon.groupTitle === existingAddon.groupTitle &&\n newAddon.quantity === existingAddon.quantity\n )\n );\n });\n\n let updatedItems: SelectedMenuItem[];\n if (existingIndex >= 0) {\n updatedItems = [...session.orderItems];\n const existing = updatedItems[existingIndex]!;\n updatedItems[existingIndex] = {\n ...existing,\n quantity: existing.quantity + validQuantity,\n };\n } else {\n updatedItems = [...session.orderItems, { ...newItem, quantity: validQuantity }];\n }\n\n const updated = [...prev];\n updated[sessionIndex] = { ...session, orderItems: updatedItems };\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const removeMenuItemByIndex = (sessionIndex: number, itemIndex: number) => {\n setMealSessionsState((prev) => {\n if (sessionIndex < 0 || sessionIndex >= prev.length) return prev;\n\n const session = prev[sessionIndex]!;\n const updatedItems = [...session.orderItems];\n updatedItems.splice(itemIndex, 1);\n\n const updated = [...prev];\n updated[sessionIndex] = { ...session, orderItems: updatedItems };\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const removeMenuItem = (sessionIndex: number, itemId: string) => {\n setMealSessionsState((prev) => {\n if (sessionIndex < 0 || sessionIndex >= prev.length) return prev;\n\n const session = prev[sessionIndex]!;\n const updatedItems = session.orderItems.filter((i) => i.item.id !== itemId);\n\n const updated = [...prev];\n updated[sessionIndex] = { ...session, orderItems: updatedItems };\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const updateItemQuantity = (sessionIndex: number, itemId: string, quantity: number) => {\n const session = mealSessions[sessionIndex];\n const orderItem = session?.orderItems.find((i) => i.item.id === itemId);\n const minQty = (orderItem?.item as any)?.minOrderQuantity || 1;\n\n if (quantity < minQty) {\n removeMenuItem(sessionIndex, itemId);\n return;\n }\n\n setMealSessionsState((prev) => {\n if (sessionIndex < 0 || sessionIndex >= prev.length) return prev;\n\n const current = prev[sessionIndex]!;\n const updatedItems = current.orderItems.map((i) =>\n i.item.id === itemId ? { ...i, quantity } : i\n );\n\n const updated = [...prev];\n updated[sessionIndex] = { ...current, orderItems: updatedItems };\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const updateMenuItemByIndex = (sessionIndex: number, itemIndex: number, item: SelectedMenuItem) => {\n setMealSessionsState((prev) => {\n if (sessionIndex < 0 || sessionIndex >= prev.length) return prev;\n\n const session = prev[sessionIndex]!;\n const updatedItems = [...session.orderItems];\n updatedItems[itemIndex] = item;\n\n const updated = [...prev];\n updated[sessionIndex] = { ...session, orderItems: updatedItems };\n saveMealSessions(updated);\n return updated;\n });\n };\n\n const setCurrentStep = (step: number) => {\n setCurrentStepState(step);\n storage.setItem(STORAGE_KEYS.CURRENT_STEP, JSON.stringify(step));\n };\n\n const setSelectedRestaurants = (restaurants: Restaurant[]) => {\n setSelectedRestaurantsState(restaurants);\n storage.setItem(STORAGE_KEYS.SELECTED_RESTAURANTS, JSON.stringify(restaurants));\n };\n\n const setEventDetails = (details: EventDetails) => {\n setEventDetailsState(details);\n storage.setItem(STORAGE_KEYS.EVENT_DETAILS, JSON.stringify(details));\n };\n\n const setContactInfo = (info: ContactInfo) => {\n setContactInfoState(info);\n storage.setItem(STORAGE_KEYS.CONTACT_INFO, JSON.stringify(info));\n };\n\n const setPromoCodes = (codes: string[]) => {\n setPromoCodesState(codes);\n storage.setItem(STORAGE_KEYS.PROMO_CODES, JSON.stringify(codes));\n };\n\n const setCorporateUser = (user: CorporateUser | null) => {\n setCorporateUserState(user);\n if (user) {\n storage.setItem(STORAGE_KEYS.CORPORATE_USER, JSON.stringify(user));\n } else {\n storage.removeItem(STORAGE_KEYS.CORPORATE_USER);\n }\n };\n\n const setRestaurantPromotions = (promotions: Record<string, any[]>) => {\n setRestaurantPromotionsState(promotions);\n storage.setItem(STORAGE_KEYS.RESTAURANT_PROMOTIONS, JSON.stringify(promotions));\n };\n\n const resetOrder = () => {\n setCurrentStepState(1);\n setEventDetailsState(null);\n setMealSessionsState([]);\n setActiveSessionIndexState(0);\n setContactInfoState(null);\n setPromoCodesState([]);\n setSelectedRestaurantsState([]);\n setCorporateUserState(null);\n setRestaurantPromotionsState({});\n\n storage.clear();\n };\n\n const markOrderAsSubmitted = () => {\n storage.setItem(STORAGE_KEYS.ORDER_SUBMITTED, \"true\");\n };\n\n if (!isHydrated) {\n return null;\n }\n\n return (\n <CateringStateContext.Provider\n value={{\n currentStep,\n eventDetails,\n contactInfo,\n promoCodes,\n selectedRestaurants,\n corporateUser,\n restaurantPromotions,\n restaurantDiscounts,\n\n mealSessions,\n activeSessionIndex,\n\n view,\n dispatchView,\n\n addMealSession,\n updateMealSession,\n removeMealSession,\n setActiveSessionIndex,\n\n addMenuItem,\n removeMenuItem,\n removeMenuItemByIndex,\n updateItemQuantity,\n updateMenuItemByIndex,\n\n getSessionTotal,\n getSessionDiscount,\n getTotalPrice,\n\n getAllItems,\n\n setCurrentStep,\n setEventDetails,\n setContactInfo,\n setPromoCodes,\n setSelectedRestaurants,\n setCorporateUser,\n setRestaurantPromotions,\n resetOrder,\n markOrderAsSubmitted,\n }}\n >\n {children}\n </CateringStateContext.Provider>\n );\n}\n\nexport function useCateringState(): CateringStateContextValue {\n const context = useContext(CateringStateContext);\n if (!context) {\n throw new Error(\"useCateringState must be used within CateringStateProvider\");\n }\n return context;\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\nimport { Allergens, DietaryFilter } from \"../types/menu\";\nimport { useStorage } from \"../config/CateringConfigContext\";\n\nexport type PricePerPersonRange = \"under5\" | \"5to10\" | \"10to15\" | \"over15\";\n\nexport interface FilterState {\n dietaryRestrictions: DietaryFilter[];\n allergens: Allergens[];\n pricePerPersonRange: PricePerPersonRange | null;\n}\n\ninterface FilterContextType {\n filters: FilterState;\n setFilters: (filters: FilterState) => void;\n clearFilters: () => void;\n}\n\nconst FilterContext = createContext<FilterContextType | undefined>(undefined);\n\nconst STORAGE_KEY = \"catering_filters\";\n\nconst defaultFilters: FilterState = {\n dietaryRestrictions: [],\n allergens: [],\n pricePerPersonRange: null,\n};\n\nexport function CateringFilterProvider({ children }: { children: ReactNode }) {\n const storage = useStorage();\n const [filters, setFiltersState] = useState<FilterState>(defaultFilters);\n const [isInitialized, setIsInitialized] = useState(false);\n\n useEffect(() => {\n try {\n const stored = storage.getItem(STORAGE_KEY);\n if (stored) {\n setFiltersState(JSON.parse(stored));\n }\n } catch (error) {\n console.error(\"Failed to load filters from storage:\", error);\n }\n setIsInitialized(true);\n }, [storage]);\n\n useEffect(() => {\n if (isInitialized) {\n try {\n storage.setItem(STORAGE_KEY, JSON.stringify(filters));\n } catch (error) {\n console.error(\"Failed to save filters to storage:\", error);\n }\n }\n }, [filters, isInitialized, storage]);\n\n const setFilters = (newFilters: FilterState) => setFiltersState(newFilters);\n const clearFilters = () => setFiltersState(defaultFilters);\n\n return (\n <FilterContext.Provider value={{ filters, setFilters, clearFilters }}>\n {children}\n </FilterContext.Provider>\n );\n}\n\nexport function useCateringFilters() {\n const context = useContext(FilterContext);\n if (context === undefined) {\n throw new Error(\n \"useCateringFilters must be used within a CateringFilterProvider\"\n );\n }\n return context;\n}\n","/**\n * Shims for next/navigation hooks.\n *\n * The widget is framework-agnostic (Vite / Next / etc.), so it cannot\n * depend on Next's router. These stubs provide the API shape the ported\n * components expect: a no-op router and an empty read-only URL params\n * object. Real navigation happens via the widget's internal `dispatchView`\n * reducer and host-supplied callbacks like `onOrderComplete`.\n */\n\ntype PushOptions = { scroll?: boolean };\n\ninterface WidgetRouter {\n push: (url: string, options?: PushOptions) => void;\n replace: (url: string, options?: PushOptions) => void;\n back: () => void;\n forward: () => void;\n refresh: () => void;\n prefetch: (url: string) => void;\n}\n\nconst noopRouter: WidgetRouter = {\n push: () => {},\n replace: () => {},\n back: () => {},\n forward: () => {},\n refresh: () => {},\n prefetch: () => {},\n};\n\nexport function useRouter(): WidgetRouter {\n return noopRouter;\n}\n\nexport function useSearchParams(): URLSearchParams {\n return new URLSearchParams();\n}\n\nexport function usePathname(): string {\n return \"\";\n}\n","/**\n * Module-level cateringService shim.\n *\n * The real API client is created per-widget-mount with the partner's\n * publishable key. Ported components still reference `cateringService`\n * directly (not via a hook), so the widget mount plugs its endpoints\n * into this singleton via `setCateringServiceEndpoints()` before\n * rendering children.\n */\nimport type { CateringOrderResponse } from \"../types/api/response\";\nimport type { CreateCateringOrderRequest } from \"../types/api/request\";\nimport type { ContactInfo } from \"../types/checkout\";\nimport type { EventDetails, MealSessionState } from \"../types/session\";\nimport type { SearchFilters, SearchResponse } from \"../types/menu\";\nimport type { ApiEndpoints } from \"../api/endpoints\";\n\nlet endpoints: ApiEndpoints | null = null;\n\nexport function setCateringServiceEndpoints(api: ApiEndpoints): void {\n endpoints = api;\n}\n\nfunction ep(): ApiEndpoints {\n if (!endpoints) {\n throw new Error(\n \"cateringService called before <CateringWidget> mounted. Did you forget to wrap in CateringConfigProvider?\"\n );\n }\n return endpoints;\n}\n\nexport const cateringService = {\n searchMenuItems: (query: string, filters?: SearchFilters): Promise<SearchResponse> =>\n ep().menu.searchMenuItems(query, filters),\n\n getMenuItems: () => ep().menu.getMenuItems(),\n\n getMenuItemsByRestaurant: (restaurantId: string) =>\n ep().menu.getMenuItemsByRestaurant(restaurantId),\n\n getBundleById: (bundleId: string) => ep().bundles.getBundleById(bundleId),\n\n getCateringBundles: () => ep().bundles.getCateringBundles(),\n\n getBundlesByRestaurant: (restaurantId: string) =>\n ep().bundles.getBundlesByRestaurant(restaurantId),\n\n calculateCateringPricingWithMealSessions: (\n mealSessions: MealSessionState[],\n promoCodes?: string[],\n deliveryLocation?: { latitude: number; longitude: number }\n ) =>\n ep().pricing.calculateCateringPricingWithMealSessions(\n mealSessions,\n promoCodes,\n deliveryLocation\n ),\n\n validatePromoCodeWithMealSessions: (\n promoCode: string,\n mealSessions: MealSessionState[]\n ) => ep().pricing.validatePromoCodeWithMealSessions(promoCode, mealSessions),\n\n submitCateringOrder: async (\n eventDetails: EventDetails,\n mealSessions: MealSessionState[],\n contactInfo: ContactInfo,\n promoCodes: string[],\n ccEmails?: string[],\n _paymentInfo?: unknown,\n eventId?: string,\n specialInstructions?: string\n ): Promise<CateringOrderResponse> => {\n const api = ep();\n\n const userId = await api.catering.findOrCreateConsumerAccount(contactInfo);\n\n const groupItemsByRestaurant = (\n orderItems: MealSessionState[\"orderItems\"]\n ) => {\n const grouped: Record<string, any> = {};\n for (const { item, quantity } of orderItems) {\n const restaurantId =\n (item as any).restaurant?.restaurantId ||\n (item as any).restaurantId ||\n \"unknown\";\n if (!grouped[restaurantId]) {\n grouped[restaurantId] = { restaurantId, menuItems: [] };\n }\n grouped[restaurantId].menuItems.push({\n menuItemId: item.id,\n quantity,\n selectedAddons: (item as any).selectedAddons,\n groupTitle: (item as any).groupTitle,\n });\n }\n return Object.values(grouped).map((g: any) => ({\n restaurantId: g.restaurantId,\n menuItems: g.menuItems,\n specialInstructions: \"\",\n }));\n };\n\n const mealSessionRequests = mealSessions\n .filter((s) => s.orderItems.length > 0)\n .map((session, index) => {\n const sessionLabel = session.sessionName || `Session ${index + 1}`;\n if (!session.sessionDate) {\n throw new Error(\n `Session \"${sessionLabel}\" is missing a date. Please go back and set a delivery date for your session.`\n );\n }\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(session.sessionDate)) {\n throw new Error(\n `Session \"${sessionLabel}\" has an invalid date format.`\n );\n }\n if (!session.eventTime) {\n throw new Error(\n `Session \"${sessionLabel}\" is missing a time.`\n );\n }\n if (!/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/.test(session.eventTime)) {\n throw new Error(\n `Session \"${sessionLabel}\" has an invalid time format.`\n );\n }\n return {\n sessionName: session.sessionName || `Session ${index + 1}`,\n sessionOrder: index + 1,\n sessionDate: session.sessionDate,\n eventTime: session.eventTime,\n guestCount: session.guestCount,\n specialRequirements: session.specialRequirements,\n orderItems: groupItemsByRestaurant(session.orderItems),\n promoCodes: [],\n };\n });\n\n const estimatedTotal = mealSessions.reduce((total, session) => {\n return (\n total +\n session.orderItems.reduce((sessionTotal, { item, quantity }) => {\n const price = parseFloat((item.price as any)?.toString() || \"0\");\n const discountPrice = parseFloat(\n (item.discountPrice as any)?.toString() || \"0\"\n );\n const unitPrice =\n item.isDiscount && discountPrice > 0 ? discountPrice : price;\n const addonTotal = ((item as any).selectedAddons || []).reduce(\n (sum: number, a: { price?: number; quantity?: number }) =>\n sum + (a.price || 0) * (a.quantity || 0),\n 0\n );\n return sessionTotal + unitPrice * quantity + addonTotal;\n }, 0)\n );\n }, 0);\n\n const firstSession = mealSessionRequests[0];\n const createDto: CreateCateringOrderRequest = {\n userId,\n organization: contactInfo.organization,\n customerName: contactInfo.fullName,\n customerEmail: contactInfo.email,\n customerPhone: contactInfo.phone,\n ccEmails: ccEmails || [],\n billingAddress: contactInfo.billingAddress,\n eventDate: firstSession?.sessionDate || eventDetails?.eventDate || \"\",\n eventTime: firstSession?.eventTime || eventDetails?.eventTime || \"\",\n eventId: eventId || undefined,\n guestCount: eventDetails?.guestCount || 0,\n eventType: eventDetails?.eventType || \"\",\n deliveryAddress: `${contactInfo.addressLine1}${\n contactInfo.addressLine2 ? \", \" + contactInfo.addressLine2 : \"\"\n }, ${contactInfo.city}, ${contactInfo.zipcode}`,\n deliveryLocation: {\n latitude: contactInfo.latitude!,\n longitude: contactInfo.longitude!,\n },\n specialRequirements:\n specialInstructions || eventDetails?.specialRequests || \"\",\n mealSessions: mealSessionRequests,\n estimatedTotal,\n promoCodes,\n paymentMethod: \"stripe_direct\",\n };\n\n return api.catering.submitOrder(createDto) as unknown as Promise<CateringOrderResponse>;\n },\n};\n","// Allergen constants based on the Swift restaurant app\nexport const ALLERGENS = [\n { label: \"Celery\", value: \"celery\" },\n { label: \"Cereals Containing Gluten\", value: \"cereals_containing_gluten\" },\n { label: \"Crustaceans\", value: \"crustaceans\" },\n { label: \"Eggs\", value: \"eggs\" },\n { label: \"Fish\", value: \"fish\" },\n { label: \"Lupin\", value: \"lupin\" },\n { label: \"Milk\", value: \"milk\" },\n { label: \"Molluscs\", value: \"molluscs\" },\n { label: \"Mustard\", value: \"mustard\" },\n { label: \"Peanuts\", value: \"peanuts\" },\n { label: \"Sesame Seeds\", value: \"sesame_seeds\" },\n { label: \"Soybeans\", value: \"soybeans\" },\n { label: \"Sulphur Dioxide\", value: \"sulphur_dioxide\" },\n { label: \"Tree Nuts\", value: \"tree_nuts\" },\n { label: \"Nuts\", value: \"nuts\" },\n // { label: \"Wheat\", value: \"wheat\" },\n // { label: \"Barley\", value: \"barley\" },\n // { label: \"Rye\", value: \"rye\" },\n // { label: \"Oats\", value: \"oats\" },\n // { label: \"Corn\", value: \"corn\" },\n // { label: \"Gelatin\", value: \"gelatin\" },\n // { label: \"Garlic\", value: \"garlic\" },\n // { label: \"Onion\", value: \"onion\" },\n // { label: \"Alcohol\", value: \"alcohol\" },\n // { label: \"Pork\", value: \"pork\" },\n // { label: \"Beef\", value: \"beef\" },\n // { label: \"Chicken\", value: \"chicken\" },\n // { label: \"Lamb\", value: \"lamb\" },\n // { label: \"Legumes\", value: \"legumes\" },\n // { label: \"Caffeine\", value: \"caffeine\" },\n // { label: \"Cocoa\", value: \"cocoa\" },\n // { label: \"Colorants\", value: \"colorants\" },\n // { label: \"Preservatives\", value: \"preservatives\" },\n].sort((a, b) => a.label.localeCompare(b.label));\n\nexport const PREP_TIMES = Array.from({ length: 12 }, (_, i) => ({\n label: `${(i + 1) * 5} minutes`,\n value: (i + 1) * 5,\n}));\n\n// Dietary filter constants matching the DietaryFilter enum\nexport const DIETARY_FILTERS = [\n { label: \"Vegetarian\", value: \"vegetarian\" },\n // { label: \"Non-Vegetarian\", value: \"nonvegetarian\" },\n { label: \"Vegan\", value: \"vegan\" },\n // { label: \"Gluten-Free\", value: \"no_gluten\" },\n // { label: \"Nut-Free\", value: \"no_nut\" },\n // { label: \"Dairy-Free\", value: \"no_dairy\" },\n { label: \"Halal\", value: \"halal\" },\n { label: \"Pescatarian\", value: \"pescatarian\" },\n].sort((a, b) => a.label.localeCompare(b.label));\n","import { useState, useEffect } from \"react\";\nimport { X } from \"lucide-react\";\n\nimport { MenuItem, Addon, AddonGroup } from \"../types/menu\";\nimport { ALLERGENS } from \"../constants/allergens\";\n\n// Dietary icon mapping\nconst DIETARY_ICON_MAP: Record<string, { file: string; label: string }> = {\n vegetarian: { file: \"vegetarian.png\", label: \"Vegetarian\" },\n vegan: { file: \"vegan.png\", label: \"Vegan\" },\n halal: { file: \"halal.png\", label: \"Halal\" },\n pescatarian: { file: \"pescatarian.png\", label: \"Pescatarian\" },\n no_nut: { file: \"no_nut.png\", label: \"Nut-Free\" },\n no_dairy: { file: \"no_dairy.png\", label: \"Dairy-Free\" },\n};\n\n// Utility function to format allergen enum values into human-readable labels\nconst formatAllergen = (allergen: string): string => {\n const allergenObj = ALLERGENS.find((a) => a.value === allergen);\n return allergenObj?.label || allergen\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n\ninterface MenuItemModalProps {\n item: MenuItem;\n isOpen: boolean;\n onClose: () => void;\n quantity?: number;\n onAddItem?: (item: MenuItem) => void;\n onUpdateQuantity?: (itemId: string, quantity: number) => void;\n isEditMode?: boolean;\n forceAddMode?: boolean; // When true, always shows the Add button regardless of quantity/edit state\n addButtonLabel?: string; // Override label for the add/confirm button\n onRemoveItem?: (index: number) => void;\n editingIndex?: number | null;\n viewOnly?: boolean; // When true, shows menu item details without add/edit functionality\n onAddToOrder?: (item: MenuItem) => void; // Callback for viewOnly mode to redirect to order builder\n}\n\n\nexport default function MenuItemModal({\n item,\n isOpen,\n onClose,\n quantity = 0,\n onAddItem,\n onUpdateQuantity,\n isEditMode = false,\n forceAddMode = false,\n addButtonLabel,\n onRemoveItem,\n editingIndex = null,\n viewOnly = false,\n onAddToOrder,\n}: MenuItemModalProps) {\n const [itemQuantity, setItemQuantity] = useState(1);\n const [itemQuantityInput, setItemQuantityInput] = useState(\"1\");\n const [selectedAddons, setSelectedAddons] = useState<Record<string, Record<string, boolean>>>({});\n const [addonQuantities, setAddonQuantities] = useState<Record<string, Record<string, number>>>({});\n const [addonQuantityInputs, setAddonQuantityInputs] = useState<Record<string, Record<string, string>>>({});\n const [addonGroups, setAddonGroups] = useState<Record<string, AddonGroup>>({});\n const [totalPrice, setTotalPrice] = useState(0);\n const [isAllergenExpanded, setIsAllergenExpanded] = useState(false);\n const [hasModifiedQuantity, setHasModifiedQuantity] = useState(false);\n const [initialModalQuantity, setInitialModalQuantity] = useState(0);\n\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const displayPrice = item.isDiscount && discountPrice > 0 ? discountPrice : price;\n const BACKEND_QUANTITY_UNIT = item.cateringQuantityUnit || 1;\n const DISPLAY_FEEDS_PER_UNIT = item.feedsPerUnit || 1;\n\n // Single useEffect: initialize everything when modal opens\n useEffect(() => {\n if (!isOpen) return;\n\n // 1. Calculate portions\n const portions = quantity > 0 ? quantity / BACKEND_QUANTITY_UNIT : 1;\n setItemQuantity(portions);\n setItemQuantityInput(portions.toString());\n setInitialModalQuantity(portions);\n setHasModifiedQuantity(false);\n setIsAllergenExpanded(false);\n\n // 2. Build addon groups from item data\n if (!item?.addons || item.addons.length === 0) {\n setAddonGroups({});\n setSelectedAddons({});\n setAddonQuantities({});\n setAddonQuantityInputs({});\n return;\n }\n\n const grouped: Record<string, AddonGroup> = {};\n for (const group of item.addons) {\n const selType = group.selectionType === 'multiple' ? 'multiple_no_repeat' : (group.selectionType || 'multiple_no_repeat');\n grouped[group.groupTitle || \"Default\"] = {\n ...group,\n selectionType: selType as AddonGroup[\"selectionType\"],\n };\n }\n setAddonGroups(grouped);\n\n // 3. Initialize addon selections\n const selections: Record<string, Record<string, boolean>> = {};\n const quantities: Record<string, Record<string, number>> = {};\n const quantityInputs: Record<string, Record<string, string>> = {};\n\n for (const [groupTitle, group] of Object.entries(grouped)) {\n selections[groupTitle] = {};\n quantities[groupTitle] = {};\n quantityInputs[groupTitle] = {};\n let singleDefaultSet = false;\n\n // Auto-select all only for multiple_no_repeat (pure checkboxes) when min >= item count.\n // For single/multiple_repeat, quantities are involved — auto-selecting all with\n // full portions creates invalid totals (e.g., 5 sauces × 1 portion = 5, but only 1 needed).\n const autoSelectAll = !isEditMode\n && group.selectionType === 'multiple_no_repeat'\n && group.minSelections != null\n && group.minSelections >= group.items.length;\n\n for (const addon of group.items) {\n const preSelectDefault = !!addon.isDefault && !isEditMode && group.selectionType === 'single' && !singleDefaultSet;\n const preSelect = autoSelectAll || preSelectDefault;\n selections[groupTitle][addon.name] = preSelect;\n // For multiple_no_repeat, quantities aren't used (boolean selections only).\n // For single defaults, pre-allocate all portions to the default item.\n quantities[groupTitle][addon.name] = preSelectDefault ? portions : 0;\n quantityInputs[groupTitle][addon.name] = preSelectDefault ? portions.toString() : \"0\";\n if (preSelectDefault) singleDefaultSet = true;\n }\n }\n\n // 4. Override with existing selections in edit mode\n if (isEditMode && item.selectedAddons?.length) {\n for (const sa of item.selectedAddons) {\n if (selections[sa.groupTitle]?.[sa.name] !== undefined) {\n selections[sa.groupTitle][sa.name] = true;\n quantities[sa.groupTitle][sa.name] = sa.quantity || 0;\n quantityInputs[sa.groupTitle][sa.name] = (sa.quantity || 0).toString();\n }\n }\n }\n\n setSelectedAddons(selections);\n setAddonQuantities(quantities);\n setAddonQuantityInputs(quantityInputs);\n }, [isOpen, item, quantity, BACKEND_QUANTITY_UNIT, isEditMode]);\n\n // Calculate total price when quantity or selected addons change\n useEffect(() => {\n if (!item) return;\n\n // Get base price (use discount price if available)\n let basePrice =\n BACKEND_QUANTITY_UNIT *\n (item.isDiscount\n ? parseFloat(item.discountPrice || \"0\")\n : parseFloat(item.price || \"0\"));\n\n if (isNaN(basePrice)) basePrice = 0;\n\n // Calculate addon costs\n // Addon total = sum of (addonPrice × addonQuantity) - no scaling multipliers\n let addonCost = 0;\n Object.entries(addonGroups).forEach(([groupTitle, group]) => {\n group.items.forEach((addon) => {\n if (selectedAddons[groupTitle]?.[addon.name]) {\n const addonPrice = parseFloat(addon.price) || 0;\n if (group.selectionType === \"single\") {\n // Radio button: use specific addon quantity\n const qty = addonQuantities[groupTitle]?.[addon.name] || 0;\n addonCost += addonPrice * qty;\n } else if (group.selectionType === \"multiple_repeat\") {\n // User explicitly sets quantity per addon\n const qty = addonQuantities[groupTitle]?.[addon.name] || 0;\n addonCost += addonPrice * qty;\n } else {\n // multiple_no_repeat: each selected addon applies to all portions\n addonCost += addonPrice * itemQuantity;\n }\n }\n });\n });\n setTotalPrice(basePrice * itemQuantity + addonCost);\n }, [\n item,\n itemQuantity,\n selectedAddons,\n addonQuantities,\n addonGroups,\n BACKEND_QUANTITY_UNIT,\n ]);\n\n // Handle quantity change for single-selection addons\n const updateAddonQuantity = (\n groupTitle: string,\n addonName: string,\n change: number\n ) => {\n setAddonQuantities((prev) => {\n const newQuantities: Record<string, Record<string, number>> = {};\n Object.keys(prev).forEach((key) => {\n newQuantities[key] = { ...prev[key] };\n });\n\n if (!newQuantities[groupTitle]) {\n newQuantities[groupTitle] = {};\n }\n\n const currentQty = newQuantities[groupTitle][addonName] || 0;\n let newQty = Math.max(0, currentQty + change);\n\n // Cap by maxSelections for the group (for min/max groups)\n const group = addonGroups[groupTitle];\n if (group?.maxSelections != null && change > 0) {\n const totalWithoutCurrent = Object.values(newQuantities[groupTitle]).reduce((s, q) => s + q, 0) - currentQty;\n const maxAllowed = group.maxSelections * itemQuantity - totalWithoutCurrent;\n newQty = Math.min(newQty, Math.max(0, maxAllowed));\n }\n\n newQuantities[groupTitle][addonName] = newQty;\n\n // Update input string to match\n setAddonQuantityInputs((prevInputs) => {\n const newInputs: Record<string, Record<string, string>> = {};\n Object.keys(prevInputs).forEach((key) => {\n newInputs[key] = { ...prevInputs[key] };\n });\n if (!newInputs[groupTitle]) {\n newInputs[groupTitle] = {};\n }\n newInputs[groupTitle][addonName] = newQty.toString();\n return newInputs;\n });\n\n // Update selected state based on quantity\n setSelectedAddons((prevSelected) => {\n const newSelections: Record<string, Record<string, boolean>> = {};\n Object.keys(prevSelected).forEach((key) => {\n newSelections[key] = { ...prevSelected[key] };\n });\n if (!newSelections[groupTitle]) {\n newSelections[groupTitle] = {};\n }\n newSelections[groupTitle][addonName] = newQty > 0;\n return newSelections;\n });\n\n return newQuantities;\n });\n };\n\n // Set addon quantity directly (for text input or click-to-fill)\n const setAddonQuantityDirect = (\n groupTitle: string,\n addonName: string,\n newQty: number\n ) => {\n const validQty = Math.max(0, Math.floor(newQty));\n\n setAddonQuantities((prev) => {\n const newQuantities: Record<string, Record<string, number>> = {};\n Object.keys(prev).forEach((key) => {\n newQuantities[key] = { ...prev[key] };\n });\n\n if (!newQuantities[groupTitle]) {\n newQuantities[groupTitle] = {};\n }\n\n newQuantities[groupTitle][addonName] = validQty;\n\n // Update input value to match\n setAddonQuantityInputs((prevInputs) => {\n const newInputs: Record<string, Record<string, string>> = {};\n Object.keys(prevInputs).forEach((key) => {\n newInputs[key] = { ...prevInputs[key] };\n });\n if (!newInputs[groupTitle]) {\n newInputs[groupTitle] = {};\n }\n newInputs[groupTitle][addonName] = validQty.toString();\n return newInputs;\n });\n\n // Update selected state based on quantity\n setSelectedAddons((prevSelected) => {\n const newSelections: Record<string, Record<string, boolean>> = {};\n Object.keys(prevSelected).forEach((key) => {\n newSelections[key] = { ...prevSelected[key] };\n });\n if (!newSelections[groupTitle]) {\n newSelections[groupTitle] = {};\n }\n newSelections[groupTitle][addonName] = validQty > 0;\n return newSelections;\n });\n\n return newQuantities;\n });\n };\n\n // Handle clicking on the addon row to set it to all portions and reset others in group\n const handleAddonRowClick = (groupTitle: string, addonName: string) => {\n setAddonQuantities((prev) => {\n const newQuantities: Record<string, Record<string, number>> = {};\n Object.keys(prev).forEach((key) => {\n newQuantities[key] = { ...prev[key] };\n });\n\n if (!newQuantities[groupTitle]) {\n newQuantities[groupTitle] = {};\n }\n\n // Reset all addons in this group to 0\n Object.keys(newQuantities[groupTitle]).forEach((addon) => {\n newQuantities[groupTitle][addon] = 0;\n });\n\n // Set the clicked addon to itemQuantity\n newQuantities[groupTitle][addonName] = itemQuantity;\n\n // Update input strings\n setAddonQuantityInputs((prevInputs) => {\n const newInputs: Record<string, Record<string, string>> = {};\n Object.keys(prevInputs).forEach((key) => {\n newInputs[key] = { ...prevInputs[key] };\n });\n if (!newInputs[groupTitle]) {\n newInputs[groupTitle] = {};\n }\n // Reset all addon inputs in this group to \"0\"\n Object.keys(newInputs[groupTitle]).forEach((addon) => {\n newInputs[groupTitle][addon] = \"0\";\n });\n // Set the clicked addon input to itemQuantity\n newInputs[groupTitle][addonName] = itemQuantity.toString();\n return newInputs;\n });\n\n // Update selected state\n setSelectedAddons((prevSelected) => {\n const newSelections: Record<string, Record<string, boolean>> = {};\n Object.keys(prevSelected).forEach((key) => {\n newSelections[key] = { ...prevSelected[key] };\n });\n if (!newSelections[groupTitle]) {\n newSelections[groupTitle] = {};\n }\n // Reset all selections in this group\n Object.keys(newSelections[groupTitle]).forEach((addon) => {\n newSelections[groupTitle][addon] = false;\n });\n // Only the clicked addon is selected\n newSelections[groupTitle][addonName] = true;\n return newSelections;\n });\n\n return newQuantities;\n });\n };\n\n const toggleAddon = (groupTitle: string, addonName: string) => {\n const group = addonGroups[groupTitle];\n\n // For single-selection groups, we don't toggle - we use quantity controls\n if (group.selectionType === \"single\") {\n return; // Quantity controls handle this\n }\n\n // For multiple_repeat groups, quantity steppers handle selection\n if (group.selectionType === \"multiple_repeat\") {\n return; // Quantity controls handle this\n }\n\n // For multiple selection, toggle the clicked addon\n const currentValue = selectedAddons[groupTitle]?.[addonName] || false;\n\n // If toggling ON, check maxSelections constraint\n if (!currentValue && group.maxSelections != null) {\n const currentCount = getMultipleSelectionCount(groupTitle);\n if (currentCount >= group.maxSelections) return;\n }\n\n // Allow toggling OFF freely — the button disabled state enforces minSelections.\n // Blocking deselection creates a dead-end when min equals max.\n\n setSelectedAddons((prev) => {\n const newSelections: Record<string, Record<string, boolean>> = {};\n Object.keys(prev).forEach((key) => {\n newSelections[key] = { ...prev[key] };\n });\n\n if (!newSelections[groupTitle]) {\n newSelections[groupTitle] = {};\n }\n\n newSelections[groupTitle][addonName] = !currentValue;\n\n return newSelections;\n });\n };\n\n // Helper to get total selected quantity for a single-selection group\n const getSingleSelectionTotal = (groupTitle: string) => {\n const quantities = addonQuantities[groupTitle] || {};\n return Object.values(quantities).reduce((sum, qty) => sum + qty, 0);\n };\n\n // Helper to get total selected count for a multiple-selection group\n const getMultipleSelectionCount = (groupTitle: string) => {\n const group = addonGroups[groupTitle];\n // For multiple_repeat: sum quantities (user explicitly sets qty per addon)\n if (group?.selectionType === 'multiple_repeat') {\n const quantities = addonQuantities[groupTitle] || {};\n return Object.values(quantities).reduce((sum, qty) => sum + qty, 0);\n }\n // For plain multiple_no_repeat: count boolean selections\n const selections = selectedAddons[groupTitle] || {};\n return Object.values(selections).filter(Boolean).length;\n };\n\n const validateRequiredAddons = () => {\n return Object.entries(addonGroups).every(([groupTitle, group]) => {\n if (!group.isRequired) return true;\n\n // Check if at least one addon is selected in required groups\n return Object.values(selectedAddons[groupTitle] || {}).some(\n (isSelected) => isSelected\n );\n });\n };\n\n const validateSingleSelectionTotals = () => {\n // Check that all single-selection groups have quantities that add up to itemQuantity\n const errors: string[] = [];\n\n Object.entries(addonGroups).forEach(([groupTitle, group]) => {\n // Validate single-selection groups: quantities must add up to itemQuantity\n if (group.selectionType === \"single\") {\n const total = getSingleSelectionTotal(groupTitle);\n const hasAnySelection = Object.values(\n selectedAddons[groupTitle] || {}\n ).some((isSelected) => isSelected);\n\n if (hasAnySelection && total !== itemQuantity) {\n errors.push(\n `${groupTitle}: Please select exactly ${itemQuantity} portion${\n itemQuantity > 1 ? \"s\" : \"\"\n } (currently ${total})`\n );\n }\n }\n });\n\n return errors;\n };\n\n const handleAddToCart = () => {\n if (!item) return;\n\n // Validate required addons\n if (!validateRequiredAddons()) {\n alert(\"Please select all required options before adding to cart.\");\n return;\n }\n\n // Validate single-selection totals\n const validationErrors = validateSingleSelectionTotals();\n if (validationErrors.length > 0) {\n alert(\"Please adjust your selections:\\n\\n\" + validationErrors.join(\"\\n\"));\n return;\n }\n\n // Validate multiple-selection min/max constraints\n const multipleSelectionErrors: string[] = [];\n Object.entries(addonGroups).forEach(([groupTitle, group]) => {\n if (group.selectionType === 'single') return; // single validated above\n\n const count = getMultipleSelectionCount(groupTitle);\n // For multiple_repeat: scale by itemQuantity (quantities accumulate across portions)\n // For multiple_no_repeat: no scaling (min/max = how many distinct options to pick)\n const scale = group.selectionType === 'multiple_repeat' ? itemQuantity : 1;\n\n if (group.minSelections != null) {\n const effectiveMin = group.minSelections * scale;\n if (count < effectiveMin) {\n multipleSelectionErrors.push(\n `${groupTitle}: Please select at least ${effectiveMin} option${effectiveMin > 1 ? \"s\" : \"\"} (currently ${count})`\n );\n }\n }\n\n if (group.maxSelections != null) {\n const effectiveMax = group.maxSelections * scale;\n if (count > effectiveMax) {\n multipleSelectionErrors.push(\n `${groupTitle}: Please select at most ${effectiveMax} option${effectiveMax > 1 ? \"s\" : \"\"} (currently ${count})`\n );\n }\n }\n });\n if (multipleSelectionErrors.length > 0) {\n alert(\"Please adjust your selections:\\n\\n\" + multipleSelectionErrors.join(\"\\n\"));\n return;\n }\n\n // Collect selected addons with their quantities and prices\n const addonsForCart: {\n name: string;\n price: number;\n quantity: number;\n groupTitle: string;\n allergens?: string | string[];\n dietaryRestrictions?: string[];\n }[] = [];\n\n let totalAddonPrice = 0;\n\n Object.entries(addonGroups).forEach(([groupTitle, group]) => {\n group.items.forEach((addon) => {\n if (selectedAddons[groupTitle]?.[addon.name]) {\n const addonPrice = Number(addon.price) || 0;\n\n if (group.selectionType === \"single\") {\n // Radio/quantity split: use the specific quantity\n const qty = addonQuantities[groupTitle]?.[addon.name] || 0;\n if (qty > 0) {\n addonsForCart.push({\n name: addon.name,\n price: addonPrice,\n quantity: qty,\n groupTitle: groupTitle,\n allergens: addon.allergens,\n dietaryRestrictions: addon.dietaryRestrictions,\n });\n totalAddonPrice += addonPrice * qty;\n }\n } else if (group.selectionType === \"multiple_repeat\") {\n // User explicitly sets quantity per addon\n const qty = addonQuantities[groupTitle]?.[addon.name] || 0;\n if (qty > 0) {\n addonsForCart.push({\n name: addon.name,\n price: addonPrice,\n quantity: qty,\n groupTitle: groupTitle,\n allergens: addon.allergens,\n dietaryRestrictions: addon.dietaryRestrictions,\n });\n totalAddonPrice += addonPrice * qty;\n }\n } else {\n // multiple_no_repeat: each selected addon applies to all portions\n addonsForCart.push({\n name: addon.name,\n price: addonPrice,\n quantity: itemQuantity,\n groupTitle: groupTitle,\n allergens: addon.allergens,\n dietaryRestrictions: addon.dietaryRestrictions,\n });\n totalAddonPrice += addonPrice * itemQuantity;\n }\n }\n });\n });\n\n // Create item with selected addons\n const itemWithAddons = {\n ...item,\n selectedAddons: addonsForCart,\n addonPrice: totalAddonPrice,\n // Store the portion quantity for the parent to use\n portionQuantity: itemQuantity,\n };\n\n onAddItem?.(itemWithAddons);\n onClose();\n };\n\n // Check if any addon group has unmet selection requirements\n const isMinSelectionsUnmet = Object.entries(addonGroups).some(\n ([groupTitle, group]) => {\n // Single type: user allocates portions via quantity steppers.\n // Only block if they've started selecting but haven't allocated all portions.\n if (group.selectionType === 'single') {\n const hasAnySelection = Object.values(selectedAddons[groupTitle] || {}).some(Boolean);\n if (!hasAnySelection) return false;\n return getSingleSelectionTotal(groupTitle) !== itemQuantity;\n }\n if (group.minSelections == null) return false;\n const scale = group.selectionType === 'multiple_repeat' ? itemQuantity : 1;\n return getMultipleSelectionCount(groupTitle) < group.minSelections * scale;\n }\n );\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-[60] flex items-end md:items-center justify-center md:p-4\"\n onClick={onClose}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/50\" />\n\n {/* Modal Content */}\n <div\n className=\"relative bg-base-100 md:rounded-xl max-w-lg w-full h-dvh md:h-auto md:max-h-[90vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Close Button */}\n <button\n onClick={onClose}\n className=\"absolute top-3 right-3 p-2 rounded-full bg-gray-700 hover:bg-gray-600 transition-colors z-30\"\n aria-label=\"Close modal\"\n >\n <X className=\"w-5 h-5 text-white\" />\n </button>\n\n {/* Scrollable Modal Body */}\n <div className=\"p-4 md:p-6 overflow-y-auto flex-1\">\n {item.image && (\n <div\n className=\"w-full flex-shrink-0 mb-3 overflow-hidden rounded-2xl\"\n style={{ maxHeight: '50vh', aspectRatio: '5/4' }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n <img\n src={item.image}\n alt={item.menuItemName}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n <h2 className=\"font-bold text-lg md:text-2xl text-base-content mb-1 pr-8\">\n {item.menuItemName}\n </h2>\n {item.restaurantName && (\n <p className=\"text-xs md:text-sm text-primary font-medium mb-3 md:mb-4\">\n From {item.restaurantName}\n </p>\n )}\n\n <div className=\"space-y-3 md:space-y-4 mt-2\">\n {item.description && (\n <div>\n <p className=\"text-base-content/70 text-xs md:text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n )}\n\n {item.allergens && item.allergens.length > 0 && (\n <div className=\"bg-warning/5 border border-warning/20 rounded-lg p-3 md:p-4\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsAllergenExpanded(!isAllergenExpanded);\n }}\n className=\"w-full text-left hover:opacity-80 transition-opacity\"\n >\n <h3 className=\"font-semibold text-xs md:text-sm text-base-content flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-2\">\n <span className=\"text-warning text-sm md:text-base\">⚠️</span>\n Allergens\n </span>\n <span className=\"text-[10px] md:text-xs text-base-content/60 font-normal\">\n {isAllergenExpanded ? \"▲ Hide\" : \"▼ Show\"}\n </span>\n </h3>\n </button>\n {isAllergenExpanded && (\n <>\n <div className=\"flex flex-wrap gap-1.5 md:gap-2 my-2 md:my-3\">\n {item.allergens.map((allergen: string, index: number) => (\n <span\n key={index}\n className=\"bg-warning text-warning-content px-2 md:px-3 py-1 md:py-1.5 rounded-full text-[10px] md:text-xs font-semibold shadow-sm\"\n >\n {formatAllergen(allergen)}\n </span>\n ))}\n </div>\n <p className=\"text-[10px] md:text-xs text-base-content/60 italic leading-relaxed\">\n This is approximate. For full allergen information, please\n contact the restaurant.\n </p>\n </>\n )}\n </div>\n )}\n {(!item.allergens || item.allergens.length === 0) && (\n <div className=\"bg-base-200 border border-base-300 rounded-lg p-2 md:p-3\">\n <p className=\"text-[10px] md:text-xs text-base-content/60 italic\">\n ⚠️ Allergen information not available. Please contact the\n restaurant directly.\n </p>\n </div>\n )}\n\n {/* Pricing */}\n <div className=\"pt-1 md:pt-2\">\n <div className=\"flex items-center gap-2 mb-1\">\n {item.isDiscount && discountPrice > 0 ? (\n <>\n <span className=\"text-xl md:text-2xl font-bold text-primary\">\n £{(discountPrice * BACKEND_QUANTITY_UNIT).toFixed(2)}\n </span>\n <span className=\"text-lg md:text-xl text-base-content/50 line-through\">\n £{(price * BACKEND_QUANTITY_UNIT).toFixed(2)}\n </span>\n </>\n ) : (\n <span className=\"text-xl md:text-2xl font-bold text-primary\">\n £{(displayPrice * BACKEND_QUANTITY_UNIT).toFixed(2)}\n </span>\n )}\n </div>\n <p className=\"text-xs md:text-sm text-base-content/60 mb-3 md:mb-4\">\n Feeds up to {DISPLAY_FEEDS_PER_UNIT} people\n </p>\n\n {/* Quantity Selector - Hidden in viewOnly mode */}\n {!viewOnly && (\n <div className=\"bg-base-200 p-3 md:p-4 rounded-lg\">\n <h3 className=\"font-semibold text-xs md:text-sm text-base-content mb-2 md:mb-3\">\n Number of Portions\n </h3>\n <div className=\"flex items-center justify-between gap-3\">\n <button\n onClick={() => {\n const newQty = Math.max(1, itemQuantity - 1);\n setItemQuantity(newQty);\n setItemQuantityInput(newQty.toString());\n if (\n quantity > 0 &&\n (!item.addons || item.addons.length === 0)\n ) {\n setHasModifiedQuantity(newQty !== initialModalQuantity);\n }\n }}\n className=\"w-8 h-8 md:w-10 md:h-10 bg-base-100 border border-base-300 rounded-lg hover:bg-base-200 flex items-center justify-center text-base md:text-lg font-medium flex-shrink-0\"\n >\n −\n </button>\n <div className=\"flex flex-col items-center gap-1 flex-1\">\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={itemQuantityInput}\n onChange={(e) => {\n const val = e.target.value;\n // Allow empty or numeric input only\n if (val === \"\" || /^\\d+$/.test(val)) {\n setItemQuantityInput(val);\n if (val !== \"\" && !isNaN(parseInt(val))) {\n const newQty = Math.max(1, parseInt(val));\n setItemQuantity(newQty);\n if (\n quantity > 0 &&\n (!item.addons || item.addons.length === 0)\n ) {\n setHasModifiedQuantity(\n newQty !== initialModalQuantity\n );\n }\n }\n }\n }}\n onBlur={(e) => {\n if (\n e.target.value === \"\" ||\n parseInt(e.target.value) < 1\n ) {\n setItemQuantity(1);\n setItemQuantityInput(\"1\");\n if (\n quantity > 0 &&\n (!item.addons || item.addons.length === 0)\n ) {\n setHasModifiedQuantity(1 !== initialModalQuantity);\n }\n }\n }}\n className=\"w-16 md:w-20 text-center font-bold text-base md:text-lg text-base-content bg-base-100 border border-base-300 rounded px-2 py-1\"\n />\n {/* <p className=\"text-xs text-base-content/60\">\n Feeds {itemQuantity * DISPLAY_FEEDS_PER_UNIT} people\n </p> */}\n </div>\n <button\n onClick={() => {\n const newQty = itemQuantity + 1;\n setItemQuantity(newQty);\n setItemQuantityInput(newQty.toString());\n if (\n quantity > 0 &&\n (!item.addons || item.addons.length === 0)\n ) {\n setHasModifiedQuantity(newQty !== initialModalQuantity);\n }\n }}\n className=\"w-8 h-8 md:w-10 md:h-10 bg-base-100 border border-base-300 rounded-lg hover:bg-base-200 flex items-center justify-center text-base md:text-lg font-medium flex-shrink-0\"\n >\n +\n </button>\n </div>\n </div>\n )}\n </div>\n\n {/* Addons section */}\n {Object.keys(addonGroups).length > 0 && (\n <div className=\"pt-4\">\n <h3 className=\"font-semibold text-base text-base-content mb-3\">\n {viewOnly ? \"Available Add-ons\" : \"Customize Your Order\"}\n </h3>\n {Object.entries(addonGroups).map(([groupTitle, group]) => (\n <div key={groupTitle} className=\"mb-4\">\n <div className=\"mb-2\">\n <div className=\"flex flex-col md:flex-row md:items-center md:justify-between gap-0.5 md:gap-2\">\n <h4 className=\"font-medium text-xs md:text-sm text-base-content\">\n {groupTitle}\n {!viewOnly && group.isRequired && (\n <span className=\"text-error ml-1\">*</span>\n )}\n </h4>\n {!viewOnly && (() => {\n const ruleText = (() => {\n if (group.selectionType === \"single\") {\n const total = getSingleSelectionTotal(groupTitle);\n return `Choose one option · ${total} of ${itemQuantity}`;\n }\n if (group.selectionType === \"multiple_repeat\") {\n const count = getMultipleSelectionCount(groupTitle);\n const effectiveMax = group.maxSelections != null ? group.maxSelections * itemQuantity : null;\n return effectiveMax != null\n ? `Add as many as you like · ${count} of ${effectiveMax} added`\n : `Add as many as you like · ${count} added`;\n }\n // multiple_no_repeat — no scaling, min/max = distinct options\n if (group.minSelections != null || group.maxSelections != null) {\n const count = getMultipleSelectionCount(groupTitle);\n const effectiveMin = group.minSelections ?? null;\n const effectiveMax = group.maxSelections ?? null;\n let rule = \"Select your choices\";\n if (effectiveMin != null && effectiveMax != null && effectiveMin === effectiveMax) {\n rule = `Select ${effectiveMin} option${effectiveMin > 1 ? \"s\" : \"\"}`;\n } else if (effectiveMin != null && effectiveMax != null) {\n rule = `Select ${effectiveMin}–${effectiveMax} options`;\n } else if (effectiveMin != null) {\n rule = `Select at least ${effectiveMin}`;\n } else if (effectiveMax != null) {\n rule = `Select up to ${effectiveMax}`;\n }\n const target = effectiveMax ?? effectiveMin;\n return `${rule} · ${count} of ${target} selected`;\n }\n return \"Select your choices · included with each portion\";\n })();\n return (\n <span className=\"text-[10px] md:text-xs text-base-content/60\">\n {ruleText}\n </span>\n );\n })()}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n {group.items.map((addon, index) => {\n const addonQty =\n addonQuantities[groupTitle]?.[addon.name] || 0;\n const addonQtyInput =\n addonQuantityInputs[groupTitle]?.[addon.name] || \"0\";\n\n // View-only mode: Simple list display\n if (viewOnly) {\n return (\n <div\n key={index}\n className=\"w-full flex items-center justify-between p-3 rounded-lg border border-base-300 bg-base-100\"\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-base-content\">\n {addon.name}\n </span>\n {addon.dietaryRestrictions && addon.dietaryRestrictions.length > 0 && (\n <div className=\"flex items-center gap-0.5\">\n {addon.dietaryRestrictions.map((restriction) => {\n const iconInfo = DIETARY_ICON_MAP[restriction];\n if (!iconInfo) return null;\n return (\n <div\n key={restriction}\n className=\"relative w-4 h-4\"\n title={iconInfo.label}\n >\n <img\n src={`/dietary-icons/unfilled/${iconInfo.file}`}\n alt={iconInfo.label}\n className=\"object-contain\"\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n {parseFloat(addon.price) > 0 && (\n <span className=\"text-sm font-medium text-primary\">\n +£{parseFloat(addon.price).toFixed(2)}\n </span>\n )}\n </div>\n );\n }\n\n return (group.selectionType === \"single\") ? (\n // Single selection: Show quantity controls\n <div\n key={index}\n className={`w-full flex items-center justify-between p-3 rounded-lg border transition-all cursor-pointer ${\n addonQty > 0\n ? \"border-primary bg-primary/5\"\n : \"border-base-300 bg-base-100 hover:border-primary/30\"\n }`}\n onClick={() =>\n handleAddonRowClick(groupTitle, addon.name)\n }\n >\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:gap-3 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-base-content\">\n {addon.name}\n </span>\n {addon.dietaryRestrictions && addon.dietaryRestrictions.length > 0 && (\n <div className=\"flex items-center gap-0.5\">\n {addon.dietaryRestrictions.map((restriction) => {\n const iconInfo = DIETARY_ICON_MAP[restriction];\n if (!iconInfo) return null;\n return (\n <div\n key={restriction}\n className=\"relative w-4 h-4\"\n title={iconInfo.label}\n >\n <img\n src={`/dietary-icons/unfilled/${iconInfo.file}`}\n alt={iconInfo.label}\n className=\"object-contain\"\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n {parseFloat(addon.price) > 0 && (\n <span className=\"text-xs font-medium text-primary\">\n +£{parseFloat(addon.price).toFixed(2)}\n </span>\n )}\n </div>\n <div\n className=\"flex items-center gap-2\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={() =>\n updateAddonQuantity(\n groupTitle,\n addon.name,\n -1\n )\n }\n disabled={addonQty === 0}\n className=\"w-7 h-7 bg-base-100 border border-base-300 rounded hover:bg-base-200 flex items-center justify-center text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-base-100\"\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={addonQtyInput}\n onChange={(e) => {\n const val = e.target.value;\n // Allow empty or numeric input only\n if (val === \"\" || /^\\d+$/.test(val)) {\n // Update input string\n setAddonQuantityInputs((prev) => {\n const newInputs: Record<\n string,\n Record<string, string>\n > = {};\n Object.keys(prev).forEach((key) => {\n newInputs[key] = { ...prev[key] };\n });\n if (!newInputs[groupTitle]) {\n newInputs[groupTitle] = {};\n }\n newInputs[groupTitle][addon.name] = val;\n return newInputs;\n });\n\n // Update actual quantity with validation\n if (val !== \"\" && !isNaN(parseInt(val))) {\n const currentTotal =\n getSingleSelectionTotal(groupTitle);\n const requestedQty = parseInt(val);\n const otherAddonsTotal =\n currentTotal - addonQty;\n const maxAllowed =\n itemQuantity - otherAddonsTotal;\n const finalQty = Math.min(\n requestedQty,\n Math.max(0, maxAllowed)\n );\n\n setAddonQuantityDirect(\n groupTitle,\n addon.name,\n finalQty\n );\n }\n }\n }}\n onBlur={(e) => {\n if (\n e.target.value === \"\" ||\n parseInt(e.target.value) < 0\n ) {\n setAddonQuantityDirect(\n groupTitle,\n addon.name,\n 0\n );\n }\n }}\n className=\"w-12 text-center text-sm font-medium text-base-content bg-base-100 border border-base-300 rounded px-1 py-0.5\"\n onClick={(e) => e.stopPropagation()}\n />\n <button\n onClick={() =>\n updateAddonQuantity(groupTitle, addon.name, 1)\n }\n disabled={\n getSingleSelectionTotal(groupTitle) >=\n itemQuantity\n }\n className=\"w-7 h-7 bg-base-100 border border-base-300 rounded hover:bg-base-200 flex items-center justify-center text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-base-100\"\n >\n +\n </button>\n </div>\n </div>\n ) : (group.selectionType === \"multiple_repeat\") ? (\n // Multiple repeat: Checkbox + quantity stepper per addon\n (() => {\n const addonQtyMR = addonQuantities[groupTitle]?.[addon.name] || 0;\n const addonQtyInputMR = addonQuantityInputs[groupTitle]?.[addon.name] || \"0\";\n const groupTotal = getMultipleSelectionCount(groupTitle);\n const isMaxReached = group.maxSelections != null && groupTotal >= group.maxSelections * itemQuantity;\n return (\n <div\n key={index}\n className={`w-full flex items-center justify-between p-3 rounded-lg border transition-all ${\n addonQtyMR > 0\n ? \"border-primary bg-primary/5\"\n : \"border-base-300 bg-base-100\"\n }`}\n >\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:gap-3 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-base-content\">{addon.name}</span>\n {addon.dietaryRestrictions && addon.dietaryRestrictions.length > 0 && (\n <div className=\"flex items-center gap-0.5\">\n {addon.dietaryRestrictions.map((restriction) => {\n const iconInfo = DIETARY_ICON_MAP[restriction];\n if (!iconInfo) return null;\n return (\n <div key={restriction} className=\"relative w-4 h-4\" title={iconInfo.label}>\n <img src={`/dietary-icons/unfilled/${iconInfo.file}`} alt={iconInfo.label} className=\"object-contain\" />\n </div>\n );\n })}\n </div>\n )}\n </div>\n {parseFloat(addon.price) > 0 && (\n <span className=\"text-xs font-medium text-primary\">\n +£{parseFloat(addon.price).toFixed(2)} each\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => updateAddonQuantity(groupTitle, addon.name, -1)}\n disabled={addonQtyMR === 0}\n className=\"w-7 h-7 bg-base-100 border border-base-300 rounded hover:bg-base-200 flex items-center justify-center text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-base-100\"\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={addonQtyInputMR}\n onChange={(e) => {\n const val = e.target.value;\n if (val === \"\" || /^\\d+$/.test(val)) {\n setAddonQuantityInputs((prev) => {\n const newInputs: Record<string, Record<string, string>> = {};\n Object.keys(prev).forEach((key) => { newInputs[key] = { ...prev[key] }; });\n if (!newInputs[groupTitle]) newInputs[groupTitle] = {};\n newInputs[groupTitle][addon.name] = val;\n return newInputs;\n });\n if (val !== \"\" && !isNaN(parseInt(val))) {\n const requested = parseInt(val);\n const totalWithoutCurrent = getMultipleSelectionCount(groupTitle) - addonQtyMR;\n const maxAllowed = group.maxSelections != null ? group.maxSelections * itemQuantity - totalWithoutCurrent : Infinity;\n const finalQty = Math.min(requested, Math.max(0, maxAllowed));\n setAddonQuantityDirect(groupTitle, addon.name, finalQty);\n }\n }\n }}\n onBlur={(e) => {\n if (e.target.value === \"\" || parseInt(e.target.value) < 0) {\n setAddonQuantityDirect(groupTitle, addon.name, 0);\n }\n }}\n className=\"w-12 text-center text-sm font-medium text-base-content bg-base-100 border border-base-300 rounded px-1 py-0.5\"\n />\n <button\n onClick={() => updateAddonQuantity(groupTitle, addon.name, 1)}\n disabled={isMaxReached}\n className=\"w-7 h-7 bg-base-100 border border-base-300 rounded hover:bg-base-200 flex items-center justify-center text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-base-100\"\n >\n +\n </button>\n </div>\n </div>\n );\n })()\n ) : (\n // multiple_no_repeat: checkbox (toggleable once, qty = itemQuantity)\n (() => {\n const isSelected = selectedAddons[groupTitle]?.[addon.name] || false;\n return (\n <button\n key={index}\n onClick={() => toggleAddon(groupTitle, addon.name)}\n className={`w-full flex items-center justify-between p-3 rounded-lg border transition-all ${\n isSelected\n ? \"border-primary bg-primary/5\"\n : \"border-base-300 bg-base-100 hover:border-primary/50\"\n }`}\n >\n <div className=\"flex items-center gap-3\">\n <div\n className={`w-5 h-5 rounded border-2 flex items-center justify-center ${\n isSelected\n ? \"border-primary bg-primary\"\n : \"border-base-300\"\n }`}\n >\n {isSelected && (\n <svg\n className=\"w-3 h-3 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n </div>\n <span className=\"text-sm text-base-content\">\n {addon.name}\n </span>\n {addon.dietaryRestrictions && addon.dietaryRestrictions.length > 0 && (\n <div className=\"flex items-center gap-0.5\">\n {addon.dietaryRestrictions.map((restriction) => {\n const iconInfo = DIETARY_ICON_MAP[restriction];\n if (!iconInfo) return null;\n return (\n <div\n key={restriction}\n className=\"relative w-4 h-4\"\n title={iconInfo.label}\n >\n <img\n src={`/dietary-icons/unfilled/${iconInfo.file}`}\n alt={iconInfo.label}\n className=\"object-contain\"\n />\n </div>\n );\n })}\n </div>\n )}\n </div>\n {parseFloat(addon.price) > 0 && (\n <span className=\"text-sm font-medium text-primary\">\n +£{(parseFloat(addon.price) * itemQuantity).toFixed(2)}\n </span>\n )}\n </button>\n );\n })()\n );\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n {/* Total - Hidden in viewOnly mode */}\n {!viewOnly && (\n <div className=\"pt-2 border-t border-base-300\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm font-medium text-base-content/70\">\n Total {itemQuantity > 1 ? `(${itemQuantity} portions)` : \"\"}:\n </span>\n <span className=\"text-lg font-bold text-primary\">\n £{totalPrice.toFixed(2)}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Sticky Action Buttons */}\n {viewOnly ? (\n onAddToOrder && (\n <div className=\"sticky bottom-0 px-3 py-2 bg-base-100 border-t border-base-300 rounded-b-xl\">\n <button\n onClick={() => onAddToOrder(item)}\n className=\"w-full bg-primary hover:opacity-90 text-white py-3 rounded-lg font-medium transition-all text-sm\"\n >\n Add to Order\n </button>\n </div>\n )\n ) : (\n <div className=\"sticky bottom-0 px-3 py-2 bg-base-100 border-t border-base-300 rounded-b-xl\">\n {forceAddMode ? (\n <button\n onClick={handleAddToCart}\n disabled={isMinSelectionsUnmet}\n className={`w-full py-3 rounded-lg font-medium transition-all text-sm ${\n isMinSelectionsUnmet\n ? \"bg-base-300 text-base-content/50 cursor-not-allowed\"\n : \"bg-primary hover:opacity-90 text-white\"\n }`}\n >\n {addButtonLabel ?? \"Add to Order\"}\n </button>\n ) : isEditMode ? (\n <div className=\"space-y-1.5 md:space-y-2\">\n <button\n onClick={handleAddToCart}\n disabled={isMinSelectionsUnmet}\n className={`w-full py-3 rounded-lg font-medium transition-all text-sm ${\n isMinSelectionsUnmet\n ? \"bg-base-300 text-base-content/50 cursor-not-allowed\"\n : \"bg-primary hover:opacity-90 text-white\"\n }`}\n >\n Save Changes\n </button>\n <button\n onClick={() => {\n if (onRemoveItem && editingIndex !== null) {\n onRemoveItem(editingIndex);\n onClose();\n }\n }}\n className=\"w-full bg-error hover:opacity-90 text-white py-3 rounded-lg font-medium transition-all text-sm\"\n >\n Remove from Order\n </button>\n </div>\n ) : quantity > 0 && (!item.addons || item.addons.length === 0) ? (\n <div className=\"space-y-1.5 md:space-y-2\">\n {hasModifiedQuantity && (\n <button\n onClick={() => {\n const newBackendQty = itemQuantity * BACKEND_QUANTITY_UNIT;\n onUpdateQuantity?.(item.id, newBackendQty);\n onClose();\n }}\n className=\"w-full bg-primary hover:opacity-90 text-white py-3 rounded-lg font-medium transition-all text-sm\"\n >\n Save Order\n </button>\n )}\n <button\n onClick={() => {\n onUpdateQuantity?.(item.id, 0);\n onClose();\n }}\n className=\"w-full bg-error hover:opacity-90 text-white py-3 rounded-lg font-medium transition-all text-sm\"\n >\n Remove from Order\n </button>\n </div>\n ) : (\n <button\n onClick={handleAddToCart}\n disabled={isMinSelectionsUnmet}\n className={`w-full py-3 rounded-lg font-medium transition-all text-sm ${\n isMinSelectionsUnmet\n ? \"bg-base-300 text-base-content/50 cursor-not-allowed\"\n : \"bg-primary hover:opacity-90 text-white\"\n }`}\n >\n Add to Order\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState, useRef, useCallback, useMemo, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useCateringConfig } from \"../config/CateringConfigContext\";\n\nexport interface TutorialStep {\n id: string;\n targetRef: React.RefObject<HTMLElement | null>;\n title: string;\n description: string;\n position: \"top\" | \"bottom\" | \"left\" | \"right\";\n requiresClick?: boolean; // User must click the target to proceed\n manualAdvance?: boolean; // Like requiresClick (shows hint + hole) but does NOT auto-advance on click\n showNext?: boolean; // Show \"Next\" button\n nextLabel?: string; // Custom label for the primary action\n showSkip?: boolean; // Show \"Skip Tutorial\" button\n highlightPadding?: number; // Padding around highlight\n highlightExtendBottom?: number; // Extra height to extend highlight downward\n highlightExtendBottomToViewport?: boolean; // Extend highlight to bottom of viewport\n highlightMinTop?: number; // Clamp the highlight so it doesn't extend into sticky UI\n autoScroll?: boolean; // Scroll element into view inside updatePosition before positioning\n onBeforeShow?: (onComplete: () => void) => void; // Called before showing this step; call onComplete when ready to position\n}\n\ninterface HighlightRect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n width: number;\n height: number;\n}\n\ninterface TutorialTooltipProps {\n step: TutorialStep | null;\n onNext: () => void;\n onSkip: () => void;\n currentStepIndex: number;\n totalSteps: number;\n}\n\nexport default function TutorialTooltip({\n step,\n onNext,\n onSkip,\n currentStepIndex,\n totalSteps,\n}: TutorialTooltipProps) {\n const { theme } = useCateringConfig();\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const [arrowPosition, setArrowPosition] = useState({ top: 0, left: 0 });\n const [highlightRect, setHighlightRect] = useState<HighlightRect | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n // Mirror CateringWidget's theme-token bridge so portal children resolve\n // --color-primary (etc.) even though they render outside the widget root.\n const themeStyle = useMemo<CSSProperties>(() => {\n const vars: Record<string, string> = { display: \"contents\" };\n if (theme?.primary) vars[\"--swift-primary\"] = theme.primary;\n if (theme?.radius) vars[\"--swift-radius\"] = theme.radius;\n if (theme?.font) vars[\"--swift-font\"] = theme.font;\n return vars as CSSProperties;\n }, [theme]);\n const [mounted, setMounted] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const prevStepIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const updatePosition = useCallback(() => {\n if (!step?.targetRef?.current || !tooltipRef.current) return;\n\n const targetEl = step.targetRef.current;\n const tooltipEl = tooltipRef.current;\n\n // If autoScroll: scroll element to roughly the middle of the viewport, then re-measure\n if (step.autoScroll) {\n const preRect = targetEl.getBoundingClientRect();\n const targetTop = Math.round(window.innerHeight * 0.35);\n if (preRect.top < (step.highlightMinTop ?? 0) || preRect.top > window.innerHeight * 0.65) {\n window.scrollTo({ top: window.scrollY + preRect.top - targetTop, behavior: \"instant\" });\n }\n }\n\n const targetRect = targetEl.getBoundingClientRect();\n const tooltipRect = tooltipEl.getBoundingClientRect();\n const highlightTop = Math.max(targetRect.top, step.highlightMinTop ?? 0);\n const highlightBottom = Math.max(targetRect.bottom, highlightTop);\n const adjustedTargetRect: HighlightRect = {\n left: targetRect.left,\n top: highlightTop,\n right: targetRect.right,\n bottom: highlightBottom,\n width: targetRect.width,\n height: highlightBottom - highlightTop,\n };\n\n // Calculate highlight sizing first so both the mask and tooltip placement stay aligned.\n const highlightPadding = step.highlightPadding ?? 8;\n const highlightExtendBottom = step.highlightExtendBottom ?? 0;\n const highlightViewportExtension = step.highlightExtendBottomToViewport\n ? Math.max(0, window.innerHeight - adjustedTargetRect.bottom - highlightPadding)\n : 0;\n const effectiveHighlightExtendBottom =\n highlightExtendBottom + highlightViewportExtension;\n\n setHighlightRect(adjustedTargetRect);\n\n // Calculate tooltip position based on specified position\n let top = 0;\n let left = 0;\n const gap = 12; // Gap between tooltip and target\n\n // Calculate ideal centered position\n const targetCenterX = adjustedTargetRect.left + adjustedTargetRect.width / 2;\n const targetCenterY = adjustedTargetRect.top + adjustedTargetRect.height / 2;\n\n switch (step.position) {\n case \"top\":\n top = adjustedTargetRect.top - tooltipRect.height - gap - highlightPadding;\n left = targetCenterX - tooltipRect.width / 2;\n break;\n case \"bottom\":\n // Position below the extended highlight area\n top =\n adjustedTargetRect.bottom +\n gap +\n effectiveHighlightExtendBottom +\n highlightPadding;\n left = targetCenterX - tooltipRect.width / 2;\n break;\n case \"left\":\n top = targetCenterY - tooltipRect.height / 2;\n left = adjustedTargetRect.left - tooltipRect.width - gap;\n break;\n case \"right\":\n top = targetCenterY - tooltipRect.height / 2;\n left = adjustedTargetRect.right + gap;\n break;\n }\n\n // Keep tooltip within viewport bounds\n const viewportPadding = 16;\n if (left < viewportPadding) left = viewportPadding;\n if (left + tooltipRect.width > window.innerWidth - viewportPadding) {\n left = window.innerWidth - tooltipRect.width - viewportPadding;\n }\n if (top < viewportPadding) top = viewportPadding;\n if (top + tooltipRect.height > window.innerHeight - viewportPadding) {\n top = window.innerHeight - tooltipRect.height - viewportPadding;\n }\n\n // Calculate arrow position to point at target center\n let arrowTop = 0;\n let arrowLeft = 0;\n const arrowSize = 8;\n\n switch (step.position) {\n case \"top\":\n arrowTop = tooltipRect.height - 6;\n // Arrow should point at target center, adjusted for tooltip shift\n arrowLeft = Math.max(12, Math.min(tooltipRect.width - 20, targetCenterX - left - arrowSize));\n break;\n case \"bottom\":\n arrowTop = -6;\n arrowLeft = Math.max(12, Math.min(tooltipRect.width - 20, targetCenterX - left - arrowSize));\n break;\n case \"left\":\n arrowLeft = tooltipRect.width - 6;\n arrowTop = Math.max(12, Math.min(tooltipRect.height - 20, targetCenterY - top - arrowSize));\n break;\n case \"right\":\n arrowLeft = -6;\n arrowTop = Math.max(12, Math.min(tooltipRect.height - 20, targetCenterY - top - arrowSize));\n break;\n }\n\n setPosition({ top, left });\n setArrowPosition({ top: arrowTop, left: arrowLeft });\n }, [step]);\n\n useEffect(() => {\n if (!step) {\n setIsReady(false);\n return;\n }\n\n let cancelled = false;\n\n // schedulePosition: called by onBeforeShow when ready — marks the step as ready to display,\n // then retries until targetRef is populated and positions the tooltip.\n const schedulePosition = () => {\n // Always mark ready — safe to call even if this effect invocation was superseded.\n // The cancelled flag guards positioning side-effects, not state updates.\n setIsReady(true);\n if (cancelled) return;\n let attempts = 0;\n const tryUpdate = () => {\n if (cancelled) return;\n if (step.targetRef?.current) {\n updatePosition();\n } else if (attempts < 20) {\n attempts++;\n setTimeout(tryUpdate, 100);\n }\n };\n setTimeout(tryUpdate, 30);\n // For autoScroll steps, re-check after layout shifts (image loads pushing content down)\n if (step.autoScroll) {\n [200, 500, 900].forEach((delay) => {\n setTimeout(() => {\n if (!cancelled && step.targetRef?.current) updatePosition();\n }, delay);\n });\n }\n };\n\n // Only run onBeforeShow when step id actually changes (not on every re-render).\n // onBeforeShow is responsible for scrolling; it calls onComplete when ready to position.\n if (step.id !== prevStepIdRef.current) {\n prevStepIdRef.current = step.id;\n setIsReady(false);\n if (step.onBeforeShow) {\n step.onBeforeShow(schedulePosition);\n } else {\n schedulePosition();\n }\n }\n\n // Update position on scroll/resize\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n return () => {\n cancelled = true;\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [step, updatePosition]);\n\n // Once isReady flips true, trigger positioning immediately.\n // The main effect's tryUpdate may have been cancelled by a re-render before it ran,\n // so we need this separate trigger to ensure the tooltip is positioned on first show.\n useEffect(() => {\n if (isReady && step?.targetRef?.current) {\n updatePosition();\n }\n // Intentionally omit step and updatePosition — this should only fire on isReady changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isReady]);\n\n // Handle click on target element for requiresClick steps (not manualAdvance)\n useEffect(() => {\n if (!step?.requiresClick || step.manualAdvance || !step.targetRef?.current) return;\n\n const targetEl = step.targetRef.current;\n const handleClick = () => {\n // Small delay to let the click action complete\n setTimeout(onNext, 100);\n };\n\n targetEl.addEventListener(\"click\", handleClick);\n return () => targetEl.removeEventListener(\"click\", handleClick);\n }, [step, onNext]);\n\n if (!mounted || !step || !isReady) return null;\n\n const highlightPadding = step.highlightPadding ?? 8;\n const highlightExtendBottom = step.highlightExtendBottom ?? 0;\n const highlightViewportExtension =\n step.highlightExtendBottomToViewport && highlightRect\n ? Math.max(0, window.innerHeight - highlightRect.bottom - highlightPadding)\n : 0;\n const effectiveHighlightExtendBottom =\n highlightExtendBottom + highlightViewportExtension;\n\n const getArrowClasses = () => {\n const base = \"absolute w-4 h-4 bg-primary transform rotate-45\";\n switch (step.position) {\n case \"top\":\n return `${base}`;\n case \"bottom\":\n return `${base}`;\n case \"left\":\n return `${base}`;\n case \"right\":\n return `${base}`;\n default:\n return base;\n }\n };\n\n return createPortal(\n <div className=\"swift-catering-widget\" style={themeStyle}>\n {/* Overlay with spotlight cutout */}\n <div className=\"fixed inset-0 z-[9998] pointer-events-none\">\n <svg className=\"w-full h-full\">\n <defs>\n <mask id=\"tutorial-spotlight\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {highlightRect && (\n <rect\n x={highlightRect.left - highlightPadding}\n y={highlightRect.top - highlightPadding}\n width={highlightRect.width + highlightPadding * 2}\n height={\n highlightRect.height +\n highlightPadding * 2 +\n effectiveHighlightExtendBottom\n }\n rx=\"12\"\n fill=\"black\"\n />\n )}\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0,0,0,0.6)\"\n mask=\"url(#tutorial-spotlight)\"\n />\n </svg>\n </div>\n\n {/* Clickable overlay that blocks interaction except for highlighted area (only when requiresClick) */}\n <div\n className=\"fixed inset-0 z-[9998]\"\n style={{\n // Only create a hole in the overlay if the step requires clicking the target\n // For \"showNext\" steps, block all clicks including on the highlighted area\n clipPath: highlightRect && (step.requiresClick || step.manualAdvance)\n ? `polygon(\n 0% 0%,\n 0% 100%,\n ${highlightRect.left - highlightPadding}px 100%,\n ${highlightRect.left - highlightPadding}px ${highlightRect.top - highlightPadding}px,\n ${highlightRect.right + highlightPadding}px ${highlightRect.top - highlightPadding}px,\n ${highlightRect.right + highlightPadding}px ${highlightRect.bottom + highlightPadding + effectiveHighlightExtendBottom}px,\n ${highlightRect.left - highlightPadding}px ${highlightRect.bottom + highlightPadding + effectiveHighlightExtendBottom}px,\n ${highlightRect.left - highlightPadding}px 100%,\n 100% 100%,\n 100% 0%\n )`\n : undefined,\n }}\n />\n\n {/* Tooltip */}\n <div\n ref={tooltipRef}\n className=\"fixed z-[9999] bg-primary text-white rounded-xl shadow-2xl p-4 max-w-xs animate-[fadeIn_0.2s_ease-out]\"\n style={{\n top: position.top,\n left: position.left,\n }}\n >\n {/* Arrow */}\n <div\n className={getArrowClasses()}\n style={{\n top: arrowPosition.top,\n left: arrowPosition.left,\n }}\n />\n\n {/* Content */}\n <div className=\"relative\">\n {/* Step indicator - only show if more than 1 step */}\n {totalSteps > 1 && (\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs text-white/70\">\n Step {currentStepIndex + 1} of {totalSteps}\n </span>\n </div>\n )}\n\n <h4 className=\"font-semibold text-base mb-1\">{step.title}</h4>\n <p className=\"text-sm text-white/90 mb-4\">{step.description}</p>\n\n {/* Actions */}\n <div className=\"flex items-center justify-between gap-3\">\n {step.showSkip !== false && (\n <button\n onClick={onSkip}\n className=\"text-xs text-white/70 hover:text-white transition-colors\"\n >\n Skip Tutorial\n </button>\n )}\n {step.showNext && !step.requiresClick && (\n <button\n onClick={onNext}\n className=\"ml-auto px-4 py-1.5 bg-white text-primary text-sm font-medium rounded-lg hover:bg-white/90 transition-colors\"\n >\n {step.nextLabel || \"Next\"}\n </button>\n )}\n {(step.requiresClick || step.manualAdvance) && (\n <span className=\"ml-auto text-xs text-white/70 italic\">\n Click the highlighted area to continue\n </span>\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}\n","/**\n * Menu PDF Utility\n *\n * Transforms catering order data into the shape consumed by the\n * `CateringMenuPdf` React component (rendered via `@react-pdf/renderer`).\n */\n\nimport { CateringOrderResponse } from \"../types/api/response\";\nimport { PricingOrderItem } from \"../types/pricing\";\nimport type {\n PdfSession,\n PdfCategory,\n PdfMenuItem,\n PdfAddon,\n CateringMenuPdfProps,\n} from \"../pdf/CateringMenuPdf\";\n\nexport type { PdfSession, PdfCategory, PdfMenuItem, PdfAddon, CateringMenuPdfProps };\n\ninterface ProcessedPdfItem {\n item: PdfMenuItem;\n itemTotal: number;\n}\n\nfunction processMenuItemForPdf(\n menuItem: any,\n imageMap: Map<string, string | null>\n): ProcessedPdfItem[] {\n const originalImageUrl = menuItem.menuItemImage;\n const base64Image = originalImageUrl ? imageMap.get(originalImageUrl) : null;\n const image = base64Image || originalImageUrl;\n\n const selectedAddons = menuItem.selectedAddons || [];\n\n const addons = selectedAddons.map((addon: any) => ({\n name: addon.name,\n quantity: addon.quantity || 1,\n price: addon.customerUnitPrice || addon.price,\n groupTitle: addon.groupTitle,\n allergens: addon.allergens,\n dietaryRestrictions: addon.dietaryRestrictions,\n }));\n\n return [{\n item: {\n quantity: menuItem.quantity,\n name: menuItem.menuItemName,\n description: menuItem.description,\n allergens: menuItem.allergens,\n dietaryFilters: menuItem.dietaryFilters,\n unitPrice: menuItem.customerUnitPrice,\n image,\n addons: addons.length > 0 ? addons : undefined,\n cateringQuantityUnit: menuItem.cateringQuantityUnit || 1,\n feedsPerUnit: menuItem.feedsPerUnit || 1,\n },\n itemTotal: menuItem.customerTotalPrice || 0,\n }];\n}\n\nexport interface LocalMealSession {\n sessionName: string;\n sessionDate: string;\n eventTime: string;\n deliveryFee?: number;\n orderItems: Array<{\n item: {\n id: string;\n menuItemName: string;\n price: string;\n discountPrice?: string;\n isDiscount?: boolean;\n image?: string;\n restaurantId?: string;\n cateringQuantityUnit?: number;\n feedsPerUnit?: number;\n categoryName?: string;\n subcategoryName?: string;\n description?: string;\n allergens?: string[];\n dietaryFilters?: string[];\n selectedAddons?: Array<{\n name: string;\n price: number;\n quantity: number;\n groupTitle?: string;\n allergens?: string | string[];\n dietaryRestrictions?: string[];\n }>;\n };\n quantity: number;\n }>;\n}\n\nconst formatDateForPdf = (dateStr: string | Date): string => {\n const date = typeof dateStr === \"string\" ? new Date(dateStr) : dateStr;\n return date.toLocaleDateString(\"en-GB\", {\n month: \"long\",\n day: \"numeric\",\n });\n};\n\nexport async function transformOrderToPdfData(\n order: CateringOrderResponse,\n showPrices: boolean = true\n): Promise<CateringMenuPdfProps> {\n const sessions: PdfSession[] = [];\n\n // Collect all unique image URLs for batch fetching\n const imageUrls = new Set<string>();\n\n // Gather image URLs from meal sessions or legacy format\n if (order.mealSessions && order.mealSessions.length > 0) {\n for (const session of order.mealSessions) {\n for (const restaurant of session.orderItems || []) {\n for (const menuItem of restaurant.menuItems || []) {\n if (menuItem.menuItemImage) {\n imageUrls.add(menuItem.menuItemImage);\n }\n }\n }\n }\n } else {\n const orderItems = order.restaurants || order.orderItems || [];\n for (const restaurant of orderItems as PricingOrderItem[]) {\n for (const menuItem of restaurant.menuItems || []) {\n if (menuItem.menuItemImage) {\n imageUrls.add(menuItem.menuItemImage);\n }\n }\n }\n }\n\n // Fetch all images in parallel and create a map of URL -> base64\n const imageMap = new Map<string, string | null>();\n if (imageUrls.size > 0) {\n const fetchPromises = Array.from(imageUrls).map(async (url) => {\n const base64 = await fetchImageAsBase64(url);\n imageMap.set(url, base64);\n });\n await Promise.all(fetchPromises);\n }\n\n // Handle multi-meal sessions\n if (order.mealSessions && order.mealSessions.length > 0) {\n const sortedSessions = [...order.mealSessions].sort((a, b) => {\n const dateA = new Date(a.sessionDate);\n const dateB = new Date(b.sessionDate);\n if (dateA.getTime() !== dateB.getTime()) {\n return dateA.getTime() - dateB.getTime();\n }\n return a.eventTime.localeCompare(b.eventTime);\n });\n\n for (const session of sortedSessions) {\n const categoryMap = new Map<string, PdfMenuItem[]>();\n\n // Group items by category across all restaurants in this session\n for (const restaurant of session.orderItems || []) {\n for (const menuItem of restaurant.menuItems || []) {\n const categoryName =\n (menuItem as any).category?.name || (menuItem as any).categoryName || \"Other\";\n\n if (!categoryMap.has(categoryName)) {\n categoryMap.set(categoryName, []);\n }\n\n const processedItems = processMenuItemForPdf(menuItem, imageMap);\n for (const { item } of processedItems) {\n categoryMap.get(categoryName)!.push(item);\n }\n }\n }\n\n const categories: PdfCategory[] = Array.from(categoryMap.entries()).map(\n ([name, items]) => ({ name, items })\n );\n\n sessions.push({\n date: formatDateForPdf(session.sessionDate),\n sessionName: session.sessionName,\n time: session.eventTime,\n categories,\n subtotal: Number(session.subtotal || 0),\n deliveryFee: Number(session.deliveryFee || 0),\n });\n }\n } else {\n // Legacy single-session format\n const categoryMap = new Map<string, PdfMenuItem[]>();\n const orderItems = order.restaurants || order.orderItems || [];\n\n for (const restaurant of orderItems as PricingOrderItem[]) {\n for (const menuItem of restaurant.menuItems || []) {\n const categoryName =\n (menuItem as any).category?.name ||\n (menuItem as any).categoryName ||\n \"Menu Items\";\n\n if (!categoryMap.has(categoryName)) {\n categoryMap.set(categoryName, []);\n }\n\n const processedItems = processMenuItemForPdf(menuItem, imageMap);\n for (const { item } of processedItems) {\n categoryMap.get(categoryName)!.push(item);\n }\n }\n }\n\n const categories: PdfCategory[] = Array.from(categoryMap.entries()).map(\n ([name, items]) => ({ name, items })\n );\n\n sessions.push({\n date: formatDateForPdf(order.eventDate),\n sessionName: \"Menu\",\n time: order.eventTime,\n categories,\n subtotal: Number(order.subtotal || 0),\n deliveryFee: Number(order.deliveryFee || 0),\n });\n }\n\n // Parse numeric fields to ensure they're numbers (decimal columns come as strings from DB)\n const deliveryFee = Number(order.deliveryFee || 0);\n const totalPrice = Number(order.finalTotal || order.customerFinalTotal || 0);\n const promoDiscount = Number(order.promoDiscount || 0);\n const restaurantNameById = Object.fromEntries(\n (order.restaurants || []).map((r) => [r.restaurantId, r.restaurantName])\n );\n // appliedPromotions lives on sessions, not on the order-level response\n const sessionPromotions = (order.mealSessions || []).flatMap((s) =>\n Object.entries(s.appliedPromotions || {})\n );\n // Fall back to order-level appliedPromotions for single-meal orders\n const promotionEntries = sessionPromotions.length > 0\n ? sessionPromotions\n : Object.entries(order.appliedPromotions || {});\n const appliedPromotions = promotionEntries\n .flatMap(([restaurantId, promos]) =>\n promos.map((p) => {\n const restaurantName = restaurantNameById[restaurantId];\n const label = restaurantName ? `${p.name} (${restaurantName})` : p.name;\n return { name: label, discountAmount: Number(p.discountAmount) };\n })\n )\n .filter((p) => p.discountAmount > 0);\n\n return {\n sessions,\n showPrices,\n deliveryCharge: deliveryFee,\n totalPrice,\n promoDiscount: promoDiscount || undefined,\n appliedPromotions: appliedPromotions.length > 0 ? appliedPromotions : undefined,\n logoUrl: \"/Logo_Circle.png\",\n };\n}\n\nasync function convertToJpeg(blob: Blob): Promise<string | null> {\n return new Promise((resolve) => {\n const img = new Image();\n const objectUrl = URL.createObjectURL(blob);\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n URL.revokeObjectURL(objectUrl);\n resolve(null);\n return;\n }\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(objectUrl);\n resolve(canvas.toDataURL('image/jpeg', 0.9));\n };\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve(null);\n };\n img.src = objectUrl;\n });\n}\n\n/**\n * Fetch an image and convert to base64 data URL.\n * Requires the image host (e.g. S3) to serve a CORS header that allows the\n * page origin. WebP images are converted to JPEG for react-pdf compatibility.\n */\nasync function fetchImageAsBase64(url: string): Promise<string | null> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n console.warn(`Failed to fetch image: ${url}`);\n return null;\n }\n const blob = await response.blob();\n\n const isWebP = blob.type === 'image/webp' || url.toLowerCase().endsWith('.webp');\n if (isWebP) {\n return await convertToJpeg(blob);\n }\n\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch (error) {\n console.warn(`Error fetching image ${url}:`, error);\n return null;\n }\n}\n\nexport async function transformLocalSessionsToPdfData(\n mealSessions: LocalMealSession[],\n showPrices: boolean = true,\n deliveryFee?: number,\n promoDiscount?: number,\n appliedPromotions?: { name: string; discountAmount: number }[]\n): Promise<CateringMenuPdfProps> {\n const sessions: PdfSession[] = [];\n let grandTotal = 0;\n\n const sortedSessions = [...mealSessions]\n .filter((s) => s.orderItems.length > 0)\n .sort((a, b) => {\n if (!a.sessionDate || !b.sessionDate) return 0;\n const dateA = new Date(a.sessionDate);\n const dateB = new Date(b.sessionDate);\n if (dateA.getTime() !== dateB.getTime()) {\n return dateA.getTime() - dateB.getTime();\n }\n return (a.eventTime || \"\").localeCompare(b.eventTime || \"\");\n });\n\n // Collect all unique image URLs for batch fetching\n const imageUrls = new Set<string>();\n for (const session of sortedSessions) {\n for (const orderItem of session.orderItems) {\n const imageUrl = (orderItem.item as any).image;\n if (imageUrl) {\n imageUrls.add(imageUrl);\n }\n }\n }\n\n const imageMap = new Map<string, string | null>();\n if (imageUrls.size > 0) {\n const fetchPromises = Array.from(imageUrls).map(async (url) => {\n const base64 = await fetchImageAsBase64(url);\n imageMap.set(url, base64);\n });\n await Promise.all(fetchPromises);\n }\n\n for (const session of sortedSessions) {\n const categoryMap = new Map<string, PdfMenuItem[]>();\n let sessionTotal = 0;\n\n for (const orderItem of session.orderItems) {\n const item = orderItem.item;\n const categoryName = (item as any).categoryName || \"Menu Items\";\n\n if (!categoryMap.has(categoryName)) {\n categoryMap.set(categoryName, []);\n }\n\n const price = parseFloat((item as any).price || \"0\");\n const discountPrice = parseFloat((item as any).discountPrice || \"0\");\n const unitPrice =\n (item as any).isDiscount && discountPrice > 0 ? discountPrice : price;\n const addonTotal = ((item as any).selectedAddons || []).reduce(\n (sum: number, addon: any) => sum + (addon.customerUnitPrice || addon.price || 0) * (addon.quantity || 0),\n 0\n );\n const itemTotal = (unitPrice * orderItem.quantity) + addonTotal;\n sessionTotal += itemTotal;\n\n const originalImageUrl = (item as any).image;\n const base64Image = originalImageUrl ? imageMap.get(originalImageUrl) : null;\n\n const addons = (item as any).selectedAddons?.map((addon: any) => ({\n name: addon.name,\n quantity: addon.quantity || 1,\n price: addon.customerUnitPrice || addon.price || 0,\n groupTitle: addon.groupTitle,\n allergens: addon.allergens,\n dietaryRestrictions: addon.dietaryRestrictions,\n }));\n\n categoryMap.get(categoryName)!.push({\n quantity: orderItem.quantity,\n name: (item as any).menuItemName,\n description: (item as any).description,\n allergens: (item as any).allergens,\n dietaryFilters: (item as any).dietaryFilters || [],\n unitPrice,\n image: base64Image || originalImageUrl,\n addons: addons?.length > 0 ? addons : undefined,\n cateringQuantityUnit: (item as any).cateringQuantityUnit || 1,\n feedsPerUnit: (item as any).feedsPerUnit || 1,\n });\n }\n\n grandTotal += sessionTotal;\n\n const categories: PdfCategory[] = Array.from(categoryMap.entries()).map(\n ([name, items]) => ({ name, items })\n );\n\n sessions.push({\n date: session.sessionDate\n ? formatDateForPdf(session.sessionDate)\n : \"Date TBD\",\n sessionName: session.sessionName || \"Menu\",\n time: session.eventTime || \"\",\n categories,\n subtotal: sessionTotal,\n deliveryFee: session.deliveryFee,\n });\n }\n\n const derivedDeliveryFee = sessions.reduce(\n (sum, session) => sum + (session.deliveryFee || 0),\n 0\n );\n const resolvedDeliveryFee =\n deliveryFee !== undefined ? deliveryFee : derivedDeliveryFee || undefined;\n\n const totalWithDelivery = grandTotal + (resolvedDeliveryFee || 0);\n\n const totalPromotionDiscount = (appliedPromotions || []).reduce((s, p) => s + p.discountAmount, 0);\n\n return {\n sessions,\n showPrices,\n deliveryCharge: resolvedDeliveryFee,\n totalPrice: totalWithDelivery - (promoDiscount || 0) - totalPromotionDiscount,\n promoDiscount: promoDiscount || undefined,\n appliedPromotions: appliedPromotions?.length ? appliedPromotions : undefined,\n logoUrl: \"/Logo_Circle.png\",\n };\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n Document,\n Page,\n Text,\n View,\n Image,\n StyleSheet,\n} from \"@react-pdf/renderer\";\n\n// =============================================================================\n// FONT CONFIGURATION - Editorial Style\n// =============================================================================\n// Using Helvetica (built-in) for clean editorial typography\nconst FONT_FAMILY = \"Helvetica\";\nconst FONT_FAMILY_BOLD = \"Helvetica-Bold\";\nconst FONT_FAMILY_OBLIQUE = \"Helvetica-Oblique\";\nconst FONT_FAMILY_BOLD_OBLIQUE = \"Helvetica-BoldOblique\";\n\n// Helper to format allergen names (e.g., \"cereals_containing_gluten\" -> \"Cereals Containing Gluten\")\nconst formatAllergen = (allergen: string): string => {\n return allergen\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n\n// Helper to normalize and format allergens (handles both string and array input)\nconst formatAllergens = (allergens: string | string[] | undefined): string => {\n if (!allergens) return \"\";\n\n // If it's a string, it might be comma-separated or a single allergen\n const allergenArray = typeof allergens === \"string\"\n ? allergens.split(\",\").map(a => a.trim())\n : allergens;\n\n return allergenArray.map(formatAllergen).join(\", \");\n};\n\n// Dietary filter configuration with colors and abbreviations (Editorial style colors)\nconst DIETARY_CONFIG: Record<string, { abbrev: string; label: string; color: string; bgColor: string }> = {\n vegetarian: { abbrev: \"V\", label: \"Vegetarian\", color: \"#fff\", bgColor: \"#8dc63f\" },\n vegan: { abbrev: \"VG\", label: \"Vegan\", color: \"#fff\", bgColor: \"#00a651\" },\n halal: { abbrev: \"H\", label: \"Halal\", color: \"#fff\", bgColor: \"#00a651\" },\n pescatarian: { abbrev: \"P\", label: \"Pescatarian\", color: \"#fff\", bgColor: \"#3b82f6\" },\n no_nut: { abbrev: \"NN\", label: \"No Nuts\", color: \"#fff\", bgColor: \"#f97316\" },\n no_dairy: { abbrev: \"ND\", label: \"No Dairy\", color: \"#fff\", bgColor: \"#a855f7\" },\n no_gluten: { abbrev: \"GF\", label: \"Gluten Free\", color: \"#fff\", bgColor: \"#a16207\" },\n nonvegetarian: { abbrev: \"NV\", label: \"Non-Veg\", color: \"#fff\", bgColor: \"#ee3b2b\" },\n};\n\n// Get all unique dietary filters from sessions for the legend\nconst getAllDietaryFilters = (sessions: PdfSession[]): string[] => {\n console.log(\"sessions\", JSON.stringify(sessions, null, 2))\n const filters = new Set<string>();\n sessions.forEach(session => {\n session.categories.forEach(category => {\n category.items.forEach(item => {\n // Check item dietary filters\n if (item.dietaryFilters) {\n item.dietaryFilters.forEach(filter => {\n const key = filter.toLowerCase();\n if (DIETARY_CONFIG[key]) {\n filters.add(key);\n }\n });\n }\n // Check addon dietary restrictions\n if (item.addons) {\n item.addons.forEach(addon => {\n if (addon.dietaryRestrictions) {\n addon.dietaryRestrictions.forEach(filter => {\n const key = filter.toLowerCase();\n if (DIETARY_CONFIG[key]) {\n filters.add(key);\n }\n });\n }\n });\n }\n });\n });\n });\n return Array.from(filters);\n};\n// =============================================================================\n\n// Types\nexport interface PdfAddon {\n name: string;\n quantity: number;\n price?: number;\n groupTitle?: string;\n allergens?: string | string[];\n dietaryRestrictions?: string[];\n}\n\nexport interface PdfMenuItem {\n quantity: number;\n name: string;\n description?: string;\n allergens?: string | string[];\n dietaryFilters?: string[];\n unitPrice?: number;\n image?: string;\n addons?: PdfAddon[];\n cateringQuantityUnit?: number;\n feedsPerUnit?: number;\n}\n\nexport interface PdfCategory {\n name: string;\n items: PdfMenuItem[];\n}\n\nexport interface PdfSession {\n date: string;\n sessionName: string;\n time: string;\n categories: PdfCategory[];\n subtotal?: number;\n deliveryFee?: number;\n}\n\nexport interface PdfAppliedPromotion {\n name: string;\n discountAmount: number;\n}\n\nexport interface CateringMenuPdfProps {\n sessions: PdfSession[];\n showPrices: boolean;\n deliveryCharge?: number;\n totalPrice?: number;\n promoDiscount?: number;\n appliedPromotions?: PdfAppliedPromotion[];\n logoUrl?: string;\n}\n\n// =============================================================================\n// EDITORIAL STYLES - Magazine/Print Design\n// =============================================================================\nconst styles = StyleSheet.create({\n // Page Styles\n page: {\n backgroundColor: \"#fdfdfd\",\n padding: 48,\n paddingBottom: 70,\n fontFamily: FONT_FAMILY,\n },\n menuPage: {\n backgroundColor: \"#fdfdfd\",\n padding: 48,\n paddingBottom: 70,\n fontFamily: FONT_FAMILY,\n },\n\n // Day Section\n daySection: {\n marginBottom: 50,\n },\n dayHeader: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"flex-end\",\n borderBottomWidth: 2,\n borderBottomColor: \"#000\",\n paddingBottom: 4,\n marginBottom: 24,\n },\n dayTitle: {\n fontSize: 18,\n fontFamily: FONT_FAMILY_BOLD_OBLIQUE,\n textTransform: \"uppercase\",\n letterSpacing: -0.3,\n },\n dayLabel: {\n fontSize: 8,\n fontFamily: FONT_FAMILY_BOLD,\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n letterSpacing: 2,\n },\n\n // Session Header\n sessionHeader: {\n flexDirection: \"row\",\n alignItems: \"flex-end\",\n marginBottom: 20,\n },\n sessionTitle: {\n fontSize: 28,\n fontFamily: FONT_FAMILY_BOLD,\n textTransform: \"uppercase\",\n letterSpacing: -0.5,\n },\n sessionTime: {\n fontSize: 14,\n fontFamily: FONT_FAMILY_OBLIQUE,\n color: \"#9ca3af\",\n marginLeft: 12,\n marginBottom: 2,\n },\n\n // Category Header\n categoryHeader: {\n fontSize: 10,\n fontFamily: FONT_FAMILY_BOLD,\n marginBottom: 16,\n marginTop: 12,\n textTransform: \"uppercase\",\n letterSpacing: 1,\n textDecoration: \"underline\",\n },\n\n // Menu Item - Editorial Layout\n menuItem: {\n flexDirection: \"row\",\n marginBottom: 28,\n paddingBottom: 20,\n },\n menuItemContent: {\n flex: 1,\n paddingRight: 16,\n },\n menuItemName: {\n fontSize: 14,\n fontFamily: FONT_FAMILY_BOLD,\n textTransform: \"uppercase\",\n letterSpacing: -0.3,\n marginBottom: 4,\n },\n menuItemDescription: {\n fontSize: 10,\n fontFamily: FONT_FAMILY_OBLIQUE,\n color: \"#4b5563\",\n marginBottom: 8,\n lineHeight: 1.4,\n },\n\n // Add-ons Container - Editorial Style\n addonsContainer: {\n marginTop: 8,\n marginBottom: 8,\n paddingLeft: 8,\n paddingVertical: 8,\n backgroundColor: \"#f9fafb\",\n borderLeftWidth: 2,\n borderLeftColor: \"rgba(0,0,0,0.1)\",\n },\n addonsSection: {\n marginBottom: 4,\n },\n addonsSectionHeader: {\n fontSize: 8,\n fontFamily: FONT_FAMILY_BOLD,\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n letterSpacing: 2,\n marginBottom: 4,\n },\n addonRow: {\n flexDirection: \"row\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n marginBottom: 2,\n },\n addonBullet: {\n fontSize: 9,\n color: \"#4b5563\",\n marginRight: 4,\n },\n addonText: {\n fontSize: 9,\n color: \"#374151\",\n },\n addonDietaryBadges: {\n flexDirection: \"row\",\n alignItems: \"center\",\n marginLeft: 4,\n },\n addonDietaryBadge: {\n width: 14,\n height: 14,\n borderRadius: 2,\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 2,\n },\n addonDietaryBadgeText: {\n fontSize: 6,\n fontFamily: FONT_FAMILY_BOLD,\n color: \"#fff\",\n },\n addonAllergenText: {\n fontSize: 9,\n color: \"#6b7280\",\n marginLeft: 4,\n },\n\n // Main Item Allergen\n mainItemAllergenContainer: {\n marginTop: 8,\n marginBottom: 6,\n },\n mainItemAllergenLabel: {\n fontSize: 9,\n fontFamily: FONT_FAMILY_BOLD,\n textTransform: \"uppercase\",\n letterSpacing: 0.5,\n },\n mainItemAllergenText: {\n fontSize: 9,\n fontFamily: FONT_FAMILY_BOLD,\n },\n\n // Dietary Badges\n menuItemDietaryFilters: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n marginBottom: 8,\n marginTop: 4,\n },\n dietaryBadge: {\n width: 18,\n height: 18,\n borderRadius: 2,\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 4,\n },\n dietaryBadgeText: {\n fontSize: 7,\n fontFamily: FONT_FAMILY_BOLD,\n color: \"#fff\",\n },\n\n // Portions & Price\n menuItemPortions: {\n fontSize: 9,\n color: \"#9ca3af\",\n marginTop: 4,\n },\n menuItemPrice: {\n flexDirection: \"row\",\n marginTop: 2,\n },\n menuItemPriceLabel: {\n fontSize: 10,\n fontFamily: FONT_FAMILY_BOLD_OBLIQUE,\n letterSpacing: -0.3,\n },\n menuItemPriceValue: {\n fontSize: 10,\n fontFamily: FONT_FAMILY_BOLD_OBLIQUE,\n letterSpacing: -0.3,\n },\n\n // Menu Item Image\n menuItemImage: {\n width: 100,\n height: 65,\n objectFit: \"cover\",\n borderWidth: 1,\n borderColor: \"#e5e7eb\",\n },\n\n // Session Subtotal\n subtotalContainer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n marginTop: 16,\n marginBottom: 32,\n paddingTop: 12,\n borderTopWidth: 2,\n borderTopColor: \"#000\",\n },\n subtotalText: {\n fontSize: 12,\n fontFamily: FONT_FAMILY_BOLD,\n },\n deliveryFeeText: {\n fontSize: 9,\n fontFamily: FONT_FAMILY_OBLIQUE,\n color: \"#9ca3af\",\n marginTop: 6,\n },\n\n // Totals Container - Full Width Editorial Style\n totalsContainer: {\n marginTop: 40,\n paddingTop: 20,\n },\n totalsRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n marginBottom: 16,\n },\n totalsLabel: {\n fontSize: 24,\n fontFamily: FONT_FAMILY_BOLD_OBLIQUE,\n textTransform: \"uppercase\",\n letterSpacing: -0.5,\n },\n totalsValue: {\n fontSize: 24,\n fontFamily: FONT_FAMILY_BOLD_OBLIQUE,\n letterSpacing: -0.5,\n },\n totalsBreakdown: {\n borderTopWidth: 1,\n borderTopColor: \"#e5e7eb\",\n borderBottomWidth: 1,\n borderBottomColor: \"#e5e7eb\",\n paddingVertical: 16,\n marginBottom: 20,\n },\n totalsBreakdownRow: {\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n marginBottom: 6,\n },\n totalsBreakdownLabel: {\n fontSize: 11,\n fontFamily: FONT_FAMILY_BOLD,\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n letterSpacing: 2,\n },\n totalsBreakdownValue: {\n fontSize: 11,\n fontFamily: FONT_FAMILY_BOLD,\n },\n totalsBreakdownValueItalic: {\n fontSize: 11,\n fontFamily: FONT_FAMILY_OBLIQUE,\n color: \"#9ca3af\",\n },\n grandTotalContainer: {\n alignItems: \"flex-end\",\n marginTop: 16,\n },\n grandTotalLabel: {\n fontSize: 8,\n fontFamily: FONT_FAMILY_BOLD,\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n letterSpacing: 3,\n marginBottom: 4,\n textAlign: \"right\",\n },\n grandTotalValue: {\n fontSize: 28,\n fontFamily: FONT_FAMILY_BOLD_OBLIQUE,\n letterSpacing: -0.5,\n textAlign: \"right\",\n },\n\n // Footer - Editorial Style\n footer: {\n position: \"absolute\",\n bottom: 30,\n left: 48,\n right: 48,\n },\n dietaryLegend: {\n flexDirection: \"row\",\n flexWrap: \"wrap\",\n marginBottom: 6,\n },\n footerDivider: {\n height: 0.5,\n backgroundColor: \"#d1d5db\",\n marginBottom: 10,\n },\n dietaryLegendItem: {\n flexDirection: \"row\",\n alignItems: \"center\",\n marginRight: 16,\n marginBottom: 4,\n },\n dietaryLegendBadge: {\n width: 14,\n height: 14,\n borderRadius: 2,\n alignItems: \"center\",\n justifyContent: \"center\",\n marginRight: 4,\n },\n dietaryLegendText: {\n fontSize: 8,\n fontFamily: FONT_FAMILY_BOLD,\n textTransform: \"uppercase\",\n letterSpacing: 1,\n },\n footerText: {\n fontSize: 8,\n fontFamily: FONT_FAMILY_OBLIQUE,\n color: \"#666\",\n },\n});\n\n// Cover Page Component - Using pre-designed image\nconst CoverPage: React.FC = () => (\n <Page size=\"A4\">\n <Image src=\"/Swift_PDF_Cover_Page.png\" style={{ width: \"100%\", height: \"100%\" }} />\n </Page>\n);\n\n// Original Cover Page Component (commented out)\n// const CoverPageOriginal: React.FC<{ logoUrl?: string }> = ({ logoUrl }) => (\n// <Page size=\"A4\" style={styles.coverPage}>\n// <Text style={styles.coverTitle}>FOOD CATERING MENU</Text>\n// <View style={styles.coverTitleUnderline} />\n// {logoUrl && <Image src={logoUrl} style={styles.coverLogo} />}\n// <View style={styles.coverTagline}>\n// <Text style={styles.coverTaglineText}>Local</Text>\n// <Text style={styles.coverTaglineText}>Simple</Text>\n// <Text style={styles.coverTaglineText}>Reliable</Text>\n// </View>\n// <Text style={styles.coverBrandName}>SWIFT FOOD</Text>\n// </Page>\n// );\n\n// Menu Item Component - Editorial Style\nconst MenuItem: React.FC<{ item: PdfMenuItem; showPrice: boolean }> = ({\n item,\n showPrice,\n}) => {\n // Group addons by groupTitle\n const groupedAddons: Record<string, PdfAddon[]> = {};\n if (item.addons && item.addons.length > 0) {\n item.addons.forEach((addon) => {\n const group = addon.groupTitle || \"Add-Ons\";\n if (!groupedAddons[group]) {\n groupedAddons[group] = [];\n }\n groupedAddons[group].push(addon);\n });\n }\n\n // Calculate portions and serves\n const cateringQuantityUnit = item.cateringQuantityUnit || 1;\n const feedsPerUnit = item.feedsPerUnit || 1;\n const numPortions = Math.round(item.quantity / cateringQuantityUnit);\n const totalServes = Math.round(item.quantity * feedsPerUnit);\n\n // Check if item has allergens\n const hasItemAllergens = item.allergens && (\n Array.isArray(item.allergens) ? item.allergens.length > 0 : item.allergens.trim() !== \"\"\n );\n\n return (\n <View style={styles.menuItem} wrap={false}>\n <View style={styles.menuItemContent}>\n {/* Item Name & Quantity */}\n <Text style={styles.menuItemName}>\n {item.quantity}x {item.name}\n </Text>\n\n {/* Description */}\n {item.description && (\n <Text style={styles.menuItemDescription}>{item.description}</Text>\n )}\n\n {/* Add-ons Section */}\n {Object.keys(groupedAddons).length > 0 && (\n <View style={styles.addonsContainer}>\n {Object.entries(groupedAddons).map(([groupTitle, addons]) => (\n <View key={groupTitle} style={styles.addonsSection}>\n <Text style={styles.addonsSectionHeader}>{groupTitle}</Text>\n {addons.map((addon, idx) => {\n const hasAddonAllergens = addon.allergens && (\n Array.isArray(addon.allergens) ? addon.allergens.length > 0 : addon.allergens.trim() !== \"\"\n );\n const hasDietary = addon.dietaryRestrictions && addon.dietaryRestrictions.length > 0;\n return (\n <View key={idx} style={styles.addonRow}>\n <Text style={styles.addonBullet}>•</Text>\n <Text style={styles.addonText}>\n {addon.quantity > 1 ? `${addon.quantity}x ` : \"\"}{addon.name}\n {showPrice && addon.price !== undefined && addon.price > 0 && (\n <Text style={{ fontFamily: FONT_FAMILY_BOLD }}> - £{(addon.price * (addon.quantity || 1)).toFixed(2)}</Text>\n )}\n </Text>\n {hasDietary && (\n <View style={styles.addonDietaryBadges}>\n {addon.dietaryRestrictions!.map((filter, filterIdx) => {\n const config = DIETARY_CONFIG[filter.toLowerCase()];\n if (!config) return null;\n return (\n <View key={filterIdx} style={[styles.addonDietaryBadge, { backgroundColor: config.bgColor }]}>\n <Text style={styles.addonDietaryBadgeText}>{config.abbrev}</Text>\n </View>\n );\n })}\n </View>\n )}\n {hasAddonAllergens && (\n <Text style={styles.addonAllergenText}>(Allergen: {formatAllergens(addon.allergens)})</Text>\n )}\n </View>\n );\n })}\n </View>\n ))}\n </View>\n )}\n\n {/* Main Item Allergen - only show if has allergens */}\n {hasItemAllergens && (\n <View style={styles.mainItemAllergenContainer}>\n <Text>\n <Text style={styles.mainItemAllergenLabel}>Allergen: </Text>\n <Text style={styles.mainItemAllergenText}>{formatAllergens(item.allergens)}</Text>\n </Text>\n </View>\n )}\n\n {/* Dietary Badges */}\n {item.dietaryFilters && item.dietaryFilters.length > 0 && (\n <View style={styles.menuItemDietaryFilters}>\n {item.dietaryFilters.map((filter, idx) => {\n const config = DIETARY_CONFIG[filter.toLowerCase()];\n if (!config) return null;\n return (\n <View key={idx} style={[styles.dietaryBadge, { backgroundColor: config.bgColor }]}>\n <Text style={styles.dietaryBadgeText}>{config.abbrev}</Text>\n </View>\n );\n })}\n </View>\n )}\n\n {/* Portions & Price */}\n <Text style={styles.menuItemPortions}>\n {numPortions} portion{numPortions !== 1 ? \"s\" : \"\"} • Serves ~{totalServes} attendees\n </Text>\n {showPrice && item.unitPrice !== undefined && (\n <View style={styles.menuItemPrice}>\n <Text style={styles.menuItemPriceLabel}>Unit </Text>\n <Text style={styles.menuItemPriceValue}>\n £{item.unitPrice === 0 ? \"FREE\" : item.unitPrice.toFixed(2)}\n </Text>\n </View>\n )}\n </View>\n\n {/* Item Image */}\n {item.image && <Image src={item.image} style={styles.menuItemImage} />}\n </View>\n );\n};\n\n// Helper to group sessions by date\nconst groupSessionsByDate = (sessions: PdfSession[]) => {\n const groups: Record<string, PdfSession[]> = {};\n sessions.forEach(session => {\n const date = session.date;\n if (!groups[date]) groups[date] = [];\n groups[date].push(session);\n });\n return Object.keys(groups)\n .sort((a, b) => new Date(a).getTime() - new Date(b).getTime())\n .map((date, idx) => ({\n date,\n dayNumber: idx + 1,\n sessions: groups[date]\n }));\n};\n\n// Helper to format time with AM/PM\nconst formatTimeWithAmPm = (time: string): string => {\n if (!time) return \"\";\n // If already has AM/PM, return as is\n if (time.toLowerCase().includes(\"am\") || time.toLowerCase().includes(\"pm\")) {\n return time;\n }\n // Parse HH:MM format\n const [hours, minutes] = time.split(\":\").map(Number);\n if (isNaN(hours)) return time;\n const period = hours >= 12 ? \"PM\" : \"AM\";\n const displayHours = hours % 12 || 12;\n return `${displayHours}:${minutes?.toString().padStart(2, \"0\") || \"00\"} ${period}`;\n};\n\n// Session Page Component - Each session gets its own page\nconst SessionPage: React.FC<{\n session: PdfSession;\n dayDate: string;\n dayNumber: number;\n showPrices: boolean;\n allSessions: PdfSession[];\n isLastSession: boolean;\n deliveryCharge?: number;\n totalPrice?: number;\n promoDiscount?: number;\n appliedPromotions?: PdfAppliedPromotion[];\n}> = ({ session, dayDate, dayNumber, showPrices, allSessions, isLastSession, deliveryCharge, totalPrice, promoDiscount, appliedPromotions }) => {\n const totalCatering = allSessions.reduce((sum, s) => sum + (s.subtotal || 0), 0);\n\n return (\n <Page size=\"A4\" style={styles.menuPage} wrap>\n {/* Day Header */}\n <View style={styles.dayHeader} wrap={false}>\n <Text style={styles.dayTitle}>{dayDate}</Text>\n <Text style={styles.dayLabel}>Day {dayNumber}</Text>\n </View>\n\n {/* Session Header */}\n <View style={styles.sessionHeader} wrap={false} minPresenceAhead={150}>\n <Text style={styles.sessionTitle}>{session.sessionName}</Text>\n <Text style={styles.sessionTime}>{formatTimeWithAmPm(session.time)}</Text>\n </View>\n\n {/* Categories */}\n {session.categories.map((category, catIndex) => (\n <View key={catIndex}>\n {session.categories.length > 1 && (\n <Text style={styles.categoryHeader} minPresenceAhead={100}>{category.name}</Text>\n )}\n {category.items.map((item, itemIndex) => (\n <MenuItem key={itemIndex} item={item} showPrice={showPrices} />\n ))}\n </View>\n ))}\n\n {/* Session Subtotal */}\n {showPrices && session.subtotal !== undefined && (\n <View style={styles.subtotalContainer} wrap={false}>\n <View style={{ alignItems: \"flex-end\" }}>\n <Text style={styles.subtotalText}>\n Subtotal: £{session.subtotal.toFixed(2)}\n </Text>\n <Text style={styles.deliveryFeeText}>\n Delivery Fee: {session.deliveryFee !== undefined ? `£${session.deliveryFee.toFixed(2)}` : \"TBC\"}\n </Text>\n </View>\n </View>\n )}\n\n {/* Grand Totals - Only on last session */}\n {isLastSession && showPrices && (\n <View style={styles.totalsContainer} wrap={false}>\n <View style={styles.totalsBreakdown}>\n <View style={styles.totalsBreakdownRow}>\n <Text style={styles.totalsBreakdownLabel}>Catering Total</Text>\n <Text style={styles.totalsBreakdownValue}>£{totalCatering.toFixed(2)}</Text>\n </View>\n {(appliedPromotions || []).map((promo, i) => (\n <View key={i} style={styles.totalsBreakdownRow}>\n <Text style={[styles.totalsBreakdownLabel, { color: \"#16a34a\" }]}>{promo.name}</Text>\n <Text style={[styles.totalsBreakdownValue, { color: \"#16a34a\" }]}>-£{promo.discountAmount.toFixed(2)}</Text>\n </View>\n ))}\n {(promoDiscount ?? 0) > 0 && (\n <View style={styles.totalsBreakdownRow}>\n <Text style={[styles.totalsBreakdownLabel, { color: \"#16a34a\" }]}>Promo Code</Text>\n <Text style={[styles.totalsBreakdownValue, { color: \"#16a34a\" }]}>-£{promoDiscount!.toFixed(2)}</Text>\n </View>\n )}\n <View style={styles.totalsBreakdownRow}>\n <Text style={styles.totalsBreakdownLabel}>Logistics / Delivery</Text>\n <Text style={styles.totalsBreakdownValueItalic}>\n {deliveryCharge !== undefined ? `£${deliveryCharge.toFixed(2)}` : \"Estimated\"}\n </Text>\n </View>\n </View>\n\n <View style={styles.grandTotalContainer}>\n <Text style={styles.grandTotalLabel}>\n {deliveryCharge !== undefined ? \"Grand Total\" : \"Estimated Grand Total\"}\n </Text>\n <Text style={styles.grandTotalValue}>\n {deliveryCharge !== undefined && totalPrice !== undefined\n ? `£${totalPrice.toFixed(2)}`\n : deliveryCharge !== undefined\n ? `£${(totalCatering + deliveryCharge - (promoDiscount || 0) - (appliedPromotions || []).reduce((s, p) => s + p.discountAmount, 0)).toFixed(2)}`\n : `£${totalCatering.toFixed(2)} + TBC`}\n </Text>\n </View>\n </View>\n )}\n\n {/* Footer */}\n <View style={styles.footer} fixed>\n <View style={styles.footerDivider} />\n {getAllDietaryFilters(allSessions).length > 0 && (\n <View style={styles.dietaryLegend}>\n {getAllDietaryFilters(allSessions).map((filterKey) => {\n const config = DIETARY_CONFIG[filterKey];\n if (!config) return null;\n return (\n <View key={filterKey} style={styles.dietaryLegendItem}>\n <View style={[styles.dietaryLegendBadge, { backgroundColor: config.bgColor }]}>\n <Text style={[styles.dietaryBadgeText, { fontSize: 6 }]}>{config.abbrev}</Text>\n </View>\n <Text style={styles.dietaryLegendText}>{config.label}</Text>\n </View>\n );\n })}\n </View>\n )}\n <Text style={styles.footerText}>\n *Images are for illustrative purposes only. Actual dishes may vary in appearance, portion size, and presentation due to preparation and ingredient differences.\n </Text>\n </View>\n </Page>\n );\n};\n\n// Main Document Component\nexport const CateringMenuPdf: React.FC<CateringMenuPdfProps> = ({\n sessions,\n showPrices,\n deliveryCharge,\n totalPrice,\n promoDiscount,\n appliedPromotions,\n}) => {\n const groupedByDay = groupSessionsByDate(sessions);\n\n // Flatten all sessions to determine which is last\n const allSessionsFlat = groupedByDay.flatMap((day) =>\n day.sessions.map((session, sessionIndex) => ({\n session,\n dayDate: day.date,\n dayNumber: day.dayNumber,\n key: `${day.date}-${sessionIndex}`,\n }))\n );\n\n return (\n <Document>\n <CoverPage />\n {/* Each session gets its own page */}\n {allSessionsFlat.map((item, index) => (\n <SessionPage\n key={item.key}\n session={item.session}\n dayDate={item.dayDate}\n dayNumber={item.dayNumber}\n showPrices={showPrices}\n allSessions={sessions}\n isLastSession={index === allSessionsFlat.length - 1}\n deliveryCharge={deliveryCharge}\n totalPrice={totalPrice}\n promoDiscount={promoDiscount}\n appliedPromotions={appliedPromotions}\n />\n ))}\n </Document>\n );\n};\n\nexport default CateringMenuPdf;\n","import type { Restaurant } from \"../types/restaurant\";\nimport type { MealSessionState } from \"../types/session\";\n\nexport interface SectionQuantity {\n section: string;\n currentQuantity: number;\n minQuantity: number;\n isMet: boolean;\n isRequired: boolean;\n}\n\nexport interface RestaurantMinOrderStatus {\n restaurantId: string;\n restaurantName: string;\n isValid: boolean;\n sections: SectionQuantity[];\n}\n\n/**\n * Calculate the quantity of items per section (groupTitle) for a given restaurant in a session\n */\nfunction getSectionQuantities(\n session: MealSessionState,\n restaurantId: string\n): Record<string, number> {\n const quantities: Record<string, number> = {};\n\n session.orderItems.forEach((orderItem) => {\n if (orderItem.item.restaurantId === restaurantId) {\n const section = orderItem.item.groupTitle || \"Other\";\n quantities[section] = (quantities[section] || 0) + orderItem.quantity;\n }\n });\n\n return quantities;\n}\n\n/**\n * Validate minimum order requirements for a specific restaurant in a session\n */\nexport function validateRestaurantMinOrders(\n session: MealSessionState,\n restaurant: Restaurant\n): RestaurantMinOrderStatus {\n const restaurantId = restaurant.id;\n const restaurantName = restaurant.restaurant_name;\n const minOrderSettings = restaurant.cateringMinOrderSettings;\n\n // If no settings or no items from this restaurant, return valid\n const hasItemsFromRestaurant = session.orderItems.some(\n (item) => item.item.restaurantId === restaurantId\n );\n\n if (!minOrderSettings || !hasItemsFromRestaurant) {\n return {\n restaurantId,\n restaurantName,\n isValid: true,\n sections: [],\n };\n }\n\n const sectionQuantities = getSectionQuantities(session, restaurantId);\n const sections: SectionQuantity[] = [];\n let isValid = true;\n\n // Check required sections\n if (minOrderSettings.required) {\n minOrderSettings.required.forEach((rule) => {\n rule.applicableSections.forEach((section) => {\n const currentQuantity = sectionQuantities[section] || 0;\n const isMet = currentQuantity >= rule.minQuantity;\n\n sections.push({\n section,\n currentQuantity,\n minQuantity: rule.minQuantity,\n isMet,\n isRequired: true,\n });\n\n if (!isMet) {\n isValid = false;\n }\n });\n });\n }\n\n // Check optional sections (only if items from that section are present)\n if (minOrderSettings.optional) {\n minOrderSettings.optional.forEach((rule) => {\n rule.applicableSections.forEach((section) => {\n const currentQuantity = sectionQuantities[section] || 0;\n\n // Only validate if there are items from this section\n if (currentQuantity > 0) {\n const isMet = currentQuantity >= rule.minQuantity;\n\n sections.push({\n section,\n currentQuantity,\n minQuantity: rule.minQuantity,\n isMet,\n isRequired: false,\n });\n\n if (!isMet) {\n isValid = false;\n }\n }\n });\n });\n }\n\n return {\n restaurantId,\n restaurantName,\n isValid,\n sections,\n };\n}\n\n/**\n * Validate all restaurants in a session\n */\nexport function validateSessionMinOrders(\n session: MealSessionState,\n restaurants: Restaurant[]\n): RestaurantMinOrderStatus[] {\n // Get unique restaurant IDs in the session\n const restaurantIdsInSession = new Set(\n session.orderItems.map((item) => item.item.restaurantId)\n );\n\n // Filter to only restaurants that have items in this session\n const relevantRestaurants = restaurants.filter((r) =>\n restaurantIdsInSession.has(r.id)\n );\n\n return relevantRestaurants.map((restaurant) =>\n validateRestaurantMinOrders(session, restaurant)\n );\n}\n\n/**\n * Check if a session is valid (all minimum order requirements met)\n */\nexport function isSessionValid(\n session: MealSessionState,\n restaurants: Restaurant[]\n): boolean {\n const validations = validateSessionMinOrders(session, restaurants);\n return validations.every((v) => v.isValid);\n}\n\n/**\n * Get a user-friendly message for unmet requirements\n */\nexport function getMinOrderMessage(status: RestaurantMinOrderStatus): string {\n if (status.isValid) return \"\";\n\n const unmetSections = status.sections.filter((s) => !s.isMet);\n\n if (unmetSections.length === 0) return \"\";\n\n const messages = unmetSections.map((section) => {\n const remaining = section.minQuantity - section.currentQuantity;\n const requiredText = section.isRequired ? \"Required\" : \"Minimum\";\n return `${section.section}: ${requiredText} ${section.minQuantity}, currently ${section.currentQuantity} (need ${remaining} more)`;\n });\n\n return messages.join(\" • \");\n}\n","import { MealSessionState } from \"../types/session\";\nimport { MenuItemDetails, MenuItem } from \"../types/menu\";\nimport { DayGroup } from \"./types\";\n\n// Time slot options: 30-minute ranges from 07:00 to 20:30 in 12h format\nconst to12h = (totalMins: number) => {\n const h = Math.floor(totalMins / 60);\n const m = totalMins % 60;\n const period = h >= 12 ? \"pm\" : \"am\";\n const h12 = h % 12 || 12;\n return `${h12}:${String(m).padStart(2, \"0\")}${period}`;\n};\n\nexport const TIME_SLOT_OPTIONS = (() => {\n const slots: { label: string; value: string }[] = [];\n for (let startMins = 7 * 60; startMins <= 20 * 60; startMins += 30) {\n const endMins = startMins + 30;\n const sH = String(Math.floor(startMins / 60)).padStart(2, \"0\");\n const sM = String(startMins % 60).padStart(2, \"0\");\n slots.push({ label: `${to12h(startMins)} - ${to12h(endMins)}`, value: `${sH}:${sM}` });\n }\n return slots;\n})();\n\n/**\n * Groups meal sessions by date for timeline display\n */\nexport function groupSessionsByDay(\n sessions: MealSessionState[],\n getSessionTotal: (index: number) => number\n): DayGroup[] {\n const groups: Map<string, DayGroup> = new Map();\n\n sessions.forEach((session, index) => {\n const date = session.sessionDate || \"unscheduled\";\n if (!groups.has(date)) {\n const dateObj =\n date !== \"unscheduled\" ? new Date(date + \"T00:00:00\") : null;\n groups.set(date, {\n date,\n displayDate:\n dateObj?.toLocaleDateString(\"en-GB\", {\n day: \"numeric\",\n month: \"short\",\n }) || \"No Date\",\n fullDate:\n dateObj?.toLocaleDateString(\"en-GB\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n }) || \"Unscheduled\",\n dayName:\n dateObj?.toLocaleDateString(\"en-GB\", { weekday: \"short\" }) || \"\",\n sessions: [],\n total: 0,\n });\n }\n const group = groups.get(date)!;\n group.sessions.push({ session, index });\n group.total += getSessionTotal(index);\n });\n\n // Sort sessions within each group by eventTime\n groups.forEach((group) => {\n group.sessions.sort((a, b) => {\n if (!a.session.eventTime && !b.session.eventTime) return 0;\n if (!a.session.eventTime) return 1;\n if (!b.session.eventTime) return -1;\n return a.session.eventTime.localeCompare(b.session.eventTime);\n });\n });\n\n // Sort groups by date\n return Array.from(groups.values()).sort((a, b) => {\n if (a.date === \"unscheduled\") return 1;\n if (b.date === \"unscheduled\") return -1;\n return a.date.localeCompare(b.date);\n });\n}\n\n/**\n * Format time for display (e.g., \"12:00 PM\")\n */\nexport function formatTimeDisplay(eventTime: string | undefined): string {\n if (!eventTime) return \"Set time\";\n const [hours, minutes] = eventTime.split(\":\");\n const hour = parseInt(hours);\n const minute = parseInt(minutes);\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n const start = `${hour12}:${String(minute).padStart(2, \"0\")} ${period}`;\n const totalEnd = hour * 60 + minute + 30;\n const endHour = Math.floor(totalEnd / 60) % 24;\n const endMinute = totalEnd % 60;\n const endPeriod = endHour >= 12 ? \"PM\" : \"AM\";\n const endHour12 = endHour % 12 || 12;\n return `${start} – ${endHour12}:${String(endMinute).padStart(2, \"0\")} ${endPeriod}`;\n}\n\n/**\n * Get minimum date (today) for date picker\n */\nexport function getMinDate(): string {\n const date = new Date();\n return date.toISOString().split(\"T\")[0];\n}\n\n/**\n * Get maximum date (3 months from now) for date picker\n */\nexport function getMaxDate(): string {\n const date = new Date();\n date.setMonth(date.getMonth() + 3);\n return date.toISOString().split(\"T\")[0];\n}\n\n/**\n * Map MenuItemDetails from API to MenuItem format for components\n */\nexport function mapToMenuItem(item: MenuItemDetails): MenuItem {\n return {\n id: item.id,\n menuItemName: item.name,\n description: item.description,\n price: item.price?.toString() || \"0\",\n discountPrice: item.discountPrice?.toString(),\n allergens: item.allergens,\n isDiscount: item.isDiscount || false,\n image: item.image,\n averageRating: item.averageRating,\n restaurantId: item.restaurantId,\n restaurantName: (item as any).restaurant?.restaurant_name,\n restaurant: (item as any).restaurant ? {\n id: (item as any).restaurant.id || item.restaurantId,\n name: (item as any).restaurant.restaurant_name || (item as any).restaurant.name,\n restaurantId: item.restaurantId,\n menuGroupSettings: (item as any).restaurant.menuGroupSettings,\n images: (item as any).restaurant.images || (item as any).restaurant.image,\n } : undefined,\n groupTitle: item.groupTitle,\n status: item.status,\n itemDisplayOrder: item.itemDisplayOrder || 0,\n cateringQuantityUnit: (item as any).cateringQuantityUnit,\n feedsPerUnit: (item as any).feedsPerUnit,\n dietaryFilters: (item as any).dietaryFilters,\n categoryId: (item as any).categories?.[0]?.id || (item as any).categoryId,\n categoryName:\n (item as any).categories?.[0]?.name || (item as any).categoryName,\n // Include subcategory info from API response\n subcategoryId: (item as any).subcategories?.[0]?.id,\n subcategoryName: (item as any).subcategories?.[0]?.name,\n addons: (item.addons || []).map((group: any) => ({\n groupTitle: group.groupTitle || \"\",\n selectionType: group.selectionType === 'multiple' ? 'multiple_no_repeat' : (group.selectionType || \"multiple_no_repeat\"),\n isRequired: group.isRequired || false,\n minSelections: group.minSelections,\n maxSelections: group.maxSelections,\n items: (group.items || []).map((addon: any) => ({\n name: addon.name,\n price: addon.price?.toString() || \"0\",\n allergens: addon.allergens?.join?.(\", \") || \"\",\n dietaryRestrictions: addon.dietaryRestrictions,\n isDefault: addon.isDefault,\n displayOrder: addon.displayOrder,\n })),\n })),\n };\n}\n\n/**\n * Format time with hour and minute to display string\n */\nexport function formatTime(hour: number, minute: number): string {\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n return `${hour12}:${minute.toString().padStart(2, \"0\")} ${period}`;\n}\n\n/**\n * Convert 24-hour time string to 12-hour components\n */\nexport function parseEventTime(eventTime: string): {\n hour: string;\n minute: string;\n period: \"AM\" | \"PM\";\n} {\n const [hours, minutes] = eventTime.split(\":\");\n const hour = Number(hours);\n const hour12 = hour % 12 || 12;\n return {\n hour: String(hour12).padStart(2, \"0\"),\n minute: minutes,\n period: hour >= 12 ? \"PM\" : \"AM\",\n };\n}\n\n/**\n * Convert 12-hour time components to 24-hour time string\n */\nexport function formatTo24Hour(\n hour: string,\n minute: string,\n period: \"AM\" | \"PM\"\n): string {\n let hourNum = Number(hour) % 12;\n if (period === \"PM\") hourNum += 12;\n if (period === \"AM\" && hourNum === 12) hourNum = 0;\n return `${String(hourNum).padStart(2, \"0\")}:${minute}`;\n}\n","\"use client\";\n\nimport { useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown } from \"lucide-react\";\nimport { TIME_SLOT_OPTIONS } from \"./catering-order-helpers\";\n\ninterface TimeSlotDropdownProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport default function TimeSlotDropdown({\n value,\n onChange,\n}: TimeSlotDropdownProps) {\n const [open, setOpen] = useState(false);\n const [menuStyle, setMenuStyle] = useState<React.CSSProperties>({});\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLUListElement>(null);\n\n const selectedLabel =\n TIME_SLOT_OPTIONS.find((o) => o.value === value)?.label ?? \"Select a time\";\n\n // Recompute the menu's fixed position / height based on the button's\n // current rect and the available space below within the viewport.\n const updatePosition = () => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n const VIEWPORT_MARGIN = 8;\n const GAP = 4;\n const availableBelow =\n window.innerHeight - rect.bottom - GAP - VIEWPORT_MARGIN;\n const maxHeight = Math.max(80, availableBelow);\n setMenuStyle({\n position: \"fixed\",\n top: rect.bottom + GAP,\n left: rect.left,\n width: rect.width,\n maxHeight,\n });\n };\n\n const openMenu = () => {\n updatePosition();\n setOpen(true);\n };\n\n useEffect(() => {\n if (!open) return;\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n const insideButton = buttonRef.current?.contains(target);\n const insideMenu = menuRef.current?.contains(target);\n if (!insideButton && !insideMenu) {\n setOpen(false);\n }\n };\n const handleReposition = () => updatePosition();\n document.addEventListener(\"mousedown\", handleClickOutside);\n window.addEventListener(\"resize\", handleReposition);\n // Capture phase so we catch scrolls on any ancestor (modal body, page, etc.)\n window.addEventListener(\"scroll\", handleReposition, true);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n window.removeEventListener(\"resize\", handleReposition);\n window.removeEventListener(\"scroll\", handleReposition, true);\n };\n }, [open]);\n\n const select = (val: string) => {\n onChange(val);\n setOpen(false);\n };\n\n const menu = (\n <ul\n ref={menuRef}\n style={menuStyle}\n className=\"z-[200] bg-white border border-base-300 rounded-xl shadow-lg overflow-y-auto py-1\"\n >\n <li>\n <button\n type=\"button\"\n onClick={() => select(\"\")}\n className=\"w-full text-left px-4 py-2 text-sm text-gray-400 hover:bg-base-100\"\n >\n Select a time\n </button>\n </li>\n {TIME_SLOT_OPTIONS.map((opt) => (\n <li key={opt.value}>\n <button\n type=\"button\"\n onClick={() => select(opt.value)}\n className={`w-full text-left px-4 py-2 text-sm hover:bg-base-100 ${\n value === opt.value\n ? \"text-primary font-medium bg-primary/5\"\n : \"text-gray-900\"\n }`}\n >\n {opt.label}\n </button>\n </li>\n ))}\n </ul>\n );\n\n return (\n <div className=\"relative\">\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={() => (open ? setOpen(false) : openMenu())}\n className=\"w-full flex items-center justify-between px-4 py-3 border border-base-300 rounded-xl bg-white focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary text-left\"\n >\n <span className={value ? \"text-gray-900\" : \"text-gray-400\"}>\n {selectedLabel}\n </span>\n <ChevronDown\n className={`h-4 w-4 text-gray-400 transition-transform ${open ? \"rotate-180\" : \"\"}`}\n />\n </button>\n\n {open && createPortal(menu, document.body)}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { Clock } from \"lucide-react\";\nimport { SessionEditorProps } from \"./types\";\nimport {\n getMinDate,\n getMaxDate,\n formatTime,\n} from \"./catering-order-helpers\";\nimport TimeSlotDropdown from \"./TimeSlotDropdown\";\n\nexport default function SessionEditor({\n session,\n sessionIndex,\n onUpdate,\n onClose,\n restaurants,\n existingDates = [],\n}: SessionEditorProps) {\n const [sessionName, setSessionName] = useState(session.sessionName);\n const [sessionDate, setSessionDate] = useState(session.sessionDate);\n const [selectedTimeSlot, setSelectedTimeSlot] = useState(() => {\n if (session.eventTime) {\n const [h, m] = session.eventTime.split(\":\").map(Number);\n const totalMins = h * 60 + m;\n const slotMins = Math.floor(totalMins / 30) * 30;\n const sH = String(Math.floor(slotMins / 60)).padStart(2, \"0\");\n const sM = String(slotMins % 60).padStart(2, \"0\");\n return `${sH}:${sM}`;\n }\n return \"\";\n });\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const handleCancel = () => {\n onClose(true);\n };\n\n const handleSave = () => {\n // Clear any previous errors\n setValidationError(null);\n\n // Use selected time slot directly (already 24h format)\n const eventTime = selectedTimeSlot;\n\n // Validate that date and time are set before saving\n if (!sessionDate) {\n setValidationError(\"Please select a date for this session.\");\n return;\n }\n if (!eventTime) {\n setValidationError(\"Please select a time for this session.\");\n return;\n }\n\n // Validate time is within allowed range (7:00 AM – 8:30 PM)\n const [etHour, etMinute] = eventTime.split(\":\").map(Number);\n const etTotal = etHour * 60 + etMinute;\n if (etTotal < 7 * 60) {\n setValidationError(\"Sessions cannot start before 7:00 AM.\");\n return;\n }\n if (etTotal > 20 * 60 + 30) {\n setValidationError(\"Sessions cannot start after 8:30 PM.\");\n return;\n }\n\n // Validate catering operation hours\n // Get unique restaurant IDs from session items\n const restaurantIds = new Set(\n session.orderItems.map((oi) => oi.item.restaurantId)\n );\n\n // Check each restaurant's catering hours\n for (const restaurantId of restaurantIds) {\n const restaurant = restaurants.find((r) => r.id === restaurantId);\n if (!restaurant) continue;\n\n const cateringHours = restaurant.cateringOperatingHours;\n if (!cateringHours || cateringHours.length === 0) continue;\n\n // Get day of week from selected date\n const selectedDateTime = new Date(sessionDate + \"T00:00:00\");\n const dayOfWeek = selectedDateTime\n .toLocaleDateString(\"en-US\", { weekday: \"long\" })\n .toLowerCase();\n\n // Check date overrides first\n const dateString = sessionDate; // already \"YYYY-MM-DD\"\n const dateOverride = restaurant.dateOverrides?.find(\n (o) => o.date === dateString\n );\n\n if (dateOverride) {\n if (dateOverride.isClosed) {\n setValidationError(\n `${restaurant.restaurant_name} is closed on ${dateString}${dateOverride.reason ? ` (${dateOverride.reason})` : \"\"}. Please select a different date.`\n );\n return;\n }\n if (dateOverride.timeSlots && dateOverride.timeSlots.length > 0 && eventTime) {\n const [eventHour, eventMinute] = eventTime.split(\":\").map(Number);\n const eventMinutes = eventHour * 60 + eventMinute;\n const inAnySlot = dateOverride.timeSlots.some((slot) => {\n const [oh, om] = slot.open.split(\":\").map(Number);\n const [ch, cm] = slot.close.split(\":\").map(Number);\n return eventMinutes >= oh * 60 + om && eventMinutes <= ch * 60 + cm;\n });\n if (!inAnySlot) {\n const slotDescs = dateOverride.timeSlots\n .map((s) => {\n const [oh, om] = s.open.split(\":\").map(Number);\n const [ch, cm] = s.close.split(\":\").map(Number);\n return `${formatTime(oh, om)} - ${formatTime(ch, cm)}`;\n })\n .join(\", \");\n setValidationError(\n `${restaurant.restaurant_name} only accepts orders between ${slotDescs} on ${dateString}.`\n );\n return;\n }\n }\n } else {\n // Regular weekly schedule — find all slots for this day\n const daySlots = cateringHours.filter(\n (schedule) =>\n schedule.day.toLowerCase() === dayOfWeek && schedule.enabled\n );\n\n if (daySlots.length === 0) {\n setValidationError(\n `${restaurant.restaurant_name} does not accept event orders on ${dayOfWeek}s. Please select a different date.`\n );\n return;\n }\n\n // Check if time is within any operating hour slot\n const enabledSlots = daySlots.filter((s) => s.open && s.close);\n if (enabledSlots.length > 0 && eventTime) {\n const [eventHour, eventMinute] = eventTime.split(\":\").map(Number);\n const eventMinutes = eventHour * 60 + eventMinute;\n\n const inAnySlot = enabledSlots.some((slot) => {\n const [openHour, openMinute] = slot.open!.split(\":\").map(Number);\n const [closeHour, closeMinute] = slot.close!.split(\":\").map(Number);\n return (\n eventMinutes >= openHour * 60 + openMinute &&\n eventMinutes <= closeHour * 60 + closeMinute\n );\n });\n\n if (!inAnySlot) {\n const slotDescs = enabledSlots\n .map((s) => {\n const [oh, om] = s.open!.split(\":\").map(Number);\n const [ch, cm] = s.close!.split(\":\").map(Number);\n return `${formatTime(oh, om)} - ${formatTime(ch, cm)}`;\n })\n .join(\", \");\n setValidationError(\n `${restaurant.restaurant_name} accepts event orders on ${dayOfWeek}s between ${slotDescs}. Please select a time within these hours.`\n );\n return;\n }\n }\n }\n }\n\n onUpdate(sessionIndex, {\n sessionName: sessionName || \"Untitled Session\",\n sessionDate,\n eventTime,\n });\n onClose(false);\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[100] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl overflow-hidden\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center\">\n <Clock className=\"h-6 w-6 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Edit Session</h3>\n <p className=\"text-sm text-gray-500\">Update session details</p>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-4\">\n {/* Session Name */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n Session Name\n </label>\n <input\n type=\"text\"\n value={sessionName}\n onChange={(e) => setSessionName(e.target.value)}\n placeholder=\"e.g., Breakfast, Lunch, Dinner\"\n className=\"w-full px-4 py-3 border border-base-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary\"\n />\n </div>\n\n {/* Date */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n Date\n </label>\n {existingDates.length > 0 && (\n <div className=\"flex gap-2 overflow-x-auto scrollbar-hide pb-2 mb-2\">\n {existingDates.map((d) => {\n const isActive = sessionDate === d.date;\n return (\n <button\n key={d.date}\n type=\"button\"\n onClick={() => {\n setSessionDate(d.date);\n setValidationError(null);\n }}\n className={`flex-shrink-0 px-3 py-2 rounded-lg border transition-colors ${\n isActive\n ? \"bg-primary text-white border-primary\"\n : \"bg-base-100 text-gray-700 border-base-300 hover:border-primary\"\n }`}\n >\n <div className=\"text-[10px] font-medium opacity-80 text-center\">\n {d.dayName}\n </div>\n <div className=\"text-sm font-bold whitespace-nowrap\">\n {d.displayDate}\n </div>\n </button>\n );\n })}\n </div>\n )}\n <input\n type=\"date\"\n value={sessionDate}\n onChange={(e) => {\n setSessionDate(e.target.value);\n setValidationError(null);\n }}\n min={getMinDate()}\n max={getMaxDate()}\n className=\"w-full px-4 py-3 border border-base-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary appearance-none bg-white min-w-0 box-border\"\n style={{ WebkitAppearance: \"none\" }}\n />\n </div>\n\n {/* Time */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n Delivery Time\n </label>\n <TimeSlotDropdown\n value={selectedTimeSlot}\n onChange={(v) => {\n setSelectedTimeSlot(v);\n setValidationError(null);\n }}\n />\n </div>\n </div>\n\n {/* Validation Error */}\n {validationError && (\n <div className=\"mt-4 p-3 bg-red-50 border border-red-200 rounded-xl flex items-start gap-2\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 text-red-500 flex-shrink-0 mt-0.5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <p className=\"text-sm text-red-700\">{validationError}</p>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n onClick={handleCancel}\n className=\"flex-1 px-4 py-3 border border-base-300 text-gray-600 rounded-xl hover:bg-base-100 transition-colors font-medium\"\n >\n Cancel\n </button>\n <button\n onClick={handleSave}\n className=\"flex-1 px-4 py-3 bg-primary text-white rounded-xl hover:bg-primary/90 transition-colors font-medium\"\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useRef, useState, useEffect } from \"react\";\nimport { Plus } from \"lucide-react\";\nimport { DateSessionNavProps } from \"./types\";\nimport { useCateringConfig } from \"../config/CateringConfigContext\";\n\nexport default function DateSessionNav({\n dayGroups,\n expandedSessionIndex,\n onSessionPillClick,\n onAddDay,\n formatTimeDisplay,\n // Tutorial refs\n addSessionNavButtonRef,\n firstDayTabRef,\n firstSessionPillRef,\n}: DateSessionNavProps) {\n const sessionButtonRefs = useRef<Map<number, HTMLButtonElement>>(new Map());\n const visibleDayGroups = dayGroups.filter((day) => day.date !== \"unscheduled\");\n\n const { stickyTopOffset = 0 } = useCateringConfig();\n const navRef = useRef<HTMLDivElement>(null);\n const [isNavSticky, setIsNavSticky] = useState(false);\n\n useEffect(() => {\n const update = () => {\n const el = navRef.current;\n if (!el) return;\n const scrolled = window.scrollY > 0;\n const atTop = el.getBoundingClientRect().top <= stickyTopOffset;\n setIsNavSticky(scrolled && atTop);\n };\n update();\n window.addEventListener(\"scroll\", update, { passive: true });\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update);\n window.removeEventListener(\"resize\", update);\n };\n }, [stickyTopOffset]);\n\n return (\n <div\n ref={navRef}\n data-catering-session-nav=\"true\"\n style={{ top: stickyTopOffset }}\n className={`sticky z-40 bg-base-100 transition-shadow duration-200 ${\n isNavSticky\n ? \"shadow-[0_6px_4px_-4px_rgba(0,0,0,0.1)] border-b border-base-200\"\n : \"\"\n }`}\n >\n <div className=\"max-w-6xl mx-auto px-2 md:px-6 py-2\">\n <div className=\"flex gap-2 overflow-x-auto scrollbar-hide\">\n {/* Add Session button — always leftmost */}\n <button\n ref={addSessionNavButtonRef}\n onClick={onAddDay}\n className=\"flex-shrink-0 px-4 py-2 self-stretch rounded-lg border-2 border-dashed border-base-300 text-gray-400 hover:border-primary hover:text-primary transition-colors flex flex-col items-center justify-center\"\n >\n <Plus className=\"w-4 h-4 mx-auto\" />\n <div className=\"text-[10px] font-medium mt-0.5 whitespace-nowrap\">\n Add Session\n </div>\n </button>\n\n {/* Each day group: date pill + sessions inline, all expanded */}\n {visibleDayGroups.map((day, dayIdx) => {\n const isActiveDay = day.sessions.some(\n ({ index }) => index === expandedSessionIndex\n );\n return (\n <div\n key={day.date}\n className=\"flex items-stretch gap-0 rounded-lg flex-shrink-0\"\n >\n {/* Date label */}\n <div\n ref={dayIdx === 0 ? firstDayTabRef : undefined}\n className={`relative z-10 flex-shrink-0 px-4 py-2 rounded-lg transition-colors ${\n isActiveDay\n ? \"bg-primary text-white\"\n : \"bg-base-200 text-gray-700\"\n }`}\n >\n <div className=\"text-[10px] font-medium opacity-80 text-center\">\n {day.dayName}\n </div>\n <div className=\"text-sm font-bold\">{day.displayDate}</div>\n </div>\n\n {/* Sessions for this day */}\n {day.sessions.length > 0 && (\n <div className=\"flex items-stretch gap-0.5 pl-3.5 pr-1.5 bg-white border border-base-300 rounded-lg -ml-2\">\n {day.sessions.map(({ session, index }, sIdx) => (\n <button\n key={index}\n ref={(el) => {\n if (el) sessionButtonRefs.current.set(index, el);\n else sessionButtonRefs.current.delete(index);\n if (\n dayIdx === 0 &&\n sIdx === 0 &&\n el &&\n firstSessionPillRef.current !== el\n ) {\n (firstSessionPillRef as { current: HTMLButtonElement | null }).current = el;\n }\n }}\n onClick={() => onSessionPillClick(index)}\n className={`flex flex-col justify-center flex-shrink-0 px-2.5 pb-0.5 transition-all border-b-2 ${\n expandedSessionIndex === index\n ? \"border-primary text-primary\"\n : \"border-transparent text-gray-500 hover:text-gray-700\"\n }`}\n >\n <div className=\"text-[9px] font-medium opacity-70\">\n {formatTimeDisplay(session.eventTime)}\n </div>\n <div className=\"text-xs font-semibold leading-tight whitespace-nowrap\">\n {session.sessionName}\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n","import { resolveBaseUrl } from \"../api/baseUrl\";\n\n/**\n * Thin shim around fetch that prepends the widget's base URL when the\n * provided URL is a relative path. Kept as an import-compatible drop-in\n * for ported components; new code should prefer useApiClient().\n */\nexport async function fetchWithAuth(\n input: string,\n init?: RequestInit\n): Promise<Response> {\n const url =\n input.startsWith(\"http://\") || input.startsWith(\"https://\")\n ? input\n : `${resolveBaseUrl()}${input}`;\n\n const headers: Record<string, string> = {\n ...((init?.headers as Record<string, string> | undefined) ?? {}),\n };\n if (init?.body && !(\"Content-Type\" in headers)) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return fetch(url, { ...init, headers });\n}\n","import { fetchWithAuth } from \"./fetchWithAuth\";\nimport type { CategoryWithSubcategories, MenuItemDetails } from \"../types/menu\";\n\nasync function jsonOrThrow<T>(res: Response, msg: string): Promise<T> {\n if (!res.ok) throw new Error(msg);\n return (await res.json()) as T;\n}\n\nexport const categoryService = {\n getCategories: async (): Promise<CategoryWithSubcategories[]> =>\n jsonOrThrow(await fetchWithAuth(`/categories`), \"Failed to fetch categories\"),\n\n getCategoriesWithSubcategories: async (): Promise<CategoryWithSubcategories[]> =>\n jsonOrThrow(\n await fetchWithAuth(`/categories/with-subcategories`),\n \"Failed to fetch categories with subcategories\"\n ),\n\n getMenuItemsByCategory: async (\n categoryId: string\n ): Promise<MenuItemDetails[]> =>\n jsonOrThrow(\n await fetchWithAuth(`/menu-item/category/${categoryId}`),\n \"Failed to fetch menu items by category\"\n ),\n\n getMenuItemsBySubcategory: async (\n subcategoryId: string\n ): Promise<MenuItemDetails[]> =>\n jsonOrThrow(\n await fetchWithAuth(`/menu-item/subcategory/${subcategoryId}`),\n \"Failed to fetch menu items by subcategory\"\n ),\n};\n\nexport const promotionsServices = {\n getActivePromotions: async (\n restaurantId: string,\n type?: string\n ): Promise<any[]> => {\n const suffix = type ? `&type=${encodeURIComponent(type)}` : \"\";\n const res = await fetchWithAuth(\n `/promotions/active?restaurantId=${encodeURIComponent(restaurantId)}${suffix}`\n );\n if (!res.ok) return [];\n return res.json();\n },\n\n getRestaurantPromotions: async (restaurantId: string): Promise<any[]> => {\n const res = await fetchWithAuth(\n `/promotions/restaurant/${restaurantId}`\n );\n if (!res.ok) return [];\n return res.json();\n },\n\n getBulkRestaurantPromotions: async (\n restaurantIds: string[]\n ): Promise<Record<string, any[]>> => {\n if (!restaurantIds.length) return {};\n const res = await fetchWithAuth(\n `/promotions/bulk?restaurantIds=${restaurantIds.join(\",\")}`\n );\n if (!res.ok) return {};\n return res.json();\n },\n};\n","\"use client\";\n\nimport { useState, useMemo, useEffect } from \"react\";\nimport { Package, ArrowLeftRight, Pencil, Trash2, Store, Tag } from \"lucide-react\";\nimport { useCateringState } from \"../state/CateringStateContext\";\nimport { SelectedMenuItem } from \"../types/session\";\nimport { categoryService } from \"../shims/services\";\nimport { ALLERGENS } from \"../constants/allergens\";\n\ninterface GroupedItem {\n item: any;\n quantity: number;\n originalIndex: number;\n allergenExpanded?: boolean;\n}\n\ninterface CategoryGroup {\n items: GroupedItem[];\n subcategories: Map<string, GroupedItem[]>;\n}\n\ninterface SelectedItemsByCategoryProps {\n sessionIndex?: number;\n onEdit?: (index: number) => void;\n onRemove?: (index: number) => void;\n onSwapItem?: (index: number) => void;\n onRemoveBundle?: (bundleId: string) => void;\n collapsedCategories?: Set<string>;\n onToggleCategory?: (categoryName: string) => void;\n showActions?: boolean;\n onViewMenu?: () => void;\n compactLayout?: boolean;\n restaurants?: { id: string; restaurant_name: string; images: string[] }[];\n sessionPromotions?: any[];\n}\n\nexport default function SelectedItemsByCategory({\n sessionIndex,\n onEdit,\n onRemove,\n onSwapItem,\n onRemoveBundle,\n collapsedCategories: externalCollapsedCategories,\n onToggleCategory: externalOnToggleCategory,\n showActions = true,\n compactLayout = false,\n restaurants,\n sessionPromotions = [],\n // onViewMenu,\n}: SelectedItemsByCategoryProps) {\n const { mealSessions, activeSessionIndex } = useCateringState();\n\n // Use provided sessionIndex or fall back to activeSessionIndex\n const currentSessionIndex = sessionIndex ?? activeSessionIndex;\n const orderItems = mealSessions[currentSessionIndex]?.orderItems || [];\n\n // Fetch categories for ordering\n const [categoryOrder, setCategoryOrder] = useState<string[]>([]);\n\n useEffect(() => {\n const fetchCategories = async () => {\n try {\n const categories =\n await categoryService.getCategoriesWithSubcategories();\n setCategoryOrder(categories.map((c) => c.name));\n } catch (error) {\n console.error(\"Failed to fetch categories for ordering:\", error);\n }\n };\n fetchCategories();\n }, []);\n\n // Internal collapsed state if not provided externally\n const [internalCollapsedCategories, setInternalCollapsedCategories] =\n useState<Set<string>>(new Set());\n\n // Track collapsed restaurant sections\n const [collapsedRestaurants, setCollapsedRestaurants] = useState<Set<string>>(new Set());\n\n // Track expanded allergen sections by item index\n const [expandedAllergens, setExpandedAllergens] = useState<Set<number>>(new Set());\n\n const collapsedCategories =\n externalCollapsedCategories ?? internalCollapsedCategories;\n\n const toggleAllergen = (index: number) => {\n setExpandedAllergens(prev => {\n const newSet = new Set(prev);\n if (newSet.has(index)) {\n newSet.delete(index);\n } else {\n newSet.add(index);\n }\n return newSet;\n });\n };\n\n const handleToggleCategory = (categoryName: string) => {\n if (externalOnToggleCategory) {\n externalOnToggleCategory(categoryName);\n } else {\n // Use internal state\n setInternalCollapsedCategories((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(categoryName)) {\n newSet.delete(categoryName);\n } else {\n newSet.add(categoryName);\n }\n return newSet;\n });\n }\n };\n\n // Group everything by restaurant\n const restaurantGrouped = useMemo(() => {\n const map = new Map<string, {\n name: string;\n restaurantId?: string;\n image?: string;\n bundles: Map<string, { name: string; items: GroupedItem[] }>;\n categories: Map<string, CategoryGroup>;\n }>();\n\n orderItems.forEach((orderItem: SelectedMenuItem, index: number) => {\n const restName = (orderItem.item as any).restaurantName || orderItem.item.restaurant?.name || \"Unknown Restaurant\";\n // Look up restaurant image from restaurants prop first, then fall back to item data\n const restId = orderItem.item.restaurantId || orderItem.item.restaurant?.restaurantId;\n const matchedRestaurant = restaurants?.find(r => r.id === restId);\n const restImage = matchedRestaurant?.images?.[0];\n\n if (!map.has(restName)) {\n map.set(restName, { name: restName, restaurantId: restId, image: restImage, bundles: new Map(), categories: new Map() });\n }\n const restaurant = map.get(restName)!;\n\n const groupedItem: GroupedItem = {\n item: orderItem.item,\n quantity: orderItem.quantity,\n originalIndex: index,\n };\n\n if (orderItem.bundleId) {\n if (!restaurant.bundles.has(orderItem.bundleId)) {\n restaurant.bundles.set(orderItem.bundleId, { name: orderItem.bundleName ?? \"Bundle\", items: [] });\n }\n restaurant.bundles.get(orderItem.bundleId)!.items.push(groupedItem);\n } else {\n const catName = orderItem.item.categoryName || (orderItem.item as any).groupTitle || \"Uncategorized\";\n const subName = orderItem.item.subcategoryName || \"\";\n\n if (!restaurant.categories.has(catName)) {\n restaurant.categories.set(catName, { items: [], subcategories: new Map() });\n }\n const category = restaurant.categories.get(catName)!;\n\n if (subName) {\n if (!category.subcategories.has(subName)) {\n category.subcategories.set(subName, []);\n }\n category.subcategories.get(subName)!.push(groupedItem);\n } else {\n category.items.push(groupedItem);\n }\n }\n });\n\n // Sort categories within each restaurant\n if (categoryOrder.length > 0) {\n map.forEach((restaurant) => {\n const entries = Array.from(restaurant.categories.entries());\n entries.sort((a, b) => {\n const orderA = categoryOrder.indexOf(a[0]);\n const orderB = categoryOrder.indexOf(b[0]);\n return (orderA === -1 ? 999 : orderA) - (orderB === -1 ? 999 : orderB);\n });\n restaurant.categories = new Map(entries);\n });\n }\n\n return map;\n }, [orderItems, categoryOrder]);\n\n if (orderItems.length === 0) return null;\n\n const renderItemRow = (groupedItem: GroupedItem) => {\n const { item, quantity, originalIndex } = groupedItem;\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const itemPrice =\n item.isDiscount && discountPrice > 0 ? discountPrice : price;\n const BACKEND_QUANTITY_UNIT = item.cateringQuantityUnit || 7;\n const portions = quantity / BACKEND_QUANTITY_UNIT;\n\n // Calculate addon total\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum: number, addon: { price: number; quantity: number }) =>\n sum + (addon.price || 0) * (addon.quantity || 0),\n 0\n );\n const subtotal = itemPrice * quantity + addonTotal;\n \n const showMobile = compactLayout ? \"\" : \" sm:hidden\";\n const showDesktop = compactLayout ? \" hidden\" : \" hidden sm:flex\";\n const showDesktopBlock = compactLayout ? \" hidden\" : \" hidden sm:block\";\n const rootLayout = compactLayout\n ? \"flex flex-col gap-1.5 p-2 bg-base-100 rounded-xl min-w-0 overflow-hidden\"\n : \"flex flex-col sm:flex-row sm:items-center gap-3 p-4 bg-base-100 rounded-xl min-w-0 overflow-hidden\";\n\n return (\n <div\n key={originalIndex}\n className={rootLayout}\n >\n {/* Mobile Layout */}\n <div className={`flex gap-3${showMobile}`}>\n {/* Image */}\n {item.image && (\n <img\n src={item.image}\n alt={item.menuItemName}\n className=\"w-16 h-16 rounded-lg object-cover flex-shrink-0\"\n />\n )}\n {/* Name + Addons */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-gray-800 italic\">\n {item.menuItemName}\n </p>\n {item.selectedAddons && item.selectedAddons.length > 0 && (\n <div className={`${compactLayout ? \"text-xs\" : \"text-sm\"} text-gray-600 mt-1`}>\n {(() => {\n // Group addons by groupTitle\n const addonsByGroup = item.selectedAddons.reduce(\n (\n acc: Record<string, { name: string; quantity: number }[]>,\n addon: {\n groupTitle: string;\n name: string;\n quantity: number;\n }\n ) => {\n const group = addon.groupTitle || \"Options\";\n if (!acc[group]) acc[group] = [];\n acc[group].push({\n name: addon.name,\n quantity: addon.quantity,\n });\n return acc;\n },\n {}\n );\n return Object.entries(addonsByGroup).map(\n ([groupTitle, addons]) => (\n <p key={groupTitle} className=\"text-gray-500\">\n <span className=\"font-medium text-gray-700\">\n {groupTitle}:\n </span>{\" \"}\n {(addons as { name: string; quantity: number }[]).map(\n (a, i) => (\n <span key={i}>\n {a.name}\n {a.quantity > 1 && ` (×${a.quantity})`}\n {i <\n (addons as { name: string; quantity: number }[])\n .length -\n 1 && \", \"}\n </span>\n )\n )}\n </p>\n )\n );\n })()}\n </div>\n )}\n {item.allergens && item.allergens.length > 0 && (\n <div className=\"mt-2\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleAllergen(originalIndex);\n }}\n className=\"flex items-center gap-1 text-xs font-medium text-orange-700 hover:text-orange-800 transition-colors\"\n >\n <span className=\"text-orange-600\">⚠️</span>\n <span>Allergens ({item.allergens.length})</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-3 w-3 transition-transform ${\n expandedAllergens.has(originalIndex) ? \"rotate-180\" : \"\"\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n {expandedAllergens.has(originalIndex) && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {item.allergens.map((allergenValue: string) => {\n const allergen = ALLERGENS.find((a) => a.value === allergenValue);\n return (\n <span\n key={allergenValue}\n className=\"inline-flex items-center bg-orange-100 text-orange-800 px-2 py-0.5 rounded text-xs\"\n >\n {allergen?.label || allergenValue}\n </span>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Mobile Price & Portions + Actions */}\n <div className={`flex items-center justify-between${showMobile}`}>\n <div>\n <p className={`font-bold text-primary ${compactLayout ? \"text-sm\" : \"text-lg\"}`}>\n £{subtotal.toFixed(2)}\n </p>\n <p className={`text-gray-600 ${compactLayout ? \"text-xs\" : \"text-sm\"}`}>\n {portions} portion{portions !== 1 ? \"s\" : \"\"}\n </p>\n </div>\n {showActions && onEdit && onRemove && (\n <div className={`flex items-center gap-2${showMobile}`}>\n {onSwapItem && orderItems[originalIndex]?.bundleId && (\n <button\n onClick={() => onSwapItem(originalIndex)}\n className={`p-2 border border-amber-500 text-amber-600 rounded-lg hover:bg-amber-50 transition-colors${compactLayout ? \"\" : \" sm:px-3 sm:py-2\"}`}\n title=\"Swap\"\n >\n <ArrowLeftRight className={`w-4 h-4${compactLayout ? \"\" : \" sm:hidden\"}`} />\n <span className={compactLayout ? \"hidden\" : \"hidden sm:inline text-sm font-medium\"}>Swap</span>\n </button>\n )}\n <button\n onClick={() => onEdit(originalIndex)}\n className={`p-2 border border-primary text-primary rounded-lg hover:bg-primary/5 transition-colors${compactLayout ? \"\" : \" sm:px-4 sm:py-2\"}`}\n title=\"Edit\"\n >\n <Pencil className={`w-4 h-4${compactLayout ? \"\" : \" sm:hidden\"}`} />\n <span className={compactLayout ? \"hidden\" : \"hidden sm:inline text-sm font-medium\"}>Edit</span>\n </button>\n <button\n onClick={() => onRemove(originalIndex)}\n className={`p-2 border border-primary text-primary rounded-lg hover:bg-primary/5 transition-colors${compactLayout ? \"\" : \" sm:px-4 sm:py-2\"}`}\n title=\"Remove\"\n >\n <Trash2 className={`w-4 h-4${compactLayout ? \"\" : \" sm:hidden\"}`} />\n <span className={compactLayout ? \"hidden\" : \"hidden sm:inline text-sm font-medium\"}>Remove</span>\n </button>\n </div>\n )}\n </div>\n\n {/* Desktop Layout */}\n {/* Image */}\n {item.image && (\n <img\n src={item.image}\n alt={item.menuItemName}\n className={`${showDesktopBlock} w-16 h-16 rounded-lg object-cover flex-shrink-0`}\n />\n )}\n\n {/* Name + Addons */}\n <div className={`${showDesktopBlock} flex-1 min-w-0`}>\n <p className=\"font-semibold text-gray-800\">{item.menuItemName}</p>\n {item.selectedAddons && item.selectedAddons.length > 0 && (\n <div className=\"text-sm text-gray-600 mt-1\">\n {(() => {\n // Group addons by groupTitle\n const addonsByGroup = item.selectedAddons.reduce(\n (\n acc: Record<string, { name: string; quantity: number }[]>,\n addon: {\n groupTitle: string;\n name: string;\n quantity: number;\n }\n ) => {\n const group = addon.groupTitle || \"Options\";\n if (!acc[group]) acc[group] = [];\n acc[group].push({\n name: addon.name,\n quantity: addon.quantity,\n });\n return acc;\n },\n {}\n );\n return Object.entries(addonsByGroup).map(\n ([groupTitle, addons]) => (\n <p key={groupTitle}>\n <span className=\"font-medium\">{groupTitle}:</span>{\" \"}\n {(addons as { name: string; quantity: number }[]).map(\n (a, i) => (\n <span key={i}>\n {a.name}\n {a.quantity > 1 && ` (×${a.quantity})`}\n {i <\n (addons as { name: string; quantity: number }[])\n .length -\n 1 && \", \"}\n </span>\n )\n )}\n </p>\n )\n );\n })()}\n </div>\n )}\n {item.allergens && item.allergens.length > 0 && (\n <div className=\"mt-2\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleAllergen(originalIndex);\n }}\n className=\"flex items-center gap-1 text-xs font-medium text-orange-700 hover:text-orange-800 transition-colors\"\n >\n <span>Allergens ({item.allergens.length})</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-3 w-3 transition-transform ${\n expandedAllergens.has(originalIndex) ? \"rotate-180\" : \"\"\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n {expandedAllergens.has(originalIndex) && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {item.allergens.map((allergenValue: string) => {\n const allergen = ALLERGENS.find((a) => a.value === allergenValue);\n return (\n <span\n key={allergenValue}\n className=\"inline-flex items-center bg-orange-100 text-orange-800 px-2 py-0.5 rounded text-xs\"\n >\n {allergen?.label || allergenValue}\n </span>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Price & Portions */}\n <div className={`${showDesktop} items-center gap-4 flex-shrink-0`}>\n <p className=\"font-bold text-primary text-lg\">\n £{subtotal.toFixed(2)}\n </p>\n <p className=\"text-sm text-gray-600 whitespace-nowrap\">\n {portions} portion{portions !== 1 ? \"s\" : \"\"}\n </p>\n </div>\n\n {/* Actions */}\n {showActions && onEdit && onRemove && (\n <div className={`${showDesktop} items-center gap-2 flex-shrink-0`}>\n {onSwapItem && orderItems[originalIndex]?.bundleId && (\n <button\n onClick={() => onSwapItem(originalIndex)}\n className=\"px-3 py-2 border border-amber-500 text-amber-600 rounded-lg hover:bg-amber-50 transition-colors text-sm font-medium\"\n >\n Swap\n </button>\n )}\n <button\n onClick={() => onEdit(originalIndex)}\n className=\"px-4 py-2 border border-primary text-primary rounded-lg hover:bg-primary/5 transition-colors text-sm font-medium\"\n >\n Edit\n </button>\n <button\n onClick={() => onRemove(originalIndex)}\n className=\"px-4 py-2 border border-primary text-primary rounded-lg hover:bg-primary/5 transition-colors text-sm font-medium\"\n >\n Remove\n </button>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"mb-6 overflow-hidden min-w-0\">\n {/* Header */}\n {/* <div className=\"px-6 py-4 bg-base-100 border-b border-base-200 flex items-center justify-between\">\n <h2 className=\"text-xl sm:text-3xl font-bold text-gray-800\">Your List</h2>\n {onViewMenu && (\n <button\n onClick={onViewMenu}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-primary bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span className=\"hidden sm:inline\">View Downloadable Menu</span>\n <span className=\"sm:hidden\">PDF</span>\n </button>\n )}\n </div> */}\n\n <div className={compactLayout ? \"space-y-3\" : \"space-y-5\"}>\n {Array.from(restaurantGrouped.entries()).map(([restName, restaurant]) => {\n const isRestaurantCollapsed = collapsedRestaurants.has(restName);\n const totalRestaurantItems = Array.from(restaurant.bundles.values()).reduce((sum, b) => sum + b.items.length, 0)\n + Array.from(restaurant.categories.values()).reduce((sum, c) => sum + c.items.length + Array.from(c.subcategories.values()).reduce((s, items) => s + items.length, 0), 0);\n\n const restPromos = sessionPromotions.filter(\n (p) => p.restaurantId === restaurant.restaurantId\n );\n\n return (\n <div key={restName}>\n {/* Restaurant Header */}\n <button\n onClick={() => setCollapsedRestaurants(prev => {\n const next = new Set(prev);\n if (next.has(restName)) next.delete(restName);\n else next.add(restName);\n return next;\n })}\n className=\"w-full flex items-center gap-3 mb-2 px-1 hover:bg-base-100 rounded-lg py-1 transition-colors\"\n >\n {restaurant.image ? (\n <img src={restaurant.image} alt={restName} className={`${compactLayout ? \"w-7 h-7\" : \"w-9 h-9\"} rounded-lg object-cover flex-shrink-0`} />\n ) : (\n <Store className={`${compactLayout ? \"w-4 h-4\" : \"w-5 h-5\"} text-gray-500 flex-shrink-0`} />\n )}\n <span className={`${compactLayout ? \"text-sm\" : \"text-base\"} font-bold text-gray-800`}>{restName}</span>\n <span className={`${compactLayout ? \"text-xs\" : \"text-sm\"} text-gray-400`}>({totalRestaurantItems})</span>\n <div className=\"flex-1\" />\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-5 w-5 text-gray-400 transition-transform ${isRestaurantCollapsed ? \"\" : \"rotate-180\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {/* Per-restaurant promotion banners */}\n {!isRestaurantCollapsed && restPromos.length > 0 && (\n <div className=\"flex flex-col gap-1.5 mb-2\">\n {restPromos.map((promo: any, i: number) => (\n <div key={i} className=\"group relative flex items-center gap-2 px-3 py-2 bg-green-50 border border-green-200 rounded-lg cursor-default\">\n <Tag className=\"w-4 h-4 text-green-600 flex-shrink-0\" />\n <span className=\"text-xs md:text-sm font-semibold text-green-700 flex-1 truncate\">\n {promo.name || \"Restaurant Promotion\"} —{\" \"}\n {promo.promotionType === \"BUY_MORE_SAVE_MORE\" && promo.discountTiers?.length\n ? `Up to ${Math.max(...promo.discountTiers.map((t: any) => Number(t.discountPercentage)))}% OFF`\n : promo.promotionType === \"BOGO\"\n ? \"Buy One Get One\"\n : `${Number(promo.discountPercentage)}% OFF`}\n </span>\n {/* Hover tooltip with tier breakdown */}\n {promo.promotionType === \"BUY_MORE_SAVE_MORE\" && promo.discountTiers?.length > 0 && (\n <div className=\"absolute left-0 top-full mt-1 z-20 hidden group-hover:block bg-white border border-green-200 rounded-lg shadow-lg px-3 py-2 min-w-[180px]\">\n {[...promo.discountTiers]\n .sort((a: any, b: any) => a.minQuantity - b.minQuantity)\n .map((tier: any, ti: number) => (\n <p key={ti} className=\"text-xs text-green-800 py-0.5\">\n {tier.minQuantity}+ items → <span className=\"font-semibold\">{Number(tier.discountPercentage)}% off</span>\n </p>\n ))}\n {promo.endDate && (\n <p className=\"text-[10px] text-green-600/70 mt-1 pt-1 border-t border-green-100\">\n Until {new Date(promo.endDate).toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" })}\n </p>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n\n {!isRestaurantCollapsed && (\n <div className={compactLayout ? \"space-y-2\" : \"space-y-4\"}>\n {/* Bundle Groups */}\n {Array.from(restaurant.bundles.entries()).map(([bundleId, { name, items }]) => (\n <div\n key={bundleId}\n className=\"border-2 border-dashed border-primary/30 rounded-2xl overflow-hidden bg-primary/[0.02]\"\n >\n <div className={`flex items-center gap-2 ${compactLayout ? \"px-3 py-2\" : \"px-4 py-3\"} bg-primary/10 border-b border-primary/20`}>\n <Package className={`${compactLayout ? \"w-3 h-3\" : \"w-4 h-4\"} text-primary flex-shrink-0`} />\n <div className=\"min-w-0\">\n <span className={`font-semibold text-primary ${compactLayout ? \"text-xs\" : \"text-sm\"}`}>{name}</span>\n <span className=\"block sm:inline sm:ml-1 text-xs text-primary/60\">\n ({items.length} item{items.length !== 1 ? \"s\" : \"\"})\n </span>\n </div>\n <div className=\"flex-1\" />\n {onRemoveBundle && (\n <>\n <button\n onClick={() => onRemoveBundle(bundleId)}\n className={`${compactLayout ? \"\" : \"sm:hidden\"} w-7 h-7 flex items-center justify-center text-red-500 hover:text-red-700 hover:bg-red-50 rounded-full transition-colors`}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n <button\n onClick={() => onRemoveBundle(bundleId)}\n className={`${compactLayout ? \"hidden\" : \"hidden sm:flex\"} items-center gap-1 text-xs font-medium text-red-500 hover:text-red-700 hover:bg-red-50 px-2 py-1 rounded-lg transition-colors`}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n Remove Bundle\n </button>\n </>\n )}\n </div>\n <div className={`${compactLayout ? \"p-1.5 space-y-1.5\" : \"p-2 space-y-3\"}`}>\n {items.map(renderItemRow)}\n </div>\n </div>\n ))}\n\n {/* Categories */}\n {Array.from(restaurant.categories.entries()).map(([categoryName, categoryGroup]) => {\n const isCollapsed = collapsedCategories.has(categoryName);\n const totalItems =\n categoryGroup.items.length +\n Array.from(categoryGroup.subcategories.values()).reduce(\n (sum, items) => sum + items.length,\n 0\n );\n\n return (\n <div\n key={categoryName}\n className=\"border-2 border-base-200 rounded-xl overflow-hidden\"\n >\n {/* Category Header */}\n <button\n onClick={() => handleToggleCategory(categoryName)}\n className={`w-full flex items-center justify-between ${compactLayout ? \"px-3 py-2\" : \"px-4 py-3\"} bg-base-200 hover:bg-base-200 transition-colors`}\n >\n <div className=\"flex items-center gap-2\">\n <span className={`${compactLayout ? \"text-xs\" : \"\"} font-semibold text-gray-800`}>\n {categoryName}\n </span>\n <span className={`${compactLayout ? \"text-xs\" : \"text-sm\"} text-gray-500`}>\n ({totalItems} item{totalItems !== 1 ? \"s\" : \"\"})\n </span>\n </div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-5 w-5 text-gray-500 transition-transform ${\n isCollapsed ? \"\" : \"rotate-180\"\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n {/* Category Content */}\n {!isCollapsed && (\n <div className={`${compactLayout ? \"p-1.5 space-y-1.5\" : \"p-2 space-y-3\"} min-w-0 overflow-hidden`}>\n {/* Items without subcategory */}\n {categoryGroup.items.map(renderItemRow)}\n\n {/* Subcategories (label hidden, items shown flat) */}\n {Array.from(categoryGroup.subcategories.values()).map(\n (items, i) => (\n <div key={i} className=\"space-y-3\">\n {items.map(renderItemRow)}\n </div>\n )\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { Clock, X, Pencil, ShoppingBag, AlertTriangle } from \"lucide-react\";\nimport { ActiveSessionPanelProps } from \"./types\";\nimport SelectedItemsByCategory from \"./SelectedItemsByCategory\";\n\nexport default function ActiveSessionPanel({\n session,\n sessionIndex,\n sessionTotal,\n sessionPromotions = [],\n validationError,\n isUnscheduled,\n canRemove,\n onEditSession,\n onRemoveSession,\n onEditItem,\n onRemoveItem,\n onSwapItem,\n onRemoveBundle,\n collapsedCategories,\n onToggleCategory,\n onViewMenu,\n restaurants,\n}: ActiveSessionPanelProps) {\n const totalItemCount = session.orderItems.reduce(\n (sum, oi) => sum + oi.quantity,\n 0\n );\n\n const formatDate = (date: string | undefined) => {\n if (!date) return \"Date not set\";\n return new Date(date).toLocaleDateString(\"en-GB\", {\n weekday: \"short\",\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n });\n };\n\n const formatTime = (eventTime: string | undefined) => {\n if (!eventTime) return \"Time not set\";\n const [hours, minutes] = eventTime.split(\":\");\n const hour = parseInt(hours);\n const minute = parseInt(minutes);\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n const start = `${hour12}:${String(minute).padStart(2, \"0\")} ${period}`;\n const totalEnd = hour * 60 + minute + 30;\n const endHour = Math.floor(totalEnd / 60) % 24;\n const endMinute = totalEnd % 60;\n const endPeriod = endHour >= 12 ? \"PM\" : \"AM\";\n const endHour12 = endHour % 12 || 12;\n return `${start} – ${endHour12}:${String(endMinute).padStart(2, \"0\")} ${endPeriod}`;\n };\n\n return (\n <div className=\"bg-white rounded-xl shadow-sm border border-base-200 flex h-full min-h-0 flex-col overflow-hidden\">\n {/* Unscheduled Warning */}\n {isUnscheduled && (\n <div className=\"p-4 bg-amber-50 border-b border-amber-200 rounded-t-xl flex items-start gap-3\">\n <AlertTriangle className=\"w-5 h-5 text-amber-500 flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-amber-800\">Set date & time to continue</p>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEditSession();\n }}\n className=\"mt-2 px-3 py-1.5 bg-amber-500 text-white text-xs font-medium rounded-lg hover:bg-amber-600 transition-colors\"\n >\n Edit Session\n </button>\n </div>\n </div>\n )}\n\n {/* Session Header */}\n <div className=\"px-3 py-2.5 flex items-center justify-between border-b border-base-200\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-9 h-9 rounded-full bg-primary flex items-center justify-center\">\n <Clock className=\"w-4 h-4 text-white\" />\n </div>\n <div>\n <p className=\"text-sm font-semibold text-gray-800\">\n {session.sessionName}\n </p>\n <p className=\"text-xs text-gray-500\">\n {formatDate(session.sessionDate)}\n </p>\n <p className=\"text-xs text-gray-500\">\n {formatTime(session.eventTime)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-right mr-2\">\n <span className=\"text-sm font-semibold text-primary\">\n £{sessionTotal.toFixed(2)}\n </span>\n <p className=\"text-[10px] text-gray-500\">{totalItemCount} items</p>\n {sessionPromotions.length > 0 && (\n <p className=\"text-[10px] text-green-600 font-semibold\">\n {sessionPromotions.length === 1 ? \"1 offer applied\" : `${sessionPromotions.length} offers applied`}\n </p>\n )}\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEditSession();\n }}\n className=\"p-2 rounded-full hover:bg-base-200 transition-colors text-primary\"\n title=\"Edit Session\"\n >\n <Pencil className=\"w-4 h-4\" />\n </button>\n {canRemove && (\n <button\n onClick={onRemoveSession}\n className=\"p-2 rounded-full hover:bg-red-50 transition-colors text-red-500\"\n title=\"Remove Session\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {/* Session Content */}\n <div className=\"p-2.5\">\n {session.orderItems.length > 0 ? (\n <div className=\"min-w-0 overflow-hidden\">\n <SelectedItemsByCategory\n sessionIndex={sessionIndex}\n onEdit={onEditItem}\n onRemove={onRemoveItem}\n onSwapItem={onSwapItem}\n onRemoveBundle={onRemoveBundle}\n collapsedCategories={collapsedCategories}\n onToggleCategory={onToggleCategory}\n onViewMenu={onViewMenu}\n compactLayout\n restaurants={restaurants}\n sessionPromotions={sessionPromotions}\n />\n </div>\n ) : (\n <div className=\"py-12 text-center\">\n <ShoppingBag className=\"w-12 h-12 text-gray-300 mx-auto mb-3\" />\n <p className=\"text-gray-500 text-sm\">Browse the menu to add items</p>\n </div>\n )}\n </div>\n\n {/* Validation Error Banner */}\n {validationError && (\n <div className=\"mx-4 mb-4 p-4 bg-red-50 border-2 border-red-500 rounded-xl flex items-start gap-3\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6 text-red-500 flex-shrink-0 mt-0.5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-red-800 mb-1\">\n Catering Hours Conflict\n </p>\n <p className=\"text-sm text-red-700\">{validationError}</p>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEditSession();\n }}\n className=\"mt-3 px-4 py-2 bg-red-600 text-white text-sm font-medium rounded-lg hover:bg-red-700 transition-colors\"\n >\n Edit Session Time\n </button>\n </div>\n </div>\n )}\n </div>\n\n </div>\n );\n}\n","export const GOOGLE_MAPS_CONFIG = {\n COUNTRY_RESTRICTION: \"gb\",\n LIBRARIES: [\"places\"] as const,\n FIELDS: [\n \"address_components\",\n \"geometry\",\n \"formatted_address\",\n \"name\",\n ] as string[],\n} as const;\n","const PLACEHOLDER = \"__REPLACE_AT_BUILD_TIME__\";\n\nexport const GOOGLE_MAPS_API_KEY =\n process.env.SWIFT_WIDGET_GOOGLE_MAPS_KEY ?? PLACEHOLDER;\n\nif (\n typeof window !== \"undefined\" &&\n (!GOOGLE_MAPS_API_KEY || GOOGLE_MAPS_API_KEY === PLACEHOLDER)\n) {\n // eslint-disable-next-line no-console\n console.warn(\n \"[@swift-food-services/catering-widget] Google Maps API key was not injected at build \" +\n \"time. The address-autocomplete field will not work. Set \" +\n \"SWIFT_WIDGET_GOOGLE_MAPS_KEY before running the widget build.\"\n );\n}\n","import { GOOGLE_MAPS_API_KEY } from \"../config/googleMaps\";\nimport { GOOGLE_MAPS_CONFIG } from \"../config/googleMapsConfig\";\n\nlet isLoading = false;\nlet isLoaded = false;\nconst callbacks: (() => void)[] = [];\n\nexport function loadGoogleMapsScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (isLoaded || (window as any).google?.maps?.places) {\n isLoaded = true;\n resolve();\n return;\n }\n\n if (isLoading) {\n callbacks.push(resolve);\n return;\n }\n\n if (document.querySelector('script[src*=\"maps.googleapis.com\"]')) {\n isLoaded = true;\n resolve();\n return;\n }\n\n isLoading = true;\n\n const script = document.createElement(\"script\");\n script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_MAPS_API_KEY}&libraries=${GOOGLE_MAPS_CONFIG.LIBRARIES.join(\",\")}`;\n script.async = true;\n script.defer = true;\n\n script.onload = () => {\n isLoading = false;\n isLoaded = true;\n resolve();\n callbacks.forEach((cb) => cb());\n callbacks.length = 0;\n };\n\n script.onerror = () => {\n isLoading = false;\n const error = new Error(\"Failed to load Google Maps script\");\n reject(error);\n console.error(error);\n };\n\n document.head.appendChild(script);\n });\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { GOOGLE_MAPS_CONFIG } from \"../config/googleMapsConfig\";\nimport { loadGoogleMapsScript } from \"../utils/google-maps-loader\";\n\nexport function useAddressAutocomplete(\n onPlaceSelect: (place: google.maps.places.PlaceResult) => void,\n) {\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const autocompleteServiceRef = useRef<google.maps.places.AutocompleteService | null>(null);\n const placesServiceRef = useRef<google.maps.places.PlacesService | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const justSelectedRef = useRef(false);\n\n const [query, setQuery] = useState(\"\");\n const [predictions, setPredictions] = useState<google.maps.places.AutocompletePrediction[]>([]);\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n useEffect(() => {\n loadGoogleMapsScript().then(() => {\n if (!window.google?.maps?.places) return;\n autocompleteServiceRef.current = new google.maps.places.AutocompleteService();\n const div = document.createElement(\"div\");\n placesServiceRef.current = new google.maps.places.PlacesService(div);\n });\n }, []);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (justSelectedRef.current) {\n justSelectedRef.current = false;\n return;\n }\n if (!query.trim() || !autocompleteServiceRef.current) {\n setPredictions([]);\n setActiveIndex(-1);\n setOpen(false);\n return;\n }\n debounceRef.current = setTimeout(() => {\n autocompleteServiceRef.current!.getPlacePredictions(\n { input: query, componentRestrictions: { country: GOOGLE_MAPS_CONFIG.COUNTRY_RESTRICTION } },\n (results, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && results) {\n setPredictions(results);\n setActiveIndex(-1);\n setOpen(true);\n } else {\n setPredictions([]);\n setActiveIndex(-1);\n setOpen(false);\n }\n },\n );\n }, 250);\n return () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\n }, [query]);\n\n const handleSelect = (prediction: google.maps.places.AutocompletePrediction) => {\n justSelectedRef.current = true;\n setOpen(false);\n setActiveIndex(-1);\n setPredictions([]);\n setQuery(prediction.description);\n placesServiceRef.current?.getDetails(\n { placeId: prediction.place_id, fields: GOOGLE_MAPS_CONFIG.FIELDS },\n (place, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && place?.geometry) {\n onPlaceSelect(place);\n }\n },\n );\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!open || predictions.length === 0) return;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(i + 1, predictions.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\") {\n if (activeIndex >= 0) {\n e.preventDefault();\n handleSelect(predictions[activeIndex]);\n }\n } else if (e.key === \"Escape\") {\n setOpen(false);\n setActiveIndex(-1);\n }\n };\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, []);\n\n const clear = () => {\n setQuery(\"\");\n setPredictions([]);\n setActiveIndex(-1);\n setOpen(false);\n };\n\n return {\n inputRef,\n containerRef,\n query,\n setQuery,\n predictions,\n open,\n activeIndex,\n setActiveIndex,\n handleSelect,\n handleKeyDown,\n clear,\n };\n}\n","import { CateringPricingResult } from \"../../types/pricing\";\nimport { useState } from \"react\";\nimport { useAddressAutocomplete } from \"../../hooks/useAddressAutocomplete\";\n\ninterface PricingSummaryProps {\n pricing: CateringPricingResult | null;\n calculatingPricing: boolean;\n estimatedTotal?: number;\n compact?: boolean;\n onPlaceSelect?: (place: google.maps.places.PlaceResult) => void;\n onClearAddress?: () => void;\n}\n\nfunction InlineAddressInput({\n onPlaceSelect,\n}: {\n onPlaceSelect: (place: google.maps.places.PlaceResult) => void;\n}) {\n const {\n inputRef,\n containerRef,\n query,\n setQuery,\n predictions,\n open,\n activeIndex,\n setActiveIndex,\n handleSelect,\n handleKeyDown,\n } = useAddressAutocomplete(onPlaceSelect);\n\n return (\n <div ref={containerRef} className=\"relative mt-1.5 pt-1.5 border-t border-base-200\">\n <div className=\"flex items-center gap-1.5\">\n <svg className=\"h-3 w-3 flex-shrink-0 text-base-content/30\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a2 2 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0zM15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <input\n ref={inputRef}\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Enter address for accurate cost\"\n autoComplete=\"new-password\"\n className=\"flex-1 text-xs bg-transparent outline-none placeholder:text-base-content/40 text-base-content min-w-0\"\n />\n </div>\n {open && predictions.length > 0 && (\n <div className=\"absolute bottom-full left-0 right-0 mb-1 rounded-lg border border-base-200 bg-white shadow-lg overflow-hidden z-50\">\n {predictions.map((p, idx) => (\n <button\n key={p.place_id}\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); handleSelect(p); }}\n onMouseEnter={() => setActiveIndex(idx)}\n className={`flex w-full items-start gap-2 px-3 py-2 text-left transition-colors ${idx === activeIndex ? \"bg-base-100\" : \"hover:bg-base-100\"}`}\n >\n <svg className=\"h-3 w-3 flex-shrink-0 text-base-content/40 mt-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a2 2 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0zM15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-base-content truncate\">\n {p.structured_formatting.main_text}\n </p>\n <p className=\"text-[10px] text-base-content/50 truncate\">\n {p.structured_formatting.secondary_text}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default function PricingSummary({\n pricing,\n calculatingPricing,\n estimatedTotal,\n compact = false,\n onPlaceSelect,\n onClearAddress,\n}: PricingSummaryProps) {\n const [showDeliveryBreakdown, setShowDeliveryBreakdown] = useState(false);\n\n if (calculatingPricing && !pricing) {\n return (\n <div className={`text-center text-base-content/60 ${compact ? \"py-2 text-xs\" : \"py-4 text-sm\"}`}>\n Calculating pricing...\n </div>\n );\n }\n\n if (pricing) {\n const deliveryBreakdown = pricing.deliveryFeeBreakdown ||\n (pricing as any).mealSessions?.[0]?.deliveryFeeBreakdown;\n const distanceInMiles = pricing.distanceInMiles ||\n (pricing as any).mealSessions?.[0]?.distanceInMiles;\n const backendPromos = pricing.appliedPromotions?.filter((p) => p.discount > 0) ?? [];\n\n return (\n <div className={`transition-opacity duration-200 ${calculatingPricing ? \"opacity-50\" : \"opacity-100\"} ${compact ? \"space-y-1.5\" : \"border-t border-base-300 space-y-2 pt-4\"}`}>\n {/* Subtotal */}\n <div className={`flex justify-between text-base-content/70 ${compact ? \"text-xs\" : \"text-sm\"}`}>\n <span>Subtotal</span>\n <span>£{pricing.subtotal.toFixed(2)}</span>\n </div>\n\n {/* Promotion Discount */}\n {((pricing.promotionDiscount ?? 0) > 0) && (\n <div className={`flex justify-between text-green-600 font-semibold ${compact ? \"text-xs\" : \"text-sm\"}`}>\n <span>Restaurant Promotion{backendPromos.length > 1 ? \"s\" : \"\"}</span>\n <span>-£{pricing.promotionDiscount!.toFixed(2)}</span>\n </div>\n )}\n\n {/* Promo code discount */}\n {(pricing.promoDiscount ?? 0) > 0 && (\n <div className={`flex justify-between text-success font-medium ${compact ? \"text-xs\" : \"text-sm\"}`}>\n <span>Promo Code Discount</span>\n <span>-£{pricing.promoDiscount!.toFixed(2)}</span>\n </div>\n )}\n\n {/* Delivery fee */}\n <div className=\"space-y-1\">\n <div className={`flex justify-between items-center text-base-content/70 gap-2 ${compact ? \"text-xs\" : \"text-sm\"}`}>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <span className=\"whitespace-nowrap\">Delivery Cost</span>\n <div className=\"relative group\">\n <button type=\"button\" className=\"text-base-content/30 hover:text-base-content/60 leading-none\">\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </button>\n <div className=\"absolute bottom-full left-0 mb-1.5 w-52 hidden group-hover:block z-50\">\n <div className=\"bg-base-content text-base-100 text-[10px] leading-relaxed rounded-lg px-2.5 py-2 shadow-lg\">\n Based on number of restaurants, distance to your delivery address, and catering order size.\n </div>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1.5 min-w-0\">\n {deliveryBreakdown && !compact && (\n <button\n onClick={() => setShowDeliveryBreakdown(!showDeliveryBreakdown)}\n className=\"text-base-content/40 hover:text-base-content/70\"\n type=\"button\"\n >\n <svg\n className={`w-4 h-4 transition-transform ${showDeliveryBreakdown ? \"rotate-180\" : \"\"}`}\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n )}\n {distanceInMiles && onClearAddress && (\n <button\n type=\"button\"\n onClick={onClearAddress}\n className=\"text-red-400 hover:text-red-600 transition-colors flex-shrink-0\"\n title=\"Change address\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n <span>£{pricing.deliveryFee.toFixed(2)}</span>\n {!distanceInMiles && onPlaceSelect && (\n <span className=\"text-base-content/40 text-xs italic\">(min)</span>\n )}\n </div>\n </div>\n\n {!distanceInMiles && onPlaceSelect && (\n <InlineAddressInput onPlaceSelect={onPlaceSelect} />\n )}\n {showDeliveryBreakdown && (pricing as any).mealSessions && (\n <div className=\"pl-4 space-y-1 text-xs text-base-content/60\">\n {(pricing as any).mealSessions.map((session: any, index: number) => (\n <div key={index} className=\"flex justify-between\">\n <span>{session.sessionName}:</span>\n <span>£{session.deliveryFee.toFixed(2)}</span>\n </div>\n ))}\n </div>\n )}\n {deliveryBreakdown?.requiresCustomQuote && (\n <div className=\"mt-2 p-2 bg-warning/10 border border-warning/30 rounded text-warning-content\">\n <p className=\"text-xs\">⚠️ Delivery exceeds 6 miles. Final fee subject to review.</p>\n </div>\n )}\n </div>\n\n {/* Total */}\n <div className={`flex justify-between font-bold text-base-content border-t border-base-300 ${compact ? \"text-sm pt-2\" : \"text-lg pt-3\"}`}>\n <span>Total</span>\n <div className=\"text-right\">\n <p>£{pricing.total.toFixed(2)}</p>\n {(pricing.totalDiscount ?? 0) > 0 && (\n <p className=\"text-xs line-through font-normal text-base-content/50\">\n £{(pricing.subtotal + pricing.deliveryFee).toFixed(2)}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n if (estimatedTotal !== undefined) {\n return (\n <div className=\"flex justify-between pt-4 border-t border-base-300\">\n <span className=\"font-semibold text-base-content\">Estimated Total:</span>\n <span className=\"font-bold text-xl text-base-content\">£{estimatedTotal.toFixed(2)}</span>\n </div>\n );\n }\n\n return null;\n}\n","\"use client\";\n\nimport { createRef, useEffect, useState } from \"react\";\nimport { X, Clock, Pencil, ShoppingBag, AlertTriangle, ChevronUp } from \"lucide-react\";\nimport { ViewOrderModalProps } from \"./types\";\nimport SelectedItemsByCategory from \"./SelectedItemsByCategory\";\nimport DateSessionNav from \"./DateSessionNav\";\nimport PricingSummary from \"./contact/PricingSummary\";\n\nexport default function ViewOrderModal({\n isOpen,\n onClose,\n mealSessions,\n activeSessionIndex,\n onSessionChange,\n getSessionTotal,\n getSessionDiscount,\n validationErrors,\n onEditSession,\n onRemoveSession,\n onEditItem,\n onRemoveItem,\n onSwapItem,\n onRemoveBundle,\n collapsedCategories,\n onToggleCategory,\n onViewMenu,\n generatingPdf,\n isCurrentSessionValid,\n totalPrice,\n onCheckout,\n canRemoveSession,\n formatTimeDisplay,\n navMode,\n dayGroups,\n selectedDayDate,\n currentDayGroup,\n onDateClick,\n onBackToDates,\n onAddDay,\n onAddSessionToDay,\n restaurants,\n pricing,\n calculatingPricing = false,\n onPlaceSelect,\n onClearAddress,\n}: ViewOrderModalProps) {\n const [showPricing, setShowPricing] = useState(false);\n\n // Lock body scroll while the modal is open so the page behind doesn't scroll\n useEffect(() => {\n if (!isOpen) return;\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const activeSession = mealSessions[activeSessionIndex];\n if (!activeSession) return null;\n\n const { promotions: sessionPromotions } = getSessionDiscount(activeSessionIndex);\n const sessionTotal = getSessionTotal(activeSessionIndex);\n const validationError = validationErrors[activeSessionIndex] || null;\n const isUnscheduled = !activeSession.sessionDate;\n const totalItemCount = activeSession.orderItems.reduce(\n (sum, oi) => sum + oi.quantity,\n 0\n );\n\n const formatDate = (date: string | undefined) => {\n if (!date) return \"Date not set\";\n return new Date(date).toLocaleDateString(\"en-GB\", {\n weekday: \"short\",\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n });\n };\n\n const formatTime = (eventTime: string | undefined) => {\n if (!eventTime) return \"Time not set\";\n const [hours, minutes] = eventTime.split(\":\");\n const hour = parseInt(hours);\n const minute = parseInt(minutes);\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n const start = `${hour12}:${String(minute).padStart(2, \"0\")} ${period}`;\n const totalEnd = hour * 60 + minute + 30;\n const endHour = Math.floor(totalEnd / 60) % 24;\n const endMinute = totalEnd % 60;\n const endPeriod = endHour >= 12 ? \"PM\" : \"AM\";\n const endHour12 = endHour % 12 || 12;\n return `${start} – ${endHour12}:${String(endMinute).padStart(2, \"0\")} ${endPeriod}`;\n };\n\n return (\n <div className=\"fixed inset-0 z-50 bg-white flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-base-200 bg-white\">\n <h2 className=\"text-lg font-bold text-gray-900\">Your Order</h2>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onViewMenu}\n disabled={generatingPdf}\n className=\"flex items-center gap-1.5 rounded-lg border border-primary px-3 py-1.5 text-xs font-semibold text-primary transition-colors hover:bg-primary/5 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {generatingPdf ? (\n <span className=\"loading loading-spinner loading-xs\" />\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n )}\n {generatingPdf ? \"Generating...\" : \"Download PDF\"}\n </button>\n <button\n onClick={onClose}\n className=\"p-2 rounded-full hover:bg-base-200 transition-colors\"\n >\n <X className=\"w-5 h-5 text-gray-600\" />\n </button>\n </div>\n </div>\n\n {/* Session Nav - same as main page */}\n <DateSessionNav\n navMode={navMode}\n dayGroups={dayGroups}\n selectedDayDate={selectedDayDate}\n currentDayGroup={currentDayGroup}\n expandedSessionIndex={activeSessionIndex}\n isNavSticky={false}\n onDateClick={onDateClick}\n onBackToDates={onBackToDates}\n onSessionPillClick={onSessionChange}\n onAddDay={onAddDay}\n onAddSessionToDay={onAddSessionToDay}\n formatTimeDisplay={formatTimeDisplay}\n addDayNavButtonRef={createRef()}\n backButtonRef={createRef()}\n firstDayTabRef={createRef()}\n firstSessionPillRef={createRef()}\n addSessionNavButtonRef={createRef()}\n />\n\n {/* Scrollable Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {/* Validation Error Banner */}\n {validationError && (\n <div className=\"p-4 bg-red-50 border-b-2 border-red-500 flex items-start gap-3\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6 text-red-500 flex-shrink-0 mt-0.5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-red-800 mb-1\">\n Catering Hours Conflict\n </p>\n <p className=\"text-sm text-red-700\">{validationError}</p>\n <button\n onClick={() => onEditSession(activeSessionIndex)}\n className=\"mt-3 px-4 py-2 bg-red-600 text-white text-sm font-medium rounded-lg hover:bg-red-700 transition-colors\"\n >\n Edit Session Time\n </button>\n </div>\n </div>\n )}\n\n {/* Unscheduled Warning */}\n {isUnscheduled && (\n <div className=\"p-4 bg-amber-50 border-b border-amber-200 flex items-start gap-3\">\n <AlertTriangle className=\"w-5 h-5 text-amber-500 flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-amber-800\">Set date & time to continue</p>\n <button\n onClick={() => onEditSession(activeSessionIndex)}\n className=\"mt-2 px-3 py-1.5 bg-amber-500 text-white text-xs font-medium rounded-lg hover:bg-amber-600 transition-colors\"\n >\n Edit Session\n </button>\n </div>\n </div>\n )}\n\n {/* Session Header */}\n <div className=\"px-4 py-3 flex items-center justify-between border-b border-base-200\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-9 h-9 rounded-full bg-primary flex items-center justify-center\">\n <Clock className=\"w-4 h-4 text-white\" />\n </div>\n <div>\n <p className=\"text-sm font-semibold text-gray-800\">\n {activeSession.sessionName}\n </p>\n <p className=\"text-xs text-gray-500\">\n {formatDate(activeSession.sessionDate)}\n </p>\n <p className=\"text-xs text-gray-500\">\n {formatTime(activeSession.eventTime)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-right mr-2\">\n <span className=\"text-sm font-semibold text-primary\">\n £{sessionTotal.toFixed(2)}\n </span>\n <p className=\"text-[10px] text-gray-500\">{totalItemCount} items</p>\n {sessionPromotions.length > 0 && (\n <p className=\"text-[10px] text-green-600 font-semibold\">\n {sessionPromotions.length === 1 ? \"1 offer applied\" : `${sessionPromotions.length} offers applied`}\n </p>\n )}\n </div>\n <button\n onClick={() => onEditSession(activeSessionIndex)}\n className=\"p-2 rounded-full hover:bg-base-200 transition-colors text-primary\"\n title=\"Edit Session\"\n >\n <Pencil className=\"w-4 h-4\" />\n </button>\n {canRemoveSession(activeSessionIndex) && (\n <button\n onClick={(e) => onRemoveSession(activeSessionIndex, e)}\n className=\"p-2 rounded-full hover:bg-red-50 transition-colors text-red-500\"\n title=\"Remove Session\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Items */}\n <div className=\"p-4\">\n {activeSession.orderItems.length > 0 ? (\n <div className=\"min-w-0 overflow-hidden\">\n <SelectedItemsByCategory\n sessionIndex={activeSessionIndex}\n onEdit={onEditItem}\n onRemove={onRemoveItem}\n onSwapItem={onSwapItem}\n onRemoveBundle={onRemoveBundle}\n collapsedCategories={collapsedCategories}\n onToggleCategory={onToggleCategory}\n onViewMenu={onViewMenu}\n restaurants={restaurants}\n sessionPromotions={sessionPromotions}\n />\n </div>\n ) : (\n <div className=\"py-12 text-center\">\n <ShoppingBag className=\"w-12 h-12 text-gray-300 mx-auto mb-3\" />\n <p className=\"text-gray-500 text-sm\">Browse the menu to add items</p>\n </div>\n )}\n </div>\n </div>\n\n {/* Fixed Bottom – identical to main page View Order bar */}\n <div className=\"relative flex-shrink-0\">\n {/* Floating session detail pill + chevron button */}\n <div className=\"absolute -top-14 left-0 right-0 flex justify-center items-center gap-2 z-10\">\n <div className=\"flex flex-col items-center px-3 py-1.5 rounded-2xl bg-white/50 backdrop-blur-sm shadow-sm border border-base-200\">\n <span className=\"text-xs font-semibold text-gray-800\">{activeSession.sessionName}</span>\n <span className=\"text-[10px] text-gray-500\">\n {activeSession.sessionDate\n ? new Date(activeSession.sessionDate).toLocaleDateString(\"en-GB\", { weekday: \"short\", day: \"numeric\", month: \"short\" })\n : \"Date not set\"}\n {activeSession.eventTime && ` · ${formatTimeDisplay(activeSession.eventTime)}`}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setShowPricing((v) => !v)}\n className=\"w-8 h-8 rounded-full bg-white/50 backdrop-blur-sm shadow-sm border border-base-200 flex items-center justify-center hover:bg-white/80 transition-colors\"\n aria-label={showPricing ? \"Hide pricing\" : \"Show pricing\"}\n >\n <ChevronUp className={`w-4 h-4 text-gray-600 transition-transform duration-200 ${showPricing ? \"rotate-180\" : \"\"}`} />\n </button>\n </div>\n\n {/* Expandable pricing summary */}\n {showPricing && (\n <div className=\"px-4 pt-2 pb-3 bg-white border-t border-base-200\">\n <PricingSummary\n pricing={pricing ?? null}\n calculatingPricing={calculatingPricing}\n compact\n onPlaceSelect={onPlaceSelect}\n onClearAddress={onClearAddress}\n />\n </div>\n )}\n\n <div className=\"p-4 bg-primary\">\n <button\n onClick={onCheckout}\n className=\"w-full flex items-center justify-between text-white\"\n >\n <div className=\"flex items-center gap-2\">\n <ShoppingBag className=\"w-5 h-5\" />\n <span className=\"font-semibold\">\n {isCurrentSessionValid ? \"Checkout\" : \"Min. Order Not Met\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg font-bold\">£{(pricing?.total ?? totalPrice).toFixed(2)}</span>\n <span className=\"text-sm opacity-80\">{totalItemCount} items</span>\n </div>\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\n\nimport { MenuItem } from \"../types/menu\";\nimport MenuItemModal from \"./MenuItemModal\";\n\ninterface MenuItemCardProps {\n item: MenuItem;\n quantity?: number;\n isExpanded?: boolean;\n // isSearching: boolean;\n onToggleExpand?: () => void;\n onAddItem?: (item: MenuItem) => void;\n onUpdateQuantity?: (itemId: string, quantity: number) => void;\n onAddOrderPress?: (item: MenuItem) => void;\n viewOnly?: boolean;\n onAddToOrder?: (item: MenuItem) => void;\n showRestaurantName?: boolean;\n}\n\nexport default function MenuItemCard({\n item,\n quantity = 0,\n isExpanded = false,\n // isSearching,\n onToggleExpand = () => {},\n onAddItem,\n onUpdateQuantity,\n onAddOrderPress,\n viewOnly = false,\n onAddToOrder,\n showRestaurantName = false,\n}: MenuItemCardProps) {\n // console.log(\"Item: \", JSON.stringify(item, null, 2));\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n // const displayPrice =\n // item.isDiscount && discountPrice > 0 ? discountPrice : price;\n const BACKEND_QUANTITY_UNIT = item.cateringQuantityUnit || 1;\n const DISPLAY_FEEDS_PER_UNIT = item.feedsPerUnit || 1;\n\n // Tooltip state for dietary icons\n const [activeTooltip, setActiveTooltip] = useState<string | null>(null);\n\n return (\n <>\n <div\n key={item.id}\n className=\"bg-white rounded-lg border border-gray-200 transition-shadow overflow-hidden cursor-pointer h-[158px]\"\n onClick={() => {\n setActiveTooltip(null);\n onToggleExpand();\n }}\n >\n <div className=\"flex flex-row h-full\">\n {/* Left Side - Content */}\n <div className=\"flex-1 px-3 pt-2 pb-3\">\n {/* Header - Name */}\n <div className=\"flex flex-col h-full justify-between\">\n <div>\n <div className=\"flex items-start justify-between mb-0.5\">\n <h3 className=\"font-bold text-sm text-gray-900 flex-1 line-clamp-1\">\n {item.menuItemName}\n </h3>\n {item.minOrderQuantity && item.minOrderQuantity > 1 && (\n <span className=\"text-[9px] text-amber-700 bg-amber-50 px-1.5 py-0.5 rounded font-medium whitespace-nowrap ml-1\">\n Min {item.minOrderQuantity}\n </span>\n )}\n </div>\n\n {showRestaurantName && item.restaurantName && (\n <p className=\"text-[10px] text-primary font-medium mb-0.5 line-clamp-1\">\n {item.restaurantName}\n </p>\n )}\n\n {/* Description - up to 3 lines */}\n {item.description && (\n <p className=\"text-gray-600 text-xs mt-1.5 mb-1 leading-relaxed line-clamp-3\">\n {item.description}\n </p>\n )}\n </div>\n\n {/* Show restaurant name in search results */}\n {/* {isSearching && item.restaurant && (\n <p className=\"text-xs md:text-sm text-gray-500 mb-2\">\n From: {item.restaurant.name}\n </p>\n )} */}\n\n {/* Price / dietary / feeds */}\n <div className=\"flex flex-col gap-0.5\">\n {/* Row 1: price + dietary icons */}\n <div className=\"flex items-center gap-2\">\n {item.isDiscount && discountPrice > 0 ? (\n <>\n <p className=\"text-gray-500 text-[10px] line-through\">\n £{(price * BACKEND_QUANTITY_UNIT).toFixed(2)}\n </p>\n <p className=\"text-primary font-bold text-sm\">\n £{(discountPrice * BACKEND_QUANTITY_UNIT).toFixed(2)}\n </p>\n </>\n ) : (\n <p className=\"text-primary font-bold text-sm\">\n £{(price * BACKEND_QUANTITY_UNIT).toFixed(2)}\n </p>\n )}\n {item.dietaryFilters && item.dietaryFilters.length > 0 && (\n <div className=\"flex gap-0.5 items-center\">\n {item.dietaryFilters.slice(0, 4).map((filter) => {\n const iconMap: Record<string, string> = {\n vegetarian: \"vegetarian.png\",\n halal: \"halal.png\",\n no_nut: \"no_nut.png\",\n no_dairy: \"no_dairy.png\",\n pescatarian: \"pescatarian.png\",\n vegan: \"vegan.png\",\n };\n const labelMap: Record<string, string> = {\n vegetarian: \"Vegetarian\",\n halal: \"Halal\",\n no_nut: \"No Nuts\",\n no_dairy: \"No Dairy\",\n pescatarian: \"Pescatarian\",\n vegan: \"Vegan\",\n };\n const iconFile = iconMap[filter.toLowerCase()];\n const label = labelMap[filter.toLowerCase()] || filter;\n const tooltipKey = `${item.id}-${filter}`;\n const isTooltipActive = activeTooltip === tooltipKey;\n if (!iconFile) return null;\n return (\n <div\n key={filter}\n className=\"relative w-4 h-4 group cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n setActiveTooltip(isTooltipActive ? null : tooltipKey);\n }}\n >\n <img\n src={`/dietary-icons/unfilled/${iconFile}`}\n alt={label}\n className=\"object-contain\"\n />\n <div\n className={`absolute bottom-full left-1/2 -translate-x-1/2 mb-1 px-1.5 py-0.5 bg-gray-900 text-white text-[9px] rounded whitespace-nowrap transition-opacity z-10 ${\n isTooltipActive\n ? \"opacity-100\"\n : \"opacity-0 group-hover:opacity-100 pointer-events-none\"\n }`}\n >\n {label}\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 border-[3px] border-transparent border-t-gray-900\"></div>\n </div>\n </div>\n );\n })}\n {item.dietaryFilters.length > 4 && (\n <span className=\"text-[9px] text-gray-500\">+{item.dietaryFilters.length - 4}</span>\n )}\n </div>\n )}\n </div>\n {/* Row 2: £/pp · Feeds up to X */}\n {DISPLAY_FEEDS_PER_UNIT > 1 && (\n <div className=\"flex items-center gap-1.5 text-[10px] text-gray-500\">\n <span>£{((item.isDiscount && discountPrice > 0 ? discountPrice : price) * BACKEND_QUANTITY_UNIT / DISPLAY_FEEDS_PER_UNIT).toFixed(2)}/pp</span>\n <span>·</span>\n <span>Feeds up to {DISPLAY_FEEDS_PER_UNIT}</span>\n </div>\n )}\n\n {/* Add to order button / quantity controls - Hidden in viewOnly mode */}\n {/*\n {!viewOnly && (\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"flex-shrink-0 flex items-center gap-2\"\n >\n {quantity > 0 ? (\n <>\n <button\n onClick={() => onAddOrderPress?.(item)}\n className=\"lg:hidden w-8 h-8 bg-primary hover:opacity-90 text-white rounded-full font-medium transition-all flex items-center justify-center\"\n aria-label=\"Add to Order\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n\n <div className=\"hidden lg:flex bg-[#F5F1E8] p-1 rounded-md border border-[#F0ECE3] items-center gap-1\">\n <button\n onClick={() => {\n const newPortionQty = Math.max(\n 0,\n portionQuantity - 1\n );\n const newBackendQty =\n newPortionQty * BACKEND_QUANTITY_UNIT;\n onUpdateQuantity?.(item.id, newBackendQty);\n }}\n className=\"w-6 h-6 bg-white border border-gray-300 rounded hover:bg-gray-100 flex items-center justify-center text-xs flex-shrink-0\"\n >\n −\n </button>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={quantityInput}\n onChange={(e) => {\n const val = e.target.value;\n if (val === \"\" || /^\\d+$/.test(val)) {\n setQuantityInput(val);\n if (val !== \"\" && !isNaN(parseInt(val))) {\n const newPortionQty = parseInt(val);\n const newBackendQty =\n Math.max(0, newPortionQty) *\n BACKEND_QUANTITY_UNIT;\n onUpdateQuantity?.(item.id, newBackendQty);\n }\n }\n }}\n onBlur={(e) => {\n if (\n e.target.value === \"\" ||\n parseInt(e.target.value) < 1\n ) {\n onUpdateQuantity?.(item.id, 0);\n setQuantityInput(\"0\");\n }\n }}\n className=\"w-8 text-center font-medium text-xs text-gray-900 bg-white border border-gray-300 rounded px-0.5 py-0.5 flex-shrink-0\"\n />\n <button\n onClick={() => {\n const newPortionQty = portionQuantity + 1;\n const newBackendQty =\n newPortionQty * BACKEND_QUANTITY_UNIT;\n onUpdateQuantity?.(item.id, newBackendQty);\n }}\n className=\"w-6 h-6 bg-white border border-gray-300 rounded hover:bg-gray-100 flex items-center justify-center text-xs flex-shrink-0\"\n >\n +\n </button>\n </div>\n </>\n ) : (\n <button\n onClick={handleAddToOrder}\n className=\"w-7 h-7 bg-primary hover:opacity-90 text-white rounded-full font-medium transition-all flex items-center justify-center flex-shrink-0\"\n aria-label=\"Add to Order\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 4v16m8-8H4\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n */}\n </div>\n </div>\n </div>\n\n {/* Right Side - Image */}\n {item.image && (\n <div className=\"w-[130px] h-full bg-gray-200 flex-shrink-0\">\n <img\n src={item.image}\n alt={item.menuItemName}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n </div>\n </div>\n\n {/* Modal */}\n <MenuItemModal\n item={item}\n isOpen={isExpanded}\n onClose={onToggleExpand}\n quantity={quantity}\n onAddItem={onAddItem}\n onUpdateQuantity={onUpdateQuantity}\n viewOnly={viewOnly}\n onAddToOrder={onAddToOrder}\n />\n\n {/* Image Lightbox */}\n {/* {isImageEnlarged && item.image && (\n <div\n className=\"fixed inset-0 bg-black/95 backdrop-blur-sm z-50 flex items-center justify-center p-4\"\n onClick={() => setIsImageEnlarged(false)}\n >\n <button\n onClick={() => setIsImageEnlarged(false)}\n className=\"absolute top-4 right-4 text-white hover:text-gray-300 transition-colors\"\n aria-label=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-8 w-8\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n <img\n src={item.image}\n alt={item.name}\n className=\"max-w-full max-h-full object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n )} */}\n </>\n );\n}\n","\"use client\";\n\nimport { CateringBundleResponse } from \"../types/bundle\";\nimport { Package } from \"lucide-react\";\n\ninterface BundleCardProps {\n bundle: CateringBundleResponse;\n onClick: (bundle: CateringBundleResponse) => void;\n}\n\nexport default function BundleCard({ bundle, onClick }: BundleCardProps) {\n return (\n <button\n onClick={() => onClick(bundle)}\n className=\"w-full cursor-pointer flex items-center gap-3 rounded-xl border border-gray-200 bg-white p-3 text-left transition-shadow\"\n >\n {bundle.imageUrl ? (\n <img\n src={bundle.imageUrl}\n alt={bundle.name}\n className=\"w-20 h-20 rounded-lg object-cover flex-shrink-0\"\n />\n ) : (\n <div className=\"w-20 h-20 rounded-lg bg-gradient-to-br from-primary/10 to-primary/5 flex items-center justify-center flex-shrink-0\">\n <Package className=\"w-8 h-8 text-primary/40\" />\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3 className=\"font-bold text-gray-900 text-sm sm:text-base\">{bundle.name}</h3>\n <div className=\"flex-shrink-0 text-right\">\n <p className=\"text-sm sm:text-base font-bold text-primary\">\n £{Number(bundle.pricePerPerson || 0).toFixed(2)}\n </p>\n <p className=\"text-xs text-gray-500\">per person</p>\n </div>\n </div>\n\n {bundle.description && (\n <p className=\"text-xs text-gray-500 mt-1 line-clamp-2\">{bundle.description}</p>\n )}\n\n <div className=\"flex items-center gap-2 text-xs text-gray-500 mt-1.5\">\n <span className=\"bg-primary/10 text-primary px-1.5 py-0.5 rounded-full font-medium\">\n {bundle.items.length} items\n </span>\n <span>Serves {bundle.baseGuestCount || 0}+</span>\n </div>\n </div>\n </button>\n );\n}\n","\"use client\";\n\nimport { useState, useMemo } from \"react\";\n\nimport { CateringBundleResponse } from \"../../types/bundle\";\nimport { Package, Minus, Plus } from \"lucide-react\";\n\nconst DIETARY_ICON_MAP: Record<string, { file: string; label: string }> = {\n vegetarian: { file: \"vegetarian.png\", label: \"Vegetarian\" },\n vegan: { file: \"vegan.png\", label: \"Vegan\" },\n halal: { file: \"halal.png\", label: \"Halal\" },\n pescatarian: { file: \"pescatarian.png\", label: \"Pescatarian\" },\n no_nut: { file: \"no_nut.png\", label: \"Nut-Free\" },\n no_dairy: { file: \"no_dairy.png\", label: \"Dairy-Free\" },\n};\n\ninterface BundleDetailModalProps {\n bundle: CateringBundleResponse;\n defaultQuantity: number;\n isAdding: boolean;\n onAdd: (bundle: CateringBundleResponse, quantity: number) => void;\n onClose: () => void;\n}\n\nexport default function BundleDetailModal({\n bundle,\n defaultQuantity,\n isAdding,\n onAdd,\n onClose,\n}: BundleDetailModalProps) {\n const baseGuestCount = bundle.baseGuestCount ?? 1;\n const [guestCountInput, setGuestCountInput] = useState(String(Math.max(1, defaultQuantity) * baseGuestCount));\n const guestCount = Math.max(1, parseInt(guestCountInput, 10) || 1);\n const [roundUp, setRoundUp] = useState(true);\n const [showDescriptions, setShowDescriptions] = useState(false);\n\n const exactBundles = guestCount / baseGuestCount;\n const bundlesFloor = Math.max(1, Math.floor(exactBundles));\n const bundlesCeil = Math.ceil(exactBundles);\n const isExact = Number.isInteger(exactBundles);\n const quantity = isExact ? bundlesCeil : (roundUp ? bundlesCeil : bundlesFloor);\n const peopleServed = baseGuestCount * quantity;\n\n const sortedItems = [...bundle.items].sort((a, b) => a.sortOrder - b.sortOrder);\n const hasAnyDescription = bundle.items.some((item) => !!item.menuItemDescription);\n\n const estimatedTotal = useMemo(() => {\n let total = 0;\n for (const item of bundle.items) {\n const scaledQty = item.quantity * quantity;\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum, a) => sum + Number(a.price ?? 0) * (a.quantity || 0),\n 0\n );\n total += item.menuItemPrice * scaledQty + addonTotal * quantity;\n }\n return total;\n }, [bundle.items, quantity]);\n\n const estimatedPricePerPerson = peopleServed > 0 ? estimatedTotal / peopleServed : 0;\n\n return (\n <div\n className=\"fixed inset-0 bg-black/50 flex items-end sm:items-center justify-center z-[60] sm:p-4\"\n onClick={onClose}\n >\n <div\n className=\"bg-white w-full h-[100dvh] max-h-[100dvh] sm:h-auto sm:max-h-[85vh] sm:max-w-lg rounded-none sm:rounded-2xl flex flex-col overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"px-4 pt-3 pb-2 flex items-start justify-between gap-3\">\n <div>\n <h3 className=\"font-bold text-base text-gray-900\">{bundle.name}</h3>\n {bundle.description && (\n <div className=\"mt-0.5 max-h-[3.5rem] overflow-y-auto pr-1\">\n <p className=\"text-xs leading-5 text-gray-500\">{bundle.description}</p>\n </div>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"w-7 h-7 flex items-center justify-center rounded-full hover:bg-base-200 transition-colors flex-shrink-0\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </div>\n\n {/* Show descriptions toggle */}\n {hasAnyDescription && <div className=\"px-4 py-1.5 border-b border-base-200\">\n <button\n onClick={() => setShowDescriptions((v) => !v)}\n className={`px-2.5 py-1 text-xs font-medium rounded-lg border transition-colors ${\n showDescriptions\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-base-300 text-gray-600 hover:bg-base-100\"\n }`}\n >\n {showDescriptions ? \"Hide\" : \"Show\"} item descriptions\n </button>\n </div>}\n\n {/* Guest count selector */}\n <div className=\"px-4 py-2 border-b border-base-200 bg-base-100/50\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-xs font-medium text-gray-700\">Number of guests</p>\n <p className=\"text-[11px] text-gray-500\">\n {quantity} bundle{quantity !== 1 ? \"s\" : \"\"} • Serves ~{peopleServed} people\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setGuestCountInput((v) => String(Math.max(1, (parseInt(v, 10) || 1) - 1)))}\n className=\"w-7 h-7 flex items-center justify-center rounded-full border border-base-300 hover:bg-base-200 transition-colors\"\n >\n <Minus className=\"w-3 h-3\" />\n </button>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={guestCountInput}\n onChange={(e) => setGuestCountInput(e.target.value.replace(/\\D/g, \"\"))}\n onBlur={() => setGuestCountInput(String(Math.max(1, parseInt(guestCountInput, 10) || 1)))}\n className=\"w-12 text-center font-bold text-base border border-base-300 rounded-lg py-0.5 [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n />\n <button\n onClick={() => setGuestCountInput((v) => String((parseInt(v, 10) || 1) + 1))}\n className=\"w-7 h-7 flex items-center justify-center rounded-full border border-base-300 hover:bg-base-200 transition-colors\"\n >\n <Plus className=\"w-3 h-3\" />\n </button>\n </div>\n </div>\n {!isExact && (\n <div className=\"flex gap-2\">\n <button\n onClick={() => setRoundUp(false)}\n className={`flex-1 text-xs py-1 rounded-lg border transition-colors ${\n !roundUp\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-base-300 text-gray-600 hover:bg-base-100\"\n }`}\n >\n ↓ {bundlesFloor} bundle{bundlesFloor !== 1 ? \"s\" : \"\"} (~{bundlesFloor * baseGuestCount} people)\n </button>\n <button\n onClick={() => setRoundUp(true)}\n className={`flex-1 text-xs py-1 rounded-lg border transition-colors ${\n roundUp\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-base-300 text-gray-600 hover:bg-base-100\"\n }`}\n >\n ↑ {bundlesCeil} bundle{bundlesCeil !== 1 ? \"s\" : \"\"} (~{bundlesCeil * baseGuestCount} people)\n </button>\n </div>\n )}\n </div>\n </div>\n\n {/* Items list */}\n <div className=\"overflow-y-auto flex-1 divide-y divide-base-200\">\n {sortedItems.map((item) => {\n const scaledQty = item.quantity * quantity;\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum, a) => sum + Number(a.price ?? 0) * (a.quantity || 0),\n 0\n );\n const lineTotal = item.menuItemPrice * scaledQty + addonTotal * quantity;\n const dietaryFilters = item.menuItemDietaryFilters || [];\n const servesCount = scaledQty * (item.menuItemFeedsPerUnit || 1);\n return (\n <div key={item.id} className=\"px-4 py-2\">\n <div className=\"flex items-stretch gap-3\">\n {/* Quantity */}\n <div className=\"flex-shrink-0 flex items-start sm:items-center justify-center pt-1 sm:pt-0\">\n <span className=\"flex items-center justify-center w-10 h-10 rounded-full bg-primary/10 text-primary font-bold text-sm\">\n ×{scaledQty}\n </span>\n </div>\n {/* Image */}\n <div className=\"relative flex-shrink-0 w-16 h-16 sm:w-24 sm:h-24 rounded-lg overflow-hidden bg-base-200\">\n {item.menuItemImageUrl ? (\n <img\n src={item.menuItemImageUrl}\n alt={item.menuItemName}\n className=\"object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <svg className=\"w-6 h-6 text-base-content/30\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14\" />\n </svg>\n </div>\n )}\n </div>\n {/* Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-1\">\n <p className=\"font-semibold text-gray-900 text-sm\">{item.menuItemName}</p>\n <span className=\"text-sm font-bold text-gray-800 flex-shrink-0\">£{lineTotal.toFixed(2)}</span>\n </div>\n {servesCount > 0 && (\n <p className=\"text-[11px] text-gray-500 mt-0.5\">Serves ~{servesCount}</p>\n )}\n {dietaryFilters.length > 0 && (\n <div className=\"mt-0.5 flex flex-wrap gap-1 items-center\">\n {dietaryFilters.slice(0, 4).map((filter) => {\n const icon = DIETARY_ICON_MAP[filter.toLowerCase()];\n if (!icon) return null;\n return (\n <div key={`${item.id}-${filter}`} className=\"relative w-4 h-4\" title={icon.label}>\n <img src={`/dietary-icons/unfilled/${icon.file}`} alt={icon.label} className=\"object-contain\" />\n </div>\n );\n })}\n {dietaryFilters.length > 4 && (\n <span className=\"text-[10px] text-gray-500\">+{dietaryFilters.length - 4}</span>\n )}\n </div>\n )}\n {showDescriptions && item.menuItemDescription && (\n <p className=\"text-xs text-gray-500 mt-0.5 line-clamp-2 break-words w-full\">{item.menuItemDescription}</p>\n )}\n {item.selectedAddons && item.selectedAddons.length > 0 && (\n <div className=\"mt-1 space-y-0.5\">\n {item.selectedAddons.map((addon, i) => (\n <p key={i} className=\"text-xs text-gray-500\">\n • {addon.groupTitle ?? \"Options\"}: {addon.name}\n {addon.quantity > 1 && ` (×${addon.quantity})`}\n </p>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Footer */}\n <div className=\"p-4 pb-[calc(1rem+env(safe-area-inset-bottom))] border-t border-base-200 space-y-3\">\n <p className=\"text-xs text-gray-500 text-center\">\n You can change individual item amounts after adding to your session.\n </p>\n\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-bold text-gray-900\">Estimated total</p>\n <p className=\"text-xs text-gray-500\">\n {bundle.items.length} items • Serves ~{peopleServed} people\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-xl font-bold text-primary\">£{estimatedTotal.toFixed(2)}</p>\n <p className=\"text-xs text-gray-500\">£{estimatedPricePerPerson.toFixed(2)}/person</p>\n </div>\n </div>\n\n <button\n onClick={() => onAdd(bundle, quantity)}\n disabled={isAdding}\n className=\"w-full py-3 bg-primary text-white font-semibold rounded-xl hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {isAdding ? (\n <>\n <span className=\"loading loading-spinner loading-sm\" />\n Adding...\n </>\n ) : (\n <>\n <Package className=\"w-4 h-4\" />\n Add Bundle to Session\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n useState,\n useMemo,\n useEffect,\n useRef,\n RefObject,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Search,\n X,\n ArrowLeft,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n Info,\n Package,\n Clock3,\n} from \"lucide-react\";\nimport {\n MenuItem,\n CategoryWithSubcategories,\n DietaryFilter,\n SearchResponse,\n SearchResult,\n} from \"../types/menu\";\nimport { Restaurant } from \"../types/restaurant\";\nimport { CateringBundleItem, CateringBundleResponse } from \"../types/bundle\";\nimport { categoryService } from \"../shims/services\";\nimport { cateringService } from \"../shims/cateringService\";\nimport { useCateringState } from \"../state/CateringStateContext\";\nimport MenuItemCard from \"./MenuItemCard\";\nimport BundleCard from \"./BundleCard\";\nimport BundleDetailModal from \"./modals/BundleDetailModal\";\nimport { mapToMenuItem } from \"./catering-order-helpers\";\n\nfunction haversineDistanceMiles(lat1: number, lng1: number, lat2: number, lng2: number): number {\n const R = 3958.8;\n const dLat = ((lat2 - lat1) * Math.PI) / 180;\n const dLng = ((lng2 - lng1) * Math.PI) / 180;\n const a = Math.sin(dLat / 2) ** 2 + Math.cos((lat1 * Math.PI) / 180) * Math.cos((lat2 * Math.PI) / 180) * Math.sin(dLng / 2) ** 2;\n return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\ninterface RestaurantMenuBrowserProps {\n restaurants: Restaurant[];\n restaurantsLoading: boolean;\n onOpenBundles?: () => void;\n defaultBundleGuestCount?: number;\n onAddItem: (item: MenuItem) => void;\n onUpdateQuantity: (itemId: string, quantity: number) => void;\n onAddOrderPress: (item: MenuItem) => void;\n getItemQuantity: (itemId: string) => number;\n expandedItemId: string | null;\n setExpandedItemId: (id: string | null) => void;\n selectedDietaryFilters: DietaryFilter[];\n toggleDietaryFilter: (filter: DietaryFilter) => void;\n restaurantListRef: RefObject<HTMLDivElement | null>;\n firstMenuItemRef: RefObject<HTMLDivElement | null>;\n categoriesRowRef?: RefObject<HTMLDivElement | null>;\n sessionIndex: number;\n expandedSessionIndex: number | null;\n onRegisterResetToList?: (fn: () => void) => void;\n onMobileSearchStateChange?: (state: {\n mode: \"list\" | \"restaurant\";\n query: string;\n }) => void;\n onRegisterMobileSearchSetter?: (setter: (query: string) => void) => void;\n}\n\ninterface MenuItemGroup {\n type: \"items\";\n name: string;\n items: MenuItem[];\n information: string | null;\n}\n\ninterface BundleGroup {\n type: \"bundles\";\n name: string;\n bundles: CateringBundleResponse[];\n}\n\ntype RestaurantGroup = MenuItemGroup | BundleGroup;\n\nfunction enrichBundleItemAddons(\n bundleItem: CateringBundleItem,\n menuItem: MenuItem,\n): MenuItem[\"selectedAddons\"] {\n if (!bundleItem.selectedAddons || bundleItem.selectedAddons.length === 0) {\n return [];\n }\n return bundleItem.selectedAddons.map((bundleAddon) => {\n const matchedGroup = menuItem.addons?.find((g) =>\n g.items.some((a) => a.name === bundleAddon.name),\n );\n const matchedAddon = matchedGroup?.items.find(\n (a) => a.name === bundleAddon.name,\n );\n return {\n name: bundleAddon.name,\n price: Number(matchedAddon?.price ?? 0),\n quantity: bundleAddon.quantity,\n groupTitle: matchedGroup?.groupTitle ?? \"Options\",\n };\n });\n}\n\nfunction getRestaurantAdvanceNoticeText(restaurant: Restaurant): string | null {\n const advanceNotice = restaurant.advanceNoticeSettings;\n\n if (\n advanceNotice?.type === \"hours\" &&\n typeof advanceNotice.hours === \"number\" &&\n advanceNotice.hours > 0\n ) {\n return `${advanceNotice.hours}h notice`;\n }\n\n if (\n advanceNotice?.type === \"days_before_time\" &&\n typeof advanceNotice.days === \"number\"\n ) {\n if (advanceNotice.cutoffTime) {\n const [h, m] = advanceNotice.cutoffTime.split(\":\").map(Number);\n const period = h >= 12 ? \"PM\" : \"AM\";\n const h12 = h % 12 || 12;\n const timeStr = `${h12}:${m.toString().padStart(2, \"0\")} ${period}`;\n if (advanceNotice.days === 0) return `Order by ${timeStr}`;\n const label = advanceNotice.days === 1 ? \"day\" : \"days\";\n return `${advanceNotice.days} ${label} notice by ${timeStr}`;\n }\n if (advanceNotice.days > 0) {\n const label = advanceNotice.days === 1 ? \"day\" : \"days\";\n return `${advanceNotice.days} ${label} notice`;\n }\n }\n\n if (\n typeof restaurant.minimumDeliveryNoticeHours === \"number\" &&\n restaurant.minimumDeliveryNoticeHours > 0\n ) {\n return `${restaurant.minimumDeliveryNoticeHours}h notice`;\n }\n\n return null;\n}\n\nfunction isRestaurantAdvanceNoticeMet(\n restaurant: Restaurant,\n sessionDate?: string,\n eventTime?: string,\n): boolean {\n if (!sessionDate || !eventTime) return true;\n\n const date = new Date(sessionDate + \"T00:00:00\");\n const [eventHours, eventMinutes] = eventTime.split(\":\").map(Number);\n date.setHours(eventHours, eventMinutes || 0, 0, 0);\n const now = new Date();\n const hoursUntilEvent = (date.getTime() - now.getTime()) / (1000 * 60 * 60);\n\n const notice = restaurant.advanceNoticeSettings;\n if (\n notice?.type === \"hours\" &&\n typeof notice.hours === \"number\" &&\n notice.hours > 0\n ) {\n return hoursUntilEvent >= notice.hours;\n }\n\n if (notice?.type === \"days_before_time\" && typeof notice.days === \"number\") {\n const cutoff = new Date(date);\n cutoff.setDate(cutoff.getDate() - notice.days);\n if (notice.cutoffTime) {\n const [cutoffHours, cutoffMinutes] = notice.cutoffTime\n .split(\":\")\n .map(Number);\n cutoff.setHours(cutoffHours, cutoffMinutes || 0, 0, 0);\n } else {\n cutoff.setHours(23, 59, 59, 999);\n }\n return now <= cutoff;\n }\n\n if (\n typeof restaurant.minimumDeliveryNoticeHours === \"number\" &&\n restaurant.minimumDeliveryNoticeHours > 0\n ) {\n return hoursUntilEvent >= restaurant.minimumDeliveryNoticeHours;\n }\n\n return true;\n}\n\nfunction timeToMinutes(time: string): number {\n const [h, m] = time.split(\":\").map(Number);\n return h * 60 + (m || 0);\n}\n\nfunction formatTimeLabel(time: string): string {\n const [hours, minutes] = time.split(\":\").map(Number);\n\n if (Number.isNaN(hours) || Number.isNaN(minutes)) {\n return time;\n }\n\n const period = hours >= 12 ? \"PM\" : \"AM\";\n const displayHours = hours % 12 || 12;\n\n return `${displayHours}:${minutes.toString().padStart(2, \"0\")} ${period}`;\n}\n\nfunction getClosestSlotLabel(\n slots: Array<{ open?: string | null; close?: string | null }>,\n eventTime?: string,\n): string | null {\n const validSlots = slots.filter(\n (slot): slot is { open: string; close: string } =>\n Boolean(slot.open) && Boolean(slot.close),\n );\n\n if (validSlots.length === 0) {\n return null;\n }\n\n if (!eventTime) {\n const firstSlot = validSlots[0];\n return `${formatTimeLabel(firstSlot.open)} - ${formatTimeLabel(firstSlot.close)}`;\n }\n\n const eventMinutes = timeToMinutes(eventTime);\n const closestSlot = validSlots.reduce(\n (closest, slot) => {\n const openMinutes = timeToMinutes(slot.open);\n const closeMinutes = timeToMinutes(slot.close);\n const distance =\n eventMinutes < openMinutes\n ? openMinutes - eventMinutes\n : eventMinutes > closeMinutes\n ? eventMinutes - closeMinutes\n : 0;\n\n if (!closest || distance < closest.distance) {\n return { slot, distance };\n }\n\n return closest;\n },\n null as { slot: { open: string; close: string }; distance: number } | null,\n );\n\n if (!closestSlot) {\n return null;\n }\n\n return `${formatTimeLabel(closestSlot.slot.open)} - ${formatTimeLabel(\n closestSlot.slot.close,\n )}`;\n}\n\nfunction getWeeklyCateringHoursText(restaurant: Restaurant): string {\n const days = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n ];\n\n if (!restaurant.cateringOperatingHours?.length) {\n return \"No catering hours set for this week\";\n }\n\n return days\n .map((day) => {\n const daySlots = restaurant\n .cateringOperatingHours!.filter(\n (slot) =>\n slot.day.toLowerCase() === day.toLowerCase() && slot.enabled,\n )\n .filter((slot) => slot.open && slot.close);\n\n if (daySlots.length === 0) {\n return `${day}: No catering`;\n }\n\n const label = daySlots\n .map(\n (slot) =>\n `${formatTimeLabel(slot.open!)} - ${formatTimeLabel(slot.close!)}`,\n )\n .join(\" / \");\n\n return `${day}: ${label}`;\n })\n .join(\"\\n\");\n}\n\nfunction getRestaurantCateringWindowInfo(\n restaurant: Restaurant,\n sessionDate?: string,\n eventTime?: string,\n): {\n text: string;\n fullText: string;\n isAvailable: boolean;\n} {\n if (!sessionDate) {\n return {\n text: \"Set a session date to view catering times\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable: true,\n };\n }\n\n const date = new Date(\n sessionDate + (sessionDate.includes(\"T\") ? \"\" : \"T00:00:00\"),\n );\n\n if (restaurant.dateOverrides?.length) {\n const override = restaurant.dateOverrides.find(\n (o) => o.date === sessionDate,\n );\n if (override) {\n if (override.isClosed) {\n return {\n text: \"No catering on this day\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable: false,\n };\n }\n if (override.timeSlots?.length) {\n const closestSlotLabel = getClosestSlotLabel(\n override.timeSlots,\n eventTime,\n );\n\n if (!eventTime) {\n return {\n text: closestSlotLabel || \"Catering times unavailable\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable: true,\n };\n }\n\n const eventMinutes = timeToMinutes(eventTime);\n const isAvailable = override.timeSlots.some(\n (slot) =>\n eventMinutes >= timeToMinutes(slot.open) &&\n eventMinutes <= timeToMinutes(slot.close),\n );\n\n return {\n text: closestSlotLabel || \"Catering times unavailable\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable,\n };\n }\n }\n }\n\n if (!restaurant.cateringOperatingHours?.length) {\n return {\n text: \"No catering on this day\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable: false,\n };\n }\n\n const dayName = date\n .toLocaleDateString(\"en-US\", { weekday: \"long\" })\n .toLowerCase();\n\n const daySlots = restaurant.cateringOperatingHours.filter(\n (h) => h.day.toLowerCase() === dayName && h.enabled,\n );\n\n if (daySlots.length === 0) {\n return {\n text: \"No catering on this day\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable: false,\n };\n }\n\n const closestSlotLabel = getClosestSlotLabel(daySlots, eventTime);\n\n if (!eventTime) {\n return {\n text: closestSlotLabel || \"Catering times unavailable\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable: true,\n };\n }\n\n const eventMinutes = timeToMinutes(eventTime);\n const isAvailable = daySlots.some((slot) => {\n if (!slot.open || !slot.close) return false;\n return (\n eventMinutes >= timeToMinutes(slot.open) &&\n eventMinutes <= timeToMinutes(slot.close)\n );\n });\n\n return {\n text: closestSlotLabel || \"Catering times unavailable\",\n fullText: getWeeklyCateringHoursText(restaurant),\n isAvailable,\n };\n}\n\nexport default function RestaurantMenuBrowser({\n restaurants,\n restaurantsLoading,\n onOpenBundles = () => { },\n defaultBundleGuestCount = 1,\n onAddItem,\n onUpdateQuantity,\n onAddOrderPress,\n getItemQuantity,\n expandedItemId,\n setExpandedItemId,\n selectedDietaryFilters,\n toggleDietaryFilter,\n restaurantListRef,\n firstMenuItemRef,\n categoriesRowRef,\n sessionIndex,\n expandedSessionIndex,\n onRegisterResetToList,\n onMobileSearchStateChange,\n onRegisterMobileSearchSetter,\n}: RestaurantMenuBrowserProps) {\n const { addMenuItem, mealSessions, restaurantPromotions, contactInfo } = useCateringState();\n const activeSession = mealSessions[sessionIndex];\n\n // --- State ---\n // Selected restaurant is synced to the ?restaurant= URL param so that\n // browser back/forward and direct links work.\n const [selectedRestaurantId, setSelectedRestaurantIdState] = useState<\n string | null\n >(() => {\n if (typeof window === \"undefined\") return null;\n return new URLSearchParams(window.location.search).get(\"restaurant\");\n });\n\n const updateRestaurantUrl = useCallback(\n (id: string | null, replace = false) => {\n if (typeof window === \"undefined\") return;\n const params = new URLSearchParams(window.location.search);\n if (id) params.set(\"restaurant\", id);\n else params.delete(\"restaurant\");\n const url = params.toString() ? `?${params.toString()}` : window.location.pathname;\n window.history[replace ? \"replaceState\" : \"pushState\"](null, \"\", url);\n },\n [],\n );\n\n const setSelectedRestaurantId = useCallback(\n (id: string | null, replace = false) => {\n setSelectedRestaurantIdState(id);\n updateRestaurantUrl(id, replace);\n },\n [updateRestaurantUrl],\n );\n\n // Browser back/forward: sync URL → state and reset related UI.\n useEffect(() => {\n const handlePopState = () => {\n const params = new URLSearchParams(window.location.search);\n setSelectedRestaurantIdState(params.get(\"restaurant\"));\n setRestaurantSearchQuery(\"\");\n setSelectedCategoryId(null);\n setCollapsedGroups(new Set());\n setActiveGroupName(null);\n };\n window.addEventListener(\"popstate\", handlePopState);\n return () => window.removeEventListener(\"popstate\", handlePopState);\n }, []);\n\n // Register reset function so the tutorial can bring user back to restaurant list\n useEffect(() => {\n onRegisterResetToList?.(() => setSelectedRestaurantId(null, true));\n }, [onRegisterResetToList, setSelectedRestaurantId]);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [restaurantSearchQuery, setRestaurantSearchQuery] = useState(\"\");\n\n // Publish current search state to parent (mobile bottom-bar search)\n useEffect(() => {\n onMobileSearchStateChange?.({\n mode: selectedRestaurantId ? \"restaurant\" : \"list\",\n query: selectedRestaurantId ? restaurantSearchQuery : searchQuery,\n });\n }, [\n selectedRestaurantId,\n searchQuery,\n restaurantSearchQuery,\n onMobileSearchStateChange,\n ]);\n\n // Register a setter so the parent mobile search input can write into the\n // appropriate query state based on the current view mode.\n useEffect(() => {\n const setter = (query: string) => {\n if (selectedRestaurantId) {\n setRestaurantSearchQuery(query);\n } else {\n setSearchQuery(query);\n }\n };\n onRegisterMobileSearchSetter?.(setter);\n }, [selectedRestaurantId, onRegisterMobileSearchSetter]);\n const [categories, setCategories] = useState<CategoryWithSubcategories[]>([]);\n const [categoriesLoading, setCategoriesLoading] = useState(true);\n const [selectedCategoryId, setSelectedCategoryId] = useState<string | null>(\n null,\n );\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(\n new Set(),\n );\n const [activeGroupName, setActiveGroupName] = useState<string | null>(null);\n const [stickyTopOffset, setStickyTopOffset] = useState(72);\n const [isRestaurantSearchOpen, setIsRestaurantSearchOpen] = useState(false);\n const [showSearchInput, setShowSearchInput] = useState(false);\n const [showSearchLeftIcon, setShowSearchLeftIcon] = useState(false);\n const [showSearchRightIcon, setShowSearchRightIcon] = useState(false);\n const [closedSearchColWidth, setClosedSearchColWidth] = useState<string>(\"2.25rem\");\n const [isDesktopSearch, setIsDesktopSearch] = useState(false);\n const restaurantSearchInputRef = useRef<HTMLInputElement>(null);\n const searchContainerRef = useRef<HTMLDivElement>(null);\n const [pillRowEl, setPillRowEl] = useState<HTMLDivElement | null>(null);\n const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);\n const [isDescriptionOverflowing, setIsDescriptionOverflowing] = useState(false);\n const descriptionRef = useRef<HTMLParagraphElement>(null);\n const [restaurantMenuItems, setRestaurantMenuItems] = useState<MenuItem[]>([]);\n const [restaurantMenuItemsLoading, setRestaurantMenuItemsLoading] = useState(false);\n const restaurantItemsCache = useRef<Map<string, MenuItem[]>>(new Map());\n\n // Track viewport size so the open-state search column can width on mobile\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mql = window.matchMedia(\"(min-width: 768px)\");\n setIsDesktopSearch(mql.matches);\n const handler = (e: MediaQueryListEvent) => setIsDesktopSearch(e.matches);\n mql.addEventListener(\"change\", handler);\n return () => mql.removeEventListener(\"change\", handler);\n }, []);\n\n // Measure pill row outer height so the closed-state search column matches it (square button)\n useEffect(() => {\n if (!pillRowEl) return;\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const h = (entry.target as HTMLElement).offsetHeight;\n if (h > 0) setClosedSearchColWidth(`${h}px`);\n }\n });\n observer.observe(pillRowEl);\n return () => observer.disconnect();\n }, [pillRowEl]);\n\n // Pill row horizontal scroll: chevron buttons + overflow detection\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const updateScrollFlags = useCallback(() => {\n if (!pillRowEl) return;\n const { scrollLeft, scrollWidth, clientWidth } = pillRowEl;\n setCanScrollLeft(scrollLeft > 1);\n setCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n }, [pillRowEl]);\n\n useEffect(() => {\n if (!pillRowEl) return;\n updateScrollFlags();\n pillRowEl.addEventListener(\"scroll\", updateScrollFlags, { passive: true });\n const ro = new ResizeObserver(updateScrollFlags);\n ro.observe(pillRowEl);\n return () => {\n pillRowEl.removeEventListener(\"scroll\", updateScrollFlags);\n ro.disconnect();\n };\n }, [pillRowEl, updateScrollFlags]);\n\n const scrollPillRow = useCallback(\n (direction: \"left\" | \"right\") => {\n if (!pillRowEl) return;\n const amount = pillRowEl.clientWidth * 0.8;\n pillRowEl.scrollBy({\n left: direction === \"left\" ? -amount : amount,\n behavior: \"smooth\",\n });\n },\n [pillRowEl],\n );\n\n // Close restaurant search on outside click or scroll\n const suppressScrollCloseRef = useRef(false);\n useEffect(() => {\n if (!isRestaurantSearchOpen) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n if (restaurantSearchQuery) return;\n const target = e.target as Element;\n if (searchContainerRef.current?.contains(target as Node)) return;\n if (target.closest?.(\"[data-pill-row]\")) {\n // Pill tap will trigger a programmatic scrollIntoView — suppress the\n // resulting scroll event so it doesn't immediately close the search.\n suppressScrollCloseRef.current = true;\n setTimeout(() => { suppressScrollCloseRef.current = false; }, 600);\n return;\n }\n closeRestaurantSearch();\n };\n\n const handleScroll = () => {\n if (restaurantSearchQuery) return;\n if (suppressScrollCloseRef.current) return;\n closeRestaurantSearch();\n };\n\n // Slight delay on scroll listener so opening the search (which may\n // trigger a micro-scroll) doesn't immediately close it.\n const scrollTimer = setTimeout(() => {\n document.addEventListener(\"scroll\", handleScroll, { capture: true, passive: true });\n }, 100);\n\n document.addEventListener(\"pointerdown\", handlePointerDown, { capture: true });\n\n return () => {\n clearTimeout(scrollTimer);\n document.removeEventListener(\"pointerdown\", handlePointerDown, { capture: true });\n document.removeEventListener(\"scroll\", handleScroll, { capture: true });\n };\n }, [isRestaurantSearchOpen, restaurantSearchQuery]);\n\n // Reset description expansion state when the selected restaurant changes,\n // and measure whether the clamped description overflows 2 lines so the\n // \"Read more\" toggle only shows when it's actually needed.\n useEffect(() => {\n setIsDescriptionExpanded(false);\n }, [selectedRestaurantId]);\n\n useEffect(() => {\n // Only measure while collapsed — scrollHeight > clientHeight relies on\n // line-clamp-2 being active. Skipping the measurement while expanded\n // keeps isDescriptionOverflowing latched on so the \"Show less\" button\n // remains visible.\n if (isDescriptionExpanded) return;\n const el = descriptionRef.current;\n if (!el) {\n setIsDescriptionOverflowing(false);\n return;\n }\n const check = () => {\n setIsDescriptionOverflowing(el.scrollHeight > el.clientHeight + 1);\n };\n check();\n const observer = new ResizeObserver(check);\n observer.observe(el);\n return () => observer.disconnect();\n }, [selectedRestaurantId, isDescriptionExpanded]);\n\n // Open: render input immediately, then expand grid track\n const openRestaurantSearch = () => {\n setShowSearchInput(true);\n setShowSearchLeftIcon(true);\n setIsRestaurantSearchOpen(true);\n // preventScroll: keep the parent flex container from auto-scrolling the\n // newly-mounted input into view, which would push the pill row off-screen.\n setTimeout(\n () => restaurantSearchInputRef.current?.focus({ preventScroll: true }),\n 50,\n );\n // Render the X (close) button only after the width animation completes,\n // so it doesn't appear inside the still-tiny search column.\n setTimeout(() => setShowSearchRightIcon(true), 300);\n };\n\n // Close: shrink grid track first, then swap input → button after the animation\n const closeRestaurantSearch = () => {\n setRestaurantSearchQuery(\"\");\n setIsRestaurantSearchOpen(false);\n // Hide the X icon immediately so it doesn't get pushed out as we shrink.\n setShowSearchRightIcon(false);\n // Hide the left search icon near the end of the shrink animation so it\n // doesn't get pushed out of the right edge as the column collapses.\n setTimeout(() => setShowSearchLeftIcon(false), 200);\n setTimeout(() => setShowSearchInput(false), 300);\n };\n\n // Bundle state\n const [restaurantBundles, setRestaurantBundles] = useState<\n CateringBundleResponse[]\n >([]);\n const [bundlesLoading, setBundlesLoading] = useState(false);\n const [bundlesError, setBundlesError] = useState<string | null>(null);\n const [selectedBundle, setSelectedBundle] =\n useState<CateringBundleResponse | null>(null);\n const [addingBundleId, setAddingBundleId] = useState<string | null>(null);\n const [openHoursInfoRestaurantId, setOpenHoursInfoRestaurantId] = useState<\n string | null\n >(null);\n const [hoveredHoursInfoRestaurantId, setHoveredHoursInfoRestaurantId] =\n useState<string | null>(null);\n const [hoursInfoPosition, setHoursInfoPosition] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n const [apiSearchResults, setApiSearchResults] =\n useState<SearchResponse | null>(null);\n const [searchLoading, setSearchLoading] = useState(false);\n\n const sectionRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n const groupButtonRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n const isProgrammaticScroll = useRef(false);\n const hoursInfoContainerRef = useRef<HTMLDivElement | null>(null);\n const hoursInfoButtonRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n\n // Fetch menu items for the selected restaurant, using a per-restaurant cache\n useEffect(() => {\n if (!selectedRestaurantId) {\n setRestaurantMenuItems([]);\n return;\n }\n const cached = restaurantItemsCache.current.get(selectedRestaurantId);\n if (cached) {\n setRestaurantMenuItems(cached);\n return;\n }\n setRestaurantMenuItemsLoading(true);\n cateringService.getMenuItemsByRestaurant(selectedRestaurantId)\n .then((raw) => {\n const items = (raw || []).map(mapToMenuItem);\n restaurantItemsCache.current.set(selectedRestaurantId, items);\n setRestaurantMenuItems(items);\n })\n .catch((err) => {\n console.error(\"Failed to load restaurant menu items:\", err);\n setRestaurantMenuItems([]);\n })\n .finally(() => setRestaurantMenuItemsLoading(false));\n }, [selectedRestaurantId]);\n\n useEffect(() => {\n const fetchCategories = async () => {\n try {\n setCategoriesLoading(true);\n const data = await categoryService.getCategories();\n setCategories(data);\n } catch (error) {\n console.error(\"Failed to fetch categories:\", error);\n } finally {\n setCategoriesLoading(false);\n }\n };\n fetchCategories();\n }, []);\n\n useEffect(() => {\n if (!openHoursInfoRestaurantId) {\n return;\n }\n\n if (isMobileViewport) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const button = hoursInfoButtonRefs.current.get(openHoursInfoRestaurantId);\n if (button?.contains(event.target as Node)) {\n return;\n }\n\n if (\n hoursInfoContainerRef.current &&\n !hoursInfoContainerRef.current.contains(event.target as Node)\n ) {\n setOpenHoursInfoRestaurantId(null);\n }\n };\n\n document.addEventListener(\"mousedown\", handlePointerDown);\n\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n };\n }, [openHoursInfoRestaurantId, isMobileViewport]);\n\n useEffect(() => {\n const updateViewport = () => {\n setIsMobileViewport(window.innerWidth < 768);\n };\n\n updateViewport();\n window.addEventListener(\"resize\", updateViewport);\n\n return () => {\n window.removeEventListener(\"resize\", updateViewport);\n };\n }, []);\n\n const updateHoursInfoPosition = useCallback((restaurantId: string) => {\n const button = hoursInfoButtonRefs.current.get(restaurantId);\n\n if (!button) return;\n\n const rect = button.getBoundingClientRect();\n setHoursInfoPosition({\n top: rect.top - 8,\n left: rect.right,\n });\n }, []);\n\n // Fetch bundles when restaurant selection changes\n useEffect(() => {\n if (!selectedRestaurantId) {\n setRestaurantBundles([]);\n setBundlesLoading(false);\n setBundlesError(null);\n return;\n }\n\n let cancelled = false;\n const fetchRestaurantBundles = async () => {\n try {\n setBundlesLoading(true);\n setBundlesError(null);\n const bundles =\n await cateringService.getBundlesByRestaurant(selectedRestaurantId);\n if (!cancelled) setRestaurantBundles(bundles);\n } catch (error) {\n console.error(\"Failed to fetch restaurant bundles:\", error);\n if (!cancelled) {\n setRestaurantBundles([]);\n setBundlesError(\"Failed to load bundles for this restaurant.\");\n }\n } finally {\n if (!cancelled) setBundlesLoading(false);\n }\n };\n fetchRestaurantBundles();\n return () => {\n cancelled = true;\n };\n }, [selectedRestaurantId]);\n\n const isSearchActive = searchQuery.trim().length > 0;\n const isRestaurantSearchActive = restaurantSearchQuery.trim().length > 0;\n\n const compareRestaurantsByAvailability = useCallback(\n (a: Restaurant, b: Restaurant) => {\n const aAvailableForTime = getRestaurantCateringWindowInfo(\n a,\n activeSession?.sessionDate,\n activeSession?.eventTime,\n ).isAvailable;\n const bAvailableForTime = getRestaurantCateringWindowInfo(\n b,\n activeSession?.sessionDate,\n activeSession?.eventTime,\n ).isAvailable;\n const aNoticeMet = isRestaurantAdvanceNoticeMet(\n a,\n activeSession?.sessionDate,\n activeSession?.eventTime,\n );\n const bNoticeMet = isRestaurantAdvanceNoticeMet(\n b,\n activeSession?.sessionDate,\n activeSession?.eventTime,\n );\n const aAvailable = aAvailableForTime && aNoticeMet;\n const bAvailable = bAvailableForTime && bNoticeMet;\n\n if (aAvailable !== bAvailable) {\n return aAvailable ? -1 : 1;\n }\n\n return a.restaurant_name.localeCompare(b.restaurant_name);\n },\n [activeSession?.sessionDate, activeSession?.eventTime],\n );\n\n // --- Derived data ---\n const availableRestaurants = useMemo(() => {\n return restaurants\n .filter((r) => r.status !== \"coming_soon\")\n .sort(compareRestaurantsByAvailability);\n }, [restaurants, compareRestaurantsByAvailability]);\n\n const dietaryFilteredItems = useMemo(() => {\n if (selectedDietaryFilters.length === 0) return restaurantMenuItems;\n return restaurantMenuItems.filter((item) => {\n if (!item.dietaryFilters || item.dietaryFilters.length === 0)\n return false;\n return selectedDietaryFilters.every((filter) =>\n item.dietaryFilters!.includes(filter),\n );\n });\n }, [restaurantMenuItems, selectedDietaryFilters]);\n\n const restaurantHoursTooltipTextById = useMemo(\n () =>\n new Map(\n restaurants.map((restaurant) => [\n restaurant.id,\n getWeeklyCateringHoursText(restaurant),\n ]),\n ),\n [restaurants],\n );\n\n const activeHoursInfoRestaurantId =\n openHoursInfoRestaurantId || hoveredHoursInfoRestaurantId;\n\n useEffect(() => {\n if (!activeHoursInfoRestaurantId || isMobileViewport) {\n return;\n }\n\n const syncPosition = () =>\n updateHoursInfoPosition(activeHoursInfoRestaurantId);\n\n syncPosition();\n window.addEventListener(\"resize\", syncPosition);\n window.addEventListener(\"scroll\", syncPosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", syncPosition);\n window.removeEventListener(\"scroll\", syncPosition, true);\n };\n }, [activeHoursInfoRestaurantId, updateHoursInfoPosition, isMobileViewport]);\n\n useEffect(() => {\n if (!isSearchActive) {\n setApiSearchResults(null);\n setSearchLoading(false);\n return;\n }\n setSearchLoading(true);\n const timer = setTimeout(async () => {\n try {\n const results = await cateringService.searchMenuItems(searchQuery, {\n dietaryFilters:\n selectedDietaryFilters.length > 0\n ? selectedDietaryFilters\n : undefined,\n });\n setApiSearchResults(results);\n } catch (e) {\n console.error(\"Search failed:\", e);\n setApiSearchResults(null);\n } finally {\n setSearchLoading(false);\n }\n }, 300);\n return () => clearTimeout(timer);\n }, [isSearchActive, searchQuery, selectedDietaryFilters]);\n\n const filteredRestaurants = useMemo(() => {\n return availableRestaurants\n .filter((restaurant) => {\n const matchesCategory =\n !selectedCategoryId ||\n (restaurant.categories ?? []).some(\n (category) => category.id === selectedCategoryId,\n );\n const matchesDiet =\n selectedDietaryFilters.length === 0 ||\n selectedDietaryFilters.every((filter) =>\n (restaurant.dietaryFilters ?? []).includes(filter),\n );\n return matchesCategory && matchesDiet;\n })\n .sort(compareRestaurantsByAvailability);\n }, [\n availableRestaurants,\n selectedCategoryId,\n selectedDietaryFilters,\n compareRestaurantsByAvailability,\n ]);\n\n const selectedRestaurant = useMemo(\n () =>\n availableRestaurants.find((r) => r.id === selectedRestaurantId) || null,\n [availableRestaurants, selectedRestaurantId],\n );\n\n const restaurantItems = useMemo(() => dietaryFilteredItems, [dietaryFilteredItems]);\n\n const filteredRestaurantItems = useMemo(() => {\n if (!isRestaurantSearchActive) return restaurantItems;\n const query = restaurantSearchQuery.toLowerCase();\n return restaurantItems.filter(\n (item) =>\n item.menuItemName.toLowerCase().includes(query) ||\n item.description?.toLowerCase().includes(query) ||\n item.groupTitle?.toLowerCase().includes(query),\n );\n }, [restaurantItems, isRestaurantSearchActive, restaurantSearchQuery]);\n\n const groupedItems = useMemo<MenuItemGroup[]>(() => {\n if (filteredRestaurantItems.length === 0) return [];\n\n const restaurant = restaurants.find((r) => r.id === selectedRestaurantId);\n const menuGroupSettings =\n restaurant?.menuGroupSettings ||\n filteredRestaurantItems[0]?.restaurant?.menuGroupSettings;\n const hasSettings =\n menuGroupSettings && Object.keys(menuGroupSettings).length > 0;\n\n let groupNames: string[];\n if (hasSettings) {\n groupNames = Object.keys(menuGroupSettings!).sort((a, b) => {\n const orderA = menuGroupSettings![a]?.displayOrder ?? 999;\n const orderB = menuGroupSettings![b]?.displayOrder ?? 999;\n return orderA - orderB;\n });\n } else {\n groupNames = Array.from(\n new Set(filteredRestaurantItems.map((i) => i.groupTitle || \"Other\")),\n ).sort((a, b) => a.localeCompare(b));\n }\n\n const buckets: Record<string, MenuItem[]> = {};\n groupNames.forEach((g) => (buckets[g] = []));\n filteredRestaurantItems.forEach((item) => {\n const group = item.groupTitle || \"Other\";\n if (!buckets[group]) buckets[group] = [];\n buckets[group].push(item);\n });\n\n const getDisplayPrice = (item: MenuItem) => {\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n return (\n (item.cateringQuantityUnit ?? 1) *\n (item.isDiscount && discountPrice > 0 ? discountPrice : price)\n );\n };\n\n return groupNames\n .filter((name) => buckets[name] && buckets[name].length > 0)\n .map((name) => {\n const items = buckets[name];\n items.sort((a, b) => {\n const orderA = a.itemDisplayOrder ?? 999;\n const orderB = b.itemDisplayOrder ?? 999;\n if (orderA !== orderB) return orderA - orderB;\n const aHasImage = a.image && a.image.trim() !== \"\" ? 0 : 1;\n const bHasImage = b.image && b.image.trim() !== \"\" ? 0 : 1;\n if (aHasImage !== bHasImage) return aHasImage - bHasImage;\n return getDisplayPrice(a) - getDisplayPrice(b);\n });\n const information = menuGroupSettings?.[name]?.information || null;\n return { type: \"items\" as const, name, items, information };\n });\n }, [filteredRestaurantItems, restaurants, selectedRestaurantId]);\n\n const filteredRestaurantBundles = useMemo(() => {\n if (!isRestaurantSearchActive) return restaurantBundles;\n const query = restaurantSearchQuery.toLowerCase();\n return restaurantBundles.filter(\n (bundle) =>\n bundle.name.toLowerCase().includes(query) ||\n bundle.description?.toLowerCase().includes(query) ||\n bundle.items.some((item) =>\n item.menuItemName.toLowerCase().includes(query),\n ),\n );\n }, [restaurantBundles, isRestaurantSearchActive, restaurantSearchQuery]);\n\n const restaurantGroups = useMemo<RestaurantGroup[]>(() => {\n const groups: RestaurantGroup[] = [];\n const shouldShowBundlesSection =\n bundlesLoading ||\n bundlesError !== null ||\n filteredRestaurantBundles.length > 0;\n if (shouldShowBundlesSection) {\n groups.push({\n type: \"bundles\",\n name: \"Bundles\",\n bundles: filteredRestaurantBundles,\n });\n }\n groups.push(...groupedItems);\n return groups;\n }, [bundlesLoading, bundlesError, filteredRestaurantBundles, groupedItems]);\n\n // Pill row reflects only the groups that have matching items for the\n // current search. When search is inactive, the filtered* lists equal the\n // unfiltered ones, so behaviour is unchanged.\n const pillRowGroupNames = useMemo<string[]>(() => {\n const names: string[] = [];\n const showBundles =\n !isRestaurantSearchActive &&\n (bundlesLoading ||\n bundlesError !== null ||\n restaurantBundles.length > 0);\n const showFilteredBundles =\n isRestaurantSearchActive && filteredRestaurantBundles.length > 0;\n if (showBundles || showFilteredBundles) names.push(\"Bundles\");\n\n if (filteredRestaurantItems.length === 0) return names;\n\n const restaurant = restaurants.find((r) => r.id === selectedRestaurantId);\n const menuGroupSettings =\n restaurant?.menuGroupSettings ||\n filteredRestaurantItems[0]?.restaurant?.menuGroupSettings;\n const hasSettings =\n menuGroupSettings && Object.keys(menuGroupSettings).length > 0;\n\n let groupNames: string[];\n if (hasSettings) {\n groupNames = Object.keys(menuGroupSettings!).sort((a, b) => {\n const orderA = menuGroupSettings![a]?.displayOrder ?? 999;\n const orderB = menuGroupSettings![b]?.displayOrder ?? 999;\n return orderA - orderB;\n });\n } else {\n groupNames = Array.from(\n new Set(filteredRestaurantItems.map((i) => i.groupTitle || \"Other\")),\n ).sort((a, b) => a.localeCompare(b));\n }\n\n const groupsWithItems = new Set(\n filteredRestaurantItems.map((i) => i.groupTitle || \"Other\"),\n );\n for (const name of groupNames) {\n if (groupsWithItems.has(name)) names.push(name);\n }\n return names;\n }, [\n filteredRestaurantItems,\n filteredRestaurantBundles,\n restaurantBundles,\n bundlesLoading,\n bundlesError,\n restaurants,\n selectedRestaurantId,\n isRestaurantSearchActive,\n ]);\n\n const firstMenuGroupName = groupedItems[0]?.name ?? null;\n\n const ensureMenuItemsForBundle = useCallback(async (bundle: CateringBundleResponse): Promise<MenuItem[]> => {\n const restaurantIds = [...new Set(bundle.items.map((i) => i.restaurantId).filter(Boolean))];\n const missing = restaurantIds.filter((id) => !restaurantItemsCache.current.has(id));\n if (missing.length > 0) {\n const fetched = await Promise.all(missing.map((id) => cateringService.getMenuItemsByRestaurant(id)));\n missing.forEach((id, idx) => {\n restaurantItemsCache.current.set(id, (fetched[idx] || []).map(mapToMenuItem));\n });\n }\n return restaurantIds.flatMap((id) => restaurantItemsCache.current.get(id) ?? []);\n }, []);\n\n const handleAddBundle = useCallback(\n async (bundle: CateringBundleResponse, guestQuantity: number) => {\n setAddingBundleId(bundle.id);\n try {\n const items = await ensureMenuItemsForBundle(bundle);\n for (const bundleItem of bundle.items) {\n const menuItem = items.find(\n (item) => item.id === bundleItem.menuItemId,\n );\n if (!menuItem) continue;\n const enrichedAddons = enrichBundleItemAddons(bundleItem, menuItem);\n const scaledQuantity = bundleItem.quantity * guestQuantity;\n addMenuItem(sessionIndex, {\n item: { ...menuItem, selectedAddons: enrichedAddons },\n quantity: scaledQuantity,\n bundleId: bundle.id,\n bundleName: bundle.name,\n });\n }\n setSelectedBundle(null);\n } catch (error) {\n console.error(\"Failed to add bundle:\", error);\n alert(\"Failed to add bundle. Please try again.\");\n } finally {\n setAddingBundleId(null);\n }\n },\n [addMenuItem, ensureMenuItemsForBundle, sessionIndex],\n );\n\n const toggleGroupCollapse = (groupName: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(groupName)) next.delete(groupName);\n else next.add(groupName);\n return next;\n });\n };\n\n const handleSelectRestaurant = (restaurantId: string) => {\n setSelectedRestaurantId(restaurantId);\n setRestaurantSearchQuery(\"\");\n setSelectedCategoryId(null);\n setCollapsedGroups(new Set());\n setActiveGroupName(null);\n if (typeof window !== \"undefined\") {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }\n };\n\n const handleBackToRestaurants = () => {\n setSelectedRestaurantId(null);\n setRestaurantSearchQuery(\"\");\n setCollapsedGroups(new Set());\n setActiveGroupName(null);\n };\n\n useEffect(() => {\n const navElement = document.querySelector<HTMLElement>(\n \"[data-catering-session-nav='true']\",\n );\n if (!navElement) return;\n const updateOffset = () =>\n setStickyTopOffset(navElement.getBoundingClientRect().height);\n updateOffset();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateOffset);\n observer.observe(navElement);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n setActiveGroupName(restaurantGroups[0]?.name || null);\n }, [restaurantGroups, selectedRestaurantId]);\n\n useEffect(() => {\n if (!activeGroupName) return;\n const activeButton = groupButtonRefs.current.get(activeGroupName);\n activeButton?.scrollIntoView({\n behavior: \"smooth\",\n inline: \"center\",\n block: \"nearest\",\n });\n }, [activeGroupName]);\n\n useEffect(() => {\n if (!selectedRestaurantId || restaurantGroups.length === 0) return;\n const updateActiveGroup = () => {\n if (isProgrammaticScroll.current) return;\n const activationLine = stickyTopOffset + 96;\n let nextActiveGroup = restaurantGroups[0]?.name || null;\n for (const group of restaurantGroups) {\n const section = sectionRefs.current.get(group.name);\n if (!section) continue;\n const { top } = section.getBoundingClientRect();\n if (top <= activationLine) nextActiveGroup = group.name;\n else break;\n }\n setActiveGroupName((prev) =>\n prev === nextActiveGroup ? prev : nextActiveGroup,\n );\n };\n updateActiveGroup();\n window.addEventListener(\"scroll\", updateActiveGroup, { passive: true });\n window.addEventListener(\"resize\", updateActiveGroup);\n return () => {\n window.removeEventListener(\"scroll\", updateActiveGroup);\n window.removeEventListener(\"resize\", updateActiveGroup);\n };\n }, [restaurantGroups, selectedRestaurantId, stickyTopOffset]);\n\n const handleGroupTabClick = (groupName: string) => {\n setCollapsedGroups((prev) => {\n if (!prev.has(groupName)) return prev;\n const next = new Set(prev);\n next.delete(groupName);\n return next;\n });\n setActiveGroupName(groupName);\n const section = sectionRefs.current.get(groupName);\n if (!section) return;\n isProgrammaticScroll.current = true;\n const topOffset = stickyTopOffset + 80;\n const nextTop =\n section.getBoundingClientRect().top + window.scrollY - topOffset;\n window.scrollTo({ top: Math.max(nextTop, 0), behavior: \"smooth\" });\n // Wait for smooth scroll to fully settle before re-enabling observer\n let scrollTimer: ReturnType<typeof setTimeout>;\n const onScrollEnd = () => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(() => {\n isProgrammaticScroll.current = false;\n window.removeEventListener(\"scroll\", onScrollEnd);\n }, 100);\n };\n window.addEventListener(\"scroll\", onScrollEnd, { passive: true });\n // Fallback: force-unlock after 1.5s in case scroll events stop firing\n window.setTimeout(() => {\n isProgrammaticScroll.current = false;\n window.removeEventListener(\"scroll\", onScrollEnd);\n }, 1500);\n };\n\n const handlePillClick = (groupName: string) => {\n handleGroupTabClick(groupName);\n };\n\n const renderRestaurantCard = (\n restaurant: Restaurant,\n onClick?: () => void,\n ) => {\n const cateringWindowInfo = getRestaurantCateringWindowInfo(\n restaurant,\n activeSession?.sessionDate,\n activeSession?.eventTime,\n );\n const advanceNoticeText = getRestaurantAdvanceNoticeText(restaurant);\n const isAdvanceNoticeMet = isRestaurantAdvanceNoticeMet(\n restaurant,\n activeSession?.sessionDate,\n activeSession?.eventTime,\n );\n const isUnavailableForSession =\n !cateringWindowInfo.isAvailable || !isAdvanceNoticeMet;\n const hoursTooltipText = cateringWindowInfo.fullText;\n\n const cardContent = (\n <div className=\"overflow-hidden rounded-xl bg-white h-full flex flex-col\">\n <div className=\"flex md:block\">\n {restaurant.images && restaurant.images.length > 0 ? (\n <div className=\"relative aspect-square w-28 flex-shrink-0 bg-gray-100 md:w-full md:aspect-video\">\n <img\n src={restaurant.images[0]}\n alt={restaurant.restaurant_name}\n className={`w-full h-full object-cover ${isUnavailableForSession ? \"grayscale opacity-60\" : \"\"\n }`}\n />\n {isUnavailableForSession ? (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/35 px-2 text-center\">\n <span\n className=\"rounded-full bg-white/90 px-2 py-1 text-[10px] font-semibold text-red-500 shadow-sm md:px-3 md:text-[11px]\"\n title={hoursTooltipText}\n >\n Unavailable\n </span>\n </div>\n ) : null}\n </div>\n ) : (\n <div\n className={`relative aspect-square w-28 flex-shrink-0 items-center justify-center ${isUnavailableForSession ? \"bg-gray-200\" : \"bg-base-200\"\n } flex md:w-full md:aspect-video`}\n >\n <span className=\"text-2xl font-bold text-gray-300 md:text-3xl\">\n {restaurant.restaurant_name.charAt(0)}\n </span>\n {isUnavailableForSession ? (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/35 px-2 text-center\">\n <span\n className=\"rounded-full bg-white/90 px-2 py-1 text-[10px] font-semibold text-red-500 shadow-sm md:px-3 md:text-[11px]\"\n title={hoursTooltipText}\n >\n Unavailable\n </span>\n </div>\n ) : null}\n </div>\n )}\n <div className=\"min-w-0 flex-1 p-3 flex flex-col\">\n <p className=\"line-clamp-2 text-sm font-semibold leading-tight text-gray-900\">\n {restaurant.restaurant_name}\n </p>\n {restaurant.minCateringOrderQuantity &&\n restaurant.minCateringOrderQuantity > 0 ? (\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n <span className=\"inline-flex items-center rounded-full bg-primary/10 px-2 py-1 text-[10px] font-semibold text-primary\">\n Min {restaurant.minCateringOrderQuantity} items\n </span>\n </div>\n ) : null}\n {isUnavailableForSession && (\n <div className=\"mt-1.5 min-h-8 space-y-0.5\">\n <div\n className={`flex items-center gap-1.5 text-[11px] leading-4 ${isAdvanceNoticeMet\n ? \"text-gray-500\"\n : \"text-red-500 font-semibold\"\n }`}\n >\n <Clock3\n className={`h-3.5 w-3.5 flex-shrink-0 ${isAdvanceNoticeMet ? \"text-gray-400\" : \"text-red-500\"\n }`}\n />\n <span className=\"line-clamp-1\">\n {advanceNoticeText || \"No advance notice\"}\n </span>\n </div>\n <div className=\"relative flex items-center justify-between gap-2\">\n <div\n className={`flex min-w-0 items-center gap-1.5 text-[11px] leading-4 ${cateringWindowInfo.isAvailable\n ? \"text-gray-500\"\n : \"text-red-500 font-semibold\"\n }`}\n >\n <Clock3\n className={`h-3.5 w-3.5 flex-shrink-0 ${cateringWindowInfo.isAvailable\n ? \"text-gray-400\"\n : \"text-red-500\"\n }`}\n />\n <span className=\"line-clamp-1\" title={hoursTooltipText}>\n {cateringWindowInfo.text}\n </span>\n </div>\n <div className=\"relative flex-shrink-0\">\n <button\n ref={(element) => {\n if (element) {\n hoursInfoButtonRefs.current.set(restaurant.id, element);\n } else {\n hoursInfoButtonRefs.current.delete(restaurant.id);\n }\n }}\n type=\"button\"\n aria-label={`View weekly catering hours for ${restaurant.restaurant_name}`}\n onClick={(event) => {\n event.stopPropagation();\n if (!isMobileViewport) {\n updateHoursInfoPosition(restaurant.id);\n }\n setOpenHoursInfoRestaurantId((current) =>\n current === restaurant.id ? null : restaurant.id,\n );\n }}\n onMouseEnter={() => {\n if (!isMobileViewport) {\n updateHoursInfoPosition(restaurant.id);\n setHoveredHoursInfoRestaurantId(restaurant.id);\n }\n }}\n onMouseLeave={() => {\n if (!isMobileViewport) {\n setHoveredHoursInfoRestaurantId((current) =>\n current === restaurant.id ? null : current,\n );\n }\n }}\n className=\"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full border border-base-300 bg-white text-gray-500 shadow-sm transition-colors hover:text-primary focus:outline-none\"\n title=\"View weekly catering hours\"\n >\n <Info className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n )}\n {(() => {\n if (isUnavailableForSession) return null;\n const restaurantLoc = (restaurant as any).pickupAddresses?.[0]?.location;\n const userLoc = contactInfo?.latitude && contactInfo?.longitude\n ? { latitude: contactInfo.latitude, longitude: contactInfo.longitude }\n : null;\n const distance = userLoc && restaurantLoc\n ? haversineDistanceMiles(userLoc.latitude, userLoc.longitude, restaurantLoc.latitude, restaurantLoc.longitude)\n : null;\n const rating = restaurant.averageRating && parseFloat(restaurant.averageRating) > 0\n ? parseFloat(restaurant.averageRating)\n : null;\n return (\n <div className=\"mt-auto pt-2 min-h-[22px] flex items-center gap-2\">\n {rating !== null && (\n <span className=\"flex items-center gap-0.5 text-[11px] text-gray-500\">\n <span className=\"text-yellow-400\">★</span>\n {rating.toFixed(1)}\n </span>\n )}\n {rating !== null && distance !== null && (\n <span className=\"text-gray-300 text-[11px]\">·</span>\n )}\n {distance !== null && (\n <span className=\"text-[11px] text-gray-500\">\n {distance.toFixed(1)} mi\n </span>\n )}\n </div>\n );\n })()}\n </div>\n </div>\n </div>\n );\n\n if (!onClick) {\n return (\n <div className=\"relative w-full overflow-visible rounded-xl border border-base-300 bg-white shadow-sm\">\n {cardContent}\n </div>\n );\n }\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onClick();\n }\n }}\n className=\"relative w-full overflow-visible rounded-xl border border-base-300 bg-white text-left shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md\"\n >\n {cardContent}\n </div>\n );\n };\n\n const renderDietaryFilters = () => (\n <div className=\"flex items-center gap-2 overflow-x-auto pb-1 pt-1 scrollbar-hide\">\n <span className=\"flex-shrink-0 text-xs text-gray-500 mr-1\">Diet:</span>\n {(\n [\n { value: DietaryFilter.HALAL, label: \"Halal\" },\n { value: DietaryFilter.VEGETARIAN, label: \"Vegetarian\" },\n { value: DietaryFilter.VEGAN, label: \"Vegan\" },\n { value: DietaryFilter.PESCATERIAN, label: \"Pescatarian\" },\n ] as const\n ).map((option) => (\n <button\n key={option.value}\n onClick={() => toggleDietaryFilter(option.value)}\n className={`flex-shrink-0 px-3 py-1.5 rounded-full text-xs font-medium transition-all border ${selectedDietaryFilters.includes(option.value)\n ? \"bg-green-600 text-white border-green-600\"\n : \"bg-white text-gray-600 border-gray-300 hover:border-green-500 hover:text-green-600\"\n }`}\n >\n {option.label}\n {selectedDietaryFilters.includes(option.value) && (\n <span className=\"ml-1.5 inline-flex items-center justify-center w-3.5 h-3.5 rounded-full bg-white/20\">\n x\n </span>\n )}\n </button>\n ))}\n </div>\n );\n\n const hoursInfoTooltip =\n !isMobileViewport && activeHoursInfoRestaurantId && hoursInfoPosition\n ? createPortal(\n <div\n ref={hoursInfoContainerRef}\n className=\"fixed z-[1000] w-64 -translate-x-full -translate-y-full whitespace-pre-line rounded-lg border border-base-300 bg-white p-2 text-[11px] leading-4 text-gray-600 shadow-lg\"\n style={{\n left: hoursInfoPosition.left,\n top: hoursInfoPosition.top,\n }}\n onMouseEnter={() => {\n if (!openHoursInfoRestaurantId) {\n setHoveredHoursInfoRestaurantId(activeHoursInfoRestaurantId);\n }\n }}\n onMouseLeave={() => {\n if (!openHoursInfoRestaurantId) {\n setHoveredHoursInfoRestaurantId(null);\n }\n }}\n >\n {restaurantHoursTooltipTextById.get(activeHoursInfoRestaurantId)}\n </div>,\n document.body,\n )\n : null;\n\n const mobileHoursInfoSheet =\n isMobileViewport && openHoursInfoRestaurantId\n ? createPortal(\n <div className=\"fixed inset-0 z-[1000] flex items-end bg-black/30\">\n <button\n type=\"button\"\n aria-label=\"Close weekly catering hours\"\n className=\"absolute inset-0 cursor-default\"\n onClick={() => setOpenHoursInfoRestaurantId(null)}\n />\n <div className=\"relative z-10 w-full rounded-t-2xl bg-white p-4 shadow-2xl\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"text-sm font-semibold text-gray-900\">\n Weekly catering hours\n </p>\n <p className=\"mt-1 text-xs text-gray-500\">\n {restaurants.find(\n (restaurant) =>\n restaurant.id === openHoursInfoRestaurantId,\n )?.restaurant_name || \"Restaurant\"}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => setOpenHoursInfoRestaurantId(null)}\n className=\"flex h-9 w-9 items-center justify-center rounded-full border border-base-300 bg-white text-gray-500 shadow-sm\"\n aria-label=\"Close weekly catering hours\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n <div className=\"mt-3 whitespace-pre-line rounded-xl bg-base-100 px-3 py-3 text-sm leading-5 text-gray-700\">\n {restaurantHoursTooltipTextById.get(openHoursInfoRestaurantId)}\n </div>\n </div>\n </div>,\n document.body,\n )\n : null;\n\n const renderCategoryFilters = () => (\n <div ref={expandedSessionIndex === sessionIndex ? categoriesRowRef : undefined} style={{ contain: \"inline-size\" }}>\n <div className=\"overflow-x-auto pb-2 pt-1 scrollbar-hide\">\n <div className=\"flex items-center gap-2 md:gap-3\">\n {categoriesLoading\n ? [...Array(6)].map((_, index) => (\n <div\n key={index}\n className=\"h-10 w-20 md:w-24 flex-shrink-0 rounded-xl bg-base-200 animate-pulse\"\n />\n ))\n : categories.map((category) => (\n <button\n key={category.id}\n onClick={() =>\n setSelectedCategoryId(\n selectedCategoryId === category.id ? null : category.id,\n )\n }\n className={`flex-shrink-0 px-3 py-1.5 rounded-xl text-sm font-medium transition-all border flex flex-col items-center justify-center gap-0.5 leading-none ${category.images || category.icon ? \"min-h-16\" : \"\"\n } ${selectedCategoryId === category.id\n ? \"border-primary text-primary\"\n : \"border-transparent text-gray-700 hover:text-primary\"\n }`}\n >\n {category.images ? (\n <img\n src={category.images}\n alt={category.name}\n className=\"h-8 w-8 md:h-9 md:w-9 object-cover rounded-full border border-base-300\"\n />\n ) : category.icon ? (\n <span className=\"flex h-6 md:h-7 items-center justify-center text-xl md:text-2xl leading-none\">\n {category.icon}\n </span>\n ) : null}\n <span className=\"text-center text-xs md:text-sm\">\n {category.name}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n\n // ============================================================\n // VIEW 2: Restaurant Menu\n // ============================================================\n if (selectedRestaurantId && selectedRestaurant) {\n return (\n <div style={{ contain: \"inline-size\" }}>\n <button\n onClick={handleBackToRestaurants}\n className=\"flex items-center gap-1.5 text-sm text-primary font-medium hover:underline mb-3\"\n >\n <ArrowLeft className=\"w-4 h-4\" />\n Back to Restaurants\n </button>\n\n <div\n className=\"relative w-full rounded-xl overflow-hidden mb-2\"\n style={{ height: \"175px\" }}\n >\n {selectedRestaurant.images && selectedRestaurant.images.length > 0 ? (\n <img\n src={selectedRestaurant.images[0]}\n alt={selectedRestaurant.restaurant_name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full bg-base-200 flex items-center justify-center\">\n <span className=\"text-4xl font-bold text-gray-300\">\n {selectedRestaurant.restaurant_name.charAt(0)}\n </span>\n </div>\n )}\n </div>\n <div className=\"mb-3\">\n <h2 className=\"text-2xl font-bold text-gray-900\">\n {selectedRestaurant.restaurant_name}\n </h2>\n {(() => {\n const restaurantLoc = (selectedRestaurant as any).pickupAddresses?.[0]?.location;\n const userLoc = contactInfo?.latitude && contactInfo?.longitude\n ? { latitude: contactInfo.latitude, longitude: contactInfo.longitude }\n : null;\n const distance = userLoc && restaurantLoc\n ? haversineDistanceMiles(userLoc.latitude, userLoc.longitude, restaurantLoc.latitude, restaurantLoc.longitude)\n : null;\n const rating = selectedRestaurant.averageRating && parseFloat(selectedRestaurant.averageRating) > 0\n ? parseFloat(selectedRestaurant.averageRating)\n : null;\n const advanceNoticeText = getRestaurantAdvanceNoticeText(selectedRestaurant);\n const noticeMet = isRestaurantAdvanceNoticeMet(selectedRestaurant, activeSession?.sessionDate, activeSession?.eventTime);\n if (!rating && !distance && !advanceNoticeText) return null;\n return (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 mt-1 mb-1\">\n {rating !== null && (\n <span className=\"flex items-center gap-1 text-sm text-gray-500 whitespace-nowrap\">\n <span className=\"text-yellow-400\">★</span>\n {rating.toFixed(1)}\n </span>\n )}\n {rating !== null && distance !== null && (\n <span className=\"text-gray-300\">·</span>\n )}\n {distance !== null && (\n <span className=\"text-sm text-gray-500 whitespace-nowrap\">{distance.toFixed(1)} mi away</span>\n )}\n {advanceNoticeText && (\n <>\n {(rating !== null || distance !== null) && <span className=\"text-gray-300\">·</span>}\n <span className={`flex items-center gap-1 text-sm whitespace-nowrap ${noticeMet ? \"text-gray-500\" : \"text-gray-500\"}`}>\n <Clock3 className={`h-3.5 w-3.5 flex-shrink-0 ${noticeMet ? \"text-gray-400\" : \"text-red-500\"}`} />\n {advanceNoticeText}\n </span>\n </>\n )}\n </div>\n );\n })()}\n {selectedRestaurant.restaurant_description && (\n <>\n <p\n ref={descriptionRef}\n className={`text-sm text-gray-600 mt-1 ${isDescriptionExpanded ? \"\" : \"line-clamp-2\"}`}\n >\n {selectedRestaurant.restaurant_description}\n </p>\n {(isDescriptionOverflowing || isDescriptionExpanded) && (\n <button\n type=\"button\"\n onClick={() => setIsDescriptionExpanded((v) => !v)}\n className=\"text-xs text-primary font-medium mt-0.5 hover:underline\"\n >\n {isDescriptionExpanded ? \"Show less\" : \"Read more\"}\n </button>\n )}\n </>\n )}\n {selectedRestaurant.minCateringOrderQuantity &&\n selectedRestaurant.minCateringOrderQuantity > 0 && (\n <p className=\"text-xs text-gray-500\">\n Min order: {selectedRestaurant.minCateringOrderQuantity} items\n </p>\n )}\n </div>\n\n {(() => {\n const promos = selectedRestaurantId\n ? (restaurantPromotions[selectedRestaurantId] ?? [])\n : [];\n if (promos.length === 0) return null;\n\n const discountLabel = (promo: any) =>\n promo.promotionType === \"BUY_MORE_SAVE_MORE\" && promo.discountTiers?.length\n ? `Up to ${Math.max(...promo.discountTiers.map((t: any) => Number(t.discountPercentage)))}% OFF`\n : `${Number(promo.discountPercentage)}% OFF`;\n\n const endDateLabel = (promo: any) =>\n new Date(promo.endDate).toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\n\n const sortedTiers = (promo: any) =>\n [...(promo.discountTiers ?? [])].sort((a: any, b: any) => a.minQuantity - b.minQuantity);\n\n return (\n <div className=\"mt-3\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-semibold text-gray-900\">Active Offers</span>\n <span className=\"bg-primary text-white text-xs font-bold px-2 py-0.5 rounded-full\">\n {promos.length}\n </span>\n </div>\n <div className=\"flex gap-3 overflow-x-auto pb-1 scrollbar-hide snap-x snap-mandatory\">\n {promos.map((promo: any) => (\n <div key={promo.id} className=\"flex-shrink-0 snap-start bg-white border border-base-200 rounded-2xl p-4 min-w-[220px] max-w-[280px] shadow-sm\">\n <div className=\"flex items-start justify-between gap-2 mb-2\">\n <p className=\"text-[11px] font-semibold text-gray-400 uppercase tracking-wide truncate\">{promo.name}</p>\n <svg className=\"w-4 h-4 flex-shrink-0 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n </div>\n <p className=\"text-lg font-black text-gray-900 leading-none\">{discountLabel(promo)}</p>\n {promo.promotionType === \"BUY_MORE_SAVE_MORE\" && sortedTiers(promo).length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2.5\">\n {sortedTiers(promo).map((tier: any, idx: number) => (\n <span key={idx} className=\"text-[11px] font-medium bg-primary/10 text-primary px-2 py-0.5 rounded-full\">\n {tier.minQuantity}+ → {Number(tier.discountPercentage)}%\n </span>\n ))}\n </div>\n )}\n {promo.description && (\n <p className=\"text-xs text-gray-400 mt-1.5 line-clamp-2\">{promo.description}</p>\n )}\n <div className=\"flex flex-wrap gap-x-2 gap-y-0.5 mt-2.5 text-xs text-gray-400\">\n {promo.minOrderAmount > 0 && <span>Min. £{promo.minOrderAmount}</span>}\n {promo.maxDiscountAmount && <span>· Max. £{promo.maxDiscountAmount} off</span>}\n <span>· Until {endDateLabel(promo)}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n })()}\n\n <div className=\"mt-2\">{renderDietaryFilters()}</div>\n\n <div className=\"mt-3\">\n <div\n className=\"sticky z-30 mt-2 mb-3 flex items-center justify-end gap-2 w-full max-w-full box-border overflow-hidden px-1 py-1\"\n style={{\n top: stickyTopOffset + 8,\n }}\n >\n {/* Pill row — takes remaining flex space, can shrink to 0 */}\n <div className={`relative flex-1 min-w-0 ${isRestaurantSearchOpen ? \"hidden md:block\" : \"\"}`}>\n <div\n ref={setPillRowEl}\n data-pill-row\n className=\"overflow-x-auto scrollbar-hide rounded-full border border-base-300 bg-white/50 px-2 shadow-sm backdrop-blur-md flex items-center h-11\"\n >\n <div className=\"flex items-center gap-2 md:gap-5\">\n {pillRowGroupNames.map((name) => {\n const isActive = activeGroupName === name;\n return (\n <button\n key={name}\n ref={(el) => {\n if (el) groupButtonRefs.current.set(name, el);\n else groupButtonRefs.current.delete(name);\n }}\n onClick={() => handlePillClick(name)}\n className={`flex-shrink-0 whitespace-nowrap rounded-full px-3 py-1.5 text-sm font-semibold transition-colors ${isActive\n ? \"bg-primary text-white\"\n : \"text-gray-500 hover:bg-black/5 hover:text-gray-700\"\n }`}\n >\n {name}\n </button>\n );\n })}\n </div>\n </div>\n {canScrollLeft && (\n <button\n onClick={() => scrollPillRow(\"left\")}\n className=\"group absolute left-0 top-0 bottom-0 z-10 flex w-14 items-center justify-start rounded-l-full pl-3\"\n style={{\n background:\n \"linear-gradient(to right, rgba(255,255,255,0.95) 50%, transparent)\",\n }}\n aria-label=\"Scroll left\"\n type=\"button\"\n >\n <span className=\"flex items-center justify-center rounded-full p-1 transition-colors group-hover:bg-gray-300/50\">\n <ChevronLeft className=\"h-5 w-5 text-gray-600\" />\n </span>\n </button>\n )}\n {canScrollRight && (\n <button\n onClick={() => scrollPillRow(\"right\")}\n className=\"group absolute right-0 top-0 bottom-0 z-10 flex w-14 items-center justify-end rounded-r-full pr-3\"\n style={{\n background:\n \"linear-gradient(to left, rgba(255,255,255,0.95) 50%, transparent)\",\n }}\n aria-label=\"Scroll right\"\n type=\"button\"\n >\n <span className=\"flex items-center justify-center rounded-full p-1 transition-colors group-hover:bg-gray-300/50\">\n <ChevronRight className=\"h-5 w-5 text-gray-600\" />\n </span>\n </button>\n )}\n </div>\n\n {/* Search — explicit square (width=height) when closed, expands width when open. Desktop only; mobile uses the bottom-bar search. */}\n <div\n ref={searchContainerRef}\n className=\"relative hidden flex-shrink-0 md:block\"\n style={{\n width: isRestaurantSearchOpen\n ? (isDesktopSearch ? \"min(100%, 14rem)\" : \"100%\")\n : closedSearchColWidth,\n height: closedSearchColWidth,\n transition: \"width 300ms ease-in-out\",\n }}\n >\n {showSearchInput ? (\n <>\n {showSearchLeftIcon && (\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400 pointer-events-none z-10\" />\n )}\n <input\n ref={restaurantSearchInputRef}\n type=\"text\"\n value={restaurantSearchQuery}\n onChange={(e) =>\n setRestaurantSearchQuery(e.target.value)\n }\n placeholder=\"Search items...\"\n style={{ minWidth: 0 }}\n className={`h-full w-full min-w-0 rounded-full border border-primary bg-white text-base focus:outline-none focus:ring-1 focus:ring-primary shadow-sm ${showSearchLeftIcon ? \"pl-9\" : \"pl-2\"} ${showSearchRightIcon ? \"pr-9\" : \"pr-2\"}`}\n />\n {showSearchRightIcon && (\n <button\n onClick={closeRestaurantSearch}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 z-10\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </>\n ) : (\n <button\n onClick={openRestaurantSearch}\n className=\"h-full w-full rounded-full border border-base-300 bg-white/50 backdrop-blur-md shadow-sm flex items-center justify-center text-gray-500 hover:text-primary hover:border-primary transition-colors\"\n >\n <Search className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {restaurantMenuItemsLoading ? (\n <div className=\"flex justify-center py-10\">\n <span className=\"loading loading-spinner loading-md text-primary\" />\n </div>\n ) : restaurantGroups.length === 0 && (\n <div className=\"text-center py-6\">\n <p className=\"text-gray-500 text-sm\">\n No items match the current filters.\n </p>\n </div>\n )}\n\n {!restaurantMenuItemsLoading && restaurantGroups.map((group) => {\n const isCollapsed = collapsedGroups.has(group.name);\n const groupCount =\n group.type === \"bundles\"\n ? group.bundles.length\n : group.items.length;\n return (\n <div\n key={group.name}\n ref={(el) => {\n if (el) sectionRefs.current.set(group.name, el);\n else sectionRefs.current.delete(group.name);\n }}\n data-group-name={group.name}\n style={{ scrollMarginTop: stickyTopOffset + 80 }}\n className=\"mb-4\"\n >\n <div className=\"w-full flex items-center gap-2 py-2 px-1\">\n <h3 className=\"text-base font-bold text-primary\">\n {group.name}\n </h3>\n <span className=\"text-xs text-gray-400 font-normal\">\n ({groupCount})\n </span>\n </div>\n\n {group.type === \"items\" && group.information && (\n <div className=\"flex items-start gap-1.5 px-1 pb-2\">\n <Info className=\"w-3.5 h-3.5 text-gray-400 flex-shrink-0 mt-0.5\" />\n <p className=\"text-xs text-gray-500 whitespace-pre-line\">\n {group.information}\n </p>\n </div>\n )}\n\n {group.type === \"bundles\" ? (\n bundlesLoading ? (\n <div className=\"mt-2 flex items-center gap-2 text-sm text-gray-500\">\n <span className=\"loading loading-spinner loading-sm text-primary\" />\n Loading bundles...\n </div>\n ) : bundlesError ? (\n <div className=\"mt-2 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\">\n {bundlesError}\n </div>\n ) : group.bundles.length === 0 ? (\n <div className=\"mt-2 rounded-xl border border-dashed border-base-300 bg-base-100/60 px-4 py-5 text-sm text-gray-500\">\n No bundles match the current filters.\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-3 mt-1\">\n {group.bundles.map((bundle) => (\n <BundleCard\n key={bundle.id}\n bundle={bundle}\n onClick={setSelectedBundle}\n />\n ))}\n </div>\n )\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-3 mt-1\">\n {group.items.map((item, itemIdx) => (\n <div\n key={item.id}\n ref={\n expandedSessionIndex === sessionIndex &&\n itemIdx === 0 &&\n group.name === firstMenuGroupName\n ? firstMenuItemRef\n : undefined\n }\n >\n <MenuItemCard\n item={item}\n quantity={getItemQuantity(item.id)}\n isExpanded={expandedItemId === item.id}\n onToggleExpand={() =>\n setExpandedItemId(\n expandedItemId === item.id ? null : item.id,\n )\n }\n onAddItem={onAddItem}\n onUpdateQuantity={onUpdateQuantity}\n onAddOrderPress={onAddOrderPress}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {selectedBundle && (\n <BundleDetailModal\n bundle={selectedBundle}\n defaultQuantity={defaultBundleGuestCount}\n isAdding={addingBundleId === selectedBundle.id}\n onAdd={handleAddBundle}\n onClose={() => setSelectedBundle(null)}\n />\n )}\n </div>\n );\n }\n\n // ============================================================\n // VIEW 1: Restaurant List (default)\n // ============================================================\n return (\n <div style={{ contain: \"inline-size\" }}>\n {hoursInfoTooltip}\n {mobileHoursInfoSheet}\n {/* Desktop-only top search; mobile uses the bottom-bar search */}\n <div className=\"relative mt-2 mb-2 hidden md:block\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400\" />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search restaurants and menu items...\"\n className=\"w-full pl-9 pr-9 py-2.5 rounded-xl border border-base-300 bg-white text-base focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-colors\"\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery(\"\")}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n <div>\n {!isSearchActive && (\n <button\n type=\"button\"\n onClick={onOpenBundles}\n className=\"mb-3 flex w-full items-start justify-between rounded-2xl border border-primary/15 bg-primary/[0.05] px-4 py-4 text-left transition-colors hover:bg-primary/[0.08]\"\n >\n <span className=\"flex items-start gap-3\">\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl bg-white text-primary shadow-sm\">\n <Package className=\"h-5 w-5\" />\n </span>\n <span>\n <span className=\"block text-sm font-semibold text-gray-900\">\n Don&apos;t know what to get?\n </span>\n <span className=\"mt-1 block text-sm text-gray-600\">\n Look at our bundles.\n </span>\n </span>\n </span>\n <span className=\"rounded-full bg-primary px-3 py-1 text-xs font-semibold text-white\">\n Browse\n </span>\n </button>\n )}\n {!isSearchActive && renderCategoryFilters()}\n {renderDietaryFilters()}\n </div>\n\n {isSearchActive ? (\n searchLoading ? (\n <div className=\"text-center py-6\">\n <div className=\"inline-block w-6 h-6 border-3 border-primary border-t-transparent rounded-full animate-spin\" />\n <p className=\"mt-2 text-sm text-gray-500\">Searching...</p>\n </div>\n ) : apiSearchResults &&\n apiSearchResults.restaurants.length === 0 &&\n apiSearchResults.menuItems.length === 0 ? (\n <div className=\"text-center py-6\">\n <Search className=\"w-8 h-8 text-gray-300 mx-auto mb-2\" />\n <p className=\"text-gray-500 text-sm\">\n No results found for &ldquo;{searchQuery}&rdquo;\n </p>\n </div>\n ) : apiSearchResults ? (\n <div className=\"mt-3 space-y-6\">\n {apiSearchResults.restaurants.length > 0 && (\n <div>\n <h3 className=\"text-sm font-bold text-primary mb-2\">\n Restaurants{\" \"}\n <span className=\"text-gray-400 font-normal\">\n ({apiSearchResults.restaurants.length})\n </span>\n </h3>\n {(() => {\n const matched = apiSearchResults.restaurants\n .map((r: any) => availableRestaurants.find((ar) => ar.id === r.id))\n .filter((r): r is Restaurant => r !== undefined);\n const available = matched.filter((r) => {\n const windowInfo = getRestaurantCateringWindowInfo(r, activeSession?.sessionDate, activeSession?.eventTime);\n const noticeMet = isRestaurantAdvanceNoticeMet(r, activeSession?.sessionDate, activeSession?.eventTime);\n return windowInfo.isAvailable && noticeMet;\n });\n const unavailable = matched.filter((r) => {\n const windowInfo = getRestaurantCateringWindowInfo(r, activeSession?.sessionDate, activeSession?.eventTime);\n const noticeMet = isRestaurantAdvanceNoticeMet(r, activeSession?.sessionDate, activeSession?.eventTime);\n return !windowInfo.isAvailable || !noticeMet;\n });\n return (\n <div className=\"space-y-4\">\n {available.length > 0 && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-3\">\n {available.map((restaurant) => (\n <div key={restaurant.id} className=\"h-full\">\n {renderRestaurantCard(restaurant, () =>\n handleSelectRestaurant(restaurant.id),\n )}\n </div>\n ))}\n </div>\n )}\n {unavailable.length > 0 && (\n <div>\n <p className=\"text-xs font-semibold text-gray-400 uppercase tracking-widest mb-3\">\n Unavailable today\n </p>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-3\">\n {unavailable.map((restaurant) => (\n <div key={restaurant.id} className=\"h-full\">\n {renderRestaurantCard(restaurant, () =>\n handleSelectRestaurant(restaurant.id),\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n })()}\n </div>\n )}\n {apiSearchResults.menuItems.length > 0 && (\n <div>\n <h3 className=\"text-sm font-bold text-primary mb-2\">\n Menu Items{\" \"}\n <span className=\"text-gray-400 font-normal\">\n ({apiSearchResults.menuItems.length})\n </span>\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n {apiSearchResults.menuItems.map((sr: SearchResult) => {\n const item: MenuItem = {\n ...(sr as any),\n restaurantName: sr.restaurant?.name,\n addons: (sr as any).addons || [],\n itemDisplayOrder: (sr as any).itemDisplayOrder || 0,\n };\n return (\n <div key={item.id}>\n <MenuItemCard\n item={item}\n quantity={getItemQuantity(item.id)}\n isExpanded={expandedItemId === item.id}\n onToggleExpand={() =>\n setExpandedItemId(\n expandedItemId === item.id ? null : item.id,\n )\n }\n onAddItem={onAddItem}\n onUpdateQuantity={onUpdateQuantity}\n onAddOrderPress={onAddOrderPress}\n showRestaurantName={true}\n />\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n ) : null\n ) : (\n <>{restaurantsLoading ? (\n <div className=\"py-8 mt-3\">\n <div className=\"flex flex-col items-center justify-center text-center\">\n <div className=\"inline-block w-6 h-6 border-3 border-primary border-t-transparent rounded-full animate-spin\" />\n <p className=\"mt-2 text-sm text-gray-500\">Loading restaurants...</p>\n </div>\n </div>\n ) : filteredRestaurants.length === 0 ? (\n <div className=\"text-center py-6 mt-3\">\n <p className=\"text-gray-500 text-sm\">No restaurants found.</p>\n </div>\n ) : (() => {\n const available = filteredRestaurants.filter((r) => {\n const windowInfo = getRestaurantCateringWindowInfo(r, activeSession?.sessionDate, activeSession?.eventTime);\n const noticeMet = isRestaurantAdvanceNoticeMet(r, activeSession?.sessionDate, activeSession?.eventTime);\n return windowInfo.isAvailable && noticeMet;\n });\n const unavailable = filteredRestaurants.filter((r) => {\n const windowInfo = getRestaurantCateringWindowInfo(r, activeSession?.sessionDate, activeSession?.eventTime);\n const noticeMet = isRestaurantAdvanceNoticeMet(r, activeSession?.sessionDate, activeSession?.eventTime);\n return !windowInfo.isAvailable || !noticeMet;\n });\n return (\n <div ref={restaurantListRef} className=\"mt-3 space-y-6\">\n {available.length > 0 && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-3\">\n {available.map((restaurant) => (\n <div key={restaurant.id} className=\"h-full\">\n {renderRestaurantCard(restaurant, () => handleSelectRestaurant(restaurant.id))}\n </div>\n ))}\n </div>\n )}\n {unavailable.length > 0 && (\n <div>\n <p className=\"text-xs font-semibold text-gray-400 uppercase tracking-widest mb-3\">\n Unavailable today\n </p>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-3\">\n {unavailable.map((restaurant) => (\n <div key={restaurant.id} className=\"h-full\">\n {renderRestaurantCard(restaurant, () => handleSelectRestaurant(restaurant.id))}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n })()}</>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { cateringService } from \"../shims/cateringService\";\nimport { CateringBundleResponse, CateringBundleItem } from \"../types/bundle\";\nimport { MenuItem } from \"../types/menu\";\nimport { useCateringState } from \"../state/CateringStateContext\";\nimport BundleCard from \"./BundleCard\";\nimport BundleDetailModal from \"./modals/BundleDetailModal\";\nimport { mapToMenuItem } from \"./catering-order-helpers\";\nimport { ArrowLeft, Package } from \"lucide-react\";\n\ninterface BundleBrowserProps {\n sessionIndex: number;\n onBack: () => void;\n defaultGuestCount?: number;\n}\n\nfunction enrichBundleItemAddons(\n bundleItem: CateringBundleItem,\n menuItem: MenuItem\n): MenuItem[\"selectedAddons\"] {\n if (!bundleItem.selectedAddons || bundleItem.selectedAddons.length === 0) {\n return [];\n }\n\n return bundleItem.selectedAddons.map((bundleAddon) => {\n const matchedGroup = menuItem.addons?.find((g) => g.items.some((a) => a.name === bundleAddon.name));\n const matchedAddon = matchedGroup?.items.find((a) => a.name === bundleAddon.name);\n return {\n name: bundleAddon.name,\n price: Number(matchedAddon?.price ?? 0),\n quantity: bundleAddon.quantity,\n groupTitle: matchedGroup?.groupTitle ?? \"Options\",\n };\n });\n}\n\nexport default function BundleBrowser({\n sessionIndex,\n onBack,\n defaultGuestCount = 1,\n}: BundleBrowserProps) {\n const { addMenuItem } = useCateringState();\n const [bundles, setBundles] = useState<CateringBundleResponse[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [addingBundleId, setAddingBundleId] = useState<string | null>(null);\n const menuItemsByRestaurant = useRef<Map<string, MenuItem[]>>(new Map());\n const [selectedBundle, setSelectedBundle] = useState<CateringBundleResponse | null>(null);\n\n useEffect(() => {\n const fetchBundles = async () => {\n try {\n setLoading(true);\n const cateringBundles = await cateringService.getCateringBundles();\n setBundles(cateringBundles);\n } catch (err) {\n console.error(\"Failed to fetch bundles:\", err);\n setError(\"Failed to load bundles. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n fetchBundles();\n }, []);\n\n const ensureMenuItemsForBundle = useCallback(async (bundle: CateringBundleResponse): Promise<MenuItem[]> => {\n const restaurantIds = [...new Set(bundle.items.map((i) => i.restaurantId).filter(Boolean))];\n const missing = restaurantIds.filter((id) => !menuItemsByRestaurant.current.has(id));\n if (missing.length > 0) {\n const fetched = await Promise.all(missing.map((id) => cateringService.getMenuItemsByRestaurant(id)));\n missing.forEach((id, idx) => {\n menuItemsByRestaurant.current.set(id, (fetched[idx] || []).map(mapToMenuItem));\n });\n }\n return restaurantIds.flatMap((id) => menuItemsByRestaurant.current.get(id) ?? []);\n }, []);\n\n const handleAddBundle = async (bundle: CateringBundleResponse, guestQuantity: number) => {\n setAddingBundleId(bundle.id);\n try {\n const items = await ensureMenuItemsForBundle(bundle);\n\n for (const bundleItem of bundle.items) {\n const menuItem = items.find((mi) => mi.id === bundleItem.menuItemId);\n if (!menuItem) {\n console.warn(`Menu item ${bundleItem.menuItemId} (${bundleItem.menuItemName}) not found, skipping`);\n continue;\n }\n\n const enrichedAddons = enrichBundleItemAddons(bundleItem, menuItem);\n const scaledQuantity = bundleItem.quantity * guestQuantity;\n\n addMenuItem(sessionIndex, {\n item: { ...menuItem, selectedAddons: enrichedAddons },\n quantity: scaledQuantity,\n bundleId: bundle.id,\n bundleName: bundle.name,\n });\n }\n\n setSelectedBundle(null);\n } catch (err) {\n console.error(\"Failed to add bundle:\", err);\n alert(\"Failed to add bundle. Please try again.\");\n } finally {\n setAddingBundleId(null);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <span className=\"loading loading-spinner loading-lg text-primary\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-red-600 mb-4\">{error}</p>\n <button\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 bg-primary text-white rounded-lg\"\n >\n Retry\n </button>\n </div>\n );\n }\n\n if (bundles.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <Package className=\"w-12 h-12 text-gray-300 mx-auto mb-3\" />\n <p className=\"text-gray-500\">No bundles available at the moment.</p>\n <button\n onClick={onBack}\n className=\"mt-4 px-4 py-2 text-primary font-medium hover:bg-primary/5 rounded-lg transition-colors\"\n >\n Browse Menu Instead\n </button>\n </div>\n );\n }\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={onBack}\n className=\"mb-3 inline-flex items-center gap-2 text-sm font-medium text-primary transition-colors hover:text-primary/80\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to restaurants\n </button>\n\n <div className=\"mb-4 rounded-2xl border border-primary/15 bg-primary/[0.05] px-4 py-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-2xl bg-white text-primary shadow-sm\">\n <Package className=\"h-5 w-5\" />\n </div>\n <div>\n <h3 className=\"text-base font-semibold text-gray-900\">Need some inspiration?</h3>\n <p className=\"mt-1 text-sm text-gray-600\">\n Browse our curated bundles for quick event-ready combinations.\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 xl:grid-cols-2 gap-3\">\n {bundles.map((bundle) => (\n <BundleCard key={bundle.id} bundle={bundle} onClick={setSelectedBundle} />\n ))}\n </div>\n\n {selectedBundle && (\n <BundleDetailModal\n bundle={selectedBundle}\n defaultQuantity={defaultGuestCount}\n isAdding={addingBundleId === selectedBundle.id}\n onAdd={handleAddBundle}\n onClose={() => setSelectedBundle(null)}\n />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { RefObject } from \"react\";\nimport RestaurantMenuBrowser from \"./RestaurantMenuBrowser\";\nimport BundleBrowser from \"./BundleBrowser\";\nimport { MenuItem, DietaryFilter } from \"../types/menu\";\nimport { Restaurant } from \"../types/restaurant\";\n\ninterface MenuBrowserColumnProps {\n showBundleBrowser: boolean;\n onToggleBundleBrowser: (show: boolean) => void;\n sessionIndex: number;\n defaultGuestCount: number;\n restaurants: Restaurant[];\n restaurantsLoading: boolean;\n onAddItem: (item: MenuItem) => void;\n onUpdateQuantity: (itemId: string, quantity: number) => void;\n onAddOrderPress: (item: MenuItem) => void;\n getItemQuantity: (itemId: string) => number;\n expandedItemId: string | null;\n setExpandedItemId: (id: string | null) => void;\n selectedDietaryFilters: DietaryFilter[];\n toggleDietaryFilter: (filter: DietaryFilter) => void;\n restaurantListRef: RefObject<HTMLDivElement | null>;\n firstMenuItemRef: RefObject<HTMLDivElement | null>;\n categoriesRowRef?: RefObject<HTMLDivElement | null>;\n expandedSessionIndex: number | null;\n onRegisterResetToList?: (fn: () => void) => void;\n onMobileSearchStateChange?: (state: {\n mode: \"list\" | \"restaurant\";\n query: string;\n }) => void;\n onRegisterMobileSearchSetter?: (setter: (query: string) => void) => void;\n}\n\nexport default function MenuBrowserColumn({\n showBundleBrowser,\n onToggleBundleBrowser,\n sessionIndex,\n defaultGuestCount,\n restaurants,\n restaurantsLoading,\n onAddItem,\n onUpdateQuantity,\n onAddOrderPress,\n getItemQuantity,\n expandedItemId,\n setExpandedItemId,\n selectedDietaryFilters,\n toggleDietaryFilter,\n restaurantListRef,\n firstMenuItemRef,\n categoriesRowRef,\n expandedSessionIndex,\n onRegisterResetToList,\n onMobileSearchStateChange,\n onRegisterMobileSearchSetter,\n}: MenuBrowserColumnProps) {\n if (showBundleBrowser) {\n return (\n <BundleBrowser\n sessionIndex={sessionIndex}\n onBack={() => onToggleBundleBrowser(false)}\n defaultGuestCount={defaultGuestCount}\n />\n );\n }\n\n return (\n <RestaurantMenuBrowser\n restaurants={restaurants}\n restaurantsLoading={restaurantsLoading}\n onOpenBundles={() => onToggleBundleBrowser(true)}\n defaultBundleGuestCount={defaultGuestCount}\n onAddItem={onAddItem}\n onUpdateQuantity={onUpdateQuantity}\n onAddOrderPress={onAddOrderPress}\n getItemQuantity={getItemQuantity}\n expandedItemId={expandedItemId}\n setExpandedItemId={setExpandedItemId}\n selectedDietaryFilters={selectedDietaryFilters}\n toggleDietaryFilter={toggleDietaryFilter}\n restaurantListRef={restaurantListRef}\n firstMenuItemRef={firstMenuItemRef}\n categoriesRowRef={categoriesRowRef}\n sessionIndex={sessionIndex}\n expandedSessionIndex={expandedSessionIndex}\n onRegisterResetToList={onRegisterResetToList}\n onMobileSearchStateChange={onMobileSearchStateChange}\n onRegisterMobileSearchSetter={onRegisterMobileSearchSetter}\n />\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useCateringState } from \"../state/CateringStateContext\";\nimport { MealSessionState, SelectedMenuItem } from \"../types/session\";\nimport { ChefHat, ChevronDown, ChevronUp, Calendar, Clock, Package, Store } from \"lucide-react\";\nimport { categoryService } from \"../shims/services\";\nimport { ALLERGENS } from \"../constants/allergens\";\n\ninterface GroupedItem {\n item: any;\n quantity: number;\n originalIndex: number;\n}\n\ninterface CategoryGroup {\n items: GroupedItem[];\n subcategories: Map<string, GroupedItem[]>;\n}\n\ninterface AllMealSessionsItemsProps {\n showActions?: boolean;\n onEdit?: (sessionIndex: number, itemIndex: number) => void;\n onRemove?: (sessionIndex: number, itemIndex: number) => void;\n onViewMenu?: () => void;\n isGeneratingPdf?: boolean;\n}\n\nexport default function AllMealSessionsItems({\n showActions = false,\n onEdit,\n onRemove,\n onViewMenu,\n isGeneratingPdf = false,\n}: AllMealSessionsItemsProps) {\n const { mealSessions } = useCateringState();\n\n // Fetch categories for ordering\n const [categoryOrder, setCategoryOrder] = useState<string[]>([]);\n\n useEffect(() => {\n const fetchCategories = async () => {\n try {\n const categories =\n await categoryService.getCategoriesWithSubcategories();\n setCategoryOrder(categories.map((c) => c.name));\n } catch (error) {\n console.error(\"Failed to fetch categories for ordering:\", error);\n }\n };\n fetchCategories();\n }, []);\n\n // Track expanded state for sessions and restaurants\n const [expandedSessions, setExpandedSessions] = useState<Set<number>>(\n new Set(mealSessions.map((_, idx) => idx)),\n );\n const [collapsedCategories, setCollapsedCategories] = useState<Set<string>>(\n new Set(),\n );\n const [expandedAllergens, setExpandedAllergens] = useState<Set<string>>(\n new Set(),\n );\n const [collapsedRestaurants, setCollapsedRestaurants] = useState<Set<string>>(\n new Set(),\n );\n\n const toggleSession = (sessionIndex: number) => {\n setExpandedSessions((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(sessionIndex)) {\n newSet.delete(sessionIndex);\n } else {\n newSet.add(sessionIndex);\n }\n return newSet;\n });\n };\n\n const toggleCategory = (categoryKey: string) => {\n setCollapsedCategories((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(categoryKey)) {\n newSet.delete(categoryKey);\n } else {\n newSet.add(categoryKey);\n }\n return newSet;\n });\n };\n\n const toggleAllergen = (key: string) => {\n setExpandedAllergens((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(key)) {\n newSet.delete(key);\n } else {\n newSet.add(key);\n }\n return newSet;\n });\n };\n\n const toggleRestaurant = (key: string) => {\n setCollapsedRestaurants((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(key)) newSet.delete(key);\n else newSet.add(key);\n return newSet;\n });\n };\n\n // Group items by restaurant, then by bundles/categories within each restaurant\n const groupItemsByRestaurant = (orderItems: SelectedMenuItem[]) => {\n const map = new Map<string, {\n name: string;\n image?: string;\n bundles: Map<string, { name: string; items: GroupedItem[] }>;\n categories: Map<string, CategoryGroup>;\n }>();\n\n orderItems.forEach((orderItem, index) => {\n const restName = (orderItem.item as any).restaurantName || orderItem.item.restaurant?.name || \"Unknown Restaurant\";\n const restData = orderItem.item.restaurant as any;\n const restImage = restData?.images?.[0] || restData?.image?.[0];\n\n if (!map.has(restName)) {\n map.set(restName, { name: restName, image: restImage, bundles: new Map(), categories: new Map() });\n }\n const restaurant = map.get(restName)!;\n\n const groupedItem: GroupedItem = {\n item: orderItem.item,\n quantity: orderItem.quantity,\n originalIndex: index,\n };\n\n if (orderItem.bundleId) {\n if (!restaurant.bundles.has(orderItem.bundleId)) {\n restaurant.bundles.set(orderItem.bundleId, { name: orderItem.bundleName || \"Bundle\", items: [] });\n }\n restaurant.bundles.get(orderItem.bundleId)!.items.push(groupedItem);\n } else {\n const catName = orderItem.item.categoryName || (orderItem.item as any).groupTitle || \"Uncategorized\";\n const subName = orderItem.item.subcategoryName || \"\";\n\n if (!restaurant.categories.has(catName)) {\n restaurant.categories.set(catName, { items: [], subcategories: new Map() });\n }\n const category = restaurant.categories.get(catName)!;\n\n if (subName) {\n if (!category.subcategories.has(subName)) {\n category.subcategories.set(subName, []);\n }\n category.subcategories.get(subName)!.push(groupedItem);\n } else {\n category.items.push(groupedItem);\n }\n }\n });\n\n // Sort categories within each restaurant\n if (categoryOrder.length > 0) {\n map.forEach((restaurant) => {\n const entries = Array.from(restaurant.categories.entries());\n entries.sort((a, b) => {\n const orderA = categoryOrder.indexOf(a[0]);\n const orderB = categoryOrder.indexOf(b[0]);\n return (orderA === -1 ? 999 : orderA) - (orderB === -1 ? 999 : orderB);\n });\n restaurant.categories = new Map(entries);\n });\n }\n\n return map;\n };\n\n const formatDate = (date: string) => {\n if (!date) return \"Date TBD\";\n return new Date(date).toLocaleDateString(\"en-GB\", {\n weekday: \"short\",\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n });\n };\n\n const formatTime = (time: string) => {\n if (!time) return \"Time TBD\";\n const [hours, minutes] = time.split(\":\");\n const hour = parseInt(hours, 10);\n const minute = parseInt(minutes, 10);\n const ampm = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n const start = `${hour12}:${String(minute).padStart(2, \"0\")} ${ampm}`;\n const totalEnd = hour * 60 + minute + 30;\n const endHour = Math.floor(totalEnd / 60) % 24;\n const endMinute = totalEnd % 60;\n const endAmpm = endHour >= 12 ? \"PM\" : \"AM\";\n const endHour12 = endHour % 12 || 12;\n return `${start} – ${endHour12}:${String(endMinute).padStart(2, \"0\")} ${endAmpm}`;\n };\n\n // Calculate session total\n const calculateSessionTotal = (orderItems: SelectedMenuItem[]) => {\n return orderItems.reduce((total, { item, quantity }) => {\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const unitPrice =\n item.isDiscount && discountPrice > 0 ? discountPrice : price;\n\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum: number, addon: { price: number; quantity: number }) =>\n sum + (addon.price || 0) * (addon.quantity || 0),\n 0,\n );\n\n return total + unitPrice * quantity + addonTotal;\n }, 0);\n };\n\n const renderItemRow = (groupedItem: GroupedItem, sessionIndex: number) => {\n const { item, quantity, originalIndex } = groupedItem;\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const itemPrice =\n item.isDiscount && discountPrice > 0 ? discountPrice : price;\n const BACKEND_QUANTITY_UNIT = item.cateringQuantityUnit || 7;\n const portions = quantity / BACKEND_QUANTITY_UNIT;\n const serves = item.feedsPerUnit * portions;\n\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum: number, addon: { price: number; quantity: number }) =>\n sum + (addon.price || 0) * (addon.quantity || 0),\n 0,\n );\n const subtotal = itemPrice * quantity + addonTotal;\n\n return (\n <div\n key={`${sessionIndex}-${originalIndex}`}\n className=\"bg-gray-50 rounded-lg p-3 sm:p-4 hover:bg-gray-100 transition-colors\"\n >\n <div className=\"flex flex-col sm:flex-row sm:justify-between sm:items-start gap-2 mb-2\">\n <div className=\"flex gap-3 flex-1\">\n {item.image && (\n <img\n src={item.image}\n alt={item.menuItemName}\n className=\"w-14 h-14 sm:w-16 sm:h-16 rounded-lg object-cover flex-shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-sm sm:text-base text-gray-900 mb-1\">\n {item.menuItemName}\n </p>\n <p className=\"text-xs sm:text-sm text-gray-600\">\n {portions} portion{portions !== 1 ? \"s\" : \"\"}\n </p>\n <p className=\"text-xs sm:text-sm text-gray-600\">\n serves ~ {serves}\n </p>\n {item.selectedAddons && item.selectedAddons.length > 0 && (\n <div className=\"mt-1 text-xs text-gray-500\">\n {item.selectedAddons.map(\n (\n addon: { name: string; quantity: number },\n idx: number,\n ) => (\n <span key={idx}>\n + {addon.name}\n {addon.quantity > 1 && ` (×${addon.quantity})`}\n {idx < item.selectedAddons!.length - 1 ? \", \" : \"\"}\n </span>\n ),\n )}\n </div>\n )}\n {item.allergens && item.allergens.length > 0 && (\n <div className=\"mt-2\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleAllergen(`${sessionIndex}-${originalIndex}`);\n }}\n className=\"flex items-center gap-1 text-xs font-medium text-orange-700 hover:text-orange-800 transition-colors\"\n >\n <span className=\"text-orange-600\">⚠️</span>\n <span>Allergens ({item.allergens.length})</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-3 w-3 transition-transform ${\n expandedAllergens.has(\n `${sessionIndex}-${originalIndex}`,\n )\n ? \"rotate-180\"\n : \"\"\n }`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n {expandedAllergens.has(\n `${sessionIndex}-${originalIndex}`,\n ) && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {item.allergens.map((allergenValue: string) => {\n const allergen = ALLERGENS.find(\n (a) => a.value === allergenValue,\n );\n return (\n <span\n key={allergenValue}\n className=\"inline-flex items-center bg-orange-100 text-orange-800 px-2 py-0.5 rounded text-xs\"\n >\n {allergen?.label || allergenValue}\n </span>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n <div className=\"flex items-center justify-between sm:justify-end gap-3 sm:gap-4\">\n <p className=\"font-bold text-pink-600 text-sm sm:text-base whitespace-nowrap\">\n £{subtotal.toFixed(2)}\n </p>\n {showActions && onEdit && onRemove && (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => onEdit(sessionIndex, originalIndex)}\n className=\"px-3 py-1.5 border border-pink-500 text-pink-500 rounded-lg hover:bg-pink-50 transition-colors text-xs sm:text-sm font-medium\"\n >\n Edit\n </button>\n <button\n onClick={() => onRemove(sessionIndex, originalIndex)}\n className=\"px-3 py-1.5 border border-pink-500 text-pink-500 rounded-lg hover:bg-pink-50 transition-colors text-xs sm:text-sm font-medium\"\n >\n Remove\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n const renderCategoryGroup = (\n categoryName: string,\n categoryGroup: CategoryGroup,\n sessionIndex: number,\n ) => {\n const categoryKey = `${sessionIndex}-${categoryName}`;\n const isCollapsed = collapsedCategories.has(categoryKey);\n const totalItems =\n categoryGroup.items.length +\n Array.from(categoryGroup.subcategories.values()).reduce(\n (sum, items) => sum + items.length,\n 0,\n );\n\n return (\n <div\n key={categoryKey}\n className=\"border border-gray-200 rounded-lg overflow-hidden\"\n >\n <button\n onClick={() => toggleCategory(categoryKey)}\n className=\"w-full flex items-center justify-between px-4 py-3 bg-gray-50 hover:bg-gray-100 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <ChefHat className=\"h-4 w-4 text-pink-500\" />\n <span className=\"font-semibold text-gray-800\">{categoryName}</span>\n <span className=\"text-sm text-gray-500\">\n ({totalItems} item{totalItems !== 1 ? \"s\" : \"\"})\n </span>\n </div>\n {isCollapsed ? (\n <ChevronDown className=\"h-5 w-5 text-gray-400\" />\n ) : (\n <ChevronUp className=\"h-5 w-5 text-gray-400\" />\n )}\n </button>\n\n {!isCollapsed && (\n <div className=\"p-3 space-y-2\">\n {categoryGroup.items.map((groupedItem) =>\n renderItemRow(groupedItem, sessionIndex),\n )}\n\n {Array.from(categoryGroup.subcategories.entries()).map(\n ([subName, items]) => (\n <div key={subName}>\n <p className=\"text-xs font-medium text-gray-600 mb-2 pl-2\">\n {subName}\n </p>\n <div className=\"space-y-2\">\n {items.map((groupedItem) =>\n renderItemRow(groupedItem, sessionIndex),\n )}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n </div>\n );\n };\n\n const renderBundleGroup = (\n bundleId: string,\n bundleName: string,\n items: GroupedItem[],\n sessionIndex: number,\n ) => {\n const categoryKey = `${sessionIndex}-bundle-${bundleId}`;\n const isCollapsed = collapsedCategories.has(categoryKey);\n\n return (\n <div\n key={categoryKey}\n className=\"border-2 border-dashed border-primary/30 rounded-lg overflow-hidden\"\n >\n <button\n onClick={() => toggleCategory(categoryKey)}\n className=\"w-full flex items-center justify-between px-4 py-3 bg-primary/5 hover:bg-primary/10 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <Package className=\"h-4 w-4 text-primary\" />\n <span className=\"font-semibold text-primary\">{bundleName}</span>\n <span className=\"text-sm text-gray-500\">\n ({items.length} item{items.length !== 1 ? \"s\" : \"\"})\n </span>\n </div>\n {isCollapsed ? (\n <ChevronDown className=\"h-5 w-5 text-primary/60\" />\n ) : (\n <ChevronUp className=\"h-5 w-5 text-primary/60\" />\n )}\n </button>\n\n {!isCollapsed && (\n <div className=\"p-3 space-y-2\">\n {items.map((groupedItem) =>\n renderItemRow(groupedItem, sessionIndex),\n )}\n </div>\n )}\n </div>\n );\n };\n\n const renderMealSession = (\n session: MealSessionState,\n sessionIndex: number,\n ) => {\n const isExpanded = expandedSessions.has(sessionIndex);\n const restaurantGroups = groupItemsByRestaurant(session.orderItems);\n const sessionTotal = calculateSessionTotal(session.orderItems);\n const itemCount = session.orderItems.length;\n\n if (itemCount === 0) return null;\n\n return (\n <div\n key={sessionIndex}\n className=\"rounded-xl overflow-hidden bg-white shadow-sm\"\n >\n {/* Session Header */}\n <button\n onClick={() => toggleSession(sessionIndex)}\n className=\"w-full flex items-center justify-between gap-3 p-4 sm:p-5 bg-gradient-to-r from-pink-50 to-pink-100 hover:from-pink-100 hover:to-pink-150 transition-colors\"\n >\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 text-left\">\n <h3 className=\"text-lg sm:text-xl font-bold text-primary\">\n {session.sessionName || `Session ${sessionIndex + 1}`}\n </h3>\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 text-sm text-gray-600\">\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-4 w-4 text-pink-500\" />\n {formatDate(session.sessionDate)}\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-4 w-4 text-pink-500\" />\n {formatTime(session.eventTime)}\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm sm:text-base font-bold text-pink-600\">\n £{sessionTotal.toFixed(2)}\n </span>\n {isExpanded ? (\n <ChevronUp className=\"h-5 w-5 text-pink-400 flex-shrink-0\" />\n ) : (\n <ChevronDown className=\"h-5 w-5 text-pink-400 flex-shrink-0\" />\n )}\n </div>\n </button>\n\n {/* Session Content */}\n {isExpanded && (\n <div className=\"p-4 sm:p-5 space-y-4\">\n {/* Guest count and special requirements */}\n {(session.guestCount || session.specialRequirements) && (\n <div className=\"bg-gray-50 rounded-lg p-3 sm:p-4 space-y-2\">\n {session.guestCount && (\n <p className=\"text-sm text-gray-700\">\n <span className=\"font-medium\">Guests:</span>{\" \"}\n {session.guestCount} people\n </p>\n )}\n {session.specialRequirements && (\n <div>\n <p className=\"text-xs font-semibold text-gray-700 mb-1 uppercase tracking-wide\">\n Special Requirements:\n </p>\n <p className=\"text-sm text-gray-600 whitespace-pre-wrap\">\n {session.specialRequirements}\n </p>\n </div>\n )}\n </div>\n )}\n\n {/* Restaurant groups */}\n <div className=\"space-y-5\">\n {Array.from(restaurantGroups.entries()).map(([restName, restaurant]) => {\n const restKey = `${sessionIndex}-rest-${restName}`;\n const isRestaurantCollapsed = collapsedRestaurants.has(restKey);\n const totalRestaurantItems = Array.from(restaurant.bundles.values()).reduce((sum, b) => sum + b.items.length, 0)\n + Array.from(restaurant.categories.values()).reduce((sum, c) => sum + c.items.length + Array.from(c.subcategories.values()).reduce((s, items) => s + items.length, 0), 0);\n\n return (\n <div key={restKey}>\n {/* Restaurant Header */}\n <button\n onClick={() => toggleRestaurant(restKey)}\n className=\"w-full flex items-center gap-3 mb-2 px-1 hover:bg-gray-50 rounded-lg py-1 transition-colors\"\n >\n {restaurant.image ? (\n <img src={restaurant.image} alt={restName} className=\"w-9 h-9 rounded-lg object-cover flex-shrink-0\" />\n ) : (\n <Store className=\"w-5 h-5 text-gray-500 flex-shrink-0\" />\n )}\n <span className=\"font-bold text-base text-gray-800\">{restName}</span>\n <span className=\"text-sm text-gray-400\">({totalRestaurantItems})</span>\n <div className=\"flex-1\" />\n {isRestaurantCollapsed ? (\n <ChevronDown className=\"h-5 w-5 text-gray-400\" />\n ) : (\n <ChevronUp className=\"h-5 w-5 text-gray-400\" />\n )}\n </button>\n\n {!isRestaurantCollapsed && (\n <div className=\"space-y-3\">\n {/* Bundle groups for this restaurant */}\n {Array.from(restaurant.bundles.entries()).map(\n ([bundleId, { name, items }]) =>\n renderBundleGroup(bundleId, name, items, sessionIndex),\n )}\n\n {/* Categories for this restaurant */}\n {Array.from(restaurant.categories.entries()).map(\n ([categoryName, categoryGroup]) =>\n renderCategoryGroup(categoryName, categoryGroup, sessionIndex),\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Session Total */}\n <div className=\"border-t border-gray-200 pt-4 mt-4\">\n <div className=\"flex justify-between text-gray-900 font-bold\">\n <span>Session Total:</span>\n <span className=\"text-pink-600\">\n £{sessionTotal.toFixed(2)}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n };\n\n // Filter out empty sessions\n const nonEmptySessions = mealSessions.filter(\n (session) => session.orderItems.length > 0,\n );\n\n if (nonEmptySessions.length === 0) {\n return null;\n }\n\n return (\n <div className=\"\">\n <div className=\"flex items-center justify-between mb-4 sm:mb-6\">\n <h2 className=\"text-xl sm:text-2xl font-bold text-gray-900\">\n Your Order\n </h2>\n {onViewMenu && (\n <button\n onClick={onViewMenu}\n disabled={isGeneratingPdf}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-primary bg-primary/10 hover:bg-primary/20 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isGeneratingPdf ? (\n <>\n <span className=\"loading loading-spinner loading-xs\"></span>\n <span className=\"hidden sm:inline\">Generating...</span>\n <span className=\"sm:hidden\">...</span>\n </>\n ) : (\n <>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span className=\"hidden sm:inline\">Download Menu</span>\n <span className=\"sm:hidden\">PDF</span>\n </>\n )}\n </button>\n )}\n </div>\n\n <div className=\"space-y-4 sm:space-y-6\">\n {nonEmptySessions.map((session) => {\n // Find the actual index in mealSessions array\n const actualIndex = mealSessions.indexOf(session);\n return renderMealSession(session, actualIndex);\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { FileText, Users, DollarSign } from \"lucide-react\";\nimport { PdfDownloadModalProps } from \"../types\";\n\nexport default function PdfDownloadModal({\n onDownload,\n onClose,\n isGenerating = false,\n}: PdfDownloadModalProps) {\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[100] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl\">\n <div className=\"flex items-center gap-3 mb-6\">\n <div className=\"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center\">\n <FileText className=\"h-6 w-6 text-primary\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Download Menu PDF</h3>\n <p className=\"text-sm text-gray-500\">Choose your preferred format</p>\n </div>\n </div>\n\n <div className=\"space-y-3 mb-6\">\n {/* With Prices Option */}\n <button\n onClick={() => onDownload(true)}\n disabled={isGenerating}\n className=\"w-full p-4 rounded-xl border-2 border-base-300 hover:border-primary hover:bg-primary/5 transition-all text-left group disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-green-100 flex items-center justify-center flex-shrink-0 group-hover:bg-green-200 transition-colors\">\n <DollarSign className=\"h-5 w-5 text-green-600\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"font-semibold text-gray-900 group-hover:text-primary transition-colors\">\n With Prices\n </p>\n <p className=\"text-sm text-gray-500\">\n Full menu with pricing details for budget planning\n </p>\n </div>\n </div>\n </button>\n\n {/* Without Prices Option */}\n <button\n onClick={() => onDownload(false)}\n disabled={isGenerating}\n className=\"w-full p-4 rounded-xl border-2 border-base-300 hover:border-primary hover:bg-primary/5 transition-all text-left group disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-blue-100 flex items-center justify-center flex-shrink-0 group-hover:bg-blue-200 transition-colors\">\n <Users className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"font-semibold text-gray-900 group-hover:text-primary transition-colors\">\n Without Prices\n </p>\n <p className=\"text-sm text-gray-500\">\n Clean menu for sharing with event guests\n </p>\n </div>\n </div>\n </button>\n </div>\n\n {isGenerating && (\n <div className=\"flex items-center justify-center gap-2 mb-4 text-primary\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n <span className=\"text-sm font-medium\">Generating PDF...</span>\n </div>\n )}\n\n <button\n onClick={onClose}\n disabled={isGenerating}\n className=\"w-full px-4 py-3 border border-base-300 text-gray-600 rounded-xl hover:bg-base-100 transition-colors font-medium disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Cancel\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { MapPin, ExternalLink, Copy, Check } from \"lucide-react\";\n\nconst HALKIN_URL = \"https://events.halkin.com/coworking/halkin\";\n\ninterface HalkinVenueModalProps {\n onClose: () => void;\n}\n\nexport default function HalkinVenueModal({ onClose }: HalkinVenueModalProps) {\n const [copied, setCopied] = useState(false);\n\n const handleBookSpace = () => {\n window.open(HALKIN_URL, \"_blank\", \"noopener,noreferrer\");\n onClose();\n };\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(HALKIN_URL);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[100] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-full bg-pink-100 flex items-center justify-center flex-shrink-0\">\n <MapPin className=\"h-6 w-6 text-pink-500\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Delivering to Halkin?</h3>\n <p className=\"text-sm text-gray-500\">We noticed you're ordering to a Halkin venue</p>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2 mb-4\">\n <div className=\"flex items-start gap-2 text-sm text-gray-600\">\n <span className=\"text-pink-500 mt-0.5\">✓</span>\n <span>Book a dedicated event space at Halkin</span>\n </div>\n <div className=\"flex items-start gap-2 text-sm text-gray-600\">\n <span className=\"text-pink-500 mt-0.5\">✓</span>\n <span>Order catering in the same seamless flow</span>\n </div>\n <div className=\"flex items-start gap-2 text-sm text-gray-600\">\n <span className=\"text-pink-500 mt-0.5\">✓</span>\n <span>Everything handled in one place</span>\n </div>\n </div>\n\n <div className=\"mb-6\">\n <p className=\"text-xs text-gray-500 mb-1.5\">Save this link for next time</p>\n <div className=\"flex items-center gap-2 bg-gray-50 border border-gray-200 rounded-lg px-3 py-2\">\n <span className=\"text-xs text-gray-600 flex-1 truncate\">{HALKIN_URL}</span>\n <button\n onClick={handleCopy}\n className=\"flex-shrink-0 text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label=\"Copy link\"\n >\n {copied ? <Check className=\"h-4 w-4 text-green-500\" /> : <Copy className=\"h-4 w-4\" />}\n </button>\n </div>\n </div>\n\n <div className=\"space-y-3\">\n <button\n onClick={handleBookSpace}\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-pink-500 hover:bg-pink-600 text-white font-semibold rounded-xl transition-colors\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n Book a space for my event\n </button>\n <button\n onClick={onClose}\n className=\"w-full px-4 py-3 border border-base-300 text-gray-600 rounded-xl hover:bg-base-100 transition-colors font-medium\"\n >\n Continue ordering\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useAddressAutocomplete } from \"../../hooks/useAddressAutocomplete\";\n\ninterface AddressAutocompleteProps {\n onPlaceSelect: (place: google.maps.places.PlaceResult) => void;\n onClearAddress?: () => void;\n error?: string;\n hasValidAddress?: boolean;\n}\n\nexport default function AddressAutocomplete({\n onPlaceSelect,\n onClearAddress,\n error,\n hasValidAddress,\n}: AddressAutocompleteProps) {\n const {\n inputRef,\n containerRef,\n query,\n setQuery,\n predictions,\n open,\n activeIndex,\n setActiveIndex,\n handleSelect,\n handleKeyDown,\n clear,\n } = useAddressAutocomplete(onPlaceSelect);\n\n const handleClear = () => {\n clear();\n if (onClearAddress) onClearAddress();\n };\n\n return (\n <div className=\"col-span-full\" ref={containerRef}>\n <label className=\"block text-[10px] font-bold text-base-content/60 uppercase tracking-widest mb-1.5\">\n Search Address<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <div className=\"relative\">\n <input\n ref={inputRef}\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Start typing an address...\"\n autoComplete=\"new-password\"\n className={`address-search-input w-full bg-gray-50 border rounded-lg px-4 py-2.5 text-base text-base-content placeholder:text-base-content/50 focus:outline-none focus:ring-2 focus:ring-dark-pink/20 focus:border-dark-pink transition-all ${\n error\n ? \"border-error\"\n : hasValidAddress\n ? \"border-success\"\n : \"border-base-300\"\n }`}\n />\n {hasValidAddress && (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-[10px] font-bold uppercase tracking-widest text-dark-pink hover:opacity-80\"\n >\n Change\n </button>\n )}\n {open && predictions.length > 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 rounded-lg border border-base-200 bg-white shadow-lg overflow-hidden z-50\">\n {predictions.map((p, idx) => (\n <button\n key={p.place_id}\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); handleSelect(p); }}\n onMouseEnter={() => setActiveIndex(idx)}\n className={`flex w-full items-start gap-2 px-3 py-2.5 text-left transition-colors ${idx === activeIndex ? \"bg-base-100\" : \"hover:bg-base-100\"}`}\n >\n <svg className=\"h-3.5 w-3.5 flex-shrink-0 text-base-content/40 mt-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a2 2 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0zM15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-base-content truncate\">\n {p.structured_formatting.main_text}\n </p>\n <p className=\"text-xs text-base-content/50 truncate\">\n {p.structured_formatting.secondary_text}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n {error && <p className=\"mt-1 text-xs text-error\">{error}</p>}\n {hasValidAddress && !error && (\n <p className=\"mt-1 text-xs text-success\">Address selected</p>\n )}\n {!hasValidAddress && !error && (\n <p className=\"mt-1 text-xs text-base-content/60\">\n Please select an address from the dropdown\n </p>\n )}\n </div>\n );\n}\n","import { ContactInfo } from \"../../types/checkout\";\nimport AddressAutocomplete from \"./AddressAutocomplete\";\n\ninterface ValidationErrors {\n addressLine1?: string;\n city?: string;\n zipcode?: string;\n}\n\ninterface DeliveryAddressFormProps {\n formData: ContactInfo;\n errors: ValidationErrors;\n onFieldChange: (field: keyof ContactInfo, value: string) => void;\n onPlaceSelect: (place: google.maps.places.PlaceResult) => void;\n onClearAddress?: () => void;\n hasValidAddress?: boolean;\n}\n\nexport default function DeliveryAddressForm({\n formData,\n errors,\n onFieldChange,\n onPlaceSelect,\n onClearAddress,\n hasValidAddress,\n}: DeliveryAddressFormProps) {\n return (\n <div className=\"mb-8 last:mb-0\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-pink-100 flex items-center justify-center text-primary\">\n <svg\n className=\"w-[18px] h-[18px]\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M17.657 16.657L13.414 20.9a2 2 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </div>\n <h4 className=\"font-bold text-base tracking-tight text-base-content\">\n Delivery Address\n </h4>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <AddressAutocomplete\n onPlaceSelect={onPlaceSelect}\n onClearAddress={onClearAddress}\n error={\n errors.addressLine1?.includes(\"United Kingdom\") ||\n errors.addressLine1?.includes(\"London\")\n ? errors.addressLine1\n : undefined\n }\n hasValidAddress={hasValidAddress}\n />\n\n <div className=\"col-span-full\">\n <label className=\"block text-[10px] font-bold text-base-content/60 uppercase tracking-widest mb-1.5\">\n Address Line 1<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"text\"\n name=\"addressLine1\"\n required\n value={formData.addressLine1 || \"\"}\n readOnly\n placeholder=\"Select from search above\"\n className={`w-full border rounded-lg px-4 py-2.5 text-base focus:outline-none transition-all ${\n errors.addressLine1 &&\n !errors.addressLine1.includes(\"United Kingdom\") &&\n !errors.addressLine1.includes(\"London\")\n ? \"border-error bg-gray-100\"\n : \"border-base-300 bg-gray-100\"\n } text-base-content/70 cursor-not-allowed`}\n />\n {errors.addressLine1 &&\n !errors.addressLine1.includes(\"United Kingdom\") &&\n !errors.addressLine1.includes(\"London\") && (\n <p className=\"mt-1 text-xs text-error\">{errors.addressLine1}</p>\n )}\n </div>\n\n <div className=\"col-span-full\">\n <label className=\"block text-[10px] font-bold text-base-content/60 uppercase tracking-widest mb-1.5\">\n Address Line 2\n <span className=\"text-[9px] text-base-content/40 ml-2\">(Optional)</span>\n </label>\n <input\n type=\"text\"\n name=\"addressLine2\"\n value={formData.addressLine2 || \"\"}\n onChange={(e) => onFieldChange(\"addressLine2\", e.target.value)}\n placeholder=\"Apartment, suite, etc.\"\n className=\"w-full bg-gray-50 border border-base-300 rounded-lg px-4 py-2.5 text-base text-base-content placeholder:text-base-content/50 focus:outline-none focus:ring-2 focus:ring-dark-pink/20 focus:border-dark-pink transition-all\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-bold text-base-content/60 uppercase tracking-widest mb-1.5\">\n City\n </label>\n <input\n type=\"text\"\n name=\"city\"\n required\n value={formData.city || \"\"}\n readOnly\n placeholder=\"Auto-filled\"\n className={`w-full border rounded-lg px-4 py-2.5 text-base focus:outline-none transition-all ${\n errors.city ? \"border-error bg-gray-100\" : \"border-base-300 bg-gray-100\"\n } text-base-content/70 cursor-not-allowed`}\n />\n {errors.city && <p className=\"mt-1 text-xs text-error\">{errors.city}</p>}\n </div>\n\n <div>\n <label className=\"block text-[10px] font-bold text-base-content/60 uppercase tracking-widest mb-1.5\">\n Postcode\n </label>\n <input\n type=\"text\"\n name=\"zipcode\"\n required\n value={formData.zipcode || \"\"}\n readOnly\n placeholder=\"Auto-filled\"\n className={`w-full border rounded-lg px-4 py-2.5 text-base focus:outline-none transition-all ${\n errors.zipcode\n ? \"border-error bg-gray-100\"\n : \"border-base-300 bg-gray-100\"\n } text-base-content/70 cursor-not-allowed`}\n />\n {errors.zipcode && (\n <p className=\"mt-1 text-xs text-error\">{errors.zipcode}</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Building2 } from \"lucide-react\";\nimport { ContactInfo } from \"../../types/checkout\";\n\ninterface ValidationErrors {\n organization?: string;\n fullName?: string;\n email?: string;\n phone?: string;\n billingAddress?: {\n line1?: string;\n city?: string;\n postalCode?: string;\n };\n}\n\ninterface ContactInfoFormProps {\n formData: ContactInfo;\n errors: ValidationErrors;\n onFieldChange: (field: keyof ContactInfo, value: string) => void;\n onBlur: (field: keyof ContactInfo) => void;\n onBillingBlur: (\n field: keyof NonNullable<ContactInfo[\"billingAddress\"]>,\n ) => void;\n ccEmails: string[];\n onAddCcEmail: (email: string) => void;\n onRemoveCcEmail: (email: string) => void;\n}\n\nconst fieldLabelClass =\n \"block text-[10px] font-bold text-base-content/60 uppercase tracking-widest mb-1.5\";\nconst fieldClass =\n \"w-full bg-gray-50 border border-base-300 rounded-lg px-4 py-2.5 text-base text-base-content placeholder:text-base-content/50 focus:outline-none focus:ring-2 focus:ring-dark-pink/20 focus:border-dark-pink transition-all\";\n\nexport default function ContactInfoForm({\n formData,\n errors,\n onFieldChange,\n onBlur,\n onBillingBlur,\n ccEmails,\n onAddCcEmail,\n onRemoveCcEmail,\n}: ContactInfoFormProps) {\n const [ccEmailInput, setCcEmailInput] = useState(\"\");\n const [showBillingAddress, setShowBillingAddress] = useState(\n !!formData.billingAddress?.line1,\n );\n\n const handleBillingFieldChange = (\n field: keyof NonNullable<ContactInfo[\"billingAddress\"]>,\n value: string,\n ) => {\n const currentBilling = formData.billingAddress || {\n line1: \"\",\n line2: \"\",\n city: \"\",\n postalCode: \"\",\n country: \"GB\",\n };\n\n onFieldChange(\n \"billingAddress\",\n {\n ...currentBilling,\n [field]: value,\n } as any,\n );\n };\n\n const handleAddCcEmail = () => {\n const trimmedEmail = ccEmailInput.trim();\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n if (!trimmedEmail) return;\n if (!emailRegex.test(trimmedEmail)) {\n alert(\"Please enter a valid email address\");\n return;\n }\n if (ccEmails.includes(trimmedEmail)) {\n alert(\"This email is already added\");\n return;\n }\n\n onAddCcEmail(trimmedEmail);\n setCcEmailInput(\"\");\n };\n\n return (\n <div className=\"mb-8 last:mb-0\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-pink-100 flex items-center justify-center text-primary\">\n <svg\n className=\"w-[18px] h-[18px]\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5.121 17.804A4 4 0 017 16h10a4 4 0 011.879.468M15 10a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </div>\n <h4 className=\"font-bold text-sm tracking-tight text-base-content\">\n Contact Details\n </h4>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"col-span-full\">\n <label className={fieldLabelClass}>\n Organization\n <span className=\"text-[9px] text-base-content/40 ml-2\">(Optional)</span>\n </label>\n <input\n type=\"text\"\n name=\"organization\"\n value={formData.organization}\n onChange={(e) => onFieldChange(\"organization\", e.target.value)}\n onBlur={() => onBlur(\"organization\")}\n placeholder=\"Your Organization Name\"\n className={fieldClass}\n />\n </div>\n\n <div>\n <label className={fieldLabelClass}>\n Name<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"text\"\n name=\"fullName\"\n required\n value={formData.fullName}\n onChange={(e) => onFieldChange(\"fullName\", e.target.value)}\n onBlur={() => onBlur(\"fullName\")}\n placeholder=\"Your Name\"\n className={`${fieldClass} ${errors.fullName ? \"border-error\" : \"\"}`}\n />\n {errors.fullName && (\n <p className=\"mt-1 text-xs text-error\">{errors.fullName}</p>\n )}\n </div>\n\n <div>\n <label className={fieldLabelClass}>\n Telephone<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"tel\"\n name=\"phone\"\n required\n value={formData.phone}\n onChange={(e) => onFieldChange(\"phone\", e.target.value)}\n onBlur={() => onBlur(\"phone\")}\n placeholder=\"Your Number\"\n className={`${fieldClass} ${errors.phone ? \"border-error\" : \"\"}`}\n />\n {errors.phone && <p className=\"mt-1 text-xs text-error\">{errors.phone}</p>}\n </div>\n\n <div className=\"col-span-full\">\n <label className={fieldLabelClass}>\n Email<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"email\"\n name=\"email\"\n required\n value={formData.email}\n onChange={(e) => onFieldChange(\"email\", e.target.value)}\n onBlur={() => onBlur(\"email\")}\n placeholder=\"Your Email\"\n className={`${fieldClass} ${errors.email ? \"border-error\" : \"\"}`}\n />\n {errors.email && <p className=\"mt-1 text-xs text-error\">{errors.email}</p>}\n </div>\n\n <div className=\"col-span-full\">\n <label className={fieldLabelClass}>CC Additional Emails (Optional)</label>\n <p className=\"text-[10px] text-base-content/50 mb-3\">\n Add additional email addresses to receive order updates\n </p>\n\n <div className=\"flex gap-2\">\n <input\n type=\"email\"\n value={ccEmailInput}\n onChange={(e) => setCcEmailInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleAddCcEmail();\n }\n }}\n placeholder=\"additional@email.com\"\n className={fieldClass}\n />\n <button\n type=\"button\"\n onClick={handleAddCcEmail}\n className=\"bg-dark-pink text-white px-4 py-2 rounded-lg text-xs font-bold uppercase tracking-widest hover:opacity-90 transition-all\"\n >\n Add\n </button>\n </div>\n\n {ccEmails.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {ccEmails.map((email, index) => (\n <span\n key={index}\n className=\"bg-base-200 text-base-content/70 px-2 py-1 rounded text-[10px] font-medium flex items-center gap-1\"\n >\n {email}\n <button\n type=\"button\"\n onClick={() => onRemoveCcEmail(email)}\n className=\"hover:text-dark-pink\"\n >\n x\n </button>\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"border-t border-base-300 pt-8 mt-8\">\n <button\n type=\"button\"\n onClick={() => setShowBillingAddress(!showBillingAddress)}\n className=\"w-full flex items-center justify-between group\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-gray-200 border border-gray-300 flex items-center justify-center text-base-content/70 transition-colors\">\n <Building2 size={18} />\n </div>\n <span className=\"font-bold text-sm text-base-content\">Billing Address</span>\n <span className=\"text-[9px] font-bold text-base-content/40 uppercase tracking-widest ml-2\">\n (Optional)\n </span>\n </div>\n <svg\n className={`w-5 h-5 text-base-content/60 transition-transform ${showBillingAddress ? \"rotate-180\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n {showBillingAddress && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4\">\n <div className=\"col-span-full\">\n <label className={fieldLabelClass}>\n Address Line 1<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"text\"\n value={formData.billingAddress?.line1 || \"\"}\n onChange={(e) => handleBillingFieldChange(\"line1\", e.target.value)}\n onBlur={() => onBillingBlur(\"line1\")}\n placeholder=\"Street address\"\n className={`${fieldClass} ${errors.billingAddress?.line1 ? \"border-error\" : \"\"}`}\n />\n {errors.billingAddress?.line1 && (\n <p className=\"mt-1 text-xs text-error\">{errors.billingAddress.line1}</p>\n )}\n </div>\n\n <div className=\"col-span-full\">\n <label className={fieldLabelClass}>\n Address Line 2\n <span className=\"text-[9px] text-base-content/40 ml-2\">(Optional)</span>\n </label>\n <input\n type=\"text\"\n value={formData.billingAddress?.line2 || \"\"}\n onChange={(e) => handleBillingFieldChange(\"line2\", e.target.value)}\n placeholder=\"Apartment, suite, etc.\"\n className={fieldClass}\n />\n </div>\n\n <div>\n <label className={fieldLabelClass}>\n City<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"text\"\n value={formData.billingAddress?.city || \"\"}\n onChange={(e) => handleBillingFieldChange(\"city\", e.target.value)}\n onBlur={() => onBillingBlur(\"city\")}\n placeholder=\"City\"\n className={`${fieldClass} ${errors.billingAddress?.city ? \"border-error\" : \"\"}`}\n />\n {errors.billingAddress?.city && (\n <p className=\"mt-1 text-xs text-error\">{errors.billingAddress.city}</p>\n )}\n </div>\n\n <div>\n <label className={fieldLabelClass}>\n Postcode<span className=\"text-dark-pink ml-0.5\">*</span>\n </label>\n <input\n type=\"text\"\n value={formData.billingAddress?.postalCode || \"\"}\n onChange={(e) =>\n handleBillingFieldChange(\"postalCode\", e.target.value.toUpperCase())\n }\n onBlur={() => onBillingBlur(\"postalCode\")}\n placeholder=\"SW1A 1AA\"\n className={`${fieldClass} ${errors.billingAddress?.postalCode ? \"border-error\" : \"\"}`}\n />\n {errors.billingAddress?.postalCode && (\n <p className=\"mt-1 text-xs text-error\">{errors.billingAddress.postalCode}</p>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Percent } from \"lucide-react\";\n\ninterface PromoCodeSectionProps {\n promoCodes: string[];\n onApplyPromoCode: (code: string) => Promise<void>;\n onRemovePromoCode: (code: string) => void;\n validatingPromo: boolean;\n promoError: string;\n promoSuccess: string;\n promoDiscount?: number;\n}\n\nexport default function PromoCodeSection({\n promoCodes,\n onApplyPromoCode,\n onRemovePromoCode,\n validatingPromo,\n promoError,\n promoSuccess,\n promoDiscount,\n}: PromoCodeSectionProps) {\n const [promoInput, setPromoInput] = useState(\"\");\n const [isExpanded, setIsExpanded] = useState(false);\n\n const handleApply = async () => {\n if (promoInput.trim()) {\n await onApplyPromoCode(promoInput.toUpperCase());\n setPromoInput(\"\");\n }\n };\n\n return (\n <div className=\"py-4 border-y border-base-300\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className={`w-full flex items-center justify-between group ${isExpanded ? \"mb-4\" : \"mb-0\"}`}\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-gray-200 border border-gray-300 flex items-center justify-center text-base-content/70 transition-colors\">\n <Percent size={18} />\n </div>\n <h4 className=\"font-bold text-sm text-base-content\">Discount Code</h4>\n {promoCodes.length > 0 && (\n <span className=\"text-xs bg-success/10 text-success px-2 py-0.5 rounded-full\">\n {promoCodes.length} applied\n </span>\n )}\n </div>\n <svg\n className={`w-5 h-5 text-base-content/60 transition-transform ${\n isExpanded ? \"rotate-180\" : \"\"\n }`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n\n {isExpanded && (\n <div>\n <div className=\"flex gap-2 mb-3\">\n <input\n type=\"text\"\n value={promoInput}\n onChange={(e) => setPromoInput(e.target.value.toUpperCase())}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleApply();\n }\n }}\n placeholder=\"Add discount code or voucher\"\n className=\"flex-1 px-3 py-2 text-base bg-gray-100 border border-base-300 rounded-lg focus:ring-2 focus:ring-dark-pink focus:border-transparent transition-all\"\n />\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={validatingPromo || !promoInput.trim()}\n className=\"px-4 py-2 bg-dark-pink text-white rounded-lg font-medium hover:opacity-90 transition-all disabled:bg-base-300 disabled:cursor-not-allowed text-sm\"\n >\n {validatingPromo ? \"...\" : \"Apply\"}\n </button>\n </div>\n\n {promoError && (\n <div className=\"mb-3 p-2 bg-error/10 border border-error/30 rounded-lg\">\n <p className=\"text-xs text-error\">✗ {promoError}</p>\n </div>\n )}\n\n {promoSuccess && (\n <div className=\"mb-3 p-2 bg-success/10 border border-success/30 rounded-lg\">\n <p className=\"text-xs text-success\">\n ✓ {promoSuccess}\n {promoDiscount && promoDiscount > 0 && (\n <> You saved £{promoDiscount.toFixed(2)}</>\n )}\n </p>\n </div>\n )}\n\n {promoCodes.length > 0 && (\n <div className=\"space-y-2 mb-3\">\n {promoCodes.map((code) => (\n <div\n key={code}\n className=\"flex items-center justify-between bg-base-100 p-2 rounded-lg border border-base-300\"\n >\n <span className=\"font-mono text-xs font-medium text-primary\">\n {code}\n </span>\n <button\n type=\"button\"\n onClick={() => onRemovePromoCode(code)}\n className=\"text-error hover:opacity-80 text-xs font-medium\"\n >\n Remove\n </button>\n </div>\n ))}\n </div>\n )}\n\n <p className=\"text-xs text-base-content/60\">\n If your organisation is partnered with us, please contact us for\n vouchers before payment.\n </p>\n </div>\n )}\n </div>\n );\n}\n","/**\n * API Configuration Constants\n */\n\n/**\n * @deprecated Widget components should read via useApiClient() instead.\n * Kept only as a blank prefix because the API client already prepends the base URL.\n */\nexport const API_BASE_URL = '';\n\nexport const API_ENDPOINTS = {\n // Restaurant\n RESTAURANT: '/restaurant',\n RESTAURANT_DETAILS: (id: string) => `/restaurant/${id}`,\n RESTAURANT_CATERING: '/restaurant/catering/restaurants',\n\n // Corporate\n CORPORATE_WALLET_PAYMENT_INTENT: (orgId: string) =>\n `/corporate/organization/wallet/organization/wallet/catering-payment-intent/${orgId}`,\n\n // Image Upload\n IMAGE_UPLOAD: '/image-upload',\n IMAGE_UPLOAD_BATCH: '/image-upload/batch',\n IMAGE_DELETE: '/image-upload',\n\n // Catering Orders\n CATERING_ORDERS: '/catering-orders',\n CATERING_ORDER_RECEIPT: (orderId: string, restaurantId: string) =>\n `/catering-orders/${orderId}/restaurant/${restaurantId}/receipt-calc?style=MENU_ITEM`,\n\n // Catering Bundles\n CATERING_BUNDLE: (id: string) => `/catering-bundles/${id}`,\n CATERING_BUNDLES_CATERING: '/catering-bundles?type=catering',\n CATERING_BUNDLES_RESTAURANT: (restaurantId: string) => `/catering-bundles/restaurant/${restaurantId}`,\n\n // Categories\n CATEGORIES: '/categories',\n RESTAURANT_CATEGORIES: (id: string) => `/restaurant/${id}/categories`,\n} as const;\n\nexport const EXTERNAL_APIS = {\n GOOGLE_MAPS: (apiKey: string) =>\n `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`,\n} as const;\n","\"use client\";\n\nimport { useState, FormEvent, useEffect, useMemo, useRef } from \"react\";\nimport { useRouter, useSearchParams } from \"../shims/nextNavigation\";\nimport { useCateringState } from \"../state/CateringStateContext\";\nimport { useCateringConfig } from \"../config/CateringConfigContext\";\nimport { cateringService } from \"../shims/cateringService\";\nimport type { WidgetError } from \"../types/public\";\nimport { CateringPricingResult } from \"../types/pricing\";\nimport { ContactInfo } from \"../types/checkout\";\nimport AllMealSessionsItems from \"./AllMealSessionsItems\";\nimport {\n LocalMealSession,\n transformLocalSessionsToPdfData,\n} from \"../utils/menuPdfUtils\";\nimport { formatTimeDisplay } from \"./catering-order-helpers\";\nimport { pdf } from \"@react-pdf/renderer\";\nimport { ArrowDown, FileText } from \"lucide-react\";\nimport { CateringMenuPdf } from \"../pdf/CateringMenuPdf\";\nimport PdfDownloadModal from \"./modals/PdfDownloadModal\";\nimport HalkinVenueModal from \"./modals/HalkinVenueModal\";\nimport DeliveryAddressForm from \"./contact/DeliveryAddressForm\";\nimport ContactInfoForm from \"./contact/ContactInfoForm\";\nimport PromoCodeSection from \"./contact/PromoCodeSection\";\nimport PricingSummary from \"./contact/PricingSummary\";\nimport { fetchWithAuth } from \"../shims/fetchWithAuth\";\nimport { API_BASE_URL } from \"../constants/api\";\n\ninterface ValidationErrors {\n organization?: string;\n fullName?: string;\n email?: string;\n phone?: string;\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n zipcode?: string;\n ccEmail?: string;\n latitude?: number;\n longitude?: number;\n billingAddress?: {\n line1?: string;\n city?: string;\n postalCode?: string;\n };\n}\n\nexport default function CheckoutScreen() {\n const router = useRouter();\n const searchParams = useSearchParams();\n const topSectionRef = useRef<HTMLDivElement | null>(null);\n const orderDetailsRef = useRef<HTMLDivElement | null>(null);\n const {\n contactInfo,\n setContactInfo,\n setCurrentStep,\n eventDetails,\n mealSessions,\n getAllItems,\n resetOrder,\n markOrderAsSubmitted,\n corporateUser,\n updateMealSession,\n restaurantDiscounts,\n } = useCateringState();\n const { onError, onOrderComplete } = useCateringConfig();\n void restaurantDiscounts;\n\n // Get all items from all sessions for pricing calculations\n const selectedItems = getAllItems();\n\n const [formData, setFormData] = useState<ContactInfo>({\n organization: contactInfo?.organization || \"\",\n fullName: contactInfo?.fullName || \"\",\n email: contactInfo?.email || \"\",\n phone: contactInfo?.phone || \"\",\n addressLine1: contactInfo?.addressLine1 || \"\",\n addressLine2: contactInfo?.addressLine2 || \"\",\n city: contactInfo?.city || \"\",\n zipcode: contactInfo?.zipcode || \"\",\n latitude: contactInfo?.latitude,\n longitude: contactInfo?.longitude,\n billingAddress: contactInfo?.billingAddress,\n });\n const [submitting, setSubmitting] = useState(false);\n const [success, setSuccess] = useState(false);\n const [promoCodes, setPromoCodes] = useState<string[]>([]);\n const [validatingPromo, setValidatingPromo] = useState(false);\n const [promoError, setPromoError] = useState(\"\");\n const [promoSuccess, setPromoSuccess] = useState(\"\");\n const [pricing, setPricing] = useState<CateringPricingResult | null>(null);\n const [calculatingPricing, setCalculatingPricing] = useState(false);\n\n const [ccEmails, setCcEmails] = useState<string[]>([]);\n const [errors, setErrors] = useState<ValidationErrors>({});\n const [termsAccepted, setTermsAccepted] = useState(false);\n\n const [showPaymentModal, setShowPaymentModal] = useState(false);\n const [corporateUserId, setCorporateUserId] = useState<string>(\"\");\n const [organizationId, setOrganizationId] = useState<string>(\"\");\n const [specialInstructions, setSpecialInstructions] = useState<string>(\"\");\n const [showBackToTopButton, setShowBackToTopButton] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<\n \"wallet\" | \"card\" | null\n >(null);\n\n const [importantNotesOpen, setImportantNotesOpen] = useState(false);\n const [selectedPlaceId, setSelectedPlaceId] = useState<string | null>(null);\n\n // Event integration state\n const [eventId, setEventId] = useState<string | null>(null);\n const [loadingEventData, setLoadingEventData] = useState(false);\n\n // PDF generation state\n const [generatingPdf, setGeneratingPdf] = useState(false);\n const [showHalkinModal, setShowHalkinModal] = useState(false);\n const [showPdfModal, setShowPdfModal] = useState(false);\n\n // Calculate estimated total without triggering state updates\n const estimatedTotal = useMemo(() => {\n return selectedItems.reduce((total, { item, quantity }) => {\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(item.discountPrice?.toString() || \"0\");\n const unitPrice =\n item.isDiscount && discountPrice > 0 ? discountPrice : price;\n\n // Addon total = sum of (addonPrice × addonQuantity) - no scaling multipliers\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum, { price, quantity }) => {\n return sum + (price || 0) * (quantity || 0);\n },\n 0,\n );\n\n return total + unitPrice * quantity + addonTotal;\n }, 0);\n }, [selectedItems]);\n\n const validateEmail = (email: string): string | undefined => {\n if (!email.trim()) {\n return \"Email is required\";\n }\n\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n return \"Please enter a valid email address\";\n }\n return undefined;\n };\n\n const checkCorporateUser = async () => {\n try {\n if (eventDetails?.userType === \"corporate\") {\n if (corporateUser) {\n setCorporateUserId(corporateUser.id);\n setOrganizationId(corporateUser.organizationId);\n }\n return true;\n }\n return false;\n } catch (error) {\n console.error(error);\n return false;\n }\n };\n\n const validatePhone = (phone: string): string | undefined => {\n if (!phone.trim()) {\n return \"Phone number is required\";\n }\n // Strip spaces, dashes, parentheses, and leading +\n let cleanPhone = phone.replace(/[\\s()\\-+]/g, \"\");\n // Normalise UK international prefix: +44 / 0044 → leading 0\n if (cleanPhone.startsWith(\"440\")) {\n cleanPhone = \"0\" + cleanPhone.slice(2);\n } else if (cleanPhone.startsWith(\"44\") && cleanPhone.length === 12) {\n cleanPhone = \"0\" + cleanPhone.slice(2);\n }\n if (cleanPhone.length < 10 || cleanPhone.length > 11) {\n return \"Please enter a valid UK phone number\";\n }\n return undefined;\n };\n const validateFullName = (name: string): string | undefined => {\n if (!name.trim()) {\n return \"Full name is required\";\n }\n if (name.trim().length < 2) {\n return \"Name must be at least 2 characters\";\n }\n return undefined;\n };\n\n const handleBlur = (field: keyof ContactInfo) => {\n let error: string | undefined;\n\n switch (field) {\n case \"fullName\":\n error = validateFullName(formData.fullName);\n break;\n case \"email\":\n error = validateEmail(formData.email);\n break;\n case \"phone\":\n error = validatePhone(formData.phone);\n break;\n }\n\n setErrors((prev) => ({\n ...prev,\n [field]: error,\n }));\n };\n\n const handleBillingBlur = (\n field: keyof NonNullable<ContactInfo[\"billingAddress\"]>,\n ) => {\n // Only validate if user has started filling in billing address\n if (!hasBillingAddressData()) return;\n\n const billing = formData.billingAddress;\n let error: string | undefined;\n\n switch (field) {\n case \"line1\":\n if (!billing?.line1?.trim()) {\n error = \"Address line 1 is required\";\n }\n break;\n case \"city\":\n if (!billing?.city?.trim()) {\n error = \"City is required\";\n }\n break;\n case \"postalCode\":\n if (!billing?.postalCode?.trim()) {\n error = \"Postcode is required\";\n } else if (!validateUKPostcode(billing.postalCode)) {\n error = \"Please enter a valid UK postcode (e.g., SW1A 1AA)\";\n }\n break;\n }\n\n setErrors((prev) => ({\n ...prev,\n billingAddress: {\n ...prev.billingAddress,\n [field]: error,\n },\n }));\n };\n\n // Clear error when user starts typing\n const handleChange = (\n field: keyof ContactInfo,\n value: string | ContactInfo[\"billingAddress\"],\n ) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n if (field in errors) {\n setErrors((prev) => ({ ...prev, [field]: undefined }));\n }\n };\n\n // UK Postcode validation regex\n const UK_POSTCODE_REGEX = /^([A-Z]{1,2}\\d{1,2}[A-Z]?)\\s?(\\d[A-Z]{2})$/i;\n\n const validateUKPostcode = (postcode: string): boolean => {\n if (!postcode) return false;\n return UK_POSTCODE_REGEX.test(postcode.trim());\n };\n\n // Check if billing address has any data entered\n const hasBillingAddressData = (): boolean => {\n const billing = formData.billingAddress;\n if (!billing) return false;\n return !!(\n billing.line1?.trim() ||\n billing.city?.trim() ||\n billing.postalCode?.trim()\n );\n };\n\n // Validate billing address fields - only required if user has started filling it in\n const validateBillingAddress = (): ValidationErrors[\"billingAddress\"] => {\n // Skip validation if user hasn't entered any billing data\n if (!hasBillingAddressData()) return undefined;\n\n const billing = formData.billingAddress;\n const billingErrors: ValidationErrors[\"billingAddress\"] = {};\n\n if (!billing?.line1?.trim()) {\n billingErrors.line1 = \"Address line 1 is required\";\n }\n if (!billing?.city?.trim()) {\n billingErrors.city = \"City is required\";\n }\n if (!billing?.postalCode?.trim()) {\n billingErrors.postalCode = \"Postcode is required\";\n } else if (!validateUKPostcode(billing.postalCode)) {\n billingErrors.postalCode =\n \"Please enter a valid UK postcode (e.g., SW1A 1AA)\";\n }\n\n // Return undefined if no errors, otherwise return the errors object\n return Object.keys(billingErrors).length > 0 ? billingErrors : undefined;\n };\n\n // Validate all fields\n const validateForm = (): boolean => {\n const newErrors: ValidationErrors = {\n fullName: validateFullName(formData.fullName),\n email: validateEmail(formData.email),\n phone: validatePhone(formData.phone),\n };\n\n // Validate address fields for guest users\n if (eventDetails?.userType === \"guest\") {\n if (!formData.addressLine1?.trim()) {\n newErrors.addressLine1 = \"Address Line 1 is required\";\n }\n if (!formData.city?.trim()) {\n newErrors.city = \"City is required\";\n }\n if (!formData.zipcode?.trim()) {\n newErrors.zipcode = \"Postcode is required\";\n } else if (!validateUKPostcode(formData.zipcode)) {\n newErrors.zipcode = \"Please enter a valid UK postcode (e.g., SW1A 1AA)\";\n }\n\n // Validate that latitude and longitude are present (ensures Google autocomplete selection)\n if (!formData.latitude || !formData.longitude) {\n newErrors.addressLine1 =\n \"Please select an address from the Google autocomplete dropdown\";\n }\n }\n\n // Validate billing address if user has entered any data\n newErrors.billingAddress = validateBillingAddress();\n\n setErrors(newErrors);\n\n // Return true if no errors (check billingAddress separately as it's an object)\n const hasBasicErrors = Object.entries(newErrors)\n .filter(([key]) => key !== \"billingAddress\")\n .some(([, error]) => error !== undefined);\n const hasBillingErrors = newErrors.billingAddress !== undefined;\n\n return !hasBasicErrors && !hasBillingErrors;\n };\n\n const handleAddCcEmail = (email: string) => {\n setCcEmails([...ccEmails, email]);\n };\n\n const handleRemoveCcEmail = (emailToRemove: string) => {\n setCcEmails(ccEmails.filter((email) => email !== emailToRemove));\n };\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if (!termsAccepted) {\n alert(\"Please accept the Terms and Conditions to continue\");\n return;\n }\n\n if (!validateForm()) {\n // Scroll to first error - improved version\n setTimeout(() => {\n const firstErrorField = Object.keys(errors).find(\n (key) => errors[key as keyof ValidationErrors],\n );\n\n if (firstErrorField) {\n // Try multiple selectors\n const element =\n document.querySelector(`[name=\"${firstErrorField}\"]`) ||\n document.getElementById(firstErrorField) ||\n document.querySelector(`input[name=\"${firstErrorField}\"]`);\n\n if (element) {\n element.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n });\n // Focus the input to draw attention\n (element as HTMLInputElement).focus();\n } else {\n // Fallback: scroll to top of form\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }\n }\n }, 100); // Small delay to ensure errors are rendered\n\n return;\n }\n\n // setSubmitting(true);\n\n const isCorporate = await checkCorporateUser();\n if (isCorporate) {\n // Show payment modal for corporate users\n setShowPaymentModal(true);\n return;\n }\n\n await submitOrder();\n };\n\n const submitOrder = async (paymentInfo?: {\n useOrganizationWallet?: boolean;\n paymentMethodId?: string;\n paymentIntentId?: string;\n }) => {\n setSubmitting(true);\n\n try {\n if (!pricing) {\n console.error(\"ERROR: Pricing not available\");\n alert(\"Please wait for pricing calculation to complete\");\n setSubmitting(false);\n return;\n }\n\n setContactInfo(formData);\n\n const paymentData = paymentInfo\n ? {\n corporateUserId,\n organizationId,\n ...paymentInfo,\n }\n : undefined;\n\n const createCateringOrderResponse =\n await cateringService.submitCateringOrder(\n eventDetails!,\n mealSessions,\n formData,\n promoCodes,\n ccEmails,\n paymentData,\n eventId || undefined,\n specialInstructions,\n );\n\n markOrderAsSubmitted();\n setShowPaymentModal(false);\n\n const orderId = (createCateringOrderResponse as any)?.id ?? \"\";\n const accessToken =\n createCateringOrderResponse?.sharedAccessUsers?.[0]?.accessToken ?? \"\";\n\n onOrderComplete?.({\n orderId,\n accessToken,\n summary: {\n eventDate: eventDetails?.eventDate ?? \"\",\n total: pricing?.total ?? 0,\n currency: \"GBP\",\n itemCount: mealSessions.reduce(\n (n, s) => n + s.orderItems.reduce((m, i) => m + i.quantity, 0),\n 0,\n ),\n restaurants: Array.from(\n new Map(\n mealSessions\n .flatMap((s) => s.orderItems)\n .map((oi) => [\n oi.item.restaurantId,\n {\n id: oi.item.restaurantId,\n name: (oi.item as any).restaurantName ?? \"\",\n },\n ]),\n ).values(),\n ),\n deliveryAddress: {\n line1: formData.addressLine1 ?? \"\",\n city: formData.city ?? \"\",\n postcode: formData.zipcode ?? \"\",\n },\n contactEmail: formData.email ?? \"\",\n mealSessions: mealSessions.map((s) => ({\n sessionName: s.sessionName,\n sessionDate: s.sessionDate,\n eventTime: s.eventTime,\n orderItems: s.orderItems.map((oi) => ({\n id: oi.item.id,\n name: oi.item.menuItemName,\n quantity: oi.quantity,\n unitPrice: parseFloat(\n (oi.item.price as any)?.toString() || \"0\",\n ),\n selectedAddons: (oi.item as any).selectedAddons,\n })),\n })),\n },\n });\n\n setSuccess(true);\n } catch (error: any) {\n console.error(\"=== SUBMIT ORDER ERROR ===\");\n console.error(\"Error Type:\", error?.name);\n console.error(\"Error Message:\", error?.message);\n console.error(\"Error Stack:\", error?.stack);\n console.error(\"Full Error Object:\", JSON.stringify(error, null, 2));\n\n const widgetErr: WidgetError =\n error && typeof error === \"object\" && \"code\" in error\n ? (error as WidgetError)\n : {\n code: \"submit_failed\",\n message: error?.message ?? \"Order submission failed\",\n cause: error,\n };\n onError?.(widgetErr);\n\n // Handle London delivery validation error - show inline instead of alert\n if (error?.message?.includes(\"London\")) {\n setErrors((prev) => ({\n ...prev,\n addressLine1: error.message,\n }));\n setShowPaymentModal(false);\n console.error(\"=== END ERROR LOG ===\");\n return;\n }\n\n // Check if it's a network error\n if (\n error?.message?.includes(\"fetch\") ||\n error?.message?.includes(\"network\")\n ) {\n console.error(\"Network Error Detected\");\n alert(\n \"Network error: Please check your internet connection and try again.\",\n );\n }\n // Check if it's an API error with response\n else if (error?.response) {\n console.error(\n \"API Response Error:\",\n JSON.stringify(error.response, null, 2),\n );\n console.error(\"Status Code:\", error.response.status);\n console.error(\"Status Text:\", error.response.statusText);\n console.error(\n \"Response Data:\",\n JSON.stringify(error.response.data, null, 2),\n );\n alert(\n `Failed to submit order: ${error.response.data?.message ||\n error.response.statusText ||\n \"Unknown error\"\n }`,\n );\n }\n // Generic error\n else {\n console.error(\"Unknown Error Type\");\n alert(\n `Failed to submit order: ${error?.message || \"Please try again.\"}`,\n );\n }\n\n console.error(\"=== END ERROR LOG ===\");\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleWalletPayment = async () => {\n // Validation\n if (!organizationId || !corporateUserId) {\n console.error(\"ERROR: Missing organization or user information\");\n console.error(\"- Organization ID:\", organizationId);\n console.error(\"- Corporate User ID:\", corporateUserId);\n alert(\n \"Missing organization or user information. Please try logging in again.\",\n );\n return;\n }\n\n if (!pricing || !pricing.total) {\n console.error(\"ERROR: Pricing information not available\");\n console.error(\"Pricing:\", pricing);\n alert(\"Pricing information not available. Please refresh and try again.\");\n return;\n }\n\n try {\n await submitOrder({ useOrganizationWallet: true });\n } catch (error: any) {\n console.error(\"=== WALLET PAYMENT ERROR ===\");\n console.error(\"Error:\", error);\n console.error(\"Error Message:\", error?.message);\n console.error(\"Error Stack:\", error?.stack);\n console.error(\"=== END WALLET PAYMENT ERROR ===\");\n // Error is already handled in submitOrder\n }\n };\n\n const handleCardPaymentComplete = async (\n paymentMethodId: string,\n paymentIntentId: string,\n ) => {\n // Validation\n if (!paymentMethodId || !paymentIntentId) {\n console.error(\"ERROR: Missing payment information\");\n console.error(\"- Payment Method ID:\", paymentMethodId);\n console.error(\"- Payment Intent ID:\", paymentIntentId);\n alert(\"Payment information missing. Please try again.\");\n return;\n }\n\n try {\n await submitOrder({ paymentMethodId, paymentIntentId });\n } catch (error: any) {\n console.error(\"=== CARD PAYMENT ERROR ===\");\n console.error(\"Error:\", error);\n console.error(\"Error Message:\", error?.message);\n console.error(\"Error Stack:\", error?.stack);\n console.error(\"=== END CARD PAYMENT ERROR ===\");\n // Error is already handled in submitOrder\n }\n };\n\n const calculatePricing = async () => {\n setCalculatingPricing(true);\n try {\n const deliveryLocation =\n formData.latitude && formData.longitude\n ? { latitude: formData.latitude, longitude: formData.longitude }\n : undefined;\n\n const pricingResult =\n await cateringService.calculateCateringPricingWithMealSessions(\n mealSessions,\n promoCodes,\n deliveryLocation,\n );\n\n if (!pricingResult.isValid) {\n // Show London delivery error inline\n if (pricingResult.error?.includes(\"London\")) {\n setErrors((prev) => ({ ...prev, addressLine1: pricingResult.error }));\n }\n setPricing(null);\n return;\n }\n\n // Clear any previous London error on successful pricing\n if (errors.addressLine1?.includes(\"London\")) {\n setErrors((prev) => ({ ...prev, addressLine1: undefined }));\n }\n setPricing(pricingResult);\n\n // If promo codes are applied but resulted in no discount, warn the user\n if (promoCodes.length > 0) {\n const hasDiscount = (pricingResult.promoDiscount ?? 0) > 0;\n if (!hasDiscount) {\n setPromoSuccess(\"\");\n setPromoError(\"Promo code may not apply to current items\");\n } else {\n // Clear stale error if discount is now valid\n setPromoError((prev) => prev === \"Promo code may not apply to current items\" ? \"\" : prev);\n }\n }\n } catch (error: any) {\n console.error(\"Error calculating pricing:\", error);\n setPricing(null);\n } finally {\n setCalculatingPricing(false);\n }\n };\n\n // Scroll to top when component mounts\n useEffect(() => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }, []);\n\n // Update form data when contactInfo changes (e.g., after corporate login)\n useEffect(() => {\n if (contactInfo) {\n setFormData({\n organization: contactInfo.organization || \"\",\n fullName: contactInfo.fullName || \"\",\n email: contactInfo.email || \"\",\n phone: contactInfo.phone || \"\",\n addressLine1: contactInfo.addressLine1 || \"\",\n addressLine2: contactInfo.addressLine2 || \"\",\n city: contactInfo.city || \"\",\n zipcode: contactInfo.zipcode || \"\",\n latitude: contactInfo.latitude,\n longitude: contactInfo.longitude,\n billingAddress: contactInfo.billingAddress,\n });\n }\n }, [contactInfo]);\n\n // Fetch event details if eventId is provided in URL\n useEffect(() => {\n const eventIdParam = searchParams.get(\"eventId\");\n if (eventIdParam && !loadingEventData) {\n setEventId(eventIdParam);\n setLoadingEventData(true);\n\n // Fetch event details from the API\n fetchWithAuth(`${API_BASE_URL}/events/${eventIdParam}`)\n .then(async (response) => {\n if (response.ok) {\n const eventData = await response.json();\n\n // Prefill form with event address and owner details\n if (eventData.address) {\n const addressUpdates: Partial<ContactInfo> = {};\n\n if (eventData.address.addressLine1) {\n addressUpdates.addressLine1 = eventData.address.addressLine1;\n }\n if (eventData.address.addressLine2) {\n addressUpdates.addressLine2 = eventData.address.addressLine2;\n }\n if (eventData.address.city) {\n addressUpdates.city = eventData.address.city;\n }\n if (eventData.address.zipcode) {\n addressUpdates.zipcode = eventData.address.zipcode;\n }\n if (\n eventData.address.location?.latitude &&\n eventData.address.location?.longitude\n ) {\n addressUpdates.latitude = eventData.address.location.latitude;\n addressUpdates.longitude = eventData.address.location.longitude;\n }\n\n setFormData((prev) => ({ ...prev, ...addressUpdates }));\n }\n\n // Prefill owner information\n if (eventData.owner) {\n const ownerUpdates: Partial<ContactInfo> = {};\n\n if (eventData.owner.organizationName) {\n ownerUpdates.organization = eventData.owner.organizationName;\n }\n if (eventData.owner.user) {\n if (eventData.owner.user.email) {\n ownerUpdates.email = eventData.owner.user.email;\n }\n if (eventData.owner.user.username) {\n ownerUpdates.fullName = eventData.owner.user.username;\n }\n }\n\n setFormData((prev) => ({ ...prev, ...ownerUpdates }));\n }\n\n // Prefill first meal session date with event start date\n if (\n eventData.startDateTime &&\n mealSessions.length > 0 &&\n !mealSessions[0].sessionDate\n ) {\n const eventStartDate = new Date(eventData.startDateTime);\n const sessionDate = eventStartDate.toISOString().split(\"T\")[0]; // YYYY-MM-DD format\n\n // Also extract time from startDateTime (HH:MM format)\n const hours = eventStartDate.getHours();\n const minutes = eventStartDate.getMinutes();\n const eventTime = `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}`;\n\n updateMealSession(0, {\n sessionDate,\n eventTime,\n });\n }\n }\n })\n .catch((error) => {\n console.error(\"Failed to fetch event details:\", error);\n })\n .finally(() => {\n setLoadingEventData(false);\n });\n }\n }, [searchParams, loadingEventData, mealSessions, updateMealSession]);\n\n useEffect(() => {\n calculatePricing();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [promoCodes, mealSessions, formData.latitude, formData.longitude]);\n\n const handleApplyPromoCode = async (code: string) => {\n setValidatingPromo(true);\n setPromoError(\"\");\n setPromoSuccess(\"\");\n\n try {\n // Use meal sessions format for promo validation\n const validation =\n await cateringService.validatePromoCodeWithMealSessions(\n code,\n mealSessions,\n );\n\n if (validation.valid) {\n if (!promoCodes.includes(code)) {\n setPromoCodes([...promoCodes, code]);\n setPromoSuccess(`Promo code \"${code}\" applied!`);\n } else {\n setPromoError(\"This promo code has already been applied\");\n }\n } else {\n setPromoError(validation.reason || \"Invalid promo code\");\n }\n } catch (error) {\n console.error(\"Promo validation error:\", error);\n setPromoError(\"Failed to validate promo code\");\n } finally {\n setValidatingPromo(false);\n }\n };\n\n const handleRemovePromoCode = (codeToRemove: string) => {\n const updatedCodes = promoCodes.filter((code) => code !== codeToRemove);\n setPromoCodes(updatedCodes);\n setPromoSuccess(\"\");\n setPromoError(\"\");\n // The useEffect will automatically trigger calculatePricing when promoCodes changes\n };\n\n const handlePlaceSelect = (place: google.maps.places.PlaceResult) => {\n if (!place || !place.address_components) {\n console.error(\"No place data received\");\n return;\n }\n\n // Store place_id for validation\n if (place.place_id) {\n setSelectedPlaceId(place.place_id);\n }\n\n let addressLine1 = \"\";\n let city = \"\";\n let zipcode = \"\";\n let country = \"\";\n const latitude = place.geometry?.location?.lat() || 0;\n const longitude = place.geometry?.location?.lng() || 0;\n\n place.address_components.forEach((component) => {\n const types = component.types;\n\n if (types.includes(\"street_number\")) {\n addressLine1 = component.long_name + \" \";\n }\n if (types.includes(\"route\")) {\n addressLine1 += component.long_name;\n }\n if (types.includes(\"postal_town\") || types.includes(\"locality\")) {\n city = component.long_name;\n }\n if (types.includes(\"postal_code\")) {\n zipcode = component.long_name;\n }\n if (types.includes(\"country\")) {\n country = component.short_name;\n }\n });\n\n // Validate if address is in UK\n if (country && country !== \"GB\") {\n setErrors((prev) => ({\n ...prev,\n addressLine1:\n \"Sorry, we only deliver to addresses within the United Kingdom.\",\n }));\n } else {\n // Clear client-side address errors only (not server-side London validation errors)\n // The London error will be set/cleared by calculatePricing based on API response\n setErrors((prev) => ({\n ...prev,\n addressLine1: prev.addressLine1?.includes(\"London\")\n ? prev.addressLine1\n : undefined,\n city: undefined,\n zipcode: undefined,\n }));\n }\n\n setFormData((prev) => ({\n ...prev,\n addressLine1: addressLine1.trim(),\n city,\n zipcode,\n latitude,\n longitude,\n }));\n\n setContactInfo({\n ...formData,\n addressLine1: addressLine1.trim(),\n city,\n zipcode,\n latitude,\n longitude,\n });\n\n const placeText = `${place.name || \"\"} ${place.formatted_address || \"\"}`;\n if (/halkin\\s*-/i.test(placeText)) {\n setShowHalkinModal(true);\n }\n };\n\n const handleClearAddress = () => {\n setSelectedPlaceId(null);\n setFormData((prev) => ({\n ...prev,\n addressLine1: \"\",\n city: \"\",\n zipcode: \"\",\n latitude: undefined,\n longitude: undefined,\n }));\n // Clear any address-related errors\n setErrors((prev) => ({\n ...prev,\n addressLine1: undefined,\n city: undefined,\n zipcode: undefined,\n }));\n };\n\n // Handle view menu - opens modal to choose with/without prices\n const handleViewMenu = () => {\n setShowPdfModal(true);\n };\n\n // Handle PDF download with selected price option\n const handlePdfDownload = async (withPrices: boolean) => {\n if (generatingPdf) return;\n setGeneratingPdf(true);\n try {\n const hasDeliveryQuote =\n typeof formData.latitude === \"number\" &&\n typeof formData.longitude === \"number\";\n const pricingMealSessions = (pricing as any)?.mealSessions as\n | Array<{ deliveryFee?: number }>\n | undefined;\n // The API only sends non-empty sessions, so pricingMealSessions[i] corresponds\n // to the i-th non-empty local session. Build a local-index → deliveryFee map.\n const deliveryFeeByLocalIndex = new Map<number, number | undefined>();\n let pricingSessionIndex = 0;\n mealSessions.forEach((session, localIndex) => {\n if (session.orderItems.length > 0) {\n deliveryFeeByLocalIndex.set(\n localIndex,\n pricingMealSessions?.[pricingSessionIndex]?.deliveryFee,\n );\n pricingSessionIndex++;\n }\n });\n\n // Convert mealSessions to LocalMealSession format\n const sessionsForPreview: LocalMealSession[] = mealSessions.map(\n (session, index) => ({\n sessionName: session.sessionName,\n sessionDate: session.sessionDate,\n eventTime: session.eventTime,\n deliveryFee: hasDeliveryQuote\n ? deliveryFeeByLocalIndex.get(index)\n : undefined,\n orderItems: session.orderItems.map((orderItem) => ({\n item: {\n id: orderItem.item.id,\n menuItemName: orderItem.item.menuItemName,\n price: orderItem.item.price,\n discountPrice: orderItem.item.discountPrice,\n isDiscount: orderItem.item.isDiscount,\n image: orderItem.item.image,\n restaurantId: orderItem.item.restaurantId,\n cateringQuantityUnit: orderItem.item.cateringQuantityUnit,\n feedsPerUnit: orderItem.item.feedsPerUnit,\n categoryName: orderItem.item.categoryName,\n subcategoryName: orderItem.item.subcategoryName,\n selectedAddons: orderItem.item.selectedAddons,\n description: (orderItem.item as any).description,\n allergens: (orderItem.item as any).allergens,\n dietaryFilters: (orderItem.item as any).dietaryFilters,\n },\n quantity: orderItem.quantity,\n })),\n }),\n );\n\n const restaurantNameById: Record<string, string> = {};\n for (const session of mealSessions) {\n for (const orderItem of session.orderItems) {\n const item = orderItem.item as any;\n if (item.restaurantId) {\n const name = item.restaurant?.restaurant_name || item.restaurantName;\n if (name) restaurantNameById[item.restaurantId] = name;\n }\n }\n }\n const pdfAppliedPromotions = (pricing?.appliedPromotions || []).map((p) => {\n const restaurantName = restaurantNameById[p.restaurantId];\n const label = restaurantName ? `${p.name} (${restaurantName})` : p.name;\n return { name: label, discountAmount: p.discount };\n }).filter((p) => p.discountAmount > 0);\n\n // Transform to PDF data format (now async to fetch images)\n // Use pricing deliveryFee when available, otherwise show as estimated.\n const pdfData = await transformLocalSessionsToPdfData(\n sessionsForPreview,\n withPrices,\n pricing?.deliveryFee || undefined,\n pricing?.promoDiscount || undefined,\n pdfAppliedPromotions.length > 0 ? pdfAppliedPromotions : undefined,\n );\n // Generate and download PDF\n const blob = await pdf(\n <CateringMenuPdf\n sessions={pdfData.sessions}\n showPrices={pdfData.showPrices}\n deliveryCharge={pdfData.deliveryCharge}\n promoDiscount={pdfData.promoDiscount}\n appliedPromotions={pdfData.appliedPromotions}\n totalPrice={pricing?.total ?? pdfData.totalPrice}\n logoUrl={pdfData.logoUrl}\n />,\n ).toBlob();\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = withPrices\n ? \"catering-menu-with-prices.pdf\"\n : \"catering-menu.pdf\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n setShowPdfModal(false);\n } catch (error) {\n console.error(\"Failed to generate PDF:\", error);\n alert(\"Failed to generate PDF. Please try again.\");\n } finally {\n setGeneratingPdf(false);\n }\n };\n\n const scrollToSection = (ref: { current: HTMLDivElement | null }) => {\n ref.current?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n };\n\n useEffect(() => {\n const updateBackToTopVisibility = () => {\n if (window.innerWidth >= 1024) {\n setShowBackToTopButton(false);\n return;\n }\n\n const menuTop = orderDetailsRef.current?.getBoundingClientRect().top;\n setShowBackToTopButton(menuTop !== undefined && menuTop <= 120);\n };\n\n updateBackToTopVisibility();\n window.addEventListener(\"scroll\", updateBackToTopVisibility, {\n passive: true,\n });\n window.addEventListener(\"resize\", updateBackToTopVisibility);\n\n return () => {\n window.removeEventListener(\"scroll\", updateBackToTopVisibility);\n window.removeEventListener(\"resize\", updateBackToTopVisibility);\n };\n }, []);\n\n if (success) {\n return (\n <div className=\"min-h-screen bg-base-100 py-8 px-4\">\n <div className=\"max-w-2xl mx-auto text-center\">\n <div className=\"mb-8\">\n <div className=\"w-20 h-20 bg-success/20 rounded-full flex items-center justify-center mx-auto mb-6\">\n <svg\n className=\"w-10 h-10 text-success\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h2 className=\"text-3xl md:text-4xl font-bold mb-3 text-base-content\">\n Thank you! Your event order request has been submitted.\n </h2>\n <p className=\"text-base-content/70 text-lg\">\n We'll get back to you within 24 hours via your preferred contact\n method. You will receive a payment link once the order is\n confirmed by the restaurants. Trusted by 90+ London university\n societies.\n </p>\n </div>\n\n <div className=\"bg-base-200/50 rounded-2xl p-6 md:p-8 mb-8 text-left border border-base-300\">\n <h3 className=\"text-xl font-bold mb-6 text-base-content\">\n Event & Order Summary\n </h3>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6 pb-6 border-b border-base-300\">\n <div>\n <p className=\"text-xs text-primary mb-1\">Event Date & Time</p>\n <p className=\"font-semibold text-base-content\">\n {eventDetails?.eventDate}\n </p>\n <p className=\"text-sm text-base-content/80\">\n {eventDetails?.eventTime\n ? formatTimeDisplay(eventDetails.eventTime)\n : null}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-primary mb-1\">Type of Event</p>\n <p className=\"font-semibold text-base-content capitalize\">\n {eventDetails?.eventType}\n </p>\n </div>\n {/* <div> */}\n {/* <p className=\"text-xs text-primary mb-1\">Guest Count</p>\n <p className=\"font-semibold text-base-content\">\n {(eventDetails?.guestCount || 10) - 10} -{\" \"}\n {(eventDetails?.guestCount || 10) + 10}{\" \"}\n </p>\n </div> */}\n </div>\n\n <h4 className=\"font-bold mb-4 text-base-content\">Your List</h4>\n\n {promoCodes.length > 0 && (\n <div className=\"mb-4 p-3 bg-success/10 border border-success/30 rounded-xl\">\n <p className=\"text-sm text-success font-medium\">\n ✓ Promo codes applied: {promoCodes.join(\", \")}\n </p>\n </div>\n )}\n\n <div className=\"space-y-3 mb-6\">\n {selectedItems.map(({ item, quantity }, index) => {\n const price = parseFloat(item.price?.toString() || \"0\");\n const discountPrice = parseFloat(\n item.discountPrice?.toString() || \"0\",\n );\n const itemPrice =\n item.isDiscount && discountPrice > 0 ? discountPrice : price;\n\n // USE ITEM'S OWN VALUES:\n const BACKEND_QUANTITY_UNIT = item.cateringQuantityUnit || 7;\n const displayFeeds = quantity / BACKEND_QUANTITY_UNIT;\n\n // Addon total = sum of (addonPrice × addonQuantity) - no scaling multipliers\n const addonTotal = (item.selectedAddons || []).reduce(\n (sum, { price, quantity }) => {\n return sum + (price || 0) * (quantity || 0);\n },\n 0,\n );\n\n const subtotal = itemPrice * quantity + addonTotal;\n\n return (\n <div\n key={index}\n className=\"flex items-center gap-3 p-3 bg-base-100 rounded-xl\"\n >\n {item.image && (\n <img\n src={item.image}\n alt={item.menuItemName}\n className=\"w-16 h-16 object-cover rounded-lg\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-base-content truncate\">\n {item.menuItemName}\n </p>\n {item.selectedAddons &&\n item.selectedAddons.length > 0 && (\n <p className=\"text-xs text-base-content/50 mb-1\">\n {item.selectedAddons.map((addon, idx) => (\n <span key={idx}>\n + {addon.name}\n {addon.quantity > 1 && ` (×${addon.quantity})`}\n {idx < item.selectedAddons!.length - 1\n ? \", \"\n : \"\"}\n </span>\n ))}\n </p>\n )}\n <p className=\"text-sm text-primary\">\n {displayFeeds} portions\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold text-primary\">\n £{subtotal.toFixed(2)}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n\n {pricing && (\n <div className=\"space-y-2 pt-4 border-t border-base-300\">\n {/* Subtotal */}\n <div className=\"flex justify-between text-sm text-base-content/70\">\n <span>Subtotal</span>\n <span>£{pricing.subtotal.toFixed(2)}</span>\n </div>\n\n {/* Restaurant Promotion Discount - FROM BACKEND */}\n {(pricing.promotionDiscount ?? 0) > 0 && (\n <div className=\"flex justify-between text-sm text-green-600 font-semibold\">\n <span>Restaurant Promotion</span>\n <span>\n -£{pricing.promotionDiscount!.toFixed(2)}\n </span>\n </div>\n )}\n\n {/* Delivery fee */}\n <div className=\"flex justify-between text-sm text-base-content/70\">\n <span>Delivery Cost</span>\n <span>£{pricing.deliveryFee}</span>\n </div>\n\n {/* Promo code discount */}\n {(pricing.promoDiscount ?? 0) > 2 && (\n <div className=\"flex justify-between text-sm text-success font-medium\">\n <span>Promo Code Discount</span>\n <span>-£{pricing.promoDiscount!.toFixed(2)}</span>\n </div>\n )}\n\n {/* Total - Now correct from backend */}\n <div className=\"flex justify-between text-lg font-bold text-base-content pt-3 border-t border-base-300\">\n <span>Total</span>\n <div className=\"text-right\">\n <p className=\"\">£{pricing.total.toFixed(2)}</p>\n {(pricing.totalDiscount ?? 0) > 0 && (\n <p className=\"text-xs line-through text-base-content/50\">\n £{(pricing.subtotal + pricing.deliveryFee).toFixed(2)}\n </p>\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <button\n onClick={resetOrder}\n className=\"bg-base-300 hover:opacity-90 text-base-content px-8 py-4 rounded-xl font-bold text-lg transition-all\"\n >\n Back to Home\n </button>\n <a\n href=\"https://www.instagram.com/swiftfood_uk?utm_source=ig_web_button_share_sheet&igsh=ZDNlZDc0MzIxNw==\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"bg-dark-pink hover:bg-base-content/10 text-white px-8 py-4 rounded-xl font-bold text-lg transition-all inline-block text-center\"\n >\n Follow us on Instagram\n </a>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-base-100\">\n {/* Progress Bar */}\n <div className=\"w-full bg-base-100 h-2\">\n <div\n className=\"h-2 transition-all duration-300\"\n style={{ width: \"100%\" }}\n ></div>\n </div>\n\n <div className=\"max-w-7xl mx-auto px-4 py-8 md:py-12\">\n {/* Header */}\n <div ref={topSectionRef} className=\"mb-8\">\n <div className=\"flex justify-between items-start mb-4\">\n <div>\n {/* <p className=\"text-sm text-primary mb-2\">\n Step 3 of 3 - Contact & Confirmation\n </p> */}\n <h2 className=\"text-3xl md:text-4xl font-bold mb-3 text-base-content\">\n Your Contact Details\n </h2>\n <p className=\"text-base-content/70\">\n Please provide your contact details so we can confirm your event\n order request.\n </p>\n </div>\n <button\n onClick={() => setCurrentStep(1)}\n className=\"text-primary hover:opacity-80 font-medium flex items-center gap-1\"\n >\n ← Back\n </button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-5 gap-6 lg:gap-8\">\n {/* Selected Items - Left Side */}\n <div\n ref={orderDetailsRef}\n className=\"lg:col-span-3 order-2 lg:order-1 pb-24 lg:pb-0\"\n >\n <AllMealSessionsItems\n showActions={false}\n onViewMenu={handleViewMenu}\n isGeneratingPdf={generatingPdf}\n />\n <div\n className={`lg:hidden fixed inset-x-4 bottom-4 z-30 transition-all duration-200 ${showBackToTopButton\n ? \"pointer-events-auto opacity-100 translate-y-0\"\n : \"pointer-events-none opacity-0 translate-y-4\"\n }`}\n >\n <button\n type=\"button\"\n onClick={() => scrollToSection(topSectionRef)}\n className=\"w-full rounded-2xl border border-base-300 bg-base-100/95 px-4 py-3 text-sm font-semibold text-base-content shadow-lg backdrop-blur transition-all hover:bg-base-100\"\n >\n Back to top\n </button>\n </div>\n </div>\n\n {/* Contact Form Card - Right Side */}\n <div className=\"lg:col-span-2 order-1 lg:order-2\">\n <button\n type=\"button\"\n onClick={() => scrollToSection(orderDetailsRef)}\n className=\"lg:hidden mb-4 flex w-full items-center justify-between rounded-2xl border border-base-300 bg-base-100/80 px-4 py-3 text-left shadow-sm transition-all hover:border-dark-pink/30 hover:bg-base-100\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-[10px] font-bold uppercase tracking-[0.18em] text-base-content/45\">\n Quick jump\n </span>\n <span className=\"mt-1 block text-sm font-semibold text-base-content\">\n Review order details\n </span>\n <span className=\"mt-0.5 block text-xs text-base-content/60\">\n Check the menu and quantities before submitting\n </span>\n </span>\n <span className=\"ml-4 flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-dark-pink/10 text-dark-pink\">\n <ArrowDown size={18} />\n </span>\n </button>\n\n <div className=\"bg-base-200/40 rounded-3xl p-4 md:p-8\">\n <h3 className=\"text-xl font-bold mb-8 flex items-center gap-3 text-base-content\">\n <span className=\"w-1.5 h-6 bg-dark-pink rounded-full\"></span>\n Contact & Delivery Details\n </h3>\n\n <form onSubmit={handleSubmit} className=\"space-y-10\">\n {/* Delivery Address Section - Only for guest users */}\n\n <DeliveryAddressForm\n formData={formData}\n errors={errors}\n onFieldChange={handleChange}\n onPlaceSelect={handlePlaceSelect}\n onClearAddress={handleClearAddress}\n hasValidAddress={\n selectedPlaceId !== null && formData.addressLine1 !== \"\"\n }\n />\n\n {/* Contact Details Section */}\n <ContactInfoForm\n formData={formData}\n errors={errors}\n onFieldChange={handleChange}\n onBlur={handleBlur}\n onBillingBlur={handleBillingBlur}\n ccEmails={ccEmails}\n onAddCcEmail={handleAddCcEmail}\n onRemoveCcEmail={handleRemoveCcEmail}\n />\n\n {/* Promo Code Section */}\n <PromoCodeSection\n promoCodes={promoCodes}\n onApplyPromoCode={handleApplyPromoCode}\n onRemovePromoCode={handleRemovePromoCode}\n validatingPromo={validatingPromo}\n promoError={promoError}\n promoSuccess={promoSuccess}\n promoDiscount={pricing?.promoDiscount}\n />\n\n {/* Special Instructions */}\n <div className=\"-mt-4 pt-2\">\n <div className=\"flex items-center gap-2 mb-4\">\n <div className=\"w-8 h-8 rounded-lg bg-gray-200 border border-gray-300 flex items-center justify-center text-base-content/70\">\n <FileText size={18} />\n </div>\n <h4 className=\"font-bold text-sm text-base-content\">\n Special Instructions\n </h4>\n <span className=\"text-[9px] font-bold text-base-content/40 uppercase tracking-widest ml-2\">\n (Optional)\n </span>\n </div>\n <textarea\n id=\"specialInstructions\"\n name=\"specialInstructions\"\n value={specialInstructions}\n onChange={(e) => setSpecialInstructions(e.target.value)}\n placeholder=\"Any special requests or instructions for your order...\"\n className=\"w-full bg-gray-50 border border-base-300 rounded-xl px-4 py-3 text-sm text-base-content placeholder:text-base-content/50 focus:outline-none focus:ring-2 focus:ring-dark-pink/20 focus:border-dark-pink transition-all min-h-[100px] resize-none\"\n />\n </div>\n\n {/* Pricing Summary */}\n <PricingSummary\n pricing={pricing}\n calculatingPricing={calculatingPricing}\n estimatedTotal={estimatedTotal}\n />\n\n {/* Important Notes */}\n <div>\n <div className=\"w-full bg-orange-50/50 border border-orange-200 rounded-xl p-4\">\n <button\n type=\"button\"\n className=\"w-full flex items-center justify-between focus:outline-none group\"\n onClick={() => setImportantNotesOpen((open) => !open)}\n aria-expanded={importantNotesOpen}\n aria-controls=\"important-notes-content\"\n >\n <span className=\"text-xs font-bold uppercase tracking-widest text-orange-700\">\n Important Notes\n </span>\n <span className=\"ml-2 text-orange-500 group-hover:underline flex items-center\">\n <svg\n className={`transition-transform duration-200 w-4 h-4 ${importantNotesOpen ? \"rotate-180\" : \"rotate-0\"\n }`}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </span>\n </button>\n {importantNotesOpen && (\n <div\n id=\"important-notes-content\"\n className=\"mt-3 text-xs text-base-content/80 leading-relaxed space-y-1\"\n >\n <p>\n For accurate allergen information, please contact\n stalls or restaurants directly.\n </p>\n <p>\n For any last-minute changes, please contact us at\n least two days before your event.\n </p>\n </div>\n )}\n </div>\n </div>\n\n {/* Terms and Conditions */}\n <div className=\"space-y-6 pt-2\">\n <div className=\"flex items-center gap-3 cursor-pointer group\">\n <input\n type=\"checkbox\"\n id=\"terms\"\n checked={termsAccepted}\n onChange={(e) => setTermsAccepted(e.target.checked)}\n className=\"h-5 w-5 shrink-0 cursor-pointer rounded border-base-300 bg-base-100 text-dark-pink focus:outline-none focus:ring-0 focus:ring-offset-0\"\n />\n <label\n htmlFor=\"terms\"\n className=\"text-[11px] text-base-content/70 leading-relaxed cursor-pointer\"\n >\n I accept the{\" \"}\n <a\n href=\"/terms\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-dark-pink hover:underline font-medium\"\n onClick={(e) => e.stopPropagation()}\n >\n Terms and Conditions\n </a>\n *\n </label>\n </div>\n </div>\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={submitting || !termsAccepted}\n className=\"w-full bg-dark-pink text-white py-4 rounded-2xl font-bold uppercase tracking-[0.2em] text-sm hover:opacity-90 transition-all disabled:bg-base-300 disabled:cursor-not-allowed disabled:tracking-[0.08em]\"\n >\n {submitting ? \"Submitting...\" : \"Submit Order\"}\n </button>\n </form>\n </div>\n </div>\n </div>\n {showHalkinModal && (\n <HalkinVenueModal onClose={() => setShowHalkinModal(false)} />\n )}\n\n {/* PDF Download Modal */}\n {showPdfModal && (\n <PdfDownloadModal\n onDownload={handlePdfDownload}\n onClose={() => setShowPdfModal(false)}\n isGenerating={generatingPdf}\n />\n )}\n\n {/* Payment Modal JSX */}\n {showPaymentModal && (\n <div className=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\">\n <div className=\"bg-base-100 rounded-2xl max-w-lg w-full max-h-[90vh] overflow-y-auto\">\n <div className=\"sticky top-0 bg-base-100 border-b border-base-300 px-6 py-4 flex items-center justify-between\">\n <h3 className=\"text-xl font-bold text-base-content\">\n Select Payment Method\n </h3>\n <button\n onClick={() => {\n setShowPaymentModal(false);\n setSelectedPaymentMethod(null);\n }}\n className=\"text-primary hover:text-base-content\"\n >\n <svg\n className=\"w-6 h-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"p-6 space-y-4\">\n <div className=\"bg-base-200/50 rounded-xl p-4 border border-base-300\">\n <p className=\"text-sm text-base-content/70 mb-2\">\n Order Total\n </p>\n <p className=\"text-2xl font-bold text-primary\">\n £{pricing?.total.toFixed(2)}\n </p>\n </div>\n\n {/* Payment Method Selection */}\n <div className=\"space-y-3\">\n <button\n onClick={() => setSelectedPaymentMethod(\"wallet\")}\n className={`w-full p-4 rounded-lg border-2 transition-all text-left ${selectedPaymentMethod === \"wallet\"\n ? \"border-primary bg-primary/10\"\n : \"border-base-300 hover:border-base-content/20\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-12 h-12 rounded-full bg-gradient-to-br from-green-400 to-green-600 flex items-center justify-center\">\n <svg\n className=\"w-6 h-6 text-white\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\"\n />\n </svg>\n </div>\n <div>\n <p className=\"font-semibold text-base-content\">\n Organization Wallet\n </p>\n <p className=\"text-sm text-primary\">\n Pay from your organization balance\n </p>\n </div>\n </div>\n {selectedPaymentMethod === \"wallet\" && (\n <div className=\"w-6 h-6 rounded-full bg-primary flex items-center justify-center\">\n <svg\n className=\"w-4 h-4 text-white\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n )}\n </div>\n </button>\n\n <button\n onClick={() => setSelectedPaymentMethod(\"card\")}\n className={`w-full p-4 rounded-lg border-2 transition-all text-left ${selectedPaymentMethod === \"card\"\n ? \"border-primary bg-primary/10\"\n : \"border-base-300 hover:border-base-content/20\"\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-12 h-12 rounded-full bg-gradient-to-br from-purple-400 to-purple-600 flex items-center justify-center\">\n <svg\n className=\"w-6 h-6 text-white\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\"\n />\n </svg>\n </div>\n <div>\n <p className=\"font-semibold text-base-content\">\n Credit/Debit Card\n </p>\n <p className=\"text-sm text-primary\">\n Pay securely with Stripe\n </p>\n </div>\n </div>\n {selectedPaymentMethod === \"card\" && (\n <div className=\"w-6 h-6 rounded-full bg-primary flex items-center justify-center\">\n <svg\n className=\"w-4 h-4 text-white\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n )}\n </div>\n </button>\n </div>\n\n {/* Card payment selector removed — widget does not handle payment. */}\n\n {/* Wallet Confirm Button - NO Stripe needed */}\n {selectedPaymentMethod === \"wallet\" && (\n <button\n onClick={handleWalletPayment}\n disabled={submitting}\n className=\"w-full bg-dark-pink hover:opacity-90 text-white py-4 rounded-xl font-bold text-lg transition-all disabled:bg-base-300 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {submitting ? (\n <>\n <div className=\"animate-spin rounded-full h-4 w-4 border-2 border-white border-t-transparent\" />\n Processing Payment...\n </>\n ) : (\n `Pay £${pricing?.total.toFixed(2)} from Wallet`\n )}\n </button>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Mobile Submit Button (Below Form) */}\n {/* <div className=\"lg:hidden mt-6\">\n <button\n type=\"submit\"\n disabled={submitting}\n onClick={handleSubmit}\n className=\"w-full bg-dark-pink hover:opacity-90 text-white py-4 rounded-full font-bold text-lg transition-all disabled:bg-base-300 disabled:cursor-not-allowed\"\n >\n {submitting ? 'Submitting...' : 'Submit'}\n </button>\n </div> */}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { EmptySessionWarningModalProps } from \"../types\";\n\nexport default function EmptySessionWarningModal({\n sessionName,\n onRemove,\n onAddItems,\n}: EmptySessionWarningModalProps) {\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[100] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-full bg-amber-100 flex items-center justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6 text-amber-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Empty Session</h3>\n <p className=\"text-sm text-gray-500\">{sessionName} has no items</p>\n </div>\n </div>\n <p className=\"text-gray-600 mb-6\">\n This session doesn&apos;t have any items. Would you like to add items\n or remove it?\n </p>\n <div className=\"flex gap-3\">\n <button\n onClick={onRemove}\n className=\"flex-1 px-4 py-3 border border-red-200 text-red-600 rounded-xl hover:bg-red-50 transition-colors font-medium\"\n >\n Remove Session\n </button>\n <button\n onClick={onAddItems}\n className=\"flex-1 px-4 py-3 bg-primary text-white rounded-xl hover:bg-primary/90 transition-colors font-medium\"\n >\n Add Items\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { X } from \"lucide-react\";\nimport { RemoveSessionConfirmModalProps } from \"../types\";\n\nexport default function RemoveSessionConfirmModal({\n sessionName,\n onConfirm,\n onCancel,\n}: RemoveSessionConfirmModalProps) {\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[100] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-full bg-red-100 flex items-center justify-center\">\n <X className=\"h-6 w-6 text-red-600\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Remove Session</h3>\n <p className=\"text-sm text-gray-500\">{sessionName}</p>\n </div>\n </div>\n <p className=\"text-gray-600 mb-6\">\n Are you sure you want to remove this session? This will delete all\n items in the session.\n </p>\n <div className=\"flex gap-3\">\n <button\n onClick={onCancel}\n className=\"flex-1 px-4 py-3 border border-base-300 text-gray-600 rounded-xl hover:bg-base-100 transition-colors font-medium\"\n >\n Cancel\n </button>\n <button\n onClick={onConfirm}\n className=\"flex-1 px-4 py-3 bg-red-500 text-white rounded-xl hover:bg-red-600 transition-colors font-medium\"\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { RestaurantMinOrderStatus } from \"../../utils/catering-min-order-validation\";\n\ninterface MinOrderModalProps {\n sessionName: string;\n validationStatus: RestaurantMinOrderStatus[];\n onClose: () => void;\n onNavigateToSection?: (restaurantId: string, section: string) => void;\n}\n\nexport default function MinOrderModal({\n sessionName,\n validationStatus,\n onClose,\n onNavigateToSection,\n}: MinOrderModalProps) {\n const unmetRequirements = validationStatus\n .filter((status) => !status.isValid)\n .flatMap((status) =>\n status.sections\n .filter((section) => !section.isMet)\n .map((section) => ({\n restaurantId: status.restaurantId,\n restaurantName: status.restaurantName,\n section: section.section,\n current: section.currentQuantity,\n required: section.minQuantity,\n needed: section.minQuantity - section.currentQuantity,\n }))\n );\n\n return (\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/40\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-white rounded-2xl shadow-xl max-w-md w-full overflow-hidden\">\n {/* Header */}\n <div className=\"px-6 pt-6 pb-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-shrink-0 w-10 h-10 rounded-full bg-amber-100 flex items-center justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 text-amber-600\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n Minimum Order Not Met\n </h3>\n <p className=\"text-sm text-gray-500 mt-0.5\">\n {sessionName} needs a few more items\n </p>\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"px-6 pb-4\">\n <p className=\"text-sm text-gray-600 mb-4\">\n Please add the following to continue:\n </p>\n <div className=\"space-y-3\">\n {unmetRequirements.map((req, idx) => (\n <button\n key={idx}\n onClick={() => onNavigateToSection?.(req.restaurantId, req.section)}\n className=\"w-full flex items-center justify-between p-3 bg-gray-50 rounded-xl hover:bg-gray-100 transition-colors text-left group\"\n >\n <div className=\"flex items-center gap-3\">\n <div>\n <p className=\"text-sm font-medium text-gray-900\">\n {req.section}\n </p>\n <p className=\"text-xs text-gray-500\">\n {req.restaurantName}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-right\">\n <p className=\"text-sm font-semibold text-amber-600\">\n +{req.needed} more\n </p>\n <p className=\"text-xs text-gray-400\">\n {req.current}/{req.required} added\n </p>\n </div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-gray-400 group-hover:text-primary transition-colors\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </div>\n </button>\n ))}\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 bg-gray-50 border-t border-gray-100\">\n <button\n onClick={onClose}\n className=\"w-full py-3 px-4 bg-primary text-white font-medium rounded-xl hover:bg-primary/90 transition-colors\"\n >\n Add More Items\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { MenuItem } from \"../../types/menu\";\nimport MenuItemModal from \"../MenuItemModal\";\nimport { ArrowLeftRight, ImageOff } from \"lucide-react\";\n\ninterface SwapItemModalProps {\n currentItem: MenuItem;\n currentQuantity: number;\n alternatives: MenuItem[];\n isOpen: boolean;\n onClose: () => void;\n onSwap: (newItem: MenuItem) => void;\n}\n\nexport default function SwapItemModal({\n currentItem,\n currentQuantity,\n alternatives,\n isOpen,\n onClose,\n onSwap,\n}: SwapItemModalProps) {\n const [selectedAlternative, setSelectedAlternative] = useState<MenuItem | null>(null);\n\n if (!isOpen) return null;\n\n if (selectedAlternative) {\n return (\n <MenuItemModal\n item={selectedAlternative}\n isOpen={true}\n onClose={() => setSelectedAlternative(null)}\n quantity={currentQuantity}\n forceAddMode={true}\n addButtonLabel=\"Confirm Swap\"\n onAddItem={(configuredItem) => {\n onSwap(configuredItem);\n setSelectedAlternative(null);\n }}\n />\n );\n }\n\n const filteredAlternatives = alternatives.filter(\n (alt) => alt.id !== currentItem.id\n );\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-end sm:items-center justify-center z-[100]\">\n <div className=\"bg-white w-full sm:max-w-lg sm:rounded-2xl rounded-t-2xl max-h-[80vh] flex flex-col\">\n <div className=\"p-4 border-b border-base-200 flex items-center justify-between\">\n <div>\n <h3 className=\"font-bold text-lg text-gray-900\">Swap Item</h3>\n <p className=\"text-sm text-gray-500 mt-0.5\">\n Replace <span className=\"font-medium text-gray-700\">{currentItem.menuItemName}</span>\n </p>\n </div>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-full hover:bg-base-200 transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n </button>\n </div>\n\n <div className=\"overflow-y-auto flex-1 p-4 space-y-2\">\n {filteredAlternatives.length === 0 ? (\n <div className=\"text-center py-8\">\n <ArrowLeftRight className=\"w-10 h-10 text-gray-300 mx-auto mb-2\" />\n <p className=\"text-gray-500\">No alternatives available for this item.</p>\n </div>\n ) : (\n filteredAlternatives.map((alt) => {\n const price = parseFloat(alt.price?.toString() || \"0\");\n const discountPrice = parseFloat(alt.discountPrice?.toString() || \"0\");\n const displayPrice = alt.isDiscount && discountPrice > 0 ? discountPrice : price;\n\n return (\n <button\n key={alt.id}\n onClick={() => setSelectedAlternative(alt)}\n className=\"w-full flex items-center gap-3 p-3 rounded-xl border border-base-200 hover:border-primary/40 hover:bg-primary/5 transition-all text-left\"\n >\n {alt.image ? (\n <img\n src={alt.image}\n alt={alt.menuItemName}\n className=\"w-14 h-14 rounded-lg object-cover flex-shrink-0\"\n />\n ) : (\n <div className=\"w-14 h-14 rounded-lg bg-gradient-to-br from-primary/10 to-primary/5 flex items-center justify-center flex-shrink-0\">\n <ImageOff className=\"w-5 h-5 text-primary/40\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-semibold text-gray-800 truncate\">{alt.menuItemName}</p>\n {alt.description && (\n <p className=\"text-xs text-gray-500 line-clamp-1 mt-0.5\">{alt.description}</p>\n )}\n </div>\n <div className=\"text-right flex-shrink-0\">\n <p className=\"font-bold text-primary\">£{displayPrice.toFixed(2)}</p>\n <p className=\"text-xs text-gray-400\">per unit</p>\n </div>\n </button>\n );\n })\n )}\n </div>\n\n <div className=\"p-4 border-t border-base-200\">\n <button\n onClick={onClose}\n className=\"w-full py-2.5 border border-base-300 text-gray-700 font-medium rounded-xl hover:bg-base-100 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\ninterface ValidationAlertModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n message: ReactNode;\n primaryAction?: { label: string; onClick: () => void };\n secondaryAction?: { label: string; onClick: () => void };\n}\n\nexport default function ValidationAlertModal({\n isOpen,\n onClose,\n title,\n message,\n primaryAction,\n secondaryAction,\n}: ValidationAlertModalProps) {\n if (!isOpen) return null;\n\n const hasActions = Boolean(primaryAction || secondaryAction);\n\n return (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[110] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl animate-in zoom-in-95 duration-200\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-full bg-amber-100 flex items-center justify-center flex-shrink-0\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6 text-amber-600\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n </div>\n <h3 className=\"text-lg font-bold text-gray-900\">{title}</h3>\n </div>\n\n <p className=\"text-gray-600 mb-6 text-sm\">{message}</p>\n\n {hasActions ? (\n <div className=\"flex flex-col gap-2\">\n {primaryAction && (\n <button\n onClick={primaryAction.onClick}\n className=\"w-full px-4 py-3 bg-primary text-white rounded-xl hover:bg-primary/90 transition-colors font-medium text-sm\"\n >\n {primaryAction.label}\n </button>\n )}\n {secondaryAction && (\n <button\n onClick={secondaryAction.onClick}\n className=\"w-full px-4 py-3 border border-base-300 text-gray-800 rounded-xl hover:bg-base-200 transition-colors font-medium text-sm\"\n >\n {secondaryAction.label}\n </button>\n )}\n <button\n onClick={onClose}\n className=\"w-full px-4 py-2 text-gray-500 hover:text-gray-700 transition-colors text-sm\"\n >\n Cancel\n </button>\n </div>\n ) : (\n <button\n onClick={onClose}\n className=\"w-full px-4 py-3 bg-primary text-white rounded-xl hover:bg-primary/90 transition-colors font-medium text-sm\"\n >\n Got it\n </button>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, useCallback, useMemo, RefObject } from \"react\";\nimport { TutorialStep } from \"../TutorialTooltip\";\nimport { TutorialPhase } from \"../types\";\nimport { MealSessionState } from \"../../types/session\";\n\nconst TUTORIAL_STORAGE_KEY = \"catering_tutorial_completed\";\n\ninterface TutorialRefs {\n addSessionNavButtonRef: RefObject<HTMLButtonElement | null>;\n firstSessionPillRef: RefObject<HTMLButtonElement | null>;\n categoriesRowRef: RefObject<HTMLDivElement | null>;\n restaurantListRef: RefObject<HTMLDivElement | null>;\n firstMenuItemRef: RefObject<HTMLDivElement | null>;\n resetRestaurantListRef: React.MutableRefObject<(() => void) | null>;\n // kept for DateSessionNav prop compatibility\n addDayNavButtonRef: RefObject<HTMLButtonElement | null>;\n backButtonRef: RefObject<HTMLButtonElement | null>;\n firstDayTabRef: RefObject<HTMLDivElement | null>;\n}\n\ninterface UseCateringTutorialOptions {\n mealSessions: MealSessionState[];\n refs: TutorialRefs;\n}\n\nexport function useCateringTutorial({\n mealSessions,\n refs,\n}: UseCateringTutorialOptions) {\n const [tutorialStep, setTutorialStep] = useState<number | null>(null);\n const [tutorialPhase, setTutorialPhase] = useState<TutorialPhase>(\"navigation\");\n\n useEffect(() => {\n const tutorialCompleted = localStorage.getItem(TUTORIAL_STORAGE_KEY);\n if (tutorialCompleted) {\n setTutorialPhase(\"completed\");\n setTutorialStep(null);\n } else if (\n mealSessions.length === 1 &&\n mealSessions[0].orderItems.length === 0\n ) {\n setTutorialPhase(\"navigation\");\n setTutorialStep(0);\n } else {\n setTutorialPhase(\"completed\");\n setTutorialStep(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const getTutorialSteps = useCallback((): TutorialStep[] => {\n switch (tutorialPhase) {\n case \"navigation\":\n return [\n {\n id: \"add-session-nav\",\n targetRef: refs.addSessionNavButtonRef,\n title: \"Add a Session\",\n description:\n \"Start by adding a meal session — set the date, time, and name for your catering delivery.\",\n position: \"bottom\",\n requiresClick: true,\n showSkip: true,\n },\n {\n id: \"session-pill\",\n targetRef: refs.firstSessionPillRef,\n title: \"Your Meal Session\",\n description:\n \"Click on a session pill to switch between sessions and view or build each meal's order.\",\n position: \"bottom\",\n showNext: true,\n showSkip: true,\n },\n ];\n\n case \"categories\":\n return [\n {\n id: \"categories\",\n targetRef: refs.categoriesRowRef,\n title: \"Browse Categories\",\n description:\n \"Browse food items by category. Click on a category to see the available options.\",\n position: \"bottom\",\n showNext: true,\n showSkip: true,\n highlightPadding: 12,\n highlightExtendBottom: 50,\n onBeforeShow: (onComplete) => {\n refs.resetRestaurantListRef.current?.();\n setTimeout(() => {\n const el = refs.categoriesRowRef.current;\n if (el) {\n const rect = el.getBoundingClientRect();\n if (rect.top < 72 || rect.top > window.innerHeight / 2) {\n window.scrollTo({ top: window.scrollY + rect.top - 72, behavior: \"instant\" });\n }\n }\n onComplete();\n }, 50);\n },\n },\n ];\n\n case \"restaurants\":\n return [\n {\n id: \"restaurants\",\n targetRef: refs.restaurantListRef,\n title: \"Choose a Restaurant\",\n description:\n \"Browse available restaurants for this session, then click into one to view its menu.\",\n position: \"bottom\",\n requiresClick: true,\n showSkip: true,\n highlightPadding: 12,\n highlightMinTop: 72,\n onBeforeShow: (onComplete) => {\n refs.resetRestaurantListRef.current?.();\n setTimeout(() => {\n const el = refs.restaurantListRef.current;\n if (el) {\n const rect = el.getBoundingClientRect();\n if (Math.abs(rect.top - 72) > 4) {\n window.scrollTo({ top: window.scrollY + rect.top - 72, behavior: \"instant\" });\n }\n }\n onComplete();\n }, 50);\n },\n },\n ];\n\n case \"menu_items\":\n return [\n {\n id: \"menu-item\",\n targetRef: refs.firstMenuItemRef,\n title: \"Add Items to Your Order\",\n description:\n \"Click a menu item card to view more details and add it to your order.\",\n position: \"top\",\n showNext: true,\n nextLabel: \"Finish Tutorial\",\n showSkip: false,\n highlightPadding: 8,\n highlightMinTop: 72,\n autoScroll: true,\n onBeforeShow: (onComplete) => {\n // Poll until menu items have loaded, then signal ready — updatePosition handles scrolling\n let attempts = 0;\n const waitForRef = () => {\n if (refs.firstMenuItemRef.current) { onComplete(); return; }\n if (attempts < 20) { attempts++; setTimeout(waitForRef, 150); }\n else onComplete();\n };\n waitForRef();\n },\n },\n ];\n\n default:\n return [];\n }\n }, [tutorialPhase, refs]);\n\n const currentTutorialStep = useMemo(() => {\n if (tutorialStep === null || tutorialPhase === \"completed\") return null;\n const steps = getTutorialSteps();\n return steps[tutorialStep] || null;\n }, [tutorialStep, tutorialPhase, getTutorialSteps]);\n\n const handleTutorialNext = useCallback(() => {\n // When user clicks \"Add Session\", hide tutorial completely until session is saved\n if (currentTutorialStep?.id === \"add-session-nav\") {\n setTutorialStep(null);\n return;\n }\n\n const steps = getTutorialSteps();\n const nextStep = (tutorialStep ?? 0) + 1;\n\n if (nextStep >= steps.length) {\n switch (tutorialPhase) {\n case \"navigation\":\n setTutorialPhase(\"categories\");\n setTutorialStep(0);\n break;\n case \"categories\":\n setTutorialPhase(\"restaurants\");\n setTutorialStep(0);\n break;\n case \"restaurants\":\n setTutorialPhase(\"menu_items\");\n setTutorialStep(0);\n break;\n case \"menu_items\":\n setTutorialPhase(\"completed\");\n setTutorialStep(null);\n localStorage.setItem(TUTORIAL_STORAGE_KEY, \"true\");\n break;\n default:\n break;\n }\n } else {\n setTutorialStep(nextStep);\n }\n }, [currentTutorialStep, tutorialStep, tutorialPhase, getTutorialSteps]);\n\n const handleSkipTutorial = useCallback(() => {\n setTutorialPhase(\"completed\");\n setTutorialStep(null);\n localStorage.setItem(TUTORIAL_STORAGE_KEY, \"true\");\n }, []);\n\n const triggerNavigationTutorial = useCallback(() => {\n setTimeout(() => {\n setTutorialPhase(\"navigation\");\n setTutorialStep(0);\n }, 500);\n }, []);\n\n // Advance past the \"add session\" step once a session is actually saved\n const triggerSessionCreated = useCallback(() => {\n setTimeout(() => {\n if (tutorialPhase === \"navigation\") {\n setTutorialStep(1);\n }\n }, 300);\n }, [tutorialPhase]);\n\n const resetTutorial = useCallback(() => {\n localStorage.removeItem(TUTORIAL_STORAGE_KEY);\n setTutorialPhase(\"navigation\");\n setTutorialStep(0);\n }, []);\n\n return {\n tutorialStep,\n tutorialPhase,\n currentTutorialStep,\n handleTutorialNext,\n handleSkipTutorial,\n triggerNavigationTutorial,\n triggerSessionCreated,\n resetTutorial,\n getTutorialSteps,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport {\n CategoryWithSubcategories,\n Subcategory,\n MenuItem,\n DietaryFilter,\n} from \"../../types/menu\";\nimport { Restaurant } from \"../../types/restaurant\";\nimport { categoryService } from \"../../shims/services\";\nimport { promotionsServices } from \"../../shims/services\";\nimport { API_BASE_URL, API_ENDPOINTS } from \"../../constants/api\";\nimport { fetchWithAuth } from \"../../shims/fetchWithAuth\";\nimport { mapToMenuItem } from \"../catering-order-helpers\";\nimport { useCateringState } from \"../../state/CateringStateContext\";\n\ninterface UseCateringDataOptions {\n expandedSessionIndex: number | null;\n}\n\nexport function useCateringData({ expandedSessionIndex }: UseCateringDataOptions) {\n const { setRestaurantPromotions } = useCateringState();\n\n // Category state\n const [categories, setCategories] = useState<CategoryWithSubcategories[]>([]);\n const [selectedCategory, setSelectedCategory] =\n useState<CategoryWithSubcategories | null>(null);\n const [selectedSubcategory, setSelectedSubcategory] =\n useState<Subcategory | null>(null);\n const [categoriesLoading, setCategoriesLoading] = useState(true);\n const [categoriesError, setCategoriesError] = useState<string | null>(null);\n\n // Menu items state\n const [menuItems, setMenuItems] = useState<MenuItem[]>([]);\n const [menuItemsLoading, setMenuItemsLoading] = useState(false);\n const [menuItemsError, setMenuItemsError] = useState<string | null>(null);\n\n // Dietary filter state\n const [selectedDietaryFilters, setSelectedDietaryFilters] = useState<DietaryFilter[]>([]);\n\n // Restaurants state for validation\n const [restaurants, setRestaurants] = useState<Restaurant[]>([]);\n const [restaurantsLoading, setRestaurantsLoading] = useState(true);\n\n // Fetch restaurants on mount (for validation)\n useEffect(() => {\n const fetchRestaurants = async () => {\n try {\n setRestaurantsLoading(true);\n const response = await fetchWithAuth(\n `${API_BASE_URL}${API_ENDPOINTS.RESTAURANT_CATERING}`\n );\n const data = await response.json();\n setRestaurants(data);\n } catch (error) {\n console.error(\"Error fetching restaurants:\", error);\n } finally {\n setRestaurantsLoading(false);\n }\n };\n fetchRestaurants();\n }, []);\n\n // Fetch promotions once when restaurants are loaded\n const promotionsFetchedRef = useRef(false);\n useEffect(() => {\n if (restaurants.length === 0 || promotionsFetchedRef.current) return;\n promotionsFetchedRef.current = true;\n\n const fetchPromotions = async () => {\n try {\n const restaurantIds = restaurants.map((r) => r.id);\n const promotionsMap = await promotionsServices.getBulkRestaurantPromotions(restaurantIds);\n setRestaurantPromotions(promotionsMap);\n } catch (error) {\n console.error(\"Error fetching promotions:\", error);\n }\n };\n fetchPromotions();\n }, [restaurants, setRestaurantPromotions]);\n\n // Fetch categories on mount\n useEffect(() => {\n const fetchCategories = async () => {\n try {\n setCategoriesLoading(true);\n setCategoriesError(null);\n const data = await categoryService.getCategoriesWithSubcategories();\n setCategories(data);\n // Auto-select \"Mains\" category by default\n const mainCategory = data.find(\n (cat) => cat.name.toLowerCase() === \"mains\"\n );\n if (mainCategory) {\n setSelectedCategory(mainCategory);\n }\n } catch (error) {\n console.error(\"Failed to fetch categories:\", error);\n setCategoriesError(\"Failed to load categories\");\n } finally {\n setCategoriesLoading(false);\n }\n };\n\n fetchCategories();\n }, []);\n\n // Auto-select \"Mains\" category when a session is expanded\n useEffect(() => {\n if (expandedSessionIndex !== null && categories.length > 0 && !selectedCategory) {\n const mainsCategory = categories.find(\n (cat) => cat.name.toLowerCase() === \"mains\"\n );\n if (mainsCategory) {\n setSelectedCategory(mainsCategory);\n }\n }\n }, [expandedSessionIndex, categories, selectedCategory]);\n\n // Fetch menu items when category or subcategory changes\n useEffect(() => {\n const fetchMenuItems = async () => {\n if (!selectedCategory) {\n setMenuItems([]);\n return;\n }\n\n try {\n setMenuItemsLoading(true);\n setMenuItemsError(null);\n\n let data;\n if (selectedSubcategory) {\n data = await categoryService.getMenuItemsBySubcategory(\n selectedSubcategory.id\n );\n } else {\n data = await categoryService.getMenuItemsByCategory(\n selectedCategory.id\n );\n }\n // Map to MenuItem format for MenuItemCard\n const mappedItems = data.map(mapToMenuItem);\n\n // Sort items: items with images first, then items without images\n const itemsWithImage = mappedItems.filter(\n (item) => item.image && item.image.trim() !== \"\"\n );\n const itemsWithoutImage = mappedItems.filter(\n (item) => !item.image || item.image.trim() === \"\"\n );\n const sortedItems = [...itemsWithImage, ...itemsWithoutImage];\n\n setMenuItems(sortedItems);\n } catch (error) {\n console.error(\"Failed to fetch menu items:\", error);\n setMenuItemsError(\"Failed to load menu items\");\n setMenuItems([]);\n } finally {\n setMenuItemsLoading(false);\n }\n };\n\n fetchMenuItems();\n }, [selectedCategory, selectedSubcategory]);\n\n // Helper: filter items by selected dietary restrictions\n const filterByDietary = useCallback(\n (items: MenuItem[]) => {\n if (selectedDietaryFilters.length === 0) return items;\n return items.filter((item) => {\n const itemFilters = item.dietaryFilters || [];\n return selectedDietaryFilters.every((filter) =>\n itemFilters.includes(filter)\n );\n });\n },\n [selectedDietaryFilters]\n );\n\n // Apply dietary filter to category menu items\n const filteredMenuItems = useMemo(\n () => filterByDietary(menuItems),\n [menuItems, filterByDietary]\n );\n\n // Handle category click\n const handleCategoryClick = useCallback(\n (category: CategoryWithSubcategories) => {\n if (selectedCategory?.id === category.id) {\n setSelectedCategory(null);\n setSelectedSubcategory(null);\n } else {\n setSelectedCategory(category);\n setSelectedSubcategory(null);\n }\n },\n [selectedCategory]\n );\n\n // Handle subcategory click\n const handleSubcategoryClick = useCallback(\n (subcategory: Subcategory) => {\n setSelectedSubcategory(\n selectedSubcategory?.id === subcategory.id ? null : subcategory\n );\n },\n [selectedSubcategory]\n );\n\n // Toggle dietary filter\n const toggleDietaryFilter = useCallback((filter: DietaryFilter) => {\n setSelectedDietaryFilters((prev) =>\n prev.includes(filter)\n ? prev.filter((f) => f !== filter)\n : [...prev, filter]\n );\n }, []);\n\n // Helper to select Mains category\n const selectMainsCategory = useCallback(() => {\n const mainsCategory = categories.find(\n (cat) => cat.name.toLowerCase() === \"mains\"\n );\n if (mainsCategory) {\n setSelectedCategory(mainsCategory);\n setSelectedSubcategory(null);\n }\n }, [categories]);\n\n return {\n // Categories\n categories,\n selectedCategory,\n selectedSubcategory,\n categoriesLoading,\n categoriesError,\n handleCategoryClick,\n handleSubcategoryClick,\n selectMainsCategory,\n\n // Menu items (with dietary filter applied)\n menuItems: filteredMenuItems,\n menuItemsLoading,\n menuItemsError,\n\n // Dietary filters\n selectedDietaryFilters,\n toggleDietaryFilter,\n\n // Restaurants\n restaurants,\n restaurantsLoading,\n };\n}\n","\"use client\";\n\nimport { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport { useSearchParams } from \"../shims/nextNavigation\";\nimport { useCateringState } from \"../state/CateringStateContext\";\nimport { useCateringConfig } from \"../config/CateringConfigContext\";\nimport { CateringPricingResult } from \"../types/pricing\";\nimport { ContactInfo } from \"../types/checkout\";\nimport { MealSessionState } from \"../types/session\";\nimport { cateringService } from \"../shims/cateringService\";\nimport MenuItemModal from \"./MenuItemModal\";\nimport { MenuItem } from \"../types/menu\";\nimport TutorialTooltip from \"./TutorialTooltip\";\nimport {\n LocalMealSession,\n transformLocalSessionsToPdfData,\n} from \"../utils/menuPdfUtils\";\nimport { pdf } from \"@react-pdf/renderer\";\nimport { CateringMenuPdf } from \"../pdf/CateringMenuPdf\";\nimport { validateSessionMinOrders } from \"../utils/catering-min-order-validation\";\n\n// Extracted components\nimport SessionEditor from \"./SessionEditor\";\nimport DateSessionNav from \"./DateSessionNav\";\nimport ActiveSessionPanel from \"./ActiveSessionPanel\";\nimport ViewOrderModal from \"./ViewOrderModal\";\nimport MenuBrowserColumn from \"./MenuBrowserColumn\";\nimport CheckoutScreen from \"./CheckoutScreen\";\nimport EmptySessionWarningModal from \"./modals/EmptySessionWarningModal\";\nimport RemoveSessionConfirmModal from \"./modals/RemoveSessionConfirmModal\";\nimport MinOrderModal from \"./modals/MinOrderModal\";\nimport PdfDownloadModal from \"./modals/PdfDownloadModal\";\nimport HalkinVenueModal from \"./modals/HalkinVenueModal\";\nimport SwapItemModal from \"./modals/SwapItemModal\";\nimport ValidationAlertModal from \"./modals/ValidationAlertModal\";\nimport PricingSummary from \"./contact/PricingSummary\";\n\n// Hooks\nimport { useCateringTutorial } from \"./hooks/useCateringTutorial\";\nimport { useCateringData } from \"./hooks/useCateringData\";\n\n// Helpers\nimport {\n groupSessionsByDay,\n formatTimeDisplay,\n mapToMenuItem,\n} from \"./catering-order-helpers\";\nimport { API_BASE_URL } from \"../constants/api\";\nimport { fetchWithAuth } from \"../shims/fetchWithAuth\";\n\n// Icons\nimport { MoreHorizontal, Search, ShoppingBag, Trash2, X } from \"lucide-react\";\n\nexport default function CateringOrderBuilder() {\n const searchParams = useSearchParams();\n const {\n mealSessions,\n activeSessionIndex,\n setActiveSessionIndex,\n addMealSession,\n updateMealSession,\n removeMealSession,\n addMenuItem,\n updateItemQuantity,\n removeMenuItemByIndex,\n updateMenuItemByIndex,\n getSessionTotal,\n getSessionDiscount,\n getTotalPrice,\n currentStep,\n setCurrentStep,\n contactInfo,\n setContactInfo,\n } = useCateringState();\n\n // Session editing state\n const [editingSessionIndex, setEditingSessionIndex] = useState<number | null>(\n null,\n );\n const [isNewSession, setIsNewSession] = useState(false);\n\n // Navigation state\n const [navMode, setNavMode] = useState<\"dates\" | \"sessions\">(\"dates\");\n const [selectedDayDate, setSelectedDayDate] = useState<string | null>(null);\n\n\n // Menu items state\n const [expandedItemId, setExpandedItemId] = useState<string | null>(null);\n\n // Edit item state\n const [editingItemIndex, setEditingItemIndex] = useState<number | null>(null);\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n\n // Pending item modal state\n const [pendingItem, setPendingItem] = useState<MenuItem | null>(null);\n\n // Collapsed categories state\n const [collapsedCategories, setCollapsedCategories] = useState<Set<string>>(\n new Set(),\n );\n\n // PDF generation state\n const [generatingPdf, setGeneratingPdf] = useState(false);\n const [showPdfModal, setShowPdfModal] = useState(false);\n const [showHalkinModal, setShowHalkinModal] = useState(false);\n\n // Empty session warning modal state\n const [emptySessionIndex, setEmptySessionIndex] = useState<number | null>(\n null,\n );\n\n // Remove session confirmation modal state\n const [sessionToRemove, setSessionToRemove] = useState<number | null>(null);\n\n // Min order modal state\n const [minOrderModalSession, setMinOrderModalSession] = useState<{\n index: number;\n validation: typeof validationStatus;\n } | null>(null);\n\n // Catering hours validation errors\n const [sessionValidationErrors, setSessionValidationErrors] = useState<\n Record<number, string>\n >({});\n\n // Conflict shown when checkout is blocked by a restaurant's catering-hours\n // or date restrictions — offers to remove those items or edit the session.\n const [checkoutConflict, setCheckoutConflict] = useState<{\n sessionIndex: number;\n restaurantId: string;\n restaurantName: string;\n message: string;\n } | null>(null);\n\n // Bundle browser state\n const [showBundleBrowser, setShowBundleBrowser] = useState(false);\n\n // Swap item state (for bundle items)\n const [swapItemIndex, setSwapItemIndex] = useState<number | null>(null);\n const [swapAlternatives, setSwapAlternatives] = useState<MenuItem[]>([]);\n\n // Mobile View Order modal state\n const [isViewOrderOpen, setIsViewOrderOpen] = useState(false);\n\n // Remove item confirmation\n const [removeItemIndex, setRemoveItemIndex] = useState<number | null>(null);\n\n // Clear all items confirmation + cart actions popovers\n const [isClearAllConfirmOpen, setIsClearAllConfirmOpen] = useState(false);\n const [isMobileCartMenuOpen, setIsMobileCartMenuOpen] = useState(false);\n const [isDesktopCartMenuOpen, setIsDesktopCartMenuOpen] = useState(false);\n\n // Mobile bottom-bar search (proxies into RestaurantMenuBrowser's internal\n // search state via register/publish callbacks)\n const [isMobileSearchOpen, setIsMobileSearchOpen] = useState(false);\n const [mobileSearchState, setMobileSearchState] = useState<{\n mode: \"list\" | \"restaurant\";\n query: string;\n }>({ mode: \"list\", query: \"\" });\n const mobileSearchSetterRef = useRef<((query: string) => void) | null>(null);\n const mobileSearchInputRef = useRef<HTMLInputElement>(null);\n const mobileBarRowRef = useRef<HTMLDivElement>(null);\n const suppressMobileSearchScrollCloseRef = useRef(false);\n // Caret is hidden during the slide animation so the blinking cursor\n // doesn't distract from the pill -> input transition.\n const [mobileSearchCaretVisible, setMobileSearchCaretVisible] = useState(false);\n\n // Lift the mobile bottom bar above the on-screen keyboard using the\n // Visual Viewport API (supported on iOS Safari 15.4+ and Android Chrome).\n const [keyboardOffset, setKeyboardOffset] = useState(0);\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.visualViewport) return;\n const vv = window.visualViewport;\n const update = () => {\n const offset = Math.max(\n 0,\n window.innerHeight - vv.height - vv.offsetTop,\n );\n setKeyboardOffset(offset);\n };\n update();\n vv.addEventListener(\"resize\", update);\n vv.addEventListener(\"scroll\", update);\n return () => {\n vv.removeEventListener(\"resize\", update);\n vv.removeEventListener(\"scroll\", update);\n };\n }, []);\n\n // Reveal the input caret only after the slide animation completes, so\n // the blinking cursor doesn't appear mid-animation.\n useEffect(() => {\n if (!isMobileSearchOpen) {\n setMobileSearchCaretVisible(false);\n return;\n }\n const timer = setTimeout(() => setMobileSearchCaretVisible(true), 300);\n return () => clearTimeout(timer);\n }, [isMobileSearchOpen]);\n\n // Close mobile search on outside tap or scroll when the query is empty.\n // Mirrors the logic in RestaurantMenuBrowser so tapping the group-title\n // pill row (which triggers a programmatic scroll) doesn't inadvertently\n // close the search.\n useEffect(() => {\n if (!isMobileSearchOpen) return;\n if (mobileSearchState.query) return;\n\n const triggerDelayedClose = () => {\n mobileSearchInputRef.current?.blur();\n setTimeout(() => {\n setIsMobileSearchOpen(false);\n }, 250);\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n if (mobileBarRowRef.current?.contains(target)) return;\n if (target.closest?.(\"[data-pill-row]\")) {\n suppressMobileSearchScrollCloseRef.current = true;\n setTimeout(() => {\n suppressMobileSearchScrollCloseRef.current = false;\n }, 600);\n return;\n }\n triggerDelayedClose();\n };\n\n const handleScroll = () => {\n if (suppressMobileSearchScrollCloseRef.current) return;\n triggerDelayedClose();\n };\n\n // Delay scroll listener attachment so the focus-triggered micro-scroll\n // from opening the search doesn't close it immediately.\n const scrollTimer = setTimeout(() => {\n document.addEventListener(\"scroll\", handleScroll, {\n capture: true,\n passive: true,\n });\n }, 100);\n\n document.addEventListener(\"pointerdown\", handlePointerDown, {\n capture: true,\n });\n\n return () => {\n clearTimeout(scrollTimer);\n document.removeEventListener(\"pointerdown\", handlePointerDown, {\n capture: true,\n });\n document.removeEventListener(\"scroll\", handleScroll, {\n capture: true,\n });\n };\n }, [isMobileSearchOpen, mobileSearchState.query]);\n const handleRegisterMobileSearchSetter = useCallback(\n (setter: (query: string) => void) => {\n mobileSearchSetterRef.current = setter;\n },\n [],\n );\n const handleMobileSearchInputChange = (value: string) => {\n setMobileSearchState((prev) => ({ ...prev, query: value }));\n mobileSearchSetterRef.current?.(value);\n };\n const openMobileSearch = () => {\n // Focus synchronously so iOS opens the on-screen keyboard within the\n // user-gesture window. The input is always mounted so the ref is valid\n // regardless of the isMobileSearchOpen state.\n mobileSearchInputRef.current?.focus({ preventScroll: true });\n // Delay the pill -> input slide so it plays AFTER the keyboard has\n // finished raising the bar. Otherwise the keyboard-driven translate\n // dominates and the slide animation is hard to see.\n setTimeout(() => {\n setIsMobileSearchOpen(true);\n }, 250);\n };\n const closeMobileSearch = () => {\n mobileSearchSetterRef.current?.(\"\");\n setMobileSearchState((prev) => ({ ...prev, query: \"\" }));\n // Blur first so the keyboard starts retracting (and the bar slides\n // back down via visualViewport). Delay the state flip so the input ->\n // pill slide runs AFTER the keyboard drop, matching the open timing.\n mobileSearchInputRef.current?.blur();\n setTimeout(() => {\n setIsMobileSearchOpen(false);\n }, 250);\n };\n const [desktopMenuPos, setDesktopMenuPos] = useState({ bottom: 0, left: 0 });\n const desktopMenuBtnRef = useRef<HTMLButtonElement>(null);\n\n // Tutorial refs\n const addDayNavButtonRef = useRef<HTMLButtonElement>(null);\n const backButtonRef = useRef<HTMLButtonElement>(null);\n const firstDayTabRef = useRef<HTMLDivElement>(null);\n const firstSessionPillRef = useRef<HTMLButtonElement>(null);\n const addSessionNavButtonRef = useRef<HTMLButtonElement>(null);\n const restaurantListRef = useRef<HTMLDivElement>(null);\n const firstMenuItemRef = useRef<HTMLDivElement>(null);\n const categoriesRowRef = useRef<HTMLDivElement>(null);\n const resetRestaurantListRef = useRef<(() => void) | null>(null);\n\n // Use custom hooks\n const {\n categories,\n selectedCategory,\n selectedSubcategory,\n handleCategoryClick,\n selectMainsCategory,\n restaurants,\n restaurantsLoading,\n selectedDietaryFilters,\n toggleDietaryFilter,\n } = useCateringData({ expandedSessionIndex: activeSessionIndex });\n\n const {\n tutorialStep,\n tutorialPhase,\n currentTutorialStep,\n handleTutorialNext,\n handleSkipTutorial,\n triggerNavigationTutorial,\n triggerSessionCreated,\n resetTutorial,\n getTutorialSteps,\n } = useCateringTutorial({\n mealSessions,\n refs: {\n addDayNavButtonRef,\n backButtonRef,\n firstDayTabRef,\n firstSessionPillRef,\n addSessionNavButtonRef,\n categoriesRowRef,\n restaurantListRef,\n firstMenuItemRef,\n resetRestaurantListRef,\n },\n });\n\n // Get quantity for an item in the current session\n const getItemQuantity = (itemId: string): number => {\n const session = mealSessions[activeSessionIndex];\n if (!session) return 0;\n const orderItem = session.orderItems.find((oi) => oi.item.id === itemId);\n return orderItem?.quantity || 0;\n };\n\n // Handle adding item to cart\n const handleAddItem = (item: MenuItem) => {\n const BACKEND_QUANTITY_UNIT = item.cateringQuantityUnit || 7;\n const portionQuantity = item.portionQuantity || 1;\n const quantity = portionQuantity * BACKEND_QUANTITY_UNIT;\n\n addMenuItem(activeSessionIndex, {\n item: {\n id: item.id,\n menuItemName: item.menuItemName,\n description: item.description,\n price: item.price,\n discountPrice: item.discountPrice,\n allergens: item.allergens,\n dietaryFilters: item.dietaryFilters,\n isDiscount: item.isDiscount,\n image: item.image,\n restaurantId: item.restaurantId,\n restaurantName: item.restaurantName,\n groupTitle: item.groupTitle,\n cateringQuantityUnit: item.cateringQuantityUnit,\n feedsPerUnit: item.feedsPerUnit,\n itemDisplayOrder: item.itemDisplayOrder,\n addons: item.addons,\n selectedAddons: item.selectedAddons,\n categoryId: selectedCategory?.id,\n categoryName: selectedCategory?.name,\n subcategoryId: selectedSubcategory?.id || item.subcategoryId,\n subcategoryName: selectedSubcategory?.name || item.subcategoryName,\n },\n quantity,\n });\n setExpandedItemId(null);\n };\n\n // Handle updating item quantity\n const handleUpdateQuantity = (itemId: string, quantity: number) => {\n updateItemQuantity(activeSessionIndex, itemId, quantity);\n };\n\n // Handle opening modal for add/edit\n const handleAddOrderPress = (item: MenuItem) => {\n setExpandedItemId(item.id);\n };\n\n\n const { stickyTopOffset = 0 } = useCateringConfig();\n const basketColumnRef = useRef<HTMLDivElement>(null);\n const [basketHeight, setBasketHeight] = useState(\"100vh\");\n useEffect(() => {\n const updateHeight = () => {\n if (basketColumnRef.current) {\n const top = Math.max(\n 0,\n basketColumnRef.current.getBoundingClientRect().top,\n );\n setBasketHeight(`calc(100vh - ${top}px)`);\n }\n };\n updateHeight();\n window.addEventListener(\"scroll\", updateHeight, { passive: true });\n window.addEventListener(\"resize\", updateHeight);\n return () => {\n window.removeEventListener(\"scroll\", updateHeight);\n window.removeEventListener(\"resize\", updateHeight);\n };\n }, []);\n\n // Prefill cart from bundle query parameter\n useEffect(() => {\n const bundleId = searchParams.get(\"bundleId\");\n if (!bundleId) return;\n\n const sessionDate = searchParams.get(\"sessionDate\");\n const sessionTime = searchParams.get(\"sessionTime\");\n\n const prefillFromBundle = async () => {\n try {\n const bundle = await cateringService.getBundleById(bundleId);\n const response = await cateringService.getMenuItems();\n const allMenuItems = (response || []).map((item: any) => ({\n id: item.id,\n menuItemName: item.name,\n description: item.description,\n price: item.price?.toString() || \"0\",\n discountPrice: item.discountPrice?.toString(),\n isDiscount: item.isDiscount || false,\n image: item.image,\n averageRating: item.averageRating?.toString(),\n restaurantId: item.restaurantId || \"\",\n cateringQuantityUnit: item.cateringQuantityUnit || 7,\n feedsPerUnit: item.feedsPerUnit || 10,\n groupTitle: item.groupTitle,\n status: item.status,\n itemDisplayOrder: item.itemDisplayOrder,\n addons: Array.isArray(item.addons) ? item.addons : [],\n allergens: Array.isArray(item.allergens) ? item.allergens : [],\n restaurant: {\n id: item.restaurantId,\n name: item.restaurant?.restaurant_name || \"Unknown\",\n restaurantId: item.restaurantId,\n menuGroupSettings: item.restaurant?.menuGroupSettings,\n },\n dietaryFilters: item.dietaryFilters,\n }));\n\n bundle.items.forEach((bundleItem) => {\n const menuItem = allMenuItems.find(\n (item: MenuItem) => item.id === bundleItem.menuItemId,\n );\n\n if (menuItem) {\n const itemWithAddons: MenuItem = {\n ...menuItem,\n selectedAddons: bundleItem.selectedAddons,\n };\n\n addMenuItem(activeSessionIndex, {\n item: itemWithAddons,\n quantity: bundleItem.quantity,\n });\n } else {\n console.warn(\n `Menu item ${bundleItem.menuItemId} not found in loaded menu items`,\n );\n }\n });\n\n if (sessionDate || sessionTime) {\n updateMealSession(activeSessionIndex, {\n ...(sessionDate && { sessionDate }),\n ...(sessionTime && { eventTime: sessionTime }),\n });\n }\n } catch (error) {\n console.error(\"Error loading bundle:\", error);\n }\n };\n\n prefillFromBundle();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchParams]);\n\n // Check for pending item from menu view\n useEffect(() => {\n const pendingItemJson = localStorage.getItem(\"catering_pending_item\");\n if (!pendingItemJson) return;\n\n try {\n const item = JSON.parse(pendingItemJson) as MenuItem;\n localStorage.removeItem(\"catering_pending_item\");\n setPendingItem(item);\n } catch (error) {\n console.error(\"Error parsing pending item:\", error);\n localStorage.removeItem(\"catering_pending_item\");\n }\n }, []);\n\n // Validate minimum order requirements for current session\n const validationStatus = useMemo(() => {\n const activeSession = mealSessions[activeSessionIndex];\n if (!activeSession || restaurants.length === 0) {\n return [];\n }\n return validateSessionMinOrders(activeSession, restaurants);\n }, [mealSessions, activeSessionIndex, restaurants]);\n\n // Check if current session meets all minimum order requirements\n const isCurrentSessionValid = useMemo(() => {\n return validationStatus.every((status) => status.isValid);\n }, [validationStatus]);\n\n // Group sessions by day for timeline view\n const dayGroups = useMemo(() => {\n return groupSessionsByDay(mealSessions, getSessionTotal);\n }, [mealSessions, getSessionTotal]);\n\n // Get the current day group based on selected date\n const currentDayGroup = useMemo(() => {\n if (!selectedDayDate) return null;\n return dayGroups.find((g) => g.date === selectedDayDate) || null;\n }, [dayGroups, selectedDayDate]);\n\n // Sync selected day date with active session\n useEffect(() => {\n if (navMode !== \"sessions\" || activeSessionIndex === null) {\n return;\n }\n\n const activeSession = mealSessions[activeSessionIndex];\n if (!activeSession?.sessionDate) {\n return;\n }\n\n if (selectedDayDate !== activeSession.sessionDate) {\n setSelectedDayDate(activeSession.sessionDate);\n }\n }, [navMode, activeSessionIndex, mealSessions, selectedDayDate]);\n\n // Handle clicking a date tab\n const handleDateClick = (dayDate: string) => {\n setSelectedDayDate(dayDate);\n setNavMode(\"sessions\");\n\n // Select first session on this day\n const dayGroup = dayGroups.find((g) => g.date === dayDate);\n if (dayGroup && dayGroup.sessions.length > 0) {\n setActiveSessionIndex(dayGroup.sessions[0].index);\n }\n };\n\n // Handle back to dates view\n const handleBackToDates = () => {\n if (selectedDayDate && currentDayGroup) {\n const sessionsToRemove = currentDayGroup.sessions\n .filter(\n ({ session }) =>\n session.orderItems.length === 0 && !session.eventTime,\n )\n .map(({ index }) => index)\n .sort((a, b) => b - a);\n\n sessionsToRemove.forEach((index) => {\n removeMealSession(index);\n });\n }\n setNavMode(\"dates\");\n setSelectedDayDate(null);\n };\n\n // Handle session pill click\n const handleSessionPillClick = (sessionIndex: number) => {\n const session = mealSessions[sessionIndex];\n if (session?.sessionDate) {\n setSelectedDayDate(session.sessionDate);\n setNavMode(\"sessions\");\n }\n setActiveSessionIndex(sessionIndex);\n setShowBundleBrowser(false);\n };\n\n // Handle navigation from min order modal to a specific section\n const handleMinOrderNavigate = (_restaurantId: string, section: string) => {\n if (!minOrderModalSession) return;\n\n const sessionIndex = minOrderModalSession.index;\n\n // Close the modal\n setMinOrderModalSession(null);\n\n // Ensure the session is active\n setActiveSessionIndex(sessionIndex);\n\n const session = mealSessions[sessionIndex];\n if (session?.sessionDate) {\n setSelectedDayDate(session.sessionDate);\n setNavMode(\"sessions\");\n }\n\n // Try to find and select a category that matches the section name\n const matchingCategory = categories.find(\n (cat) => cat.name.toLowerCase() === section.toLowerCase(),\n );\n if (matchingCategory) {\n handleCategoryClick(matchingCategory);\n }\n };\n\n const isUnconfiguredDefaultSession = (\n session: MealSessionState | undefined,\n ) => {\n if (!session) return false;\n\n return (\n session.sessionName === \"Main Event\" &&\n !session.sessionDate &&\n !session.eventTime &&\n !session.guestCount &&\n !session.specialRequirements?.trim() &&\n session.orderItems.length === 0\n );\n };\n\n // Handle adding a new day — opens the SessionEditor directly\n const handleAddDay = () => {\n const newSession: MealSessionState = {\n sessionName: `Session ${mealSessions.length + 1}`,\n sessionDate: \"\",\n eventTime: \"\",\n orderItems: [],\n };\n\n const shouldReuseDefaultSession =\n mealSessions.length === 1 &&\n isUnconfiguredDefaultSession(mealSessions[0]);\n const newIndex = shouldReuseDefaultSession ? 0 : mealSessions.length;\n\n if (shouldReuseDefaultSession) {\n updateMealSession(0, newSession);\n } else {\n addMealSession(newSession);\n }\n\n setActiveSessionIndex(newIndex);\n selectMainsCategory();\n\n setTimeout(() => {\n setEditingSessionIndex(newIndex);\n setIsNewSession(true);\n }, 100);\n };\n\n // Handle adding session to a day\n const handleAddSessionToDay = (dayDate: string) => {\n const newSession: MealSessionState = {\n sessionName: `Session ${mealSessions.length + 1}`,\n sessionDate: dayDate,\n eventTime: \"\",\n orderItems: [],\n };\n\n const shouldReuseDefaultSession =\n mealSessions.length === 1 &&\n isUnconfiguredDefaultSession(mealSessions[0]);\n const newIndex = shouldReuseDefaultSession ? 0 : mealSessions.length;\n\n if (shouldReuseDefaultSession) {\n updateMealSession(0, newSession);\n } else {\n addMealSession(newSession);\n }\n\n setSelectedDayDate(dayDate);\n setNavMode(\"sessions\");\n setActiveSessionIndex(newIndex);\n selectMainsCategory();\n\n setTimeout(() => {\n setEditingSessionIndex(newIndex);\n setIsNewSession(true);\n }, 150);\n };\n\n // Calculate totals\n const totalDays = dayGroups.filter((g) => g.date !== \"unscheduled\").length;\n const totalSessions = mealSessions.length;\n const totalItems = mealSessions.reduce(\n (acc, s) => acc + s.orderItems.reduce((sum, oi) => sum + oi.quantity, 0),\n 0,\n );\n\n // Pricing summary\n const [pricing, setPricing] = useState<CateringPricingResult | null>(null);\n const [calculatingPricing, setCalculatingPricing] = useState(false);\n const pricingDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Delivery address for pricing — seeded from persisted contactInfo\n const [deliveryLocation, setDeliveryLocation] = useState<{\n latitude: number;\n longitude: number;\n } | null>(\n contactInfo?.latitude && contactInfo?.longitude\n ? { latitude: contactInfo.latitude, longitude: contactInfo.longitude }\n : null,\n );\n\n const handleDeliveryPlaceSelect = useCallback(\n (place: google.maps.places.PlaceResult) => {\n const lat = place.geometry?.location?.lat();\n const lng = place.geometry?.location?.lng();\n if (!lat || !lng) return;\n\n // Extract address components\n let addressLine1 = \"\";\n let city = \"\";\n let zipcode = \"\";\n place.address_components?.forEach((c) => {\n if (c.types.includes(\"street_number\")) addressLine1 = c.long_name + \" \";\n if (c.types.includes(\"route\")) addressLine1 += c.long_name;\n if (c.types.includes(\"postal_town\") || c.types.includes(\"locality\"))\n city = c.long_name;\n if (c.types.includes(\"postal_code\")) zipcode = c.long_name;\n });\n\n setDeliveryLocation({ latitude: lat, longitude: lng });\n\n // Persist to CateringContext so Step3 pre-fills the address\n setContactInfo({\n ...(contactInfo ?? ({} as ContactInfo)),\n addressLine1: addressLine1.trim() || place.formatted_address || \"\",\n city,\n zipcode,\n latitude: lat,\n longitude: lng,\n });\n\n const placeText = `${place.name || \"\"} ${place.formatted_address || \"\"}`;\n if (/halkin\\s*-/i.test(placeText)) {\n setShowHalkinModal(true);\n }\n },\n [contactInfo, setContactInfo],\n );\n\n const handleClearDeliveryAddress = useCallback(() => {\n setDeliveryLocation(null);\n setPricing(null);\n setContactInfo({\n ...(contactInfo ?? ({} as ContactInfo)),\n addressLine1: \"\",\n city: \"\",\n zipcode: \"\",\n latitude: undefined,\n longitude: undefined,\n });\n }, [contactInfo, setContactInfo]);\n\n const fetchPricing = useCallback(\n async (sessions: MealSessionState[]) => {\n const hasItems = sessions.some((s) => s.orderItems.length > 0);\n if (!hasItems) {\n setPricing(null);\n return;\n }\n setCalculatingPricing(true);\n try {\n const result =\n await cateringService.calculateCateringPricingWithMealSessions(\n sessions,\n [],\n deliveryLocation ?? undefined,\n );\n if (result.isValid) setPricing(result);\n } catch {\n // silently ignore — pricing is best-effort in the sidebar\n } finally {\n setCalculatingPricing(false);\n }\n },\n [deliveryLocation],\n );\n\n useEffect(() => {\n if (pricingDebounceRef.current) clearTimeout(pricingDebounceRef.current);\n pricingDebounceRef.current = setTimeout(() => {\n fetchPricing(mealSessions);\n }, 600);\n return () => {\n if (pricingDebounceRef.current) clearTimeout(pricingDebounceRef.current);\n };\n }, [mealSessions, fetchPricing]);\n\n // Handle editor close\n const handleEditorClose = (cancelled: boolean) => {\n const sessionIndex = editingSessionIndex;\n const wasNewSession = isNewSession;\n\n if (cancelled && isNewSession && sessionIndex !== null) {\n removeMealSession(sessionIndex);\n }\n\n if (sessionIndex !== null && !cancelled) {\n setSessionValidationErrors((prev) => {\n const newErrors = { ...prev };\n delete newErrors[sessionIndex];\n return newErrors;\n });\n }\n\n setEditingSessionIndex(null);\n setIsNewSession(false);\n\n if (sessionIndex !== null && !cancelled) {\n const session = mealSessions[sessionIndex];\n if (session?.sessionDate) {\n setSelectedDayDate(session.sessionDate);\n setNavMode(\"sessions\");\n }\n setActiveSessionIndex(sessionIndex);\n\n if (wasNewSession && tutorialPhase === \"navigation\") {\n triggerSessionCreated();\n }\n }\n };\n\n // Handle remove session\n const handleRemoveSession = (index: number, e: React.MouseEvent) => {\n e.stopPropagation();\n setSessionToRemove(index);\n };\n\n const confirmRemoveSession = () => {\n if (sessionToRemove !== null) {\n const remainingSessions = mealSessions.filter(\n (_, index) => index !== sessionToRemove,\n );\n\n removeMealSession(sessionToRemove);\n\n if (remainingSessions.length === 0) {\n setSelectedDayDate(null);\n setNavMode(\"dates\");\n setActiveSessionIndex(0);\n } else {\n const nextSessionIndex = Math.min(\n sessionToRemove,\n remainingSessions.length - 1,\n );\n const nextSession = remainingSessions[nextSessionIndex];\n\n setActiveSessionIndex(nextSessionIndex);\n setSelectedDayDate(nextSession?.sessionDate || null);\n setNavMode(nextSession?.sessionDate ? \"sessions\" : \"dates\");\n }\n\n setEditingSessionIndex(null);\n setSessionToRemove(null);\n }\n };\n\n // Toggle collapsed category\n const handleToggleCategory = (categoryName: string) => {\n setCollapsedCategories((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(categoryName)) {\n newSet.delete(categoryName);\n } else {\n newSet.add(categoryName);\n }\n return newSet;\n });\n };\n\n // Handle edit item from cart\n const handleEditItem = (itemIndex: number) => {\n setEditingItemIndex(itemIndex);\n setIsEditModalOpen(true);\n };\n\n // Handle remove item from cart\n const handleRemoveItem = (itemIndex: number) => {\n setRemoveItemIndex(itemIndex);\n };\n\n const confirmRemoveItem = () => {\n if (removeItemIndex !== null) {\n removeMenuItemByIndex(activeSessionIndex, removeItemIndex);\n setRemoveItemIndex(null);\n }\n };\n\n const handleRemoveBundle = (bundleId: string) => {\n const session = mealSessions[activeSessionIndex];\n if (!session) return;\n const indices = session.orderItems\n .map((item, idx) => (item.bundleId === bundleId ? idx : -1))\n .filter((idx) => idx !== -1)\n .sort((a, b) => b - a);\n indices.forEach((idx) => removeMenuItemByIndex(activeSessionIndex, idx));\n };\n\n // Handle swap item (for bundle items) — fetches from restaurant on demand\n const handleSwapItem = async (itemIndex: number) => {\n const session = mealSessions[activeSessionIndex];\n if (!session) return;\n const orderItem = session.orderItems[itemIndex];\n if (!orderItem) return;\n\n const item = orderItem.item as MenuItem;\n const restaurantId = item.restaurantId;\n\n setSwapItemIndex(itemIndex);\n setSwapAlternatives([]);\n\n if (!restaurantId) return;\n\n try {\n const response = await fetchWithAuth(\n `${API_BASE_URL}/menu-item/restaurant/${restaurantId}`,\n );\n const data = await response.json();\n const items: MenuItem[] = (data.menuItems || []).map(mapToMenuItem);\n const groupTitle = item.groupTitle;\n const alternatives = groupTitle\n ? items.filter((mi) => mi.groupTitle === groupTitle)\n : items;\n setSwapAlternatives(alternatives);\n } catch (error) {\n console.error(\"Failed to fetch swap alternatives:\", error);\n }\n };\n\n const handleConfirmSwap = (newItem: MenuItem) => {\n if (swapItemIndex === null) return;\n const session = mealSessions[activeSessionIndex];\n if (!session) return;\n\n const oldOrderItem = session.orderItems[swapItemIndex];\n const backendQuantityUnit = newItem.cateringQuantityUnit || 7;\n const quantity =\n newItem.portionQuantity && newItem.portionQuantity > 0\n ? newItem.portionQuantity * backendQuantityUnit\n : oldOrderItem.quantity;\n\n updateMenuItemByIndex(activeSessionIndex, swapItemIndex, {\n item: {\n ...newItem,\n categoryId: oldOrderItem.item.categoryId,\n categoryName: oldOrderItem.item.categoryName,\n subcategoryId: oldOrderItem.item.subcategoryId,\n subcategoryName: oldOrderItem.item.subcategoryName,\n },\n quantity,\n bundleId: oldOrderItem.bundleId,\n bundleName: oldOrderItem.bundleName,\n });\n\n setSwapItemIndex(null);\n setSwapAlternatives([]);\n };\n\n // Handle save edited item\n const handleSaveEditedItem = (updatedItem: MenuItem) => {\n if (editingItemIndex === null) return;\n\n const BACKEND_QUANTITY_UNIT = updatedItem.cateringQuantityUnit || 7;\n const quantity = (updatedItem.portionQuantity || 1) * BACKEND_QUANTITY_UNIT;\n\n const originalOrderItem =\n mealSessions[activeSessionIndex].orderItems[editingItemIndex];\n const originalItem = originalOrderItem.item;\n\n updateMenuItemByIndex(activeSessionIndex, editingItemIndex, {\n item: {\n ...updatedItem,\n categoryId: originalItem.categoryId,\n categoryName: originalItem.categoryName,\n subcategoryId: originalItem.subcategoryId,\n subcategoryName: originalItem.subcategoryName,\n restaurantName:\n \"restaurantName\" in originalItem\n ? originalItem.restaurantName\n : originalItem.restaurant?.name,\n },\n quantity,\n bundleId: originalOrderItem.bundleId,\n bundleName: originalOrderItem.bundleName,\n });\n\n setIsEditModalOpen(false);\n setEditingItemIndex(null);\n };\n\n // Handle checkout\n const handleCheckout = () => {\n // Check for empty sessions\n if (mealSessions.length > 1) {\n const emptyIndex = mealSessions.findIndex(\n (session) => session.orderItems.length === 0,\n );\n if (emptyIndex !== -1) {\n setEmptySessionIndex(emptyIndex);\n return;\n }\n }\n\n // Check minimum order requirements\n for (let i = 0; i < mealSessions.length; i++) {\n const session = mealSessions[i];\n if (session.orderItems.length === 0) continue;\n\n const sessionValidation = validateSessionMinOrders(session, restaurants);\n const hasUnmetRequirements = sessionValidation.some(\n (status) => !status.isValid,\n );\n\n if (hasUnmetRequirements) {\n setActiveSessionIndex(i);\n setMinOrderModalSession({\n index: i,\n validation: sessionValidation,\n });\n return;\n }\n }\n\n // Check for missing date/time\n for (let i = 0; i < mealSessions.length; i++) {\n const session = mealSessions[i];\n const hasItems = session.orderItems.length > 0;\n const missingDate = !session.sessionDate;\n const missingTime = !session.eventTime;\n\n if (hasItems && (missingDate || missingTime)) {\n setActiveSessionIndex(i);\n setEditingSessionIndex(i);\n return;\n }\n }\n\n // Validate catering hours\n const errors: Record<number, string> = {};\n type Conflict = {\n sessionIndex: number;\n restaurantId: string;\n restaurantName: string;\n message: string;\n };\n const conflicts: Conflict[] = [];\n const recordConflict = (\n sessionIndex: number,\n restaurantId: string,\n restaurantName: string,\n message: string,\n ) => {\n errors[sessionIndex] = message;\n conflicts.push({ sessionIndex, restaurantId, restaurantName, message });\n };\n for (let i = 0; i < mealSessions.length; i++) {\n const session = mealSessions[i];\n if (session.orderItems.length === 0) continue;\n\n const restaurantIds = new Set(\n session.orderItems.map((oi) => oi.item.restaurantId),\n );\n\n for (const restaurantId of restaurantIds) {\n const restaurant = restaurants.find((r) => r.id === restaurantId);\n if (!restaurant) continue;\n\n const cateringHours = restaurant.cateringOperatingHours;\n if (!cateringHours || cateringHours.length === 0) continue;\n\n const selectedDateTime = new Date(session.sessionDate + \"T00:00:00\");\n const dayOfWeek = selectedDateTime\n .toLocaleDateString(\"en-US\", { weekday: \"long\" })\n .toLowerCase();\n\n const formatTimeRange = (hour: number, minute: number) => {\n const period = hour >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour % 12 || 12;\n return `${hour12}:${minute.toString().padStart(2, \"0\")} ${period}`;\n };\n\n // Check date overrides first\n const dateString = session.sessionDate;\n const dateOverride = restaurant.dateOverrides?.find(\n (o) => o.date === dateString,\n );\n\n if (dateOverride) {\n if (dateOverride.isClosed) {\n recordConflict(\n i,\n restaurant.id,\n restaurant.restaurant_name,\n `${restaurant.restaurant_name} is closed on ${dateString}${dateOverride.reason ? ` (${dateOverride.reason})` : \"\"}. Please select a different date.`,\n );\n break;\n }\n if (\n dateOverride.timeSlots &&\n dateOverride.timeSlots.length > 0 &&\n session.eventTime\n ) {\n const [eventHour, eventMinute] = session.eventTime\n .split(\":\")\n .map(Number);\n const eventMinutes = eventHour * 60 + eventMinute;\n const inAnySlot = dateOverride.timeSlots.some((slot) => {\n const [oh, om] = slot.open.split(\":\").map(Number);\n const [ch, cm] = slot.close.split(\":\").map(Number);\n return (\n eventMinutes >= oh * 60 + om && eventMinutes <= ch * 60 + cm\n );\n });\n if (!inAnySlot) {\n const slotDescs = dateOverride.timeSlots\n .map((s) => {\n const [oh, om] = s.open.split(\":\").map(Number);\n const [ch, cm] = s.close.split(\":\").map(Number);\n return `${formatTimeRange(oh, om)} - ${formatTimeRange(ch, cm)}`;\n })\n .join(\", \");\n recordConflict(\n i,\n restaurant.id,\n restaurant.restaurant_name,\n `${restaurant.restaurant_name} only accepts orders between ${slotDescs} on ${dateString}.`,\n );\n break;\n }\n }\n } else {\n // Regular weekly schedule\n const daySlots = cateringHours.filter(\n (schedule) =>\n schedule.day.toLowerCase() === dayOfWeek && schedule.enabled,\n );\n\n if (daySlots.length === 0) {\n recordConflict(\n i,\n restaurant.id,\n restaurant.restaurant_name,\n `${restaurant.restaurant_name} does not accept event orders on ${dayOfWeek}s. Please select a different date for this session.`,\n );\n break;\n }\n\n const enabledSlots = daySlots.filter((s) => s.open && s.close);\n if (enabledSlots.length > 0 && session.eventTime) {\n const [eventHour, eventMinute] = session.eventTime\n .split(\":\")\n .map(Number);\n const eventMinutes = eventHour * 60 + eventMinute;\n\n const inAnySlot = enabledSlots.some((slot) => {\n const [openHour, openMinute] = slot.open!.split(\":\").map(Number);\n const [closeHour, closeMinute] = slot\n .close!.split(\":\")\n .map(Number);\n return (\n eventMinutes >= openHour * 60 + openMinute &&\n eventMinutes <= closeHour * 60 + closeMinute\n );\n });\n\n if (!inAnySlot) {\n const slotDescs = enabledSlots\n .map((s) => {\n const [oh, om] = s.open!.split(\":\").map(Number);\n const [ch, cm] = s.close!.split(\":\").map(Number);\n return `${formatTimeRange(oh, om)} - ${formatTimeRange(ch, cm)}`;\n })\n .join(\", \");\n recordConflict(\n i,\n restaurant.id,\n restaurant.restaurant_name,\n `${restaurant.restaurant_name} accepts event orders on ${dayOfWeek}s between ${slotDescs}. Please select a time within these hours for this session.`,\n );\n break;\n }\n }\n }\n }\n }\n\n if (Object.keys(errors).length > 0) {\n setSessionValidationErrors(errors);\n const firstConflict = conflicts[0];\n if (firstConflict) {\n setActiveSessionIndex(firstConflict.sessionIndex);\n setCheckoutConflict(firstConflict);\n }\n return;\n }\n\n setSessionValidationErrors({});\n setCurrentStep(2);\n };\n\n // Handle remove empty session\n const handleRemoveEmptySession = () => {\n if (emptySessionIndex !== null) {\n removeMealSession(emptySessionIndex);\n setEmptySessionIndex(null);\n }\n };\n\n // Handle add items to empty session\n const handleAddItemsToEmptySession = () => {\n if (emptySessionIndex !== null) {\n const session = mealSessions[emptySessionIndex];\n const sessionDate = session?.sessionDate;\n\n setActiveSessionIndex(emptySessionIndex);\n\n if (sessionDate) {\n setSelectedDayDate(sessionDate);\n setNavMode(\"sessions\");\n }\n\n setEmptySessionIndex(null);\n }\n };\n\n // Handle view menu - opens modal to choose with/without prices\n const handleViewMenu = () => {\n setShowPdfModal(true);\n };\n\n const handleClearAllItems = () => {\n // Remove sessions from highest index down. When the last one is removed,\n // the context resets to a single fresh default session.\n for (let i = mealSessions.length - 1; i >= 0; i--) {\n removeMealSession(i);\n }\n setActiveSessionIndex(0);\n setIsClearAllConfirmOpen(false);\n setIsMobileCartMenuOpen(false);\n };\n\n // Handle PDF download with selected price option\n const handlePdfDownload = async (withPrices: boolean) => {\n if (generatingPdf) return;\n setGeneratingPdf(true);\n try {\n const hasDeliveryQuote = deliveryLocation !== null;\n const pricingMealSessions = (pricing as any)?.mealSessions as\n | Array<{ deliveryFee?: number }>\n | undefined;\n // The API only sends non-empty sessions, so pricingMealSessions[i] corresponds\n // to the i-th non-empty local session. Build a local-index → deliveryFee map.\n const deliveryFeeByLocalIndex = new Map<number, number | undefined>();\n let pricingSessionIndex = 0;\n mealSessions.forEach((session, localIndex) => {\n if (session.orderItems.length > 0) {\n deliveryFeeByLocalIndex.set(\n localIndex,\n pricingMealSessions?.[pricingSessionIndex]?.deliveryFee,\n );\n pricingSessionIndex++;\n }\n });\n\n const sessionsForPreview: LocalMealSession[] = mealSessions.map(\n (session, index) => ({\n sessionName: session.sessionName,\n sessionDate: session.sessionDate,\n eventTime: session.eventTime,\n deliveryFee: hasDeliveryQuote\n ? deliveryFeeByLocalIndex.get(index)\n : undefined,\n orderItems: session.orderItems.map((orderItem) => ({\n item: {\n id: orderItem.item.id,\n menuItemName: orderItem.item.menuItemName,\n price: orderItem.item.price,\n discountPrice: orderItem.item.discountPrice,\n isDiscount: orderItem.item.isDiscount,\n image: orderItem.item.image,\n restaurantId: orderItem.item.restaurantId,\n cateringQuantityUnit: orderItem.item.cateringQuantityUnit,\n feedsPerUnit: orderItem.item.feedsPerUnit,\n categoryName: orderItem.item.categoryName,\n subcategoryName: orderItem.item.subcategoryName,\n selectedAddons: orderItem.item.selectedAddons,\n description: (orderItem.item as any).description,\n allergens: (orderItem.item as any).allergens,\n dietaryFilters: (orderItem.item as any).dietaryFilters,\n },\n quantity: orderItem.quantity,\n })),\n }),\n );\n\n const restaurantNameById = Object.fromEntries(\n restaurants.map((r) => [r.id, r.restaurant_name]),\n );\n const pdfAppliedPromotions = (pricing?.appliedPromotions || [])\n .map((p) => {\n const restaurantName = restaurantNameById[p.restaurantId];\n const label = restaurantName\n ? `${p.name} (${restaurantName})`\n : p.name;\n return { name: label, discountAmount: p.discount };\n })\n .filter((p) => p.discountAmount > 0);\n const pdfData = await transformLocalSessionsToPdfData(\n sessionsForPreview,\n withPrices,\n pricing?.deliveryFee || undefined,\n pricing?.promoDiscount || undefined,\n pdfAppliedPromotions.length > 0 ? pdfAppliedPromotions : undefined,\n );\n\n const blob = await pdf(\n <CateringMenuPdf\n sessions={pdfData.sessions}\n showPrices={pdfData.showPrices}\n deliveryCharge={pdfData.deliveryCharge}\n totalPrice={pricing?.total ?? pdfData.totalPrice}\n promoDiscount={pdfData.promoDiscount}\n appliedPromotions={pdfData.appliedPromotions}\n logoUrl={pdfData.logoUrl}\n />,\n ).toBlob();\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = withPrices\n ? \"catering-menu-with-prices.pdf\"\n : \"catering-menu.pdf\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n setShowPdfModal(false);\n } catch (error) {\n console.error(\"Failed to generate PDF:\", error);\n alert(\"Failed to generate PDF. Please try again.\");\n } finally {\n setGeneratingPdf(false);\n }\n };\n\n if (currentStep === 2) {\n return <CheckoutScreen />;\n }\n\n return (\n <div className=\"min-h-screen bg-base-100\">\n {/* Session Editor Modal */}\n {editingSessionIndex !== null && (\n <SessionEditor\n session={mealSessions[editingSessionIndex]}\n sessionIndex={editingSessionIndex}\n onUpdate={updateMealSession}\n onClose={handleEditorClose}\n restaurants={restaurants}\n existingDates={dayGroups\n .filter((d) => d.date !== \"unscheduled\")\n .map((d) => ({\n date: d.date,\n dayName: d.dayName,\n displayDate: d.displayDate,\n }))}\n />\n )}\n\n {/* Two-Column Layout */}\n <div className=\"flex flex-col md:flex-row px-2\">\n {/* Left Column: Session Nav + Menu Browser — centered in remaining space */}\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <DateSessionNav\n navMode={navMode}\n dayGroups={dayGroups}\n selectedDayDate={selectedDayDate}\n currentDayGroup={currentDayGroup}\n expandedSessionIndex={activeSessionIndex}\n\n onDateClick={handleDateClick}\n onBackToDates={handleBackToDates}\n onSessionPillClick={handleSessionPillClick}\n onAddDay={handleAddDay}\n onAddSessionToDay={handleAddSessionToDay}\n formatTimeDisplay={formatTimeDisplay}\n addDayNavButtonRef={addDayNavButtonRef}\n backButtonRef={backButtonRef}\n firstDayTabRef={firstDayTabRef}\n firstSessionPillRef={firstSessionPillRef}\n addSessionNavButtonRef={addSessionNavButtonRef}\n />\n <div className=\"max-w-6xl mx-auto w-full px-2 md:px-6\">\n <MenuBrowserColumn\n showBundleBrowser={showBundleBrowser}\n onToggleBundleBrowser={setShowBundleBrowser}\n sessionIndex={activeSessionIndex}\n defaultGuestCount={\n mealSessions[activeSessionIndex]?.guestCount ?? 1\n }\n restaurants={restaurants}\n restaurantsLoading={restaurantsLoading}\n onAddItem={handleAddItem}\n onUpdateQuantity={handleUpdateQuantity}\n onAddOrderPress={handleAddOrderPress}\n getItemQuantity={getItemQuantity}\n expandedItemId={expandedItemId}\n setExpandedItemId={setExpandedItemId}\n selectedDietaryFilters={selectedDietaryFilters}\n toggleDietaryFilter={toggleDietaryFilter}\n restaurantListRef={restaurantListRef}\n firstMenuItemRef={firstMenuItemRef}\n categoriesRowRef={categoriesRowRef}\n expandedSessionIndex={activeSessionIndex}\n onRegisterResetToList={(fn) => {\n resetRestaurantListRef.current = fn;\n }}\n onMobileSearchStateChange={setMobileSearchState}\n onRegisterMobileSearchSetter={handleRegisterMobileSearchSetter}\n />\n </div>\n </div>\n\n {/* Right Column: Basket — full-height sticky sidebar */}\n <div\n ref={basketColumnRef}\n className=\"hidden md:flex md:w-96 flex-shrink-0 flex-col sticky overflow-hidden\"\n style={{ top: stickyTopOffset, height: basketHeight }}\n >\n {mealSessions[activeSessionIndex] && (\n <div className=\"flex h-full flex-col gap-2 overflow-hidden\">\n <ActiveSessionPanel\n session={mealSessions[activeSessionIndex]}\n sessionIndex={activeSessionIndex}\n sessionTotal={getSessionTotal(activeSessionIndex)}\n sessionPromotions={\n getSessionDiscount(activeSessionIndex).promotions\n }\n validationError={\n sessionValidationErrors[activeSessionIndex] || null\n }\n isUnscheduled={!mealSessions[activeSessionIndex].sessionDate}\n canRemove={mealSessions.length > 1}\n onEditSession={() => setEditingSessionIndex(activeSessionIndex)}\n onRemoveSession={(e) =>\n handleRemoveSession(activeSessionIndex, e)\n }\n onEditItem={handleEditItem}\n onRemoveItem={handleRemoveItem}\n onSwapItem={handleSwapItem}\n onRemoveBundle={handleRemoveBundle}\n collapsedCategories={collapsedCategories}\n onToggleCategory={handleToggleCategory}\n onViewMenu={handleViewMenu}\n isCurrentSessionValid={isCurrentSessionValid}\n totalPrice={getTotalPrice()}\n onCheckout={handleCheckout}\n showCheckoutButton={false}\n restaurants={restaurants}\n />\n <div className=\"mt-auto flex-shrink-0 flex flex-col gap-1.5 pb-4\">\n {totalItems > 0 && (\n <div className=\"px-2 pb-1 border-t border-base-300 pt-3\">\n <PricingSummary\n pricing={pricing}\n calculatingPricing={calculatingPricing}\n compact\n onPlaceSelect={handleDeliveryPlaceSelect}\n onClearAddress={handleClearDeliveryAddress}\n />\n </div>\n )}\n <div className=\"flex w-full items-stretch gap-2 px-2\">\n {mealSessions.length > 0 && (\n <div className=\"relative flex-shrink-0\">\n <button\n ref={desktopMenuBtnRef}\n onClick={() => {\n if (\n !isDesktopCartMenuOpen &&\n desktopMenuBtnRef.current\n ) {\n const rect =\n desktopMenuBtnRef.current.getBoundingClientRect();\n setDesktopMenuPos({\n bottom: window.innerHeight - rect.top + 8,\n left: rect.left,\n });\n }\n setIsDesktopCartMenuOpen((v) => !v);\n }}\n className=\"flex h-full items-center justify-center rounded-lg border border-base-300 px-3 text-base-content/60 transition-colors hover:bg-base-200\"\n title=\"More options\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n {isDesktopCartMenuOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setIsDesktopCartMenuOpen(false)}\n />\n <div\n className=\"fixed z-50 w-44 overflow-hidden rounded-xl border border-base-200 bg-white shadow-lg\"\n style={{\n bottom: desktopMenuPos.bottom,\n left: desktopMenuPos.left,\n }}\n >\n <button\n onClick={() => {\n setIsDesktopCartMenuOpen(false);\n handleViewMenu();\n }}\n disabled={generatingPdf || totalItems === 0}\n className=\"flex w-full items-center gap-2 px-3 py-2.5 text-left text-sm text-gray-700 transition-colors hover:bg-base-100 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {generatingPdf ? (\n <span className=\"loading loading-spinner loading-xs\" />\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n )}\n Download Menu\n </button>\n <button\n onClick={() => {\n setIsDesktopCartMenuOpen(false);\n setIsClearAllConfirmOpen(true);\n }}\n className=\"flex w-full items-center gap-2 border-t border-base-200 px-3 py-2.5 text-left text-sm text-red-600 transition-colors hover:bg-red-50\"\n >\n <Trash2 className=\"h-4 w-4\" />\n Clear Cart\n </button>\n </div>\n </>\n )}\n </div>\n )}\n <button\n onClick={handleCheckout}\n className={`flex flex-1 items-center justify-center rounded-lg px-3 py-3 text-sm font-semibold text-white transition-colors ${\n isCurrentSessionValid\n ? \"bg-primary hover:bg-primary/90\"\n : \"bg-warning hover:bg-warning/90\"\n }`}\n >\n {isCurrentSessionValid ? \"Checkout\" : \"Min. Order Not Met\"}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Mobile: View Order Bar */}\n <div\n className=\"fixed left-0 right-0 md:hidden z-50\"\n style={{ bottom: keyboardOffset }}\n >\n {/* Session detail pill */}\n <div\n ref={mobileBarRowRef}\n className=\"relative mx-auto max-w-[325px] px-1 pt-1 pb-2\"\n >\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"relative\">\n <button\n onClick={() => setIsMobileCartMenuOpen((v) => !v)}\n className=\"flex h-11 w-11 items-center justify-center rounded-full border border-base-200 bg-white/70 text-gray-700 shadow-sm backdrop-blur-sm transition-colors hover:bg-white\"\n title=\"More actions\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n {isMobileCartMenuOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setIsMobileCartMenuOpen(false)}\n />\n <div className=\"absolute bottom-full left-0 z-50 mb-2 w-44 overflow-hidden rounded-xl border border-base-200 bg-white shadow-lg\">\n <button\n onClick={() => {\n setIsMobileCartMenuOpen(false);\n handleViewMenu();\n }}\n disabled={generatingPdf || totalItems === 0}\n className=\"flex w-full items-center gap-2 px-3 py-2.5 text-left text-sm text-gray-700 transition-colors hover:bg-base-100 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download Menu\n </button>\n <button\n onClick={() => {\n setIsMobileCartMenuOpen(false);\n resetTutorial();\n setNavMode(\"dates\");\n setSelectedDayDate(null);\n }}\n className=\"flex w-full items-center gap-2 px-3 py-2.5 text-left text-sm text-gray-700 transition-colors hover:bg-base-100\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n Tutorial\n </button>\n <div className=\"mx-3 border-t border-base-200\" />\n <button\n onClick={() => {\n setIsMobileCartMenuOpen(false);\n setIsClearAllConfirmOpen(true);\n }}\n className=\"flex w-full items-center gap-2 px-3 py-2.5 text-left text-sm text-red-600 transition-colors hover:bg-red-50\"\n >\n <Trash2 className=\"h-4 w-4\" />\n Clear Cart\n </button>\n </div>\n </>\n )}\n </div>\n <div className=\"relative h-11 min-w-0 flex-1 overflow-hidden rounded-full border border-base-200 bg-white/70 shadow-sm backdrop-blur-sm focus-within:border-primary\">\n {/* Pill content (visible when search is closed) */}\n <button\n type=\"button\"\n onClick={() => setEditingSessionIndex(activeSessionIndex)}\n className={`absolute inset-0 flex flex-col items-center justify-center px-4 py-1 transition duration-300 ease-out ${\n isMobileSearchOpen\n ? \"pointer-events-none -translate-y-full opacity-0\"\n : \"translate-y-0 opacity-100\"\n }`}\n aria-hidden={isMobileSearchOpen}\n tabIndex={isMobileSearchOpen ? -1 : 0}\n >\n <span className=\"w-full truncate text-center text-xs font-semibold text-gray-800\">\n {mealSessions[activeSessionIndex]?.sessionName}\n </span>\n <span className=\"w-full truncate text-center text-[10px] text-gray-500\">\n {mealSessions[activeSessionIndex]?.sessionDate\n ? new Date(\n mealSessions[activeSessionIndex].sessionDate,\n ).toLocaleDateString(\"en-GB\", {\n day: \"numeric\",\n month: \"short\",\n })\n : \"Date not set\"}\n {mealSessions[activeSessionIndex]?.eventTime &&\n `\\u2009·\\u2009${formatTimeDisplay(mealSessions[activeSessionIndex].eventTime)}`}\n </span>\n </button>\n {/* Input content (visible when search is open) */}\n <div\n className={`absolute inset-0 transition duration-300 ease-out ${\n isMobileSearchOpen\n ? \"translate-y-0 opacity-100\"\n : \"pointer-events-none translate-y-full opacity-0\"\n }`}\n aria-hidden={!isMobileSearchOpen}\n >\n <Search className=\"pointer-events-none absolute left-3 top-1/2 z-10 h-4 w-4 -translate-y-1/2 text-gray-400\" />\n <input\n ref={mobileSearchInputRef}\n type=\"text\"\n value={mobileSearchState.query}\n onChange={(e) => handleMobileSearchInputChange(e.target.value)}\n placeholder=\"Search Swift Food\"\n tabIndex={isMobileSearchOpen ? 0 : -1}\n className={`h-full w-full rounded-full bg-transparent pl-9 pr-3 text-base placeholder:text-xs focus:outline-none ${\n mobileSearchCaretVisible ? \"\" : \"caret-transparent\"\n }`}\n />\n </div>\n </div>\n <button\n onClick={isMobileSearchOpen ? closeMobileSearch : openMobileSearch}\n className=\"flex h-11 w-11 items-center justify-center rounded-full border border-base-200 bg-white/70 text-gray-700 shadow-sm backdrop-blur-sm transition-colors hover:bg-white\"\n title={isMobileSearchOpen ? \"Close search\" : \"Search\"}\n aria-label={isMobileSearchOpen ? \"Close search\" : \"Open search\"}\n type=\"button\"\n >\n {isMobileSearchOpen ? (\n <X className=\"h-4 w-4\" />\n ) : (\n <Search className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n {/* View Order bar */}\n {mealSessions.some((s) => s.orderItems.length > 0) && (\n <div className=\"p-4 bg-primary\">\n <button\n onClick={() => setIsViewOrderOpen(true)}\n className=\"w-full flex items-center justify-between text-white\"\n >\n <div className=\"flex items-center gap-2\">\n <ShoppingBag className=\"w-5 h-5\" />\n <span className=\"font-semibold\">View Order</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg font-bold\">\n £{getTotalPrice().toFixed(2)}\n </span>\n <span className=\"text-sm opacity-80\">{totalItems} items</span>\n </div>\n </button>\n </div>\n )}\n </div>\n\n {/* Mobile: View Order Modal */}\n <ViewOrderModal\n isOpen={isViewOrderOpen}\n onClose={() => setIsViewOrderOpen(false)}\n mealSessions={mealSessions}\n activeSessionIndex={activeSessionIndex}\n onSessionChange={setActiveSessionIndex}\n getSessionTotal={getSessionTotal}\n getSessionDiscount={getSessionDiscount}\n validationErrors={sessionValidationErrors}\n onEditSession={(index) => {\n setIsViewOrderOpen(false);\n setEditingSessionIndex(index);\n }}\n onRemoveSession={(index, e) => handleRemoveSession(index, e)}\n onEditItem={handleEditItem}\n onRemoveItem={handleRemoveItem}\n onSwapItem={handleSwapItem}\n onRemoveBundle={handleRemoveBundle}\n collapsedCategories={collapsedCategories}\n onToggleCategory={handleToggleCategory}\n onViewMenu={handleViewMenu}\n generatingPdf={generatingPdf}\n isCurrentSessionValid={isCurrentSessionValid}\n totalPrice={getTotalPrice()}\n onCheckout={handleCheckout}\n canRemoveSession={() => mealSessions.length > 1}\n formatTimeDisplay={formatTimeDisplay}\n navMode={navMode}\n dayGroups={dayGroups}\n selectedDayDate={selectedDayDate}\n currentDayGroup={currentDayGroup}\n onDateClick={handleDateClick}\n onBackToDates={handleBackToDates}\n onAddDay={handleAddDay}\n onAddSessionToDay={handleAddSessionToDay}\n restaurants={restaurants}\n pricing={pricing}\n calculatingPricing={calculatingPricing}\n onPlaceSelect={handleDeliveryPlaceSelect}\n onClearAddress={handleClearDeliveryAddress}\n />\n\n {/* Edit Item Modal */}\n {isEditModalOpen && editingItemIndex !== null && (\n <MenuItemModal\n item={\n mealSessions[activeSessionIndex].orderItems[editingItemIndex]\n .item as MenuItem\n }\n isOpen={isEditModalOpen}\n onClose={() => {\n setIsEditModalOpen(false);\n setEditingItemIndex(null);\n }}\n quantity={\n mealSessions[activeSessionIndex].orderItems[editingItemIndex]\n .quantity\n }\n isEditMode={true}\n editingIndex={editingItemIndex}\n onAddItem={handleSaveEditedItem}\n onRemoveItem={(index) => {\n removeMenuItemByIndex(activeSessionIndex, index);\n setIsEditModalOpen(false);\n setEditingItemIndex(null);\n }}\n />\n )}\n\n {/* Pending Item Modal */}\n {pendingItem && (\n <MenuItemModal\n item={pendingItem}\n isOpen={true}\n onClose={() => setPendingItem(null)}\n quantity={0}\n onAddItem={(item) => {\n handleAddItem(item);\n setPendingItem(null);\n }}\n />\n )}\n\n {/* Empty Session Warning Modal */}\n {emptySessionIndex !== null && (\n <EmptySessionWarningModal\n sessionName={\n mealSessions[emptySessionIndex]?.sessionName || \"Session\"\n }\n onRemove={handleRemoveEmptySession}\n onAddItems={handleAddItemsToEmptySession}\n />\n )}\n\n {/* Remove Item Confirmation Modal */}\n {removeItemIndex !== null && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-[100] p-4\">\n <div className=\"bg-white rounded-2xl max-w-md w-full p-6 shadow-xl\">\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"w-12 h-12 rounded-full bg-red-100 flex items-center justify-center\">\n <X className=\"h-6 w-6 text-red-600\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Remove Item</h3>\n <p className=\"text-sm text-gray-500\">\n {mealSessions[activeSessionIndex]?.orderItems[removeItemIndex]\n ?.item.menuItemName || \"Item\"}\n </p>\n </div>\n </div>\n <p className=\"text-gray-600 mb-6\">\n Are you sure you want to remove this item from your order?\n </p>\n <div className=\"flex gap-3\">\n <button\n onClick={() => setRemoveItemIndex(null)}\n className=\"flex-1 px-4 py-3 border border-base-300 text-gray-600 rounded-xl hover:bg-base-100 transition-colors font-medium\"\n >\n Cancel\n </button>\n <button\n onClick={confirmRemoveItem}\n className=\"flex-1 px-4 py-3 bg-red-500 text-white rounded-xl hover:bg-red-600 transition-colors font-medium\"\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Remove Session Confirmation Modal */}\n {sessionToRemove !== null && (\n <RemoveSessionConfirmModal\n sessionName={mealSessions[sessionToRemove]?.sessionName || \"Session\"}\n onConfirm={confirmRemoveSession}\n onCancel={() => setSessionToRemove(null)}\n />\n )}\n\n {/* Clear All Items Confirmation Modal */}\n {isClearAllConfirmOpen && (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-md rounded-2xl bg-white p-6 shadow-xl\">\n <div className=\"mb-4 flex items-center gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-red-100\">\n <Trash2 className=\"h-6 w-6 text-red-600\" />\n </div>\n <div>\n <h3 className=\"text-lg font-bold text-gray-900\">Clear Cart</h3>\n <p className=\"text-sm text-gray-500\">\n Remove all items and sessions\n </p>\n </div>\n </div>\n <p className=\"mb-6 text-gray-600\">\n This will delete every session and remove all items you&apos;ve\n added, returning your order to a single empty session. This action\n cannot be undone.\n </p>\n <div className=\"flex gap-3\">\n <button\n onClick={() => setIsClearAllConfirmOpen(false)}\n className=\"flex-1 rounded-xl border border-base-300 px-4 py-3 font-medium text-gray-600 transition-colors hover:bg-base-100\"\n >\n Cancel\n </button>\n <button\n onClick={handleClearAllItems}\n className=\"flex-1 rounded-xl bg-red-500 px-4 py-3 font-medium text-white transition-colors hover:bg-red-600\"\n >\n Clear All\n </button>\n </div>\n </div>\n </div>\n )}\n\n <ValidationAlertModal\n isOpen={checkoutConflict !== null}\n onClose={() => setCheckoutConflict(null)}\n title=\"Can't check out yet\"\n message={\n checkoutConflict ? (\n <>\n <strong>{checkoutConflict.restaurantName}</strong>\n {checkoutConflict.message.slice(\n checkoutConflict.restaurantName.length,\n )}\n </>\n ) : (\n \"\"\n )\n }\n primaryAction={\n checkoutConflict\n ? {\n label: `Remove all ${checkoutConflict.restaurantName} items from this session`,\n onClick: () => {\n const { sessionIndex, restaurantId } = checkoutConflict;\n const session = mealSessions[sessionIndex];\n if (session) {\n const indices = session.orderItems\n .map((oi, idx) =>\n oi.item.restaurantId === restaurantId ? idx : -1,\n )\n .filter((idx) => idx !== -1)\n .sort((a, b) => b - a);\n indices.forEach((idx) =>\n removeMenuItemByIndex(sessionIndex, idx),\n );\n }\n setSessionValidationErrors((prev) => {\n const next = { ...prev };\n delete next[sessionIndex];\n return next;\n });\n setCheckoutConflict(null);\n },\n }\n : undefined\n }\n secondaryAction={\n checkoutConflict\n ? {\n label: \"Change session date & time\",\n onClick: () => {\n setEditingSessionIndex(checkoutConflict.sessionIndex);\n setCheckoutConflict(null);\n },\n }\n : undefined\n }\n />\n\n {/* Min Order Modal */}\n {minOrderModalSession !== null && (\n <MinOrderModal\n sessionName={\n mealSessions[minOrderModalSession.index]?.sessionName || \"Session\"\n }\n validationStatus={minOrderModalSession.validation}\n onClose={() => setMinOrderModalSession(null)}\n onNavigateToSection={handleMinOrderNavigate}\n />\n )}\n\n {showHalkinModal && (\n <HalkinVenueModal onClose={() => setShowHalkinModal(false)} />\n )}\n\n {/* PDF Download Modal */}\n {showPdfModal && (\n <PdfDownloadModal\n onDownload={handlePdfDownload}\n onClose={() => setShowPdfModal(false)}\n isGenerating={generatingPdf}\n />\n )}\n\n {/* Swap Item Modal */}\n {swapItemIndex !== null && (\n <SwapItemModal\n currentItem={\n mealSessions[activeSessionIndex]?.orderItems[swapItemIndex]\n ?.item as MenuItem\n }\n currentQuantity={\n mealSessions[activeSessionIndex]?.orderItems[swapItemIndex]\n ?.quantity ?? 0\n }\n alternatives={swapAlternatives}\n isOpen={true}\n onClose={() => {\n setSwapItemIndex(null);\n setSwapAlternatives([]);\n }}\n onSwap={handleConfirmSwap}\n />\n )}\n\n {/* Tutorial Tooltip */}\n <TutorialTooltip\n step={currentTutorialStep}\n onNext={handleTutorialNext}\n onSkip={handleSkipTutorial}\n currentStepIndex={tutorialStep ?? 0}\n totalSteps={getTutorialSteps().length}\n />\n\n {/* Tutorial Help Button */}\n <button\n onClick={() => {\n resetTutorial();\n setNavMode(\"dates\");\n setSelectedDayDate(null);\n }}\n className=\"hidden md:flex fixed bottom-4 left-4 md:bottom-8 md:left-8 w-10 h-10 md:w-12 md:h-12 bg-white border border-base-300 rounded-full shadow-lg items-center justify-center text-gray-500 hover:text-primary hover:border-primary transition-colors z-40\"\n title=\"Restart Tutorial\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5 md:h-6 md:w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n </button>\n </div>\n );\n}\n","import {\n useEffect,\n useMemo,\n useState,\n type CSSProperties,\n type ReactElement,\n} from \"react\";\nimport type { CateringWidgetProps } from \"./types/public\";\nimport {\n CateringConfigProvider,\n type CateringConfig,\n} from \"./config/CateringConfigContext\";\nimport { createApiClient } from \"./api/client\";\nimport { createApiEndpoints } from \"./api/endpoints\";\nimport { createStorage } from \"./storage/storage\";\nimport { CateringStateProvider } from \"./state/CateringStateContext\";\nimport { CateringFilterProvider } from \"./state/CateringFilterContext\";\nimport CateringOrderBuilder from \"./components/CateringOrderBuilder\";\nimport { setCateringServiceEndpoints } from \"./shims/cateringService\";\n\nconst STUB_PARTNER_ID = \"stub\";\n\nexport function CateringWidget(props: CateringWidgetProps): ReactElement {\n const {\n publishableKey,\n theme,\n initialData,\n stickyTopOffset,\n onReady,\n onOrderComplete,\n onError,\n } = props;\n\n const partnerId = STUB_PARTNER_ID;\n\n const [baseConfig] = useState(() => {\n const apiClient = createApiClient({ publishableKey });\n const api = createApiEndpoints(apiClient);\n setCateringServiceEndpoints(api);\n return {\n publishableKey,\n partnerId,\n theme,\n initialData,\n onReady,\n onOrderComplete,\n onError,\n api,\n storage: createStorage(partnerId),\n };\n });\n\n const config = useMemo<CateringConfig>(\n () => ({ ...baseConfig, stickyTopOffset }),\n [baseConfig, stickyTopOffset]\n );\n\n useEffect(() => {\n onReady?.();\n }, [onReady]);\n\n const style = useMemo<CSSProperties>(() => {\n const vars: Record<string, string> = {};\n if (theme?.primary) vars[\"--swift-primary\"] = theme.primary;\n if (theme?.radius) vars[\"--swift-radius\"] = theme.radius;\n if (theme?.font) vars[\"--swift-font\"] = theme.font;\n return vars as CSSProperties;\n }, [theme]);\n\n return (\n <div className=\"swift-catering-widget\" style={style}>\n <CateringConfigProvider value={config}>\n <CateringStateProvider>\n <CateringFilterProvider>\n <CateringOrderBuilder />\n </CateringFilterProvider>\n </CateringStateProvider>\n </CateringConfigProvider>\n </div>\n );\n}\n"]}