"use client"; import React, { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { Code, Monitor, Moon, Sun } from "lucide-react"; import { WebTypeConfigPanelProps } from "@/lib/registry/types"; import { WidgetComponent, CodeTypeConfig } from "@/types/screen"; export const CodeConfigPanel: React.FC = ({ component, onUpdateComponent, onUpdateProperty, }) => { const widget = component as WidgetComponent; const config = (widget.webTypeConfig as CodeTypeConfig) || {}; // 로컬 상태 const [localConfig, setLocalConfig] = useState({ language: config.language || "javascript", theme: config.theme || "light", showLineNumbers: config.showLineNumbers !== false, // 기본값 true wordWrap: config.wordWrap || false, fontSize: config.fontSize || 14, tabSize: config.tabSize || 2, readOnly: config.readOnly || false, showMinimap: config.showMinimap || false, autoComplete: config.autoComplete !== false, // 기본값 true bracketMatching: config.bracketMatching !== false, // 기본값 true defaultValue: config.defaultValue || "", placeholder: config.placeholder || "코드를 입력하세요...", height: config.height || 300, required: config.required || false, }); // 컴포넌트 변경 시 로컬 상태 동기화 useEffect(() => { const currentConfig = (widget.webTypeConfig as CodeTypeConfig) || {}; setLocalConfig({ language: currentConfig.language || "javascript", theme: currentConfig.theme || "light", showLineNumbers: currentConfig.showLineNumbers !== false, wordWrap: currentConfig.wordWrap || false, fontSize: currentConfig.fontSize || 14, tabSize: currentConfig.tabSize || 2, readOnly: currentConfig.readOnly || false, showMinimap: currentConfig.showMinimap || false, autoComplete: currentConfig.autoComplete !== false, bracketMatching: currentConfig.bracketMatching !== false, defaultValue: currentConfig.defaultValue || "", placeholder: currentConfig.placeholder || "코드를 입력하세요...", height: currentConfig.height || 300, required: currentConfig.required || false, }); }, [widget.webTypeConfig]); // 설정 업데이트 핸들러 const updateConfig = (field: keyof CodeTypeConfig, value: any) => { const newConfig = { ...localConfig, [field]: value }; setLocalConfig(newConfig); onUpdateProperty("webTypeConfig", newConfig); }; // 지원되는 언어 목록 const supportedLanguages = [ { value: "javascript", label: "JavaScript", sample: "console.log('Hello World');" }, { value: "typescript", label: "TypeScript", sample: "const message: string = 'Hello World';" }, { value: "python", label: "Python", sample: "print('Hello World')" }, { value: "java", label: "Java", sample: "System.out.println('Hello World');" }, { value: "html", label: "HTML", sample: "

Hello World

" }, { value: "css", label: "CSS", sample: "body { color: #333; }" }, { value: "sql", label: "SQL", sample: "SELECT * FROM users;" }, { value: "json", label: "JSON", sample: '{"message": "Hello World"}' }, { value: "xml", label: "XML", sample: "Hello World" }, { value: "markdown", label: "Markdown", sample: "# Hello World" }, { value: "yaml", label: "YAML", sample: "message: Hello World" }, { value: "shell", label: "Shell", sample: "echo 'Hello World'" }, { value: "php", label: "PHP", sample: "" }, { value: "go", label: "Go", sample: 'fmt.Println("Hello World")' }, { value: "rust", label: "Rust", sample: 'println!("Hello World");' }, { value: "plaintext", label: "Plain Text", sample: "Hello World" }, ]; // 테마 목록 const themes = [ { value: "light", label: "Light", icon: Sun }, { value: "dark", label: "Dark", icon: Moon }, { value: "vs", label: "Visual Studio", icon: Monitor }, { value: "github", label: "GitHub", icon: Monitor }, { value: "monokai", label: "Monokai", icon: Monitor }, { value: "solarized", label: "Solarized", icon: Monitor }, ]; // 샘플 코드 설정 const setSampleCode = () => { const selectedLang = supportedLanguages.find((lang) => lang.value === localConfig.language); if (selectedLang) { updateConfig("defaultValue", selectedLang.sample); } }; return ( 코드 에디터 설정 코드 편집기의 언어, 테마, 편집 옵션을 설정합니다. {/* 기본 설정 */}

기본 설정

updateConfig("height", parseInt(e.target.value))} className="text-xs" />
150px 800px
{/* 편집기 옵션 */}

편집기 옵션

updateConfig("fontSize", parseInt(e.target.value))} min={10} max={24} className="text-xs" />
updateConfig("tabSize", parseInt(e.target.value))} min={1} max={8} className="text-xs" />

코드 라인의 번호를 표시합니다.

updateConfig("showLineNumbers", checked)} />

긴 라인을 자동으로 줄바꿈합니다.

updateConfig("wordWrap", checked)} />

코드의 축소된 미리보기를 표시합니다.

updateConfig("showMinimap", checked)} />
{/* 고급 기능 */}

고급 기능

코드 자동 완성 기능을 활성화합니다.

updateConfig("autoComplete", checked)} />

매칭되는 괄호를 하이라이트합니다.

updateConfig("bracketMatching", checked)} />
{/* 기본값 설정 */}

기본값

updateConfig("placeholder", e.target.value)} placeholder="코드를 입력하세요..." className="text-xs" />