| import CopyToClipboard from '@/components/copy-to-clipboard'; |
| import { useSetModalState } from '@/hooks/common-hooks'; |
| import { IRemoveMessageById } from '@/hooks/logic-hooks'; |
| import { |
| DeleteOutlined, |
| DislikeOutlined, |
| LikeOutlined, |
| PauseCircleOutlined, |
| SoundOutlined, |
| SyncOutlined, |
| } from '@ant-design/icons'; |
| import { Radio, Tooltip } from 'antd'; |
| import { useCallback } from 'react'; |
| import { useTranslation } from 'react-i18next'; |
| import SvgIcon from '../svg-icon'; |
| import FeedbackModal from './feedback-modal'; |
| import { useRemoveMessage, useSendFeedback, useSpeech } from './hooks'; |
| import PromptModal from './prompt-modal'; |
|
|
| interface IProps { |
| messageId: string; |
| content: string; |
| prompt?: string; |
| showLikeButton: boolean; |
| audioBinary?: string; |
| } |
|
|
| export const AssistantGroupButton = ({ |
| messageId, |
| content, |
| prompt, |
| audioBinary, |
| showLikeButton, |
| }: IProps) => { |
| const { visible, hideModal, showModal, onFeedbackOk, loading } = |
| useSendFeedback(messageId); |
| const { |
| visible: promptVisible, |
| hideModal: hidePromptModal, |
| showModal: showPromptModal, |
| } = useSetModalState(); |
| const { t } = useTranslation(); |
| const { handleRead, ref, isPlaying } = useSpeech(content, audioBinary); |
|
|
| const handleLike = useCallback(() => { |
| onFeedbackOk({ thumbup: true }); |
| }, [onFeedbackOk]); |
|
|
| return ( |
| <> |
| <Radio.Group size="small"> |
| <Radio.Button value="a"> |
| <CopyToClipboard text={content}></CopyToClipboard> |
| </Radio.Button> |
| <Radio.Button value="b" onClick={handleRead}> |
| <Tooltip title={t('chat.read')}> |
| {isPlaying ? <PauseCircleOutlined /> : <SoundOutlined />} |
| </Tooltip> |
| <audio src="" ref={ref}></audio> |
| </Radio.Button> |
| {showLikeButton && ( |
| <> |
| <Radio.Button value="c" onClick={handleLike}> |
| <LikeOutlined /> |
| </Radio.Button> |
| <Radio.Button value="d" onClick={showModal}> |
| <DislikeOutlined /> |
| </Radio.Button> |
| </> |
| )} |
| {prompt && ( |
| <Radio.Button value="e" onClick={showPromptModal}> |
| <SvgIcon name={`prompt`} width={16}></SvgIcon> |
| </Radio.Button> |
| )} |
| </Radio.Group> |
| {visible && ( |
| <FeedbackModal |
| visible={visible} |
| hideModal={hideModal} |
| onOk={onFeedbackOk} |
| loading={loading} |
| ></FeedbackModal> |
| )} |
| {promptVisible && ( |
| <PromptModal |
| visible={promptVisible} |
| hideModal={hidePromptModal} |
| prompt={prompt} |
| ></PromptModal> |
| )} |
| </> |
| ); |
| }; |
|
|
| interface UserGroupButtonProps extends Partial<IRemoveMessageById> { |
| messageId: string; |
| content: string; |
| regenerateMessage?: () => void; |
| sendLoading: boolean; |
| } |
|
|
| export const UserGroupButton = ({ |
| content, |
| messageId, |
| sendLoading, |
| removeMessageById, |
| regenerateMessage, |
| }: UserGroupButtonProps) => { |
| const { onRemoveMessage, loading } = useRemoveMessage( |
| messageId, |
| removeMessageById, |
| ); |
| const { t } = useTranslation(); |
|
|
| return ( |
| <Radio.Group size="small"> |
| <Radio.Button value="a"> |
| <CopyToClipboard text={content}></CopyToClipboard> |
| </Radio.Button> |
| {regenerateMessage && ( |
| <Radio.Button |
| value="b" |
| onClick={regenerateMessage} |
| disabled={sendLoading} |
| > |
| <Tooltip title={t('chat.regenerate')}> |
| <SyncOutlined spin={sendLoading} /> |
| </Tooltip> |
| </Radio.Button> |
| )} |
| {removeMessageById && ( |
| <Radio.Button value="c" onClick={onRemoveMessage} disabled={loading}> |
| <Tooltip title={t('common.delete')}> |
| <DeleteOutlined spin={loading} /> |
| </Tooltip> |
| </Radio.Button> |
| )} |
| </Radio.Group> |
| ); |
| }; |
|
|