Archived
68 lines
3.0 KiB
TypeScript
68 lines
3.0 KiB
TypeScript
import React, { lazy, Suspense } from "react";
|
|
import { BrowserRouter, Navigate, Route, Routes, useParams } from "react-router-dom";
|
|
import { AuthProvider, useAuth } from "./context/AuthContext";
|
|
import { I18nProvider } from "./i18n/I18nProvider";
|
|
import { ToastProvider } from "./hooks/useToast";
|
|
import { AnnotationsProvider } from "./context/AnnotationsContext";
|
|
import { useTranslation } from "react-i18n-lite";
|
|
|
|
const LibraryPage = lazy(() => import("./pages/Library").then((m) => ({ default: m.LibraryPage })));
|
|
const BookDetailPage = lazy(() => import("./pages/BookDetailPage").then((m) => ({ default: m.BookDetailPage })));
|
|
const AddBookPage = lazy(() => import("./pages/AddBook").then((m) => ({ default: m.AddBookPage })));
|
|
const SettingsPage = lazy(() => import("./pages/Settings").then((m) => ({ default: m.SettingsPage })));
|
|
const BookmarksNotesPage = lazy(() => import("./components/annotations/BookmarksNotesPage").then((m) => ({ default: m.BookmarksNotesPage })));
|
|
const ReadingPage = lazy(() => import("./pages/ReadingPage").then((m) => ({ default: m.default })));
|
|
|
|
const AuthPage = lazy(() => import("./pages/AuthPage"));
|
|
|
|
function LoadingFallback() {
|
|
const { t } = useTranslation();
|
|
return <div style={{ display: "flex", justifyContent: "center", alignItems: "center", minHeight: "100vh", color: "#888", fontSize: 16 }}><p>{t("common.loading")}</p></div>;
|
|
}
|
|
|
|
function ProtectedRoute({ children }: { children: React.ReactNode }) {
|
|
const { isAuthenticated, loading } = useAuth();
|
|
if (loading) return <LoadingFallback />;
|
|
if (!isAuthenticated) return <Navigate to="/auth" replace />;
|
|
return <>{children}</>;
|
|
}
|
|
|
|
function ReaderRedirect() {
|
|
const { id } = useParams<{ id: string }>();
|
|
return <Navigate to={`/read/${id ?? ""}`} replace />;
|
|
}
|
|
|
|
function AppRoutes() {
|
|
const { isAuthenticated } = useAuth();
|
|
return (
|
|
<Suspense fallback={<LoadingFallback />}>
|
|
<Routes>
|
|
<Route path="/auth" element={isAuthenticated ? <Navigate to="/" replace /> : <AuthPage />} />
|
|
<Route path="/" element={<ProtectedRoute><LibraryPage /></ProtectedRoute>} />
|
|
<Route path="/books/:id" element={<ProtectedRoute><BookDetailPage /></ProtectedRoute>} />
|
|
<Route path="/read/:id" element={<ProtectedRoute><ReadingPage /></ProtectedRoute>} />
|
|
<Route path="/reader/:id" element={<ProtectedRoute><ReaderRedirect /></ProtectedRoute>} />
|
|
<Route path="/add" element={<ProtectedRoute><AddBookPage /></ProtectedRoute>} />
|
|
<Route path="/settings" element={<ProtectedRoute><SettingsPage /></ProtectedRoute>} />
|
|
<Route path="/bookmarks-notes/:bookId?" element={<ProtectedRoute><BookmarksNotesPage /></ProtectedRoute>} />
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
</Suspense>
|
|
);
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<I18nProvider>
|
|
<AuthProvider>
|
|
<ToastProvider>
|
|
<AnnotationsProvider>
|
|
<AppRoutes />
|
|
</AnnotationsProvider>
|
|
</ToastProvider>
|
|
</AuthProvider>
|
|
</I18nProvider>
|
|
</BrowserRouter>
|
|
);
|
|
} |