| 'use client' | |
| import type { FC } from 'react' | |
| import React from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| import { ClipboardDocumentIcon, HandThumbDownIcon, HandThumbUpIcon } from '@heroicons/react/24/outline' | |
| import copy from 'copy-to-clipboard' | |
| import type { FeedbackType } from '@/app/components/base/chat/chat/type' | |
| import Button from '@/app/components/base/button' | |
| import Toast from '@/app/components/base/toast' | |
| import Tooltip from '@/app/components/base/tooltip' | |
| type IResultHeaderProps = { | |
| result: string | |
| showFeedback: boolean | |
| feedback: FeedbackType | |
| onFeedback: (feedback: FeedbackType) => void | |
| } | |
| const Header: FC<IResultHeaderProps> = ({ | |
| feedback, | |
| showFeedback, | |
| onFeedback, | |
| result, | |
| }) => { | |
| const { t } = useTranslation() | |
| return ( | |
| <div className='flex w-full justify-between items-center '> | |
| <div className='text-gray-800 text-2xl leading-4 font-normal'>{t('share.generation.resultTitle')}</div> | |
| <div className='flex items-center space-x-2'> | |
| <Button | |
| className='h-7 p-[2px] pr-2' | |
| onClick={() => { | |
| copy(result) | |
| Toast.notify({ type: 'success', message: 'copied' }) | |
| }} | |
| > | |
| <> | |
| <ClipboardDocumentIcon className='text-gray-500 w-4 h-3 mr-1' /> | |
| <span className='text-gray-500 text-xs leading-3'>{t('share.generation.copy')}</span> | |
| </> | |
| </Button> | |
| {showFeedback && feedback.rating && feedback.rating === 'like' && ( | |
| <Tooltip | |
| popupContent="Undo Great Rating" | |
| > | |
| <div | |
| onClick={() => { | |
| onFeedback({ | |
| rating: null, | |
| }) | |
| }} | |
| className='flex w-7 h-7 items-center justify-center rounded-md cursor-pointer !text-primary-600 border border-primary-200 bg-primary-100 hover:border-primary-300 hover:bg-primary-200'> | |
| <HandThumbUpIcon width={16} height={16} /> | |
| </div> | |
| </Tooltip> | |
| )} | |
| {showFeedback && feedback.rating && feedback.rating === 'dislike' && ( | |
| <Tooltip | |
| popupContent="Undo Undesirable Response" | |
| > | |
| <div | |
| onClick={() => { | |
| onFeedback({ | |
| rating: null, | |
| }) | |
| }} | |
| className='flex w-7 h-7 items-center justify-center rounded-md cursor-pointer !text-red-600 border border-red-200 bg-red-100 hover:border-red-300 hover:bg-red-200'> | |
| <HandThumbDownIcon width={16} height={16} /> | |
| </div> | |
| </Tooltip> | |
| )} | |
| {showFeedback && !feedback.rating && ( | |
| <div className='flex rounded-lg border border-gray-200 p-[1px] space-x-1'> | |
| <Tooltip | |
| popupContent="Great Rating" | |
| needsDelay={false} | |
| > | |
| <div | |
| onClick={() => { | |
| onFeedback({ | |
| rating: 'like', | |
| }) | |
| }} | |
| className='flex w-6 h-6 items-center justify-center rounded-md cursor-pointer hover:bg-gray-100'> | |
| <HandThumbUpIcon width={16} height={16} /> | |
| </div> | |
| </Tooltip> | |
| <Tooltip | |
| popupContent="Undesirable Response" | |
| needsDelay={false} | |
| > | |
| <div | |
| onClick={() => { | |
| onFeedback({ | |
| rating: 'dislike', | |
| }) | |
| }} | |
| className='flex w-6 h-6 items-center justify-center rounded-md cursor-pointer hover:bg-gray-100'> | |
| <HandThumbDownIcon width={16} height={16} /> | |
| </div> | |
| </Tooltip> | |
| </div> | |
| )} | |
| </div> | |
| </div> | |
| ) | |
| } | |
| export default React.memo(Header) | |