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