import { useState, useEffect } from 'react'; import { useIntl } from 'react-intl'; import type { IntlShape } from 'react-intl'; import classNames from 'classnames'; import { dismissAlert } from 'mastodon/actions/alerts'; import type { Alert, TranslatableString, TranslatableValues, } from 'mastodon/models/alert'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; const formatIfNeeded = ( intl: IntlShape, message: TranslatableString, values?: TranslatableValues, ) => { if (typeof message === 'object') { return intl.formatMessage(message, values); } return message; }; const Alert: React.FC<{ alert: Alert; dismissAfter: number; }> = ({ alert: { key, title, message, values, action, onClick }, dismissAfter, }) => { const dispatch = useAppDispatch(); const intl = useIntl(); const [active, setActive] = useState(false); useEffect(() => { const setActiveTimeout = setTimeout(() => { setActive(true); }, 1); return () => { clearTimeout(setActiveTimeout); }; }, []); useEffect(() => { const dismissTimeout = setTimeout(() => { setActive(false); // Allow CSS transition to finish before removing from the DOM setTimeout(() => { dispatch(dismissAlert({ key })); }, 500); }, dismissAfter); return () => { clearTimeout(dismissTimeout); }; }, [dispatch, setActive, key, dismissAfter]); return (