'use client'; /** * 항목 상세 클라이언트 컴포넌트 * * 라우팅: * - /[id]/items/[itemId] → 상세 보기 * - /[id]/items/[itemId]?mode=edit → 수정 * - /[id]/items/new → 등록 */ import { useState, useEffect } from 'react'; import { useSearchParams } from 'next/navigation'; import { ItemDetail } from './ItemDetail'; import { ItemForm } from './ItemForm'; import { getChecklistItemById } from './actions'; import type { ChecklistItem } from '@/types/checklist'; import { DetailPageSkeleton } from '@/components/ui/skeleton'; import { ErrorCard } from '@/components/ui/error-card'; import { toast } from 'sonner'; type DetailMode = 'view' | 'edit' | 'create'; interface ItemDetailClientProps { checklistId: string; itemId: string; } export function ItemDetailClient({ checklistId, itemId }: ItemDetailClientProps) { const searchParams = useSearchParams(); const modeFromQuery = searchParams.get('mode') as DetailMode | null; const isNewMode = itemId === 'new'; const [mode] = useState(() => { if (isNewMode) return 'create'; if (modeFromQuery === 'edit') return 'edit'; return 'view'; }); const [itemData, setItemData] = useState(null); const [isLoading, setIsLoading] = useState(!isNewMode); const [error, setError] = useState(null); useEffect(() => { if (isNewMode) { setIsLoading(false); return; } const loadData = async () => { setIsLoading(true); setError(null); try { const result = await getChecklistItemById(checklistId, itemId); if (result.success && result.data) { setItemData(result.data); } else { setError(result.error || '항목 정보를 찾을 수 없습니다.'); toast.error('항목을 불러오는데 실패했습니다.'); } } catch { setError('항목 정보를 불러오는 중 오류가 발생했습니다.'); toast.error('항목을 불러오는데 실패했습니다.'); } finally { setIsLoading(false); } }; loadData(); }, [checklistId, itemId, isNewMode]); if (isLoading) { return ; } if (error && !isNewMode) { return ( ); } if (mode === 'create') { return ; } if (mode === 'edit' && itemData) { return ; } if (mode === 'view' && itemData) { return ; } return ( ); }