Add chapter page dropdown (#230)
Makes it possible to select a specific page of the current chapter
This commit is contained in:
@@ -17,7 +17,7 @@ import { useHistory, Link, useLocation } from 'react-router-dom';
|
|||||||
import Slide from '@mui/material/Slide';
|
import Slide from '@mui/material/Slide';
|
||||||
import Fade from '@mui/material/Fade';
|
import Fade from '@mui/material/Fade';
|
||||||
import Zoom from '@mui/material/Zoom';
|
import Zoom from '@mui/material/Zoom';
|
||||||
import { Divider } from '@mui/material';
|
import { Divider, FormControl, MenuItem, Select } from '@mui/material';
|
||||||
import ListItem from '@mui/material/ListItem';
|
import ListItem from '@mui/material/ListItem';
|
||||||
import ListItemText from '@mui/material/ListItemText';
|
import ListItemText from '@mui/material/ListItemText';
|
||||||
import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';
|
import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';
|
||||||
@@ -71,6 +71,14 @@ const Navigation = styled('div')({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const PageNavigation = styled('div')({
|
||||||
|
display: 'flex',
|
||||||
|
flexWrap: 'wrap',
|
||||||
|
alignContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
});
|
||||||
|
|
||||||
const ChapterNavigation = styled('div')({
|
const ChapterNavigation = styled('div')({
|
||||||
display: 'grid',
|
display: 'grid',
|
||||||
gridTemplateColumns: '1fr 1fr',
|
gridTemplateColumns: '1fr 1fr',
|
||||||
@@ -90,6 +98,8 @@ const ChapterNavigation = styled('div')({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const MenuProps = { PaperProps: { style: { maxHeight: 150 } } };
|
||||||
|
|
||||||
const OpenDrawerButton = styled(IconButton)(({ theme }) => ({
|
const OpenDrawerButton = styled(IconButton)(({ theme }) => ({
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
top: 0 + 20,
|
top: 0 + 20,
|
||||||
@@ -109,6 +119,7 @@ interface IProps {
|
|||||||
manga: IManga | IMangaCard;
|
manga: IManga | IMangaCard;
|
||||||
chapter: IChapter;
|
chapter: IChapter;
|
||||||
curPage: number;
|
curPage: number;
|
||||||
|
setCurPage: (page: number) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ReaderNavBar(props: IProps) {
|
export default function ReaderNavBar(props: IProps) {
|
||||||
@@ -120,7 +131,7 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
}>();
|
}>();
|
||||||
const { prevDrawerOpen, prevSettingsCollapseOpen } = location.state ?? {};
|
const { prevDrawerOpen, prevSettingsCollapseOpen } = location.state ?? {};
|
||||||
|
|
||||||
const { settings, setSettingValue, manga, chapter, curPage } = props;
|
const { settings, setSettingValue, manga, chapter, curPage, setCurPage } = props;
|
||||||
|
|
||||||
const [drawerOpen, setDrawerOpen] = useState(settings.staticNav || prevDrawerOpen);
|
const [drawerOpen, setDrawerOpen] = useState(settings.staticNav || prevDrawerOpen);
|
||||||
const [updateDrawerOnRender, setUpdateDrawerOnRender] = useState(true);
|
const [updateDrawerOnRender, setUpdateDrawerOnRender] = useState(true);
|
||||||
@@ -248,7 +259,33 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
</Collapse>
|
</Collapse>
|
||||||
<Divider sx={{ my: 1, mx: 2 }} />
|
<Divider sx={{ my: 1, mx: 2 }} />
|
||||||
<Navigation>
|
<Navigation>
|
||||||
<span>{`Currently on page ${curPage + 1} of ${chapter.pageCount}`}</span>
|
<PageNavigation>
|
||||||
|
<span>Currently on page</span>
|
||||||
|
<FormControl
|
||||||
|
size="small"
|
||||||
|
sx={{ margin: '0 5px' }}
|
||||||
|
disabled={chapter.pageCount === -1}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
MenuProps={MenuProps}
|
||||||
|
value={chapter.pageCount > -1 ? curPage : ''}
|
||||||
|
displayEmpty
|
||||||
|
onChange={({ target: { value: selectedPage } }) => {
|
||||||
|
setCurPage(Number(selectedPage));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{Array(Math.max(0, chapter.pageCount))
|
||||||
|
.fill(1)
|
||||||
|
.map((ignoreValue, index) => (
|
||||||
|
// eslint-disable-next-line react/no-array-index-key
|
||||||
|
<MenuItem key={`Page#${index}`} value={index}>
|
||||||
|
{index + 1}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
<span>{`of ${chapter.pageCount}`}</span>
|
||||||
|
</PageNavigation>
|
||||||
<ChapterNavigation>
|
<ChapterNavigation>
|
||||||
{chapter.index > 1 && (
|
{chapter.index > 1 && (
|
||||||
<Link
|
<Link
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ export default function Reader() {
|
|||||||
manga={manga}
|
manga={manga}
|
||||||
chapter={chapter as IChapter}
|
chapter={chapter as IChapter}
|
||||||
curPage={curPage}
|
curPage={curPage}
|
||||||
|
setCurPage={setCurPage}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
@@ -206,9 +207,6 @@ export default function Reader() {
|
|||||||
|
|
||||||
const ReaderComponent = getReaderComponent(settings.readerType);
|
const ReaderComponent = getReaderComponent(settings.readerType);
|
||||||
|
|
||||||
// last page, also probably read = true, we will load the first page.
|
|
||||||
const initialPage = chapter.lastPageRead === chapter.pageCount - 1 ? 0 : chapter.lastPageRead;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{ width: settings.staticNav ? 'calc(100vw - 300px)' : '100vw' }}>
|
<Box sx={{ width: settings.staticNav ? 'calc(100vw - 300px)' : '100vw' }}>
|
||||||
<PageNumber settings={settings} curPage={curPage} pageCount={chapter.pageCount} />
|
<PageNumber settings={settings} curPage={curPage} pageCount={chapter.pageCount} />
|
||||||
@@ -216,7 +214,7 @@ export default function Reader() {
|
|||||||
pages={pages}
|
pages={pages}
|
||||||
pageCount={chapter.pageCount}
|
pageCount={chapter.pageCount}
|
||||||
setCurPage={setCurPage}
|
setCurPage={setCurPage}
|
||||||
initialPage={initialPage}
|
initialPage={curPage}
|
||||||
curPage={curPage}
|
curPage={curPage}
|
||||||
settings={settings}
|
settings={settings}
|
||||||
manga={manga}
|
manga={manga}
|
||||||
|
|||||||
Reference in New Issue
Block a user