1
- import { UploadOutlined } from '@ant-design/icons' ;
1
+ import { FileImageOutlined , UploadOutlined } from '@ant-design/icons' ;
2
2
import { Sender } from '@ant-design/x' ;
3
3
import { SenderProps } from '@ant-design/x/es/sender/interface' ;
4
4
import {
@@ -13,18 +13,24 @@ import {
13
13
} from 'antd' ;
14
14
import { useContext , useEffect , useState } from 'react' ;
15
15
import EnterTypeButton from './components/EnterTypeButton.tsx' ;
16
- import LocalStorageManager from './storageManager' ; // 引入类文件
16
+ import LocalStorageManager from './storageManager' ;
17
17
import { useStyles } from './style' ;
18
18
19
+ type ActionsType = {
20
+ actionsRender ?: ( [ fileUpBtn , imgUpBtn ] : Array < React . ReactNode > ) => React . ReactNode ;
21
+ actionsInfoRender ?: ( defaultdom : React . ReactNode , [ ] : Array < UploadFile > ) => React . ReactNode ;
22
+ } ;
23
+
19
24
const ProSender = (
20
- props : SenderProps & {
25
+ props : Omit < SenderProps , 'onSubmit' > & {
21
26
className ?: string ;
22
27
upload ?: UploadProps ;
23
28
sender ?: SenderProps ;
29
+ actions ?: ActionsType ;
24
30
onSubmit ?: ( message : string , fileList ?: UploadFile [ ] ) => void ;
25
31
} ,
26
32
) => {
27
- const { className, upload, sender, onSubmit } = props || { } ;
33
+ const { className, upload, sender, onSubmit, actions } = props || { } ;
28
34
29
35
const { cx, styles } = useStyles ( ) ;
30
36
const { getPrefixCls } = useContext ( ConfigProvider . ConfigContext ) ;
@@ -38,61 +44,89 @@ const ProSender = (
38
44
setFileList ( upload ?. fileList || upload ?. defaultFileList || [ ] ) ;
39
45
} , [ ] ) ;
40
46
41
- const ProSenderActions = ( ) => {
47
+ const senderActionsRender = ( ) => {
48
+ const UploadCommanProps = {
49
+ ...upload ,
50
+ fileList : [ ] ,
51
+ beforeUpload : ( file ) => {
52
+ localStorageManager
53
+ . storeFile ( file )
54
+ . then ( ( key ) => {
55
+ const storedFiles = localStorageManager . getFiles ( [ key ] ) ;
56
+ setFileList ( ( prevList ) => [ ...prevList , ...storedFiles ] ) ;
57
+ } )
58
+ . catch ( ( error ) => {
59
+ message . error ( error ) ;
60
+ } ) ;
61
+ return false ;
62
+ } ,
63
+ } ;
64
+
65
+ const fileUpBtn = (
66
+ < Upload { ...UploadCommanProps } >
67
+ < Button icon = { < UploadOutlined /> } />
68
+ </ Upload >
69
+ ) ;
70
+
71
+ const imgUpBtn = (
72
+ < Upload
73
+ { ...UploadCommanProps }
74
+ listType = "picture"
75
+ beforeUpload = { ( file ) => {
76
+ if ( file . type !== 'image/jpeg' && file . type !== 'image/png' ) {
77
+ message . error ( '只能上传jpg/png格式的图片' ) ;
78
+ return Upload . LIST_IGNORE ;
79
+ }
80
+ UploadCommanProps . beforeUpload ( file ) ;
81
+ } }
82
+ >
83
+ < Button icon = { < FileImageOutlined /> } />
84
+ </ Upload >
85
+ ) ;
86
+
87
+ if ( actions ?. actionsRender ) {
88
+ return actions . actionsRender ( [ fileUpBtn , imgUpBtn ] ) ;
89
+ }
90
+
42
91
return (
43
92
< Space className = { cx ( styles . actions , `${ prefixClass } -sender-actions` ) } >
44
- < Upload
45
- { ...upload }
46
- fileList = { [ ] }
47
- beforeUpload = { ( file ) => {
48
- console . log ( 'file' , file , localStorageManager ) ;
49
-
50
- localStorageManager
51
- . storeFile ( file )
52
- . then ( ( key ) => {
53
- console . log ( 'key' , key ) ;
54
-
55
- const storedFiles = localStorageManager . getFiles ( [ key ] ) ;
56
- setFileList ( ( prevList ) => [ ...prevList , ...storedFiles ] ) ;
57
- } )
58
- . catch ( ( error ) => {
59
- message . error ( error ) ;
60
- } ) ;
61
-
62
- return false ;
63
- } }
64
- >
65
- < Button icon = { < UploadOutlined /> } />
66
- </ Upload >
93
+ { [ fileUpBtn , imgUpBtn ] }
67
94
</ Space >
68
95
) ;
69
96
} ;
70
97
71
- const SenderFileInfo = ( ) => {
72
- if ( fileList && fileList . length > 0 ) {
73
- return (
74
- < div className = { cx ( styles . fileInfo , `${ prefixClass } -sender-file-info` ) } >
75
- < Upload
76
- { ...upload }
77
- fileList = { fileList }
78
- listType = "picture"
79
- onRemove = { ( file ) => {
80
- const result = localStorageManager . removeFiles ( [ file . uid ] ) ;
81
- if ( result [ 0 ] . success ) {
82
- setFileList ( ( prevList ) => prevList . filter ( ( item ) => item . uid !== file . uid ) ) ;
83
- } else {
84
- message . error ( result [ 0 ] . error ) ;
85
- }
86
- } }
87
- />
88
- < Divider />
89
- </ div >
90
- ) ;
98
+ const senderFileInfoRender = ( ) => {
99
+ const fileInputRender = ( ) => {
100
+ if ( fileList && fileList . length > 0 ) {
101
+ return (
102
+ < div className = { cx ( styles . fileInfo , `${ prefixClass } -sender-file-info` ) } >
103
+ < Upload
104
+ { ...upload }
105
+ fileList = { fileList }
106
+ listType = "picture"
107
+ onRemove = { ( file ) => {
108
+ const result = localStorageManager . removeFiles ( [ file . uid ] ) ;
109
+ if ( result [ 0 ] . success ) {
110
+ setFileList ( ( prevList ) => prevList . filter ( ( item ) => item . uid !== file . uid ) ) ;
111
+ } else {
112
+ message . error ( result [ 0 ] . error ) ;
113
+ }
114
+ } }
115
+ />
116
+ < Divider />
117
+ </ div >
118
+ ) ;
119
+ }
120
+ return < > </ > ;
121
+ } ;
122
+
123
+ if ( actions ?. actionsInfoRender ) {
124
+ return actions . actionsInfoRender ( fileInputRender ( ) , fileList ) ;
91
125
}
92
- return < > </ > ;
126
+ return fileInputRender ( ) ;
93
127
} ;
94
128
95
- const SenderArea = ( ) => {
129
+ const senderAreaRender = ( ) => {
96
130
const { onSubmit : defaultSubmit } = sender || { } ;
97
131
return (
98
132
< Sender
@@ -116,18 +150,12 @@ const ProSender = (
116
150
) ;
117
151
} ;
118
152
119
- const Wrapper = ( { children } ) => {
120
- return (
121
- < div className = { cx ( styles . container , `${ prefixClass } -sender` , className ) } > { children } </ div >
122
- ) ;
123
- } ;
124
-
125
153
return (
126
- < Wrapper >
127
- < ProSenderActions />
128
- < SenderFileInfo />
129
- < SenderArea />
130
- </ Wrapper >
154
+ < div className = { cx ( styles . container , ` ${ prefixClass } -sender` , className ) } >
155
+ { senderActionsRender ( ) }
156
+ { senderFileInfoRender ( ) }
157
+ { senderAreaRender ( ) }
158
+ </ div >
131
159
) ;
132
160
} ;
133
161
0 commit comments