dismissable_banner.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import React from 'react';
  2. import IconButton from './icon_button';
  3. import PropTypes from 'prop-types';
  4. import { injectIntl, defineMessages } from 'react-intl';
  5. import { bannerSettings } from 'mastodon/settings';
  6. const messages = defineMessages({
  7. dismiss: { id: 'dismissable_banner.dismiss', defaultMessage: 'Dismiss' },
  8. });
  9. export default @injectIntl
  10. class DismissableBanner extends React.PureComponent {
  11. static propTypes = {
  12. id: PropTypes.string.isRequired,
  13. children: PropTypes.node,
  14. intl: PropTypes.object.isRequired,
  15. };
  16. state = {
  17. visible: !bannerSettings.get(this.props.id),
  18. };
  19. handleDismiss = () => {
  20. const { id } = this.props;
  21. this.setState({ visible: false }, () => bannerSettings.set(id, true));
  22. }
  23. render () {
  24. const { visible } = this.state;
  25. if (!visible) {
  26. return null;
  27. }
  28. const { children, intl } = this.props;
  29. return (
  30. <div className='dismissable-banner'>
  31. <div className='dismissable-banner__message'>
  32. {children}
  33. </div>
  34. <div className='dismissable-banner__action'>
  35. <IconButton icon='times' title={intl.formatMessage(messages.dismiss)} onClick={this.handleDismiss} />
  36. </div>
  37. </div>
  38. );
  39. }
  40. }