"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { LoadingSpinner } from "@/components/common/LoadingSpinner"; import { CodeFormModal } from "./CodeFormModal"; import { SortableCodeItem } from "./SortableCodeItem"; import { AlertModal } from "@/components/common/AlertModal"; import { Search, Plus } from "lucide-react"; import { cn } from "@/lib/utils"; import { useCodes, useDeleteCode, useReorderCodes } from "@/hooks/queries/useCodes"; import type { CodeInfo } from "@/types/commonCode"; // Drag and Drop import { DndContext, DragOverlay } from "@dnd-kit/core"; import { SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; import { useDragAndDrop } from "@/hooks/useDragAndDrop"; import { useSearchAndFilter } from "@/hooks/useSearchAndFilter"; interface CodeDetailPanelProps { categoryCode: string; } export function CodeDetailPanel({ categoryCode }: CodeDetailPanelProps) { // React Query로 코드 데이터 관리 const { data: codes = [], isLoading, error } = useCodes(categoryCode); const deleteCodeMutation = useDeleteCode(); const reorderCodesMutation = useReorderCodes(); // 검색 및 필터링 훅 사용 const { searchTerm, setSearchTerm, showActiveOnly, setShowActiveOnly, filteredItems: filteredCodes, } = useSearchAndFilter(codes, { searchFields: ["code_name", "code_value"], }); // 모달 상태 const [showFormModal, setShowFormModal] = useState(false); const [editingCode, setEditingCode] = useState(null); const [showDeleteModal, setShowDeleteModal] = useState(false); const [deletingCode, setDeletingCode] = useState(null); // 드래그 앤 드롭 훅 사용 const dragAndDrop = useDragAndDrop({ items: filteredCodes, onReorder: async (reorderedItems) => { await reorderCodesMutation.mutateAsync({ categoryCode, codes: reorderedItems.map((item) => ({ codeValue: item.id, sortOrder: item.sortOrder, })), }); }, getItemId: (code) => code.code_value, }); // 새 코드 생성 const handleNewCode = () => { setEditingCode(null); setShowFormModal(true); }; // 코드 수정 const handleEditCode = (code: CodeInfo) => { setEditingCode(code); setShowFormModal(true); }; // 코드 삭제 확인 const handleDeleteCode = (code: CodeInfo) => { setDeletingCode(code); setShowDeleteModal(true); }; // 코드 삭제 실행 const handleConfirmDelete = async () => { if (!deletingCode) return; try { await deleteCodeMutation.mutateAsync({ categoryCode, codeValue: deletingCode.code_value, }); setShowDeleteModal(false); setDeletingCode(null); } catch (error) { console.error("코드 삭제 실패:", error); } }; // 드래그 앤 드롭 로직은 useDragAndDrop 훅에서 처리 if (!categoryCode) { return (

카테고리를 선택하세요

); } if (error) { return (

코드를 불러오는 중 오류가 발생했습니다.

); } return (
{/* 검색 및 필터 */}
{/* 검색 */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* 활성 필터 */}
setShowActiveOnly(e.target.checked)} className="rounded border-gray-300" />
{/* 새 코드 버튼 */}
{/* 코드 목록 */}
{isLoading ? (
) : filteredCodes.length === 0 ? (
{searchTerm ? "검색 결과가 없습니다." : "코드가 없습니다."}
) : (
code.code_value)} strategy={verticalListSortingStrategy} >
{filteredCodes.map((code) => ( handleEditCode(code)} onDelete={() => handleDeleteCode(code)} /> ))}
{dragAndDrop.activeItem ? (
{(() => { const activeCode = dragAndDrop.activeItem; if (!activeCode) return null; return (

{activeCode.code_name}

{activeCode.is_active === "Y" ? "활성" : "비활성"}

{activeCode.code_value}

{activeCode.description && (

{activeCode.description}

)}
); })()}
) : null}
)}
{/* 코드 폼 모달 */} {showFormModal && ( { setShowFormModal(false); setEditingCode(null); }} categoryCode={categoryCode} editingCode={editingCode} /> )} {/* 삭제 확인 모달 */} {showDeleteModal && ( setShowDeleteModal(false)} type="error" title="코드 삭제" message="정말로 이 코드를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다." confirmText="삭제" onConfirm={handleConfirmDelete} /> )}
); }