"use client"; import { useEffect, useState } from "react"; import { useParams } from "next/navigation"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { ArrowLeft, Save, Loader2 } from "lucide-react"; import { screenApi } from "@/lib/api/screen"; import { ScreenDefinition, LayoutData } from "@/types/screen"; import { InteractiveScreenViewer } from "@/components/screen/InteractiveScreenViewer"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; export default function ScreenViewPage() { const params = useParams(); const router = useRouter(); const screenId = parseInt(params.screenId as string); const [screen, setScreen] = useState(null); const [layout, setLayout] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [saving, setSaving] = useState(false); const [formData, setFormData] = useState>({}); useEffect(() => { const loadScreen = async () => { try { setLoading(true); setError(null); // 화면 정보 로드 const screenData = await screenApi.getScreen(screenId); setScreen(screenData); // 레이아웃 로드 try { const layoutData = await screenApi.getLayout(screenId); setLayout(layoutData); } catch (layoutError) { console.warn("레이아웃 로드 실패, 빈 레이아웃 사용:", layoutError); setLayout({ components: [], gridSettings: { columns: 12, gap: 16, padding: 16 }, }); } } catch (error) { console.error("화면 로드 실패:", error); setError("화면을 불러오는데 실패했습니다."); toast.error("화면을 불러오는데 실패했습니다."); } finally { setLoading(false); } }; if (screenId) { loadScreen(); } }, [screenId]); // 폼 데이터 저장 함수 const handleSaveData = async () => { if (!screen) return; try { setSaving(true); console.log("저장할 데이터:", formData); console.log("화면 정보:", screen); // 여기에 실제 데이터 저장 API 호출을 추가할 수 있습니다 // await saveFormData(screen.tableName, formData); toast.success("데이터가 성공적으로 저장되었습니다."); } catch (error) { console.error("데이터 저장 실패:", error); toast.error("데이터 저장에 실패했습니다."); } finally { setSaving(false); } }; if (loading) { return (

화면을 불러오는 중...

); } if (error || !screen) { return (
⚠️

화면을 찾을 수 없습니다

{error || "요청하신 화면이 존재하지 않습니다."}

); } return (
{/* 헤더 */}

{screen.screenName}

{screen.screenCode} {screen.tableName} {screen.isActive === "Y" ? "활성" : "비활성"}
생성일: {screen.createdDate.toLocaleDateString()}
{/* 메인 컨텐츠 영역 */}
{layout && layout.components.length > 0 ? (
{screen.screenName} {screen.description &&

{screen.description}

}
{/* 실제 화면 렌더링 영역 */}
{layout.components .filter((comp) => !comp.parentId) // 최상위 컴포넌트만 렌더링 (그룹 포함) .map((component) => { // 그룹 컴포넌트인 경우 특별 처리 if (component.type === "group") { const groupChildren = layout.components.filter((child) => child.parentId === component.id); return (
{/* 그룹 제목 */} {(component as any).title && (
{(component as any).title}
)} {/* 그룹 내 자식 컴포넌트들 렌더링 */} {groupChildren.map((child) => (
{ setFormData((prev) => ({ ...prev, [fieldName]: value, })); }} />
))}
); } // 일반 컴포넌트 렌더링 return (
{ setFormData((prev) => ({ ...prev, [fieldName]: value, })); }} />
); })}
) : (
📄

화면이 비어있습니다

이 화면에는 아직 설계된 컴포넌트가 없습니다.

)}
); }