Skip to content
Extraits de code Groupes Projets
Valider f9afd062 rédigé par Yamagishi Kazutoshi's avatar Yamagishi Kazutoshi Validation de Eugen Rochko
Parcourir les fichiers

Combine similar components into one on public UI (#7458)

parent 4d706f99
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
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>
);
}
}
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'; ...@@ -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 { ...@@ -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 { ...@@ -60,7 +67,7 @@ export default class MediaGalleriesContainer extends React.PureComponent {
/> />
)} )}
</ModalRoot> </ModalRoot>
</React.Fragment> </Fragment>
</IntlProvider> </IntlProvider>
); );
} }
......
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() { ...@@ -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() { ...@@ -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"]');
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"]');
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); ReactDOM.render(<MediaContainer locale={locale} components={reactComponents} />, content);
document.body.appendChild(content); document.body.appendChild(content);
})
.catch(error => console.error(error));
} }
}); });
......
...@@ -60,8 +60,7 @@ ...@@ -60,8 +60,7 @@
} }
} }
.card-standalone__body, .media-standalone__body {
.media-gallery-standalone__body {
overflow: hidden; overflow: hidden;
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter