import * as React from 'react' import { useEffect, useState } from 'react' import Compressor from '@uppy/compressor' import Uppy from '@uppy/core' import { DashboardModal } from '@uppy/react' import { Button, DownloadStaticFile } from 'oa-components' import { Flex } from 'theme-ui' import { UPPY_CONFIG } from './UppyConfig' import type { UppyFile } from '@uppy/core' import '@uppy/core/dist/style.css' import '@uppy/dashboard/dist/style.css' interface IUppyFiles { [key: string]: UppyFile } interface IProps { onFilesChange?: (files: (Blob | File)[]) => void 'data-cy'?: string } interface IState { open: boolean } export const FileInput = (props: IProps) => { const [state, setState] = useState({ open: false }) const [uppy] = useState(() => new Uppy({ ...UPPY_CONFIG, onBeforeUpload: () => uploadTriggered() }).use( Compressor, ), ) useEffect(() => { return () => { uppy.close() } }, []) const files = () => { const files = uppy.getState().files as IUppyFiles return files } const filesArray = () => { return Object.values(files()).map((meta) => meta.data) as File[] } // when upload button clicked just want to clise modal and reflect files const uploadTriggered = () => { toggleModal() return files() } const toggleModal = () => { setState((state) => ({ open: !state.open })) triggerCallback() } // reflect changes to current files whenever modal open or closed const triggerCallback = () => { if (props.onFilesChange) { props.onFilesChange(filesArray()) } } const showFileList = filesArray().length > 0 return ( {showFileList ? ( <> {filesArray().map((file) => ( ))} ) : ( )} toggleModal()} /> ) }