diff --git a/src/components/navbar/ReaderNavBar.tsx b/src/components/navbar/ReaderNavBar.tsx index 1e197a76..20600754 100644 --- a/src/components/navbar/ReaderNavBar.tsx +++ b/src/components/navbar/ReaderNavBar.tsx @@ -13,7 +13,7 @@ import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; import React, { useEffect, useState } from 'react'; import Typography from '@mui/material/Typography'; -import { useHistory, Link } from 'react-router-dom'; +import { useHistory, Link, useLocation } from 'react-router-dom'; import Slide from '@mui/material/Slide'; import Fade from '@mui/material/Fade'; import Zoom from '@mui/material/Zoom'; @@ -28,6 +28,7 @@ import Collapse from '@mui/material/Collapse'; import Button from '@mui/material/Button'; import { styled } from '@mui/system'; import useBackTo from 'util/useBackTo'; +import { getMetadataFrom } from 'util/metadata'; const Root = styled('div')(({ theme }) => ({ top: 0, @@ -105,7 +106,7 @@ const OpenDrawerButton = styled(IconButton)(({ theme }) => ({ }, })); -export const defaultReaderSettings = () => ({ +const defaultReaderSettings = () => ({ staticNav: false, showPageNumber: true, continuesPageGap: false, @@ -113,9 +114,22 @@ export const defaultReaderSettings = () => ({ readerType: 'ContinuesVertical', } as IReaderSettings); +const getReaderSettingsFromMetadata = ( + meta?: IMetadata, +): IReaderSettings => ({ + ...getMetadataFrom( + { meta }, + Object.entries(defaultReaderSettings()) as MetadataKeyValuePair[], + ) as unknown as IReaderSettings, +}); + +export const getReaderSettingsFor = ( + { meta }: IMangaCard | IManga, +): IReaderSettings => getReaderSettingsFromMetadata(meta); + interface IProps { settings: IReaderSettings - setSettings: React.Dispatch> + setSettingValue: (key: keyof IReaderSettings, value: string | boolean) => void manga: IManga | IMangaCard chapter: IChapter curPage: number @@ -124,17 +138,37 @@ interface IProps { export default function ReaderNavBar(props: IProps) { const history = useHistory(); const backTo = useBackTo(); + const location = useLocation<{ + prevDrawerOpen?: boolean, + prevSettingsCollapseOpen?: boolean + }>(); + const { + prevDrawerOpen, + prevSettingsCollapseOpen, + } = location.state ?? {}; const { - settings, setSettings, manga, chapter, curPage, + settings, setSettingValue, manga, chapter, curPage, } = props; - const [drawerOpen, setDrawerOpen] = useState(false || settings.staticNav); - const [hideOpenButton, setHideOpenButton] = useState(false); + const [drawerOpen, setDrawerOpen] = useState(settings.staticNav || prevDrawerOpen); + const [updateDrawerOnRender, setUpdateDrawerOnRender] = useState(true); + const [hideOpenButton, setHideOpenButton] = useState(settings.staticNav || prevDrawerOpen); const [prevScrollPos, setPrevScrollPos] = useState(0); - const [settingsCollapseOpen, setSettingsCollapseOpen] = useState(true); + const [settingsCollapseOpen, setSettingsCollapseOpen] = useState( + prevSettingsCollapseOpen ?? true, + ); - const setSettingValue = (key: string, value: any) => setSettings({ ...settings, [key]: value }); + const updateSettingValue = (key: keyof IReaderSettings, value: string | boolean) => { + // prevent closing the navBar when updating the "staticNav" setting + setUpdateDrawerOnRender(key !== 'staticNav'); + setSettingValue(key, value); + }; + + const updateDrawer = (open: boolean) => { + setDrawerOpen(open); + setHideOpenButton(open); + }; const handleScroll = () => { const currentScrollPos = window.pageYOffset; @@ -145,6 +179,12 @@ export default function ReaderNavBar(props: IProps) { } }; + useEffect(() => { + if (updateDrawerOnRender) { + updateDrawer(settings.staticNav); + } + }, [settings.staticNav]); + useEffect(() => { window.addEventListener('scroll', handleScroll); @@ -190,7 +230,7 @@ export default function ReaderNavBar(props: IProps) { color="inherit" aria-label="menu" disableRipple - onClick={() => setDrawerOpen(false)} + onClick={() => updateDrawer(false)} size="large" > @@ -243,7 +283,7 @@ export default function ReaderNavBar(props: IProps) { setSettingValue('staticNav', e.target.checked)} + onChange={(e) => updateSettingValue('staticNav', e.target.checked)} /> @@ -253,7 +293,7 @@ export default function ReaderNavBar(props: IProps) { setSettingValue('showPageNumber', e.target.checked)} + onChange={(e) => updateSettingValue('showPageNumber', e.target.checked)} /> @@ -263,7 +303,7 @@ export default function ReaderNavBar(props: IProps) { setSettingValue('loadNextonEnding', e.target.checked)} + onChange={(e) => updateSettingValue('loadNextonEnding', e.target.checked)} /> @@ -272,7 +312,7 @@ export default function ReaderNavBar(props: IProps) {