"use client"; import { useState, useEffect } 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 { useCommonCode } from "@/hooks/useCommonCode"; // import { useMultiLang } from "@/hooks/useMultiLang"; // 무한 루프 방지를 위해 임시 제거 import { CodeFormModal } from "./CodeFormModal"; import { AlertModal } from "@/components/common/AlertModal"; import { Search, Plus, Edit, Trash2 } from "lucide-react"; import { cn } from "@/lib/utils"; interface CodeDetailPanelProps { categoryCode: string; } export function CodeDetailPanel({ categoryCode }: CodeDetailPanelProps) { // const { getText } = useMultiLang(); // 무한 루프 방지를 위해 임시 제거 const { codes, codesLoading, codesError, fetchCodes, deleteCode } = useCommonCode(); // 카테고리 변경 시 코드 조회 useEffect(() => { if (categoryCode) { console.log("🔍 카테고리 변경됨, 코드 조회:", categoryCode); fetchCodes(categoryCode); } }, [categoryCode, fetchCodes]); // 로컬 상태 const [searchTerm, setSearchTerm] = useState(""); const [showFormModal, setShowFormModal] = useState(false); const [editingCode, setEditingCode] = useState<{ categoryCode: string; codeValue: string }>({ categoryCode: "", codeValue: "", }); const [showDeleteModal, setShowDeleteModal] = useState(false); const [deletingCode, setDeletingCode] = useState<{ categoryCode: string; codeValue: string }>({ categoryCode: "", codeValue: "", }); // 검색 필터링 const filteredCodes = codes.filter( (code) => code.code_name.toLowerCase().includes(searchTerm.toLowerCase()) || code.code_value.toLowerCase().includes(searchTerm.toLowerCase()), ); // 코드 생성 핸들러 const handleCreateCode = () => { if (!categoryCode) return; setEditingCode({ categoryCode: "", codeValue: "" }); setShowFormModal(true); }; // 코드 수정 핸들러 const handleEditCode = (codeValue: string) => { setEditingCode({ categoryCode, codeValue }); setShowFormModal(true); }; // 코드 삭제 핸들러 const handleDeleteCode = (codeValue: string) => { setDeletingCode({ categoryCode, codeValue }); setShowDeleteModal(true); }; // 삭제 확인 핸들러 const handleConfirmDelete = async () => { if (!deletingCode.categoryCode || !deletingCode.codeValue) return; try { await deleteCode(deletingCode.categoryCode, deletingCode.codeValue); setShowDeleteModal(false); setDeletingCode({ categoryCode: "", codeValue: "" }); } catch (error) { console.error("코드 삭제 오류:", error); // 에러 처리는 useCommonCode 훅에서 처리됨 } }; // 카테고리가 선택되지 않은 경우 if (!categoryCode) { return (

카테고리를 선택하세요

왼쪽에서 카테고리를 선택하면 해당 코드 목록이 표시됩니다.

); } // 에러 상태 if (codesError) { return (

❌ {codesError}

); } return (
{/* 검색 및 추가 버튼 */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* 코드 목록 */}
{codesLoading ? (

코드를 불러오는 중...

) : filteredCodes.length === 0 ? (

코드가 없습니다.

) : (
{filteredCodes.map((code) => (
{code.code_name} {code.is_active === "Y" ? ( 활성 ) : ( 비활성 )}
{code.code_value} {code.code_name_eng && ({code.code_name_eng})}
{code.description && (

{code.description}

)}
{/* 액션 버튼 */}
))}
)}
{/* 코드 폼 모달 */} {showFormModal && ( setShowFormModal(false)} categoryCode={categoryCode} editingCodeValue={editingCode.codeValue} /> )} {/* 삭제 확인 모달 */} {showDeleteModal && ( setShowDeleteModal(false)} onConfirm={handleConfirmDelete} title="삭제 확인" message="이 코드를 삭제하시겠습니까?" confirmText="삭제" cancelText="취소" variant="destructive" /> )}
); }