agent-ecosystem/src/renderer/components/team/editor/EditorErrorBoundary.tsx
iliya ccee484adc fix: editor improvements — isDir bug, scroll-to-line, Quick Open, a11y
- Fix isDir heuristic: use backend-provided isDirectory instead of
  filename-based guessing (breaks for Makefile, .github, etc.)
- Add scroll-to-line on search result click via editorPendingGoToLine
- Add Cmd+Shift+W shortcut for toggling line wrap
- Rewrite Quick Open to fetch all project files from backend API
  instead of flattening the loaded tree (limited to expanded dirs)
- Fix fd leak in atomicWrite: close file handle in finally block
- Add a11y: role=dialog/alert, aria-modal, aria-label on modals
- Add type=button on error state buttons
2026-03-01 07:55:50 +02:00

63 lines
1.8 KiB
TypeScript

/**
* React error boundary wrapping CodeMirrorEditor.
*
* Catches runtime CM6 errors (OOM, bad extension, corrupted EditorState)
* and shows a fallback UI instead of crashing the entire overlay.
*/
import React from 'react';
import { AlertTriangle } from 'lucide-react';
interface Props {
filePath: string;
onRetry?: () => void;
children: React.ReactNode;
}
interface State {
hasError: boolean;
error: string | null;
}
export class EditorErrorBoundary extends React.Component<Props, State> {
state: State = { hasError: false, error: null };
static getDerivedStateFromError(error: Error): State {
return { hasError: true, error: error.message };
}
componentDidCatch(error: Error, info: React.ErrorInfo): void {
console.error(`[EditorErrorBoundary] ${this.props.filePath}:`, error, info.componentStack);
}
handleRetry = (): void => {
this.setState({ hasError: false, error: null });
this.props.onRetry?.();
};
render(): React.ReactElement {
if (this.state.hasError) {
return (
<div
role="alert"
aria-live="polite"
className="flex h-full flex-col items-center justify-center gap-3 text-text-muted"
>
<AlertTriangle aria-hidden="true" className="size-12 text-red-400 opacity-50" />
<p className="max-w-md text-center text-sm text-text-secondary">
Editor crashed: {this.state.error ?? 'Unknown error'}
</p>
<button
type="button"
onClick={this.handleRetry}
className="rounded border border-border px-3 py-1.5 text-xs text-text-secondary transition-colors hover:bg-surface-raised"
>
Retry
</button>
</div>
);
}
return <>{this.props.children}</>;
}
}