|
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> |
|
); |
|
}; |
|
|