"use client"; import React, { useState, useEffect, useRef } from "react"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { ConditionalContainerProps, ConditionalSection } from "./types"; import { ConditionalSectionViewer } from "./ConditionalSectionViewer"; import { cn } from "@/lib/utils"; /** * 조건부 컨테이너 컴포넌트 * 상단 셀렉트박스 값에 따라 하단에 다른 UI를 표시 */ export function ConditionalContainerComponent({ config, controlField: propControlField, controlLabel: propControlLabel, sections: propSections, defaultValue: propDefaultValue, showBorder: propShowBorder, spacing: propSpacing, value, onChange, formData, onFormDataChange, isDesignMode = false, onUpdateComponent, onDeleteComponent, onSelectComponent, selectedComponentId, onHeightChange, componentId, style, className, }: ConditionalContainerProps) { // config prop 우선, 없으면 개별 prop 사용 const controlField = config?.controlField || propControlField || "condition"; const controlLabel = config?.controlLabel || propControlLabel || "조건 선택"; const sections = config?.sections || propSections || []; const defaultValue = config?.defaultValue || propDefaultValue || sections[0]?.condition; const showBorder = config?.showBorder ?? propShowBorder ?? true; const spacing = config?.spacing || propSpacing || "normal"; // 현재 선택된 값 const [selectedValue, setSelectedValue] = useState( value || formData?.[controlField] || defaultValue || "" ); // formData 변경 시 동기화 useEffect(() => { if (formData?.[controlField]) { setSelectedValue(formData[controlField]); } }, [formData, controlField]); // 값 변경 핸들러 const handleValueChange = (newValue: string) => { setSelectedValue(newValue); if (onChange) { onChange(newValue); } if (onFormDataChange) { onFormDataChange(controlField, newValue); } }; // 컨테이너 높이 측정용 ref const containerRef = useRef(null); const previousHeightRef = useRef(0); // 높이 변화 감지 및 콜백 호출 useEffect(() => { if (!containerRef.current || isDesignMode || !onHeightChange) return; const resizeObserver = new ResizeObserver((entries) => { for (const entry of entries) { const newHeight = entry.contentRect.height; // 높이가 실제로 변경되었을 때만 콜백 호출 if (Math.abs(newHeight - previousHeightRef.current) > 5) { console.log(`📏 조건부 컨테이너 높이 변화: ${previousHeightRef.current}px → ${newHeight}px`); previousHeightRef.current = newHeight; onHeightChange(newHeight); } } }); resizeObserver.observe(containerRef.current); return () => { resizeObserver.disconnect(); }; }, [isDesignMode, onHeightChange, selectedValue]); // selectedValue 변경 시에도 감지 // 간격 스타일 const spacingClass = { tight: "space-y-2", normal: "space-y-4", loose: "space-y-8", }[spacing]; return (
{/* 제어 셀렉트박스 */}
{/* 조건별 섹션들 */}
{isDesignMode ? ( // 디자인 모드: 모든 섹션 표시
{sections.map((section) => ( ))}
) : ( // 실행 모드: 활성 섹션만 표시 sections.map((section) => selectedValue === section.condition ? ( ) : null ) )} {/* 섹션이 없는 경우 안내 */} {sections.length === 0 && isDesignMode && (

설정 패널에서 조건을 추가하세요

)}
); }