Convert <DismissableBanner> to Typescript (#25582)
				
					
				
			This commit is contained in:
		
							parent
							
								
									20e85c0e83
								
							
						
					
					
						commit
						4534498a8e
					
				| @ -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 { 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 { domain } from 'mastodon/initial_state'; | ||||||
| 
 | 
 | ||||||
| import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; | import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; | |||||||
| import { connect } from 'react-redux'; | import { connect } from 'react-redux'; | ||||||
| 
 | 
 | ||||||
| import { fetchTrendingLinks } from 'mastodon/actions/trends'; | 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 { LoadingIndicator } from 'mastodon/components/loading_indicator'; | ||||||
| 
 | 
 | ||||||
| import Story from './components/story'; | import Story from './components/story'; | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ import { connect } from 'react-redux'; | |||||||
| import { debounce } from 'lodash'; | import { debounce } from 'lodash'; | ||||||
| 
 | 
 | ||||||
| import { fetchTrendingStatuses, expandTrendingStatuses } from 'mastodon/actions/trends'; | 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 StatusList from 'mastodon/components/status_list'; | ||||||
| import { getStatusList } from 'mastodon/selectors'; | import { getStatusList } from 'mastodon/selectors'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; | |||||||
| import { connect } from 'react-redux'; | import { connect } from 'react-redux'; | ||||||
| 
 | 
 | ||||||
| import { fetchTrendingHashtags } from 'mastodon/actions/trends'; | 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 { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag'; | ||||||
| import { LoadingIndicator } from 'mastodon/components/loading_indicator'; | import { LoadingIndicator } from 'mastodon/components/loading_indicator'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ import { addColumn } from 'mastodon/actions/columns'; | |||||||
| import { changeSetting } from 'mastodon/actions/settings'; | import { changeSetting } from 'mastodon/actions/settings'; | ||||||
| import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming'; | import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming'; | ||||||
| import { expandPublicTimeline, expandCommunityTimeline } from 'mastodon/actions/timelines'; | 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 initialState, { domain } from 'mastodon/initial_state'; | ||||||
| import { useAppDispatch, useAppSelector } from 'mastodon/store'; | import { useAppDispatch, useAppSelector } from 'mastodon/store'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ import { FormattedMessage } from 'react-intl'; | |||||||
| import { Link } from 'react-router-dom'; | import { Link } from 'react-router-dom'; | ||||||
| 
 | 
 | ||||||
| import background from 'mastodon/../images/friends-cropped.png'; | 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 = () => ( | export const ExplorePrompt = () => ( | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ import { Helmet } from 'react-helmet'; | |||||||
| 
 | 
 | ||||||
| import { connect } from 'react-redux'; | 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 { domain } from 'mastodon/initial_state'; | ||||||
| 
 | 
 | ||||||
| import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; | import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user