import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
|
import StatusContainer from 'flavours/glitch/containers/status_container';
|
|
import LoadMore from 'flavours/glitch/components/load_more';
|
|
|
|
const mapStateToProps = (state, { id }) => {
|
|
let status = state.getIn(['statuses', id]);
|
|
let reblogId = status.get('reblog'); // reblog here is a id
|
|
|
|
return {
|
|
childrenWithGrandchildren: state.getIn(['contexts', 'replies', reblogId || id], []).map((cid) => ({
|
|
cid,
|
|
grandchildrenIds: state.getIn(['contexts', 'replies', cid], []),
|
|
})),
|
|
quotedId: reblogId && state.getIn(['statuses', reblogId, 'in_reply_to_id']),
|
|
};
|
|
};
|
|
|
|
const N = 3;
|
|
|
|
export default @connect(mapStateToProps)
|
|
class StatusWithComments extends ImmutablePureComponent {
|
|
|
|
state = {
|
|
showAll: false,
|
|
};
|
|
|
|
show = () => this.setState({ showAll: true });
|
|
|
|
render() {
|
|
const { id, childrenWithGrandchildren, quotedId, ...other } = this.props;
|
|
const { showAll } = this.state;
|
|
const loadMore = (
|
|
<LoadMore
|
|
visible
|
|
onClick={this.show}
|
|
/>
|
|
);
|
|
return (
|
|
<div className='status-with-comments'>
|
|
{quotedId ? (
|
|
<div className='status__quoted-status'>
|
|
<StatusContainer
|
|
id={quotedId}
|
|
/>
|
|
</div>
|
|
) : null}
|
|
<StatusContainer
|
|
id={id}
|
|
{...other}
|
|
/>
|
|
{childrenWithGrandchildren.size > 0 && (
|
|
<div className='status__comments'>
|
|
{childrenWithGrandchildren
|
|
.filter((_, idx) => showAll || idx < N)
|
|
.map(({ cid, grandchildrenIds }) => (
|
|
<>
|
|
<StatusContainer
|
|
key={`comment-${cid}`}
|
|
id={cid}
|
|
/>
|
|
{grandchildrenIds.size > 0 && (
|
|
<div className='subcomments'>
|
|
{grandchildrenIds
|
|
.filter((_, idx) => showAll || idx < N)
|
|
.map((gid) => (
|
|
<StatusContainer
|
|
key={`subcomment-${gid}`}
|
|
id={gid}
|
|
/>
|
|
))}
|
|
{!showAll && grandchildrenIds.size > N && loadMore}
|
|
</div>
|
|
)}
|
|
</>
|
|
))}
|
|
{!showAll && childrenWithGrandchildren.size > N && loadMore}
|
|
</div>
|
|
) }
|
|
</div>
|
|
);
|
|
}
|
|
|
|
}
|