// Overlay for reading and editing the MATLAB implementation. Edits take // effect on the next debounced render and live only as long as the page. import { useState } from 'react'; import { DEFAULT_MFILES, EXECUTED_BY_APP, type MFile } from '../mfiles'; import type { RenderError } from '../hooks/useRenderer'; import CodeEditor from './CodeEditor'; interface Props { mfiles: MFile[]; onChangeFile: (name: string, source: string) => void; onResetFile: (name: string) => void; onResetAll: () => void; onClose: () => void; onRenderFull: () => void; error: RenderError | null; busy: boolean; } function defaultSourceOf(name: string): string { return DEFAULT_MFILES.find((f) => f.name === name)?.source ?? ''; } export default function CodePanel({ mfiles, onChangeFile, onResetFile, onResetAll, onClose, onRenderFull, error, busy, }: Props) { const [selected, setSelected] = useState( mfiles.find((f) => EXECUTED_BY_APP.has(f.name))?.name ?? mfiles[0]?.name ?? '', ); const file = mfiles.find((f) => f.name === selected) ?? mfiles[0]; const dirty = (f: MFile) => f.source !== defaultSourceOf(f.name); const anyDirty = mfiles.some(dirty); return (