You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
import type { PropsWithChildren } from 'react'; |
|
import { useCallback, useState } from 'react'; |
|
|
|
import { defineMessages, useIntl } from 'react-intl'; |
|
|
|
import { ReactComponent as CloseIcon } from '@material-symbols/svg-600/outlined/close.svg'; |
|
|
|
import { bannerSettings } from 'mastodon/settings'; |
|
|
|
import { IconButton } from './icon_button'; |
|
|
|
const messages = defineMessages({ |
|
dismiss: { id: 'dismissable_banner.dismiss', defaultMessage: 'Dismiss' }, |
|
}); |
|
|
|
interface Props { |
|
id: string; |
|
} |
|
|
|
export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({ |
|
id, |
|
children, |
|
}) => { |
|
const [visible, setVisible] = useState(!bannerSettings.get(id)); |
|
const intl = useIntl(); |
|
|
|
const handleDismiss = useCallback(() => { |
|
setVisible(false); |
|
bannerSettings.set(id, true); |
|
}, [id]); |
|
|
|
if (!visible) { |
|
return null; |
|
} |
|
|
|
return ( |
|
<div className='dismissable-banner'> |
|
<div className='dismissable-banner__action'> |
|
<IconButton |
|
icon='times' |
|
iconComponent={CloseIcon} |
|
title={intl.formatMessage(messages.dismiss)} |
|
onClick={handleDismiss} |
|
/> |
|
</div> |
|
|
|
<div className='dismissable-banner__message'>{children}</div> |
|
</div> |
|
); |
|
};
|
|
|