"use client"; import React, { Suspense } from "react"; import { WebTypeRegistry } from "./WebTypeRegistry"; import { WebTypeComponentProps } from "./types"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Loader2 } from "lucide-react"; interface DynamicWebTypeRendererProps extends WebTypeComponentProps { widgetType: string; fallback?: React.ComponentType; showError?: boolean; } /** * 동적 웹타입 렌더러 * 등록된 웹타입에 따라 적절한 컴포넌트를 동적으로 렌더링 */ export const DynamicWebTypeRenderer: React.FC = React.memo( ({ widgetType, component, fallback: FallbackComponent, showError = true, ...props }) => { // 웹타입 정의 조회 const definition = WebTypeRegistry.get(widgetType); // 웹타입이 등록되지 않은 경우 if (!definition) { console.warn(`Unknown web type: ${widgetType}`); // Fallback 컴포넌트가 있으면 사용 if (FallbackComponent) { return ; } // 에러 표시를 원하지 않으면 빈 div 반환 if (!showError) { return
; } // 에러 메시지 표시 return ( 알 수 없는 웹타입: {widgetType} ); } // 비활성화된 웹타입인 경우 if (definition.isActive === false) { console.warn(`Inactive web type: ${widgetType}`); if (showError) { return ( 비활성화된 웹타입: {widgetType} ); } return
; } // 등록된 컴포넌트 렌더링 const Component = definition.component; return ( 로딩 중...
} > ); }, (prevProps, nextProps) => { // 메모이제이션을 위한 얕은 비교 return ( prevProps.widgetType === nextProps.widgetType && prevProps.component.id === nextProps.component.id && prevProps.value === nextProps.value && prevProps.readonly === nextProps.readonly && JSON.stringify(prevProps.component.webTypeConfig) === JSON.stringify(nextProps.component.webTypeConfig) ); } ); DynamicWebTypeRenderer.displayName = "DynamicWebTypeRenderer";