Simple wrapper component that convert child component to a drag and drop file input.
Install react-file-trap with npm
npm install react-file-trap <FileTrap
ref={wrapperRef}
allowedExtensions={['jpg', 'png']}
handleChange={handleChange}
handleDrag={handleDrag}
handleDrop={handleDrop}
onValidationError={onValidationError}
fileCount={3}
maxFileSize={2} // MB
minFileSize={0.1} // MB
browseOnClick={false}
>
<div style={{ margin: 10, border: "2px solid red" }}>
<h2 style={{ margin: 5 }}>Current Event: {currentEvent}</h2>
<h2 style={{ margin: 5 }}>Valid File Count: {validFiles.length}</h2>
<h2 style={{ margin: 5 }}>Invalid File Count: {invalidFiles.length}</h2>
<h2 style={{ margin: 5 }}>Last Error: {lastError}</h2>
</div>
</FileTrap>| Parameter | Type | Description | Default Value | Notes |
|---|---|---|---|---|
ref |
ref |
Suggest to use to reset and/or trigger browse outside of child component | undefined |
Should be defined to trigger some functions |
allowedExtensions |
array |
Allowed file extensions | undefined |
Don't provide to allow all file types |
handleChange |
function |
Runs when selected and/or dropped a valid file | Mandatory prop to handle files. See events | |
handleDrag |
function |
Runs for every drag event. Possible values: dragover dragleave |
undefined |
See events |
handleDrop |
function |
Runs when dropped a file | undefined |
See events |
onValidationError |
function |
Runs everytime if dropped or selected file invalid | undefined |
See events |
fileCount |
number |
Allowed file count | Number.MAX_VALUE |
|
maxFileSize |
number |
Allowed upper limit for file size in MB | Number.MAX_VALUE |
|
minFileSize |
number |
Allowed lower limit for file size in MB | 0 |
|
browseOnClick |
boolean |
Trigger browse window on click to child component | true |
Runs on every change on the valid files. fileList parameter includes all valid files.
const handleChange = (fileList) => {
setFiles(filesList);
setTotalSize(byteFormatter(newFiles.reduce((acc, file) => acc + file.size, 0)));
};Runs on drag event, eventName parametet can be: dragover or dragleave
const handleDrag = (eventName) => {
setCurrentEvent(eventName);
};Runs after a dropped files.
const handleDrop = () => {
setCurrentEvent('dropped');
};Runs after selected/dropped files.
const onValidationError = (invalidFileList, errorMsg) => {
setInvalidFiles([...invalidFiles, ...invalidFileList]);
setLastError(errorMsg);
}Trigger browse window manually. ref prop is needed.
wrapperRef.current.browseFiles();To reset selected files. ref prop is needed.
wrapperRef.current.resetWrapper();To remove specific file. file should be provided as parameter. ref prop is also needed.
wrapperRef.current.removeFile(file);For more details about usage, please check example project in the root directory.