@@ -66,41 +66,75 @@ class AjaxUploader extends Component<UploadProps> {
6666 }
6767 } ;
6868
69- onFileDrop = async ( e : React . DragEvent < HTMLDivElement > ) => {
70- const { multiple } = this . props ;
71-
69+ onFileDropOrPaste = async ( e : React . DragEvent < HTMLDivElement > | ClipboardEvent ) => {
7270 e . preventDefault ( ) ;
7371
7472 if ( e . type === 'dragover' ) {
7573 return ;
7674 }
7775
78- if ( this . props . directory ) {
79- const files = await traverseFileTree (
80- Array . prototype . slice . call ( e . dataTransfer . items ) ,
81- ( _file : RcFile ) => attrAccept ( _file , this . props . accept ) ,
76+ const { multiple, accept, directory } = this . props ;
77+ let items : DataTransferItem [ ] = [ ] ;
78+ let files : File [ ] = [ ] ;
79+
80+ if ( e . type === 'drop' ) {
81+ const dataTransfer = ( e as React . DragEvent < HTMLDivElement > ) . dataTransfer ;
82+ items = [ ...( dataTransfer . items || [ ] ) ] ;
83+ files = [ ...( dataTransfer . files || [ ] ) ] ;
84+ } else if ( e . type === 'paste' ) {
85+ const clipboardData = ( e as ClipboardEvent ) . clipboardData ;
86+ items = [ ...( clipboardData . items || [ ] ) ] ;
87+ files = [ ...( clipboardData . files || [ ] ) ] ;
88+ }
89+
90+ if ( directory ) {
91+ files = await traverseFileTree ( Array . prototype . slice . call ( items ) , ( _file : RcFile ) =>
92+ attrAccept ( _file , this . props . accept ) ,
8293 ) ;
8394 this . uploadFiles ( files ) ;
8495 } else {
85- let files = [ ...e . dataTransfer . files ] . filter ( ( file : RcFile ) =>
86- attrAccept ( file , this . props . accept ) ,
87- ) ;
96+ let acceptFiles = [ ...files ] . filter ( ( file : RcFile ) => attrAccept ( file , accept ) ) ;
8897
8998 if ( multiple === false ) {
90- files = files . slice ( 0 , 1 ) ;
99+ acceptFiles = files . slice ( 0 , 1 ) ;
91100 }
92101
93- this . uploadFiles ( files ) ;
102+ this . uploadFiles ( acceptFiles ) ;
103+ }
104+ } ;
105+
106+ onPrePaste = ( e : ClipboardEvent ) => {
107+ const { pastable } = this . props ;
108+
109+ if ( pastable ) {
110+ this . onFileDropOrPaste ( e ) ;
94111 }
95112 } ;
96113
97114 componentDidMount ( ) {
98115 this . _isMounted = true ;
116+
117+ const { pastable } = this . props ;
118+
119+ if ( pastable ) {
120+ document . addEventListener ( 'paste' , this . onPrePaste ) ;
121+ }
99122 }
100123
101124 componentWillUnmount ( ) {
102125 this . _isMounted = false ;
103126 this . abort ( ) ;
127+ document . removeEventListener ( 'paste' , this . onPrePaste ) ;
128+ }
129+
130+ componentDidUpdate ( prevProps : UploadProps ) {
131+ const { pastable } = this . props ;
132+
133+ if ( pastable && ! prevProps . pastable ) {
134+ document . addEventListener ( 'paste' , this . onPrePaste ) ;
135+ } else if ( ! pastable && prevProps . pastable ) {
136+ document . removeEventListener ( 'paste' , this . onPrePaste ) ;
137+ }
104138 }
105139
106140 uploadFiles = ( files : File [ ] ) => {
@@ -299,8 +333,8 @@ class AjaxUploader extends Component<UploadProps> {
299333 onKeyDown : openFileDialogOnClick ? this . onKeyDown : ( ) => { } ,
300334 onMouseEnter,
301335 onMouseLeave,
302- onDrop : this . onFileDrop ,
303- onDragOver : this . onFileDrop ,
336+ onDrop : this . onFileDropOrPaste ,
337+ onDragOver : this . onFileDropOrPaste ,
304338 tabIndex : hasControlInside ? undefined : '0' ,
305339 } ;
306340 return (
0 commit comments