import React, { ReactNode, useId, useRef, useState } from "react"; import { AssetType } from "~/enums"; import { UploadModalObject } from "~/components"; import { twMerge } from "tailwind-merge"; interface Props { render: (parentId: string) => ReactNode; fileTypes?: string[]; onChange?: (file?: React.ChangeEvent) => void; onSuccess: () => void; panelClass?: string; type: AssetType; } export function FileWrapper({ render, fileTypes = [], onSuccess, type, ...rest }: Props) { const fileRef = useRef(null); const [file, setFile] = useState(); const [modalOpen, setModalOpen] = useState(false); const [resetModal, setResetModal] = useState(false); const [dragging, setDragging] = useState(false); const id = "file-input-" + useId(); const accept = fileTypes .map((fileType) => `.${fileType.toLowerCase()}`) .join(","); const clearFile = () => { if (fileRef.current !== null) { fileRef.current.value = ""; setFile(undefined); } }; const closeModal = () => setModalOpen(false); const fileChange = (event: React.ChangeEvent) => { setResetModal(true); event.preventDefault(); setFile(event.target?.files?.[0]); setModalOpen(true); }; const onDragDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); }; const onDragEvent = (onOff: boolean) => (event: React.DragEvent): void => { setDragging(onOff); onDragDrop(event); }; const onDrop = (event: React.DragEvent): void => { setDragging(false); onDragDrop(event); if (event.dataTransfer.files && event.dataTransfer.files[0]) { setResetModal(true); setFile(event.dataTransfer.files[0]); setModalOpen(true); } }; return (
{render(id)}
); }