/* * 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 IconButton from '@mui/material/IconButton'; import PushPinIcon from '@mui/icons-material/PushPin'; import PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined'; import Divider from '@mui/material/Divider'; import { memo, useCallback, useLayoutEffect, useRef, useState } from 'react'; import Drawer from '@mui/material/Drawer'; import { useLingui } from '@lingui/react/macro'; import { CustomTooltip } from '@/base/components/CustomTooltip.tsx'; import type { ReaderNavBarDesktopProps } from '@/features/reader/overlay/ReaderOverlay.types.ts'; import { ReaderNavContainer } from '@/features/reader/overlay/navigation/desktop/components/ReaderNavContainer.tsx'; import { ReaderNavBarDesktopMetadata } from '@/features/reader/overlay/navigation/desktop/components/ReaderNavBarDesktopMetadata.tsx'; import { ReaderNavBarDesktopPageNavigation } from '@/features/reader/overlay/navigation/desktop/components/ReaderNavBarDesktopPageNavigation.tsx'; 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/NavbarContext.tsx'; import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx'; import { ReaderService } from '@/features/reader/services/ReaderService.ts'; import { LoadingPlaceholder } from '@/base/components/feedback/LoadingPlaceholder.tsx'; import type { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts'; import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx'; import { ReaderExitButton } from '@/features/reader/overlay/navigation/components/ReaderExitButton.tsx'; import { useReaderChaptersStore, useReaderSettingsStore, useReaderStore, } from '@/features/reader/stores/ReaderStore.ts'; import { MATERIAL_YOU_VISUALS } from '@/features/theme/services/MaterialYouVisualTokens.ts'; const useGetPreviousNavBarStaticValue = (isVisible: boolean, isStaticNav: boolean) => { const wasNavBarStaticRef = useRef(isStaticNav); const wasNavBarStaticPreviousRef = useRef(isStaticNav); const resetWasNavBarStaticValue = wasNavBarStaticPreviousRef.current !== wasNavBarStaticRef.current && !isVisible; if (resetWasNavBarStaticValue) { wasNavBarStaticRef.current = false; } const didNavBarStaticValueChange = wasNavBarStaticPreviousRef.current !== isStaticNav; if (didNavBarStaticValueChange) { wasNavBarStaticRef.current = wasNavBarStaticPreviousRef.current; wasNavBarStaticPreviousRef.current = isStaticNav; } return wasNavBarStaticRef.current; }; const BaseReaderNavBarDesktop = ({ isVisible, openSettings, setReaderNavBarWidth, }: ReaderNavBarDesktopProps & Pick) => { const { t } = useLingui(); const manga = useReaderStore('manga'); const { chapters, currentChapterId, currentChapterName, currentChapterNumber, currentChapterScanlator, previousChapter, nextChapter, } = useReaderChaptersStore((state) => ({ chapters: state.chapters, currentChapterId: state.currentChapter?.id, currentChapterName: state.currentChapter?.name, currentChapterNumber: state.currentChapter?.chapterNumber, currentChapterScanlator: state.currentChapter?.scanlator, previousChapter: state.previousChapter, nextChapter: state.nextChapter, })); const isStaticNav = useReaderSettingsStore('isStaticNav'); const [navBarElement, setNavBarElement] = useState(); useResizeObserver( navBarElement, useCallback(() => { if (!isStaticNav) { return; } setReaderNavBarWidth(navBarElement!.offsetWidth); }, [navBarElement, isStaticNav]), ); useLayoutEffect(() => () => setReaderNavBarWidth(0), []); const wasNavBarStatic = useGetPreviousNavBarStaticValue(isVisible, isStaticNav); const changedNavBarStaticValue = wasNavBarStatic && isVisible; const drawerTransitionDuration = changedNavBarStaticValue ? 0 : undefined; return ( setNavBarElement(ref), sx: { m: 1, height: 'calc(100% - 16px)', borderRadius: `${MATERIAL_YOU_VISUALS.detailRadius}px`, overflow: 'hidden', }, }, transition: { unmountOnExit: true, }, }} > { setReaderNavBarWidth(0); ReaderService.updateSetting('isStaticNav', !isStaticNav); }} color={isStaticNav ? 'primary' : 'inherit'} > {isStaticNav ? : } {manga && currentChapterId !== undefined ? ( <> ) : ( )} ); }; export const ReaderNavBarDesktop = withPropsFrom( memo(BaseReaderNavBarDesktop), [useNavBarContext], ['setReaderNavBarWidth'], );