mirror of
https://github.com/0rangebananaspy/authelia.git
synced 2024-09-14 22:47:21 +07:00
53 lines
1.7 KiB
TypeScript
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;
|