"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; material_code?: string | null; material_name?: string | null; quantity?: number | null; unit?: string | null; position_x: number; position_y: number; position_z: number; size_x: number; size_y: number; size_z: number; color: string; data_source_type?: string | null; data_source_config?: Record | null; data_binding?: Record | null; status?: string; memo?: string; } interface YardLayout { id: number; name: string; description?: string; created_at?: string; updated_at?: string; } interface Yard3DViewerProps { layoutId: number; } export default function Yard3DViewer({ layoutId }: Yard3DViewerProps) { const [placements, setPlacements] = useState([]); const [selectedPlacement, setSelectedPlacement] = useState(null); const [layoutName, setLayoutName] = useState(""); 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 loadData = async () => { try { setIsLoading(true); setError(null); // 야드 레이아웃 정보 조회 const layoutResponse = await yardLayoutApi.getLayoutById(layoutId); if (layoutResponse.success) { const layout = layoutResponse.data as YardLayout; setLayoutName(layout.name); } // 배치 데이터 조회 const placementsResponse = await yardLayoutApi.getPlacementsByLayoutId(layoutId); if (placementsResponse.success) { setPlacements(placementsResponse.data as YardPlacement[]); } else { setError("배치 데이터를 불러올 수 없습니다."); } } catch (err) { console.error("데이터 로드 실패:", err); setError("데이터를 불러오는 중 오류가 발생했습니다."); } finally { setIsLoading(false); } }; loadData(); }, [layoutId]); if (isLoading) { return (
3D 장면 로딩 중...
); } if (error) { return (
⚠️
{error}
); } if (placements.length === 0) { return (
📦
배치된 자재가 없습니다
); } return (
{/* 3D 캔버스 */} {/* 야드 이름 (좌측 상단) */} {layoutName && (

{layoutName}

)} {/* 선택된 자재 정보 패널 (우측 상단) */} {selectedPlacement && (

{selectedPlacement.material_name ? "자재 정보" : "미설정 요소"}

{selectedPlacement.material_name && selectedPlacement.quantity && selectedPlacement.unit ? (
{selectedPlacement.material_name}
{selectedPlacement.quantity} {selectedPlacement.unit}
) : (
⚠️
데이터 바인딩이
설정되지 않았습니다
편집 모드에서 설정해주세요
)}
)}
); }