11/* eslint react/no-is-mounted:0,react/sort-comp:0,react/prop-types:0 */
2- import { clsx } from 'clsx' ;
32import pickAttrs from '@rc-component/util/lib/pickAttrs' ;
3+ import { clsx } from 'clsx' ;
44import React , { Component } from 'react' ;
55import attrAccept from './attr-accept' ;
66import type {
7+ AcceptConfig ,
78 BeforeUploadFileType ,
89 RcFile ,
910 UploadProgressEvent ,
@@ -30,12 +31,36 @@ class AjaxUploader extends Component<UploadProps> {
3031
3132 private _isMounted : boolean ;
3233
33- onChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
34+ private filterFile = ( file : RcFile | File , force = false ) => {
3435 const { accept, directory } = this . props ;
36+
37+ let filterFn : Exclude < AcceptConfig [ 'filter' ] , 'native' > ;
38+ let acceptFormat : string | undefined ;
39+
40+ if ( typeof accept === 'string' ) {
41+ acceptFormat = accept ;
42+ } else {
43+ const { filter, format } = accept || { } ;
44+
45+ acceptFormat = format ;
46+ if ( filter === 'native' ) {
47+ filterFn = ( ) => true ;
48+ } else {
49+ filterFn = filter ;
50+ }
51+ }
52+
53+ const mergedFilter =
54+ filterFn ||
55+ ( directory || force
56+ ? ( currentFile : RcFile ) => attrAccept ( currentFile , acceptFormat )
57+ : ( ) => true ) ;
58+ return mergedFilter ( file as RcFile ) ;
59+ } ;
60+
61+ onChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
3562 const { files } = e . target ;
36- const acceptedFiles = [ ...files ] . filter (
37- ( file : RcFile ) => ! directory || attrAccept ( file , accept ) ,
38- ) ;
63+ const acceptedFiles = [ ...files ] . filter ( file => this . filterFile ( file ) ) ;
3964 this . uploadFiles ( acceptedFiles ) ;
4065 this . reset ( ) ;
4166 } ;
@@ -67,7 +92,7 @@ class AjaxUploader extends Component<UploadProps> {
6792 } ;
6893
6994 onDataTransferFiles = async ( dataTransfer : DataTransfer , existFileCallback ?: ( ) => void ) => {
70- const { multiple, accept , directory } = this . props ;
95+ const { multiple, directory } = this . props ;
7196
7297 const items : DataTransferItem [ ] = [ ...( dataTransfer . items || [ ] ) ] ;
7398 let files : File [ ] = [ ...( dataTransfer . files || [ ] ) ] ;
@@ -77,12 +102,10 @@ class AjaxUploader extends Component<UploadProps> {
77102 }
78103
79104 if ( directory ) {
80- files = await traverseFileTree ( Array . prototype . slice . call ( items ) , ( _file : RcFile ) =>
81- attrAccept ( _file , this . props . accept ) ,
82- ) ;
105+ files = await traverseFileTree ( Array . prototype . slice . call ( items ) , this . filterFile ) ;
83106 this . uploadFiles ( files ) ;
84107 } else {
85- let acceptFiles = [ ...files ] . filter ( ( file : RcFile ) => attrAccept ( file , accept ) ) ;
108+ let acceptFiles = [ ...files ] . filter ( file => this . filterFile ( file , true ) ) ;
86109
87110 if ( multiple === false ) {
88111 acceptFiles = files . slice ( 0 , 1 ) ;
@@ -322,17 +345,20 @@ class AjaxUploader extends Component<UploadProps> {
322345 capture,
323346 children,
324347 directory,
325- folder,
326348 openFileDialogOnClick,
327349 onMouseEnter,
328350 onMouseLeave,
329351 hasControlInside,
330352 ...otherProps
331353 } = this . props ;
354+
355+ // Extract accept format for input element
356+ const acceptFormat = typeof accept === 'string' ? accept : accept ?. format ;
332357 const cls = clsx ( prefixCls , { [ `${ prefixCls } -disabled` ] : disabled , [ className ] : className } ) ;
333358 // because input don't have directory/webkitdirectory type declaration
334- const dirProps : any =
335- directory || folder ? { directory : 'directory' , webkitdirectory : 'webkitdirectory' } : { } ;
359+ const dirProps : any = directory
360+ ? { directory : 'directory' , webkitdirectory : 'webkitdirectory' }
361+ : { } ;
336362 const events = disabled
337363 ? { }
338364 : {
@@ -361,7 +387,7 @@ class AjaxUploader extends Component<UploadProps> {
361387 key = { this . state . uid }
362388 style = { { display : 'none' , ...styles . input } }
363389 className = { classNames . input }
364- accept = { accept }
390+ accept = { acceptFormat }
365391 { ...dirProps }
366392 multiple = { multiple }
367393 onChange = { this . onChange }
0 commit comments