diff --git a/src/components/settings/DeviceSetting.tsx b/src/components/settings/DeviceSetting.tsx index 3f01c89d..f4b6eb92 100644 --- a/src/components/settings/DeviceSetting.tsx +++ b/src/components/settings/DeviceSetting.tsx @@ -11,7 +11,7 @@ import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; import MenuItem from '@mui/material/MenuItem'; import { useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import { updateMetadataServerSettings, useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts'; import { makeToast } from '@/components/util/Toast.tsx'; @@ -27,7 +27,7 @@ export const DeviceSetting = () => { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.device.title.settings')); setAction(null); diff --git a/src/screens/Browse.tsx b/src/screens/Browse.tsx index 7d458c73..cd531fc1 100644 --- a/src/screens/Browse.tsx +++ b/src/screens/Browse.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useCallback, useContext, useEffect, useRef, useState } from 'react'; +import { useCallback, useContext, useLayoutEffect, useRef, useState } from 'react'; import Tab from '@mui/material/Tab'; import { useTranslation } from 'react-i18next'; import { Sources } from '@/screens/Sources'; @@ -31,7 +31,7 @@ export function Browse() { const [tabNum, setTabNum] = useState(0); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('global.label.browse')); }, [t]); diff --git a/src/screens/DownloadQueue.tsx b/src/screens/DownloadQueue.tsx index c68b24a5..0e4ed53a 100644 --- a/src/screens/DownloadQueue.tsx +++ b/src/screens/DownloadQueue.tsx @@ -16,7 +16,7 @@ import Stack from '@mui/material/Stack'; import Box, { BoxProps } from '@mui/material/Box'; import Tooltip from '@mui/material/Tooltip'; import IconButton from '@mui/material/IconButton'; -import React, { useContext, useEffect } from 'react'; +import React, { useContext, useEffect, useLayoutEffect } from 'react'; import { DragDropContext, Draggable, DraggableProvided, DropResult } from 'react-beautiful-dnd'; import Typography from '@mui/material/Typography'; import { Link } from 'react-router-dom'; @@ -152,7 +152,7 @@ export const DownloadQueue: React.FC = () => { } }; - useEffect(() => { + useLayoutEffect(() => { setTitle(t('download.queue.title')); setAction( <> diff --git a/src/screens/Extensions.tsx b/src/screens/Extensions.tsx index 36b11ee3..d5d2545b 100644 --- a/src/screens/Extensions.tsx +++ b/src/screens/Extensions.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; +import { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { fromEvent } from 'file-selector'; import IconButton from '@mui/material/IconButton'; import AddIcon from '@mui/icons-material/Add'; @@ -174,7 +174,7 @@ export function Extensions({ tabsMenuHeight }: { tabsMenuHeight: number }) { } }; - useEffect(() => { + useLayoutEffect(() => { setAction( <> diff --git a/src/screens/Library.tsx b/src/screens/Library.tsx index 998c8d83..c6e6bb28 100644 --- a/src/screens/Library.tsx +++ b/src/screens/Library.tsx @@ -9,7 +9,7 @@ import Chip, { ChipProps } from '@mui/material/Chip'; import Tab from '@mui/material/Tab'; import { styled } from '@mui/material/styles'; -import { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useState } from 'react'; +import { useCallback, useContext, useLayoutEffect, useMemo, useState } from 'react'; import { useQueryParam, NumberParam } from 'use-query-params'; import { useTranslation } from 'react-i18next'; import { requestManager } from '@/lib/requests/RequestManager.ts'; @@ -158,7 +158,7 @@ export function Library() { }, [isSelectModeActive, selectedMangas]); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { const title = t('library.title'); const navBarTitle = ( diff --git a/src/screens/Manga.tsx b/src/screens/Manga.tsx index 77f58f74..8fb6c6a1 100644 --- a/src/screens/Manga.tsx +++ b/src/screens/Manga.tsx @@ -12,7 +12,7 @@ import IconButton from '@mui/material/IconButton'; import Stack from '@mui/material/Stack'; import Tooltip from '@mui/material/Tooltip'; import Box from '@mui/material/Box'; -import React, { useContext, useEffect, useRef } from 'react'; +import React, { useContext, useEffect, useLayoutEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router-dom'; import { isNetworkRequestInFlight } from '@apollo/client/core/networkStatus'; @@ -58,7 +58,7 @@ export const Manga: React.FC = () => { } }, [manga]); - useEffect(() => { + useLayoutEffect(() => { setTitle(manga?.title ?? t('manga.title_one')); setAction(null); @@ -68,7 +68,7 @@ export const Manga: React.FC = () => { }; }, [t, manga?.title]); - useEffect(() => { + useLayoutEffect(() => { setAction( { notifyOnNetworkStatusChange: true, }); - useEffect(() => { + useLayoutEffect(() => { setTitle(name ?? sourceId ?? t('migrate.title')); setAction(); diff --git a/src/screens/Reader.tsx b/src/screens/Reader.tsx index dbc7c065..104034d8 100644 --- a/src/screens/Reader.tsx +++ b/src/screens/Reader.tsx @@ -7,7 +7,7 @@ */ import CircularProgress from '@mui/material/CircularProgress'; -import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; +import { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; import Box from '@mui/material/Box'; import { useTranslation } from 'react-i18next'; @@ -407,7 +407,7 @@ export function Reader() { } else setCurPage(chapter.lastPageRead); }, [chapter, isLoading]); - useEffect(() => { + useLayoutEffect(() => { if (!manga?.title || chapter.name === t('global.label.loading')) { setTitle(t('reader.title')); } else { @@ -424,7 +424,7 @@ export function Reader() { } }, [areDefaultSettingsLoading, isMangaLoading]); - useEffect(() => { + useLayoutEffect(() => { // set the custom navbar setOverride({ status: true, diff --git a/src/screens/SearchAll.tsx b/src/screens/SearchAll.tsx index 9e4bd348..9f745b79 100644 --- a/src/screens/SearchAll.tsx +++ b/src/screens/SearchAll.tsx @@ -9,7 +9,7 @@ import Card from '@mui/material/Card'; import CardActionArea from '@mui/material/CardActionArea'; import Typography from '@mui/material/Typography'; -import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useState } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { StringParam, useQueryParam } from 'use-query-params'; import { useTranslation } from 'react-i18next'; @@ -234,7 +234,7 @@ export const SearchAll: React.FC = () => { [setSourceToLoadingStateMap], ); - useEffect(() => { + useLayoutEffect(() => { setTitle(t(isMigrateMode ? 'migrate.search.title' : 'search.title.global_search', { title: mangaTitle })); setAction( <> diff --git a/src/screens/Settings.tsx b/src/screens/Settings.tsx index cd7af602..24487308 100644 --- a/src/screens/Settings.tsx +++ b/src/screens/Settings.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import AutoStoriesIcon from '@mui/icons-material/AutoStories'; import List from '@mui/material/List'; import ListAltIcon from '@mui/icons-material/ListAlt'; @@ -34,7 +34,7 @@ export function Settings() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.title')); setAction(null); diff --git a/src/screens/SourceConfigure.tsx b/src/screens/SourceConfigure.tsx index 1ebe77e6..2a41b186 100644 --- a/src/screens/SourceConfigure.tsx +++ b/src/screens/SourceConfigure.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { createElement, useContext, useEffect } from 'react'; +import { createElement, useContext, useLayoutEffect } from 'react'; import { useParams } from 'react-router-dom'; import List from '@mui/material/List'; import { useTranslation } from 'react-i18next'; @@ -46,7 +46,7 @@ export function SourceConfigure() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('source.configuration.title')); setAction(null); diff --git a/src/screens/SourceMangas.tsx b/src/screens/SourceMangas.tsx index ae3133d5..24486e45 100644 --- a/src/screens/SourceMangas.tsx +++ b/src/screens/SourceMangas.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useCallback, useContext, useEffect, useMemo, useState } from 'react'; +import { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useState } from 'react'; import { useParams, useNavigate, useLocation } from 'react-router-dom'; import IconButton from '@mui/material/IconButton'; import SettingsIcon from '@mui/icons-material/Settings'; @@ -397,7 +397,7 @@ export function SourceMangas() { [query], ); - useEffect(() => { + useLayoutEffect(() => { setTitle(source?.displayName ?? t('source.title_one')); setAction( <> diff --git a/src/screens/Sources.tsx b/src/screens/Sources.tsx index d4b11e91..3d254979 100644 --- a/src/screens/Sources.tsx +++ b/src/screens/Sources.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { Fragment, useContext, useEffect, useMemo } from 'react'; +import { Fragment, useContext, useEffect, useLayoutEffect, useMemo } from 'react'; import IconButton from '@mui/material/IconButton'; import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; @@ -92,7 +92,7 @@ export function Sources() { }); }, []); - useEffect(() => { + useLayoutEffect(() => { setAction( <> diff --git a/src/screens/Updates.tsx b/src/screens/Updates.tsx index e55acbf6..c252f491 100644 --- a/src/screens/Updates.tsx +++ b/src/screens/Updates.tsx @@ -15,7 +15,7 @@ import Card from '@mui/material/Card'; import CardContent from '@mui/material/CardContent'; import IconButton from '@mui/material/IconButton'; import Typography from '@mui/material/Typography'; -import React, { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useContext, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import Refresh from '@mui/icons-material/Refresh'; @@ -88,7 +88,7 @@ export const Updates: React.FC = () => { }); const lastUpdateTimestamp = lastUpdateTimestampData?.lastUpdateTimestamp.timestamp; - useEffect(() => { + useLayoutEffect(() => { setTitle(t('updates.title')); setAction(); diff --git a/src/screens/settings/About.tsx b/src/screens/settings/About.tsx index 9697f890..f3179ee4 100644 --- a/src/screens/settings/About.tsx +++ b/src/screens/settings/About.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; @@ -195,7 +195,7 @@ export function About() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.about.title')); setAction(null); diff --git a/src/screens/settings/Backup.tsx b/src/screens/settings/Backup.tsx index 56dd5d4a..20436314 100644 --- a/src/screens/settings/Backup.tsx +++ b/src/screens/settings/Backup.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useContext, useEffect, useState } from 'react'; +import { useContext, useEffect, useLayoutEffect, useState } from 'react'; import List from '@mui/material/List'; import ListItemText from '@mui/material/ListItemText'; import { fromEvent } from 'file-selector'; @@ -58,7 +58,7 @@ let backupRestoreId: string | undefined; export function Backup() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.backup.title')); setAction(null); diff --git a/src/screens/settings/BrowseSettings.tsx b/src/screens/settings/BrowseSettings.tsx index 6cce8623..5e4e4e6a 100644 --- a/src/screens/settings/BrowseSettings.tsx +++ b/src/screens/settings/BrowseSettings.tsx @@ -7,7 +7,7 @@ */ import { Trans, useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; @@ -40,7 +40,7 @@ export const BrowseSettings = () => { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.browse.title')); setAction(null); }, [t]); diff --git a/src/screens/settings/Categories.tsx b/src/screens/settings/Categories.tsx index c734923e..e8e6c610 100644 --- a/src/screens/settings/Categories.tsx +++ b/src/screens/settings/Categories.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useMemo, useState, useContext, useEffect } from 'react'; +import { useMemo, useState, useContext, useLayoutEffect } from 'react'; import IconButton from '@mui/material/IconButton'; import Tooltip from '@mui/material/Tooltip'; import { DragDropContext, Draggable, DraggableProvided, DropResult } from 'react-beautiful-dnd'; @@ -100,7 +100,7 @@ export function Categories() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('category.title.category_other')); setAction(null); diff --git a/src/screens/settings/DefaultReaderSettings.tsx b/src/screens/settings/DefaultReaderSettings.tsx index 5cde9177..11ae840d 100644 --- a/src/screens/settings/DefaultReaderSettings.tsx +++ b/src/screens/settings/DefaultReaderSettings.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { AllowedMetadataValueTypes, IReaderSettings } from '@/typings'; import { convertToGqlMeta, requestUpdateServerMetadata } from '@/lib/metadata/metadata.ts'; @@ -25,7 +25,7 @@ import { LoadingPlaceholder } from '@/components/util/LoadingPlaceholder.tsx'; export function DefaultReaderSettings() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('reader.settings.title.default_reader_settings')); setAction(null); diff --git a/src/screens/settings/DownloadSettings.tsx b/src/screens/settings/DownloadSettings.tsx index 0381a345..d1c72677 100644 --- a/src/screens/settings/DownloadSettings.tsx +++ b/src/screens/settings/DownloadSettings.tsx @@ -7,7 +7,7 @@ */ import { useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; @@ -55,7 +55,7 @@ export const DownloadSettings = () => { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('download.settings.title')); setAction(null); diff --git a/src/screens/settings/LibraryDuplicates.tsx b/src/screens/settings/LibraryDuplicates.tsx index 61dc3457..b7b7b43c 100644 --- a/src/screens/settings/LibraryDuplicates.tsx +++ b/src/screens/settings/LibraryDuplicates.tsx @@ -7,7 +7,7 @@ */ import { useTranslation } from 'react-i18next'; -import { useContext, useEffect, useMemo } from 'react'; +import { useContext, useLayoutEffect, useMemo } from 'react'; import IconButton from '@mui/material/IconButton'; import SettingsIcon from '@mui/icons-material/Settings'; import PopupState, { bindMenu, bindTrigger } from 'material-ui-popup-state'; @@ -118,7 +118,7 @@ export const LibraryDuplicates = () => { ); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('library.settings.advanced.duplicates.label.title')); setAction( <> diff --git a/src/screens/settings/LibrarySettings.tsx b/src/screens/settings/LibrarySettings.tsx index e6255e5b..e0dbf45b 100644 --- a/src/screens/settings/LibrarySettings.tsx +++ b/src/screens/settings/LibrarySettings.tsx @@ -7,7 +7,7 @@ */ import { useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemButton from '@mui/material/ListItemButton'; @@ -64,7 +64,7 @@ export function LibrarySettings() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('library.settings.title')); setAction(null); diff --git a/src/screens/settings/ServerSettings.tsx b/src/screens/settings/ServerSettings.tsx index 769dda84..4ae80113 100644 --- a/src/screens/settings/ServerSettings.tsx +++ b/src/screens/settings/ServerSettings.tsx @@ -7,7 +7,7 @@ */ import { useTranslation, Trans } from 'react-i18next'; -import { useContext, useEffect, useMemo } from 'react'; +import { useContext, useLayoutEffect, useMemo } from 'react'; import Link from '@mui/material/Link'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; @@ -96,7 +96,7 @@ export const ServerSettings = () => { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.server.title.settings')); setAction(null); diff --git a/src/screens/settings/TrackingSettings.tsx b/src/screens/settings/TrackingSettings.tsx index ca827284..8d244ba1 100644 --- a/src/screens/settings/TrackingSettings.tsx +++ b/src/screens/settings/TrackingSettings.tsx @@ -7,7 +7,7 @@ */ import { useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListSubheader from '@mui/material/ListSubheader'; @@ -33,7 +33,7 @@ export const TrackingSettings = () => { const { t } = useTranslation(); const { setTitle } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('tracking.settings.title.settings')); }, [t]); diff --git a/src/screens/settings/WebUISettings.tsx b/src/screens/settings/WebUISettings.tsx index 522be191..c468e4a3 100644 --- a/src/screens/settings/WebUISettings.tsx +++ b/src/screens/settings/WebUISettings.tsx @@ -7,7 +7,7 @@ */ import { useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; @@ -120,7 +120,7 @@ export const WebUISettings = () => { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.webui.title.settings')); setAction(null); diff --git a/src/screens/settings/appearance/Appearance.tsx b/src/screens/settings/appearance/Appearance.tsx index b708724b..5df369b1 100644 --- a/src/screens/settings/appearance/Appearance.tsx +++ b/src/screens/settings/appearance/Appearance.tsx @@ -7,7 +7,7 @@ */ import { useTranslation } from 'react-i18next'; -import { useContext, useEffect } from 'react'; +import { useContext, useLayoutEffect } from 'react'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; @@ -40,7 +40,7 @@ export const Appearance = () => { const { themeMode, setThemeMode, pureBlackMode, setPureBlackMode, appTheme } = useContext(ThemeModeContext); const { setTitle, setAction } = useContext(NavBarContext); - useEffect(() => { + useLayoutEffect(() => { setTitle(t('settings.appearance.title')); setAction(null);