Reader progress bars
This commit is contained in:
@@ -6,16 +6,47 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { useMemo } from 'react';
|
||||
import { IReaderSettings } from '@/modules/reader/types/Reader.types.ts';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { Direction, useTheme } from '@mui/material/styles';
|
||||
import { TChapterReader } from '@/modules/chapter/Chapter.types.ts';
|
||||
import { Chapters } from '@/modules/chapter/services/Chapters.ts';
|
||||
import { IReaderSettings, ReadingDirection } from '@/modules/reader/types/Reader.types.ts';
|
||||
import { useReaderStateMangaContext } from '@/modules/reader/contexts/state/ReaderStateMangaContext.tsx';
|
||||
import { getReaderSettingsFor, useDefaultReaderSettings } from '@/modules/reader/services/ReaderSettingsMetadata.ts';
|
||||
|
||||
const DIRECTION_TO_INVERTED: Record<Direction, Direction> = {
|
||||
ltr: 'rtl',
|
||||
rtl: 'ltr',
|
||||
};
|
||||
|
||||
const DIRECTION_TO_READING_DIRECTION: Record<Direction, ReadingDirection> = {
|
||||
ltr: ReadingDirection.LTR,
|
||||
rtl: ReadingDirection.RTL,
|
||||
};
|
||||
|
||||
export class ReaderService {
|
||||
static useNavigateToChapter(chapter?: TChapterReader): () => void {
|
||||
const navigate = useNavigate();
|
||||
|
||||
return useCallback(() => chapter && navigate(Chapters.getReaderUrl(chapter), { replace: true }), [chapter]);
|
||||
}
|
||||
|
||||
static useSettings(): IReaderSettings {
|
||||
const { manga } = useReaderStateMangaContext();
|
||||
const { settings } = useDefaultReaderSettings();
|
||||
const defaultReaderSettings = useDefaultReaderSettings();
|
||||
return useMemo(
|
||||
() => getReaderSettingsFor(manga ?? { id: -1 }, defaultReaderSettings.settings),
|
||||
[manga, defaultReaderSettings],
|
||||
);
|
||||
}
|
||||
|
||||
return useMemo(() => getReaderSettingsFor(manga ?? { id: -1 }, settings), [manga, settings]);
|
||||
static useGetThemeDirection(): Direction {
|
||||
const { direction } = useTheme();
|
||||
const { readingDirection } = ReaderService.useSettings();
|
||||
|
||||
return DIRECTION_TO_READING_DIRECTION[direction] === readingDirection
|
||||
? direction
|
||||
: DIRECTION_TO_INVERTED[direction];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
import { useEffect, useMemo } from 'react';
|
||||
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||
import { requestUpdateMangaMetadata } from '@/modules/metadata/services/MetadataUpdater.ts';
|
||||
import { MangaType } from '@/lib/graphql/generated/graphql.ts';
|
||||
import { DEFAULT_READER_SETTINGS } from '@/modules/reader/constants/Reader.constants.ts';
|
||||
import { IReaderSettings } from '@/modules/reader/types/Reader.types.ts';
|
||||
import { convertFromGqlMeta } from '@/modules/metadata/services/MetadataConverter.ts';
|
||||
@@ -20,6 +22,7 @@ import {
|
||||
MetadataHolder,
|
||||
MetadataHolderType,
|
||||
} from '@/modules/metadata/Metadata.types.ts';
|
||||
import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts';
|
||||
import { jsonSaveParse } from '@/lib/HelperFunctions.ts';
|
||||
import { MangaIdInfo } from '@/modules/manga/Manga.types.ts';
|
||||
|
||||
@@ -121,3 +124,18 @@ export const useDefaultReaderSettings = (): {
|
||||
[metadata, settings, loading, request],
|
||||
);
|
||||
};
|
||||
|
||||
export const updateReaderSettings = async <Setting extends keyof IReaderSettings = keyof IReaderSettings>(
|
||||
manga: Pick<MangaType, 'id'> & GqlMetaHolder,
|
||||
setting: Setting,
|
||||
value: IReaderSettings[Setting],
|
||||
): Promise<void[]> =>
|
||||
requestUpdateMangaMetadata(manga, [[setting, convertSettingsToMetadata({ [setting]: value })[setting]]]);
|
||||
|
||||
export const createUpdateReaderSettings =
|
||||
<Settings extends keyof IReaderSettings>(
|
||||
manga: Pick<MangaType, 'id'> & GqlMetaHolder,
|
||||
handleError: (error: any) => void = defaultPromiseErrorHandler('createUpdateReaderSettings'),
|
||||
): ((...args: OmitFirst<Parameters<typeof updateReaderSettings<Settings>>>) => Promise<void | void[]>) =>
|
||||
(setting, value) =>
|
||||
updateReaderSettings(manga, setting, value).catch(handleError);
|
||||
|
||||
Reference in New Issue
Block a user