// @flow import 'scss/component/_comments.scss'; import * as ICONS from 'constants/icons'; import Button from 'component/button'; import Comment from 'component/comment'; import React from 'react'; import Spinner from 'component/spinner'; type Props = { claimIsMine: boolean, fetchedReplies: Array, hasMore: boolean, isFetchingByParentId: { [string]: boolean }, linkedCommentId?: string, numDirectReplies: number, // Total replies for parentId as reported by 'comment[replies]'. Includes blocked items. parentId: string, resolvedReplies: Array, supportDisabled: boolean, threadDepth: number, uri: string, userCanComment: boolean, doResolveUris: (Array) => void, onShowMore?: () => void, }; function CommentsReplies(props: Props) { const { claimIsMine, fetchedReplies, hasMore, isFetchingByParentId, linkedCommentId, numDirectReplies, parentId, resolvedReplies, supportDisabled, threadDepth, uri, userCanComment, doResolveUris, onShowMore, } = props; const [isExpanded, setExpanded] = React.useState(true); const [commentsToDisplay, setCommentsToDisplay] = React.useState(fetchedReplies); const isResolvingReplies = fetchedReplies && resolvedReplies.length !== fetchedReplies.length; const alreadyResolved = !isResolvingReplies && resolvedReplies.length !== 0; const canDisplayComments = commentsToDisplay && commentsToDisplay.length === fetchedReplies.length; // Batch resolve comment channel urls React.useEffect(() => { if (!fetchedReplies || alreadyResolved) return; const urisToResolve = []; fetchedReplies.forEach(({ channel_url }) => channel_url !== undefined && urisToResolve.push(channel_url)); if (urisToResolve.length > 0) doResolveUris(urisToResolve); }, [alreadyResolved, doResolveUris, fetchedReplies]); // Wait to only display topLevelComments after resolved or else // other components will try to resolve again, like channelThumbnail React.useEffect(() => { if (!isResolvingReplies) setCommentsToDisplay(fetchedReplies); }, [isResolvingReplies, fetchedReplies]); return !numDirectReplies ? null : (
{!isExpanded ? (
) : (
)} {isExpanded && fetchedReplies && hasMore && (
)} {(isFetchingByParentId[parentId] || isResolvingReplies || !canDisplayComments) && (
)}
); } export default CommentsReplies;