Merge "Context" and "ContextProvider" components

This commit is contained in:
schroda
2025-08-16 02:14:49 +02:00
parent f548ba9502
commit f4c06d474d
65 changed files with 290 additions and 422 deletions

View File

@@ -36,7 +36,7 @@ import { ChapterActionMenuItems } from '@/features/chapter/components/actions/Ch
import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts';
import { LoadingPlaceholder } from '@/features/core/components/feedback/LoadingPlaceholder.tsx';
import { GET_CHAPTERS_MANGA } from '@/lib/graphql/queries/ChapterQuery.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { MediaQuery } from '@/features/core/utils/MediaQuery.tsx';
import { shouldForwardProp } from '@/features/core/utils/ShouldForwardProp.ts';

View File

@@ -9,7 +9,7 @@
import Tabs, { TabsProps } from '@mui/material/Tabs';
import { styled } from '@mui/material/styles';
import { ForwardedRef, forwardRef } from 'react';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
const StyledTabsMenu = styled(Tabs)(({ theme }) => ({
display: 'flex',

View File

@@ -9,7 +9,7 @@
import { ContextProp, TopItemListProps } from 'react-virtuoso';
import { ComponentProps, useMemo } from 'react';
import Box from '@mui/material/Box';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { GroupedVirtuosoPersisted } from '@/lib/virtuoso/Component/GroupedVirtuosoPersisted.tsx';
const StickyVirtuosoHeaderWithOffset =

View File

@@ -12,13 +12,13 @@ import { BrowserRouter as Router } from 'react-router-dom';
import { QueryParamProvider } from 'use-query-params';
import { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6';
import { SnackbarProvider } from 'notistack';
import { NavBarContextProvider } from '@/features/navigation-bar/contexts/NavBarContextProvider.tsx';
import { ActiveDeviceContextProvider } from '@/features/device/contexts/DeviceContext.tsx';
import { ActiveDeviceContextProvider } from '@/features/device/DeviceContext.tsx';
import { ReaderContextProvider } from '@/features/reader/contexts/ReaderContextProvider.tsx';
import { AppHotkeysProvider } from '@/features/hotkeys/contexts/AppHotkeysProvider.tsx';
import { AppHotkeysProvider } from '@/features/hotkeys/AppHotkeysProvider.tsx';
import { SnackbarWithDescription } from '@/features/core/components/feedback/SnackbarWithDescription.tsx';
import { AppPageHistoryContextProvider } from '@/features/core/contexts/AppPageHistoryContextProvider.tsx';
import { AppThemeContextProvider } from '@/features/theme/contexts/AppThemeContextProvider.tsx';
import { AppPageHistoryContextProvider } from '@/features/core/contexts/AppPageHistoryContext.tsx';
import { AppThemeContextProvider } from '@/features/theme/AppThemeContext.tsx';
import { NavBarContextProvider } from '@/features/navigation-bar/NavbarContext.tsx';
interface Props {
children: React.ReactNode;

View File

@@ -7,7 +7,14 @@
*/
import { createContext, useContext } from 'react';
import { useHistory } from '@/features/core/hooks/useHistory.ts';
export const AppPageHistoryContext = createContext<string[]>([]);
export const useAppPageHistoryContext = () => useContext(AppPageHistoryContext);
export const AppPageHistoryContextProvider = ({ children }: { children: React.ReactNode }) => {
const history = useHistory();
return <AppPageHistoryContext.Provider value={history}>{children}</AppPageHistoryContext.Provider>;
};

View File

@@ -1,17 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import React from 'react';
import { AppPageHistoryContext } from '@/features/core/contexts/AppPageHistoryContext.tsx';
import { useHistory } from '@/features/core/hooks/useHistory.ts';
export const AppPageHistoryContextProvider = ({ children }: { children: React.ReactNode }) => {
const history = useHistory();
return <AppPageHistoryContext.Provider value={history}>{children}</AppPageHistoryContext.Provider>;
};

View File

@@ -10,7 +10,7 @@ import useMediaQuery from '@mui/material/useMediaQuery';
import { Breakpoint, SxProps, Theme } from '@mui/material/styles';
import { useCallback, useState } from 'react';
import { getCurrentTheme } from '@/features/theme/services/ThemeCreator.ts';
import { ThemeMode } from '@/features/theme/contexts/AppThemeContext.tsx';
import { ThemeMode } from '@/features/theme/AppThemeContext.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
export class MediaQuery {

View File

@@ -17,7 +17,7 @@ import {
} from '@/features/settings/services/ServerSettingsMetadata.ts';
import { makeToast } from '@/features/core/utils/Toast.ts';
import { MutableListSetting } from '@/features/core/components/settings/MutableListSetting.tsx';
import { useDeviceContext } from '@/features/device/contexts/DeviceContext.tsx';
import { useDeviceContext } from '@/features/device/DeviceContext.tsx';
import { Select } from '@/features/core/components/inputs/Select.tsx';
import { LoadingPlaceholder } from '@/features/core/components/feedback/LoadingPlaceholder.tsx';
import { EmptyViewAbsoluteCentered } from '@/features/core/components/feedback/EmptyViewAbsoluteCentered.tsx';

View File

@@ -28,7 +28,7 @@ import { DEFAULT_FULL_FAB_HEIGHT } from '@/features/core/components/buttons/Styl
import { MangaCardProps } from '@/features/manga/Manga.types.ts';
import { MangaType } from '@/lib/graphql/generated/graphql.ts';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { GridLayout } from '@/features/core/Core.types.ts';
import { useMetadataServerSettings } from '@/features/settings/services/ServerSettingsMetadata.ts';
import { VirtuosoGridPersisted } from '@/lib/virtuoso/Component/VirtuosoGridPersisted.tsx';

View File

@@ -18,7 +18,7 @@ import { Mangas } from '@/features/manga/services/Mangas.ts';
import { SpinnerImage } from '@/features/core/components/SpinnerImage.tsx';
import { MANGA_COVER_ASPECT_RATIO } from '@/features/manga/Manga.constants.ts';
import { MangaThumbnailInfo } from '@/features/manga/Manga.types.ts';
import { TAppThemeContext, useAppThemeContext } from '@/features/theme/contexts/AppThemeContext.tsx';
import { TAppThemeContext, useAppThemeContext } from '@/features/theme/AppThemeContext.tsx';
export const Thumbnail = ({
manga,

View File

@@ -29,7 +29,7 @@ import {
useMetadataServerSettings,
} from '@/features/settings/services/ServerSettingsMetadata.ts';
import { makeToast } from '@/features/core/utils/Toast.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
const getMigratableSources = (

View File

@@ -6,10 +6,30 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import React, { useCallback, useMemo, useState } from 'react';
import { NavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import React, { useContext, useCallback, useMemo, useState } from 'react';
import { INavbarOverride, NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
import { useLocalStorage } from '@/features/core/hooks/useStorage.tsx';
import { INavbarOverride } from '@/features/navigation-bar/NavigationBar.types.ts';
export const NavBarContext = React.createContext<NavbarContextType>({
title: 'Suwayomi',
setTitle: (): void => {},
appBarHeight: 0,
setAppBarHeight: (): void => {},
action: <div />,
setAction: (): void => {},
override: { status: false, value: <div /> },
setOverride: (): void => {},
isCollapsed: false,
setIsCollapsed: (): void => {},
navBarWidth: 0,
setNavBarWidth: (): void => {},
readerNavBarWidth: 0,
setReaderNavBarWidth: (): void => {},
bottomBarHeight: 0,
setBottomBarHeight: (): void => {},
});
export const useNavBarContext = () => useContext(NavBarContext);
interface IProps {
children: React.ReactNode;

View File

@@ -23,7 +23,7 @@ import { MediaQuery } from '@/features/core/utils/MediaQuery.tsx';
import { DesktopSideBar } from '@/features/navigation-bar/components/DesktopSideBar.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { MobileBottomBar } from '@/features/navigation-bar/components/MobileBottomBar.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useMetadataServerSettings } from '@/features/settings/services/ServerSettingsMetadata.ts';
import { NAVIGATION_BAR_ITEMS } from '@/features/navigation-bar/NavigationBar.constants.ts';
import { NavigationBarUtil } from '@/features/navigation-bar/NavigationBar.util.ts';

View File

@@ -25,7 +25,7 @@ import Typography from '@mui/material/Typography';
import { CustomTooltip } from '@/features/core/components/CustomTooltip.tsx';
import { ListItemLink } from '@/features/core/components/lists/ListItemLink.tsx';
import { useGetOptionForDirection } from '@/features/theme/services/ThemeCreator.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { NavbarItem } from '@/features/navigation-bar/NavigationBar.types.ts';
import { TypographyMaxLines } from '@/features/core/components/texts/TypographyMaxLines.tsx';

View File

@@ -15,7 +15,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
import { useTheme } from '@mui/material/styles';
import Badge from '@mui/material/Badge';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { NavbarItem } from '@/features/navigation-bar/NavigationBar.types.ts';
import { StaticAppRoute } from '@/features/core/AppRoute.constants.ts';

View File

@@ -1,32 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import React, { useContext } from 'react';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
export const NavBarContext = React.createContext<NavbarContextType>({
title: 'Suwayomi',
setTitle: (): void => {},
appBarHeight: 0,
setAppBarHeight: (): void => {},
action: <div />,
setAction: (): void => {},
override: { status: false, value: <div /> },
setOverride: (): void => {},
isCollapsed: false,
setIsCollapsed: (): void => {},
navBarWidth: 0,
setNavBarWidth: (): void => {},
readerNavBarWidth: 0,
setReaderNavBarWidth: (): void => {},
bottomBarHeight: 0,
setBottomBarHeight: (): void => {},
});
export const useNavBarContext = () => useContext(NavBarContext);

View File

@@ -7,7 +7,7 @@
*/
import { useEffect } from 'react';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
export const useAppAction = (action: NavbarContextType['action'], dependencies: any[] = []) => {

View File

@@ -7,7 +7,7 @@
*/
import { useLayoutEffect } from 'react';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
export function useAppTitle(

View File

@@ -6,23 +6,36 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { memo, ReactNode, useCallback, useMemo, useState } from 'react';
import { createContext, memo, ReactNode, useCallback, useContext, useMemo, useState } from 'react';
import { Direction, useTheme } from '@mui/material/styles';
import { useAutomaticScrolling } from '@/features/core/hooks/useAutomaticScrolling.ts';
import {
IReaderSettings,
ReaderScrollAmount,
ReadingMode,
TReaderAutoScrollContext,
} from '@/features/reader/Reader.types.ts';
import { ReaderAutoScrollContext } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContext.tsx';
import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
import { isContinuousReadingMode } from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { CONTINUOUS_READING_MODE_TO_SCROLL_DIRECTION } from '@/features/reader/settings/ReaderSettings.constants.tsx';
import { ScrollOffset } from '@/features/core/Core.types.ts';
import { getOptionForDirection } from '@/features/theme/services/ThemeCreator.ts';
import { isContinuousReadingMode } from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { useAutomaticScrolling } from '@/features/core/hooks/useAutomaticScrolling.ts';
import { CONTINUOUS_READING_MODE_TO_SCROLL_DIRECTION } from '@/features/reader/settings/ReaderSettings.constants.tsx';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
export const ReaderAutoScrollContext = createContext<TReaderAutoScrollContext>({
isActive: false,
isPaused: false,
setScrollRef: () => {},
start: () => {},
cancel: () => {},
toggleActive: () => {},
pause: () => {},
resume: () => {},
setDirection: () => {},
});
export const useReaderAutoScrollContext = () => useContext(ReaderAutoScrollContext);
const BaseReaderAutoScrollContextProvider = ({
children,

View File

@@ -1,24 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { TReaderAutoScrollContext } from '@/features/reader/Reader.types.ts';
export const ReaderAutoScrollContext = createContext<TReaderAutoScrollContext>({
isActive: false,
isPaused: false,
setScrollRef: () => {},
start: () => {},
cancel: () => {},
toggleActive: () => {},
pause: () => {},
resume: () => {},
setDirection: () => {},
});
export const useReaderAutoScrollContext = () => useContext(ReaderAutoScrollContext);

View File

@@ -14,7 +14,7 @@ import Stack from '@mui/material/Stack';
import TextField from '@mui/material/TextField';
import InputAdornment from '@mui/material/InputAdornment';
import { useRef } from 'react';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContext.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
import { IReaderSettings } from '@/features/reader/Reader.types.ts';
import { AUTO_SCROLL_SPEED } from '@/features/reader/settings/ReaderSettings.constants.tsx';
import { coerceIn } from '@/lib/HelperFunctions.ts';

View File

@@ -7,12 +7,12 @@
*/
import { ReactNode } from 'react';
import { ReaderTapZoneContextProvider } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContextProvider.tsx';
import { ReaderProgressBarContextProvider } from '@/features/reader/overlay/progress-bar/contexts/ReaderProgressBarContextProvider.tsx';
import { ReaderOverlayContextProvider } from '@/features/reader/overlay/contexts/ReaderOverlayContextProvider.tsx';
import { ReaderStateContextProvider } from '@/features/reader/contexts/state/ReaderStateContextProvider.tsx';
import { ReaderScrollbarContextProvider } from '@/features/reader/contexts/ReaderScrollbarContextProvider.tsx';
import { ReaderAutoScrollContextProvider } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContextProvider.tsx';
import { ReaderScrollbarContextProvider } from '@/features/reader/contexts/ReaderScrollbarContext.tsx';
import { ReaderAutoScrollContextProvider } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
import { ReaderOverlayContextProvider } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
import { ReaderProgressBarContextProvider } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
import { ReaderTapZoneContextProvider } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
export const ReaderContextProvider = ({ children }: { children?: ReactNode }) => (
<ReaderStateContextProvider>

View File

@@ -6,7 +6,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { createContext, ReactNode, useContext, useMemo, useState } from 'react';
import { TReaderScrollbarContext } from '@/features/reader/Reader.types.ts';
export const ReaderScrollbarContext = createContext<TReaderScrollbarContext>({
@@ -17,3 +17,15 @@ export const ReaderScrollbarContext = createContext<TReaderScrollbarContext>({
});
export const useReaderScrollbarContext = () => useContext(ReaderScrollbarContext);
export const ReaderScrollbarContextProvider = ({ children }: { children: ReactNode }) => {
const [scrollbarXSize, setScrollbarXSize] = useState(0);
const [scrollbarYSize, setScrollbarYSize] = useState(0);
const value = useMemo(
() => ({ scrollbarXSize, setScrollbarXSize, scrollbarYSize, setScrollbarYSize }),
[scrollbarXSize, scrollbarYSize],
);
return <ReaderScrollbarContext.Provider value={value}>{children}</ReaderScrollbarContext.Provider>;
};

View File

@@ -1,22 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderScrollbarContext } from '@/features/reader/contexts/ReaderScrollbarContext.tsx';
export const ReaderScrollbarContextProvider = ({ children }: { children: ReactNode }) => {
const [scrollbarXSize, setScrollbarXSize] = useState(0);
const [scrollbarYSize, setScrollbarYSize] = useState(0);
const value = useMemo(
() => ({ scrollbarXSize, setScrollbarXSize, scrollbarYSize, setScrollbarYSize }),
[scrollbarXSize, scrollbarYSize],
);
return <ReaderScrollbarContext.Provider value={value}>{children}</ReaderScrollbarContext.Provider>;
};

View File

@@ -6,7 +6,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { createContext, ReactNode, useContext, useMemo, useState } from 'react';
import { ReaderStateChapters } from '@/features/reader/Reader.types.ts';
export const READER_STATE_CHAPTERS_DEFAULTS: Omit<ReaderStateChapters, 'setReaderStateChapters'> = {
@@ -30,3 +30,18 @@ export const ReaderStateChaptersContext = createContext<ReaderStateChapters>({
});
export const useReaderStateChaptersContext = () => useContext(ReaderStateChaptersContext);
export const ReaderStateChaptersContextProvider = ({ children }: { children: ReactNode }) => {
const [state, setState] =
useState<Omit<ReaderStateChapters, 'setReaderStateChapters'>>(READER_STATE_CHAPTERS_DEFAULTS);
const value = useMemo(
() => ({
...state,
setReaderStateChapters: setState,
}),
[state],
);
return <ReaderStateChaptersContext.Provider value={value}>{children}</ReaderStateChaptersContext.Provider>;
};

View File

@@ -1,29 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import {
READER_STATE_CHAPTERS_DEFAULTS,
ReaderStateChaptersContext,
} from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
import { ReaderStateChapters } from '@/features/reader/Reader.types.ts';
export const ReaderStateChaptersContextProvider = ({ children }: { children: ReactNode }) => {
const [state, setState] =
useState<Omit<ReaderStateChapters, 'setReaderStateChapters'>>(READER_STATE_CHAPTERS_DEFAULTS);
const value = useMemo(
() => ({
...state,
setReaderStateChapters: setState,
}),
[state],
);
return <ReaderStateChaptersContext.Provider value={value}>{children}</ReaderStateChaptersContext.Provider>;
};

View File

@@ -7,10 +7,10 @@
*/
import { ReactNode } from 'react';
import { ReaderStatePagesContextProvider } from '@/features/reader/contexts/state/ReaderStatePagesContextProvider.tsx';
import { ReaderStateChaptersContextProvider } from '@/features/reader/contexts/state/ReaderStateChaptersContextProvider.tsx';
import { ReaderStateMangaContextProvider } from '@/features/reader/contexts/state/ReaderStateMangaContextProvider.tsx';
import { ReaderStateSettingsContextProvider } from '@/features/reader/contexts/state/ReaderStateSettingsContextProvider.tsx';
import { ReaderStateChaptersContextProvider } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
import { ReaderStateMangaContextProvider } from '@/features/reader/contexts/state/ReaderStateMangaContext.tsx';
import { ReaderStatePagesContextProvider } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
import { ReaderStateSettingsContextProvider } from '@/features/reader/contexts/state/ReaderStateSettingsContext.tsx';
export const ReaderStateContextProvider = ({ children }: { children: ReactNode }) => (
<ReaderStateMangaContextProvider>

View File

@@ -6,7 +6,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { createContext, ReactNode, useContext, useMemo, useState } from 'react';
import { TReaderStateMangaContext } from '@/features/reader/Reader.types.ts';
export const ReaderStateMangaContext = createContext<TReaderStateMangaContext>({
@@ -15,3 +15,11 @@ export const ReaderStateMangaContext = createContext<TReaderStateMangaContext>({
});
export const useReaderStateMangaContext = () => useContext(ReaderStateMangaContext);
export const ReaderStateMangaContextProvider = ({ children }: { children: ReactNode }) => {
const [manga, setManga] = useState<TReaderStateMangaContext['manga']>();
const value = useMemo(() => ({ manga, setManga }), [manga]);
return <ReaderStateMangaContext.Provider value={value}>{children}</ReaderStateMangaContext.Provider>;
};

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderStateMangaContext } from '@/features/reader/contexts/state/ReaderStateMangaContext.tsx';
import { TReaderStateMangaContext } from '@/features/reader/Reader.types.ts';
export const ReaderStateMangaContextProvider = ({ children }: { children: ReactNode }) => {
const [manga, setManga] = useState<TReaderStateMangaContext['manga']>();
const value = useMemo(() => ({ manga, setManga }), [manga]);
return <ReaderStateMangaContext.Provider value={value}>{children}</ReaderStateMangaContext.Provider>;
};

View File

@@ -6,9 +6,10 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { createContext, ReactNode, useContext, useMemo, useState } from 'react';
import { ReaderStatePages } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
import { ReaderTransitionPageMode } from '@/features/reader/Reader.types.ts';
import { READER_STATE_PAGES_DEFAULTS } from '@/features/reader/ReaderContext.constants.ts';
export const ReaderStatePagesContext = createContext<ReaderStatePages>({
totalPages: 0,
@@ -30,3 +31,59 @@ export const ReaderStatePagesContext = createContext<ReaderStatePages>({
});
export const userReaderStatePagesContext = () => useContext(ReaderStatePagesContext);
export const ReaderStatePagesContextProvider = ({ children }: { children: ReactNode }) => {
const [totalPages, setTotalPages] = useState<ReaderStatePages['totalPages']>(
READER_STATE_PAGES_DEFAULTS.totalPages,
);
const [currentPageIndex, setCurrentPageIndex] = useState<ReaderStatePages['currentPageIndex']>(
READER_STATE_PAGES_DEFAULTS.currentPageIndex,
);
const [pageToScrollToIndex, setPageToScrollToIndex] = useState<ReaderStatePages['pageToScrollToIndex']>(
READER_STATE_PAGES_DEFAULTS.pageToScrollToIndex,
);
const [pageUrls, setPageUrls] = useState<ReaderStatePages['pageUrls']>(READER_STATE_PAGES_DEFAULTS.pageUrls);
const [pageLoadStates, setPageLoadStates] = useState<ReaderStatePages['pageLoadStates']>(
READER_STATE_PAGES_DEFAULTS.pageLoadStates,
);
const [pages, setPages] = useState<ReaderStatePages['pages']>(READER_STATE_PAGES_DEFAULTS.pages);
const [transitionPageMode, setTransitionPageMode] = useState<ReaderStatePages['transitionPageMode']>(
READER_STATE_PAGES_DEFAULTS.transitionPageMode,
);
const [retryFailedPagesKeyPrefix, setRetryFailedPagesKeyPrefix] = useState<
ReaderStatePages['retryFailedPagesKeyPrefix']
>(READER_STATE_PAGES_DEFAULTS.retryFailedPagesKeyPrefix);
const value = useMemo(
() => ({
totalPages,
setTotalPages,
currentPageIndex,
setCurrentPageIndex,
pageToScrollToIndex,
setPageToScrollToIndex,
pageUrls,
setPageUrls,
pageLoadStates,
setPageLoadStates,
pages,
setPages,
transitionPageMode,
setTransitionPageMode,
retryFailedPagesKeyPrefix,
setRetryFailedPagesKeyPrefix,
}),
[
totalPages,
pages,
currentPageIndex,
pageToScrollToIndex,
pageUrls,
pageLoadStates,
transitionPageMode,
retryFailedPagesKeyPrefix,
],
);
return <ReaderStatePagesContext.Provider value={value}>{children}</ReaderStatePagesContext.Provider>;
};

View File

@@ -1,68 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
import { ReaderStatePages } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
import { READER_STATE_PAGES_DEFAULTS } from '@/features/reader/ReaderContext.constants.ts';
export const ReaderStatePagesContextProvider = ({ children }: { children: ReactNode }) => {
const [totalPages, setTotalPages] = useState<ReaderStatePages['totalPages']>(
READER_STATE_PAGES_DEFAULTS.totalPages,
);
const [currentPageIndex, setCurrentPageIndex] = useState<ReaderStatePages['currentPageIndex']>(
READER_STATE_PAGES_DEFAULTS.currentPageIndex,
);
const [pageToScrollToIndex, setPageToScrollToIndex] = useState<ReaderStatePages['pageToScrollToIndex']>(
READER_STATE_PAGES_DEFAULTS.pageToScrollToIndex,
);
const [pageUrls, setPageUrls] = useState<ReaderStatePages['pageUrls']>(READER_STATE_PAGES_DEFAULTS.pageUrls);
const [pageLoadStates, setPageLoadStates] = useState<ReaderStatePages['pageLoadStates']>(
READER_STATE_PAGES_DEFAULTS.pageLoadStates,
);
const [pages, setPages] = useState<ReaderStatePages['pages']>(READER_STATE_PAGES_DEFAULTS.pages);
const [transitionPageMode, setTransitionPageMode] = useState<ReaderStatePages['transitionPageMode']>(
READER_STATE_PAGES_DEFAULTS.transitionPageMode,
);
const [retryFailedPagesKeyPrefix, setRetryFailedPagesKeyPrefix] = useState<
ReaderStatePages['retryFailedPagesKeyPrefix']
>(READER_STATE_PAGES_DEFAULTS.retryFailedPagesKeyPrefix);
const value = useMemo(
() => ({
totalPages,
setTotalPages,
currentPageIndex,
setCurrentPageIndex,
pageToScrollToIndex,
setPageToScrollToIndex,
pageUrls,
setPageUrls,
pageLoadStates,
setPageLoadStates,
pages,
setPages,
transitionPageMode,
setTransitionPageMode,
retryFailedPagesKeyPrefix,
setRetryFailedPagesKeyPrefix,
}),
[
totalPages,
pages,
currentPageIndex,
pageToScrollToIndex,
pageUrls,
pageLoadStates,
transitionPageMode,
retryFailedPagesKeyPrefix,
],
);
return <ReaderStatePagesContext.Provider value={value}>{children}</ReaderStatePagesContext.Provider>;
};

View File

@@ -6,7 +6,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { createContext, ReactNode, useContext, useMemo, useState } from 'react';
import { TReaderStateSettingsContext } from '@/features/reader/Reader.types.ts';
import { DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG } from '@/features/reader/settings/ReaderSettingsMetadata.ts';
@@ -16,3 +16,13 @@ export const ReaderStateSettingsContext = createContext<TReaderStateSettingsCont
});
export const useReaderStateSettingsContext = () => useContext(ReaderStateSettingsContext);
export const ReaderStateSettingsContextProvider = ({ children }: { children: ReactNode }) => {
const [settings, setSettings] = useState<TReaderStateSettingsContext['settings']>(
DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG,
);
const value = useMemo(() => ({ settings, setSettings }), [settings]);
return <ReaderStateSettingsContext.Provider value={value}>{children}</ReaderStateSettingsContext.Provider>;
};

View File

@@ -1,22 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderStateSettingsContext } from '@/features/reader/contexts/state/ReaderStateSettingsContext.tsx';
import { DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG } from '@/features/reader/settings/ReaderSettingsMetadata.ts';
import { TReaderStateSettingsContext } from '@/features/reader/Reader.types.ts';
export const ReaderStateSettingsContextProvider = ({ children }: { children: ReactNode }) => {
const [settings, setSettings] = useState<TReaderStateSettingsContext['settings']>(
DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG,
);
const value = useMemo(() => ({ settings, setSettings }), [settings]);
return <ReaderStateSettingsContext.Provider value={value}>{children}</ReaderStateSettingsContext.Provider>;
};

View File

@@ -8,7 +8,7 @@
import Box from '@mui/material/Box';
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { IReaderSettings } from '@/features/reader/Reader.types.ts';

View File

@@ -12,7 +12,7 @@ import { useTheme } from '@mui/material/styles';
import { HOTKEY_SCOPES } from '@/features/hotkeys/Hotkeys.constants.ts';
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { IReaderSettings, ReaderHotkey } from '@/features/reader/Reader.types.ts';
import { useReaderOverlayContext } from '@/features/reader/overlay/contexts/ReaderOverlayContext.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
import { getNextRotationValue } from '@/features/core/utils/ValueRotationButton.utils.ts';
import {
AUTO_SCROLL_SPEED,
@@ -27,8 +27,8 @@ import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
import { ScrollOffset } from '@/features/core/Core.types.ts';
import { getOptionForDirection } from '@/features/theme/services/ThemeCreator.ts';
import { FALLBACK_MANGA } from '@/features/manga/Manga.constants.ts';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
const useHotkeys = (...args: Parameters<typeof useHotKeysHook>): ReturnType<typeof useHotKeysHook> => {
const [keys, callback, options, dependencies] = args;

View File

@@ -6,8 +6,15 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderOverlayContext } from '@/features/reader/overlay/contexts/ReaderOverlayContext.tsx';
import { createContext, useContext, ReactNode, useMemo, useState } from 'react';
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
export const ReaderOverlayContext = createContext<TReaderOverlayContext>({
isVisible: false,
setIsVisible: () => {},
});
export const useReaderOverlayContext = () => useContext(ReaderOverlayContext);
export const ReaderOverlayContextProvider = ({ children }: { children: ReactNode }) => {
const [isVisible, setIsVisible] = useState(false);

View File

@@ -19,8 +19,8 @@ import {
} from '@/features/reader/Reader.types.ts';
import { userReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
import { getPage } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.utils.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/contexts/ReaderProgressBarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
import { useReaderScrollbarContext } from '@/features/reader/contexts/ReaderScrollbarContext.tsx';
import { reverseString } from '@/util/Strings.ts';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';

View File

@@ -1,17 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
export const ReaderOverlayContext = createContext<TReaderOverlayContext>({
isVisible: false,
setIsVisible: () => {},
});
export const useReaderOverlayContext = () => useContext(ReaderOverlayContext);

View File

@@ -22,7 +22,7 @@ import { ReaderNavBarDesktopPageNavigation } from '@/features/reader/overlay/nav
import { ReaderNavBarDesktopChapterNavigation } from '@/features/reader/overlay/navigation/desktop/components/ReaderNavBarDesktopChapterNavigation.tsx';
import { ReaderNavBarDesktopQuickSettings } from '@/features/reader/overlay/navigation/desktop/quick-settings/ReaderNavBarDesktopQuickSettings.tsx';
import { ReaderNavBarDesktopActions } from '@/features/reader/overlay/navigation/desktop/components/ReaderNavBarDesktopActions.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { useReaderStateMangaContext } from '@/features/reader/contexts/state/ReaderStateMangaContext.tsx';
import { userReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';

View File

@@ -23,7 +23,7 @@ import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { FALLBACK_MANGA } from '@/features/manga/Manga.constants.ts';
import { ReaderSettingAutoScroll } from '@/features/reader/auto-scroll/settings/ReaderSettingAutoScroll.tsx';
import { CheckboxInput } from '@/features/core/components/inputs/CheckboxInput.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContext.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
const BaseReaderBottomBarMobileQuickSettings = ({
manga,

View File

@@ -32,7 +32,7 @@ import { ReaderProgressBarSlotsActionArea } from '@/features/reader/overlay/prog
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/contexts/ReaderProgressBarContext.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
import { ReaderProgressBarSlotWrapper } from '@/features/reader/overlay/progress-bar/components/ReaderProgressBarSlotWrapper.tsx';
import { userReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';

View File

@@ -6,8 +6,17 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/contexts/ReaderProgressBarContext.tsx';
import { createContext, useContext, ReactNode, useMemo, useState } from 'react';
import { TReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
export const ReaderProgressBarContext = createContext<TReaderProgressBarContext>({
isMaximized: false,
setIsMaximized: () => undefined,
isDragging: false,
setIsDragging: () => undefined,
});
export const useReaderProgressBarContext = () => useContext(ReaderProgressBarContext);
export const ReaderProgressBarContextProvider = ({ children }: { children: ReactNode }) => {
const [isMaximized, setIsMaximized] = useState(false);

View File

@@ -1,19 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { TReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
export const ReaderProgressBarContext = createContext<TReaderProgressBarContext>({
isMaximized: false,
setIsMaximized: () => undefined,
isDragging: false,
setIsDragging: () => undefined,
});
export const useReaderProgressBarContext = () => useContext(ReaderProgressBarContext);

View File

@@ -21,8 +21,8 @@ import {
} from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/contexts/ReaderProgressBarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
import { useReaderScrollbarContext } from '@/features/reader/contexts/ReaderScrollbarContext.tsx';
import { ReaderProgressBarSlotDesktop } from '@/features/reader/overlay/progress-bar/desktop/components/ReaderProgressBarSlotDesktop.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';

View File

@@ -29,8 +29,8 @@ import {
TReaderScrollbarContext,
} from '@/features/reader/Reader.types.ts';
import { ReaderProgressBarDirectionWrapper } from '@/features/reader/overlay/progress-bar/components/ReaderProgressBarDirectionWrapper.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/contexts/ReaderProgressBarContext.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/contexts/ReaderOverlayContext.tsx';
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
import {

View File

@@ -11,7 +11,7 @@ import { memo, useEffect, useLayoutEffect, useRef, useState } from 'react';
import { useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { useDefaultReaderSettings } from '@/features/reader/settings/ReaderSettingsMetadata.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { ReaderOverlay } from '@/features/reader/overlay/ReaderOverlay.tsx';
import { requestManager } from '@/lib/requests/RequestManager.ts';
import { GetChaptersReaderQuery, GetMangaReaderQuery } from '@/lib/graphql/generated/graphql.ts';
@@ -22,7 +22,7 @@ import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts'
import { userReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
import { GET_CHAPTERS_READER } from '@/lib/graphql/queries/ChapterQuery.ts';
import { TapZoneLayout } from '@/features/reader/tap-zones/TapZoneLayout.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/contexts/ReaderOverlayContext.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
import { ReaderRGBAFilter } from '@/features/reader/filters/ReaderRGBAFilter.tsx';
import { useReaderStateSettingsContext } from '@/features/reader/contexts/state/ReaderStateSettingsContext.tsx';
import { useReaderStateMangaContext } from '@/features/reader/contexts/state/ReaderStateMangaContext.tsx';
@@ -44,9 +44,9 @@ import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.t
import { ReaderStatePages } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { useReaderStateChaptersContext } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContext.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
import { useReaderResetStates } from '@/features/reader/hooks/useReaderResetStates.ts';
import { useReaderSetSettingsState } from '@/features/reader/hooks/useReaderSetSettingsState.ts';
import { useReaderShowSettingPreviewOnChange } from '@/features/reader/hooks/useReaderShowSettingPreviewOnChange.ts';

View File

@@ -36,8 +36,8 @@ import {
isEndOfPageInViewport,
isPageInViewport,
} from '@/features/reader/viewer/pager/ReaderPager.utils.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/contexts/ReaderOverlayContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
import { TapZoneRegionType, TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
import { ReaderTapZoneService } from '@/features/reader/tap-zones/ReaderTapZoneService.ts';
import { isContinuousReadingMode } from '@/features/reader/settings/ReaderSettings.utils.tsx';

View File

@@ -13,7 +13,7 @@ import { TabsMenu } from '@/features/core/components/tabs/TabsMenu.tsx';
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { MediaQuery } from '@/features/core/utils/MediaQuery.tsx';
import { IReaderSettings, IReaderSettingsWithDefaultFlag } from '@/features/reader/Reader.types.ts';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
import { applyStyles } from '@/features/core/utils/ApplyStyles.ts';
import { READER_SETTING_TABS, ReaderSettingTab } from '@/features/reader/settings/ReaderSettings.constants.tsx';
import { TabPanel } from '@/features/core/components/tabs/TabPanel.tsx';

View File

@@ -6,8 +6,15 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useMemo, useState } from 'react';
import { ReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { createContext, useContext, ReactNode, useMemo, useState } from 'react';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
export const ReaderTapZoneContext = createContext<TReaderTapZoneContext>({
showPreview: false,
setShowPreview: () => undefined,
});
export const useReaderTapZoneContext = () => useContext(ReaderTapZoneContext);
export const ReaderTapZoneContextProvider = ({ children }: { children: ReactNode }) => {
const [showPreview, setShowPreview] = useState(false);

View File

@@ -9,9 +9,9 @@
import Box from '@mui/material/Box';
import { useCallback, useLayoutEffect, useState } from 'react';
import { useTheme } from '@mui/material/styles';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
import { ReaderTapZoneService } from '@/features/reader/tap-zones/ReaderTapZoneService.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { useResizeObserver } from '@/features/core/hooks/useResizeObserver.tsx';
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { IReaderSettings, ReadingDirection } from '@/features/reader/Reader.types.ts';

View File

@@ -1,17 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { createContext, useContext } from 'react';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
export const ReaderTapZoneContext = createContext<TReaderTapZoneContext>({
showPreview: false,
setShowPreview: () => undefined,
});
export const useReaderTapZoneContext = () => useContext(ReaderTapZoneContext);

View File

@@ -42,14 +42,14 @@ import {
shouldApplyReaderWidth,
} from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { useMouseDragScroll } from '@/features/core/hooks/useMouseDragScroll.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/contexts/ReaderOverlayContext.tsx';
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
import { applyStyles } from '@/features/core/utils/ApplyStyles.ts';
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
import { ReaderStatePages } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/contexts/ReaderAutoScrollContext.tsx';
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/contexts/ReaderTapZoneContext.tsx';
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
import { useReaderAutoScroll } from '@/features/reader/auto-scroll/hooks/useReaderAutoScroll.ts';
import { useReaderHideOverlayOnUserScroll } from '@/features/reader/overlay/hooks/useReaderHideOverlayOnUserScroll.ts';
import { useReaderHorizontalModeInvertXYScrolling } from '@/features/reader/viewer/hooks/useReaderHorizontalModeInvertXYScrolling.ts';
@@ -64,7 +64,7 @@ import {
getReaderChapterViewResumeMode,
} from '@/features/reader/Reader.utils.ts';
import { coerceIn, noOp } from '@/lib/HelperFunctions.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
import { useReaderPreserveScrollPosition } from '@/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts';

View File

@@ -29,7 +29,7 @@ import {
isContinuousReadingMode,
isContinuousVerticalReadingMode,
} from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { AppRoutes } from '@/features/core/AppRoute.constants.ts';
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
import { withPropsFrom } from '@/features/core/hoc/withPropsFrom.tsx';

View File

@@ -11,7 +11,7 @@ import { DEFAULT_SORT_SETTINGS } from '@/features/migration/Migration.constants.
import { GlobalUpdateSkipEntriesSettings, MetadataServerSettings } from '@/features/settings/Settings.types.ts';
import { GridLayout } from '@/features/core/Core.types.ts';
import { getDefaultLanguages } from '@/features/core/utils/Languages.ts';
import { ThemeMode } from '@/features/theme/contexts/AppThemeContext.tsx';
import { ThemeMode } from '@/features/theme/AppThemeContext.tsx';
import {
SelectSettingValue,
SelectSettingValueDisplayInfo,

View File

@@ -15,7 +15,7 @@ import ListSubheader from '@mui/material/ListSubheader';
import Switch from '@mui/material/Switch';
import Link from '@mui/material/Link';
import { useColorScheme } from '@mui/material/styles';
import { ThemeMode, useAppThemeContext } from '@/features/theme/contexts/AppThemeContext.tsx';
import { ThemeMode, useAppThemeContext } from '@/features/theme/AppThemeContext.tsx';
import { Select } from '@/features/core/components/inputs/Select.tsx';
import { MediaQuery } from '@/features/core/utils/MediaQuery.tsx';
import { NumberSetting } from '@/features/core/components/settings/NumberSetting.tsx';

View File

@@ -55,7 +55,7 @@ import { AppRoutes } from '@/features/core/AppRoute.constants.ts';
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
import { Sources } from '@/features/source/services/Sources.ts';
import { useAppTitleAndAction } from '@/features/navigation-bar/hooks/useAppTitleAndAction.ts';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { VirtuosoUtil } from '@/lib/virtuoso/Virtuoso.util.tsx';
const DEFAULT_SOURCE: SourceIdInfo = { id: '-1' };

View File

@@ -7,7 +7,7 @@
*/
import { AppTheme, AppThemes } from '@/features/theme/services/AppThemes.ts';
import { ThemeMode } from '@/features/theme/contexts/AppThemeContext.tsx';
import { ThemeMode } from '@/features/theme/AppThemeContext.tsx';
export type MetadataThemeSettings = {
appTheme: AppThemes;

View File

@@ -6,24 +6,57 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReactNode, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
import React, { ReactNode, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
import { Palette } from '@vibrant/color';
import { FastAverageColorResult } from 'fast-average-color';
import { useTranslation } from 'react-i18next';
import { Direction, ThemeProvider } from '@mui/material/styles';
import { CacheProvider } from '@emotion/react';
import { useTranslation } from 'react-i18next';
import { AppThemeContext, TAppThemeContext, ThemeMode } from '@/features/theme/contexts/AppThemeContext.tsx';
import { DIRECTION_TO_CACHE } from '@/features/theme/ThemeDirectionCache.ts';
import { AppTheme, AppThemes, getTheme } from '@/features/theme/services/AppThemes.ts';
import {
createUpdateMetadataServerSettings,
useMetadataServerSettings,
} from '@/features/settings/services/ServerSettingsMetadata.ts';
import { useLocalStorage } from '@/features/core/hooks/useStorage.tsx';
import { MUI_THEME_MODE_KEY } from '@/lib/mui/MUI.constants.ts';
import { MediaQuery } from '@/features/core/utils/MediaQuery.tsx';
import { AppTheme, getTheme } from '@/features/theme/services/AppThemes.ts';
import { createAndSetTheme } from '@/features/theme/services/ThemeCreator.ts';
import { makeToast } from '@/features/core/utils/Toast.ts';
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
import { useLocalStorage } from '@/features/core/hooks/useStorage.tsx';
import { createAndSetTheme } from '@/features/theme/services/ThemeCreator.ts';
import { AppStorage } from '@/lib/storage/AppStorage.ts';
import { MUI_THEME_MODE_KEY } from '@/lib/mui/MUI.constants.ts';
import { DIRECTION_TO_CACHE } from '@/features/theme/ThemeDirectionCache.ts';
export enum ThemeMode {
SYSTEM = 'system',
DARK = 'dark',
LIGHT = 'light',
}
export type TAppThemeContext = {
appTheme: AppThemes;
setAppTheme: (theme: AppThemes) => void;
themeMode: ThemeMode;
setThemeMode: (mode: ThemeMode) => void;
shouldUsePureBlackMode: boolean;
setShouldUsePureBlackMode: (value: boolean) => void;
dynamicColor: (NonNullableProperties<Palette> & { average: FastAverageColorResult }) | null;
setDynamicColor: React.Dispatch<
React.SetStateAction<(NonNullableProperties<Palette> & { average: FastAverageColorResult }) | null>
>;
};
export const AppThemeContext = React.createContext<TAppThemeContext>({
appTheme: 'default',
setAppTheme: (): void => {},
themeMode: ThemeMode.SYSTEM,
setThemeMode: (): void => {},
shouldUsePureBlackMode: false,
setShouldUsePureBlackMode: (): void => {},
dynamicColor: null,
setDynamicColor: (): void => {},
});
export const useAppThemeContext = () => useContext(AppThemeContext);
export const AppThemeContextProvider = ({ children }: { children: ReactNode }) => {
const { t, i18n } = useTranslation();

View File

@@ -19,7 +19,7 @@ import IconButton from '@mui/material/IconButton';
import EditIcon from '@mui/icons-material/Edit';
import { bindDialog, usePopupState } from 'material-ui-popup-state/hooks';
import { CustomTooltip } from '@/features/core/components/CustomTooltip.tsx';
import { useAppThemeContext } from '@/features/theme/contexts/AppThemeContext.tsx';
import { useAppThemeContext } from '@/features/theme/AppThemeContext.tsx';
import { AppTheme, hasMissingFonts, loadThemeFonts } from '@/features/theme/services/AppThemes.ts';
import { createTheme } from '@/features/theme/services/ThemeCreator.ts';
import { ThemeCreationDialog } from '@/features/theme/components/CreateThemeDialog.tsx';

View File

@@ -1,44 +0,0 @@
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import React, { useContext } from 'react';
import { Palette } from '@vibrant/color';
import { FastAverageColorResult } from 'fast-average-color';
import { AppThemes } from '@/features/theme/services/AppThemes.ts';
export enum ThemeMode {
SYSTEM = 'system',
DARK = 'dark',
LIGHT = 'light',
}
export type TAppThemeContext = {
appTheme: AppThemes;
setAppTheme: (theme: AppThemes) => void;
themeMode: ThemeMode;
setThemeMode: (mode: ThemeMode) => void;
shouldUsePureBlackMode: boolean;
setShouldUsePureBlackMode: (value: boolean) => void;
dynamicColor: (NonNullableProperties<Palette> & { average: FastAverageColorResult }) | null;
setDynamicColor: React.Dispatch<
React.SetStateAction<(NonNullableProperties<Palette> & { average: FastAverageColorResult }) | null>
>;
};
export const AppThemeContext = React.createContext<TAppThemeContext>({
appTheme: 'default',
setAppTheme: (): void => {},
themeMode: ThemeMode.SYSTEM,
setThemeMode: (): void => {},
shouldUsePureBlackMode: false,
setShouldUsePureBlackMode: (): void => {},
dynamicColor: null,
setDynamicColor: (): void => {},
});
export const useAppThemeContext = () => useContext(AppThemeContext);

View File

@@ -22,7 +22,7 @@ import { deepmerge } from '@mui/utils';
// eslint-disable-next-line no-restricted-imports
import { PaletteBackgroundChannel } from '@mui/material/styles/createThemeWithVars';
import { Palette } from '@vibrant/color';
import { TAppThemeContext, ThemeMode } from '@/features/theme/contexts/AppThemeContext.tsx';
import { TAppThemeContext, ThemeMode } from '@/features/theme/AppThemeContext.tsx';
import { MediaQuery } from '@/features/core/utils/MediaQuery.tsx';
import { AppTheme, loadThemeFonts } from '@/features/theme/services/AppThemes.ts';
import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts';

View File

@@ -21,7 +21,7 @@ import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts'
import { VirtuosoUtil } from '@/lib/virtuoso/Virtuoso.util.tsx';
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
import { ChapterUpdateCard } from '@/features/updates/components/ChapterUpdateCard.tsx';
import { useNavBarContext } from '@/features/navigation-bar/contexts/NavbarContext.tsx';
import { useNavBarContext } from '@/features/navigation-bar/NavbarContext.tsx';
import { Chapters } from '@/features/chapter/services/Chapters.ts';
import { useAppTitleAndAction } from '@/features/navigation-bar/hooks/useAppTitleAndAction.ts';
import { GROUPED_VIRTUOSO_Z_INDEX } from '@/lib/virtuoso/Virtuoso.constants.ts';