"use client"; import React, { useState } from "react"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { CalendarIcon } from "lucide-react"; import { format } from "date-fns"; import { ko } from "date-fns/locale"; import { ComponentData } from "@/types/screen"; interface InteractiveScreenViewerProps { component: ComponentData; allComponents: ComponentData[]; formData?: Record; onFormDataChange?: (fieldName: string, value: any) => void; } export const InteractiveScreenViewer: React.FC = ({ component, allComponents, formData: externalFormData, onFormDataChange, }) => { const [localFormData, setLocalFormData] = useState>({}); const [dateValues, setDateValues] = useState>({}); // 실제 사용할 폼 데이터 (외부에서 제공된 경우 우선 사용) const formData = externalFormData || localFormData; // 폼 데이터 업데이트 const updateFormData = (fieldName: string, value: any) => { if (onFormDataChange) { // 외부 콜백이 있는 경우 사용 onFormDataChange(fieldName, value); } else { // 로컬 상태 업데이트 setLocalFormData((prev) => ({ ...prev, [fieldName]: value, })); } }; // 날짜 값 업데이트 const updateDateValue = (fieldName: string, date: Date | undefined) => { setDateValues((prev) => ({ ...prev, [fieldName]: date, })); updateFormData(fieldName, date ? format(date, "yyyy-MM-dd") : ""); }; // 실제 사용 가능한 위젯 렌더링 const renderInteractiveWidget = (comp: ComponentData) => { const { widgetType, label, placeholder, required, readonly, columnName } = comp; const fieldName = columnName || comp.id; const currentValue = formData[fieldName] || ""; // 스타일 적용 const applyStyles = (element: React.ReactElement) => { if (!comp.style) return element; return React.cloneElement(element, { style: { ...comp.style, // 크기는 부모 컨테이너에서 처리하므로 제거 width: undefined, height: undefined, }, }); }; switch (widgetType) { case "text": case "email": case "tel": return applyStyles( updateFormData(fieldName, e.target.value)} disabled={readonly} required={required} className="h-full w-full" />, ); case "number": case "decimal": return applyStyles( updateFormData(fieldName, e.target.valueAsNumber || 0)} disabled={readonly} required={required} className="h-full w-full" step={widgetType === "decimal" ? "0.01" : "1"} />, ); case "textarea": case "text_area": return applyStyles(