'use client' import type { FC } from 'react' import React from 'react' import { HandThumbDownIcon, HandThumbUpIcon } from '@heroicons/react/24/outline' import { useTranslation } from 'react-i18next' import LoadingAnim from '../loading-anim' import type { FeedbackFunc, IChatItem } from '../type' import s from '../style.module.css' import { randomString } from '@/utils/string' import type { MessageRating } from '@/types/app' import Tooltip from '@/app/components/base/tooltip' import { Markdown } from '@/app/components/base/markdown' const OperationBtn = ({ innerContent, onClick, className }: { innerContent: React.ReactNode; onClick?: () => void; className?: string }) => (
{innerContent}
) const OpeningStatementIcon: FC<{ className?: string }> = ({ className }) => ( ) const RatingIcon: FC<{ isLike: boolean }> = ({ isLike }) => { return isLike ? : } const EditIcon: FC<{ className?: string }> = ({ className }) => { return } export const EditIconSolid: FC<{ className?: string }> = ({ className }) => { return } const IconWrapper: FC<{ children: React.ReactNode | string }> = ({ children }) => { return
{children}
} type IAnswerProps = { item: IChatItem feedbackDisabled: boolean onFeedback?: FeedbackFunc isResponsing?: boolean } // The component needs to maintain its own state to control whether to display input component const Answer: FC = ({ item, feedbackDisabled = false, onFeedback, isResponsing }) => { const { id, content, feedback } = item const { t } = useTranslation() /** * Render feedback results (distinguish between users and administrators) * User reviews cannot be cancelled in Console * @param rating feedback result * @param isUserFeedback Whether it is user's feedback * @returns comp */ const renderFeedbackRating = (rating: MessageRating | undefined) => { if (!rating) return null const isLike = rating === 'like' const ratingIconClassname = isLike ? 'text-primary-600 bg-primary-100 hover:bg-primary-200' : 'text-red-600 bg-red-100 hover:bg-red-200' // The tooltip is always displayed, but the content is different for different scenarios. return (
{ await onFeedback?.(id, { rating: null }) }} >
) } /** * Different scenarios have different operation items. * @returns comp */ const renderItemOperation = () => { const userOperation = () => { return feedback?.rating ? null :
{OperationBtn({ innerContent: , onClick: () => onFeedback?.(id, { rating: 'like' }) })} {OperationBtn({ innerContent: , onClick: () => onFeedback?.(id, { rating: 'dislike' }) })}
} return (
{userOperation()}
) } return (
{isResponsing &&
}
{item.isOpeningStatement && (
{t('app.chat.openingStatementTitle')}
)} {(isResponsing && !content) ? (
) : ( )}
{!feedbackDisabled && !item.feedbackDisabled && renderItemOperation()} {/* User feedback must be displayed */} {!feedbackDisabled && renderFeedbackRating(feedback?.rating)}
) } export default React.memo(Answer)