Skip to content

Commit 7fa500e

Browse files
committed
492: Add global alert banner
1 parent 30fd3bd commit 7fa500e

File tree

5 files changed

+84
-1
lines changed

5 files changed

+84
-1
lines changed

src/client/src/App.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import useToken from './pages/Login/useToken';
1919
import Box from "@material-ui/core/Box";
2020
import {RFM} from "./pages/RFM/RFM";
2121
import UserManagement from './pages/UserManagement/UserManagement';
22+
import AlertBanner from './components/AlertBanner';
2223

2324
let jwt = require('jsonwebtoken');
2425

@@ -94,6 +95,9 @@ function AuthenticatedApp() {
9495
return (
9596
<Router>
9697

98+
<Box>
99+
<AlertBanner />
100+
</Box>
97101
<Box pb={4}>
98102
{!jwtExpired ? <Header headerType={headerType}/> : <Header headerType={'Login'}/>}
99103
</Box>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React from "react";
2+
3+
import { Alert } from "@material-ui/lab";
4+
import useAlert from "../hooks/useAlert";
5+
6+
const AlertBanner = () => {
7+
const { text, type, setAlert } = useAlert();
8+
9+
if (text && type) {
10+
return (
11+
<Alert
12+
onClose={() => setAlert(null)}
13+
severity={type}
14+
sx={{
15+
position: "absolute",
16+
zIndex: 10,
17+
}}
18+
>
19+
{text}
20+
</Alert>
21+
);
22+
} else {
23+
return <></>;
24+
}
25+
};
26+
27+
export default AlertBanner;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import React from 'react';
2+
3+
const ALERT_TIME = 5000;
4+
const initialState = {
5+
text: "",
6+
type: "",
7+
};
8+
9+
const AlertContext = React.createContext({
10+
...initialState,
11+
setAlert: () => {},
12+
});
13+
14+
export const AlertProvider = ({ children }) => {
15+
const [text, setText] = React.useState("");
16+
const [type, setType] = React.useState("");
17+
18+
const setAlert = (text, type) => {
19+
setText(text);
20+
setType(type);
21+
22+
if (type !== "error") {
23+
setTimeout(() => {
24+
setText("");
25+
setType("");
26+
}, ALERT_TIME);
27+
}
28+
};
29+
30+
return (
31+
<AlertContext.Provider
32+
value={{
33+
text,
34+
type,
35+
setAlert,
36+
}}
37+
>
38+
{children}
39+
</AlertContext.Provider>
40+
);
41+
};
42+
43+
export default AlertContext;

src/client/src/hooks/useAlert.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { useContext } from "react";
2+
import AlertContext from "../contexts/AlertContext";
3+
4+
const useAlert = () => useContext(AlertContext);
5+
6+
export default useAlert;

src/client/src/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import { ThemeProvider } from '@material-ui/core/styles';
55
import * as serviceWorker from './serviceWorker';
66
import "./assets/font/font.css";
77
import defaultTheme from './theme/defaultTheme';
8+
import { AlertProvider } from './contexts/AlertContext';
89

910

1011
ReactDOM.render(
1112
<React.StrictMode>
1213
<ThemeProvider theme={defaultTheme}>
13-
<App/>
14+
<AlertProvider>
15+
<App/>
16+
</AlertProvider>
1417
</ThemeProvider>
1518
</React.StrictMode>,
1619
document.getElementById('root')

0 commit comments

Comments
 (0)