fix: error boundary, fix MessageInput import order, fix favicon SVG->PNG
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<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="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||||
<meta name="theme-color" content="#3b82f6" />
|
<meta name="theme-color" content="#3b82f6" />
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
<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';
|
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 LoginPage from './pages/Login';
|
||||||
import MainLayout from './pages/MainLayout';
|
import MainLayout from './pages/MainLayout';
|
||||||
import { useStore } from './store';
|
import { useStore } from './store';
|
||||||
@@ -79,6 +98,7 @@ export default function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<ErrorBoundary>
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/login" element={<LoginPage onLogin={(token, user) => {
|
<Route path="/login" element={<LoginPage onLogin={(token, user) => {
|
||||||
@@ -91,5 +111,6 @@ export default function App() {
|
|||||||
<Route path="/*" element={<AuthGuard><MainLayout /></AuthGuard>} />
|
<Route path="/*" element={<AuthGuard><MainLayout /></AuthGuard>} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
|
</ErrorBoundary>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { useStore } from '../store';
|
|||||||
import api from '../api/client';
|
import api from '../api/client';
|
||||||
import { wsClient } from '../api/ws';
|
import { wsClient } from '../api/ws';
|
||||||
import { ChevronDown } from 'lucide-react';
|
import { ChevronDown } from 'lucide-react';
|
||||||
|
import MessageInput from './MessageInput';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
chatId: string;
|
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