import { useState, useCallback } from 'react'; import { useEditorStore } from '../../store/useEditorStore'; import { useSimulatorStore, BOARD_FQBN, BOARD_LABELS } from '../../store/useSimulatorStore'; import { compileCode } from '../../services/compilation'; import { LibraryManagerModal } from '../simulator/LibraryManagerModal'; import { parseCompileResult } from '../../utils/compilationLogger'; import type { CompilationLog } from '../../utils/compilationLogger'; import './EditorToolbar.css'; interface EditorToolbarProps { consoleOpen: boolean; setConsoleOpen: (open: boolean | ((v: boolean) => boolean)) => void; compileLogs: CompilationLog[]; setCompileLogs: (logs: CompilationLog[] | ((prev: CompilationLog[]) => CompilationLog[])) => void; } export const EditorToolbar = ({ consoleOpen, setConsoleOpen, compileLogs: _compileLogs, setCompileLogs }: EditorToolbarProps) => { const { files } = useEditorStore(); const { boardType, setCompiledHex, setCompiledBinary, startSimulation, stopSimulation, resetSimulation, running, compiledHex, } = useSimulatorStore(); const [compiling, setCompiling] = useState(false); const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const [libManagerOpen, setLibManagerOpen] = useState(false); const addLog = useCallback((log: CompilationLog) => { setCompileLogs((prev: CompilationLog[]) => [...prev, log]); }, [setCompileLogs]); const handleCompile = async () => { setCompiling(true); setMessage(null); setConsoleOpen(true); const fqbn = BOARD_FQBN[boardType]; const boardLabel = BOARD_LABELS[boardType]; addLog({ timestamp: new Date(), type: 'info', message: `Starting compilation for ${boardLabel} (${fqbn})...` }); try { const sketchFiles = files.map((f) => ({ name: f.name, content: f.content })); const result = await compileCode(sketchFiles, fqbn); // Parse the full result into log entries const resultLogs = parseCompileResult(result, boardLabel); setCompileLogs((prev: CompilationLog[]) => [...prev, ...resultLogs]); if (result.success) { if (result.hex_content) { setCompiledHex(result.hex_content); setMessage({ type: 'success', text: 'Compiled successfully' }); } else if (result.binary_content) { setCompiledBinary(result.binary_content); setMessage({ type: 'success', text: 'Compiled successfully' }); } else { setMessage({ type: 'error', text: 'No output' }); } } else { setMessage({ type: 'error', text: result.error || result.stderr || 'Compile failed' }); } } catch (err) { const errMsg = err instanceof Error ? err.message : 'Compile failed'; addLog({ timestamp: new Date(), type: 'error', message: errMsg }); setMessage({ type: 'error', text: errMsg }); } finally { setCompiling(false); } }; const handleRun = () => { if (compiledHex) { startSimulation(); setMessage(null); } else { setMessage({ type: 'error', text: 'Compile first' }); } }; const handleStop = () => { stopSimulation(); setMessage(null); }; const handleReset = () => { resetSimulation(); setMessage(null); }; return ( <>
{/* Compile */}
{/* Run */} {/* Stop */} {/* Reset */}
{/* Status message */} {message && ( {message.type === 'success' ? ( ) : ( )} {message.text} )} {/* Libraries */}
{/* Output Console toggle */}
{/* Error detail bar */} {message?.type === 'error' && message.text.length > 40 && !consoleOpen && (
{message.text}
)} setLibManagerOpen(false)} /> ); };