@@ -31,10 +31,9 @@ const DragDropUpload: React.FC<DragDropUploadProps> = ({ onUpload }) => {
31
31
const [ dragging , setDragging ] = useState ( false ) ;
32
32
33
33
useEffect ( ( ) => {
34
- const onDrop = ( e : any ) => {
34
+ const onDrop = ( e : DragEvent ) => {
35
35
e . preventDefault ( ) ;
36
- const { files } = e . dataTransfer ;
37
- console . log ( files ) ;
36
+ const { files } = e . dataTransfer || { files : null } ;
38
37
if ( ! files ) return ;
39
38
if ( ! files [ 0 ] ) return ;
40
39
onUpload ( files [ 0 ] ) ;
@@ -57,6 +56,17 @@ const DragDropUpload: React.FC<DragDropUploadProps> = ({ onUpload }) => {
57
56
setDragging ( true ) ;
58
57
}
59
58
} ;
59
+
60
+ const onDragOver = ( e : DragEvent ) => {
61
+ e . preventDefault ( ) ;
62
+ if ( e . dataTransfer ) {
63
+ e . dataTransfer . dropEffect = 'copy' ;
64
+ }
65
+ if ( ! dragging ) {
66
+ setDragging ( true ) ;
67
+ }
68
+ } ;
69
+
60
70
const onDragLeave = ( ) => {
61
71
if ( down . current ) return ;
62
72
dragIndex . current -= 1 ;
@@ -65,20 +75,30 @@ const DragDropUpload: React.FC<DragDropUploadProps> = ({ onUpload }) => {
65
75
}
66
76
} ;
67
77
78
+ const onMouseLeave = ( ) => {
79
+ if ( dragging ) {
80
+ setDragging ( false ) ;
81
+ }
82
+ } ;
83
+
68
84
window . addEventListener ( 'drop' , onDrop ) ;
85
+ window . addEventListener ( 'dragover' , onDragOver ) ;
69
86
window . addEventListener ( 'mousedown' , onMouseDown ) ;
70
87
window . addEventListener ( 'mouseup' , onMouseUp ) ;
71
88
window . addEventListener ( 'dragenter' , onDragEnter ) ;
72
89
window . addEventListener ( 'dragleave' , onDragLeave ) ;
90
+ document . addEventListener ( 'mouseleave' , onMouseLeave ) ;
73
91
74
92
return ( ) => {
75
93
window . removeEventListener ( 'drop' , onDrop ) ;
94
+ window . removeEventListener ( 'dragover' , onDragOver ) ;
76
95
window . removeEventListener ( 'mousedown' , onMouseDown ) ;
77
96
window . removeEventListener ( 'mouseup' , onMouseUp ) ;
78
- window . addEventListener ( 'dragenter' , onDragEnter ) ;
97
+ window . removeEventListener ( 'dragenter' , onDragEnter ) ;
79
98
window . removeEventListener ( 'dragleave' , onDragLeave ) ;
99
+ document . removeEventListener ( 'mouseleave' , onMouseLeave ) ;
80
100
} ;
81
- } , [ onUpload ] ) ;
101
+ } , [ dragging , onUpload ] ) ;
82
102
83
103
return dragging ? (
84
104
< DragDropUploadBlock >
0 commit comments