import React, { useEffect, useCallback, useState } from 'react'; import { useField } from '@unform/core'; import { useDropzone } from 'react-dropzone'; import { FiX } from 'react-icons/fi'; import { v4 as uuid } from 'uuid'; import { formatBytes } from '../../../helpers/formatBytes'; import { Card } from '../../Card'; import { Flex } from '../../Flex'; import { Heading } from '../../Heading'; import { IconButton } from '../../IconButton'; import { Separator } from '../../Separator'; import { Text } from '../../Text'; import { Error } from '../styles'; import { Container, PreviewItem } from './styles'; interface Props { name: string; multiple?: boolean; } type InputProps = JSX.IntrinsicElements['input'] & Props; export function FileInput({ name, multiple = true }: InputProps): JSX.Element { const { fieldName, registerField, error } = useField(name); const [files, setFiles] = useState<{ id: string; file: File }[]>([]); const onDrop = useCallback( (acceptedFiles: File[]) => { if (multiple) { setFiles((prevState) => [ ...prevState, ...acceptedFiles.map((file) => ({ id: uuid(), file })), ]); } else { setFiles([{ id: uuid(), file: acceptedFiles[0] }]); } }, [multiple], ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, }); useEffect(() => { registerField({ name: fieldName, getValue: () => { if (multiple) { return files.map((item) => item.file); } return files[0].file; }, clearValue() { setFiles([]); }, setValue(_, value: File | File[]) { console.log(value); }, }); }, [fieldName, registerField, files, multiple]); return (
{isDragActive ? ( Drop the file{multiple && 's'} here... ) : ( <> Select a file{multiple && 's'} to upload or drag and drop it here )}
{!!files.length && ( {files.map((item, index) => (
{index > 0 && }
{item.file.name} {formatBytes(item.file.size)} } variant="ghost" colorScheme="gray" onClick={() => setFiles((prevState) => prevState.filter((fileItem) => fileItem.id !== item.id), ) } />
))} )} {error && {error}} ); }