"use client"; import { eateryClient } from "@/lib/apollo-clients"; import { useAuth } from "@/lib/auth-context"; import { MenuItemEntity, addMenuItemMutation, allEateriesQuery, } from "@/lib/types"; import { gql } from "@apollo/client"; import { useMutation, useQuery } from "@apollo/client/react"; import { useEffect, useState } from "react"; const GET_EATERY_MENU = gql` query GetEateryMenu { allEateries { id menuItems { id name price } } } `; const ADD_MENU_ITEM = gql` mutation addMenuItem($menuItem: AddMenuItemInput!) { addMenuItem(menuItem: $menuItem) { id name price } } `; function formatPrice(price: number) { return price.toLocaleString("vi-VN") + "đ"; } export default function MenuItemsTab() { const { user } = useAuth(); const [menuItems, setMenuItems] = useState([]); const { data, loading: gqlLoading, error: gqlError, } = useQuery(GET_EATERY_MENU, { client: eateryClient, fetchPolicy: "network-only", }); const [mutateAddMenuItem] = useMutation(ADD_MENU_ITEM, { client: eateryClient, }); const [showForm, setShowForm] = useState(false); const [newName, setNewName] = useState(""); const [newPrice, setNewPrice] = useState(""); const [submitting, setSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); useEffect(() => { if (data?.allEateries?.[0]) { setMenuItems(data.allEateries[0].menuItems); } }, [data]); const handleAdd = async (e: React.FormEvent) => { e.preventDefault(); if (!newName.trim() || !newPrice) return; setSubmitting(true); setSubmitError(null); try { const { data: mutationResult } = await mutateAddMenuItem({ variables: { menuItem: { name: newName, price: parseFloat(newPrice), }, }, }); if (mutationResult?.addMenuItem) { setMenuItems((prev) => [...prev, mutationResult.addMenuItem]); closeForm(); } } catch (err: any) { console.error("Mutation Error:", err); setSubmitError(err.message || "Không thể thêm món. Vui lòng thử lại."); } finally { setSubmitting(false); } }; const closeForm = () => { setShowForm(false); setSubmitError(null); setNewName(""); setNewPrice(""); }; if (gqlLoading && menuItems.length === 0) return
Đang tải menu...
; if (gqlError) return (
Lỗi: {gqlError.message}
); return (
{/* Toolbar */}

{menuItems.length} món trong menu

{/* Table */}
{menuItems.length === 0 ? ( ) : ( menuItems.map((item) => ( )) )}
Tên món Giá
Chưa có món nào trong menu

{item.name}

{formatPrice(item.price)}
{/* Add Item Modal */} {showForm && (

Thêm món mới

setNewName(e.target.value)} placeholder="Nhập tên món..." required className="text-foreground w-full rounded-xl border border-(--color-border) bg-white px-3 py-2 text-sm transition outline-none focus:border-(--color-primary) focus:ring-2 focus:ring-(--color-primary)/20" />
setNewPrice(e.target.value)} placeholder="Nhập giá..." required min={0} step={500} className="text-foreground w-full rounded-xl border border-(--color-border) bg-white px-3 py-2 text-sm transition outline-none focus:border-(--color-primary) focus:ring-2 focus:ring-(--color-primary)/20" />
{submitError && (

{submitError}

)}
)}
); }