fix: error boundary, fix MessageInput import order, fix favicon SVG->PNG

This commit is contained in:
Ai
2026-05-22 11:38:50 +03:00
parent 4045d6b796
commit 01331d0263
3 changed files with 36 additions and 16 deletions

View File

@@ -2,7 +2,7 @@
<html lang="ru">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/icon-192.svg" />
<link rel="icon" type="image/png" href="/icon-192.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="theme-color" content="#3b82f6" />
<meta name="apple-mobile-web-app-capable" content="yes" />

View File

@@ -1,5 +1,24 @@
import { useEffect } from 'react';
import { useEffect, Component, ReactNode } from 'react';
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
class ErrorBoundary extends Component<{ children: ReactNode }, { error: string | null }> {
state = { error: null };
static getDerivedStateFromError(err: Error) { return { error: err.message }; }
render() {
if (this.state.error) {
return (
<div style={{ padding: 40, fontFamily: 'monospace', background: '#fee2e2', minHeight: '100vh' }}>
<h2 style={{ color: '#991b1b' }}>Ошибка приложения</h2>
<pre style={{ whiteSpace: 'pre-wrap', color: '#7f1d1d' }}>{this.state.error}</pre>
<button onClick={() => window.location.reload()} style={{ marginTop: 16, padding: '8px 16px' }}>
Перезагрузить
</button>
</div>
);
}
return this.props.children;
}
}
import LoginPage from './pages/Login';
import MainLayout from './pages/MainLayout';
import { useStore } from './store';
@@ -79,17 +98,19 @@ export default function App() {
}
return (
<BrowserRouter>
<Routes>
<Route path="/login" element={<LoginPage onLogin={(token, user) => {
localStorage.setItem('jc_token', token);
localStorage.setItem('jc_user', JSON.stringify(user));
setUser(user);
connectWS(token);
loadChats();
}} />} />
<Route path="/*" element={<AuthGuard><MainLayout /></AuthGuard>} />
</Routes>
</BrowserRouter>
<ErrorBoundary>
<BrowserRouter>
<Routes>
<Route path="/login" element={<LoginPage onLogin={(token, user) => {
localStorage.setItem('jc_token', token);
localStorage.setItem('jc_user', JSON.stringify(user));
setUser(user);
connectWS(token);
loadChats();
}} />} />
<Route path="/*" element={<AuthGuard><MainLayout /></AuthGuard>} />
</Routes>
</BrowserRouter>
</ErrorBoundary>
);
}

View File

@@ -7,6 +7,7 @@ import { useStore } from '../store';
import api from '../api/client';
import { wsClient } from '../api/ws';
import { ChevronDown } from 'lucide-react';
import MessageInput from './MessageInput';
interface Props {
chatId: string;
@@ -176,5 +177,3 @@ export default function MessageList({ chatId, isGroup, canSend }: Props) {
);
}
// MessageInput is imported inside
import MessageInput from './MessageInput';