| 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 |
|
|