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"