| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | import { useState } from 'react'import {  RiCloseLine,  RiDownloadLine,} from '@remixicon/react'import FileImageRender from '../file-image-render'import type { FileEntity } from '../types'import {  downloadFile,  fileIsUploaded,} from '../utils'import Button from '@/app/components/base/button'import ProgressCircle from '@/app/components/base/progress-bar/progress-circle'import { ReplayLine } from '@/app/components/base/icons/src/vender/other'import ImagePreview from '@/app/components/base/image-uploader/image-preview'type FileImageItemProps = {  file: FileEntity  showDeleteAction?: boolean  showDownloadAction?: boolean  canPreview?: boolean  onRemove?: (fileId: string) => void  onReUpload?: (fileId: string) => void}const FileImageItem = ({  file,  showDeleteAction,  showDownloadAction,  canPreview,  onRemove,  onReUpload,}: FileImageItemProps) => {  const { id, progress, base64Url, url, name } = file  const [imagePreviewUrl, setImagePreviewUrl] = useState('')  return (    <>      <div        className='group/file-image relative cursor-pointer'        onClick={() => canPreview && setImagePreviewUrl(url || '')}      >        {          showDeleteAction && (            <Button              className='hidden group-hover/file-image:flex absolute -right-1.5 -top-1.5 p-0 w-5 h-5 rounded-full z-[11]'              onClick={() => onRemove?.(id)}            >              <RiCloseLine className='w-4 h-4 text-components-button-secondary-text' />            </Button>          )        }        <FileImageRender          className='w-[68px] h-[68px] shadow-md'          imageUrl={base64Url || url || ''}          showDownloadAction={showDownloadAction}        />        {          progress >= 0 && !fileIsUploaded(file) && (            <div className='absolute inset-0 flex items-center justify-center border-[2px] border-effects-image-frame bg-background-overlay-alt z-10'>              <ProgressCircle                percentage={progress}                size={12}                circleStrokeColor='stroke-components-progress-white-border'                circleFillColor='fill-transparent'                sectorFillColor='fill-components-progress-white-progress'              />            </div>          )        }        {          progress === -1 && (            <div className='absolute inset-0 flex items-center justify-center border-[2px] border-state-destructive-border bg-background-overlay-destructive z-10'>              <ReplayLine                className='w-5 h-5'                onClick={() => onReUpload?.(id)}              />            </div>          )        }        {          showDownloadAction && (            <div className='hidden group-hover/file-image:block absolute inset-0.5 bg-background-overlay-alt bg-opacity-[0.3] z-10'>              <div                className='absolute bottom-0.5 right-0.5  flex items-center justify-center w-6 h-6 rounded-lg bg-components-actionbar-bg shadow-md'                onClick={(e) => {                  e.stopPropagation()                  downloadFile(url || '', name)                }}              >                <RiDownloadLine className='w-4 h-4 text-text-tertiary' />              </div>            </div>          )        }      </div>      {        imagePreviewUrl && canPreview && (          <ImagePreview            title={name}            url={imagePreviewUrl}            onCancel={() => setImagePreviewUrl('')}          />        )      }    </>  )}export default FileImageItem
 |