"use client"; import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { LoadingSpinner } from "@/components/common/LoadingSpinner"; import { CodeCategoryFormModal } from "./CodeCategoryFormModal"; import { CategoryItem } from "./CategoryItem"; import { AlertModal } from "@/components/common/AlertModal"; import { Search, Plus } from "lucide-react"; import { useCategories, useDeleteCategory } from "@/hooks/queries/useCategories"; interface CodeCategoryPanelProps { selectedCategoryCode: string; onSelectCategory: (categoryCode: string) => void; } export function CodeCategoryPanel({ selectedCategoryCode, onSelectCategory }: CodeCategoryPanelProps) { // React Query로 카테고리 데이터 관리 const { data: categories = [], isLoading, error } = useCategories(); const deleteCategoryMutation = useDeleteCategory(); // 로컬 상태 const [searchTerm, setSearchTerm] = useState(""); const [showActiveOnly, setShowActiveOnly] = useState(false); const [showFormModal, setShowFormModal] = useState(false); const [editingCategory, setEditingCategory] = useState(""); const [showDeleteModal, setShowDeleteModal] = useState(false); const [deletingCategory, setDeletingCategory] = useState(""); // 필터링된 카테고리 목록 const filteredCategories = categories.filter((category) => { const matchesSearch = category.category_name.toLowerCase().includes(searchTerm.toLowerCase()) || category.category_code.toLowerCase().includes(searchTerm.toLowerCase()); const matchesActive = !showActiveOnly || category.is_active === "Y"; return matchesSearch && matchesActive; }); // 새 카테고리 생성 const handleNewCategory = () => { setEditingCategory(""); setShowFormModal(true); }; // 카테고리 수정 const handleEditCategory = (categoryCode: string) => { setEditingCategory(categoryCode); setShowFormModal(true); }; // 카테고리 삭제 확인 const handleDeleteCategory = (categoryCode: string) => { setDeletingCategory(categoryCode); setShowDeleteModal(true); }; // 카테고리 삭제 실행 const handleConfirmDelete = async () => { if (!deletingCategory) return; try { await deleteCategoryMutation.mutateAsync(deletingCategory); // 삭제된 카테고리가 선택된 상태라면 선택 해제 if (selectedCategoryCode === deletingCategory) { onSelectCategory(""); } setShowDeleteModal(false); setDeletingCategory(""); } catch (error) { console.error("카테고리 삭제 실패:", error); } }; if (error) { return (

카테고리를 불러오는 중 오류가 발생했습니다.

); } return (
{/* 검색 및 필터 */}
{/* 검색 */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* 활성 필터 */}
setShowActiveOnly(e.target.checked)} className="rounded border-gray-300" />
{/* 새 카테고리 버튼 */}
{/* 카테고리 목록 */}
{isLoading ? (
) : filteredCategories.length === 0 ? (
{searchTerm ? "검색 결과가 없습니다." : "카테고리가 없습니다."}
) : (
{filteredCategories.map((category) => ( onSelectCategory(category.category_code)} onEdit={() => handleEditCategory(category.category_code)} onDelete={() => handleDeleteCategory(category.category_code)} /> ))}
)}
{/* 카테고리 폼 모달 */} {showFormModal && ( setShowFormModal(false)} editingCategoryCode={editingCategory} /> )} {/* 삭제 확인 모달 */} {showDeleteModal && ( setShowDeleteModal(false)} type="error" title="카테고리 삭제" message="정말로 이 카테고리를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." confirmText="삭제" onConfirm={handleConfirmDelete} /> )}
); }