import PropTypes from 'prop-types'; import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { FormattedMessage, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; import { openModal } from 'soapbox/actions/modals'; import Icon from 'soapbox/components/icon'; import { Spinner } from 'soapbox/components/ui'; import { getAccountGallery } from 'soapbox/selectors'; import { expandAccountMediaTimeline } from '../../../actions/timelines'; import MediaItem from '../../account_gallery/components/media_item'; class ProfileMediaPanel extends ImmutablePureComponent { static propTypes = { account: ImmutablePropTypes.map, attachments: ImmutablePropTypes.list, dispatch: PropTypes.func.isRequired, }; state = { isLoading: true, } handleOpenMedia = attachment => { if (attachment.get('type') === 'video') { this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') })); } else { const media = attachment.getIn(['status', 'media_attachments']); const index = media.findIndex(x => x.get('id') === attachment.get('id')); this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status'), account: attachment.get('account') })); } } fetchMedia = () => { const { account } = this.props; if (account) { const accountId = account.get('id'); this.props.dispatch(expandAccountMediaTimeline(accountId)) .then(() => this.setState({ isLoading: false })) .catch(() => {}); } } componentDidMount() { this.fetchMedia(); } componentDidUpdate(prevProps) { const oldId = prevProps.account && prevProps.account.get('id'); const newId = this.props.account && this.props.account.get('id'); if (newId !== oldId) { this.setState({ isLoading: true }); this.fetchMedia(); } } renderAttachments() { const { attachments } = this.props; const publicAttachments = attachments.filter(attachment => attachment.getIn(['status', 'visibility']) === 'public'); const nineAttachments = publicAttachments.slice(0, 9); if (!nineAttachments.isEmpty()) { return (
{nineAttachments.map((attachment, index) => ( ))}
); } else { return (
); } } render() { const { account } = this.props; const { isLoading } = this.state; return (
{account &&
{isLoading ? ( ) : ( this.renderAttachments() )}
}
); } } const mapStateToProps = (state, { account }) => ({ attachments: getAccountGallery(state, account.get('id')), }); export default injectIntl( connect(mapStateToProps, null, null, { forwardRef: true, }, )(ProfileMediaPanel));