2024-10-03 04:02:59 +02:00
|
|
|
/*
|
|
|
|
|
* 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 Stack from '@mui/material/Stack';
|
|
|
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
|
import MenuItem from '@mui/material/MenuItem';
|
2024-12-22 00:41:56 +01:00
|
|
|
import { memo, useMemo } from 'react';
|
2024-10-03 04:02:59 +02:00
|
|
|
import FormControl from '@mui/material/FormControl';
|
|
|
|
|
import InputLabel from '@mui/material/InputLabel';
|
|
|
|
|
import { Select } from '@/modules/core/components/inputs/Select.tsx';
|
2024-12-12 13:21:29 +01:00
|
|
|
import { getNextIndexFromPage, getPage } from '@/modules/reader/utils/ReaderProgressBar.utils.tsx';
|
2024-10-03 04:02:59 +02:00
|
|
|
import { ReaderStatePages } from '@/modules/reader/types/ReaderProgressBar.types.ts';
|
|
|
|
|
import { ReaderControls } from '@/modules/reader/services/ReaderControls.ts';
|
2024-12-11 13:59:50 +01:00
|
|
|
import { useGetOptionForDirection } from '@/modules/theme/services/ThemeCreator.ts';
|
2024-10-03 04:02:59 +02:00
|
|
|
import { ReaderService } from '@/modules/reader/services/ReaderService.ts';
|
|
|
|
|
import { ReaderNavBarDesktopNextPreviousButton } from '@/modules/reader/components/overlay/navigation/desktop/ReaderNavBarDesktopNextPreviousButton.tsx';
|
|
|
|
|
import { READING_DIRECTION_TO_THEME_DIRECTION } from '@/modules/reader/constants/ReaderSettings.constants.tsx';
|
2024-12-21 03:46:55 +01:00
|
|
|
import { IReaderSettings } from '@/modules/reader/types/Reader.types.ts';
|
|
|
|
|
import { withPropsFrom } from '@/modules/core/hoc/withPropsFrom.tsx';
|
2024-12-21 15:36:23 +01:00
|
|
|
import { userReaderStatePagesContext } from '@/modules/reader/contexts/state/ReaderStatePagesContext.tsx';
|
2024-10-03 04:02:59 +02:00
|
|
|
|
2024-12-21 03:46:55 +01:00
|
|
|
const BaseReaderNavBarDesktopPageNavigation = ({
|
2024-10-03 04:02:59 +02:00
|
|
|
currentPageIndex,
|
|
|
|
|
pages,
|
2024-12-21 03:46:55 +01:00
|
|
|
readingDirection,
|
|
|
|
|
openPage,
|
|
|
|
|
}: Pick<ReaderStatePages, 'currentPageIndex' | 'pages'> &
|
|
|
|
|
Pick<IReaderSettings, 'readingDirection'> & {
|
|
|
|
|
openPage: ReturnType<typeof ReaderControls.useOpenPage>;
|
|
|
|
|
}) => {
|
2024-10-03 04:02:59 +02:00
|
|
|
const { t } = useTranslation();
|
|
|
|
|
const getOptionForDirection = useGetOptionForDirection();
|
|
|
|
|
const currentPage = useMemo(() => getPage(currentPageIndex, pages), [currentPageIndex, pages]);
|
|
|
|
|
|
2024-12-21 03:46:55 +01:00
|
|
|
const direction = READING_DIRECTION_TO_THEME_DIRECTION[readingDirection];
|
2024-10-03 04:02:59 +02:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Stack sx={{ flexDirection: 'row', gap: 1 }} dir="ltr">
|
|
|
|
|
<ReaderNavBarDesktopNextPreviousButton
|
|
|
|
|
type="previous"
|
|
|
|
|
title={t(getOptionForDirection('reader.button.previous_page', 'reader.button.next_page', direction))}
|
|
|
|
|
disabled={getOptionForDirection(
|
2024-12-13 02:29:27 +01:00
|
|
|
!currentPage.primary.index,
|
|
|
|
|
getNextIndexFromPage(currentPage) === getNextIndexFromPage(pages.slice(-1)[0]),
|
2024-10-03 04:02:59 +02:00
|
|
|
direction,
|
|
|
|
|
)}
|
2024-12-13 02:15:18 +01:00
|
|
|
onClick={() => openPage('previous', undefined, false)}
|
2024-10-03 04:02:59 +02:00
|
|
|
/>
|
|
|
|
|
<FormControl sx={{ flexBasis: '70%', flexGrow: 0, flexShrink: 0 }}>
|
|
|
|
|
<InputLabel id="reader-nav-bar-desktop-page-select">{t('reader.page_info.label.page')}</InputLabel>
|
|
|
|
|
<Select
|
|
|
|
|
labelId="reader-nav-bar-desktop-page-select"
|
|
|
|
|
label={t('reader.page_info.label.page')}
|
2024-12-12 13:21:29 +01:00
|
|
|
value={getNextIndexFromPage(currentPage)}
|
2024-12-13 02:15:18 +01:00
|
|
|
onChange={(e) => openPage(e.target.value as number, undefined, false)}
|
2024-10-03 04:02:59 +02:00
|
|
|
>
|
2024-12-13 02:07:02 +01:00
|
|
|
{pages.map((page) => (
|
|
|
|
|
<MenuItem key={getNextIndexFromPage(page)} value={getNextIndexFromPage(page)}>
|
|
|
|
|
{page.name}
|
2024-10-03 04:02:59 +02:00
|
|
|
</MenuItem>
|
|
|
|
|
))}
|
|
|
|
|
</Select>
|
|
|
|
|
</FormControl>
|
|
|
|
|
<ReaderNavBarDesktopNextPreviousButton
|
|
|
|
|
type="next"
|
|
|
|
|
title={t(getOptionForDirection('reader.button.next_page', 'reader.button.previous_page', direction))}
|
|
|
|
|
disabled={getOptionForDirection(
|
2024-12-13 02:29:27 +01:00
|
|
|
getNextIndexFromPage(currentPage) === getNextIndexFromPage(pages.slice(-1)[0]),
|
|
|
|
|
!currentPage.primary.index,
|
2024-10-03 04:02:59 +02:00
|
|
|
direction,
|
|
|
|
|
)}
|
2024-12-13 02:15:18 +01:00
|
|
|
onClick={() => openPage('next', undefined, false)}
|
2024-10-03 04:02:59 +02:00
|
|
|
/>
|
|
|
|
|
</Stack>
|
|
|
|
|
);
|
|
|
|
|
};
|
2024-12-21 03:46:55 +01:00
|
|
|
|
|
|
|
|
export const ReaderNavBarDesktopPageNavigation = withPropsFrom(
|
2024-12-22 00:41:56 +01:00
|
|
|
memo(BaseReaderNavBarDesktopPageNavigation),
|
2024-12-21 15:36:23 +01:00
|
|
|
[
|
|
|
|
|
userReaderStatePagesContext,
|
|
|
|
|
() => ({ openPage: ReaderControls.useOpenPage() }),
|
|
|
|
|
ReaderService.useSettingsWithoutDefaultFlag,
|
|
|
|
|
],
|
|
|
|
|
['currentPageIndex', 'pages', 'readingDirection', 'openPage'],
|
2024-12-21 03:46:55 +01:00
|
|
|
);
|