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