|
@@ -8,18 +8,22 @@ import classNames from 'classnames'
|
|
|
|
|
|
import { ImagePlus } from '../icons/src/vender/line/images'
|
|
|
import { useDraggableUploader } from './hooks'
|
|
|
+import { checkIsAnimatedImage } from './utils'
|
|
|
import { ALLOW_FILE_EXTENSIONS } from '@/types/app'
|
|
|
|
|
|
type UploaderProps = {
|
|
|
className?: string
|
|
|
onImageCropped?: (tempUrl: string, croppedAreaPixels: Area, fileName: string) => void
|
|
|
+ onUpload?: (file?: File) => void
|
|
|
}
|
|
|
|
|
|
const Uploader: FC<UploaderProps> = ({
|
|
|
className,
|
|
|
onImageCropped,
|
|
|
+ onUpload,
|
|
|
}) => {
|
|
|
const [inputImage, setInputImage] = useState<{ file: File; url: string }>()
|
|
|
+ const [isAnimatedImage, setIsAnimatedImage] = useState<boolean>(false)
|
|
|
useEffect(() => {
|
|
|
return () => {
|
|
|
if (inputImage)
|
|
@@ -34,12 +38,19 @@ const Uploader: FC<UploaderProps> = ({
|
|
|
if (!inputImage)
|
|
|
return
|
|
|
onImageCropped?.(inputImage.url, croppedAreaPixels, inputImage.file.name)
|
|
|
+ onUpload?.(undefined)
|
|
|
}
|
|
|
|
|
|
const handleLocalFileInput = (e: ChangeEvent<HTMLInputElement>) => {
|
|
|
const file = e.target.files?.[0]
|
|
|
- if (file)
|
|
|
+ if (file) {
|
|
|
setInputImage({ file, url: URL.createObjectURL(file) })
|
|
|
+ checkIsAnimatedImage(file).then((isAnimatedImage) => {
|
|
|
+ setIsAnimatedImage(!!isAnimatedImage)
|
|
|
+ if (isAnimatedImage)
|
|
|
+ onUpload?.(file)
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
const {
|
|
@@ -52,6 +63,26 @@ const Uploader: FC<UploaderProps> = ({
|
|
|
|
|
|
const inputRef = createRef<HTMLInputElement>()
|
|
|
|
|
|
+ const handleShowImage = () => {
|
|
|
+ if (isAnimatedImage) {
|
|
|
+ return (
|
|
|
+ <img src={inputImage?.url} alt='' />
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Cropper
|
|
|
+ image={inputImage?.url}
|
|
|
+ crop={crop}
|
|
|
+ zoom={zoom}
|
|
|
+ aspect={1}
|
|
|
+ onCropChange={setCrop}
|
|
|
+ onCropComplete={onCropComplete}
|
|
|
+ onZoomChange={setZoom}
|
|
|
+ />
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
return (
|
|
|
<div className={classNames(className, 'w-full px-3 py-1.5')}>
|
|
|
<div
|
|
@@ -79,15 +110,7 @@ const Uploader: FC<UploaderProps> = ({
|
|
|
</div>
|
|
|
<div className="text-xs pointer-events-none">Supports PNG, JPG, JPEG, WEBP and GIF</div>
|
|
|
</>
|
|
|
- : <Cropper
|
|
|
- image={inputImage.url}
|
|
|
- crop={crop}
|
|
|
- zoom={zoom}
|
|
|
- aspect={1}
|
|
|
- onCropChange={setCrop}
|
|
|
- onCropComplete={onCropComplete}
|
|
|
- onZoomChange={setZoom}
|
|
|
- />
|
|
|
+ : handleShowImage()
|
|
|
}
|
|
|
</div>
|
|
|
</div>
|