"use client" import { useState } from 'react' import { useQuery, useMutation } from '@apollo/client' 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 { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog' import { GET_CATEGORIES } from '@/graphql/queries' import { CREATE_CATEGORY, UPDATE_CATEGORY, DELETE_CATEGORY } from '@/graphql/mutations' import { Plus, Edit, Trash2, Package } from 'lucide-react' import { toast } from 'sonner' interface Category { id: string name: string createdAt: string updatedAt: string } export function CategoriesSection() { const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const [editingCategory, setEditingCategory] = useState(null) const [newCategoryName, setNewCategoryName] = useState('') const [editCategoryName, setEditCategoryName] = useState('') const formatDate = (dateString: string) => { try { const date = new Date(dateString) if (isNaN(date.getTime())) { return 'Неизвестно' } return date.toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' }) } catch (error) { return 'Неизвестно' } } const { data, loading, error, refetch } = useQuery(GET_CATEGORIES) const [createCategory, { loading: creating }] = useMutation(CREATE_CATEGORY) const [updateCategory, { loading: updating }] = useMutation(UPDATE_CATEGORY) const [deleteCategory, { loading: deleting }] = useMutation(DELETE_CATEGORY) const categories: Category[] = data?.categories || [] const handleCreateCategory = async () => { if (!newCategoryName.trim()) { toast.error('Введите название категории') return } try { const { data } = await createCategory({ variables: { input: { name: newCategoryName.trim() } } }) if (data?.createCategory?.success) { toast.success('Категория успешно создана') setNewCategoryName('') setIsCreateDialogOpen(false) refetch() } else { toast.error(data?.createCategory?.message || 'Ошибка при создании категории') } } catch (error) { console.error('Error creating category:', error) toast.error('Ошибка при создании категории') } } const handleEditCategory = (category: Category) => { setEditingCategory(category) setEditCategoryName(category.name) setIsEditDialogOpen(true) } const handleUpdateCategory = async () => { if (!editingCategory || !editCategoryName.trim()) { toast.error('Введите название категории') return } try { const { data } = await updateCategory({ variables: { id: editingCategory.id, input: { name: editCategoryName.trim() } } }) if (data?.updateCategory?.success) { toast.success('Категория успешно обновлена') setEditingCategory(null) setEditCategoryName('') setIsEditDialogOpen(false) refetch() } else { toast.error(data?.updateCategory?.message || 'Ошибка при обновлении категории') } } catch (error) { console.error('Error updating category:', error) toast.error('Ошибка при обновлении категории') } } const handleDeleteCategory = async (categoryId: string) => { try { const { data } = await deleteCategory({ variables: { id: categoryId } }) if (data?.deleteCategory) { toast.success('Категория успешно удалена') refetch() } else { toast.error('Ошибка при удалении категории') } } catch (error) { console.error('Error deleting category:', error) const errorMessage = error instanceof Error ? error.message : 'Ошибка при удалении категории' toast.error(errorMessage) } } const handleCreateBasicCategories = async () => { const basicCategories = [ 'Электроника', 'Одежда', 'Обувь', 'Дом и сад', 'Красота и здоровье', 'Спорт и отдых', 'Автотовары', 'Детские товары', 'Продукты питания', 'Книги и канцелярия' ] try { for (const categoryName of basicCategories) { await createCategory({ variables: { input: { name: categoryName } } }) } toast.success('Базовые категории созданы') refetch() } catch (error) { console.error('Error creating basic categories:', error) toast.error('Ошибка при создании категорий') } } if (loading) { return (

Категории товаров

) } if (error) { return (

Категории товаров

Ошибка загрузки категорий

) } return (

Категории товаров

Управление категориями для классификации товаров

{categories.length === 0 && ( )} Создать новую категорию
setNewCategoryName(e.target.value)} placeholder="Введите название..." className="glass-input text-white placeholder:text-white/50" onKeyDown={(e) => e.key === 'Enter' && handleCreateCategory()} />
Список категорий ({categories.length}) {categories.length === 0 ? (

Нет категорий

Создайте категории для классификации товаров

) : (
{categories.map((category) => (

{category.name}

Создано: {formatDate(category.createdAt)}

Удалить категорию Вы уверены, что хотите удалить категорию "{category.name}"? Это действие нельзя отменить. Если в категории есть товары, удаление будет невозможно. Отмена handleDeleteCategory(category.id)} className="bg-red-600 hover:bg-red-700 text-white" disabled={deleting} > {deleting ? 'Удаление...' : 'Удалить'}
))}
)}
{/* Диалог редактирования */} Редактировать категорию
setEditCategoryName(e.target.value)} placeholder="Введите название..." className="glass-input text-white placeholder:text-white/50" onKeyDown={(e) => e.key === 'Enter' && handleUpdateCategory()} />
) }