import { useState, useEffect } from 'react'; import { X, Cpu } from 'lucide-react'; import { ICompiler, CompileResult, CompilerContext } from '@esengine/editor-core'; import '../styles/CompileDialog.css'; interface CompileDialogProps { isOpen: boolean; onClose: () => void; compiler: ICompiler; context: CompilerContext; initialOptions?: TOptions; } export function CompileDialog({ isOpen, onClose, compiler, context, initialOptions }: CompileDialogProps) { const [options, setOptions] = useState(initialOptions as TOptions); const [isCompiling, setIsCompiling] = useState(false); const [result, setResult] = useState(null); const [validationError, setValidationError] = useState(null); useEffect(() => { if (isOpen && initialOptions) { setOptions(initialOptions); setResult(null); setValidationError(null); } }, [isOpen, initialOptions]); useEffect(() => { if (compiler.validateOptions && options) { const error = compiler.validateOptions(options); setValidationError(error); } }, [options, compiler]); if (!isOpen) return null; const handleCompile = async () => { if (validationError) { return; } setIsCompiling(true); setResult(null); try { const compileResult = await compiler.compile(options, context); setResult(compileResult); } catch (error) { setResult({ success: false, message: `编译失败: ${error}`, errors: [String(error)] }); } finally { setIsCompiling(false); } }; return (

{compiler.name}

{compiler.description && (
{compiler.description}
)} {compiler.createConfigUI && compiler.createConfigUI(setOptions, context)} {validationError && (
{validationError}
)} {result && (
{result.message}
{result.outputFiles && result.outputFiles.length > 0 && (
输出文件:
{result.outputFiles.map((file, index) => (
{file}
))}
)} {result.errors && result.errors.length > 0 && (
错误:
{result.errors.map((error, index) => (
{error}
))}
)}
)}
); }