'use client' import { useState } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' 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 { Switch } from '@/components/ui/switch' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Save, Upload, X, Plus, Edit } from 'lucide-react' import { toast } from 'sonner' import Image from 'next/image' interface Category { id?: string name: string description: string image: string | null isActive: boolean } interface CategoryFormDialogProps { category?: Category onSuccess?: () => void trigger?: React.ReactNode mode?: 'create' | 'edit' } export function CategoryFormDialog({ category, onSuccess, trigger, mode = category ? 'edit' : 'create' }: CategoryFormDialogProps) { const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const [formData, setFormData] = useState({ name: '', description: '', image: null, isActive: true, ...category }) const handleInputChange = (field: keyof Category, value: any) => { setFormData(prev => ({ ...prev, [field]: value })) } const handleImageUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (!file) return // Mock image upload - replace with actual upload logic const imageUrl = URL.createObjectURL(file) setFormData(prev => ({ ...prev, image: imageUrl })) } const removeImage = () => { setFormData(prev => ({ ...prev, image: null })) } const resetForm = () => { setFormData({ name: '', description: '', image: null, isActive: true, ...category }) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) try { const url = mode === 'edit' && category?.id ? `/api/admin/categories/${category.id}` : '/api/admin/categories' const method = mode === 'edit' ? 'PATCH' : 'POST' const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }) if (!response.ok) { const errorData = await response.json() throw new Error(errorData.error || 'Failed to save category') } toast.success(`Category ${mode === 'edit' ? 'updated' : 'created'} successfully`) setOpen(false) resetForm() onSuccess?.() } catch (error: any) { toast.error(error.message || `Failed to ${mode === 'edit' ? 'update' : 'create'} category`) } finally { setLoading(false) } } const defaultTrigger = mode === 'edit' ? ( ) : ( ) return ( {trigger || defaultTrigger} {mode === 'edit' ? 'Edit Category' : 'Create New Category'}
Category Information
handleInputChange('name', e.target.value)} required />