diff --git a/webUI/react/package.json b/webUI/react/package.json index 11d19f8a..4df7ce3b 100644 --- a/webUI/react/package.json +++ b/webUI/react/package.json @@ -6,6 +6,7 @@ "@fontsource/roboto": "^4.3.0", "@material-ui/core": "^4.11.4", "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.58", "axios": "^0.21.1", "file-selector": "^0.2.4", "react": "^17.0.2", diff --git a/webUI/react/src/components/Toast.tsx b/webUI/react/src/components/Toast.tsx new file mode 100644 index 00000000..9946753c --- /dev/null +++ b/webUI/react/src/components/Toast.tsx @@ -0,0 +1,62 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import ReactDOM from 'react-dom'; +import React from 'react'; +import Slide, { SlideProps } from '@material-ui/core/Slide'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert, { AlertProps, Color as Severity } from '@material-ui/lab/Alert'; + +function removeToast(id: string) { + const container = document.querySelector(`#${id}`)!!; + ReactDOM.unmountComponentAtNode(container); + document.body.removeChild(container); +} + +function Transition(props: SlideProps) { + // eslint-disable-next-line react/jsx-props-no-spreading + return ; +} + +function Alert(props: AlertProps) { + // eslint-disable-next-line react/jsx-props-no-spreading + return ; +} + +interface IToastProps{ + message: string + severity: Severity +} + +function Toast(props: IToastProps) { + const { message, severity } = props; + const [open, setOpen] = React.useState(true); + + const handleClose = () => { + setOpen(false); + }; + + return ( + + + {message} + + + ); +} + +export default function makeToast(message: string, severity: Severity) { + const id = Math.floor(Math.random() * 1000); + const container = document.createElement('div'); + container.id = `alert-${id}`; + + document.body.appendChild(container); + + ReactDOM.render(, container); + + setTimeout(() => removeToast(container.id), 3500); +} diff --git a/webUI/react/src/screens/Manga.tsx b/webUI/react/src/screens/Manga.tsx index e2f05c26..b6959d47 100644 --- a/webUI/react/src/screens/Manga.tsx +++ b/webUI/react/src/screens/Manga.tsx @@ -15,6 +15,7 @@ import MangaDetails from '../components/MangaDetails'; import NavbarContext from '../context/NavbarContext'; import client from '../util/client'; import LoadingPlaceholder from '../components/LoadingPlaceholder'; +import makeToast from '../components/Toast'; const useStyles = makeStyles((theme: Theme) => ({ root: { @@ -77,12 +78,17 @@ export default function Manga() { }, [manga]); useEffect(() => { - const shouldFetchOnline = chapters.length > 0 && chapterUpdateTriggerer === 0; + const shouldFetchOnline = fetchedChapters && chapterUpdateTriggerer === 0; client.get(`/api/v1/manga/${id}/chapters?onlineFetch=${shouldFetchOnline}`) .then((response) => response.data) - .then((data) => setChapters(data)) + .then((data) => { + if (data.length === 0 && fetchedChapters) { + makeToast('No chapters found', 'warning'); + } + setChapters(data); + }) .then(() => setFetchedChapters(true)); - }, [chapters.length, chapterUpdateTriggerer]); + }, [chapters.length, fetchedChapters, chapterUpdateTriggerer]); // const itemContent = (index:any) => ; const itemContent = (index:any) => ( diff --git a/webUI/react/yarn.lock b/webUI/react/yarn.lock index 2cb20bc5..330526df 100644 --- a/webUI/react/yarn.lock +++ b/webUI/react/yarn.lock @@ -1487,6 +1487,17 @@ dependencies: "@babel/runtime" "^7.4.4" +"@material-ui/lab@^4.0.0-alpha.58": + version "4.0.0-alpha.58" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.58.tgz#c7ebb66f49863c5acbb20817163737caa299fafc" + integrity sha512-GKHlJqLxUeHH3L3dGQ48ZavYrqGOTXkFkiEiuYMAnAvXAZP4rhMIqeHOPXSUQan4Bd8QnafDcpovOSLnadDmKw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + "@material-ui/styles@^4.11.4": version "4.11.4" resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d"