Extract "reader progress bar slot wrapper"

This commit is contained in:
schroda
2024-12-25 22:23:15 +01:00
parent ef15788c13
commit f263422b1c
2 changed files with 61 additions and 20 deletions

View File

@@ -6,8 +6,8 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. * file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/ */
import Box, { BoxProps } from '@mui/material/Box'; import { BoxProps } from '@mui/material/Box';
import { memo, ReactNode, useCallback, useMemo, useRef } from 'react'; import { memo, ReactNode, useCallback, useMemo, useRef, ComponentProps } from 'react';
import ClickAwayListener from '@mui/material/ClickAwayListener'; import ClickAwayListener from '@mui/material/ClickAwayListener';
import { TypographyProps } from '@mui/material/Typography'; import { TypographyProps } from '@mui/material/Typography';
import { StackProps } from '@mui/material/Stack'; import { StackProps } from '@mui/material/Stack';
@@ -31,6 +31,7 @@ import { ReaderService } from '@/modules/reader/services/ReaderService.ts';
import { ReaderControls } from '@/modules/reader/services/ReaderControls.ts'; import { ReaderControls } from '@/modules/reader/services/ReaderControls.ts';
import { withPropsFrom } from '@/modules/core/hoc/withPropsFrom.tsx'; import { withPropsFrom } from '@/modules/core/hoc/withPropsFrom.tsx';
import { useReaderProgressBarContext } from '@/modules/reader/contexts/ReaderProgressBarContext.tsx'; import { useReaderProgressBarContext } from '@/modules/reader/contexts/ReaderProgressBarContext.tsx';
import { ReaderProgressBarSlotWrapper } from '@/modules/reader/components/overlay/progress-bar/ReaderProgressBarSlotWrapper.tsx';
const BaseReaderProgressBar = ({ const BaseReaderProgressBar = ({
totalPages, totalPages,
@@ -46,12 +47,8 @@ const BaseReaderProgressBar = ({
openPage, openPage,
direction, direction,
}: ReaderProgressBarProps & }: ReaderProgressBarProps &
Pick<TReaderProgressBarContext, 'isDragging' | 'setIsDragging'> & { Pick<TReaderProgressBarContext, 'isDragging' | 'setIsDragging'> &
createProgressBarSlot: ( Pick<ComponentProps<typeof ReaderProgressBarSlotWrapper>, 'createProgressBarSlot'> & {
page: ReaderProgressBarProps['pages'][number],
pageLoadStates: ReaderProgressBarProps['pageLoadStates'],
pagesIndex: number,
) => ReactNode;
slotProps?: { slotProps?: {
container?: StackProps; container?: StackProps;
progressBarRoot?: StackProps; progressBarRoot?: StackProps;
@@ -159,20 +156,16 @@ const BaseReaderProgressBar = ({
> >
<ReaderProgressBarSlotsContainer {...slotProps?.progressBarSlotsContainer}> <ReaderProgressBarSlotsContainer {...slotProps?.progressBarSlotsContainer}>
{pages.map((page, pagesIndex) => ( {pages.map((page, pagesIndex) => (
<Box <ReaderProgressBarSlotWrapper
key={page.primary.index} key={page.primary.index}
page={page}
pagesIndex={pagesIndex}
pageLoadStates={pageLoadStates}
createProgressBarSlot={createProgressBarSlot}
{...slotProps?.progressBarSlot} {...slotProps?.progressBarSlot}
sx={{ isFirstPage={pagesIndex === 0}
flexGrow: 1, isLastPage={pagesIndex === pages.length - 1}
height: '100%', />
cursor: 'pointer',
...slotProps?.progressBarSlot?.sx,
borderLeftWidth: pagesIndex === 0 ? 0 : undefined,
borderRightWidth: pagesIndex === pages.length - 1 ? 0 : undefined,
}}
>
{createProgressBarSlot(page, pageLoadStates, pagesIndex)}
</Box>
))} ))}
<ProgressBarHighlightReadPages <ProgressBarHighlightReadPages
{...slotProps?.progressBarReadPages} {...slotProps?.progressBarReadPages}

View File

@@ -0,0 +1,48 @@
/*
* 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 Box, { BoxProps } from '@mui/material/Box';
import { memo, ReactNode } from 'react';
import { ReaderProgressBarProps } from '@/modules/reader/types/ReaderProgressBar.types.ts';
export const ReaderProgressBarSlotWrapper = memo(
({
page,
pagesIndex,
pageLoadStates,
isFirstPage,
isLastPage,
createProgressBarSlot,
...boxProps
}: {
page: ReaderProgressBarProps['pages'][number];
pagesIndex: number;
pageLoadStates: ReaderProgressBarProps['pageLoadStates'];
isFirstPage: boolean;
isLastPage: boolean;
createProgressBarSlot: (
page: ReaderProgressBarProps['pages'][number],
pageLoadStates: ReaderProgressBarProps['pageLoadStates'],
pagesIndex: number,
) => ReactNode;
} & BoxProps) => (
<Box
{...boxProps}
sx={{
flexGrow: 1,
height: '100%',
cursor: 'pointer',
...boxProps?.sx,
borderLeftWidth: isFirstPage ? 0 : undefined,
borderRightWidth: isLastPage ? 0 : undefined,
}}
>
{createProgressBarSlot(page, pageLoadStates, pagesIndex)}
</Box>
),
);