Spaces:
Build error
Build error
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 | |