import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Plus, X, Loader2 } from 'lucide-react'; import { toast } from 'react-toastify'; import { categoriesService, type PhotoCategory } from '../../services/categories.service'; import { Button } from '../common'; import { useTranslation } from 'react-i18next'; interface EventCategoryManagerProps { eventId: number; } export const EventCategoryManager: React.FC = ({ eventId }) => { const queryClient = useQueryClient(); const { t } = useTranslation(); const [isAdding, setIsAdding] = useState(false); const [newCategoryName, setNewCategoryName] = useState(''); // Fetch categories for this event const { data: categories = [], isLoading } = useQuery({ queryKey: ['event-categories', eventId], queryFn: () => categoriesService.getEventCategories(eventId), }); // Filter to show only event-specific categories const eventCategories = categories.filter(cat => !cat.is_global); // Create category mutation const createMutation = useMutation({ mutationFn: (name: string) => categoriesService.createCategory({ name, is_global: false, event_id: eventId }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['event-categories', eventId] }); toast.success(t('categories.categoryCreatedSuccess')); setNewCategoryName(''); setIsAdding(false); }, onError: (error: any) => { toast.error(error.response?.data?.error || t('categories.failedToCreateCategory')); }, }); // Delete category mutation const deleteMutation = useMutation({ mutationFn: categoriesService.deleteCategory, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['event-categories', eventId] }); toast.success(t('categories.categoryDeletedSuccess')); }, onError: (error: any) => { toast.error(error.response?.data?.error || t('categories.failedToDeleteCategory')); }, }); const handleCreate = () => { if (newCategoryName.trim()) { createMutation.mutate(newCategoryName.trim()); } }; const handleDelete = (category: PhotoCategory) => { if (window.confirm(t('categories.deleteConfirm', { name: category.name }))) { deleteMutation.mutate(category.id); } }; if (isLoading) { return (
); } return (

{t('categories.eventSpecificCategories')}

{!isAdding && ( )}
{/* Add new category form */} {isAdding && (
setNewCategoryName(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleCreate()} placeholder={t('categories.categoryName')} className="flex-1 px-3 py-1.5 text-sm border border-neutral-300 rounded-md focus:ring-2 focus:ring-primary-500" autoFocus />
)} {/* Event categories list */} {eventCategories.length === 0 ? (

{t('categories.noEventSpecificCategories')}

) : (
{eventCategories.map((category) => (
{category.name}
))}
)} {/* Show available global categories */}

{t('categories.globalCategoriesAlwaysAvailable')}

{categories .filter(cat => cat.is_global) .map(cat => ( {cat.name} ))}
); }; EventCategoryManager.displayName = 'EventCategoryManager';