"use client"; import { useState, useEffect } from "react"; import { ChevronRight, ChevronDown, Folder, FolderOpen, Tag } from "lucide-react"; import { cn } from "@/lib/utils"; import { LangCategory, getCategories } from "@/lib/api/multilang"; interface CategoryTreeProps { selectedCategoryId: number | null; onSelectCategory: (category: LangCategory | null) => void; onDoubleClickCategory?: (category: LangCategory) => void; } interface CategoryNodeProps { category: LangCategory; level: number; selectedCategoryId: number | null; onSelectCategory: (category: LangCategory) => void; onDoubleClickCategory?: (category: LangCategory) => void; } function CategoryNode({ category, level, selectedCategoryId, onSelectCategory, onDoubleClickCategory, }: CategoryNodeProps) { const [isExpanded, setIsExpanded] = useState(true); const hasChildren = category.children && category.children.length > 0; const isSelected = selectedCategoryId === category.categoryId; return (
onSelectCategory(category)} onDoubleClick={() => onDoubleClickCategory?.(category)} > {/* 확장/축소 아이콘 */} {hasChildren ? ( ) : ( )} {/* 폴더/태그 아이콘 */} {hasChildren || level === 0 ? ( isExpanded ? ( ) : ( ) ) : ( )} {/* 카테고리 이름 */} {category.categoryName} {/* prefix 표시 */} {category.keyPrefix}
{/* 자식 카테고리 */} {hasChildren && isExpanded && (
{category.children!.map((child) => ( ))}
)}
); } export function CategoryTree({ selectedCategoryId, onSelectCategory, onDoubleClickCategory, }: CategoryTreeProps) { const [categories, setCategories] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { loadCategories(); }, []); const loadCategories = async () => { try { setLoading(true); const response = await getCategories(); if (response.success && response.data) { setCategories(response.data); } else { setError(response.error?.details || "카테고리 로드 실패"); } } catch (err) { setError("카테고리 로드 중 오류 발생"); } finally { setLoading(false); } }; if (loading) { return (
카테고리 로딩 중...
); } if (error) { return (
{error}
); } if (categories.length === 0) { return (
카테고리가 없습니다
); } return (
{/* 전체 선택 옵션 */}
onSelectCategory(null)} > 전체
{/* 카테고리 트리 */} {categories.map((category) => ( ))}
); } export default CategoryTree;