@@ -66,27 +66,14 @@ class AjaxUploader extends Component<UploadProps> {
66
66
}
67
67
} ;
68
68
69
- onFileDropOrPaste = async ( e : React . DragEvent < HTMLDivElement > | ClipboardEvent ) => {
70
- if ( e . type === 'dragover' ) {
71
- return ;
72
- }
73
-
69
+ onDataTransferFiles = async ( dataTransfer : DataTransfer , existFileCallback ?: ( ) => void ) => {
74
70
const { multiple, accept, directory } = this . props ;
75
- let items : DataTransferItem [ ] = [ ] ;
76
- let files : File [ ] = [ ] ;
77
71
78
- if ( e . type === 'drop' ) {
79
- const dataTransfer = ( e as React . DragEvent < HTMLDivElement > ) . dataTransfer ;
80
- items = [ ...( dataTransfer . items || [ ] ) ] ;
81
- files = [ ...( dataTransfer . files || [ ] ) ] ;
82
- } else if ( e . type === 'paste' ) {
83
- const clipboardData = ( e as ClipboardEvent ) . clipboardData ;
84
- items = [ ...( clipboardData . items || [ ] ) ] ;
85
- files = [ ...( clipboardData . files || [ ] ) ] ;
86
- }
72
+ const items : DataTransferItem [ ] = [ ...( dataTransfer . items || [ ] ) ] ;
73
+ let files : File [ ] = [ ...( dataTransfer . files || [ ] ) ] ;
87
74
88
75
if ( files . length > 0 || items . some ( item => item . kind === 'file' ) ) {
89
- e . preventDefault ( ) ;
76
+ existFileCallback ?. ( ) ;
90
77
}
91
78
92
79
if ( directory ) {
@@ -105,11 +92,32 @@ class AjaxUploader extends Component<UploadProps> {
105
92
}
106
93
} ;
107
94
108
- onPrePaste = ( e : ClipboardEvent ) => {
95
+ onFilePaste = async ( e : ClipboardEvent ) => {
109
96
const { pastable } = this . props ;
110
97
111
- if ( pastable ) {
112
- this . onFileDropOrPaste ( e ) ;
98
+ if ( ! pastable ) {
99
+ return ;
100
+ }
101
+
102
+ if ( e . type === 'paste' ) {
103
+ const clipboardData = ( e as ClipboardEvent ) . clipboardData ;
104
+ return this . onDataTransferFiles ( clipboardData , ( ) => {
105
+ e . preventDefault ( ) ;
106
+ } ) ;
107
+ }
108
+ } ;
109
+
110
+ onFileDragOver = ( e : React . DragEvent < HTMLDivElement > ) => {
111
+ e . preventDefault ( ) ;
112
+ } ;
113
+
114
+ onFileDrop = async ( e : React . DragEvent < HTMLDivElement > ) => {
115
+ e . preventDefault ( ) ;
116
+
117
+ if ( e . type === 'drop' ) {
118
+ const dataTransfer = ( e as React . DragEvent < HTMLDivElement > ) . dataTransfer ;
119
+
120
+ return this . onDataTransferFiles ( dataTransfer ) ;
113
121
}
114
122
} ;
115
123
@@ -119,23 +127,23 @@ class AjaxUploader extends Component<UploadProps> {
119
127
const { pastable } = this . props ;
120
128
121
129
if ( pastable ) {
122
- document . addEventListener ( 'paste' , this . onPrePaste ) ;
130
+ document . addEventListener ( 'paste' , this . onFilePaste ) ;
123
131
}
124
132
}
125
133
126
134
componentWillUnmount ( ) {
127
135
this . _isMounted = false ;
128
136
this . abort ( ) ;
129
- document . removeEventListener ( 'paste' , this . onPrePaste ) ;
137
+ document . removeEventListener ( 'paste' , this . onFilePaste ) ;
130
138
}
131
139
132
140
componentDidUpdate ( prevProps : UploadProps ) {
133
141
const { pastable } = this . props ;
134
142
135
143
if ( pastable && ! prevProps . pastable ) {
136
- document . addEventListener ( 'paste' , this . onPrePaste ) ;
144
+ document . addEventListener ( 'paste' , this . onFilePaste ) ;
137
145
} else if ( ! pastable && prevProps . pastable ) {
138
- document . removeEventListener ( 'paste' , this . onPrePaste ) ;
146
+ document . removeEventListener ( 'paste' , this . onFilePaste ) ;
139
147
}
140
148
}
141
149
@@ -335,8 +343,8 @@ class AjaxUploader extends Component<UploadProps> {
335
343
onKeyDown : openFileDialogOnClick ? this . onKeyDown : ( ) => { } ,
336
344
onMouseEnter,
337
345
onMouseLeave,
338
- onDrop : this . onFileDropOrPaste ,
339
- onDragOver : this . onFileDropOrPaste ,
346
+ onDrop : this . onFileDrop ,
347
+ onDragOver : this . onFileDragOver ,
340
348
tabIndex : hasControlInside ? undefined : '0' ,
341
349
} ;
342
350
return (
0 commit comments