import { Dispatch, memo, SetStateAction, useCallback, useState } from 'react' import { Change, CommentOperation } from '../../../../../types/change' import { ReviewPanelMessage } from './review-panel-message' import { useTranslation } from 'react-i18next' import { useThreadsActionsContext, 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' export const ReviewPanelCommentContent = memo<{ comment: Change isResolved: boolean onLeave?: () => void onEnter?: () => void }>(({ comment, isResolved, onLeave, onEnter }) => { const { t } = useTranslation() const [submitting, setSubmitting] = useState(false) const [error, setError] = useState() const threads = useThreadsContext() const { resolveThread, addMessage } = useThreadsActionsContext() const handleSubmitReply = useCallback( (content: string, setContent: Dispatch>) => { setSubmitting(true) addMessage(comment.op.t, content) .then(() => { setContent('') }) .catch(error => { setError(error) }) .finally(() => { setSubmitting(false) }) }, [addMessage, comment.op.t] ) const { handleChange, handleKeyPress, content } = useSubmittableTextInput(handleSubmitReply) const thread = threads?.[comment.op.t] if (!thread) { return null } return (
{thread.messages.map((message, i) => { const isReply = i !== 0 return (
{isReply &&
} 1} onResolve={() => resolveThread(comment.op.t)} isThreadResolved={isResolved} />
) })} {isResolved && (
)} {!isResolved && ( )} {error &&
{error.message}
}
) }) ReviewPanelCommentContent.displayName = 'ReviewPanelCommentContent'