"use client"; /** * UnifiedComponentRenderer * * Unified 컴포넌트를 동적으로 렌더링하는 컴포넌트 * props.unifiedType에 따라 적절한 컴포넌트를 렌더링 */ import React, { forwardRef, useMemo } from "react"; import { UnifiedComponentProps, isUnifiedInput, isUnifiedSelect, isUnifiedDate, isUnifiedText, isUnifiedMedia, isUnifiedList, isUnifiedLayout, isUnifiedGroup, isUnifiedBiz, isUnifiedHierarchy, } from "@/types/unified-components"; import { UnifiedInput } from "./UnifiedInput"; import { UnifiedSelect } from "./UnifiedSelect"; import { UnifiedDate } from "./UnifiedDate"; import { UnifiedList } from "./UnifiedList"; import { UnifiedLayout } from "./UnifiedLayout"; import { UnifiedGroup } from "./UnifiedGroup"; import { UnifiedMedia } from "./UnifiedMedia"; import { UnifiedBiz } from "./UnifiedBiz"; import { UnifiedHierarchy } from "./UnifiedHierarchy"; interface UnifiedComponentRendererProps { props: UnifiedComponentProps; className?: string; } /** * Unified 컴포넌트 렌더러 */ export const UnifiedComponentRenderer = forwardRef( ({ props, className }, ref) => { const component = useMemo(() => { // 타입 가드를 사용하여 적절한 컴포넌트 렌더링 if (isUnifiedInput(props)) { return ; } if (isUnifiedSelect(props)) { return ; } if (isUnifiedDate(props)) { return ; } if (isUnifiedText(props)) { // UnifiedText는 UnifiedInput의 textarea 모드로 대체 // 필요시 별도 구현 return (
UnifiedText (UnifiedInput textarea 모드 사용 권장)
); } if (isUnifiedMedia(props)) { return ; } if (isUnifiedList(props)) { return ; } if (isUnifiedLayout(props)) { return ; } if (isUnifiedGroup(props)) { return ; } if (isUnifiedBiz(props)) { return ; } if (isUnifiedHierarchy(props)) { return ; } // 알 수 없는 타입 return (
알 수 없는 컴포넌트 타입: {(props as { unifiedType?: string }).unifiedType}
); }, [props]); return (
{component}
); } ); UnifiedComponentRenderer.displayName = "UnifiedComponentRenderer"; export default UnifiedComponentRenderer;