gab-social/app/javascript/gabsocial/containers/media_container.js

92 lines
2.7 KiB
JavaScript
Raw Normal View History

2020-03-27 22:57:03 +00:00
import { Fragment } from 'react'
import ReactDOM from 'react-dom'
import { List as ImmutableList, fromJS } from 'immutable'
import { IntlProvider, addLocaleData } from 'react-intl'
import { getLocale } from '../locales'
import Video from '../components/video'
import StatusCard from '../components/status_card'
import Poll from '../components/poll'
import MediaGallery from '../components/media_gallery'
import ModalRoot from '../components/modal/modal_root'
import MediaModal from '../components/modal/media_modal'
2019-07-02 08:10:25 +01:00
const { localeData, messages } = getLocale();
addLocaleData(localeData);
2020-03-27 22:57:03 +00:00
const MEDIA_COMPONENTS = { MediaGallery, Video, StatusCard, Poll };
2019-07-02 08:10:25 +01:00
export default class MediaContainer extends PureComponent {
static propTypes = {
locale: PropTypes.string.isRequired,
components: PropTypes.object.isRequired,
};
state = {
media: null,
index: null,
time: null,
};
handleOpenMedia = (media, index) => {
2020-04-22 06:00:11 +01:00
document.body.classList.add(_s.overflowYHidden);
2019-07-02 08:10:25 +01:00
this.setState({ media, index });
}
handleOpenVideo = (video, time) => {
const media = ImmutableList([video]);
2020-04-22 06:00:11 +01:00
document.body.classList.add(_s.overflowYHidden);
2019-07-02 08:10:25 +01:00
this.setState({ media, time });
}
handleCloseMedia = () => {
2020-04-22 06:00:11 +01:00
document.body.classList.remove(_s.overflowYHidden);
2019-07-02 08:10:25 +01:00
this.setState({ media: null, index: null, time: null });
}
render () {
const { locale, components } = this.props;
return (
<IntlProvider locale={locale} messages={messages}>
<Fragment>
{[].map.call(components, (component, i) => {
const componentName = component.getAttribute('data-component');
const Component = MEDIA_COMPONENTS[componentName];
const { media, card, poll, ...props } = JSON.parse(component.getAttribute('data-props'));
Object.assign(props, {
...(media ? { media: fromJS(media) } : {}),
...(card ? { card: fromJS(card) } : {}),
...(poll ? { poll: fromJS(poll) } : {}),
...(componentName === 'Video' ? {
onOpenVideo: this.handleOpenVideo,
} : {
onOpenMedia: this.handleOpenMedia,
}),
});
return ReactDOM.createPortal(
<Component {...props} key={`media-${i}`} />,
component,
);
})}
<ModalRoot onClose={this.handleCloseMedia}>
{this.state.media && (
<MediaModal
media={this.state.media}
index={this.state.index || 0}
time={this.state.time}
onClose={this.handleCloseMedia}
/>
)}
</ModalRoot>
</Fragment>
</IntlProvider>
);
}
}