Files
supersonic/webapp/packages/chat-sdk/src/components/Tools/index.tsx

127 lines
3.5 KiB
TypeScript

import { isMobile } from '../../utils/utils';
import {
DislikeOutlined,
LikeOutlined,
DownloadOutlined,
RedoOutlined,
FileJpgOutlined,
} from '@ant-design/icons';
import { Button } from 'antd';
import { CLS_PREFIX } from '../../common/constants';
import { useContext, useState } from 'react';
import classNames from 'classnames';
import { updateQAFeedback } from '../../service';
import { useMethodRegister } from '../../hooks';
import { ChartItemContext } from '../ChatItem';
type Props = {
queryId: number;
scoreValue?: number;
isLastMessage?: boolean;
isParserError?: boolean;
isSimpleMode?: boolean;
onExportData?: () => void;
onReExecute?: (queryId: number) => void;
};
const Tools: React.FC<Props> = ({
queryId,
scoreValue,
isLastMessage,
isParserError = false,
isSimpleMode = false,
onExportData,
onReExecute,
}) => {
const [score, setScore] = useState(scoreValue || 0);
const [exportLoading, setExportLoading] = useState<boolean>(false);
const prefixCls = `${CLS_PREFIX}-tools`;
const like = () => {
setScore(5);
updateQAFeedback(queryId, 5);
};
const dislike = () => {
setScore(1);
updateQAFeedback(queryId, 1);
};
const likeClass = classNames(`${prefixCls}-like`, {
[`${prefixCls}-feedback-active`]: score === 5,
});
const dislikeClass = classNames(`${prefixCls}-dislike`, {
[`${prefixCls}-feedback-active`]: score === 1,
});
const { call } = useContext(ChartItemContext);
return (
<div className={prefixCls}>
{!isMobile && (
<div className={`${prefixCls}-feedback`}>
{/* <div>这个回答正确吗?</div> */}
<div className={`${prefixCls}-feedback-left`}>
{!isParserError && (
<>
<Button
size="small"
onClick={() => {
setExportLoading(true);
onExportData?.();
setTimeout(() => {
setExportLoading(false);
}, 1000);
}}
type="text"
loading={exportLoading}
>
<DownloadOutlined />
<span className={`${prefixCls}-font-style`}></span>
</Button>
{!isSimpleMode && (
<Button
size="small"
onClick={() => {
call('downloadChartAsImage');
}}
type="text"
>
<FileJpgOutlined />
<span className={`${prefixCls}-font-style`}></span>
</Button>
)}
{isLastMessage && (
<Button
size="small"
onClick={() => {
onReExecute?.(queryId);
}}
type="text"
>
<RedoOutlined />
<span className={`${prefixCls}-font-style`}></span>
</Button>
)}
</>
)}
</div>
<div className={`${prefixCls}-feedback-left`}>
<LikeOutlined className={likeClass} onClick={like} style={{ marginRight: 10 }} />
<DislikeOutlined
className={dislikeClass}
onClick={e => {
e.stopPropagation();
dislike();
}}
/>
</div>
</div>
)}
</div>
);
};
export default Tools;