import { h, type FunctionComponent } from 'preact' import { useCallback, useRef, useState } from 'preact/hooks' import cn from 'classnames' // TODO when form resets after update the previous image flashes quickly after setImageSrc(null) and before new defaultValue propagates type Styles = { base?: string element?: string label?: string noMargin?: string touched?: string image?: string } type Options = { styles: Styles } type Props = { autoFocus?: boolean className?: string defaultValue?: any disabled?: boolean label?: string name?: string noMargin?: boolean placeholder?: string required?: boolean } export default function fileUploadFactory({ styles }: Options) { const FileUpload: FunctionComponent = ({ autoFocus, className, defaultValue, disabled, label, name, noMargin, placeholder, required, }) => { const [touched, setTouched] = useState(false) const inputRef = useRef(null) const imgRef = useRef(null) const [imageSrc, setImageSrc] = useState(null) const onImageChange = useCallback((e: Event) => { e.preventDefault() const form = inputRef.current!.form! const onReset = () => { setTouched(false) setImageSrc(null) } form.addEventListener('reset', onReset) imgRef.current!.addEventListener('load', () => URL.revokeObjectURL(imgRef.current!.src), { once: true }) setImageSrc(URL.createObjectURL((e.currentTarget! as HTMLInputElement).files![0])) return () => form.removeEventListerner('reset', onReset) }, []) return (
) } return FileUpload }