import { PromptIcon } from '@/assets/icon/next-icon'; import CopyToClipboard from '@/components/copy-to-clipboard'; import { useSetModalState } from '@/hooks/common-hooks'; import { IRemoveMessageById } from '@/hooks/logic-hooks'; import { AgentChatContext } from '@/pages/agent/context'; import { downloadFile } from '@/services/file-manager-service'; import { downloadFileFromBlob } from '@/utils/file-util'; import { DeleteOutlined, DislikeOutlined, LikeOutlined, PauseCircleOutlined, SoundOutlined, SyncOutlined, } from '@ant-design/icons'; import { Radio, Tooltip } from 'antd'; import { Download, NotebookText } from 'lucide-react'; import { useCallback, useContext } from 'react'; import { useTranslation } from 'react-i18next'; import FeedbackDialog from '../feedback-dialog'; import { PromptDialog } from '../prompt-dialog'; import { ToggleGroup, ToggleGroupItem } from '../ui/toggle-group'; import { useRemoveMessage, useSendFeedback, useSpeech } from './hooks'; interface IProps { messageId: string; content: string; prompt?: string; showLikeButton: boolean; audioBinary?: string; showLoudspeaker?: boolean; showLog?: boolean; attachment?: { file_name: string; doc_id: string; format: string; }; } export const AssistantGroupButton = ({ messageId, content, prompt, audioBinary, showLikeButton, showLoudspeaker = true, showLog = true, attachment, }: 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]); const { showLogSheet } = useContext(AgentChatContext); const handleShowLogSheet = useCallback(() => { showLogSheet(messageId); }, [messageId, showLogSheet]); return ( <> {showLoudspeaker && ( {isPlaying ? : } )} {showLikeButton && ( <> )} {prompt && ( )} {showLog && ( )} {!!attachment?.doc_id && ( { try { const response = await downloadFile({ docId: attachment.doc_id, ext: attachment.format, }); const blob = new Blob([response.data], { type: response.data.type, }); downloadFileFromBlob(blob, attachment.file_name); } catch (error) { console.error('Download failed:', error); } }} > )} {visible && ( )} {promptVisible && ( )} ); }; interface UserGroupButtonProps extends Partial { 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 ( {regenerateMessage && ( )} {removeMessageById && ( )} ); };