"use client"; import React from "react"; import { AutoRegisteringComponentRenderer } from "../../AutoRegisteringComponentRenderer"; import { V2MediaDefinition } from "./index"; import { V2Media } from "@/components/v2/V2Media"; /** * V2Media 렌더러 * 파일, 이미지, 비디오, 오디오 등 다양한 미디어 타입을 지원 * 자동 등록 시스템을 사용하여 컴포넌트를 레지스트리에 등록 */ export class V2MediaRenderer extends AutoRegisteringComponentRenderer { static componentDefinition = V2MediaDefinition; render(): React.ReactElement { const { component, formData, onFormDataChange, isDesignMode, isSelected, isInteractive, ...restProps } = this.props; // 컴포넌트 설정 추출 const config = component.componentConfig || component.config || {}; const columnName = component.columnName; const tableName = component.tableName || this.props.tableName; // formData에서 현재 값 가져오기 const currentValue = formData?.[columnName] ?? component.value ?? ""; // 값 변경 핸들러 const handleChange = (value: any) => { if (isInteractive && onFormDataChange && columnName) { onFormDataChange(columnName, value); } }; // V1 file-upload, image-widget에서 넘어온 설정 매핑 const mediaType = config.mediaType || config.type || this.getMediaTypeFromWebType(component.webType); // maxSize: MB → bytes 변환 (V1은 bytes, V2는 MB 단위 사용) const maxSizeBytes = config.maxSize ? (config.maxSize > 1000 ? config.maxSize : config.maxSize * 1024 * 1024) : 10 * 1024 * 1024; // 기본 10MB return ( ); } /** * webType에서 미디어 타입 추출 */ private getMediaTypeFromWebType(webType?: string): "file" | "image" | "video" | "audio" { switch (webType) { case "image": return "image"; case "video": return "video"; case "audio": return "audio"; case "file": default: return "file"; } } /** * 미디어 타입에 따른 기본 accept 값 */ private getDefaultAccept(mediaType: string): string { switch (mediaType) { case "image": return "image/*"; case "video": return "video/*"; case "audio": return "audio/*"; default: return "*/*"; } } } // 자동 등록 실행 V2MediaRenderer.registerSelf(); // Hot Reload 지원 (개발 모드) if (process.env.NODE_ENV === "development") { V2MediaRenderer.enableHotReload(); }