| import { | |
| memo, | |
| } from 'react' | |
| import { | |
| RiDeleteBinLine, | |
| RiDownloadLine, | |
| } from '@remixicon/react' | |
| import FileTypeIcon from '../file-type-icon' | |
| import { | |
| fileIsUploaded, | |
| getFileAppearanceType, | |
| getFileExtension, | |
| } from '../utils' | |
| import FileImageRender from '../file-image-render' | |
| import type { FileEntity } from '../types' | |
| import ActionButton from '@/app/components/base/action-button' | |
| import ProgressCircle from '@/app/components/base/progress-bar/progress-circle' | |
| import { formatFileSize } from '@/utils/format' | |
| import cn from '@/utils/classnames' | |
| import { ReplayLine } from '@/app/components/base/icons/src/vender/other' | |
| import { SupportUploadFileTypes } from '@/app/components/workflow/types' | |
| type FileInAttachmentItemProps = { | |
| file: FileEntity | |
| showDeleteAction?: boolean | |
| showDownloadAction?: boolean | |
| onRemove?: (fileId: string) => void | |
| onReUpload?: (fileId: string) => void | |
| } | |
| const FileInAttachmentItem = ({ | |
| file, | |
| showDeleteAction, | |
| showDownloadAction = true, | |
| onRemove, | |
| onReUpload, | |
| }: FileInAttachmentItemProps) => { | |
| const { id, name, type, progress, supportFileType, base64Url, url, isRemote } = file | |
| const ext = getFileExtension(name, type, isRemote) | |
| const isImageFile = supportFileType === SupportUploadFileTypes.image | |
| return ( | |
| <div className={cn( | |
| 'flex items-center pr-3 h-12 rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg shadow-xs', | |
| progress === -1 && 'bg-state-destructive-hover border-state-destructive-border', | |
| )}> | |
| <div className='flex items-center justify-center w-12 h-12'> | |
| { | |
| isImageFile && ( | |
| <FileImageRender | |
| className='w-8 h-8' | |
| imageUrl={base64Url || url || ''} | |
| /> | |
| ) | |
| } | |
| { | |
| !isImageFile && ( | |
| <FileTypeIcon | |
| type={getFileAppearanceType(name, type)} | |
| size='lg' | |
| /> | |
| ) | |
| } | |
| </div> | |
| <div className='grow w-0 mr-1'> | |
| <div | |
| className='flex items-center mb-0.5 system-xs-medium text-text-secondary truncate' | |
| title={file.name} | |
| > | |
| <div className='truncate'>{name}</div> | |
| </div> | |
| <div className='flex items-center system-2xs-medium-uppercase text-text-tertiary'> | |
| { | |
| ext && ( | |
| <span>{ext.toLowerCase()}</span> | |
| ) | |
| } | |
| { | |
| ext && ( | |
| <span className='mx-1 system-2xs-medium'>•</span> | |
| ) | |
| } | |
| { | |
| !!file.size && ( | |
| <span>{formatFileSize(file.size)}</span> | |
| ) | |
| } | |
| </div> | |
| </div> | |
| <div className='shrink-0 flex items-center'> | |
| { | |
| progress >= 0 && !fileIsUploaded(file) && ( | |
| <ProgressCircle | |
| className='mr-2.5' | |
| percentage={progress} | |
| /> | |
| ) | |
| } | |
| { | |
| progress === -1 && ( | |
| <ActionButton | |
| className='mr-1' | |
| onClick={() => onReUpload?.(id)} | |
| > | |
| <ReplayLine className='w-4 h-4 text-text-tertiary' /> | |
| </ActionButton> | |
| ) | |
| } | |
| { | |
| showDeleteAction && ( | |
| <ActionButton onClick={() => onRemove?.(id)}> | |
| <RiDeleteBinLine className='w-4 h-4' /> | |
| </ActionButton> | |
| ) | |
| } | |
| { | |
| showDownloadAction && ( | |
| <ActionButton | |
| size='xs' | |
| > | |
| <RiDownloadLine className='w-3.5 h-3.5 text-text-tertiary' /> | |
| </ActionButton> | |
| ) | |
| } | |
| </div> | |
| </div> | |
| ) | |
| } | |
| export default memo(FileInAttachmentItem) | |