import classNames from 'classnames' import { useCallback, useEffect, useState } from 'react' import { CheckGreenIcon } from 'lib/icons/CheckGreen.js' import { CloseWhiteIcon } from 'lib/icons/CloseWhite.js' import { ExclamationCircleIcon } from 'lib/icons/ExclamationCircle.js' export type SnackbarVariant = 'success' | 'error' export interface SnackbarProps { message: string variant: SnackbarVariant visible: boolean onClose?: () => void action?: { label: string onClick: () => void } autoDismiss?: boolean dismissAfterMs?: number disableCloseButton?: boolean automaticVisibility?: boolean } export function Snackbar({ message, variant, visible, action, autoDismiss = false, dismissAfterMs = 5000, disableCloseButton = false, automaticVisibility = false, onClose = () => {}, }: SnackbarProps): JSX.Element { const [hidden, setHidden] = useState(visible) useEffect(() => { setHidden(!visible) }, [visible, setHidden]) const { label: actionLabel, onClick: handleActionClick } = action ?? {} const handleClose = useCallback(() => { setHidden(true) onClose() }, [onClose, setHidden]) useEffect(() => { if (!autoDismiss) { return () => {} } const timeout = globalThis.setTimeout(() => { handleClose() }, dismissAfterMs) return () => { globalThis.clearTimeout(timeout) } }, [autoDismiss, dismissAfterMs, handleClose]) return (

{message}

{action != null && ( )} {!disableCloseButton && ( )}
) } function SnackbarIcon(props: { variant: SnackbarVariant }): JSX.Element { switch (props.variant) { case 'success': return case 'error': return } }