doc-upload.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { ChatContext } from '@/app/chat-context';
  2. import { apiInterceptors, uploadDocument } from '@/client/api';
  3. import useSummary from '@/hooks/use-summary';
  4. import { PaperClipOutlined } from '@ant-design/icons';
  5. import { Button, Upload } from 'antd';
  6. import { useContext, useState } from 'react';
  7. interface IProps {
  8. className?: string;
  9. handleFinish?: (data: boolean) => void;
  10. onUploadFinish: () => void;
  11. }
  12. export default function DocUpload(props: IProps) {
  13. const { dbParam, setDocId } = useContext(ChatContext);
  14. const { onUploadFinish, handleFinish } = props;
  15. const summary = useSummary();
  16. const [loading, setLoading] = useState<boolean>(false);
  17. const handleUpload = async (data: any) => {
  18. setLoading(true);
  19. const formData = new FormData();
  20. formData.append('doc_name', data.file.name);
  21. formData.append('doc_file', data.file);
  22. formData.append('doc_type', 'DOCUMENT');
  23. const res = await apiInterceptors(uploadDocument(dbParam || 'default', formData));
  24. if (!res[1]) {
  25. setLoading(false);
  26. return;
  27. }
  28. setDocId(res[1]);
  29. onUploadFinish();
  30. setLoading(false);
  31. handleFinish?.(true);
  32. await summary(res[1]);
  33. handleFinish?.(false);
  34. };
  35. return (
  36. <Upload
  37. customRequest={handleUpload}
  38. showUploadList={false}
  39. maxCount={1}
  40. multiple={false}
  41. className='absolute z-10 top-2 left-2'
  42. accept='.pdf,.ppt,.pptx,.xls,.xlsx,.doc,.docx,.txt,.md'
  43. >
  44. <Button loading={loading} size='small' shape='circle' icon={<PaperClipOutlined />}></Button>
  45. </Upload>
  46. );
  47. }