import React, { useCallback } from 'react'; import { Alert } from 'reactstrap'; import without from 'lodash/without'; import concat from 'lodash/concat'; import { alertService, AlertInfoEx, kAlertHostId, AlertInfo, } from './alert-service'; interface AutoCloseAlertProps { alert: AlertInfo; close: () => void; } export const AutoCloseAlert: React.FC = (props) => { const { alert } = props; React.useEffect(() => { const tag = window.setTimeout(props.close, 5000); return () => window.clearTimeout(tag); }, [props.close]); return ( {alert.message} ); }; // oh what a bad name! interface AlertInfoExEx extends AlertInfoEx { close: () => void; } export const AlertHost: React.FC = () => { const [alerts, setAlerts] = React.useState([]); // react guarantee that state setters are stable, so we don't need to add it to dependency list const consume = useCallback((alert: AlertInfoEx): void => { const alertEx: AlertInfoExEx = { ...alert, close: () => { setAlerts((oldAlerts) => { return without(oldAlerts, alertEx); }); }, }; setAlerts((oldAlerts) => { return concat(oldAlerts, alertEx); }); }, []); React.useEffect(() => { alertService.registerConsumer(consume); return () => { alertService.unregisterConsumer(consume); }; }, [consume]); return (
{alerts.map((alert) => { return ( ); })}
); }; export default AlertHost;