Convert <DismissableBanner> to Typescript (#25582)
				
					
				
			This commit is contained in:
		
							parent
							
								
									20e85c0e83
								
							
						
					
					
						commit
						4534498a8e
					
				
					 9 changed files with 54 additions and 62 deletions
				
			
		| 
						 | 
				
			
			@ -1,55 +0,0 @@
 | 
			
		|||
import PropTypes from 'prop-types';
 | 
			
		||||
import { PureComponent } from 'react';
 | 
			
		||||
 | 
			
		||||
import { injectIntl, defineMessages } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
import { bannerSettings } from 'mastodon/settings';
 | 
			
		||||
 | 
			
		||||
import { IconButton } from './icon_button';
 | 
			
		||||
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  dismiss: { id: 'dismissable_banner.dismiss', defaultMessage: 'Dismiss' },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
class DismissableBanner extends PureComponent {
 | 
			
		||||
 | 
			
		||||
  static propTypes = {
 | 
			
		||||
    id: PropTypes.string.isRequired,
 | 
			
		||||
    children: PropTypes.node,
 | 
			
		||||
    intl: PropTypes.object.isRequired,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  state = {
 | 
			
		||||
    visible: !bannerSettings.get(this.props.id),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  handleDismiss = () => {
 | 
			
		||||
    const { id } = this.props;
 | 
			
		||||
    this.setState({ visible: false }, () => bannerSettings.set(id, true));
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  render () {
 | 
			
		||||
    const { visible } = this.state;
 | 
			
		||||
 | 
			
		||||
    if (!visible) {
 | 
			
		||||
      return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const { children, intl } = this.props;
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className='dismissable-banner'>
 | 
			
		||||
        <div className='dismissable-banner__message'>
 | 
			
		||||
          {children}
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div className='dismissable-banner__action'>
 | 
			
		||||
          <IconButton icon='times' title={intl.formatMessage(messages.dismiss)} onClick={this.handleDismiss} />
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default injectIntl(DismissableBanner);
 | 
			
		||||
							
								
								
									
										47
									
								
								app/javascript/mastodon/components/dismissable_banner.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								app/javascript/mastodon/components/dismissable_banner.tsx
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
import type { PropsWithChildren } from 'react';
 | 
			
		||||
import { useCallback, useState } from 'react';
 | 
			
		||||
 | 
			
		||||
import { defineMessages, useIntl } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
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__message'>{children}</div>
 | 
			
		||||
 | 
			
		||||
      <div className='dismissable-banner__action'>
 | 
			
		||||
        <IconButton
 | 
			
		||||
          icon='times'
 | 
			
		||||
          title={intl.formatMessage(messages.dismiss)}
 | 
			
		||||
          onClick={handleDismiss}
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ import { Helmet } from 'react-helmet';
 | 
			
		|||
 | 
			
		||||
import { connect } from 'react-redux';
 | 
			
		||||
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { domain } from 'mastodon/initial_state';
 | 
			
		||||
 | 
			
		||||
import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		|||
import { connect } from 'react-redux';
 | 
			
		||||
 | 
			
		||||
import { fetchTrendingLinks } from 'mastodon/actions/trends';
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
 | 
			
		||||
 | 
			
		||||
import Story from './components/story';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ import { connect } from 'react-redux';
 | 
			
		|||
import { debounce } from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { fetchTrendingStatuses, expandTrendingStatuses } from 'mastodon/actions/trends';
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import StatusList from 'mastodon/components/status_list';
 | 
			
		||||
import { getStatusList } from 'mastodon/selectors';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		|||
import { connect } from 'react-redux';
 | 
			
		||||
 | 
			
		||||
import { fetchTrendingHashtags } from 'mastodon/actions/trends';
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag';
 | 
			
		||||
import { LoadingIndicator } from 'mastodon/components/loading_indicator';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@ import { addColumn } from 'mastodon/actions/columns';
 | 
			
		|||
import { changeSetting } from 'mastodon/actions/settings';
 | 
			
		||||
import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming';
 | 
			
		||||
import { expandPublicTimeline, expandCommunityTimeline } from 'mastodon/actions/timelines';
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import initialState, { domain } from 'mastodon/initial_state';
 | 
			
		||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ import { FormattedMessage } from 'react-intl';
 | 
			
		|||
import { Link } from 'react-router-dom';
 | 
			
		||||
 | 
			
		||||
import background from 'mastodon/../images/friends-cropped.png';
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const ExplorePrompt = () => (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ import { Helmet } from 'react-helmet';
 | 
			
		|||
 | 
			
		||||
import { connect } from 'react-redux';
 | 
			
		||||
 | 
			
		||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { DismissableBanner } from 'mastodon/components/dismissable_banner';
 | 
			
		||||
import { domain } from 'mastodon/initial_state';
 | 
			
		||||
 | 
			
		||||
import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue