mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-16 04:40:32 +00:00
76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
import React, { useState, useCallback, useEffect } from 'react'
|
|
import { useDropzone } from 'react-dropzone'
|
|
import classNames from 'classnames';
|
|
import Icon from 'components/Icon';
|
|
|
|
// const initialFile: {
|
|
// file: ?File,
|
|
// preview: string,
|
|
// metadata: ?object,
|
|
// uploaded: boolean,
|
|
// };
|
|
|
|
export default function Dropzone({
|
|
text = 'Drag/Drop files here or click here',
|
|
onDrop,
|
|
initialFiles = [],
|
|
onDeleteFile,
|
|
hint,
|
|
className,
|
|
}) {
|
|
const [files, setFiles] = useState([]);
|
|
|
|
useEffect(() => {
|
|
setFiles([ ...initialFiles ]);
|
|
}, [initialFiles]);
|
|
|
|
const {getRootProps, getInputProps} = useDropzone({
|
|
accept: 'image/*',
|
|
onDrop: (acceptedFiles) => {
|
|
const _files = acceptedFiles.map((file) => ({
|
|
file,
|
|
preview: URL.createObjectURL(file),
|
|
uploaded: false,
|
|
}));
|
|
setFiles(_files);
|
|
}
|
|
});
|
|
|
|
const handleRemove = useCallback((index) => {
|
|
const deletedFile = files.splice(index, 1);
|
|
setFiles([...files]);
|
|
onDeleteFile && onDeleteFile(deletedFile);
|
|
}, [files, onDeleteFile]);
|
|
|
|
const thumbs = files.map((file, index) => (
|
|
<div className={'dropzone-thumb'} key={file.name}>
|
|
<div><img src={file.preview} /></div>
|
|
<button onClick={() => handleRemove(index)}>
|
|
<Icon icon={'times'} iconSize={12} />
|
|
</button>
|
|
</div>
|
|
));
|
|
|
|
useEffect(() => () => {
|
|
files.forEach(file => URL.revokeObjectURL(file.preview));
|
|
}, [files, onDrop]);
|
|
|
|
useEffect(() => {
|
|
onDrop && onDrop(files);
|
|
}, [files, onDrop]);
|
|
|
|
return (
|
|
<section className={classNames('dropzone-container', className)}>
|
|
{(hint) && <div class="dropzone-hint">{ hint }</div>}
|
|
|
|
<div {...getRootProps({ className: 'dropzone' })}>
|
|
<input {...getInputProps()} />
|
|
<p>{ text }</p>
|
|
</div>
|
|
|
|
<div className={'dropzone-thumbs'}>
|
|
{ thumbs }
|
|
</div>
|
|
</section>
|
|
);
|
|
} |