Revert "migrate some components to Mui5 new styling system (#72)"
This reverts commit 72ef61e286.
This commit is contained in:
12
src/App.tsx
12
src/App.tsx
@@ -12,7 +12,7 @@ import {
|
|||||||
Redirect,
|
Redirect,
|
||||||
} from 'react-router-dom';
|
} from 'react-router-dom';
|
||||||
import { QueryParamProvider } from 'use-query-params';
|
import { QueryParamProvider } from 'use-query-params';
|
||||||
import { Container } from '@mui/material';
|
import { Container, useMediaQuery } from '@mui/material';
|
||||||
import CssBaseline from '@mui/material/CssBaseline';
|
import CssBaseline from '@mui/material/CssBaseline';
|
||||||
import {
|
import {
|
||||||
createTheme, ThemeProvider, Theme, StyledEngineProvider,
|
createTheme, ThemeProvider, Theme, StyledEngineProvider,
|
||||||
@@ -90,6 +90,8 @@ export default function App() {
|
|||||||
}),
|
}),
|
||||||
[darkTheme],
|
[darkTheme],
|
||||||
);
|
);
|
||||||
|
// this can only be used after the theme object is created
|
||||||
|
const isMobileWidth = useMediaQuery(theme.breakpoints.down('sm'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Router>
|
<Router>
|
||||||
@@ -103,10 +105,10 @@ export default function App() {
|
|||||||
id="appMainContainer"
|
id="appMainContainer"
|
||||||
maxWidth={false}
|
maxWidth={false}
|
||||||
disableGutters
|
disableGutters
|
||||||
sx={{
|
style={{
|
||||||
mt: 8,
|
marginTop: theme.spacing(8),
|
||||||
ml: { sm: 8 },
|
marginLeft: isMobileWidth ? '' : theme.spacing(8),
|
||||||
mb: { xs: 8, sm: 4 },
|
marginBottom: isMobileWidth ? theme.spacing(8) : '',
|
||||||
width: 'auto',
|
width: 'auto',
|
||||||
overflow: 'auto',
|
overflow: 'auto',
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import MenuItem from '@mui/material/MenuItem';
|
|||||||
import BookmarkIcon from '@mui/icons-material/Bookmark';
|
import BookmarkIcon from '@mui/icons-material/Bookmark';
|
||||||
|
|
||||||
import client from 'util/client';
|
import client from 'util/client';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
|
||||||
interface IProps{
|
interface IProps{
|
||||||
chapter: IChapter
|
chapter: IChapter
|
||||||
@@ -103,7 +102,7 @@ export default function ChapterCard(props: IProps) {
|
|||||||
padding: 2,
|
padding: 2,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box sx={{ display: 'flex' }}>
|
<div style={{ display: 'flex' }}>
|
||||||
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
||||||
<Typography variant="h5" component="h2">
|
<Typography variant="h5" component="h2">
|
||||||
<span style={{ color: theme.palette.primary.dark }}>
|
<span style={{ color: theme.palette.primary.dark }}>
|
||||||
@@ -118,7 +117,7 @@ export default function ChapterCard(props: IProps) {
|
|||||||
{downloadStatusString}
|
{downloadStatusString}
|
||||||
</Typography>
|
</Typography>
|
||||||
</div>
|
</div>
|
||||||
</Box>
|
</div>
|
||||||
|
|
||||||
<IconButton aria-label="more" onClick={handleClick} size="large">
|
<IconButton aria-label="more" onClick={handleClick} size="large">
|
||||||
<MoreVertIcon />
|
<MoreVertIcon />
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import Card from '@mui/material/Card';
|
import Card from '@mui/material/Card';
|
||||||
import CardContent from '@mui/material/CardContent';
|
import CardContent from '@mui/material/CardContent';
|
||||||
import Button from '@mui/material/Button';
|
import Button from '@mui/material/Button';
|
||||||
@@ -13,7 +14,35 @@ import Avatar from '@mui/material/Avatar';
|
|||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import client from 'util/client';
|
import client from 'util/client';
|
||||||
import useLocalStorage from 'util/useLocalStorage';
|
import useLocalStorage from 'util/useLocalStorage';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
root: {
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
alignItems: 'center',
|
||||||
|
padding: 16,
|
||||||
|
},
|
||||||
|
bullet: {
|
||||||
|
display: 'inline-block',
|
||||||
|
margin: '0 2px',
|
||||||
|
transform: 'scale(0.8)',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
pos: {
|
||||||
|
marginBottom: 12,
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
width: theme.spacing(7),
|
||||||
|
height: theme.spacing(7),
|
||||||
|
flex: '0 0 auto',
|
||||||
|
marginRight: 16,
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
margin: '10px',
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
extension: IExtension
|
extension: IExtension
|
||||||
@@ -38,6 +67,7 @@ export default function ExtensionCard(props: IProps) {
|
|||||||
const [serverAddress] = useLocalStorage<String>('serverBaseURL', '');
|
const [serverAddress] = useLocalStorage<String>('serverBaseURL', '');
|
||||||
const [useCache] = useLocalStorage<boolean>('useCache', true);
|
const [useCache] = useLocalStorage<boolean>('useCache', true);
|
||||||
|
|
||||||
|
const classes = useStyles();
|
||||||
const langPress = lang === 'all' ? 'All' : lang.toUpperCase();
|
const langPress = lang === 'all' ? 'All' : lang.toUpperCase();
|
||||||
|
|
||||||
function install() {
|
function install() {
|
||||||
@@ -88,27 +118,16 @@ export default function ExtensionCard(props: IProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card sx={{ margin: '10px' }}>
|
<Card className={classes.card}>
|
||||||
<CardContent sx={{
|
<CardContent className={classes.root}>
|
||||||
display: 'flex',
|
<div style={{ display: 'flex' }}>
|
||||||
justifyContent: 'space-between',
|
|
||||||
alignItems: 'center',
|
|
||||||
p: 2,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Box sx={{ display: 'flex' }}>
|
|
||||||
<Avatar
|
<Avatar
|
||||||
variant="rounded"
|
variant="rounded"
|
||||||
sx={{
|
className={classes.icon}
|
||||||
width: '56px',
|
|
||||||
height: '56px',
|
|
||||||
flex: '0 0 auto',
|
|
||||||
mr: 2,
|
|
||||||
}}
|
|
||||||
alt={name}
|
alt={name}
|
||||||
src={`${serverAddress}${iconUrl}?useCache=${useCache}`}
|
src={`${serverAddress}${iconUrl}?useCache=${useCache}`}
|
||||||
/>
|
/>
|
||||||
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
|
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
||||||
<Typography variant="h5" component="h2">
|
<Typography variant="h5" component="h2">
|
||||||
{name}
|
{name}
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -117,8 +136,8 @@ export default function ExtensionCard(props: IProps) {
|
|||||||
{' '}
|
{' '}
|
||||||
{versionName}
|
{versionName}
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</div>
|
||||||
</Box>
|
</div>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import Card from '@mui/material/Card';
|
import Card from '@mui/material/Card';
|
||||||
import CardContent from '@mui/material/CardContent';
|
import CardContent from '@mui/material/CardContent';
|
||||||
import { useHistory } from 'react-router-dom';
|
import { useHistory } from 'react-router-dom';
|
||||||
@@ -17,7 +18,55 @@ import Avatar from '@mui/material/Avatar';
|
|||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import useLocalStorage from 'util/useLocalStorage';
|
import useLocalStorage from 'util/useLocalStorage';
|
||||||
import { langCodeToName } from 'util/language';
|
import { langCodeToName } from 'util/language';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
root: {
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
alignItems: 'center',
|
||||||
|
padding: 16,
|
||||||
|
},
|
||||||
|
bullet: {
|
||||||
|
display: 'inline-block',
|
||||||
|
margin: '0 2px',
|
||||||
|
transform: 'scale(0.8)',
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontSize: 14,
|
||||||
|
},
|
||||||
|
pos: {
|
||||||
|
marginBottom: 12,
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
width: theme.spacing(7),
|
||||||
|
height: theme.spacing(7),
|
||||||
|
flex: '0 0 auto',
|
||||||
|
marginRight: 16,
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
margin: '10px',
|
||||||
|
'&:hover': {
|
||||||
|
backgroundColor: theme.palette.action.hover,
|
||||||
|
transition: 'background-color 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
|
||||||
|
},
|
||||||
|
'&:active': {
|
||||||
|
backgroundColor: theme.palette.action.selected,
|
||||||
|
transition: 'background-color 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
showMobile: {
|
||||||
|
display: 'flex',
|
||||||
|
[theme.breakpoints.up('sm')]: {
|
||||||
|
display: 'none',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
showBigger: {
|
||||||
|
display: 'flex',
|
||||||
|
[theme.breakpoints.down('sm')]: {
|
||||||
|
display: 'none',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
source: ISource
|
source: ISource
|
||||||
@@ -35,6 +84,8 @@ export default function SourceCard(props: IProps) {
|
|||||||
const [serverAddress] = useLocalStorage<String>('serverBaseURL', '');
|
const [serverAddress] = useLocalStorage<String>('serverBaseURL', '');
|
||||||
const [useCache] = useLocalStorage<boolean>('useCache', true);
|
const [useCache] = useLocalStorage<boolean>('useCache', true);
|
||||||
|
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
const redirectTo = (e: any, to: string) => {
|
const redirectTo = (e: any, to: string) => {
|
||||||
history.push(to);
|
history.push(to);
|
||||||
|
|
||||||
@@ -44,34 +95,19 @@ export default function SourceCard(props: IProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
sx={{
|
className={classes.card}
|
||||||
margin: '10px',
|
|
||||||
'&:hover': {
|
|
||||||
backgroundColor: 'action.hover',
|
|
||||||
transition: 'background-color 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
|
|
||||||
},
|
|
||||||
'&:active': {
|
|
||||||
backgroundColor: 'action.selected',
|
|
||||||
transition: 'background-color 100ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
onClick={(e) => redirectTo(e, `/sources/${id}/popular/`)}
|
onClick={(e) => redirectTo(e, `/sources/${id}/popular/`)}
|
||||||
>
|
>
|
||||||
<CardContent sx={{
|
<CardContent className={classes.root}>
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'space-between',
|
|
||||||
alignItems: 'center',
|
|
||||||
padding: 2,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
|
|
||||||
<Box sx={{ display: 'flex' }}>
|
<div style={{ display: 'flex' }}>
|
||||||
<Avatar
|
<Avatar
|
||||||
variant="rounded"
|
variant="rounded"
|
||||||
|
className={classes.icon}
|
||||||
alt={name}
|
alt={name}
|
||||||
src={`${serverAddress}${iconUrl}?useCache=${useCache}`}
|
src={`${serverAddress}${iconUrl}?useCache=${useCache}`}
|
||||||
/>
|
/>
|
||||||
<Box sx={{ display: 'flex', flexDirection: 'column', justifyContent: 'center' }}>
|
<div style={{ display: 'flex', flexDirection: 'column', justifyContent: 'center' }}>
|
||||||
<Typography variant="h5" component="h2">
|
<Typography variant="h5" component="h2">
|
||||||
{name}
|
{name}
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -80,12 +116,12 @@ export default function SourceCard(props: IProps) {
|
|||||||
{langCodeToName(lang)}
|
{langCodeToName(lang)}
|
||||||
</Typography>
|
</Typography>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</div>
|
||||||
</Box>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<Box sx={{ display: { xs: 'flex', sm: 'none' } }}>
|
<div className={classes.showMobile}>
|
||||||
<IconButton
|
<IconButton
|
||||||
sx={{ width: 59, height: 59 }}
|
style={{ width: 59, height: 59 }}
|
||||||
onClick={(e) => redirectTo(e, `/sources/${id}/search/`)}
|
onClick={(e) => redirectTo(e, `/sources/${id}/search/`)}
|
||||||
size="large"
|
size="large"
|
||||||
edge="end"
|
edge="end"
|
||||||
@@ -104,19 +140,11 @@ export default function SourceCard(props: IProps) {
|
|||||||
/>
|
/>
|
||||||
</IconButton>
|
</IconButton>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</div>
|
||||||
<Box sx={{
|
<div className={classes.showBigger}>
|
||||||
display: {
|
|
||||||
xs: 'none',
|
|
||||||
sm: 'flex',
|
|
||||||
},
|
|
||||||
'> .MuiButton-root': {
|
|
||||||
ml: '20px',
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Button
|
<Button
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
style={{ marginLeft: 20 }}
|
||||||
onClick={(e) => redirectTo(e, `/sources/${id}/search/`)}
|
onClick={(e) => redirectTo(e, `/sources/${id}/search/`)}
|
||||||
>
|
>
|
||||||
Search
|
Search
|
||||||
@@ -124,6 +152,7 @@ export default function SourceCard(props: IProps) {
|
|||||||
{supportsLatest && (
|
{supportsLatest && (
|
||||||
<Button
|
<Button
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
style={{ marginLeft: 20 }}
|
||||||
onClick={(e) => redirectTo(e, `/sources/${id}/latest/`)}
|
onClick={(e) => redirectTo(e, `/sources/${id}/latest/`)}
|
||||||
>
|
>
|
||||||
Latest
|
Latest
|
||||||
@@ -131,11 +160,12 @@ export default function SourceCard(props: IProps) {
|
|||||||
)}
|
)}
|
||||||
<Button
|
<Button
|
||||||
variant="outlined"
|
variant="outlined"
|
||||||
|
style={{ marginLeft: 20 }}
|
||||||
onClick={(e: any) => redirectTo(e, `/sources/${id}/popular/`)}
|
onClick={(e: any) => redirectTo(e, `/sources/${id}/popular/`)}
|
||||||
>
|
>
|
||||||
Browse
|
Browse
|
||||||
</Button>
|
</Button>
|
||||||
</Box>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -11,17 +11,16 @@ import FilterListIcon from '@mui/icons-material/FilterList';
|
|||||||
import { Drawer, FormControlLabel, IconButton } from '@mui/material';
|
import { Drawer, FormControlLabel, IconButton } from '@mui/material';
|
||||||
import useLibraryOptions from 'util/useLibraryOptions';
|
import useLibraryOptions from 'util/useLibraryOptions';
|
||||||
import ThreeStateCheckbox from 'components/util/ThreeStateCheckbox';
|
import ThreeStateCheckbox from 'components/util/ThreeStateCheckbox';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
|
||||||
function Options() {
|
function Options() {
|
||||||
const {
|
const {
|
||||||
downloaded, setDownloaded, unread, setUnread,
|
downloaded, setDownloaded, unread, setUnread,
|
||||||
} = useLibraryOptions();
|
} = useLibraryOptions();
|
||||||
return (
|
return (
|
||||||
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
|
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
||||||
<FormControlLabel control={<ThreeStateCheckbox name="Unread" checked={unread} onChange={setUnread} />} label="Unread" />
|
<FormControlLabel control={<ThreeStateCheckbox name="Unread" checked={unread} onChange={setUnread} />} label="Unread" />
|
||||||
<FormControlLabel control={<ThreeStateCheckbox name="Downloaded" checked={downloaded} onChange={setDownloaded} />} label="Downloaded" />
|
<FormControlLabel control={<ThreeStateCheckbox name="Downloaded" checked={downloaded} onChange={setDownloaded} />} label="Downloaded" />
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import KeyboardArrowLeftIcon from '@mui/icons-material/KeyboardArrowLeft';
|
|||||||
import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
|
import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
|
||||||
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
||||||
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
|
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState } from 'react';
|
||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import { useHistory, Link } from 'react-router-dom';
|
import { useHistory, Link } from 'react-router-dom';
|
||||||
@@ -27,9 +28,18 @@ import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';
|
|||||||
import Collapse from '@mui/material/Collapse';
|
import Collapse from '@mui/material/Collapse';
|
||||||
import Button from '@mui/material/Button';
|
import Button from '@mui/material/Button';
|
||||||
import NavBarContext from 'components/context/NavbarContext';
|
import NavBarContext from 'components/context/NavbarContext';
|
||||||
import { styled } from '@mui/system';
|
|
||||||
|
|
||||||
const Root = styled('div')(({ theme }) => ({
|
const useStyles = (settings: IReaderSettings) => makeStyles((theme) => ({
|
||||||
|
// main container and root div need to change classes...
|
||||||
|
AppMainContainer: {
|
||||||
|
display: 'none',
|
||||||
|
},
|
||||||
|
AppRootElment: {
|
||||||
|
display: 'flex',
|
||||||
|
},
|
||||||
|
|
||||||
|
root: {
|
||||||
|
position: settings.staticNav ? 'sticky' : 'fixed',
|
||||||
top: 0,
|
top: 0,
|
||||||
left: 0,
|
left: 0,
|
||||||
width: '300px',
|
width: '300px',
|
||||||
@@ -73,21 +83,22 @@ const Root = styled('div')(({ theme }) => ({
|
|||||||
border: '0',
|
border: '0',
|
||||||
backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[800] : theme.palette.grey[100],
|
backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[800] : theme.palette.grey[100],
|
||||||
},
|
},
|
||||||
}));
|
},
|
||||||
|
|
||||||
const Navigation = styled('div')({
|
navigation: {
|
||||||
margin: '0 16px',
|
margin: '0 16px',
|
||||||
|
|
||||||
'& > span:nth-child(1)': {
|
'& > span:nth-child(1)': {
|
||||||
textAlign: 'center',
|
textAlign: 'center',
|
||||||
display: 'block',
|
display: 'block',
|
||||||
marginTop: '16px',
|
marginTop: '16px',
|
||||||
},
|
},
|
||||||
});
|
|
||||||
|
|
||||||
const ChapterNavigation = styled('div')({
|
'& $navigationChapters': {
|
||||||
display: 'grid',
|
display: 'grid',
|
||||||
gridTemplateColumns: '1fr 1fr',
|
gridTemplateColumns: '1fr 1fr',
|
||||||
gap: '5px',
|
gridTemplateAreas: '"prev next"',
|
||||||
|
gridColumnGap: '5px',
|
||||||
margin: '10px 0',
|
margin: '10px 0',
|
||||||
|
|
||||||
'& a': {
|
'& a': {
|
||||||
@@ -100,9 +111,18 @@ const ChapterNavigation = styled('div')({
|
|||||||
textTransform: 'none',
|
textTransform: 'none',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
},
|
||||||
|
|
||||||
const OpenDrawerButton = styled(IconButton)(({ theme }) => ({
|
},
|
||||||
|
navigationChapters: {}, // dummy rule
|
||||||
|
|
||||||
|
settingsCollapsseHeader: {
|
||||||
|
'& span': {
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
openDrawerButton: {
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
top: 0 + 20,
|
top: 0 + 20,
|
||||||
left: 10 + 20,
|
left: 10 + 20,
|
||||||
@@ -110,9 +130,11 @@ const OpenDrawerButton = styled(IconButton)(({ theme }) => ({
|
|||||||
width: '40px',
|
width: '40px',
|
||||||
borderRadius: 5,
|
borderRadius: 5,
|
||||||
backgroundColor: theme.palette.mode === 'dark' ? 'black' : 'white',
|
backgroundColor: theme.palette.mode === 'dark' ? 'black' : 'white',
|
||||||
|
|
||||||
'&:hover': {
|
'&:hover': {
|
||||||
backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[900] : theme.palette.grey[100],
|
backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[900] : theme.palette.grey[100],
|
||||||
},
|
},
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
export const defaultReaderSettings = () => ({
|
export const defaultReaderSettings = () => ({
|
||||||
@@ -146,6 +168,8 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
const [prevScrollPos, setPrevScrollPos] = useState(0);
|
const [prevScrollPos, setPrevScrollPos] = useState(0);
|
||||||
const [settingsCollapseOpen, setSettingsCollapseOpen] = useState(true);
|
const [settingsCollapseOpen, setSettingsCollapseOpen] = useState(true);
|
||||||
|
|
||||||
|
const classes = useStyles(settings)();
|
||||||
|
|
||||||
const setSettingValue = (key: string, value: any) => setSettings({ ...settings, [key]: value });
|
const setSettingValue = (key: string, value: any) => setSettings({ ...settings, [key]: value });
|
||||||
|
|
||||||
const handleScroll = () => {
|
const handleScroll = () => {
|
||||||
@@ -160,16 +184,15 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
window.addEventListener('scroll', handleScroll);
|
window.addEventListener('scroll', handleScroll);
|
||||||
|
|
||||||
const rootEl:HTMLDivElement = document.querySelector('#root')!;
|
const rootEl = document.querySelector('#root')!;
|
||||||
const mainContainer:HTMLDivElement = document.querySelector('#appMainContainer')!;
|
const mainContainer = document.querySelector('#appMainContainer')!;
|
||||||
|
|
||||||
// main container and root div need to change styles...
|
rootEl.classList.add(classes.AppRootElment);
|
||||||
rootEl.style.display = 'flex';
|
mainContainer.classList.add(classes.AppMainContainer);
|
||||||
mainContainer.style.display = 'none';
|
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
rootEl.style.display = 'block';
|
rootEl.classList.remove(classes.AppRootElment);
|
||||||
mainContainer.style.display = 'block';
|
mainContainer.classList.remove(classes.AppMainContainer);
|
||||||
window.removeEventListener('scroll', handleScroll);
|
window.removeEventListener('scroll', handleScroll);
|
||||||
};
|
};
|
||||||
}, [handleScroll]);// handleScroll changes on every render
|
}, [handleScroll]);// handleScroll changes on every render
|
||||||
@@ -184,10 +207,7 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
mountOnEnter
|
mountOnEnter
|
||||||
unmountOnExit
|
unmountOnExit
|
||||||
>
|
>
|
||||||
<Root sx={{
|
<div className={classes.root}>
|
||||||
position: settings.staticNav ? 'sticky' : 'fixed',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<header>
|
<header>
|
||||||
<IconButton
|
<IconButton
|
||||||
edge="start"
|
edge="start"
|
||||||
@@ -214,14 +234,7 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
<CloseIcon />
|
<CloseIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</header>
|
</header>
|
||||||
<ListItem
|
<ListItem ContainerComponent="div" className={classes.settingsCollapsseHeader}>
|
||||||
ContainerComponent="div"
|
|
||||||
sx={{
|
|
||||||
'& span': {
|
|
||||||
fontWeight: 'bold',
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ListItemText primary="Reader Settings" />
|
<ListItemText primary="Reader Settings" />
|
||||||
<ListItemSecondaryAction>
|
<ListItemSecondaryAction>
|
||||||
<IconButton
|
<IconButton
|
||||||
@@ -317,15 +330,16 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
</List>
|
</List>
|
||||||
</Collapse>
|
</Collapse>
|
||||||
<hr />
|
<hr />
|
||||||
<Navigation>
|
<div className={classes.navigation}>
|
||||||
<span>
|
<span>
|
||||||
{`Currently on page ${curPage + 1} of ${chapter.pageCount}`}
|
{`Currently on page ${curPage + 1} of ${chapter.pageCount}`}
|
||||||
</span>
|
</span>
|
||||||
<ChapterNavigation>
|
<div className={classes.navigationChapters}>
|
||||||
{chapter.index > 1
|
{chapter.index > 1
|
||||||
&& (
|
&& (
|
||||||
<Link
|
<Link
|
||||||
replace
|
replace
|
||||||
|
style={{ gridArea: 'prev' }}
|
||||||
to={`/manga/${manga.id}/chapter/${chapter.index - 1}`}
|
to={`/manga/${manga.id}/chapter/${chapter.index - 1}`}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
@@ -340,6 +354,7 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
&& (
|
&& (
|
||||||
<Link
|
<Link
|
||||||
replace
|
replace
|
||||||
|
style={{ gridArea: 'next' }}
|
||||||
to={`/manga/${manga.id}/chapter/${chapter.index + 1}`}
|
to={`/manga/${manga.id}/chapter/${chapter.index + 1}`}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
@@ -350,13 +365,14 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
</Button>
|
</Button>
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
</ChapterNavigation>
|
</div>
|
||||||
</Navigation>
|
</div>
|
||||||
</Root>
|
</div>
|
||||||
</Slide>
|
</Slide>
|
||||||
<Zoom in={!drawerOpen}>
|
<Zoom in={!drawerOpen}>
|
||||||
<Fade in={!hideOpenButton}>
|
<Fade in={!hideOpenButton}>
|
||||||
<OpenDrawerButton
|
<IconButton
|
||||||
|
className={classes.openDrawerButton}
|
||||||
edge="start"
|
edge="start"
|
||||||
color="inherit"
|
color="inherit"
|
||||||
aria-label="menu"
|
aria-label="menu"
|
||||||
@@ -366,7 +382,7 @@ export default function ReaderNavBar(props: IProps) {
|
|||||||
size="large"
|
size="large"
|
||||||
>
|
>
|
||||||
<KeyboardArrowRightIcon />
|
<KeyboardArrowRightIcon />
|
||||||
</OpenDrawerButton>
|
</IconButton>
|
||||||
</Fade>
|
</Fade>
|
||||||
</Zoom>
|
</Zoom>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
|
import createStyles from '@mui/styles/createStyles';
|
||||||
import Button from '@mui/material/Button';
|
import Button from '@mui/material/Button';
|
||||||
import DialogTitle from '@mui/material/DialogTitle';
|
import DialogTitle from '@mui/material/DialogTitle';
|
||||||
import DialogContent from '@mui/material/DialogContent';
|
import DialogContent from '@mui/material/DialogContent';
|
||||||
@@ -16,6 +18,13 @@ import FormControlLabel from '@mui/material/FormControlLabel';
|
|||||||
import FormGroup from '@mui/material/FormGroup';
|
import FormGroup from '@mui/material/FormGroup';
|
||||||
import client from 'util/client';
|
import client from 'util/client';
|
||||||
|
|
||||||
|
const useStyles = makeStyles(() => createStyles({
|
||||||
|
paper: {
|
||||||
|
maxHeight: 435,
|
||||||
|
width: '80%',
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
open: boolean
|
open: boolean
|
||||||
setOpen: (value: boolean) => void
|
setOpen: (value: boolean) => void
|
||||||
@@ -28,6 +37,7 @@ interface ICategoryInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function CategorySelect(props: IProps) {
|
export default function CategorySelect(props: IProps) {
|
||||||
|
const classes = useStyles();
|
||||||
const { open, setOpen, mangaId } = props;
|
const { open, setOpen, mangaId } = props;
|
||||||
const [categoryInfos, setCategoryInfos] = useState<ICategoryInfo[]>([]);
|
const [categoryInfos, setCategoryInfos] = useState<ICategoryInfo[]>([]);
|
||||||
|
|
||||||
@@ -72,12 +82,7 @@ export default function CategorySelect(props: IProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog
|
<Dialog
|
||||||
sx={{
|
classes={classes}
|
||||||
'.MuiDialog-paper': {
|
|
||||||
maxHeight: 435,
|
|
||||||
width: '80%',
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
maxWidth="xs"
|
maxWidth="xs"
|
||||||
open={open}
|
open={open}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
|
import createStyles from '@mui/styles/createStyles';
|
||||||
import Button from '@mui/material/Button';
|
import Button from '@mui/material/Button';
|
||||||
import DialogTitle from '@mui/material/DialogTitle';
|
import DialogTitle from '@mui/material/DialogTitle';
|
||||||
import DialogContent from '@mui/material/DialogContent';
|
import DialogContent from '@mui/material/DialogContent';
|
||||||
@@ -19,6 +21,13 @@ import ListItem from '@mui/material/ListItem';
|
|||||||
import { langCodeToName } from 'util/language';
|
import { langCodeToName } from 'util/language';
|
||||||
import cloneObject from 'util/cloneObject';
|
import cloneObject from 'util/cloneObject';
|
||||||
|
|
||||||
|
const useStyles = makeStyles(() => createStyles({
|
||||||
|
paper: {
|
||||||
|
maxHeight: 435,
|
||||||
|
width: '80%',
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
function removeAll(firstList: any[], secondList: any[]) {
|
function removeAll(firstList: any[], secondList: any[]) {
|
||||||
secondList.forEach((item) => {
|
secondList.forEach((item) => {
|
||||||
const index = firstList.indexOf(item);
|
const index = firstList.indexOf(item);
|
||||||
@@ -45,6 +54,7 @@ export default function LangSelect(props: IProps) {
|
|||||||
const [mShownLangs, setMShownLangs] = useState(
|
const [mShownLangs, setMShownLangs] = useState(
|
||||||
removeAll(cloneObject(shownLangs), forcedLangs!),
|
removeAll(cloneObject(shownLangs), forcedLangs!),
|
||||||
);
|
);
|
||||||
|
const classes = useStyles();
|
||||||
const [open, setOpen] = useState<boolean>(false);
|
const [open, setOpen] = useState<boolean>(false);
|
||||||
|
|
||||||
const handleCancel = () => {
|
const handleCancel = () => {
|
||||||
@@ -80,17 +90,12 @@ export default function LangSelect(props: IProps) {
|
|||||||
<FilterListIcon />
|
<FilterListIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
<Dialog
|
<Dialog
|
||||||
sx={{
|
classes={classes}
|
||||||
'.MuiDialog-paper': {
|
|
||||||
maxHeight: 435,
|
|
||||||
width: '80%',
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
maxWidth="xs"
|
maxWidth="xs"
|
||||||
open={open}
|
open={open}
|
||||||
>
|
>
|
||||||
<DialogTitle>Enabled Languages</DialogTitle>
|
<DialogTitle>Enabled Languages</DialogTitle>
|
||||||
<DialogContent dividers sx={{ padding: 0 }}>
|
<DialogContent dividers style={{ padding: 0 }}>
|
||||||
<List>
|
<List>
|
||||||
{allLangs.map((lang) => (
|
{allLangs.map((lang) => (
|
||||||
<ListItem key={lang}>
|
<ListItem key={lang}>
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export default function DesktopSideBar({ navBarItems }: IProps) {
|
|||||||
}: NavbarItem) => (
|
}: NavbarItem) => (
|
||||||
<Link to={path} style={{ color: 'inherit', textDecoration: 'none' }} key={path}>
|
<Link to={path} style={{ color: 'inherit', textDecoration: 'none' }} key={path}>
|
||||||
<ListItem disableRipple button key={title}>
|
<ListItem disableRipple button key={title}>
|
||||||
<ListItemIcon sx={{ minWidth: '0' }}>
|
<ListItemIcon style={{ minWidth: '0' }}>
|
||||||
<Tooltip placement="right" title={title}>
|
<Tooltip placement="right" title={title}>
|
||||||
{iconFor(path, IconComponent, SelectedIconComponent)}
|
{iconFor(path, IconComponent, SelectedIconComponent)}
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|||||||
@@ -5,16 +5,28 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Box, styled } from '@mui/system';
|
|
||||||
|
|
||||||
const Image = styled('img')({
|
const useStyles = (settings: IReaderSettings) => makeStyles({
|
||||||
|
image: {
|
||||||
|
display: 'block',
|
||||||
marginBottom: 0,
|
marginBottom: 0,
|
||||||
width: 'auto',
|
width: 'auto',
|
||||||
minHeight: '99vh',
|
minHeight: '99vh',
|
||||||
height: 'auto',
|
height: 'auto',
|
||||||
maxHeight: '99vh',
|
maxHeight: '99vh',
|
||||||
objectFit: 'contain',
|
objectFit: 'contain',
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: settings.readerType === 'DoubleLTR' ? 'row' : 'row-reverse',
|
||||||
|
justifyContent: 'center',
|
||||||
|
margin: '0 auto',
|
||||||
|
width: 'auto',
|
||||||
|
height: 'auto',
|
||||||
|
overflowX: 'scroll',
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
@@ -29,28 +41,21 @@ const DoublePage = React.forwardRef((props: IProps, ref: any) => {
|
|||||||
image1src, image2src, index, settings,
|
image1src, image2src, index, settings,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
const classes = useStyles(settings)();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<div ref={ref} className={classes.page}>
|
||||||
ref={ref}
|
<img
|
||||||
sx={{
|
className={classes.image}
|
||||||
display: 'flex',
|
|
||||||
flexDirection: settings.readerType === 'DoubleLTR' ? 'row' : 'row-reverse',
|
|
||||||
justifyContent: 'center',
|
|
||||||
margin: '0 auto',
|
|
||||||
width: 'auto',
|
|
||||||
height: 'auto',
|
|
||||||
overflowX: 'scroll',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
src={image1src}
|
src={image1src}
|
||||||
alt={`Page #${index}`}
|
alt={`Page #${index}`}
|
||||||
/>
|
/>
|
||||||
<Image
|
<img
|
||||||
|
className={classes.image}
|
||||||
src={image2src}
|
src={image2src}
|
||||||
alt={`Page #${index + 1}`}
|
alt={`Page #${index + 1}`}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useEffect, useRef } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import SpinnerImage from 'components/util/SpinnerImage';
|
import SpinnerImage from 'components/util/SpinnerImage';
|
||||||
import useLocalStorage from 'util/useLocalStorage';
|
import useLocalStorage from 'util/useLocalStorage';
|
||||||
@@ -52,6 +53,22 @@ function imageStyle(settings: IReaderSettings): any {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const useStyles = (settings: IReaderSettings) => makeStyles({
|
||||||
|
loading: {
|
||||||
|
margin: '100px auto',
|
||||||
|
height: '100vh',
|
||||||
|
width: '100vw',
|
||||||
|
},
|
||||||
|
loadingImage: {
|
||||||
|
height: '100vh',
|
||||||
|
width: '70vw',
|
||||||
|
padding: '50px calc(50% - 20px)',
|
||||||
|
backgroundColor: '#525252',
|
||||||
|
marginBottom: 10,
|
||||||
|
},
|
||||||
|
image: imageStyle(settings),
|
||||||
|
});
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
src: string
|
src: string
|
||||||
index: number
|
index: number
|
||||||
@@ -67,6 +84,7 @@ const Page = React.forwardRef((props: IProps, ref: any) => {
|
|||||||
|
|
||||||
const [useCache] = useLocalStorage<boolean>('useCache', true);
|
const [useCache] = useLocalStorage<boolean>('useCache', true);
|
||||||
|
|
||||||
|
const classes = useStyles(settings)();
|
||||||
const imgRef = useRef<HTMLImageElement>(null);
|
const imgRef = useRef<HTMLImageElement>(null);
|
||||||
|
|
||||||
const handleVerticalScroll = () => {
|
const handleVerticalScroll = () => {
|
||||||
@@ -109,14 +127,8 @@ const Page = React.forwardRef((props: IProps, ref: any) => {
|
|||||||
onImageLoad={onImageLoad}
|
onImageLoad={onImageLoad}
|
||||||
alt={`Page #${index}`}
|
alt={`Page #${index}`}
|
||||||
imgRef={imgRef}
|
imgRef={imgRef}
|
||||||
spinnerStyle={{
|
spinnerClassName={`${classes.image} ${classes.loadingImage}`}
|
||||||
height: '100vh',
|
imgClassName={classes.image}
|
||||||
width: '70vw',
|
|
||||||
padding: '50px calc(50% - 20px)',
|
|
||||||
backgroundColor: '#525252',
|
|
||||||
marginBottom: 10,
|
|
||||||
}}
|
|
||||||
imgStyle={imageStyle(settings)}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,8 +5,21 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
const useStyles = (settings: IReaderSettings) => makeStyles({
|
||||||
|
pageNumber: {
|
||||||
|
display: settings.showPageNumber ? 'block' : 'none',
|
||||||
|
position: 'fixed',
|
||||||
|
bottom: '50px',
|
||||||
|
right: settings.staticNav ? 'calc((100vw - 325px)/2)' : 'calc((100vw - 25px)/2)',
|
||||||
|
padding: '2px',
|
||||||
|
textAlign: 'center',
|
||||||
|
backgroundColor: 'rgba(0, 0, 0, 0.3)',
|
||||||
|
borderRadius: '10px',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
settings: IReaderSettings
|
settings: IReaderSettings
|
||||||
@@ -16,20 +29,11 @@ interface IProps {
|
|||||||
|
|
||||||
export default function PageNumber(props: IProps) {
|
export default function PageNumber(props: IProps) {
|
||||||
const { settings, curPage, pageCount } = props;
|
const { settings, curPage, pageCount } = props;
|
||||||
|
const classes = useStyles(settings)();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{
|
<div className={classes.pageNumber}>
|
||||||
display: settings.showPageNumber ? 'block' : 'none',
|
|
||||||
position: 'fixed',
|
|
||||||
bottom: '50px',
|
|
||||||
right: settings.staticNav ? 'calc((100vw - 325px)/2)' : 'calc((100vw - 25px)/2)',
|
|
||||||
padding: '2px',
|
|
||||||
textAlign: 'center',
|
|
||||||
backgroundColor: 'rgba(0, 0, 0, 0.3)',
|
|
||||||
borderRadius: '10px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`${curPage + 1} / ${pageCount}`}
|
{`${curPage + 1} / ${pageCount}`}
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,17 +5,34 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useEffect, useRef } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
import Page from '../Page';
|
import Page from '../Page';
|
||||||
import DoublePage from '../DoublePage';
|
import DoublePage from '../DoublePage';
|
||||||
|
|
||||||
|
const useStyles = (settings: IReaderSettings) => makeStyles({
|
||||||
|
preload: {
|
||||||
|
display: 'none',
|
||||||
|
},
|
||||||
|
reader: {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: (settings.readerType === 'DoubleLTR') ? 'row' : 'row-reverse',
|
||||||
|
justifyContent: 'center',
|
||||||
|
margin: '0 auto',
|
||||||
|
width: 'auto',
|
||||||
|
height: 'auto',
|
||||||
|
overflowX: 'scroll',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default function DoublePagedPager(props: IReaderProps) {
|
export default function DoublePagedPager(props: IReaderProps) {
|
||||||
const {
|
const {
|
||||||
pages, settings, setCurPage, curPage, nextChapter, prevChapter,
|
pages, settings, setCurPage, curPage, nextChapter, prevChapter,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
const classes = useStyles(settings)();
|
||||||
|
|
||||||
const selfRef = useRef<HTMLDivElement>(null);
|
const selfRef = useRef<HTMLDivElement>(null);
|
||||||
const pagesRef = useRef<HTMLImageElement[]>([]);
|
const pagesRef = useRef<HTMLImageElement[]>([]);
|
||||||
|
|
||||||
@@ -175,8 +192,8 @@ export default function DoublePagedPager(props: IReaderProps) {
|
|||||||
}, [selfRef, curPage, settings.readerType]);
|
}, [selfRef, curPage, settings.readerType]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box ref={selfRef}>
|
<div ref={selfRef}>
|
||||||
<Box id="preload" sx={{ display: 'none' }}>
|
<div id="preload" className={classes.preload}>
|
||||||
{
|
{
|
||||||
pages.map((page) => (
|
pages.map((page) => (
|
||||||
<img
|
<img
|
||||||
@@ -188,19 +205,8 @@ export default function DoublePagedPager(props: IReaderProps) {
|
|||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
</Box>
|
</div>
|
||||||
<Box
|
<div id="display" className={classes.reader} />
|
||||||
id="display"
|
</div>
|
||||||
sx={{
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: (settings.readerType === 'DoubleLTR') ? 'row' : 'row-reverse',
|
|
||||||
justifyContent: 'center',
|
|
||||||
margin: '0 auto',
|
|
||||||
width: 'auto',
|
|
||||||
height: 'auto',
|
|
||||||
overflowX: 'scroll',
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,15 +5,30 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useEffect, useRef } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
import Page from '../Page';
|
import Page from '../Page';
|
||||||
|
|
||||||
|
const useStyles = (settings: IReaderSettings) => makeStyles({
|
||||||
|
reader: {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: (settings.readerType === 'ContinuesHorizontalLTR') ? 'row' : 'row-reverse',
|
||||||
|
justifyContent: (settings.readerType === 'ContinuesHorizontalLTR') ? 'flex-start' : 'flex-end',
|
||||||
|
margin: '0 auto',
|
||||||
|
width: 'auto',
|
||||||
|
height: 'auto',
|
||||||
|
overflowX: 'visible',
|
||||||
|
userSelect: 'none',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default function HorizontalPager(props: IReaderProps) {
|
export default function HorizontalPager(props: IReaderProps) {
|
||||||
const {
|
const {
|
||||||
pages, curPage, settings, setCurPage, prevChapter, nextChapter,
|
pages, curPage, settings, setCurPage, prevChapter, nextChapter,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
const classes = useStyles(settings)();
|
||||||
|
|
||||||
const selfRef = useRef<HTMLDivElement>(null);
|
const selfRef = useRef<HTMLDivElement>(null);
|
||||||
const pagesRef = useRef<HTMLDivElement[]>([]);
|
const pagesRef = useRef<HTMLDivElement[]>([]);
|
||||||
|
|
||||||
@@ -114,19 +129,7 @@ export default function HorizontalPager(props: IReaderProps) {
|
|||||||
}, [selfRef, curPage]);
|
}, [selfRef, curPage]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<div ref={selfRef} className={classes.reader}>
|
||||||
ref={selfRef}
|
|
||||||
sx={{
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: (settings.readerType === 'ContinuesHorizontalLTR') ? 'row' : 'row-reverse',
|
|
||||||
justifyContent: (settings.readerType === 'ContinuesHorizontalLTR') ? 'flex-start' : 'flex-end',
|
|
||||||
margin: '0 auto',
|
|
||||||
width: 'auto',
|
|
||||||
height: 'auto',
|
|
||||||
overflowX: 'visible',
|
|
||||||
userSelect: 'none',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{
|
{
|
||||||
pages.map((page) => (
|
pages.map((page) => (
|
||||||
<Page
|
<Page
|
||||||
@@ -140,6 +143,6 @@ export default function HorizontalPager(props: IReaderProps) {
|
|||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,15 +5,28 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useEffect, useRef } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
import Page from '../Page';
|
import Page from '../Page';
|
||||||
|
|
||||||
|
const useStyles = makeStyles({
|
||||||
|
reader: {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'center',
|
||||||
|
margin: '0 auto',
|
||||||
|
width: '100%',
|
||||||
|
height: '100vh',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default function PagedReader(props: IReaderProps) {
|
export default function PagedReader(props: IReaderProps) {
|
||||||
const {
|
const {
|
||||||
pages, settings, setCurPage, curPage, nextChapter, prevChapter,
|
pages, settings, setCurPage, curPage, nextChapter, prevChapter,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
const selfRef = useRef<HTMLDivElement>(null);
|
const selfRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
function nextPage() {
|
function nextPage() {
|
||||||
@@ -84,17 +97,7 @@ export default function PagedReader(props: IReaderProps) {
|
|||||||
}, [selfRef, curPage, settings.readerType]);
|
}, [selfRef, curPage, settings.readerType]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<div ref={selfRef} className={classes.reader}>
|
||||||
ref={selfRef}
|
|
||||||
sx={{
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'row',
|
|
||||||
justifyContent: 'center',
|
|
||||||
margin: '0 auto',
|
|
||||||
width: '100%',
|
|
||||||
height: '100vh',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Page
|
<Page
|
||||||
key={curPage}
|
key={curPage}
|
||||||
index={curPage}
|
index={curPage}
|
||||||
@@ -103,6 +106,6 @@ export default function PagedReader(props: IReaderProps) {
|
|||||||
setCurPage={setCurPage}
|
setCurPage={setCurPage}
|
||||||
settings={settings}
|
settings={settings}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,15 +5,27 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useEffect, useRef } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
import Page from '../Page';
|
import Page from '../Page';
|
||||||
|
|
||||||
|
const useStyles = makeStyles({
|
||||||
|
reader: {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
justifyContent: 'center',
|
||||||
|
margin: '0 auto',
|
||||||
|
width: '100%',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default function VerticalReader(props: IReaderProps) {
|
export default function VerticalReader(props: IReaderProps) {
|
||||||
const {
|
const {
|
||||||
pages, settings, setCurPage, curPage, nextChapter, prevChapter,
|
pages, settings, setCurPage, curPage, nextChapter, prevChapter,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
const selfRef = useRef<HTMLDivElement>(null);
|
const selfRef = useRef<HTMLDivElement>(null);
|
||||||
const pagesRef = useRef<HTMLDivElement[]>([]);
|
const pagesRef = useRef<HTMLDivElement[]>([]);
|
||||||
|
|
||||||
@@ -93,16 +105,7 @@ export default function VerticalReader(props: IReaderProps) {
|
|||||||
}, [pagesRef.current.length]);
|
}, [pagesRef.current.length]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<div ref={selfRef} className={classes.reader}>
|
||||||
ref={selfRef}
|
|
||||||
sx={{
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'column',
|
|
||||||
justifyContent: 'center',
|
|
||||||
margin: '0 auto',
|
|
||||||
width: '100%',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{
|
{
|
||||||
pages.map((page) => (
|
pages.map((page) => (
|
||||||
<Page
|
<Page
|
||||||
@@ -116,6 +119,6 @@ export default function VerticalReader(props: IReaderProps) {
|
|||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import React from 'react';
|
|||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import { useTheme } from '@mui/material/styles';
|
import { useTheme } from '@mui/material/styles';
|
||||||
import { useMediaQuery } from '@mui/material';
|
import { useMediaQuery } from '@mui/material';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
|
||||||
const ERROR_FACES = [
|
const ERROR_FACES = [
|
||||||
'(・o・;)',
|
'(・o・;)',
|
||||||
@@ -36,7 +35,7 @@ export default function EmptyView({ message, messageExtra }: IProps) {
|
|||||||
const isMobileWidth = useMediaQuery(theme.breakpoints.down('sm'));
|
const isMobileWidth = useMediaQuery(theme.breakpoints.down('sm'));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{
|
<div style={{
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
left: `calc(50% + ${isMobileWidth ? '0px' : theme.spacing(8 / 2)})`,
|
left: `calc(50% + ${isMobileWidth ? '0px' : theme.spacing(8 / 2)})`,
|
||||||
top: '50%',
|
top: '50%',
|
||||||
@@ -51,7 +50,7 @@ export default function EmptyView({ message, messageExtra }: IProps) {
|
|||||||
{message}
|
{message}
|
||||||
</Typography>
|
</Typography>
|
||||||
{messageExtra}
|
{messageExtra}
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,16 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import CircularProgress from '@mui/material/CircularProgress';
|
import CircularProgress from '@mui/material/CircularProgress';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
const useStyles = makeStyles({
|
||||||
|
loading: {
|
||||||
|
margin: '10px auto',
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
shouldRender?: boolean | (() => boolean)
|
shouldRender?: boolean | (() => boolean)
|
||||||
@@ -22,6 +30,7 @@ export default function LoadingPlaceholder(props: IProps) {
|
|||||||
const {
|
const {
|
||||||
children, shouldRender, component, componentProps,
|
children, shouldRender, component, componentProps,
|
||||||
} = props;
|
} = props;
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
let condition = true;
|
let condition = true;
|
||||||
if (shouldRender !== undefined) {
|
if (shouldRender !== undefined) {
|
||||||
@@ -43,13 +52,8 @@ export default function LoadingPlaceholder(props: IProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{
|
<div className={classes.loading}>
|
||||||
margin: '10px auto',
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<CircularProgress thickness={5} />
|
<CircularProgress thickness={5} />
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ interface IProps {
|
|||||||
|
|
||||||
imgRef?: React.RefObject<HTMLImageElement>
|
imgRef?: React.RefObject<HTMLImageElement>
|
||||||
|
|
||||||
|
spinnerClassName?: string
|
||||||
spinnerStyle?: SxProps<Theme>
|
spinnerStyle?: SxProps<Theme>
|
||||||
|
imgClassName?: string
|
||||||
imgStyle?: CSSProperties
|
imgStyle?: CSSProperties
|
||||||
|
|
||||||
onImageLoad?: () => void
|
onImageLoad?: () => void
|
||||||
@@ -25,7 +27,7 @@ interface IProps {
|
|||||||
|
|
||||||
export default function SpinnerImage(props: IProps) {
|
export default function SpinnerImage(props: IProps) {
|
||||||
const {
|
const {
|
||||||
src, alt, onImageLoad, imgRef, spinnerStyle, imgStyle,
|
src, alt, onImageLoad, imgRef, spinnerClassName, imgClassName, spinnerStyle, imgStyle,
|
||||||
} = props;
|
} = props;
|
||||||
const [imageSrc, setImagsrc] = useState<string>('');
|
const [imageSrc, setImagsrc] = useState<string>('');
|
||||||
|
|
||||||
@@ -51,18 +53,19 @@ export default function SpinnerImage(props: IProps) {
|
|||||||
|
|
||||||
if (imageSrc.length === 0) {
|
if (imageSrc.length === 0) {
|
||||||
return (
|
return (
|
||||||
<Box sx={spinnerStyle}>
|
<Box className={spinnerClassName} sx={spinnerStyle}>
|
||||||
<CircularProgress thickness={5} />
|
<CircularProgress thickness={5} />
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (imageSrc === 'Not Found') {
|
if (imageSrc === 'Not Found') {
|
||||||
return <Box sx={spinnerStyle} />;
|
return <Box className={spinnerClassName} sx={spinnerStyle} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<img
|
<img
|
||||||
|
className={imgClassName}
|
||||||
style={imgStyle}
|
style={imgStyle}
|
||||||
ref={imgRef}
|
ref={imgRef}
|
||||||
src={imageSrc}
|
src={imageSrc}
|
||||||
@@ -72,6 +75,8 @@ export default function SpinnerImage(props: IProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpinnerImage.defaultProps = {
|
SpinnerImage.defaultProps = {
|
||||||
|
spinnerClassName: '',
|
||||||
|
imgClassName: '',
|
||||||
spinnerStyle: {},
|
spinnerStyle: {},
|
||||||
imgStyle: {},
|
imgStyle: {},
|
||||||
onImageLoad: () => {},
|
onImageLoad: () => {},
|
||||||
|
|||||||
@@ -6,13 +6,21 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import Tabs from '@mui/material/Tabs';
|
import Tabs from '@mui/material/Tabs';
|
||||||
import Tab from '@mui/material/Tab';
|
import Tab from '@mui/material/Tab';
|
||||||
import TabPanel from 'components/util/TabPanel';
|
import TabPanel from 'components/util/TabPanel';
|
||||||
import Sources from 'screens/Sources';
|
import Sources from 'screens/Sources';
|
||||||
import Extensions from 'screens/Extensions';
|
import Extensions from 'screens/Extensions';
|
||||||
|
|
||||||
|
const useStyles = makeStyles({
|
||||||
|
noCapitalize: {
|
||||||
|
textTransform: 'none',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default function Browse() {
|
export default function Browse() {
|
||||||
|
const classes = useStyles();
|
||||||
const [tabNum, setTabNum] = useState<number>(0);
|
const [tabNum, setTabNum] = useState<number>(0);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -27,8 +35,8 @@ export default function Browse() {
|
|||||||
scrollButtons
|
scrollButtons
|
||||||
allowScrollButtonsMobile
|
allowScrollButtonsMobile
|
||||||
>
|
>
|
||||||
<Tab sx={{ textTransform: 'none' }} label="Sources" />
|
<Tab className={classes.noCapitalize} label="Sources" />
|
||||||
<Tab sx={{ textTransform: 'none' }} label="Extensions" />
|
<Tab className={classes.noCapitalize} label="Extensions" />
|
||||||
</Tabs>
|
</Tabs>
|
||||||
<TabPanel index={0} currentIndex={tabNum}>
|
<TabPanel index={0} currentIndex={tabNum}>
|
||||||
<Sources />
|
<Sources />
|
||||||
|
|||||||
@@ -18,9 +18,15 @@ import LoadingPlaceholder from 'components/util/LoadingPlaceholder';
|
|||||||
import makeToast from 'components/util/Toast';
|
import makeToast from 'components/util/Toast';
|
||||||
import { Fab } from '@mui/material';
|
import { Fab } from '@mui/material';
|
||||||
import PlayArrow from '@mui/icons-material/PlayArrow';
|
import PlayArrow from '@mui/icons-material/PlayArrow';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
|
||||||
const useStyles = makeStyles((theme: Theme) => ({
|
const useStyles = makeStyles((theme: Theme) => ({
|
||||||
|
root: {
|
||||||
|
[theme.breakpoints.up('md')]: {
|
||||||
|
display: 'flex',
|
||||||
|
},
|
||||||
|
overflow: 'hidden',
|
||||||
|
},
|
||||||
|
|
||||||
chapters: {
|
chapters: {
|
||||||
listStyle: 'none',
|
listStyle: 'none',
|
||||||
padding: 0,
|
padding: 0,
|
||||||
@@ -31,6 +37,12 @@ const useStyles = makeStyles((theme: Theme) => ({
|
|||||||
margin: 0,
|
margin: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
loading: {
|
||||||
|
margin: '10px 0',
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const baseWebsocketUrl = JSON.parse(window.localStorage.getItem('serverBaseURL')!).replace('http', 'ws');
|
const baseWebsocketUrl = JSON.parse(window.localStorage.getItem('serverBaseURL')!).replace('http', 'ws');
|
||||||
@@ -141,7 +153,7 @@ export default function Manga() {
|
|||||||
));
|
));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{ display: { md: 'flex' }, overflow: 'hidden' }}>
|
<div className={classes.root}>
|
||||||
<LoadingPlaceholder
|
<LoadingPlaceholder
|
||||||
shouldRender={manga !== undefined}
|
shouldRender={manga !== undefined}
|
||||||
component={MangaDetails}
|
component={MangaDetails}
|
||||||
@@ -154,7 +166,7 @@ export default function Manga() {
|
|||||||
<Virtuoso
|
<Virtuoso
|
||||||
style={{ // override Virtuoso default values and set them with class
|
style={{ // override Virtuoso default values and set them with class
|
||||||
height: 'undefined',
|
height: 'undefined',
|
||||||
overflowY: window.innerWidth < 900 ? 'visible' : 'auto',
|
overflowY: window.innerWidth < 960 ? 'visible' : 'auto',
|
||||||
}}
|
}}
|
||||||
className={classes.chapters}
|
className={classes.chapters}
|
||||||
totalCount={chapters.length}
|
totalCount={chapters.length}
|
||||||
@@ -165,11 +177,11 @@ export default function Manga() {
|
|||||||
triggerChaptersUpdate={triggerChaptersUpdate}
|
triggerChaptersUpdate={triggerChaptersUpdate}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
useWindowScroll={window.innerWidth < 900}
|
useWindowScroll={window.innerWidth < 960}
|
||||||
overscan={window.innerHeight * 0.5}
|
overscan={window.innerHeight * 0.5}
|
||||||
/>
|
/>
|
||||||
</LoadingPlaceholder>
|
</LoadingPlaceholder>
|
||||||
<ResumeFab />
|
<ResumeFab />
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import CircularProgress from '@mui/material/CircularProgress';
|
import CircularProgress from '@mui/material/CircularProgress';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState } from 'react';
|
||||||
import { useHistory, useParams } from 'react-router-dom';
|
import { useHistory, useParams } from 'react-router-dom';
|
||||||
import HorizontalPager from 'components/reader/pager/HorizontalPager';
|
import HorizontalPager from 'components/reader/pager/HorizontalPager';
|
||||||
@@ -18,7 +19,18 @@ import NavbarContext from 'components/context/NavbarContext';
|
|||||||
import client from 'util/client';
|
import client from 'util/client';
|
||||||
import useLocalStorage from 'util/useLocalStorage';
|
import useLocalStorage from 'util/useLocalStorage';
|
||||||
import cloneObject from 'util/cloneObject';
|
import cloneObject from 'util/cloneObject';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
const useStyles = (settings: IReaderSettings) => makeStyles({
|
||||||
|
root: {
|
||||||
|
width: settings.staticNav ? 'calc(100vw - 300px)' : '100vw',
|
||||||
|
},
|
||||||
|
|
||||||
|
loading: {
|
||||||
|
margin: '50px auto',
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const getReaderComponent = (readerType: ReaderType) => {
|
const getReaderComponent = (readerType: ReaderType) => {
|
||||||
switch (readerType) {
|
switch (readerType) {
|
||||||
@@ -51,6 +63,7 @@ const initialChapter = () => ({ pageCount: -1, index: -1, chapterCount: 0 });
|
|||||||
export default function Reader() {
|
export default function Reader() {
|
||||||
const [settings, setSettings] = useLocalStorage<IReaderSettings>('readerSettings', defaultReaderSettings);
|
const [settings, setSettings] = useLocalStorage<IReaderSettings>('readerSettings', defaultReaderSettings);
|
||||||
|
|
||||||
|
const classes = useStyles(settings)();
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
|
|
||||||
const [serverAddress] = useLocalStorage<String>('serverBaseURL', '');
|
const [serverAddress] = useLocalStorage<String>('serverBaseURL', '');
|
||||||
@@ -136,12 +149,9 @@ export default function Reader() {
|
|||||||
// return spinner while chpater data is loading
|
// return spinner while chpater data is loading
|
||||||
if (chapter.pageCount === -1) {
|
if (chapter.pageCount === -1) {
|
||||||
return (
|
return (
|
||||||
<Box sx={{
|
<div className={classes.loading}>
|
||||||
height: '100vh', width: '100vw', display: 'grid', placeItems: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<CircularProgress thickness={5} />
|
<CircularProgress thickness={5} />
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +180,7 @@ export default function Reader() {
|
|||||||
const ReaderComponent = getReaderComponent(settings.readerType);
|
const ReaderComponent = getReaderComponent(settings.readerType);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box sx={{ width: settings.staticNav ? 'calc(100vw - 300px)' : '100vw' }}>
|
<div className={classes.root}>
|
||||||
<PageNumber
|
<PageNumber
|
||||||
settings={settings}
|
settings={settings}
|
||||||
curPage={curPage}
|
curPage={curPage}
|
||||||
@@ -187,6 +197,6 @@ export default function Reader() {
|
|||||||
nextChapter={nextChapter}
|
nextChapter={nextChapter}
|
||||||
prevChapter={prevChapter}
|
prevChapter={prevChapter}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,19 +6,33 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState } from 'react';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import TextField from '@mui/material/TextField';
|
import TextField from '@mui/material/TextField';
|
||||||
import Button from '@mui/material/Button';
|
import Button from '@mui/material/Button';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
import MangaGrid from 'components/MangaGrid';
|
import MangaGrid from 'components/MangaGrid';
|
||||||
import NavbarContext from 'components/context/NavbarContext';
|
import NavbarContext from 'components/context/NavbarContext';
|
||||||
import client from 'util/client';
|
import client from 'util/client';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
root: {
|
||||||
|
margin: '20px 10px',
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'space-around',
|
||||||
|
width: '300px',
|
||||||
|
TextField: {
|
||||||
|
margin: theme.spacing(1),
|
||||||
|
width: '25ch',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
export default function SearchSingle() {
|
export default function SearchSingle() {
|
||||||
const { setTitle, setAction } = useContext(NavbarContext);
|
const { setTitle, setAction } = useContext(NavbarContext);
|
||||||
useEffect(() => { setTitle('Search'); setAction(<></>); }, []);
|
useEffect(() => { setTitle('Search'); setAction(<></>); }, []);
|
||||||
|
|
||||||
const { sourceId } = useParams<{ sourceId: string }>();
|
const { sourceId } = useParams<{ sourceId: string }>();
|
||||||
|
const classes = useStyles();
|
||||||
const [error, setError] = useState<boolean>(false);
|
const [error, setError] = useState<boolean>(false);
|
||||||
const [mangas, setMangas] = useState<IMangaCard[]>([]);
|
const [mangas, setMangas] = useState<IMangaCard[]>([]);
|
||||||
const [message, setMessage] = useState<string>('');
|
const [message, setMessage] = useState<string>('');
|
||||||
@@ -75,20 +89,10 @@ export default function SearchSingle() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Box sx={{
|
<div className={classes.root}>
|
||||||
margin: '20px 10px',
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'space-around',
|
|
||||||
width: '300px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TextField
|
<TextField
|
||||||
inputRef={textInput}
|
inputRef={textInput}
|
||||||
error={error}
|
error={error}
|
||||||
sx={{
|
|
||||||
m: 1,
|
|
||||||
width: '25ch',
|
|
||||||
}}
|
|
||||||
id="filled-basic"
|
id="filled-basic"
|
||||||
variant="filled"
|
variant="filled"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -98,7 +102,7 @@ export default function SearchSingle() {
|
|||||||
<Button variant="contained" color="primary" onClick={() => processInput()}>
|
<Button variant="contained" color="primary" onClick={() => processInput()}>
|
||||||
Search
|
Search
|
||||||
</Button>
|
</Button>
|
||||||
</Box>
|
</div>
|
||||||
{searchTerm.length > 0
|
{searchTerm.length > 0
|
||||||
&& (
|
&& (
|
||||||
<MangaGrid
|
<MangaGrid
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ export default function Settings() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<List sx={{ padding: 0 }}>
|
<List style={{ padding: 0 }}>
|
||||||
<ListItemLink href="/settings/categories">
|
<ListItemLink href="/settings/categories">
|
||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
<ListAltIcon />
|
<ListAltIcon />
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ export default function SourceConfigure() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<List sx={{ padding: 0 }}>
|
<List style={{ padding: 0 }}>
|
||||||
{sourcePreferences.map(
|
{sourcePreferences.map(
|
||||||
(it, index) => {
|
(it, index) => {
|
||||||
const props = cloneObject(it.props);
|
const props = cloneObject(it.props);
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import client from 'util/client';
|
|||||||
import useLocalStorage from 'util/useLocalStorage';
|
import useLocalStorage from 'util/useLocalStorage';
|
||||||
import EmptyView from 'components/util/EmptyView';
|
import EmptyView from 'components/util/EmptyView';
|
||||||
import LoadingPlaceholder from 'components/util/LoadingPlaceholder';
|
import LoadingPlaceholder from 'components/util/LoadingPlaceholder';
|
||||||
import { Box } from '@mui/system';
|
|
||||||
|
|
||||||
function epochToDate(epoch: number) {
|
function epochToDate(epoch: number) {
|
||||||
const date = new Date(0); // The 0 there is the key, which sets the date to the epoch
|
const date = new Date(0); // The 0 there is the key, which sets the date to the epoch
|
||||||
@@ -190,7 +189,7 @@ export default function Updates() {
|
|||||||
padding: 2,
|
padding: 2,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box sx={{ display: 'flex' }}>
|
<div style={{ display: 'flex' }}>
|
||||||
<Avatar
|
<Avatar
|
||||||
variant="rounded"
|
variant="rounded"
|
||||||
sx={{
|
sx={{
|
||||||
@@ -202,7 +201,7 @@ export default function Updates() {
|
|||||||
}}
|
}}
|
||||||
src={`${serverAddress}${manga.thumbnailUrl}?useCache=${useCache}`}
|
src={`${serverAddress}${manga.thumbnailUrl}?useCache=${useCache}`}
|
||||||
/>
|
/>
|
||||||
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
|
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
||||||
<Typography variant="h5" component="h2">
|
<Typography variant="h5" component="h2">
|
||||||
{manga.title}
|
{manga.title}
|
||||||
</Typography>
|
</Typography>
|
||||||
@@ -210,8 +209,8 @@ export default function Updates() {
|
|||||||
{chapter.name}
|
{chapter.name}
|
||||||
{downloadStatusStringFor(chapter)}
|
{downloadStatusStringFor(chapter)}
|
||||||
</Typography>
|
</Typography>
|
||||||
</Box>
|
</div>
|
||||||
</Box>
|
</div>
|
||||||
{downloadStatusStringFor(chapter) === ''
|
{downloadStatusStringFor(chapter) === ''
|
||||||
&& (
|
&& (
|
||||||
<IconButton
|
<IconButton
|
||||||
|
|||||||
@@ -1,15 +1,26 @@
|
|||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState } from 'react';
|
||||||
import { CircularProgress } from '@mui/material';
|
import { CircularProgress } from '@mui/material';
|
||||||
|
import makeStyles from '@mui/styles/makeStyles';
|
||||||
import List from '@mui/material/List';
|
import List from '@mui/material/List';
|
||||||
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 { Box } from '@mui/system';
|
import client from '../../util/client';
|
||||||
import client from 'util/client';
|
import ListItemLink from '../../components/util/ListItemLink';
|
||||||
import ListItemLink from 'components/util/ListItemLink';
|
import NavbarContext from '../../components/context/NavbarContext';
|
||||||
import NavbarContext from 'components/context/NavbarContext';
|
|
||||||
|
const useStyles = makeStyles({
|
||||||
|
loading: {
|
||||||
|
width: '100vw',
|
||||||
|
'& div': {
|
||||||
|
margin: '50px auto',
|
||||||
|
display: 'block',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default function About() {
|
export default function About() {
|
||||||
const { setTitle, setAction } = useContext(NavbarContext);
|
const { setTitle, setAction } = useContext(NavbarContext);
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
const [about, setAbout] = useState<IAbout>();
|
const [about, setAbout] = useState<IAbout>();
|
||||||
|
|
||||||
@@ -25,12 +36,9 @@ export default function About() {
|
|||||||
|
|
||||||
if (about === undefined) {
|
if (about === undefined) {
|
||||||
return (
|
return (
|
||||||
<Box sx={{
|
<div className={classes.loading}>
|
||||||
height: 'calc(100vh - 128px)', display: 'grid', placeItems: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<CircularProgress thickness={5} />
|
<CircularProgress thickness={5} />
|
||||||
</Box>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ export default function Backup() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<List sx={{ padding: 0 }}>
|
<List style={{ padding: 0 }}>
|
||||||
<ListItemLink href={`${baseURL}/api/v1/backup/export/file`}>
|
<ListItemLink href={`${baseURL}/api/v1/backup/export/file`}>
|
||||||
<ListItemText
|
<ListItemText
|
||||||
primary="Create Backup"
|
primary="Create Backup"
|
||||||
|
|||||||
Reference in New Issue
Block a user