Show card modal on public pages (#7428)
This commit is contained in:
		
							parent
							
								
									dc010cc77a
								
							
						
					
					
						commit
						16fee0335f
					
				
					 4 changed files with 70 additions and 23 deletions
				
			
		| 
						 | 
				
			
			@ -1,18 +0,0 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import Card from '../features/status/components/card';
 | 
			
		||||
import { fromJS } from 'immutable';
 | 
			
		||||
 | 
			
		||||
export default class CardContainer extends React.PureComponent {
 | 
			
		||||
 | 
			
		||||
  static propTypes = {
 | 
			
		||||
    locale: PropTypes.string,
 | 
			
		||||
    card: PropTypes.array.isRequired,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  render () {
 | 
			
		||||
    const { card, ...props } = this.props;
 | 
			
		||||
    return <Card card={fromJS(card)} {...props} />;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										59
									
								
								app/javascript/mastodon/containers/cards_container.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								app/javascript/mastodon/containers/cards_container.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
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>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,6 @@ function main() {
 | 
			
		|||
  const { getLocale } = require('../mastodon/locales');
 | 
			
		||||
  const { localeData } = getLocale();
 | 
			
		||||
  const VideoContainer = require('../mastodon/containers/video_container').default;
 | 
			
		||||
  const CardContainer = require('../mastodon/containers/card_container').default;
 | 
			
		||||
  const React = require('react');
 | 
			
		||||
  const ReactDOM = require('react-dom');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -75,10 +74,16 @@ function main() {
 | 
			
		|||
      ReactDOM.render(<VideoContainer locale={locale} {...props} />, content);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    [].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => {
 | 
			
		||||
      const props = JSON.parse(content.getAttribute('data-props'));
 | 
			
		||||
      ReactDOM.render(<CardContainer locale={locale} {...props} />, content);
 | 
			
		||||
    });
 | 
			
		||||
    const cards = document.querySelectorAll('[data-component="Card"]');
 | 
			
		||||
 | 
			
		||||
    if (cards.length > 0) {
 | 
			
		||||
      import(/* webpackChunkName: "containers/cards_container" */ '../mastodon/containers/cards_container').then(({ default: CardsContainer }) => {
 | 
			
		||||
        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"]');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,7 @@
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card-standalone__body,
 | 
			
		||||
.media-gallery-standalone__body {
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue