import { memo, useCallback, useState } from 'react' import { Change, CommentOperation } from '../../../../../types/change' import { ReviewPanelMessage } from './review-panel-message' import { useTranslation } from 'react-i18next' import { useThreadsContext } from '../context/threads-context' import AutoExpandingTextArea from '@/shared/components/auto-expanding-text-area' import ReviewPanelResolvedMessage from './review-panel-resolved-message' import { ReviewPanelResolvedCommentThread } from '../../../../../types/review-panel/comment-thread' import useSubmittableTextInput from '../hooks/use-submittable-text-input' import { CommentId, ThreadId, } from '../../../../../types/review-panel/review-panel' import { usePermissionsContext } from '@/features/ide-react/context/permissions-context' export const ReviewPanelCommentContent = memo<{ comment: Change isResolved: boolean onEdit?: (commentId: CommentId, content: string) => Promise onReply?: (content: string) => Promise onDeleteMessage?: (commentId: CommentId) => Promise onDeleteThread?: (threadId: ThreadId) => Promise onResolve?: () => Promise onLeave?: (changeId: string) => void onEnter?: (changeId: string) => void }>( ({ comment, isResolved, onResolve, onDeleteMessage, onDeleteThread, onEdit, onReply, onLeave, onEnter, }) => { const { t } = useTranslation() const threads = useThreadsContext() const permissions = usePermissionsContext() const [submitting, setSubmitting] = useState(false) const handleSubmit = useCallback( (content, setContent) => { if (!onReply || submitting) { return } setSubmitting(true) onReply(content) .then(() => { setContent('') }) .finally(() => { setSubmitting(false) }) }, [onReply, submitting] ) const { handleChange, handleKeyPress, content } = useSubmittableTextInput(handleSubmit) const thread = threads?.[comment.op.t] if (!thread) { return null } return (
onEnter(comment.id))} onMouseLeave={onLeave && (() => onLeave(comment.id))} > {thread.messages.map((message, i) => { const isReply = i !== 0 return (
{isReply && (
)} 1} onResolve={onResolve} onEdit={onEdit} onDelete={() => isReply ? onDeleteMessage?.(message.id) : onDeleteThread?.(comment.op.t) } isThreadResolved={isResolved} />
) })} {isResolved && (
)} {permissions.comment && !isResolved && ( )}
) } ) ReviewPanelCommentContent.displayName = 'ReviewPanelCommentContent'