diff --git a/src/components/navbar/ReaderNavBar.tsx b/src/components/navbar/ReaderNavBar.tsx index a62fdbc5..347e0b6c 100644 --- a/src/components/navbar/ReaderNavBar.tsx +++ b/src/components/navbar/ReaderNavBar.tsx @@ -12,7 +12,7 @@ import KeyboardArrowLeftIcon from '@mui/icons-material/KeyboardArrowLeft'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import { useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import Typography from '@mui/material/Typography'; import { useLocation, useNavigate } from 'react-router-dom'; import Slide from '@mui/material/Slide'; @@ -34,16 +34,19 @@ import { Select } from '@/components/atoms/Select.tsx'; import { getOptionForDirection } from '@/theme.ts'; import { ChapterType } from '@/lib/graphql/generated/graphql.ts'; import { MangaChapterCountInfo, MangaIdInfo } from '@/lib/data/Mangas.ts'; +import { useNavBarContext } from '@/components/context/NavbarContext.tsx'; +import { useResizeObserver } from '@/util/useResizeObserver.tsx'; const Root = styled('div')({ zIndex: 10, }); const NavContainer = styled('div')(({ theme }) => ({ + position: 'fixed', top: 0, left: 0, - width: '300px', - minWidth: '300px', + minWidth: '240px', + maxWidth: '400px', height: '100vh', overflowY: 'auto', backgroundColor: theme.palette.background.default, @@ -135,6 +138,7 @@ interface IProps { export function ReaderNavBar(props: IProps) { const { t } = useTranslation(); + const { setNavBarWidth } = useNavBarContext(); const navigate = useNavigate(); const location = useLocation<{ @@ -143,6 +147,19 @@ export function ReaderNavBar(props: IProps) { }>(); const { prevDrawerOpen, prevSettingsCollapseOpen } = location.state ?? {}; + const navBarRef = useRef(null); + useResizeObserver( + navBarRef, + useCallback(() => { + if (navBarRef.current?.offsetWidth === undefined) { + return; + } + + setNavBarWidth(navBarRef.current.offsetWidth); + }, [navBarRef.current]), + ); + useEffect(() => () => setNavBarWidth(0), [navBarRef]); + const { settings, setSettingValue, @@ -224,11 +241,7 @@ export function ReaderNavBar(props: IProps) { mountOnEnter unmountOnExit > - +
{!settings.staticNav && ( diff --git a/src/screens/Reader.tsx b/src/screens/Reader.tsx index ff9b1d82..c7562391 100644 --- a/src/screens/Reader.tsx +++ b/src/screens/Reader.tsx @@ -194,7 +194,7 @@ export function Reader() { const isLastPage = curPage === chapter.pageCount - 1; const curPageDebounced = useDebounce(curPage, isLastPage ? 0 : 1000); const [pageToScrollTo, setPageToScrollTo] = useState(undefined); - const { setOverride, setTitle } = useContext(NavBarContext); + const { setOverride, setTitle, navBarWidth: currentNavBarWidth } = useContext(NavBarContext); const [retrievingNextChapter, setRetrievingNextChapter] = useState(false); const { data: mangaChaptersData, @@ -543,6 +543,8 @@ export function Reader() { // last page, also probably read = true, we will load the first page. const initialPage = pageToScrollTo ?? (chapter.lastPageRead === chapter.pageCount - 1 ? 0 : chapter.lastPageRead); + const navBarWidth = settings.staticNav ? currentNavBarWidth : 0; + return (