2021-03-26 04:17:02 +04:30
|
|
|
/*
|
|
|
|
|
* Copyright (C) Contributors to the Suwayomi project
|
|
|
|
|
*
|
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
2021-01-26 23:32:12 +03:30
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
2023-05-18 13:17:41 +02:00
|
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
|
*/
|
2021-01-26 23:32:12 +03:30
|
|
|
|
2021-09-09 17:51:22 +04:30
|
|
|
import CssBaseline from '@mui/material/CssBaseline';
|
2024-03-07 01:12:35 +01:00
|
|
|
import React, { useLayoutEffect } from 'react';
|
2023-12-10 15:58:21 +01:00
|
|
|
import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
|
2023-08-27 21:39:47 +02:00
|
|
|
import { loadErrorMessages, loadDevMessages } from '@apollo/client/dev';
|
2024-04-29 16:35:08 +02:00
|
|
|
import { loadable } from 'react-lazily/loadable';
|
2024-07-11 17:22:52 +02:00
|
|
|
import Box from '@mui/material/Box';
|
2024-10-05 16:09:34 +02:00
|
|
|
import { AppContext } from '@/modules/core/contexts/AppContext.tsx';
|
2023-06-05 01:42:39 +02:00
|
|
|
import '@/i18n';
|
2024-10-05 22:17:23 +02:00
|
|
|
import { DefaultNavBar } from '@/modules/navigation-bar/components/DefaultNavBar.tsx';
|
2024-10-05 16:09:34 +02:00
|
|
|
import { requestManager } from '@/lib/requests/requests/RequestManager.ts';
|
2024-10-05 21:44:08 +02:00
|
|
|
import { WebUIUpdateChecker } from '@/modules/app-updates/components/WebUIUpdateChecker.tsx';
|
|
|
|
|
import { ServerUpdateChecker } from '@/modules/app-updates/components/ServerUpdateChecker.tsx';
|
2024-10-05 16:09:34 +02:00
|
|
|
import { lazyLoadFallback } from '@/modules/core/utils/LazyLoad.tsx';
|
|
|
|
|
import { ErrorBoundary } from '@/modules/core/components/ErrorBoundary.tsx';
|
2024-10-05 22:17:23 +02:00
|
|
|
import { useNavBarContext } from '@/modules/navigation-bar/contexts/NavbarContext.tsx';
|
2024-04-29 16:35:08 +02:00
|
|
|
|
2024-10-05 22:29:56 +02:00
|
|
|
const { Browse } = loadable(() => import('@/modules/browse/screens/Browse.tsx'), lazyLoadFallback);
|
2024-10-05 22:31:21 +02:00
|
|
|
const { DownloadQueue } = loadable(() => import('@/modules/downloads/screens/DownloadQueue.tsx'), lazyLoadFallback);
|
2024-10-05 19:33:09 +02:00
|
|
|
const { Library } = loadable(() => import('@/modules/library/screens/Library.tsx'), lazyLoadFallback);
|
2024-10-05 19:21:26 +02:00
|
|
|
const { Manga } = loadable(() => import('@/modules/manga/screens/Manga.tsx'), lazyLoadFallback);
|
2024-10-05 19:44:47 +02:00
|
|
|
const { Reader } = loadable(() => import('@/modules/reader/screens/Reader.tsx'), lazyLoadFallback);
|
2024-04-29 16:35:08 +02:00
|
|
|
const { SearchAll } = loadable(() => import('@/screens/SearchAll'), lazyLoadFallback);
|
|
|
|
|
const { Settings } = loadable(() => import('@/screens/Settings'), lazyLoadFallback);
|
|
|
|
|
const { About } = loadable(() => import('@/screens/settings/About'), lazyLoadFallback);
|
|
|
|
|
const { Backup } = loadable(() => import('@/screens/settings/Backup'), lazyLoadFallback);
|
2024-10-05 21:39:58 +02:00
|
|
|
const { CategorySettings } = loadable(
|
|
|
|
|
() => import('@/modules/category/screens/CategorySettings.tsx'),
|
|
|
|
|
lazyLoadFallback,
|
|
|
|
|
);
|
2024-10-05 19:44:47 +02:00
|
|
|
const { DefaultReaderSettings } = loadable(
|
|
|
|
|
() => import('@/modules/reader/screens/DefaultReaderSettings.tsx'),
|
|
|
|
|
lazyLoadFallback,
|
|
|
|
|
);
|
2024-10-05 21:22:12 +02:00
|
|
|
const { SourceConfigure } = loadable(() => import('@/modules/source/screens/SourceConfigure.tsx'), lazyLoadFallback);
|
|
|
|
|
const { SourceMangas } = loadable(() => import('@/modules/source/screens/SourceMangas.tsx'), lazyLoadFallback);
|
2024-04-29 16:35:08 +02:00
|
|
|
const { Updates } = loadable(() => import('@/screens/Updates'), lazyLoadFallback);
|
2024-10-05 19:33:09 +02:00
|
|
|
const { LibrarySettings } = loadable(() => import('@/modules/library/screens/LibrarySettings.tsx'), lazyLoadFallback);
|
2024-10-05 22:31:21 +02:00
|
|
|
const { DownloadSettings } = loadable(
|
|
|
|
|
() => import('@/modules/downloads/screens/DownloadSettings.tsx'),
|
|
|
|
|
lazyLoadFallback,
|
|
|
|
|
);
|
2024-04-29 16:35:08 +02:00
|
|
|
const { ServerSettings } = loadable(() => import('@/screens/settings/ServerSettings.tsx'), lazyLoadFallback);
|
2024-10-05 22:29:56 +02:00
|
|
|
const { BrowseSettings } = loadable(() => import('@/modules/browse/screens/BrowseSettings.tsx'), lazyLoadFallback);
|
2024-04-29 16:35:08 +02:00
|
|
|
const { WebUISettings } = loadable(() => import('@/screens/settings/WebUISettings.tsx'), lazyLoadFallback);
|
2024-10-05 21:35:25 +02:00
|
|
|
const { Migrate } = loadable(() => import('@/modules/migration/screens/Migrate.tsx'), lazyLoadFallback);
|
2024-10-05 22:27:19 +02:00
|
|
|
const { DeviceSetting } = loadable(() => import('@/modules/device/screens/DeviceSetting.tsx'), lazyLoadFallback);
|
2024-10-05 21:32:31 +02:00
|
|
|
const { TrackingSettings } = loadable(() => import('@/modules/tracker/screens/TrackingSettings.tsx'), lazyLoadFallback);
|
|
|
|
|
const { TrackerOAuthLogin } = loadable(
|
|
|
|
|
() => import('@/modules/tracker/screens/TrackerOAuthLogin.tsx'),
|
|
|
|
|
lazyLoadFallback,
|
|
|
|
|
);
|
2024-10-05 19:33:09 +02:00
|
|
|
const { LibraryDuplicates } = loadable(
|
|
|
|
|
() => import('@/modules/library/screens/LibraryDuplicates.tsx'),
|
|
|
|
|
lazyLoadFallback,
|
|
|
|
|
);
|
2024-10-05 22:12:32 +02:00
|
|
|
const { Appearance } = loadable(() => import('@/screens/settings/Appearance.tsx'), lazyLoadFallback);
|
2021-09-09 17:51:22 +04:30
|
|
|
|
2023-12-23 15:15:03 +01:00
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
2023-08-27 21:39:47 +02:00
|
|
|
// Adds messages only in a dev environment
|
|
|
|
|
loadDevMessages();
|
|
|
|
|
loadErrorMessages();
|
|
|
|
|
}
|
2023-12-10 15:58:21 +01:00
|
|
|
|
|
|
|
|
const ScrollToTop = () => {
|
|
|
|
|
const { pathname } = useLocation();
|
|
|
|
|
|
|
|
|
|
useLayoutEffect(() => {
|
|
|
|
|
window.scrollTo(0, 0);
|
|
|
|
|
}, [pathname]);
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
};
|
|
|
|
|
|
2024-01-01 22:40:39 +01:00
|
|
|
/**
|
|
|
|
|
* Creates permanent subscriptions to always have the latest data.
|
|
|
|
|
*
|
|
|
|
|
* E.g. in case a view is open, which does not subscribe to the download updates, finished downloads are never received
|
|
|
|
|
* and thus, data of existing chapters/mangas in the cache get outdated
|
|
|
|
|
*/
|
|
|
|
|
const BackgroundSubscriptions = () => {
|
|
|
|
|
requestManager.useDownloadSubscription();
|
|
|
|
|
requestManager.useUpdaterSubscription();
|
|
|
|
|
requestManager.useWebUIUpdateSubscription();
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-11 17:22:52 +02:00
|
|
|
const MainApp = () => {
|
2024-08-30 04:34:28 +02:00
|
|
|
const { navBarWidth, appBarHeight, bottomBarHeight } = useNavBarContext();
|
2024-07-11 17:22:52 +02:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Box
|
2024-03-07 01:12:35 +01:00
|
|
|
id="appMainContainer"
|
2024-07-11 17:22:52 +02:00
|
|
|
component="main"
|
2024-03-07 01:12:35 +01:00
|
|
|
sx={{
|
2024-08-30 04:34:28 +02:00
|
|
|
minHeight: `calc(100vh - ${appBarHeight + bottomBarHeight}px)`,
|
2024-07-29 17:22:49 +02:00
|
|
|
width: `calc(100vw - (100vw - 100%) - ${navBarWidth}px)`,
|
|
|
|
|
minWidth: `calc(100vw - (100vw - 100%) - ${navBarWidth}px)`,
|
2024-07-13 13:01:33 +02:00
|
|
|
maxWidth: `calc(100vw - (100vw - 100%) - ${navBarWidth}px)`,
|
2024-07-11 17:22:52 +02:00
|
|
|
position: 'relative',
|
2024-08-30 04:34:28 +02:00
|
|
|
mt: `${appBarHeight}px`,
|
2024-07-11 17:22:52 +02:00
|
|
|
mb: `${bottomBarHeight}px`,
|
2024-03-07 01:12:35 +01:00
|
|
|
}}
|
|
|
|
|
>
|
2024-04-29 16:35:08 +02:00
|
|
|
<ErrorBoundary>
|
|
|
|
|
<Routes>
|
|
|
|
|
{/* General Routes */}
|
|
|
|
|
<Route path="/" element={<Navigate to="/library" replace />} />
|
|
|
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
|
|
|
<Route path="settings">
|
|
|
|
|
<Route index element={<Settings />} />
|
|
|
|
|
<Route path="about" element={<About />} />
|
2024-10-05 21:39:58 +02:00
|
|
|
<Route path="categories" element={<CategorySettings />} />
|
2024-04-29 16:35:08 +02:00
|
|
|
<Route path="defaultReaderSettings" element={<DefaultReaderSettings />} />
|
2024-05-04 15:41:21 +02:00
|
|
|
<Route path="librarySettings">
|
|
|
|
|
<Route index element={<LibrarySettings />} />
|
|
|
|
|
<Route path="duplicates" element={<LibraryDuplicates />} />
|
|
|
|
|
</Route>
|
2024-04-29 16:35:08 +02:00
|
|
|
<Route path="downloadSettings" element={<DownloadSettings />} />
|
|
|
|
|
<Route path="backup" element={<Backup />} />
|
|
|
|
|
<Route path="server" element={<ServerSettings />} />
|
|
|
|
|
<Route path="webUI" element={<WebUISettings />} />
|
|
|
|
|
<Route path="browseSettings" element={<BrowseSettings />} />
|
|
|
|
|
<Route path="device" element={<DeviceSetting />} />
|
|
|
|
|
<Route path="trackingSettings" element={<TrackingSettings />} />
|
2024-09-04 23:44:32 +02:00
|
|
|
<Route path="appearance" element={<Appearance />} />
|
2024-04-29 16:35:08 +02:00
|
|
|
</Route>
|
2021-03-18 21:46:24 +03:30
|
|
|
|
2024-04-29 16:35:08 +02:00
|
|
|
{/* Manga Routes */}
|
2021-01-23 01:20:16 +03:30
|
|
|
|
2024-04-29 16:35:08 +02:00
|
|
|
<Route path="sources">
|
|
|
|
|
<Route index element={<Navigate to="/" replace />} />
|
|
|
|
|
<Route path=":sourceId" element={<SourceMangas />} />
|
|
|
|
|
<Route path=":sourceId/configure/" element={<SourceConfigure />} />
|
|
|
|
|
<Route path="all/search/" element={<SearchAll />} />
|
|
|
|
|
</Route>
|
|
|
|
|
<Route path="downloads" element={<DownloadQueue />} />
|
|
|
|
|
<Route path="manga/:id">
|
|
|
|
|
<Route path="chapter/:chapterNum" element={null} />
|
|
|
|
|
<Route index element={<Manga />} />
|
|
|
|
|
</Route>
|
|
|
|
|
<Route path="library" element={<Library />} />
|
|
|
|
|
<Route path="updates" element={<Updates />} />
|
|
|
|
|
<Route path="browse" element={<Browse />} />
|
|
|
|
|
<Route path="migrate/source/:sourceId">
|
|
|
|
|
<Route index element={<Migrate />} />
|
|
|
|
|
<Route path="manga/:mangaId/search" element={<SearchAll />} />
|
|
|
|
|
</Route>
|
|
|
|
|
<Route path="tracker/login/oauth" element={<TrackerOAuthLogin />} />
|
|
|
|
|
</Routes>
|
|
|
|
|
</ErrorBoundary>
|
2024-07-11 17:22:52 +02:00
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const ReaderApp = () => (
|
|
|
|
|
<ErrorBoundary>
|
|
|
|
|
<Routes>
|
|
|
|
|
<Route path="manga/:mangaId/chapter/:chapterIndex" element={<Reader />} />
|
|
|
|
|
<Route path="*" element={null} />
|
|
|
|
|
</Routes>
|
|
|
|
|
</ErrorBoundary>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
export const App: React.FC = () => (
|
|
|
|
|
<AppContext>
|
|
|
|
|
<ScrollToTop />
|
|
|
|
|
<ServerUpdateChecker />
|
|
|
|
|
<WebUIUpdateChecker />
|
|
|
|
|
<BackgroundSubscriptions />
|
|
|
|
|
<CssBaseline enableColorScheme />
|
|
|
|
|
<Box sx={{ display: 'flex' }}>
|
|
|
|
|
<Box sx={{ flexShrink: 0 }}>
|
|
|
|
|
<DefaultNavBar />
|
|
|
|
|
</Box>
|
|
|
|
|
<MainApp />
|
|
|
|
|
<ReaderApp />
|
|
|
|
|
</Box>
|
2022-11-26 13:51:56 +01:00
|
|
|
</AppContext>
|
|
|
|
|
);
|