'use client'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { createMenu, updateMenu, deleteMenu } from '../actions'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Pencil, Trash2, Plus, X } from 'lucide-react'; // Schema for form - will be created dynamically with translations const createFormSchema = (translations: Record) => z.object({ nameId: z.string().min(1, translations.nameIdRequired), nameEn: z.string().optional(), descriptionId: z.string().min(1, translations.descriptionIdRequired), descriptionEn: z.string().optional(), slug: z.string().min(1, translations.slugRequired), parentId: z.string().optional().nullable(), isActive: z.boolean().default(true), }); type Menu = { id: string; name: any; slug: string; description: any; parentId: string | null; isActive: boolean; children?: Menu[]; parent?: { name: any } | null; }; type FormData = { nameId: string; nameEn?: string; descriptionId: string; descriptionEn?: string; slug: string; parentId?: string | null; isActive?: boolean; }; export default function MenuClient({ initialMenus, translations }: { initialMenus: Menu[]; translations: Record }) { const [isEditing, setIsEditing] = useState(false); const [currentMenu, setCurrentMenu] = useState(null); const [isFormOpen, setIsFormOpen] = useState(false); const formSchema = createFormSchema(translations); const { register, handleSubmit, reset, setValue, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(formSchema), defaultValues: { isActive: true, }, }); const onSubmit = async (data: FormData) => { const formData = new FormData(); formData.append('nameId', data.nameId); if (data.nameEn) formData.append('nameEn', data.nameEn); formData.append('descriptionId', data.descriptionId); if (data.descriptionEn) formData.append('descriptionEn', data.descriptionEn); formData.append('slug', data.slug); if (data.parentId) formData.append('parentId', data.parentId); else formData.append('parentId', 'null'); if (data.isActive) formData.append('isActive', 'on'); let result; if (isEditing && currentMenu) { result = await updateMenu(currentMenu.id, null, formData); } else { result = await createMenu(null, formData); } if (result.success) { resetForm(); } else { alert(result.error || translations.errorOccurred); } }; const handleEdit = (menu: Menu) => { setCurrentMenu(menu); setIsEditing(true); setIsFormOpen(true); setValue('nameId', menu.name.id || menu.name); setValue('nameEn', menu.name.en || ''); setValue('descriptionId', menu.description.id || menu.description); setValue('descriptionEn', menu.description.en || ''); setValue('slug', menu.slug); setValue('parentId', menu.parentId || 'null'); setValue('isActive', menu.isActive); }; const handleDelete = async (id: string) => { if (confirm(translations.confirmDelete)) { await deleteMenu(id); } }; const resetForm = () => { reset({ isActive: true, parentId: 'null' }); setIsEditing(false); setCurrentMenu(null); setIsFormOpen(false); }; const getLocalizedName = (name: any) => { if (typeof name === 'string') return name; return name.id || name.en || JSON.stringify(name); } return (

{translations.title}

{isFormOpen && (

{isEditing ? translations.editTitle : translations.addTitle}

{errors.nameId &&

{errors.nameId.message}

}