// @flow import * as ICONS from 'constants/icons'; import React from 'react'; import Comment from 'component/comment'; import Button from 'component/button'; import Spinner from 'component/spinner'; import ChannelThumbnail from 'component/channelThumbnail'; type Props = { fetchedReplies: Array<any>, totalReplies: number, uri: string, parentId: string, claimIsMine: boolean, myChannels: ?Array<ChannelClaim>, linkedCommentId?: string, commentingEnabled: boolean, threadDepth: number, numDirectReplies: number, isFetchingByParentId: { [string]: boolean }, onShowMore?: () => void, }; function CommentsReplies(props: Props) { const { uri, parentId, fetchedReplies, totalReplies, claimIsMine, myChannels, linkedCommentId, commentingEnabled, threadDepth, numDirectReplies, isFetchingByParentId, onShowMore, } = props; const [isExpanded, setExpanded] = React.useState(true); function showMore() { if (onShowMore) { onShowMore(); } } // todo: implement comment_list --mine in SDK so redux can grab with selectCommentIsMine function isMyComment(channelId: string) { if (myChannels != null && channelId != null) { for (let i = 0; i < myChannels.length; i++) { if (myChannels[i].claim_id === channelId) { return true; } } } return false; } const displayedComments = fetchedReplies; return ( Boolean(numDirectReplies) && ( <div className="comment__replies-container"> {Boolean(numDirectReplies) && !isExpanded && ( <div className="comment__actions--nested"> <Button className="comment__action" label={__('Show Replies')} onClick={() => setExpanded(!isExpanded)} icon={isExpanded ? ICONS.UP : ICONS.DOWN} /> </div> )} {isExpanded && ( <div> <div className="comment__replies"> <Button className="comment__threadline" aria-label="Hide Replies" onClick={() => setExpanded(false)} /> <ul className="comments--replies"> {displayedComments && displayedComments.map((comment) => { return ( <Comment threadDepth={threadDepth} uri={uri} authorUri={comment.channel_url} author={comment.channel_name} claimId={comment.claim_id} commentId={comment.comment_id} key={comment.comment_id} message={comment.comment} timePosted={comment.timestamp * 1000} claimIsMine={claimIsMine} commentIsMine={comment.channel_id && isMyComment(comment.channel_id)} linkedCommentId={linkedCommentId} commentingEnabled={commentingEnabled} supportAmount={comment.support_amount} numDirectReplies={comment.replies} /> ); })} {!isFetchingByParentId[parentId] && totalReplies < numDirectReplies && ( <li className="comment comment--reply"> <div className="comment__content"> <div className="comment__thumbnail-wrapper"> <ChannelThumbnail xsmall className="comment__author-thumbnail" /> </div> <div className="comment__body-container comment--blocked"> <div className="comment__meta"> <em>---</em> </div> <div> <em>{__('Comment(s) blocked.')}</em> </div> </div> </div> </li> )} </ul> </div> </div> )} {isExpanded && fetchedReplies && displayedComments.length < totalReplies && ( <div className="comment__actions--nested"> <Button button="link" label={__('Show more')} onClick={showMore} className="button--uri-indicator" /> </div> )} {isFetchingByParentId[parentId] && ( <div className="comment__replies-container"> <div className="comment__actions--nested"> <Spinner type="small" /> </div> </div> )} </div> ) ); } export default CommentsReplies;