Skip to content

Commit f004415

Browse files
committed
render prop intro. removed dafault class name and active drag class name.
1 parent 2c920ef commit f004415

File tree

7 files changed

+65
-15
lines changed

7 files changed

+65
-15
lines changed

demo/Gallery.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const Gallery = () => {
1212
<h1>Example 2 - Gallery</h1>
1313
<Files
1414
className="files-dropzone-gallery"
15+
dragActiveClassName="files-dropzone-active"
1516
onChange={handleChange}
1617
accepts={['image/*']}
1718
multiple
@@ -21,13 +22,13 @@ const Gallery = () => {
2122
)}
2223
{files.length > 0 && (
2324
<div className="files-gallery">
24-
{files.map((file) =>
25+
{files.map(file => (
2526
<img
2627
key={file.id}
2728
className="files-gallery-item"
2829
src={file.preview.url}
2930
/>
30-
)}
31+
))}
3132
</div>
3233
)}
3334
</Files>

demo/ListWithUpload.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const ListWithUpload = () => {
3737
<h1>Example 1 - List</h1>
3838
<Files
3939
className="files-dropzone-list"
40+
dragActiveClassName="files-dropzone-active"
4041
style={{ height: '100px' }}
4142
onChange={handleChange}
4243
multiple

demo/RenderProps.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React from 'react'
2+
import Files from '../src'
3+
4+
const RenderProps = () => (
5+
<div>
6+
<h1>Example 3 - Render Props</h1>
7+
<Files
8+
accepts={['image/*']}
9+
multiple
10+
style={{ height: '100px', width: '200px' }}>
11+
{isDragging => (
12+
<div
13+
style={{
14+
width: '100%',
15+
height: '100%',
16+
background: isDragging ? 'red' : 'white',
17+
border: '1px dashed #D3D3D3'
18+
}}>
19+
{isDragging && 'Drop Here!'}
20+
{!isDragging && 'Ready'}
21+
</div>
22+
)}
23+
</Files>
24+
</div>
25+
)
26+
27+
export default RenderProps

demo/index.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import React from 'react'
22
import ReactDOM from 'react-dom'
3-
import ListWithUpload from './ListWithUpload'
4-
import Gallery from './Gallery'
3+
import ListWithUploadExample from './ListWithUpload'
4+
import GalleryExample from './Gallery'
5+
import RenderPropsExample from './RenderProps'
56

6-
ReactDOM.render(
7+
ReactDOM.render((
78
<div>
8-
<ListWithUpload />
9-
<Gallery />
9+
<ListWithUploadExample />
10+
<GalleryExample />
11+
<RenderPropsExample />
1012
</div>
11-
, document.getElementById('container'))
13+
), document.getElementById('container'))

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

migration.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Breaking Changes:
2+
- No default `className` or `dragActiveClassName`
3+
- No internal state management

src/index.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useRef } from 'react'
1+
import React, { useCallback, useRef, useState } from 'react'
22
import PropTypes from 'prop-types'
33
import fileExtension from './utils/fileExtension'
44
import fileSizeReadable from './utils/fileSizeReadable'
@@ -25,6 +25,7 @@ const Files = ({
2525
const idCounter = useRef(1)
2626
const dropzoneElement = useRef()
2727
const inputElement = useRef()
28+
const [isDragging, setDragging] = useState(false)
2829

2930
const handleError = (error, file) => {
3031
onError(error, file)
@@ -37,15 +38,29 @@ const Files = ({
3738

3839
const handleDragEnter = (event) => {
3940
const el = dropzoneElement.current
40-
el.className = `${el.className} ${dragActiveClassName}`
41+
if (dragActiveClassName && !el.className.includes(dragActiveClassName)) {
42+
el.className = `${el.className} ${dragActiveClassName}`
43+
}
44+
45+
if (typeof children === 'function') {
46+
setDragging(true)
47+
}
48+
4149
if (onDragEnter) {
4250
onDragEnter(event)
4351
}
4452
}
4553

4654
const handleDragLeave = (event) => {
4755
const el = dropzoneElement.current
48-
el.className = el.className.replace(` ${dragActiveClassName}`, '')
56+
if (dragActiveClassName) {
57+
el.className = el.className.replace(` ${dragActiveClassName}`, '')
58+
}
59+
60+
if (typeof children === 'function') {
61+
setDragging(false)
62+
}
63+
4964
if (onDragLeave) {
5065
onDragLeave(event)
5166
}
@@ -164,7 +179,7 @@ const Files = ({
164179
onDragEnter={handleDragEnter}
165180
onDragLeave={handleDragLeave}
166181
style={style}>
167-
{children}
182+
{typeof children === 'function' ? children(isDragging) : children}
168183
</div>
169184
</>
170185
)
@@ -173,6 +188,7 @@ const Files = ({
173188
Files.propTypes = {
174189
accepts: PropTypes.array,
175190
children: PropTypes.oneOfType([
191+
PropTypes.func,
176192
PropTypes.arrayOf(PropTypes.node),
177193
PropTypes.node
178194
]),
@@ -193,9 +209,9 @@ Files.propTypes = {
193209

194210
Files.defaultProps = {
195211
accepts: null,
196-
className: 'files-dropzone',
212+
className: undefined,
197213
clickable: true,
198-
dragActiveClassName: 'files-dropzone-active',
214+
dragActiveClassName: undefined,
199215
multiple: true,
200216
maxFiles: Infinity,
201217
maxFileSize: Infinity,

0 commit comments

Comments
 (0)