'use client' import { useState, useTransition, useEffect } from 'react' import type { Category, MenuItem } from '@/data/menu' import { saveEntireMenu } from '@/app/actions/menu' import { uploadImage } from '@/app/actions/upload' export default function AdminDashboard({ initialCategories }: { initialCategories: Category[] }) { const [categories, setCategories] = useState(initialCategories) const [isPending, startTransition] = useTransition() const [isSaved, setIsSaved] = useState(false) const [selectedCatId, setSelectedCatId] = useState(initialCategories[0]?.id || null) // Auto-select first category if selected one is deleted useEffect(() => { if (selectedCatId && !categories.find(c => c.id === selectedCatId) && categories.length > 0) { setSelectedCatId(categories[0].id) } }, [categories, selectedCatId]) const handleSave = () => { startTransition(async () => { await saveEntireMenu(categories) setIsSaved(true) setTimeout(() => setIsSaved(false), 3000) }) } const handleImageUpload = async (catId: string, itemId: string, e: React.ChangeEvent) => { const file = e.target.files?.[0] if (!file) return const formData = new FormData() formData.append('file', file) try { const res = await uploadImage(formData) if (res?.url) { updateItem(catId, itemId, 'image', res.url) } } catch (err) { console.error(err) alert("Resim yüklenemedi.") } } // --- Item CRUD --- const updateItem = (catId: string, itemId: string, field: string, value: any, lang?: 'tr' | 'en') => { setCategories(cats => cats.map(cat => { if (cat.id !== catId) return cat return { ...cat, items: cat.items.map(item => { if (item.id !== itemId) return item if (lang) { return { ...item, [field]: { ...(item as any)[field], [lang]: value } } } return { ...item, [field]: value } }) } })) } const addItem = (catId: string) => { const newItem: MenuItem = { id: `item-${Date.now()}`, name: { tr: 'Yeni Ürün', en: 'New Item' }, description: { tr: '', en: '' }, price: 0, highlight: false, } setCategories(cats => cats.map(cat => { if (cat.id !== catId) return cat return { ...cat, items: [...cat.items, newItem] } })) } const deleteItem = (catId: string, itemId: string) => { if (!confirm('Bu ürünü silmek istediğinize emin misiniz?')) return setCategories(cats => cats.map(cat => { if (cat.id !== catId) return cat return { ...cat, items: cat.items.filter(item => item.id !== itemId) } })) } const moveItem = (catId: string, itemIndex: number, direction: 'up' | 'down') => { setCategories(cats => cats.map(cat => { if (cat.id !== catId) return cat const newItems = [...cat.items] if (direction === 'up' && itemIndex > 0) { [newItems[itemIndex - 1], newItems[itemIndex]] = [newItems[itemIndex], newItems[itemIndex - 1]] } else if (direction === 'down' && itemIndex < newItems.length - 1) { [newItems[itemIndex + 1], newItems[itemIndex]] = [newItems[itemIndex], newItems[itemIndex + 1]] } return { ...cat, items: newItems } })) } // --- Category CRUD --- const updateCategory = (catId: string, field: string, value: any, lang?: 'tr' | 'en') => { setCategories(cats => cats.map(cat => { if (cat.id !== catId) return cat if (lang && field === 'label') { return { ...cat, label: { ...cat.label, [lang]: value } } } return { ...cat, [field]: value } })) } const addCategory = () => { const newCategory: Category = { id: `cat-${Date.now()}`, emoji: '🍽️', label: { tr: 'Yeni Kategori', en: 'New Category' }, items: [], } setCategories(cats => [...cats, newCategory]) setSelectedCatId(newCategory.id) } const deleteCategory = (catId: string) => { if (!confirm('Bu kategoriyi ve içindeki tüm ürünleri silmek istediğinize emin misiniz?')) return setCategories(cats => cats.filter(cat => cat.id !== catId)) } const moveCategory = (catIndex: number, direction: 'up' | 'down') => { setCategories(cats => { const newCats = [...cats] if (direction === 'up' && catIndex > 0) { [newCats[catIndex - 1], newCats[catIndex]] = [newCats[catIndex], newCats[catIndex - 1]] } else if (direction === 'down' && catIndex < newCats.length - 1) { [newCats[catIndex + 1], newCats[catIndex]] = [newCats[catIndex], newCats[catIndex + 1]] } return newCats }) } const selectedCategory = categories.find(c => c.id === selectedCatId) return (
{/* Top Bar */}

Menü Yönetimi

{/* Left Sidebar (Categories) */}
{categories.map((cat, catIndex) => (
setSelectedCatId(cat.id)} >
{cat.emoji} {cat.label.tr}
{/* Category Actions (visible on hover or when selected) */}
))} {categories.length === 0 && (
Kategori bulunamadı.
)}
{/* Right Content (Items) */}
{selectedCategory ? (
{/* Category Edit Header */}

Kategori Ayarları

updateCategory(selectedCategory.id, 'emoji', e.target.value)} className="w-14 h-14 text-center text-3xl border border-gray-300 rounded-xl bg-gray-50" title="Kategori Emojisi" /> Emoji
updateCategory(selectedCategory.id, 'label', e.target.value, 'tr')} className="w-full px-3 py-2 border rounded-md font-bold text-coffee bg-gray-50" />
updateCategory(selectedCategory.id, 'label', e.target.value, 'en')} className="w-full px-3 py-2 border rounded-md text-gray-600 bg-gray-50" />
{/* Items List */}

Ürünler ({selectedCategory.items.length})

{selectedCategory.items.map((item, itemIndex) => (
{/* Item Actions (Top Right) */}
{/* TR Fields */}
Türkçe (TR)
updateItem(selectedCategory.id, item.id, 'name', e.target.value, 'tr')} className="w-full text-sm px-3 py-2 border rounded-md bg-gray-50 focus:bg-white" />