|
import { Authorization } from '@/constants/authorization'; |
|
import { getAuthorization } from '@/utils/authorization-util'; |
|
import { PlusOutlined } from '@ant-design/icons'; |
|
import type { GetProp, UploadFile, UploadProps } from 'antd'; |
|
import { Image, Input, Upload } from 'antd'; |
|
import { useState } from 'react'; |
|
import { useGetChatSearchParams } from '../chat/hooks'; |
|
|
|
type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0]; |
|
|
|
const getBase64 = (file: FileType): Promise<string> => |
|
new Promise((resolve, reject) => { |
|
const reader = new FileReader(); |
|
reader.readAsDataURL(file); |
|
reader.onload = () => resolve(reader.result as string); |
|
reader.onerror = (error) => reject(error); |
|
}); |
|
|
|
const InputWithUpload = () => { |
|
const [previewOpen, setPreviewOpen] = useState(false); |
|
const [previewImage, setPreviewImage] = useState(''); |
|
const { conversationId } = useGetChatSearchParams(); |
|
const [fileList, setFileList] = useState<UploadFile[]>([ |
|
{ |
|
uid: '-1', |
|
name: 'image.png', |
|
status: 'done', |
|
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', |
|
}, |
|
{ |
|
uid: '-2', |
|
name: 'image.png', |
|
status: 'done', |
|
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', |
|
}, |
|
{ |
|
uid: '-3', |
|
name: 'image.png', |
|
status: 'done', |
|
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', |
|
}, |
|
{ |
|
uid: '-4', |
|
name: 'image.png', |
|
status: 'done', |
|
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', |
|
}, |
|
{ |
|
uid: '-xxx', |
|
percent: 50, |
|
name: 'image.png', |
|
status: 'uploading', |
|
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', |
|
}, |
|
{ |
|
uid: '-5', |
|
name: 'image.png', |
|
status: 'error', |
|
}, |
|
]); |
|
|
|
const handlePreview = async (file: UploadFile) => { |
|
if (!file.url && !file.preview) { |
|
file.preview = await getBase64(file.originFileObj as FileType); |
|
} |
|
|
|
setPreviewImage(file.url || (file.preview as string)); |
|
setPreviewOpen(true); |
|
}; |
|
|
|
const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => |
|
setFileList(newFileList); |
|
|
|
const uploadButton = ( |
|
<button style={{ border: 0, background: 'none' }} type="button"> |
|
<PlusOutlined /> |
|
<div style={{ marginTop: 8 }}>Upload</div> |
|
</button> |
|
); |
|
return ( |
|
<> |
|
<Input placeholder="Basic usage"></Input> |
|
<Upload |
|
action="/v1/document/upload_and_parse" |
|
listType="picture-card" |
|
fileList={fileList} |
|
onPreview={handlePreview} |
|
onChange={handleChange} |
|
multiple |
|
headers={{ [Authorization]: getAuthorization() }} |
|
data={{ conversation_id: '9e9f7d2453e511efb18efa163e197198' }} |
|
method="post" |
|
> |
|
{fileList.length >= 8 ? null : uploadButton} |
|
</Upload> |
|
{previewImage && ( |
|
<Image |
|
wrapperStyle={{ display: 'none' }} |
|
preview={{ |
|
visible: previewOpen, |
|
onVisibleChange: (visible) => setPreviewOpen(visible), |
|
afterOpenChange: (visible) => !visible && setPreviewImage(''), |
|
}} |
|
src={previewImage} |
|
/> |
|
)} |
|
</> |
|
); |
|
}; |
|
|
|
export default () => { |
|
return ( |
|
<section style={{ height: 500, width: 400 }}> |
|
<div style={{ height: 200 }}></div> |
|
<InputWithUpload></InputWithUpload> |
|
</section> |
|
); |
|
}; |
|
|