"use client";
import React, { useMemo } from "react";
import { WebTypeRegistry } from "./WebTypeRegistry";
import { WebTypeConfigPanelProps } from "./types";
/**
* 동적 설정 패널 렌더러 컴포넌트
* 레지스트리에서 웹타입을 조회하여 해당 설정 패널을 동적으로 렌더링합니다.
*/
export const DynamicConfigPanel: React.FC<
WebTypeConfigPanelProps & {
webType: string;
}
> = ({ webType, component, onUpdateComponent, onUpdateProperty }) => {
// 레지스트리에서 웹타입 정의 조회
const webTypeDefinition = useMemo(() => {
return WebTypeRegistry.getWebType(webType);
}, [webType]);
// 웹타입이 등록되지 않은 경우
if (!webTypeDefinition) {
console.warn(`웹타입 "${webType}"이 레지스트리에 등록되지 않았습니다.`);
return (
⚠️ 설정 패널 없음
웹타입 "{webType}"의 설정 패널을 찾을 수 없습니다.
);
}
// 설정 패널 컴포넌트가 없는 경우
if (!webTypeDefinition.configPanel) {
return (
⚠️ 설정 패널 미구현
웹타입 "{webType}"에 대한 설정 패널이 구현되지 않았습니다.
);
}
const ConfigPanelComponent = webTypeDefinition.configPanel;
// 설정 패널 props 구성
const configPanelProps: WebTypeConfigPanelProps = {
component,
onUpdateComponent,
onUpdateProperty,
};
try {
return ;
} catch (error) {
console.error(`웹타입 "${webType}" 설정 패널 렌더링 중 오류 발생:`, error);
return (
💥 설정 패널 오류
웹타입 "{webType}" 설정 패널 렌더링 중 오류가 발생했습니다.
{process.env.NODE_ENV === "development" && (
{error instanceof Error ? error.stack : String(error)}
)}
);
}
};
DynamicConfigPanel.displayName = "DynamicConfigPanel";
/**
* 웹타입별 설정 패널을 렌더링하는 헬퍼 함수
*/
export function renderConfigPanel(
webType: string,
component: any,
onUpdateComponent: (component: any) => void,
onUpdateProperty: (property: string, value: any) => void,
): React.ReactElement | null {
return (
);
}
/**
* 웹타입이 설정 패널을 지원하는지 확인하는 헬퍼 함수
*/
export function hasConfigPanel(webType: string): boolean {
const webTypeDefinition = WebTypeRegistry.getWebType(webType);
return !!(webTypeDefinition && webTypeDefinition.configPanel);
}
/**
* 웹타입의 기본 설정을 가져오는 헬퍼 함수
*/
export function getDefaultConfig(webType: string): Record | null {
const webTypeDefinition = WebTypeRegistry.getWebType(webType);
return webTypeDefinition ? webTypeDefinition.defaultConfig : null;
}