12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import React from "react";
- import { FileItem } from '../upload/interface';
- import Image from '../image';
- import { IconBriefStroked, IconClear } from '@douyinfe/semi-icons';
- import { strings, cssClasses } from '@douyinfe/semi-foundation/chat/constants';
- import cls from 'classnames';
- import { Progress } from "../index";
- const { PREFIX_ATTACHMENT, } = cssClasses;
- const { PIC_SUFFIX_ARRAY, PIC_PREFIX } = strings;
- interface AttachmentProps {
- className?: string;
- attachment?: FileItem[];
- onClear?: (item: FileItem) => void;
- showClear?: boolean
- }
- interface FileProps {
- url?: string;
- name?: string;
- size?: string;
- type?: string;
- }
- export const FileAttachment = React.memo((props: FileProps) => {
- const { url, name, size, type } = props;
- return <a
- href={url}
- target="_blank"
- className={`${PREFIX_ATTACHMENT}-file`} rel="noreferrer"
- >
- <IconBriefStroked size="extra-large" className={`${PREFIX_ATTACHMENT}-file-icon`}/>
- <div className={`${PREFIX_ATTACHMENT}-file-info`}>
- <span className={`${PREFIX_ATTACHMENT}-file-title`}>{name}</span>
- <span className={`${PREFIX_ATTACHMENT}-file-metadata`}>
- <span className={`${PREFIX_ATTACHMENT}-file-type`}>{type}</span>
- {type ? ' · ' : ''}{size}
- </span>
- </div>
- </a>
- })
- export const ImageAttachment = React.memo((props: {src: string}) => {
- const { src } = props;
- return <Image
- className={`${PREFIX_ATTACHMENT}-img`}
- width={60}
- height={60}
- src={src}
- />
- })
- const Attachment = React.memo((props: AttachmentProps) => {
- const { attachment, onClear, showClear = true, className } = props;
- return (
- <div
- className={cls(PREFIX_ATTACHMENT, { [className]: className })}
- >
- {
- attachment.map(item => {
- const { percent, status } = item;
- const suffix = item?.name.split('.').pop();
- const isImg = item?.fileInstance?.type?.startsWith(PIC_PREFIX) || PIC_SUFFIX_ARRAY.includes(suffix);
- const realType = suffix ?? item?.fileInstance?.type?.split('/').pop();
- const showProcess = !(percent === 100 || typeof percent === 'undefined') && status === 'uploading';
- return <div
- className={`${PREFIX_ATTACHMENT}-item`}
- key={item.uid}
- >
- {isImg ? (
- <ImageAttachment src={item.url} />
- ) : (
- <FileAttachment
- url={item.url}
- name={item.name}
- size={item.size}
- type={realType}
- />
- )}
- {showClear && <IconClear
- size="large"
- className={`${PREFIX_ATTACHMENT}-clear`}
- onClick={()=> {
- onClear && onClear(item);
- }}
- />}
- {showProcess && <Progress percent={percent} type="circle" size="small" width={30} className={`${PREFIX_ATTACHMENT}-process`} aria-label="upload progress" />}
- </div>;
- })
- }
- </div>
- );
- });
- export default Attachment;
|