diff --git a/src/App.tsx b/src/App.tsx
index da8af5f4..0eb03723 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -6,9 +6,9 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
-import { Box, Container } from '@mui/material';
+import { Container } from '@mui/material';
import CssBaseline from '@mui/material/CssBaseline';
-import React, { useEffect, useLayoutEffect, useMemo } from 'react';
+import React, { useLayoutEffect } from 'react';
import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
import { loadErrorMessages, loadDevMessages } from '@apollo/client/dev';
import { AppContext } from '@/components/context/AppContext';
@@ -38,8 +38,6 @@ import { requestManager } from '@/lib/requests/RequestManager.ts';
import { BrowseSettings } from '@/screens/settings/BrowseSettings.tsx';
import { WebUISettings } from '@/screens/settings/WebUISettings.tsx';
import { Migrate } from '@/screens/Migrate.tsx';
-import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts';
-import { getActiveDevice, setActiveDevice } from '@/util/device.ts';
import { DeviceSetting } from '@/components/settings/DeviceSetting.tsx';
if (process.env.NODE_ENV !== 'production') {
@@ -72,88 +70,68 @@ const BackgroundSubscriptions = () => {
return null;
};
-const ActiveDeviceListener = ({ children }: { children?: React.ReactNode }) => {
- const {
- settings: { devices, activeDevice },
- } = useMetadataServerSettings();
-
- useEffect(() => {
- if (activeDevice === getActiveDevice()) {
- return;
- }
-
- setActiveDevice(activeDevice);
- }, [devices, activeDevice]);
-
- const memorizedChildren = useMemo(() => children, [activeDevice]);
-
- return {memorizedChildren};
-};
-
export const App: React.FC = () => (
-
-
-
-
-
-
-
-
- {/* General Routes */}
- } />
-
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
-
-
- {/* Manga Routes */}
-
-
- } />
- } />
- } />
- } />
-
- } />
-
-
- } />
-
- } />
- } />
- } />
- } />
-
- } />
- } />
-
-
-
+
+
+
+
+
+
- } />
-
+ {/* General Routes */}
+ } />
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+ {/* Manga Routes */}
+
+
+ } />
+ } />
+ } />
+ } />
+
+ } />
+
+
+ } />
+
+ } />
+ } />
+ } />
+ } />
+
+ } />
+ } />
+
-
+
+
+ } />
+
+
);
diff --git a/src/components/context/AppContext.tsx b/src/components/context/AppContext.tsx
index 9e2193b4..0a713223 100644
--- a/src/components/context/AppContext.tsx
+++ b/src/components/context/AppContext.tsx
@@ -16,6 +16,7 @@ import { useLocalStorage } from '@/util/useLocalStorage';
import { DarkTheme } from '@/components/context/DarkTheme';
import { NavBarContextProvider } from '@/components/navbar/NavBarContextProvider';
import { LibraryOptionsContextProvider } from '@/components/library/LibraryOptionsProvider';
+import { ActiveDevice, DEFAULT_DEVICE, setActiveDevice } from '@/util/device.ts';
interface Props {
children: React.ReactNode;
@@ -23,6 +24,7 @@ interface Props {
export const AppContext: React.FC = ({ children }) => {
const [darkTheme, setDarkTheme] = useLocalStorage('darkTheme', true);
+ const [activeDevice, setActiveDeviceContext] = useLocalStorage('activeDevice', DEFAULT_DEVICE);
const darkThemeContext = useMemo(
() => ({
@@ -32,8 +34,15 @@ export const AppContext: React.FC = ({ children }) => {
[darkTheme],
);
+ const activeDeviceContext = useMemo(
+ () => ({ activeDevice, setActiveDevice: setActiveDeviceContext }),
+ [activeDevice],
+ );
+
const theme = useMemo(() => createTheme(darkTheme), [darkTheme]);
+ setActiveDevice(activeDevice);
+
return (
@@ -41,7 +50,11 @@ export const AppContext: React.FC = ({ children }) => {
- {children}
+
+
+ {children}
+
+
diff --git a/src/components/settings/DeviceSetting.tsx b/src/components/settings/DeviceSetting.tsx
index b1c6a5ed..a13f6b24 100644
--- a/src/components/settings/DeviceSetting.tsx
+++ b/src/components/settings/DeviceSetting.tsx
@@ -14,13 +14,15 @@ import { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts'
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts';
import { makeToast } from '@/components/util/Toast.tsx';
import { MutableListSetting } from '@/components/settings/MutableListSetting.tsx';
-import { NavBarContext } from '@/components/context/NavbarContext.tsx';
-import { DEFAULT_DEVICE } from '@/util/device.ts';
+import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
+import { ActiveDevice, DEFAULT_DEVICE } from '@/util/device.ts';
export const DeviceSetting = () => {
const { t } = useTranslation();
const { setTitle, setAction } = useContext(NavBarContext);
+ useSetDefaultBackTo('settings');
+
useEffect(() => {
setTitle(t('settings.device.title.settings'));
setAction(null);
@@ -33,10 +35,12 @@ export const DeviceSetting = () => {
const {
metadata,
- settings: { devices, activeDevice },
+ settings: { devices },
} = useMetadataServerSettings();
- const updateMetadataSetting = async (
+ const { activeDevice, setActiveDevice } = useContext(ActiveDevice);
+
+ const updateMetadataSetting = (
setting: Setting,
value: MetadataServerSettings[Setting],
) => {
@@ -46,14 +50,7 @@ export const DeviceSetting = () => {
const wasActiveDeviceDeleted = setting === 'devices' && !(value as string[]).includes(activeDevice);
if (wasActiveDeviceDeleted) {
- try {
- await requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [
- ['activeDevice', convertSettingsToMetadata({ activeDevice: DEFAULT_DEVICE }).activeDevice],
- ]);
- } catch (e) {
- makeToast(t('global.error.label.failed_to_save_changes'), 'error');
- return;
- }
+ setActiveDevice(DEFAULT_DEVICE);
}
requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [
@@ -82,7 +79,7 @@ export const DeviceSetting = () => {