feat: auth & admin

This commit is contained in:
2026-06-03 10:41:53 +03:00
parent 612d0f0125
commit 7dc59fb3c4
120 changed files with 4683 additions and 2159 deletions
+67 -12
View File
@@ -9,13 +9,35 @@ import { PlaylistDetailPage } from '../features/playlist-detail/PlaylistDetailPa
import { lazy, Suspense } from 'react';
import { LoadingSkeleton } from '../components/common/LoadingSkeleton';
const SearchDownloadPage = lazy(() => import('../features/search-download/SearchDownloadPage').then((m) => ({ default: m.SearchDownloadPage })));
const DownloadsManagerPage = lazy(() => import('../features/downloads-manager/DownloadsManagerPage').then((m) => ({ default: m.DownloadsManagerPage })));
const StoragePage = lazy(() => import('../features/storage/StoragePage').then((m) => ({ default: m.StoragePage })));
const AdminPage = lazy(() => import('../features/admin/AdminPage').then((m) => ({ default: m.AdminPage })));
const SettingsPage = lazy(() => import('../features/settings/SettingsPage').then((m) => ({ default: m.SettingsPage })));
const SearchDownloadPage = lazy(() =>
import('../features/search-download/SearchDownloadPage').then((m) => ({
default: m.SearchDownloadPage,
})),
);
const DownloadsManagerPage = lazy(() =>
import('../features/downloads-manager/DownloadsManagerPage').then((m) => ({
default: m.DownloadsManagerPage,
})),
);
const StoragePage = lazy(() =>
import('../features/storage/StoragePage').then((m) => ({
default: m.StoragePage,
})),
);
const AdminPage = lazy(() =>
import('../features/admin/AdminPage').then((m) => ({ default: m.AdminPage })),
);
const SettingsPage = lazy(() =>
import('../features/settings/SettingsPage').then((m) => ({
default: m.SettingsPage,
})),
);
const Fallback = () => <div style={{ padding: '2rem' }}><LoadingSkeleton /></div>;
const Fallback = () => (
<div style={{ padding: '2rem' }}>
<LoadingSkeleton />
</div>
);
export function AppRoutes() {
return (
@@ -31,16 +53,49 @@ export function AppRoutes() {
<Route index element={<HomePage />} />
<Route path="/library" element={<LibraryPage />} />
<Route path="/library/albums/:albumId" element={<AlbumDetailPage />} />
<Route path="/library/playlists/:playlistId" element={<PlaylistDetailPage />} />
<Route path="/search" element={<Suspense fallback={<Fallback />}><SearchDownloadPage /></Suspense>} />
<Route path="/downloads" element={<Suspense fallback={<Fallback />}><DownloadsManagerPage /></Suspense>} />
<Route path="/storage" element={<Suspense fallback={<Fallback />}><StoragePage /></Suspense>} />
<Route path="/settings" element={<Suspense fallback={<Fallback />}><SettingsPage /></Suspense>} />
<Route
path="/library/playlists/:playlistId"
element={<PlaylistDetailPage />}
/>
<Route
path="/search"
element={
<Suspense fallback={<Fallback />}>
<SearchDownloadPage />
</Suspense>
}
/>
<Route
path="/downloads"
element={
<Suspense fallback={<Fallback />}>
<DownloadsManagerPage />
</Suspense>
}
/>
<Route
path="/storage"
element={
<Suspense fallback={<Fallback />}>
<StoragePage />
</Suspense>
}
/>
<Route
path="/settings"
element={
<Suspense fallback={<Fallback />}>
<SettingsPage />
</Suspense>
}
/>
<Route
path="/admin/*"
element={
<ProtectedRoute requireAdmin>
<Suspense fallback={<Fallback />}><AdminPage /></Suspense>
<Suspense fallback={<Fallback />}>
<AdminPage />
</Suspense>
</ProtectedRoute>
}
/>