DeekSeekHome.tsx 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import * as React from 'react';
  2. import { useNavigate } from "react-router-dom";
  3. import { Dropdown, Spin, Input, Button, Space, UploadProps } from 'antd';
  4. import { Chat } from './DeepSeekChat';
  5. import whiteLogo from "../icons/whiteLogo.png";
  6. import jkxz from "../icons/jkxz.png";
  7. import { useChatStore, useGlobalStore } from "../store";
  8. import { useMobileScreen } from '../utils';
  9. import api from "@/app/api/api";
  10. import './deepSeekHome.scss';
  11. import { message, Upload } from 'antd';
  12. import { InboxOutlined } from '@ant-design/icons';
  13. const { Dragger } = Upload;
  14. const DeekSeek: React.FC = () => {
  15. const chatStore = useChatStore();
  16. const globalStore = useGlobalStore();
  17. useGlobalStore((state) => state.setIsChatActive);
  18. const isMobileScreen = useMobileScreen();
  19. const navigate = useNavigate();
  20. const [listLoading, setListLoading] = React.useState(false);
  21. const [userInput, setUserInput] = React.useState(''); // 新增状态:用户输入
  22. type List = {
  23. title: string,
  24. children: {
  25. title: string,
  26. showMenu: string,
  27. chatMode: string,
  28. appId: string,
  29. children: List[number]['children'],
  30. }[],
  31. }[];
  32. const [list, setList] = React.useState<List>([]);
  33. const init = async () => {
  34. setListLoading(true);
  35. try {
  36. const res = await api.get('/deepseek/api/appType');
  37. setList(res.data);
  38. } catch (error) {
  39. console.error(error);
  40. } finally {
  41. setListLoading(false);
  42. }
  43. }
  44. React.useEffect(() => {
  45. chatStore.clearSessions();
  46. const userInfo = localStorage.getItem('userInfo');
  47. if (userInfo) {
  48. init();
  49. }
  50. }, []);
  51. React.useEffect(() => {
  52. globalStore.setDocuments([]);
  53. globalStore.setIsChatActive(false);
  54. setFileList([]);
  55. }, []);
  56. React.useEffect(() => {
  57. globalStore.setDocuments([]);
  58. setFileList([]);
  59. }, [globalStore.isChatActive]);
  60. const [fileList, setFileList] = React.useState<any[]>([]);
  61. const props: UploadProps = {
  62. action: '/deepseek-api' + '/upload/file',
  63. method: 'POST',
  64. accept: ['.docx'].join(','),
  65. multiple: true,
  66. maxCount: 5,
  67. fileList: fileList,
  68. onChange(info) {
  69. const fileList = info.fileList.map((file) => {
  70. const data = file.response;
  71. return {
  72. ...file,
  73. documentId: data?.document_id || '',
  74. name: file.name,
  75. url: data?.document_url || file.url,
  76. }
  77. });
  78. setFileList(fileList);
  79. if (info.file.status === 'done') {// 上传成功
  80. const { code, message: msg } = info.file.response;
  81. if (code === 200) {
  82. message.success('上传成功');
  83. } else {
  84. message.error(msg);
  85. }
  86. } else if (info.file.status === 'error') {// 上传失败
  87. message.error('上传失败');
  88. }
  89. },
  90. onDrop(e) {
  91. console.log('Dropped files', e.dataTransfer.files);
  92. },
  93. };
  94. return (
  95. <Spin spinning={listLoading}>
  96. <div className='deekSeek'>
  97. {/* 主要区域 */}
  98. <div className='deekSeek-main'>
  99. {!globalStore.isChatActive ? (
  100. // 未交互状态:显示简化对话框
  101. <div className='deekSeek-content'>
  102. <div className='deekSeek-content-title'>
  103. <img src={jkxz.src} />
  104. </div>
  105. <div className='deekSeek-content-title-sm' style={{ marginBottom: 40 }}>
  106. 您好, 我是小智文件处理助手!
  107. </div>
  108. {/* 输入区域 */}
  109. <div className='deekSeek-input-section'>
  110. <Dragger {...props}>
  111. <p className="ant-upload-drag-icon">
  112. <InboxOutlined />
  113. </p>
  114. <p className="ant-upload-text">请上传.docx格式文件</p>
  115. </Dragger>
  116. </div>
  117. <div style={{ margin: 5 }}>
  118. <Button
  119. type='primary'
  120. onClick={() => {
  121. globalStore.setDocuments(fileList.map(item => {
  122. return {
  123. id: item.documentId,
  124. name: item.name,
  125. url: item.url,
  126. }
  127. }));
  128. globalStore.setIsChatActive(true);
  129. }}
  130. disabled={fileList.filter(item => item.documentId).length === 0}
  131. >
  132. 开始解析
  133. </Button>
  134. </div>
  135. {/* 底部提示 */}
  136. <div className='deekSeek-footer-text'>
  137. 内容由AI生成,仅供参考
  138. </div>
  139. </div>
  140. ) : (
  141. // 激活状态:显示完整对话界面
  142. <div className='deekSeek-content'>
  143. <div className='deekSeek-content-title'>
  144. <img src={jkxz.src} />
  145. </div>
  146. <div className='deekSeek-content-title-sm' style={{ marginBottom: isMobileScreen ? 14 : 20 }}>
  147. 智能问答助手
  148. </div>
  149. <div className={isMobileScreen ? 'deekSeek-content-mobile' : 'deekSeek-content-pc'}>
  150. <Chat />
  151. </div>
  152. </div>
  153. )}
  154. </div>
  155. </div>
  156. </Spin >
  157. );
  158. };
  159. export default DeekSeek;