keycloak-scim/src/components/alert/Alerts.tsx

63 lines
1.7 KiB
TypeScript
Raw Normal View History

import React, {
useState,
createContext,
ReactNode,
useContext,
useEffect,
} from "react";
import { AlertType, AlertPanel } from "./AlertPanel";
import { AlertVariant } from "@patternfly/react-core";
2020-08-07 13:44:34 +00:00
type AlertProps = {
addAlert: (message: string, variant?: AlertVariant) => void;
};
export const AlertContext = createContext<AlertProps>({
addAlert: () => {},
});
export const useAlerts = () => useContext(AlertContext);
type TimeOut = {
key: number;
timeOut: NodeJS.Timeout;
};
export const AlertProvider = ({ children }: { children: ReactNode }) => {
2020-08-08 13:52:23 +00:00
const [alerts, setAlerts] = useState<AlertType[]>([]);
const [timers, setTimers] = useState<TimeOut[]>([]);
useEffect(() => {
const timersKeys = timers.map((timer) => timer.key);
const timeOuts = alerts
.filter((alert) => !timersKeys.includes(alert.key))
.map((alert) => {
const timeOut = setTimeout(() => hideAlert(alert.key), 8000);
return { key: alert.key, timeOut };
});
setTimers([...timers, ...timeOuts]);
return () => timers.forEach((timer) => clearTimeout(timer.timeOut));
}, [alerts]);
2020-08-07 13:44:34 +00:00
const createId = () => new Date().getTime();
const hideAlert = (key: number) => {
2020-08-08 13:52:23 +00:00
setAlerts((alerts) => [...alerts.filter((el) => el.key !== key)]);
setTimers((timers) => [...timers.filter((timer) => timer.key === key)]);
2020-08-07 13:44:34 +00:00
};
const addAlert = (
message: string,
variant: AlertVariant = AlertVariant.default
) => {
setAlerts([...alerts, { key: createId(), message, variant }]);
2020-08-07 13:44:34 +00:00
};
return (
<AlertContext.Provider value={{ addAlert }}>
<AlertPanel alerts={alerts} onCloseAlert={hideAlert} />
{children}
</AlertContext.Provider>
);
};