"use client"; import { useState, useEffect } from "react"; import Yard3DCanvas from "./Yard3DCanvas"; import { yardLayoutApi } from "@/lib/api/yardLayoutApi"; import { Loader2 } from "lucide-react"; interface YardPlacement { id: number; yard_layout_id: number; external_material_id: string; material_code: string; material_name: string; quantity: number; unit: string; position_x: number; position_y: number; position_z: number; size_x: number; size_y: number; size_z: number; color: string; status?: string; memo?: string; } interface Yard3DViewerProps { layoutId: number; } export default function Yard3DViewer({ layoutId }: Yard3DViewerProps) { const [placements, setPlacements] = useState([]); const [selectedPlacement, setSelectedPlacement] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // 선택 변경 로그 const handlePlacementClick = (placement: YardPlacement | null) => { console.log("Yard3DViewer - Placement clicked:", placement?.material_name); setSelectedPlacement(placement); }; // 선택 상태 변경 감지 useEffect(() => { console.log("selectedPlacement changed:", selectedPlacement?.material_name); }, [selectedPlacement]); // 배치 데이터 로드 useEffect(() => { const loadPlacements = async () => { try { setIsLoading(true); setError(null); const response = await yardLayoutApi.getPlacementsByLayoutId(layoutId); if (response.success) { setPlacements(response.data); } else { setError("배치 데이터를 불러올 수 없습니다."); } } catch (err) { console.error("배치 데이터 로드 실패:", err); setError("배치 데이터를 불러오는 중 오류가 발생했습니다."); } finally { setIsLoading(false); } }; loadPlacements(); }, [layoutId]); if (isLoading) { return (
3D 장면 로딩 중...
); } if (error) { return (
⚠️
{error}
); } if (placements.length === 0) { return (
📦
배치된 자재가 없습니다
); } return (
{/* 3D 캔버스 */} {/* 선택된 자재 정보 패널 (오버레이) */} {selectedPlacement && (

자재 정보

{selectedPlacement.material_name}
{selectedPlacement.quantity} {selectedPlacement.unit}
)}
); }