Chonky v2.1.0 Docs
IntroductionInstallation & usageFile Browser demosMigrating from 1.xFAQ
Basics

Drag & drop

Chonky supports drag & drop (DnD) out-of-the-box. The relevant functionality is implemented using react-dnd.

Disabling DnD

If you want to disable DnD globally, you can use setChonkyDefaults:

import { setChonkyDefaults } from 'chonky';
setChonkyDefaults({
disableDragAndDrop: true,
});

To disable DnD on a specific file browser, you can use the disableDragAndDrop prop:

<FileBrowser files={[]} disableDragAndDrop={true}>
{/* ... */}
</FileBrowser>

"Cannot have two HTML5 backends"

For the majority of use cases, DnD will just work. However, if you want to use multiple FileBrowser instances on the same page, you will start seeing this error:

Error: Cannot have two HTML5 backends at the same time.

This happens because of the way react-dnd works. It requires a DndProvider to be present somewhere in the component tree, above the component that actually uses DnD functionality. To support this, Chonky's internal component hierarchy looks like this:

- FileBrowser
- DnDProvider
- ChonkyDnD

That said, react-dnd also requires that only one DnDProvider is mounted at a time, so when you have multiple file browsers in your app you start hitting problems:

const MyApp = () => {
return (
<React.Fragment>
<FileBrowser files={[]} />
<FileBrowser files={[]} />
</React.Fragment>
);
};

Resultant component hierarchy:

- MyApp
- FileBrowser
- DnDProvider
- ChonkyDnD
- FileBrowser
- DnDProvider <---- Duplicate provider!
- ChonkyDnD

The solution is quite simple:

import { FileBrowser } from 'chonky';
import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
const MyApp = () => {
return (
<DndProvider backend={HTML5Backend}>
<FileBrowser files={[]} disableDragAndDropProvider={true} />
<FileBrowser files={[]} disableDragAndDropProvider={true} />
</DndProvider>
);
};

The code above does two things. First, it disables Chonky's internal DnDProvider by setting the disableDragAndDropProvider prop on FileBrowser to true. Second, it adds a custom DnDProvider at the top-level of the application.

Note that you don't have to use HTML5Backend, you can use any react-dnd-compatible backend that you want.

If you have a question, want to request a feature or report a bug, please create an issue on GitHub. You can also report inaccurate or unclear documentation on Chonky's Discord server.