@@ -4,6 +4,7 @@ import RcUpload from 'rc-upload';
4
4
import useMergedState from 'rc-util/lib/hooks/useMergedState' ;
5
5
import * as React from 'react' ;
6
6
import { flushSync } from 'react-dom' ;
7
+ import { Eraser , UploadSimple } from 'phosphor-react' ;
7
8
import { ConfigContext } from '../config-provider' ;
8
9
import DisabledContext from '../config-provider/DisabledContext' ;
9
10
import LocaleReceiver from '../locale/LocaleReceiver' ;
@@ -13,13 +14,17 @@ import type { RcFile, ShowUploadListInterface, UploadChangeParam, UploadFile } f
13
14
import { UploadProps } from './interface' ;
14
15
import UploadList from './UploadList' ;
15
16
import { file2Obj , getFileItem , removeFileItem , updateFileList } from './utils' ;
17
+ import Icon from '../icon' ;
16
18
17
19
import useStyle from './style' ;
18
20
19
21
export const LIST_IGNORE = `__LIST_IGNORE_${ Date . now ( ) } __` ;
20
22
21
23
export { UploadProps } ;
22
24
25
+ // todo: i18n this
26
+ const ClickOrDragToReplaceFile = 'Click or Drag to replace file' ;
27
+
23
28
const InternalUpload : React . ForwardRefRenderFunction < unknown , UploadProps > = ( props , ref ) => {
24
29
const {
25
30
fileList,
@@ -49,6 +54,8 @@ const InternalUpload: React.ForwardRefRenderFunction<unknown, UploadProps> = (pr
49
54
action = '' ,
50
55
accept = '' ,
51
56
supportServerRender = true ,
57
+ title = 'Drag title' ,
58
+ hint = 'Drag hint' ,
52
59
} = props ;
53
60
54
61
// ===================== Disabled =====================
@@ -416,6 +423,53 @@ const InternalUpload: React.ForwardRefRenderFunction<unknown, UploadProps> = (pr
416
423
) ;
417
424
}
418
425
426
+ if ( type === 'single-file-drag' ) {
427
+ const dragCls = classNames (
428
+ prefixCls ,
429
+ `${ prefixCls } -drag-single` ,
430
+ {
431
+ '-drag-uploading' : mergedFileList . some ( ( file ) => file . status === 'uploading' ) ,
432
+ '-drag-hover' : dragState === 'dragover' ,
433
+ '-disabled' : mergedDisabled ,
434
+ '-uploaded' : mergedFileList . length ,
435
+ } ,
436
+ hashId ,
437
+ ) ;
438
+
439
+ return wrapSSR (
440
+ < div className = { classNames ( `${ prefixCls } -wrapper` , rtlCls , className , hashId ) } >
441
+ < div
442
+ className = { dragCls }
443
+ onDrop = { onFileDrop }
444
+ onDragOver = { onFileDrop }
445
+ onDragLeave = { onFileDrop }
446
+ >
447
+ < RcUpload { ...rcUploadProps } ref = { upload } className = { `${ prefixCls } -btn` } >
448
+ < div className = { `${ prefixCls } -drag-container` } >
449
+ { ! mergedFileList . length ? (
450
+ < >
451
+ < Icon
452
+ type = 'phosphor'
453
+ phosphorIcon = { UploadSimple }
454
+ className = 'ant-upload-drag__icon'
455
+ />
456
+ < div className = { `${ prefixCls } -drag__title` } > { title } </ div >
457
+ < div className = { `${ prefixCls } -drag__hint` } > { hint } </ div >
458
+ </ >
459
+ ) : (
460
+ < >
461
+ < Icon type = 'phosphor' phosphorIcon = { Eraser } className = 'ant-upload-drag__icon' />
462
+ < div className = { `${ prefixCls } -drag__title` } > { ClickOrDragToReplaceFile } </ div >
463
+ < div className = { `${ prefixCls } -drag__hint` } > { mergedFileList [ 0 ] . name } </ div >
464
+ </ >
465
+ ) }
466
+ </ div >
467
+ </ RcUpload >
468
+ </ div >
469
+ </ div > ,
470
+ ) ;
471
+ }
472
+
419
473
const uploadButtonCls = classNames ( prefixCls , `${ prefixCls } -select` , {
420
474
[ `${ prefixCls } -disabled` ] : mergedDisabled ,
421
475
} ) ;
0 commit comments