import React from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import ImmutablePropTypes from 'react-immutable-proptypes' import ImmutablePureComponent from 'react-immutable-pure-component' import { injectIntl, defineMessages } from 'react-intl' import { expandAccountMediaTimeline } from '../actions/timelines' import { getAccountGallery } from '../selectors' import ColumnIndicator from '../components/column_indicator' import MediaItem from '../components/media_item' import Heading from '../components/heading' import TabBar from '../components/tab_bar' import LoadMore from '../components/load_more' import Block from '../components/block' import Dummy from '../components/dummy' import MediaGalleryPlaceholder from '../components/placeholder/media_gallery_placeholder' class AccountPhotoGallery extends ImmutablePureComponent { componentDidMount() { const { accountId } = this.props if (accountId && accountId !== -1) { this.props.dispatch(expandAccountMediaTimeline(accountId, { mediaType: 'photo' })) } } componentWillReceiveProps(nextProps) { if (nextProps.accountId && nextProps.accountId !== this.props.accountId) { this.props.dispatch(expandAccountMediaTimeline(nextProps.accountId, { mediaType: 'photo', })) } } handleScrollToBottom = () => { if (this.props.hasMore) { this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined) } } handleScroll = (e) => { const { scrollTop, scrollHeight, clientHeight } = e.target const offset = scrollHeight - scrollTop - clientHeight if (150 > offset && !this.props.isLoading) { this.handleScrollToBottom() } } handleLoadMore = (maxId) => { if (this.props.accountId && this.props.accountId !== -1) { this.props.dispatch(expandAccountMediaTimeline(this.props.accountId, { maxId, mediaType: 'photo', })) } } handleLoadOlder = (e) => { e.preventDefault() this.handleScrollToBottom() } render() { const { attachments, isLoading, hasMore, intl, account, } = this.props if (!account) return null const hasAttachments = !!attachments ? attachments.size > 0 : false return (
Photos
{ hasAttachments && { attachments.map((attachment, i) => ( )) } { Array.apply(null, { length: 8}).map((_, i) => ( )) } } { isLoading && !hasAttachments &&
} { !isLoading && !hasAttachments && }
{ hasMore && !(isLoading && !hasAttachments) && }
) } } const messages = defineMessages({ none: { id: 'account_gallery.none', defaultMessage: 'No media to show.' }, }) const mapStateToProps = (state, { account }) => { const accountId = !!account ? account.get('id') : -1 return { accountId, attachments: getAccountGallery(state, accountId, 'photo'), isLoading: state.getIn(['timelines', `account:${accountId}:media`, 'isLoading']), hasMore: state.getIn(['timelines', `account:${accountId}:media`, 'hasMore']), } } AccountPhotoGallery.propTypes = { dispatch: PropTypes.func.isRequired, account: ImmutablePropTypes.map, accountId: PropTypes.string, attachments: ImmutablePropTypes.list.isRequired, isLoading: PropTypes.bool, hasMore: PropTypes.bool, intl: PropTypes.object.isRequired, } export default injectIntl(connect(mapStateToProps)(AccountPhotoGallery))