diff --git a/src/components/MangaCard.tsx b/src/components/MangaCard.tsx index c70f102fab..d02a89e7f3 100644 --- a/src/components/MangaCard.tsx +++ b/src/components/MangaCard.tsx @@ -15,6 +15,7 @@ import useLocalStorage from 'util/useLocalStorage'; import SpinnerImage from 'components/util/SpinnerImage'; import { Box, styled } from '@mui/system'; import { useLibraryOptionsContext } from 'components/context/LibraryOptionsContext'; +import { BACK } from 'util/useBackTo'; const BottomGradient = styled('div')({ position: 'absolute', @@ -88,12 +89,14 @@ const MangaCard = React.forwardRef((props: IProps, ref) const [useCache] = useLocalStorage('useCache', true); const [ItemWidth] = useLocalStorage('ItemWidth', 300); + const mangaLinkTo = { pathname: `/manga/${id}/`, state: { backLink: BACK } }; + if (gridLayout !== 2) { const colomns = Math.round(dimensions / ItemWidth); return ( // @ts-ignore gridsize type isnt allowed to be a decimal but it works fine - + ((props: IProps, ref) } return ( - + > + // AppBar title title: string setTitle: React.Dispatch> @@ -22,6 +26,8 @@ type ContextType = { }; const NavBarContext = React.createContext({ + defaultBackTo: undefined, + setDefaultBackTo: ():void => {}, title: 'Tachidesk', setTitle: ():void => {}, action:
, @@ -31,3 +37,14 @@ const NavBarContext = React.createContext({ }); export default NavBarContext; + +export const useNavBarContext = () => useContext(NavBarContext); + +export const useSetDefaultBackTo = (value: string) => { + const { setDefaultBackTo } = useNavBarContext(); + + useEffect(() => { + setDefaultBackTo(value); + return () => setDefaultBackTo(undefined); + }, [value]); +}; diff --git a/src/components/manga/ChapterCard.tsx b/src/components/manga/ChapterCard.tsx index 66c2e921f3..f4910ad7e4 100644 --- a/src/components/manga/ChapterCard.tsx +++ b/src/components/manga/ChapterCard.tsx @@ -29,6 +29,7 @@ import Typography from '@mui/material/Typography'; import React from 'react'; import { Link } from 'react-router-dom'; import client from 'util/client'; +import { BACK } from 'util/useBackTo'; interface IProps{ chapter: IChapter @@ -118,7 +119,7 @@ const ChapterCard: React.FC = (props: IProps) => { }} > {index === 1 ? 'Start' : 'Resume' } diff --git a/src/components/navbar/DefaultNavBar.tsx b/src/components/navbar/DefaultNavBar.tsx index 7ff9f03ad9..4b74c440fc 100644 --- a/src/components/navbar/DefaultNavBar.tsx +++ b/src/components/navbar/DefaultNavBar.tsx @@ -23,12 +23,13 @@ import GetAppIcon from '@mui/icons-material/GetApp'; import GetAppOutlinedIcon from '@mui/icons-material/GetAppOutlined'; import SettingsIcon from '@mui/icons-material/Settings'; import ArrowBack from '@mui/icons-material/ArrowBack'; -import { useHistory } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import NavBarContext from 'components/context/NavbarContext'; import DarkTheme from 'components/context/DarkTheme'; import ExtensionOutlinedIcon from 'components/util/CustomExtensionOutlinedIcon'; import { Box } from '@mui/system'; import { createPortal } from 'react-dom'; +import useBackTo from 'util/useBackTo'; import DesktopSideBar from './navigation/DesktopSideBar'; import MobileBottomBar from './navigation/MobileBottomBar'; @@ -80,6 +81,7 @@ const navbarItems: Array = [ export default function DefaultNavBar() { const { title, action, override } = useContext(NavBarContext); + const backTo = useBackTo(); const { darkTheme } = useContext(DarkTheme); const theme = useTheme(); @@ -100,28 +102,30 @@ export default function DefaultNavBar() { navbar = it.show !== 'mobile')} />; } + const handleBack = () => { + if (backTo.url != null) return; + history.goBack(); + }; + return ( - { - !navbarItems.some(({ path }) => path === history.location.pathname) - && ( - (history.length === 1 ? history.push('/library') : history.goBack())} - size="large" - > - - - ) - } + {!isMainRoute && ( + + + + )} {title} diff --git a/src/components/navbar/NavBarContextProvider.tsx b/src/components/navbar/NavBarContextProvider.tsx index 37728bdc12..81a4dc4cb8 100644 --- a/src/components/navbar/NavBarContextProvider.tsx +++ b/src/components/navbar/NavBarContextProvider.tsx @@ -13,6 +13,7 @@ interface IProps{ } export default function NavBarProvider({ children }:IProps) { + const [defaultBackTo, setDefaultBackTo] = useState(); const [title, setTitle] = useState('Tachidesk'); const [action, setAction] = useState(
); const [override, setOverride] = useState({ @@ -21,6 +22,8 @@ export default function NavBarProvider({ children }:IProps) { }); const value = { + defaultBackTo, + setDefaultBackTo, title, setTitle, action, diff --git a/src/components/navbar/ReaderNavBar.tsx b/src/components/navbar/ReaderNavBar.tsx index d80a53d737..3476e40e2a 100644 --- a/src/components/navbar/ReaderNavBar.tsx +++ b/src/components/navbar/ReaderNavBar.tsx @@ -27,6 +27,7 @@ import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; import Collapse from '@mui/material/Collapse'; import Button from '@mui/material/Button'; import { styled } from '@mui/system'; +import useBackTo from 'util/useBackTo'; const Root = styled('div')(({ theme }) => ({ top: 0, @@ -129,6 +130,7 @@ interface IProps { export default function ReaderNavBar(props: IProps) { const history = useHistory(); + const backTo = useBackTo(); const { settings, setSettings, manga, chapter, curPage, @@ -167,6 +169,12 @@ export default function ReaderNavBar(props: IProps) { }; }, [handleScroll]);// handleScroll changes on every render + const handleClose = () => { + if (backTo.back) history.goBack(); + else if (backTo.url) history.push(backTo.url); + else history.push(`/manga/${manga.id}`); + }; + return ( <> history.push('..')} + onClick={handleClose} size="large" sx={{ mr: -1 }} > @@ -315,7 +323,7 @@ export default function ReaderNavBar(props: IProps) { && (