From c15ee7ab66ee76cd5cb47f418829e67407c47b1c Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Sun, 31 Oct 2021 21:02:45 +0330 Subject: [PATCH] refactor MangaCard --- src/components/MangaCard.tsx | 154 +++++++++++++-------------- src/components/util/SpinnerImage.tsx | 18 +++- 2 files changed, 88 insertions(+), 84 deletions(-) diff --git a/src/components/MangaCard.tsx b/src/components/MangaCard.tsx index bdf47745..b7e4bbf1 100644 --- a/src/components/MangaCard.tsx +++ b/src/components/MangaCard.tsx @@ -6,7 +6,6 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import React from 'react'; -import makeStyles from '@mui/styles/makeStyles'; import Card from '@mui/material/Card'; import CardActionArea from '@mui/material/CardActionArea'; import Typography from '@mui/material/Typography'; @@ -14,63 +13,43 @@ import { Link } from 'react-router-dom'; import { Grid } from '@mui/material'; import useLocalStorage from 'util/useLocalStorage'; import SpinnerImage from 'components/util/SpinnerImage'; +import { styled } from '@mui/system'; -const useStyles = makeStyles((theme) => ({ - root: { - display: 'flex', - // Preserve the shape of the manga cards, without this the manga card would chage it's - // if all the images in a row failed to load then the whole row would change into a - // square shape - aspectRatio: '225/350', - }, - wrapper: { - position: 'relative', - height: '100%', - }, - gradient: { - position: 'absolute', - bottom: 0, - width: '100%', - height: '30%', - background: 'linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%)', - opacity: 1, - }, - gradient2: { - position: 'absolute', - bottom: 0, - width: '100%', - height: '20%', - background: 'linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%)', - }, - title: { - position: 'absolute', - bottom: 0, - padding: '0.5em', - color: 'white', - fontSize: '1.05rem', - textShadow: '0px 0px 3px #000000', - }, - badge: { - position: 'absolute', - top: 2, - left: 2, - backgroundColor: theme.palette.primary.dark, - borderRadius: 5, - color: 'white', - padding: '0.1em', - paddingInline: '0.3em', - fontSize: '1.05rem', - }, - image: { - height: '100%', - width: '100%', - }, +const BottomGradient = styled('div')({ + position: 'absolute', + bottom: 0, + width: '100%', + height: '30%', + background: 'linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%)', +}); - spinner: { - minHeight: '400px', - display: 'grid', - placeItems: 'center', - }, +const BottomGradientDoubledDown = styled('div')({ + position: 'absolute', + bottom: 0, + width: '100%', + height: '20%', + background: 'linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%)', +}); + +const MangaTitle = styled(Typography)({ + position: 'absolute', + bottom: 0, + padding: '0.5em', + color: 'white', + fontSize: '1.05rem', + textShadow: '0px 0px 3px #000000', +}); + +const UnreadBadge = styled(Typography)(({ theme }) => ({ + position: 'absolute', + top: 2, + left: 2, + backgroundColor: theme.palette.primary.dark, + borderRadius: '5px', + color: 'white', + padding: '0.1em', + paddingInline: '0.3em', + fontSize: '1.05rem', })); const truncateText = (str: string, maxLength: number) => { @@ -93,35 +72,52 @@ const MangaCard = React.forwardRef((props: IProps, ref) id, title, thumbnailUrl, unreadCount: unread, }, } = props; - const classes = useStyles(); + const [serverAddress] = useLocalStorage('serverBaseURL', ''); const [useCache] = useLocalStorage('useCache', true); return ( - - -
- {unread - ? ( - - {unread} - - ) - : null} - -
-
- - {truncateText(title, 61)} - -
+ + + {unread! > 0 + && ( + + {unread} + + ) } + + + + + + {truncateText(title, 61)} + diff --git a/src/components/util/SpinnerImage.tsx b/src/components/util/SpinnerImage.tsx index 05d66a56..91f64b9d 100644 --- a/src/components/util/SpinnerImage.tsx +++ b/src/components/util/SpinnerImage.tsx @@ -5,8 +5,11 @@ * 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 React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, CSSProperties } from 'react'; import CircularProgress from '@mui/material/CircularProgress'; +import Box from '@mui/system/Box'; +import { Theme } from '@mui/system/createTheme'; +import { SxProps } from '@mui/system/styleFunctionSx'; interface IProps { src: string @@ -15,14 +18,16 @@ interface IProps { imgRef?: React.RefObject spinnerClassName?: string + spinnerStyle?: SxProps imgClassName?: string + imgStyle?: CSSProperties onImageLoad?: () => void } export default function SpinnerImage(props: IProps) { const { - src, alt, onImageLoad, imgRef, spinnerClassName, imgClassName, + src, alt, onImageLoad, imgRef, spinnerClassName, imgClassName, spinnerStyle, imgStyle, } = props; const [imageSrc, setImagsrc] = useState(''); @@ -48,19 +53,20 @@ export default function SpinnerImage(props: IProps) { if (imageSrc.length === 0) { return ( -
+ -
+ ); } if (imageSrc === 'Not Found') { - return
; + return ; } return ( {alt} {}, imgRef: undefined, };