| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | import type { ChangeEvent, FC } from 'react'import { useState } from 'react'import { useLocalFileUploader } from './hooks'import type { ImageFile } from '@/types/app'import { ALLOW_FILE_EXTENSIONS } from '@/types/app'type UploaderProps = {  children: (hovering: boolean) => JSX.Element  onUpload: (imageFile: ImageFile) => void  closePopover?: () => void  limit?: number  disabled?: boolean}const Uploader: FC<UploaderProps> = ({  children,  onUpload,  closePopover,  limit,  disabled,}) => {  const [hovering, setHovering] = useState(false)  const { handleLocalFileUpload } = useLocalFileUploader({    limit,    onUpload,    disabled,  })  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {    const file = e.target.files?.[0]    if (!file)      return    handleLocalFileUpload(file)    closePopover?.()  }  return (    <div      className='relative'      onMouseEnter={() => setHovering(true)}      onMouseLeave={() => setHovering(false)}    >      {children(hovering)}      <input        className='absolute block inset-0 opacity-0 text-[0] w-full disabled:cursor-not-allowed cursor-pointer'        onClick={e => ((e.target as HTMLInputElement).value = '')}        type='file'        accept={ALLOW_FILE_EXTENSIONS.map(ext => `.${ext}`).join(',')}        onChange={handleChange}        disabled={disabled}      />    </div>  )}export default Uploader
 |