112 lines
2.5 KiB
TypeScript
112 lines
2.5 KiB
TypeScript
|
|
"use client";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* V2ComponentRenderer
|
||
|
|
*
|
||
|
|
* V2 컴포넌트를 동적으로 렌더링하는 컴포넌트
|
||
|
|
* props.v2Type에 따라 적절한 컴포넌트를 렌더링
|
||
|
|
*/
|
||
|
|
|
||
|
|
import React, { forwardRef, useMemo } from "react";
|
||
|
|
import {
|
||
|
|
V2ComponentProps,
|
||
|
|
isV2Input,
|
||
|
|
isV2Select,
|
||
|
|
isV2Date,
|
||
|
|
isV2Text,
|
||
|
|
isV2Media,
|
||
|
|
isV2List,
|
||
|
|
isV2Layout,
|
||
|
|
isV2Group,
|
||
|
|
isV2Biz,
|
||
|
|
isV2Hierarchy,
|
||
|
|
} from "@/types/v2-components";
|
||
|
|
import { V2Input } from "./V2Input";
|
||
|
|
import { V2Select } from "./V2Select";
|
||
|
|
import { V2Date } from "./V2Date";
|
||
|
|
import { V2List } from "./V2List";
|
||
|
|
import { V2Layout } from "./V2Layout";
|
||
|
|
import { V2Group } from "./V2Group";
|
||
|
|
import { V2Media } from "./V2Media";
|
||
|
|
import { V2Biz } from "./V2Biz";
|
||
|
|
import { V2Hierarchy } from "./V2Hierarchy";
|
||
|
|
|
||
|
|
interface V2ComponentRendererProps {
|
||
|
|
props: V2ComponentProps;
|
||
|
|
className?: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* V2 컴포넌트 렌더러
|
||
|
|
*/
|
||
|
|
export const V2ComponentRenderer = forwardRef<HTMLDivElement, V2ComponentRendererProps>(
|
||
|
|
({ props, className }, ref) => {
|
||
|
|
const component = useMemo(() => {
|
||
|
|
// 타입 가드를 사용하여 적절한 컴포넌트 렌더링
|
||
|
|
if (isV2Input(props)) {
|
||
|
|
return <V2Input {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Select(props)) {
|
||
|
|
return <V2Select {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Date(props)) {
|
||
|
|
return <V2Date {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Text(props)) {
|
||
|
|
// V2Text는 V2Input의 textarea 모드로 대체
|
||
|
|
// 필요시 별도 구현
|
||
|
|
return (
|
||
|
|
<div className="p-2 border rounded text-sm text-muted-foreground">
|
||
|
|
V2Text (V2Input textarea 모드 사용 권장)
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Media(props)) {
|
||
|
|
return <V2Media {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2List(props)) {
|
||
|
|
return <V2List {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Layout(props)) {
|
||
|
|
return <V2Layout {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Group(props)) {
|
||
|
|
return <V2Group {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Biz(props)) {
|
||
|
|
return <V2Biz {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (isV2Hierarchy(props)) {
|
||
|
|
return <V2Hierarchy {...props} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 알 수 없는 타입
|
||
|
|
return (
|
||
|
|
<div className="p-2 border border-destructive rounded text-sm text-destructive">
|
||
|
|
알 수 없는 컴포넌트 타입: {(props as { v2Type?: string }).v2Type}
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}, [props]);
|
||
|
|
|
||
|
|
return (
|
||
|
|
<div ref={ref} className={className}>
|
||
|
|
{component}
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
);
|
||
|
|
|
||
|
|
V2ComponentRenderer.displayName = "V2ComponentRenderer";
|
||
|
|
|
||
|
|
export default V2ComponentRenderer;
|
||
|
|
|