/* eslint-disable @typescript-eslint/no-unused-vars */ /* * 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 IconButton from '@material-ui/core/IconButton'; import CloseIcon from '@material-ui/icons/Close'; import KeyboardArrowLeftIcon from '@material-ui/icons/KeyboardArrowLeft'; import KeyboardArrowRightIcon from '@material-ui/icons/KeyboardArrowRight'; import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'; import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'; import { makeStyles, Theme, useTheme } from '@material-ui/core/styles'; import React, { useContext, useEffect, useState } from 'react'; import Typography from '@material-ui/core/Typography'; import { useHistory, Link } from 'react-router-dom'; import Slide from '@material-ui/core/Slide'; import Fade from '@material-ui/core/Fade'; import Zoom from '@material-ui/core/Zoom'; import { Switch } from '@material-ui/core'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; import Collapse from '@material-ui/core/Collapse'; import Button from '@material-ui/core/Button'; import ClickAwayListener from '@material-ui/core/ClickAwayListener'; import DarkTheme from '../context/DarkTheme'; import NavBarContext from '../context/NavbarContext'; const useStyles = (settings: IReaderSettings) => makeStyles((theme: Theme) => ({ // main container and root div need to change classes... AppMainContainer: { display: 'none', }, AppRootElment: { display: 'flex', }, root: { position: settings.staticNav ? 'sticky' : 'fixed', top: 0, left: 0, minWidth: '300px', height: '100vh', overflowY: 'auto', backgroundColor: '#0a0b0b', '& header': { backgroundColor: '#363b3d', display: 'flex', alignItems: 'center', minHeight: '64px', paddingLeft: '24px', paddingRight: '24px', transition: 'left 2s ease', '& button': { flexGrow: 0, flexShrink: 0, }, '& button:nth-child(1)': { marginRight: '16px', }, '& button:nth-child(3)': { marginRight: '-12px', }, '& h1': { fontSize: '1.25rem', flexGrow: 1, }, }, '& hr': { margin: '0 16px', height: '1px', border: '0', backgroundColor: 'rgb(38, 41, 43)', }, }, navigation: { margin: '0 16px', '& > span:nth-child(1)': { textAlign: 'center', display: 'block', marginTop: '16px', }, '& $navigationChapters': { display: 'grid', gridTemplateColumns: '1fr 1fr', gridTemplateAreas: '"prev next"', gridColumnGap: '5px', margin: '10px 0', '& a': { flexGrow: 1, textDecoration: 'none', '& button': { width: '100%', padding: '5px 8px', textTransform: 'none', }, }, }, }, navigationChapters: {}, // dummy rule settingsCollapsseHeader: { '& span': { fontWeight: 'bold', }, }, openDrawerButton: { position: 'fixed', top: 0 + 20, left: 10 + 20, height: '40px', width: '40px', borderRadius: 5, backgroundColor: 'black', '&:hover': { backgroundColor: 'black', }, }, })); export const defaultReaderSettings = () => ({ staticNav: false, showPageNumber: true, continuesPageGap: false, } as IReaderSettings); interface IProps { settings: IReaderSettings setSettings: React.Dispatch> manga: IManga | IMangaCard chapter: IChapter | IPartialChpter curPage: number } export default function ReaderNavBar(props: IProps) { const { title } = useContext(NavBarContext); const { darkTheme } = useContext(DarkTheme); const history = useHistory(); const { settings, setSettings, manga, chapter, curPage, } = props; const [drawerOpen, setDrawerOpen] = useState(false || settings.staticNav); const [drawerVisible, setDrawerVisible] = useState(false || settings.staticNav); const [hideOpenButton, setHideOpenButton] = useState(false); const [prevScrollPos, setPrevScrollPos] = useState(0); const [settingsCollapseOpen, setSettingsCollapseOpen] = useState(false); const theme = useTheme(); const classes = useStyles(settings)(); const setSettingValue = (key: string, value: any) => setSettings({ ...settings, [key]: value }); const handleScroll = () => { const currentScrollPos = window.pageYOffset; if (Math.abs(currentScrollPos - prevScrollPos) > 20) { setHideOpenButton(currentScrollPos > prevScrollPos); setPrevScrollPos(currentScrollPos); } }; useEffect(() => { window.addEventListener('scroll', handleScroll); const rootEl = document.querySelector('#root')!; const mainContainer = document.querySelector('#appMainContainer')!; rootEl.classList.add(classes.AppRootElment); mainContainer.classList.add(classes.AppMainContainer); return () => { rootEl.classList.remove(classes.AppRootElment); mainContainer.classList.remove(classes.AppMainContainer); window.removeEventListener('scroll', handleScroll); }; }, [handleScroll]);// handleScroll changes on every render return ( <> (drawerVisible && setDrawerOpen(false))}> setDrawerVisible(true)} onExited={() => setDrawerVisible(false)} >
history.push(`/manga/${manga.id}`)} > {title} {!settings.staticNav && ( setDrawerOpen(false)} > ) }
setSettingsCollapseOpen(!settingsCollapseOpen)} > {settingsCollapseOpen && } {!settingsCollapseOpen && } setSettingValue('staticNav', e.target.checked)} /> setSettingValue('showPageNumber', e.target.checked)} /> setSettingValue('continuesPageGap', e.target.checked)} />
Currently on page {' '} {curPage + 1} {' '} of {' '} {chapter.pageCount}
{chapter.index > 1 && ( )} {chapter.index < chapter.chapterCount && ( )}
setDrawerOpen(true)} > ); }