fix: error boundary, fix MessageInput import order, fix favicon SVG->PNG
This commit is contained in:
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user