redux-form + react-dropzone

Подскажите как подвязать react-dropzone к redux-form. Обвернуть в компонент оказалось недостаточным. Хочу реализовать возможность закидывать файлы, удалять их. Сейчас же файл если добавлять файлы по очереди они очищаются. Не знаю нужно ли делать стейт, ведь есть редакс форма.

import React, {useMemo, useState} from 'react';
import { Box, Grid, TextField } from '@material-ui/core/';
import { compose } from 'redux';
import { connect } from 'react-redux';
import { Field, reduxForm } from 'redux-form';
import {useDropzone} from 'react-dropzone';

const baseStyle = {
  flex: 1,
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
  padding: '20px',
  borderWidth: 2,
  borderRadius: 2,
  borderColor: '#eeeeee',
  borderStyle: 'dashed',
  backgroundColor: '#fafafa',
  color: '#bdbdbd',
  outline: 'none',
  transition: 'border .24s ease-in-out'
};

const activeStyle = {
  borderColor: '#2196f3'
};

const acceptStyle = {
  borderColor: '#00e676'
};

const rejectStyle = {
  borderColor: '#ff1744'
};

const ReduxUpload = (props) => {
  const [files, setFiles] = useState([]);
  const {
    acceptedFiles,
    getRootProps,
    getInputProps,
    isDragActive,
    isDragAccept,
    isDragReject
  } = useDropzone({
 
    onDrop: acceptedFiles => {
      setFiles(acceptedFiles.map(file => Object.assign(file, {
        preview: URL.createObjectURL(file)
      })));
    }
  });

  const style = useMemo(() => ({
    ...baseStyle,
    ...(isDragActive ? activeStyle : {}),
    ...(isDragAccept ? acceptStyle : {}),
    ...(isDragReject ? rejectStyle : {})
  }), [
    isDragActive,
    isDragReject,
    isDragAccept
  ]);

  return (
    <div className="container">
      <div {...getRootProps({style})}>
        <input {...getInputProps()} />
        <p>Drag 'n' drop some files here, or click to select files</p>
      </div>
      <aside>
        <h4>Files</h4>
        <ul>
          {
            files.map(file => (
              <li key={file.path}>
                {file.path} - {file.size} bytes
                <button>Delete</button>
              </li>
            ))
          }
        </ul>
      </aside>
    </div>
  );
}

const renderTextField = ({
  label,
  input,
  meta: { touched, invalid, error },
  ...custom
}) => (
  <TextField
    label={label}
    placeholder={label}
    error={touched && invalid}
    helperText={touched && error}
    {...input}
    {...custom}
  />
)


const Upload = () => {
  return (
    <div>
      <Field
        name="firstName"
        component={renderTextField}
        label="First Name"
      />
      <Field
        name="uploader"
        component={ReduxUpload}
      />
    </div>
    
  );
};

export default compose(
  reduxForm({
    form: 'example',
    initialValues: {
      firstName: 'files'
    }
  }),
)(Upload);

Ответы (0 шт):