2020-02-17 11:09:45 +01:00
|
|
|
import React, { createRef, useState } from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { Button } from '@buffetjs/core';
|
|
|
|
import { useGlobalContext } from 'strapi-helper-plugin';
|
|
|
|
import getTrad from '../../utils/getTrad';
|
|
|
|
import Cloud from '../../icons/Cloud';
|
|
|
|
import Label from './Label';
|
|
|
|
import Input from './Input';
|
|
|
|
import P from './P';
|
|
|
|
|
|
|
|
const InputFile = ({ name, onChange }) => {
|
|
|
|
const [isDragging, setIsDragging] = useState(false);
|
|
|
|
const { formatMessage } = useGlobalContext();
|
|
|
|
const ref = createRef();
|
|
|
|
|
|
|
|
const handleAllowDrop = e => e.preventDefault();
|
|
|
|
|
|
|
|
const handleChange = ({ target: { files } }) => {
|
|
|
|
onChange({ target: { name, value: files } });
|
|
|
|
};
|
|
|
|
|
2020-02-19 13:40:36 +01:00
|
|
|
const handleClick = () => {
|
|
|
|
ref.current.click();
|
|
|
|
};
|
|
|
|
|
2020-02-17 11:09:45 +01:00
|
|
|
const handleDragEnter = () => {
|
|
|
|
setIsDragging(true);
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleDragLeave = () => {
|
|
|
|
setIsDragging(false);
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleDrop = e => {
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
|
|
setIsDragging(false);
|
|
|
|
onChange({ target: { name, value: e.dataTransfer.files } });
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2020-02-19 13:40:36 +01:00
|
|
|
<Label
|
|
|
|
htmlFor={name}
|
|
|
|
isDragging={isDragging}
|
|
|
|
onDragOver={handleAllowDrop}
|
|
|
|
onDragEnter={handleDragEnter}
|
|
|
|
onDrop={handleDrop}
|
|
|
|
>
|
|
|
|
<Cloud />
|
|
|
|
<P>
|
|
|
|
<span className="bold">
|
|
|
|
{formatMessage({ id: getTrad('input.label-bold') })}
|
|
|
|
</span>
|
|
|
|
<span>{formatMessage({ id: getTrad('input.label-normal') })}</span>
|
|
|
|
</P>
|
|
|
|
<Button
|
|
|
|
type="button"
|
|
|
|
id="button"
|
|
|
|
name="button"
|
|
|
|
color="primary"
|
|
|
|
onClick={handleClick}
|
2020-02-17 11:09:45 +01:00
|
|
|
>
|
2020-02-19 13:40:36 +01:00
|
|
|
{formatMessage({ id: getTrad('input.button.label') })}
|
|
|
|
</Button>
|
|
|
|
<Input
|
|
|
|
ref={ref}
|
|
|
|
type="file"
|
|
|
|
multiple
|
|
|
|
name={name}
|
|
|
|
onChange={handleChange}
|
|
|
|
/>
|
|
|
|
{isDragging && <div className="dragzone" onDragLeave={handleDragLeave} />}
|
|
|
|
</Label>
|
2020-02-17 11:09:45 +01:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
InputFile.defaultProps = {
|
|
|
|
name: 'files',
|
|
|
|
onChange: () => {},
|
|
|
|
};
|
|
|
|
|
|
|
|
InputFile.propTypes = {
|
|
|
|
name: PropTypes.string,
|
|
|
|
onChange: PropTypes.func,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default InputFile;
|