@@ -3,15 +3,16 @@ import { useBoolean } from 'ahooks'
3
3
import classNames from 'classnames'
4
4
import React , { useImperativeHandle , useRef } from 'react'
5
5
import { defaultPrefixCls } from '../constants'
6
+ import { isDOMTypeElement , isElement } from '../_utils/is'
6
7
7
8
export interface BaseModalAction {
8
9
close : ( ) => void
9
10
open : ( ) => void
10
11
}
11
12
12
13
export interface BaseModalProps {
13
- children ?: React . ReactElement
14
- modalContent ?: React . ReactElement
14
+ children ?: React . ReactNode
15
+ modalContent ?: React . ReactNode
15
16
onClick ?: (
16
17
e : React . MouseEvent < HTMLElement > ,
17
18
modalAction : BaseModalAction
@@ -36,32 +37,39 @@ const BaseModal: React.ForwardRefRenderFunction<unknown, BaseModalProps> = (prop
36
37
37
38
useImperativeHandle ( ref , ( ) => modalActionRef . current , [ modalActionRef ] )
38
39
39
- const handleButtonClick = ( e : React . MouseEvent < HTMLElement > ) => {
40
+ const handleButtonClick = ( event : React . MouseEvent < HTMLElement > ) => {
40
41
if ( onClick )
41
- return onClick ( e , modalActionRef . current )
42
+ return onClick ( event , modalActionRef . current )
42
43
43
44
return open ( )
44
45
}
45
46
46
- const handleModalOk = ( e : React . MouseEvent < HTMLElement > ) => {
47
+ const handleModalOk = ( event : React . MouseEvent < HTMLElement > ) => {
47
48
if ( onOk )
48
- return onOk ( e )
49
+ return onOk ( event )
49
50
50
51
return close ( )
51
52
}
52
53
53
- const handleModalCancel = ( e : React . MouseEvent < HTMLElement > ) => {
54
+ const handleModalCancel = ( event : React . MouseEvent < HTMLElement > ) => {
54
55
if ( onCancel )
55
- onCancel ( e )
56
+ onCancel ( event )
56
57
57
58
return close ( )
58
59
}
59
60
60
- const buttonNode
61
- = children && React . cloneElement ( children , { onClick : handleButtonClick } )
62
-
63
- const childrenNode
64
- = modalContent && React . cloneElement ( modalContent , { modalAction : modalActionRef . current } )
61
+ // ======================== buttonNode ========================
62
+ let buttonNode : React . ReactNode = children
63
+ if ( React . isValidElement ( children ) )
64
+ buttonNode = React . cloneElement < any > ( children , { onClick : handleButtonClick } )
65
+
66
+ // ======================== modalContent ========================
67
+ let childrenNode : React . ReactNode = modalContent
68
+ if ( isElement ( childrenNode ) && ! isDOMTypeElement ( childrenNode ) ) {
69
+ childrenNode = React . cloneElement < any > ( childrenNode , {
70
+ modalAction : modalActionRef . current ,
71
+ } )
72
+ }
65
73
66
74
return (
67
75
< >
0 commit comments