diff --git a/src/modules/reader/components/overlay/navigation/mobile/ReaderBottomBarMobile.tsx b/src/modules/reader/components/overlay/navigation/mobile/ReaderBottomBarMobile.tsx index 08a17bd7..1d690033 100644 --- a/src/modules/reader/components/overlay/navigation/mobile/ReaderBottomBarMobile.tsx +++ b/src/modules/reader/components/overlay/navigation/mobile/ReaderBottomBarMobile.tsx @@ -49,7 +49,7 @@ const BaseReaderBottomBarMobile = ({ return ( <> - + ( - - - {children} - - +export const ReaderProgressBarSlot = memo( + ({ pageName, progressBarPosition, slotProps, children }: ReaderProgressBarSlotProps & { children?: ReactNode }) => ( + + + {children} + + + ), ); diff --git a/src/modules/reader/components/overlay/progress-bar/mobile/ReaderProgressBarSlotMobile.tsx b/src/modules/reader/components/overlay/progress-bar/mobile/ReaderProgressBarSlotMobile.tsx index 14df79ea..18076f24 100644 --- a/src/modules/reader/components/overlay/progress-bar/mobile/ReaderProgressBarSlotMobile.tsx +++ b/src/modules/reader/components/overlay/progress-bar/mobile/ReaderProgressBarSlotMobile.tsx @@ -7,47 +7,46 @@ */ import Box from '@mui/material/Box'; +import { ComponentProps, memo } from 'react'; import { ProgressBarPosition } from '@/modules/reader/types/Reader.types.ts'; import { applyStyles } from '@/modules/core/utils/ApplyStyles.ts'; import { ReaderProgressBarSlot } from '@/modules/reader/components/overlay/progress-bar/ReaderProgressBarSlot'; -export const ReaderProgressBarSlotMobile = ({ - pageName, - isTrailingPage, -}: { - pageName: string; - isTrailingPage: boolean; -}) => ( - ['slotProps']>['box']>['sx'] = { + display: 'flex', + alignItems: 'center', + justifyContent: 'end', + position: 'relative', + backgroundColor: 'background.default', +}; + +const ProgressBarPagePoint = memo(({ isTrailingPage }: { isTrailingPage: boolean }) => ( + - - + /> +)); + +export const ReaderProgressBarSlotMobile = memo( + ({ pageName, isTrailingPage }: { pageName: string; isTrailingPage: boolean }) => ( + + + + ), ); diff --git a/src/modules/reader/components/overlay/progress-bar/variants/MobileReaderProgressBar.tsx b/src/modules/reader/components/overlay/progress-bar/variants/MobileReaderProgressBar.tsx index b566dd56..dabdc04c 100644 --- a/src/modules/reader/components/overlay/progress-bar/variants/MobileReaderProgressBar.tsx +++ b/src/modules/reader/components/overlay/progress-bar/variants/MobileReaderProgressBar.tsx @@ -28,6 +28,71 @@ import { TReaderOverlayContext } from '@/modules/reader/types/ReaderOverlay.type import { TReaderProgressBarContext } from '@/modules/reader/types/ReaderProgressBar.types.ts'; import { ReaderProgressBarSlotMobile } from '@/modules/reader/components/overlay/progress-bar/mobile/ReaderProgressBarSlotMobile.tsx'; +const PROGRESS_BAR_SLOT_PROPS: ComponentProps['slotProps'] = { + container: { + sx: { + flexGrow: 1, + position: 'relative', + display: 'flex', + justifyItems: 'center', + alignItems: 'stretch', + backgroundColor: (theme) => alpha(theme.palette.background.paper, 0.85), + borderRadius: 100, + boxShadow: 2, + }, + }, + progressBarRoot: { + sx: { + flexGrow: 1, + alignItems: 'stretch', + gap: 0, + }, + }, + progressBarSlotsActionArea: { + sx: { + height: '100%', + alignItems: 'center', + py: 2, + cursor: 'pointer', + }, + }, + progressBarSlotsContainer: { + sx: { + borderRadius: 100, + }, + }, + progressBarSlot: { + sx: { + height: '20px', + }, + }, + progressBarCurrentPageSlot: { + sx: { + display: 'flex', + justifyContent: 'end', + alignItems: 'center', + zIndex: 1, + pointer: 'default', + }, + }, + progressBarPageTexts: { + base: { px: 1 }, + }, +}; + +const PROGRESS_BAR_SLOTS: ComponentProps['slots'] = { + progressBarCurrentPage: ( + + ), +}; + const BaseMobileReaderProgressBar = ({ previousChapter, nextChapter, @@ -44,23 +109,12 @@ const BaseMobileReaderProgressBar = ({ const openNextChapter = ReaderService.useNavigateToChapter(nextChapter, ReaderResumeMode.START); const openPreviousChapter = ReaderService.useNavigateToChapter(previousChapter, ReaderResumeMode.END); - const createProgressBarSlot: ComponentProps['createProgressBarSlot'] = useCallback( - (page, _1, _2, _3, _4, _5, isTrailingPage) => ( - - ), - [], - ); - useLayoutEffect(() => { setIsMaximized(isVisible); return () => setIsMaximized(false); }, [isVisible]); - if (!isVisible) { - return null; - } - return ( ( + + ), + [], + )} slotProps={{ - container: { - sx: { - flexGrow: 1, - position: 'relative', - display: 'flex', - justifyItems: 'center', - alignItems: 'stretch', - backgroundColor: (theme) => alpha(theme.palette.background.paper, 0.85), - borderRadius: 100, - boxShadow: 2, - }, - }, - progressBarRoot: { - sx: { - flexGrow: 1, - alignItems: 'stretch', - gap: 0, - }, - }, - progressBarSlotsActionArea: { - sx: { - height: '100%', - alignItems: 'center', - py: 2, - cursor: 'pointer', - }, - }, - - progressBarSlotsContainer: { - sx: { - borderRadius: 100, - }, - }, - - progressBarSlot: { - sx: { - height: '20px', - }, - }, + ...PROGRESS_BAR_SLOT_PROPS, progressBarReadPages: { sx: { height: '20px', @@ -130,31 +151,8 @@ const BaseMobileReaderProgressBar = ({ width: `calc(${(Math.max(0, getPage(currentPageIndex, pages).pagesIndex) / pages.length) * 100}% + 100% / ${pages.length})`, }, }, - progressBarCurrentPageSlot: { - sx: { - display: 'flex', - justifyContent: 'end', - alignItems: 'center', - zIndex: 1, - pointer: 'default', - }, - }, - progressBarPageTexts: { - base: { px: 1 }, - }, - }} - slots={{ - progressBarCurrentPage: ( - - ), }} + slots={PROGRESS_BAR_SLOTS} />