Combine similar components into one on public UI (#7458)
This commit is contained in:
		
					parent
					
						
							
								4d706f9976
							
						
					
				
			
			
				commit
				
					
						f9afd06221
					
				
			
		
					 5 changed files with 33 additions and 127 deletions
				
			
		|  | @ -1,59 +0,0 @@ | ||||||
| import React, { Fragment } from 'react'; |  | ||||||
| import ReactDOM from 'react-dom'; |  | ||||||
| import PropTypes from 'prop-types'; |  | ||||||
| import { IntlProvider, addLocaleData } from 'react-intl'; |  | ||||||
| import { getLocale } from '../locales'; |  | ||||||
| import Card from '../features/status/components/card'; |  | ||||||
| import ModalRoot from '../components/modal_root'; |  | ||||||
| import MediaModal from '../features/ui/components/media_modal'; |  | ||||||
| import { fromJS } from 'immutable'; |  | ||||||
| 
 |  | ||||||
| const { localeData, messages } = getLocale(); |  | ||||||
| addLocaleData(localeData); |  | ||||||
| 
 |  | ||||||
| export default class CardsContainer extends React.PureComponent { |  | ||||||
| 
 |  | ||||||
|   static propTypes = { |  | ||||||
|     locale: PropTypes.string, |  | ||||||
|     cards: PropTypes.object.isRequired, |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   state = { |  | ||||||
|     media: null, |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   handleOpenCard = (media) => { |  | ||||||
|     document.body.classList.add('card-standalone__body'); |  | ||||||
|     this.setState({ media }); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   handleCloseCard = () => { |  | ||||||
|     document.body.classList.remove('card-standalone__body'); |  | ||||||
|     this.setState({ media: null }); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   render () { |  | ||||||
|     const { locale, cards } = this.props; |  | ||||||
| 
 |  | ||||||
|     return ( |  | ||||||
|       <IntlProvider locale={locale} messages={messages}> |  | ||||||
|         <Fragment> |  | ||||||
|           {[].map.call(cards, container => { |  | ||||||
|             const { card, ...props } = JSON.parse(container.getAttribute('data-props')); |  | ||||||
| 
 |  | ||||||
|             return ReactDOM.createPortal( |  | ||||||
|               <Card card={fromJS(card)} onOpenMedia={this.handleOpenCard} {...props} />, |  | ||||||
|               container, |  | ||||||
|             ); |  | ||||||
|           })} |  | ||||||
|           <ModalRoot onClose={this.handleCloseCard}> |  | ||||||
|             {this.state.media && ( |  | ||||||
|               <MediaModal media={this.state.media} index={0} onClose={this.handleCloseCard} /> |  | ||||||
|             )} |  | ||||||
|           </ModalRoot> |  | ||||||
|         </Fragment> |  | ||||||
|       </IntlProvider> |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -1,9 +1,11 @@ | ||||||
| import React from 'react'; | import React, { PureComponent, Fragment } from 'react'; | ||||||
| import ReactDOM from 'react-dom'; | import ReactDOM from 'react-dom'; | ||||||
| import PropTypes from 'prop-types'; | import PropTypes from 'prop-types'; | ||||||
| import { IntlProvider, addLocaleData } from 'react-intl'; | import { IntlProvider, addLocaleData } from 'react-intl'; | ||||||
| import { getLocale } from '../locales'; | import { getLocale } from '../locales'; | ||||||
| import MediaGallery from '../components/media_gallery'; | import MediaGallery from '../components/media_gallery'; | ||||||
|  | import Video from '../features/video'; | ||||||
|  | import Card from '../features/status/components/card'; | ||||||
| import ModalRoot from '../components/modal_root'; | import ModalRoot from '../components/modal_root'; | ||||||
| import MediaModal from '../features/ui/components/media_modal'; | import MediaModal from '../features/ui/components/media_modal'; | ||||||
| import { fromJS } from 'immutable'; | import { fromJS } from 'immutable'; | ||||||
|  | @ -11,11 +13,13 @@ import { fromJS } from 'immutable'; | ||||||
| const { localeData, messages } = getLocale(); | const { localeData, messages } = getLocale(); | ||||||
| addLocaleData(localeData); | addLocaleData(localeData); | ||||||
| 
 | 
 | ||||||
| export default class MediaGalleriesContainer extends React.PureComponent { | const MEDIA_COMPONENTS = { MediaGallery, Video, Card }; | ||||||
|  | 
 | ||||||
|  | export default class MediaContainer extends PureComponent { | ||||||
| 
 | 
 | ||||||
|   static propTypes = { |   static propTypes = { | ||||||
|     locale: PropTypes.string.isRequired, |     locale: PropTypes.string.isRequired, | ||||||
|     galleries: PropTypes.object.isRequired, |     components: PropTypes.object.isRequired, | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   state = { |   state = { | ||||||
|  | @ -24,31 +28,34 @@ export default class MediaGalleriesContainer extends React.PureComponent { | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   handleOpenMedia = (media, index) => { |   handleOpenMedia = (media, index) => { | ||||||
|     document.body.classList.add('media-gallery-standalone__body'); |     document.body.classList.add('media-standalone__body'); | ||||||
|     this.setState({ media, index }); |     this.setState({ media, index }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   handleCloseMedia = () => { |   handleCloseMedia = () => { | ||||||
|     document.body.classList.remove('media-gallery-standalone__body'); |     document.body.classList.remove('media-standalone__body'); | ||||||
|     this.setState({ media: null, index: null }); |     this.setState({ media: null, index: null }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   render () { |   render () { | ||||||
|     const { locale, galleries } = this.props; |     const { locale, components } = this.props; | ||||||
| 
 | 
 | ||||||
|     return ( |     return ( | ||||||
|       <IntlProvider locale={locale} messages={messages}> |       <IntlProvider locale={locale} messages={messages}> | ||||||
|         <React.Fragment> |         <Fragment> | ||||||
|           {[].map.call(galleries, gallery => { |           {[].map.call(components, (component, i) => { | ||||||
|             const { media, ...props } = JSON.parse(gallery.getAttribute('data-props')); |             const componentName = component.getAttribute('data-component'); | ||||||
|  |             const Component = MEDIA_COMPONENTS[componentName]; | ||||||
|  |             const { media, card, ...props } = JSON.parse(component.getAttribute('data-props')); | ||||||
|  | 
 | ||||||
|  |             Object.assign(props, { | ||||||
|  |               ...(media ? { media: fromJS(media) } : {}), | ||||||
|  |               ...(card  ? { card:  fromJS(card)  } : {}), | ||||||
|  |             }); | ||||||
| 
 | 
 | ||||||
|             return ReactDOM.createPortal( |             return ReactDOM.createPortal( | ||||||
|               <MediaGallery |               <Component onOpenMedia={this.handleOpenMedia} {...props} key={`media-${i}`} />, | ||||||
|                 {...props} |               component, | ||||||
|                 media={fromJS(media)} |  | ||||||
|                 onOpenMedia={this.handleOpenMedia} |  | ||||||
|               />, |  | ||||||
|               gallery |  | ||||||
|             ); |             ); | ||||||
|           })} |           })} | ||||||
|           <ModalRoot onClose={this.handleCloseMedia}> |           <ModalRoot onClose={this.handleCloseMedia}> | ||||||
|  | @ -60,7 +67,7 @@ export default class MediaGalleriesContainer extends React.PureComponent { | ||||||
|               /> |               /> | ||||||
|             )} |             )} | ||||||
|           </ModalRoot> |           </ModalRoot> | ||||||
|         </React.Fragment> |         </Fragment> | ||||||
|       </IntlProvider> |       </IntlProvider> | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  | @ -1,26 +0,0 @@ | ||||||
| import React from 'react'; |  | ||||||
| import PropTypes from 'prop-types'; |  | ||||||
| import { IntlProvider, addLocaleData } from 'react-intl'; |  | ||||||
| import { getLocale } from '../locales'; |  | ||||||
| import Video from '../features/video'; |  | ||||||
| 
 |  | ||||||
| const { localeData, messages } = getLocale(); |  | ||||||
| addLocaleData(localeData); |  | ||||||
| 
 |  | ||||||
| export default class VideoContainer extends React.PureComponent { |  | ||||||
| 
 |  | ||||||
|   static propTypes = { |  | ||||||
|     locale: PropTypes.string.isRequired, |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   render () { |  | ||||||
|     const { locale, ...props } = this.props; |  | ||||||
| 
 |  | ||||||
|     return ( |  | ||||||
|       <IntlProvider locale={locale} messages={messages}> |  | ||||||
|         <Video {...props} /> |  | ||||||
|       </IntlProvider> |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -24,7 +24,6 @@ function main() { | ||||||
|   const emojify = require('../mastodon/features/emoji/emoji').default; |   const emojify = require('../mastodon/features/emoji/emoji').default; | ||||||
|   const { getLocale } = require('../mastodon/locales'); |   const { getLocale } = require('../mastodon/locales'); | ||||||
|   const { localeData } = getLocale(); |   const { localeData } = getLocale(); | ||||||
|   const VideoContainer = require('../mastodon/containers/video_container').default; |  | ||||||
|   const React = require('react'); |   const React = require('react'); | ||||||
|   const ReactDOM = require('react-dom'); |   const ReactDOM = require('react-dom'); | ||||||
| 
 | 
 | ||||||
|  | @ -69,30 +68,16 @@ function main() { | ||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     [].forEach.call(document.querySelectorAll('[data-component="Video"]'), (content) => { |     const reactComponents = document.querySelectorAll('[data-component]'); | ||||||
|       const props = JSON.parse(content.getAttribute('data-props')); |     if (reactComponents.length > 0) { | ||||||
|       ReactDOM.render(<VideoContainer locale={locale} {...props} />, content); |       import(/* webpackChunkName: "containers/media_container" */ '../mastodon/containers/media_container') | ||||||
|     }); |         .then(({ default: MediaContainer }) => { | ||||||
|  |           const content = document.createElement('div'); | ||||||
| 
 | 
 | ||||||
|     const cards = document.querySelectorAll('[data-component="Card"]'); |           ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content); | ||||||
| 
 |           document.body.appendChild(content); | ||||||
|     if (cards.length > 0) { |         }) | ||||||
|       import(/* webpackChunkName: "containers/cards_container" */ '../mastodon/containers/cards_container').then(({ default: CardsContainer }) => { |         .catch(error => console.error(error)); | ||||||
|         const content = document.createElement('div'); |  | ||||||
| 
 |  | ||||||
|         ReactDOM.render(<CardsContainer locale={locale} cards={cards} />, content); |  | ||||||
|         document.body.appendChild(content); |  | ||||||
|       }).catch(error => console.error(error)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const mediaGalleries = document.querySelectorAll('[data-component="MediaGallery"]'); |  | ||||||
| 
 |  | ||||||
|     if (mediaGalleries.length > 0) { |  | ||||||
|       const MediaGalleriesContainer = require('../mastodon/containers/media_galleries_container').default; |  | ||||||
|       const content = document.createElement('div'); |  | ||||||
| 
 |  | ||||||
|       ReactDOM.render(<MediaGalleriesContainer locale={locale} galleries={mediaGalleries} />, content); |  | ||||||
|       document.body.appendChild(content); |  | ||||||
|     } |     } | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -60,8 +60,7 @@ | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .card-standalone__body, | .media-standalone__body { | ||||||
| .media-gallery-standalone__body { |  | ||||||
|   overflow: hidden; |   overflow: hidden; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue