import { AlertTriangle, RefreshCw } from 'lucide-react'; import { Component, type ErrorInfo, type ReactNode } from 'react'; import log from 'electron-log/renderer'; import { useT } from '~renderer/i18n'; import TextButton from './styled/TextButton'; type Props = { tabName: string; children: ReactNode; }; type State = { error?: Error; componentStack?: string; }; type FallbackProps = { tabName: string; error: Error; componentStack?: string; onReset: () => void; }; const TabErrorFallback = ({ tabName, error, componentStack, onReset }: FallbackProps) => { const t = useT(); return (

{t('misc.tabCrashed', { tab: tabName })}


{error.name}: {error.message}

{componentStack && (
					{componentStack.trim()}
				
)}
{t('misc.tryAgain')}
); }; class TabErrorBoundary extends Component { state: State = {}; static getDerivedStateFromError(error: Error): State { return { error }; } componentDidCatch(error: Error, info: ErrorInfo) { log.error(`Tab "${this.props.tabName}" crashed:`, error, info); this.setState({ error, componentStack: info.componentStack ?? undefined }); } componentDidUpdate(prevProps: Props) { if (prevProps.tabName !== this.props.tabName) { this.setState({ error: undefined, componentStack: undefined }); } } #reset = () => this.setState({ error: undefined, componentStack: undefined }); render() { if (!this.state.error) return this.props.children; const { error, componentStack } = this.state; return ( ); } } export default TabErrorBoundary;