"use client"; /** * ComponentPreviewPanel.tsx — 범용 컴포넌트 미리보기 패널 * * 모든 컴포넌트 타입의 미리보기를 통일된 레이아웃(회색 그리드 + 가운데 배치)으로 제공. * 카드/테이블 전용 패널을 대체하는 단일 진입점. */ import React, { useCallback, useMemo } from "react"; import { Eye } from "lucide-react"; import type { ComponentConfig } from "@/types/report"; import type { QueryResult } from "../renderers/types"; import { TextRenderer } from "../renderers/TextRenderer"; import { ImageRenderer } from "../renderers/ImageRenderer"; import { DividerRenderer } from "../renderers/DividerRenderer"; import { SignatureRenderer, StampRenderer } from "../renderers/SignatureRenderer"; import { PageNumberRenderer } from "../renderers/PageNumberRenderer"; import { CardRenderer } from "../renderers/CardRenderer"; import { CalculationRenderer } from "../renderers/CalculationRenderer"; import { BarcodeCanvasRenderer } from "../renderers/BarcodeCanvasRenderer"; import { CheckboxRenderer } from "../renderers/CheckboxRenderer"; import { TableRenderer } from "../renderers/TableRenderer"; interface ComponentPreviewPanelProps { component: ComponentConfig; } const DUMMY_LAYOUT_CONFIG = { pages: [{ page_id: "preview_page", page_order: 1 }], }; export function ComponentPreviewPanel({ component }: ComponentPreviewPanelProps) { const dummyGetQueryResult = useCallback( (): QueryResult | null => null, [], ); const previewWidth = useMemo( () => Math.min(component.width || 700, 700), [component.width], ); const previewHeight = useMemo( () => Math.min(component.height || 400, 550), [component.height], ); const renderContent = () => { switch (component.type) { case "text": case "label": return ( ); case "image": return ; case "divider": return ; case "signature": return ; case "stamp": return ; case "pageNumber": return ( ); case "card": return ( ); case "table": return ( ); case "calculation": return ( ); case "barcode": return ( ); case "checkbox": return ( ); default: return (
미리보기를 지원하지 않는 컴포넌트입니다.
); } }; return (
미리보기 (저장 전 상태)

실제 데이터는 저장 후 확인 가능합니다.

{renderContent()}
); }