1
0
mirror of https://github.com/0rangebananaspy/authelia.git synced 2024-09-14 22:47:21 +07:00
authelia/web/src/components/NotificationBar.tsx

53 lines
1.7 KiB
TypeScript

import React, { useState, useEffect } from "react";
import { Alert, Slide, SlideProps, Snackbar } from "@mui/material";
import { useNotifications } from "@hooks/NotificationsContext";
import { Notification } from "@models/Notifications";
export interface Props {
onClose: () => void;
}
type NotificationBarTransitionProps = Omit<SlideProps, "direction">;
function NotificationBarTransition(props: NotificationBarTransitionProps) {
return <Slide {...props} direction={"left"} />;
}
const NotificationBar = function (props: Props) {
const [tmpNotification, setTmpNotification] = useState(null as Notification | null);
const { notification } = useNotifications();
useEffect(() => {
if (notification) {
setTmpNotification(notification);
}
}, [notification, setTmpNotification]);
const shouldSnackbarBeOpen = notification !== undefined && notification !== null;
return (
<Snackbar
open={shouldSnackbarBeOpen}
anchorOrigin={{ vertical: "top", horizontal: "right" }}
autoHideDuration={tmpNotification ? tmpNotification.timeout * 1000 : 10000}
onClose={props.onClose}
TransitionComponent={NotificationBarTransition}
TransitionProps={{
onExited: () => setTmpNotification(null),
}}
>
{tmpNotification ? (
<Alert severity={tmpNotification.level} variant={"filled"} elevation={6} className={"notification"}>
{tmpNotification.message}
</Alert>
) : (
<Alert severity={"success"} elevation={6} variant={"filled"} className={"notification"} />
)}
</Snackbar>
);
};
export default NotificationBar;