import { forwardRef, useEffect, useId, useImperativeHandle, useRef, useState, type RefObject } from 'react' import VectorIconTop from '../../vectors/top.svg' import './styles/File.css' import type { BackendLimit } from '../../functions/BackendTypes' export interface PropsForInputFile { limits: BackendLimit['upload'] | undefined } export interface HandleForInputFile { getPreview: () => HTMLVideoElement | HTMLImageElement | undefined getValue: () => File | undefined } const InputFile = forwardRef(({ limits }, ref) => { const componentID = useId() const previewRef = useRef(undefined) const inputRef = useRef(null) const [fileInstance, setFileInstance] = useState() const [fileObjectURL, setFileObjectURL] = useState() function updateInput(file?: File) { if (fileObjectURL) { URL.revokeObjectURL(fileObjectURL) } const accept = file && !!limits?.mime_types.find((t) => file.type === t) if (accept) { setFileObjectURL(URL.createObjectURL(file)) setFileInstance(file) } else { setFileObjectURL(undefined) setFileInstance(undefined) } } useImperativeHandle(ref, () => ({ getPreview: () => previewRef.current, getValue: () => fileInstance, })) useEffect(() => { return () => { fileObjectURL && URL.revokeObjectURL(fileObjectURL) } }, [fileObjectURL]) return (
inputRef.current?.click()} onDragOver={(e) => e.preventDefault()} onDrop={(e) => { e.preventDefault() updateInput(e.dataTransfer.files.item(0)!) }}> { e.preventDefault() updateInput(e.target.files?.item(0) ?? undefined) }} /> {!fileInstance && (
DRAG OR CLICK TO UPLOAD A FILE {limits && ( MAX: {limits.video_width_max} × {limits.video_height_max}; SIZE:{' '} {Math.floor(limits.filesize / 1024 / 1024)}MB; DURATION:{' '} {Math.floor(limits.duration / 10) * 10} SECS; )}
)} {fileInstance && (
{fileInstance.type.startsWith('video') && (
)}
) }) export default InputFile