"use client"; import React, { useState, useEffect } from "react"; import { ConditionalSectionViewerProps } from "./types"; import { RealtimePreview } from "@/components/screen/RealtimePreviewDynamic"; import { DynamicComponentRenderer } from "@/lib/registry/DynamicComponentRenderer"; import { cn } from "@/lib/utils"; import { Loader2 } from "lucide-react"; import { screenApi } from "@/lib/api/screen"; import { ComponentData } from "@/types/screen"; import { useAuth } from "@/hooks/useAuth"; /** * 조건부 섹션 뷰어 컴포넌트 * 각 조건에 해당하는 화면을 표시 */ export function ConditionalSectionViewer({ sectionId, condition, label, screenId, screenName, isActive, isDesignMode, showBorder = true, formData, onFormDataChange, groupedData, // 🆕 그룹 데이터 onSave, // 🆕 EditModal의 handleSave 콜백 controlField, // 🆕 조건부 컨테이너의 제어 필드명 selectedCondition, // 🆕 현재 선택된 조건 값 }: ConditionalSectionViewerProps) { const { userId, userName, user } = useAuth(); const [isLoading, setIsLoading] = useState(false); const [components, setComponents] = useState([]); const [screenInfo, setScreenInfo] = useState<{ id: number; tableName?: string } | null>(null); const [screenResolution, setScreenResolution] = useState<{ width: number; height: number } | null>(null); // 🆕 조건 값을 포함한 formData 생성 const enhancedFormData = React.useMemo(() => { const base = formData || {}; // 조건부 컨테이너의 현재 선택 값을 formData에 포함 if (controlField && selectedCondition) { return { ...base, [controlField]: selectedCondition, __conditionalContainerValue: selectedCondition, __conditionalContainerLabel: label, __conditionalContainerControlField: controlField, // 🆕 제어 필드명도 포함 }; } return base; }, [formData, controlField, selectedCondition, label]); // 화면 로드 useEffect(() => { if (!screenId) { setComponents([]); setScreenInfo(null); setScreenResolution(null); return; } const loadScreen = async () => { setIsLoading(true); try { const [layout, screen] = await Promise.all([screenApi.getLayout(screenId), screenApi.getScreen(screenId)]); setComponents(layout.components || []); setScreenInfo({ id: screenId, tableName: screen.tableName, }); setScreenResolution(layout.screenResolution || null); } catch (error) { console.error("화면 로드 실패:", error); setComponents([]); setScreenInfo(null); setScreenResolution(null); } finally { setIsLoading(false); } }; loadScreen(); }, [screenId]); // 디자인 모드가 아니고 비활성 섹션이면 렌더링하지 않음 if (!isDesignMode && !isActive) { return null; } return (
{/* 섹션 라벨 (디자인 모드에서만 표시) */} {isDesignMode && (
{label} {isActive && "(활성)"} {screenId && ` - 화면 ID: ${screenId}`}
)} {/* 화면 미선택 안내 (디자인 모드 + 화면 없을 때) */} {isDesignMode && !screenId && (

설정 패널에서 화면을 선택하세요

조건: {condition}

)} {/* 로딩 중 */} {isLoading && (

화면 로드 중...

)} {/* 화면 렌더링 */} {screenId && components.length > 0 && ( <> {isDesignMode ? ( /* 디자인 모드: 화면 정보만 표시 */

{screenName || `화면 ID: ${screenId}`}

{screenResolution?.width} x {screenResolution?.height}

컴포넌트 {components.length}개

) : ( /* 실행 모드: 실제 화면 렌더링 */
{/* 화면 크기만큼의 절대 위치 캔버스 */}
{components.map((component) => { const { position = { x: 0, y: 0, z: 1 }, size = { width: 200, height: 40 } } = component; return (
); })}
)} )}
); }