| 
									
										
										
										
											2024-10-21 10:32:37 +08:00
										 |  |  | 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) => { | 
					
						
							| 
									
										
										
										
											2024-11-01 15:45:27 +08:00
										 |  |  |   const { id, name, type, progress, supportFileType, base64Url, url, isRemote } = file | 
					
						
							|  |  |  |   const ext = getFileExtension(name, type, isRemote) | 
					
						
							| 
									
										
										
										
											2024-10-21 10:32:37 +08:00
										 |  |  |   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} | 
					
						
							|  |  |  |         > | 
					
						
							| 
									
										
										
										
											2024-11-01 15:45:27 +08:00
										 |  |  |           <div className='truncate'>{name}</div> | 
					
						
							| 
									
										
										
										
											2024-10-21 10:32:37 +08:00
										 |  |  |         </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> | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2024-11-01 15:45:27 +08:00
										 |  |  |           { | 
					
						
							|  |  |  |             !!file.size && ( | 
					
						
							|  |  |  |               <span>{formatFileSize(file.size)}</span> | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2024-10-21 10:32:37 +08:00
										 |  |  |         </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) |