import React, { useState, useEffect } from 'react'; import { Upload } from 'antd'; import clasnames from 'classnames'; import { FileOutlined, DeleteFilled } from '@easyv/react-icons'; import { FileTypeEnum, FileInfo } from '@easytwin/core'; import DefaultProviewImg from '@/assets/img/default_preview.png'; import EmptyFileImg from '@/assets/img/empty_file.png'; import { ProButton, ProButtonProp } from '@/components'; import { FileApi } from '@/server'; type DefaultPreviewImgModeType = 'emptyFile' | 'emptyPreview'; type ChangedValueType = 'info' | 'string'; const DefaultPreviewImgs: Record = { emptyFile: EmptyFileImg, emptyPreview: DefaultProviewImg, }; export interface FileCardProp { value?: string | null; className?: string; innerContextClassName?: string; mode?: FileTypeEnum; uploadAccept?: string; hoverContent?: React.ReactNode; uploadBtnProType?: ProButtonProp['proType']; hoverContentExtra?: React.ReactNode; defaultPreviewImgMode?: DefaultPreviewImgModeType; backgroundSize?: string; changedValueType?: ChangedValueType; showDeleteBtn?: boolean; onChange?: (info: FileInfo | string) => void; onRemove?: (info: FileInfo | string) => void; } const FileCard: React.FC = function ({ value: _url = '', className, innerContextClassName, mode = FileTypeEnum.IMAGE, uploadAccept = 'image/*', hoverContent, uploadBtnProType, hoverContentExtra, defaultPreviewImgMode = 'emptyFile', backgroundSize = 'contain', changedValueType = 'string', showDeleteBtn = true, onChange, onRemove, }) { const [url, setUrl] = useState(''); useEffect(() => { setUrl(_url || ''); }, [_url]); const handleCreateFileInfo = React.useCallback( async (file: File) => { console.log(file); const url = await FileApi.upload(`/${mode}/${file.name}`, file); setUrl(url); onChange?.(url); return false; }, [changedValueType, onChange], ); const innerRender = (url: string) => { switch (mode) { case FileTypeEnum.IMAGE: return (
); default: return (
{url}
); } }; return (
{url ? ( innerRender(url) ) : (
)}
{hoverContent || ( <> {/* */}
{/* */} {url ? '更新' : '上传'} {/* */} {hoverContentExtra}
{/* */}
{url && showDeleteBtn && ( onRemove?.(url)} /> )}
)}
); }; export default FileCard;