11import addOneClass from 'dom-helpers/addClass'
22
33import removeOneClass from 'dom-helpers/removeClass'
4- import React from 'react'
4+ import React , { FunctionComponent } from 'react'
55
66import Transition from './Transition'
77import { forceReflow } from './utils/reflow'
88
9- const addClass = ( node , classes ) =>
9+ const addClassCommon = ( node : HTMLElement | null , classes : string ) =>
1010 node && classes && classes . split ( ' ' ) . forEach ( ( c ) => addOneClass ( node , c ) )
11- const removeClass = ( node , classes ) =>
11+ const removeClassCommon = ( node : HTMLElement | null , classes : string ) =>
1212 node && classes && classes . split ( ' ' ) . forEach ( ( c ) => removeOneClass ( node , c ) )
1313
14- type classNamesShape =
14+ type ClassNamesShape =
1515 | string
1616 | {
1717 appear : string
@@ -26,95 +26,110 @@ type classNamesShape =
2626 }
2727
2828interface CSSTransitionProps {
29- classNames : classNamesShape
29+ classNames : ClassNamesShape
3030 onEnter : ( node : HTMLElement , isAppearing : boolean ) => void
3131 onEntering : ( node : HTMLElement , isAppearing : boolean ) => void
3232 onEntered : ( node : HTMLElement , isAppearing : boolean ) => void
3333 onExit : ( node : HTMLElement ) => void
3434 onExiting : ( node : HTMLElement ) => void
3535 onExited : ( node : HTMLElement ) => void
36+ nodeRef ?: React . RefObject < HTMLElement >
37+ children : React . ReactNode
3638}
3739
38- class CSSTransition extends React . Component {
39- static defaultProps = {
40- classNames : '' ,
41- }
40+ const defaultProps = {
41+ classNames : '' ,
42+ }
4243
43- appliedClasses = {
44+ const CSSTransition : FunctionComponent < Partial < CSSTransitionProps > > = (
45+ props
46+ ) => {
47+ const {
48+ classNames,
49+ onEnter : _onEnter ,
50+ onEntering : _onEntering ,
51+ onEntered : _onEntered ,
52+ onExit : _onExit ,
53+ onExiting : _onExiting ,
54+ onExited : _onExited ,
55+ nodeRef : _nodeRef ,
56+ ...childProps
57+ } = { ...defaultProps , ...props }
58+
59+ const appliedClasses = {
4460 appear : { } ,
4561 enter : { } ,
4662 exit : { } ,
4763 }
4864
49- onEnter = ( maybeNode , maybeAppearing ) => {
50- const [ node , appearing ] = this . resolveArguments ( maybeNode , maybeAppearing )
51- this . removeClasses ( node , 'exit' )
52- this . addClass ( node , appearing ? 'appear' : 'enter' , 'base' )
65+ const onEnter = ( maybeNode : any , maybeAppearing : boolean ) => {
66+ const [ node , appearing ] = resolveArguments ( maybeNode , maybeAppearing )
67+ removeClasses ( node , 'exit' )
68+ addClass ( node , appearing ? 'appear' : 'enter' , 'base' )
5369
54- if ( this . props . onEnter ) {
55- this . props . onEnter ( maybeNode , maybeAppearing )
70+ if ( _onEnter ) {
71+ _onEnter ( maybeNode , maybeAppearing )
5672 }
5773 }
5874
59- onEntering = ( maybeNode , maybeAppearing ) => {
60- const [ node , appearing ] = this . resolveArguments ( maybeNode , maybeAppearing )
75+ const onEntering = ( maybeNode : any , maybeAppearing : boolean ) => {
76+ const [ node , appearing ] = resolveArguments ( maybeNode , maybeAppearing )
6177 const type = appearing ? 'appear' : 'enter'
62- this . addClass ( node , type , 'active' )
78+ addClass ( node , type , 'active' )
6379
64- if ( this . props . onEntering ) {
65- this . props . onEntering ( maybeNode , maybeAppearing )
80+ if ( _onEntering ) {
81+ _onEntering ( maybeNode , maybeAppearing )
6682 }
6783 }
6884
69- onEntered = ( maybeNode , maybeAppearing ) => {
70- const [ node , appearing ] = this . resolveArguments ( maybeNode , maybeAppearing )
85+ const onEntered = ( maybeNode : any , maybeAppearing : boolean ) => {
86+ const [ node , appearing ] = resolveArguments ( maybeNode , maybeAppearing )
7187 const type = appearing ? 'appear' : 'enter'
72- this . removeClasses ( node , type )
73- this . addClass ( node , type , 'done' )
88+ removeClasses ( node , type )
89+ addClass ( node , type , 'done' )
7490
75- if ( this . props . onEntered ) {
76- this . props . onEntered ( maybeNode , maybeAppearing )
91+ if ( _onEntered ) {
92+ _onEntered ( maybeNode , maybeAppearing )
7793 }
7894 }
7995
80- onExit = ( maybeNode ) => {
81- const [ node ] = this . resolveArguments ( maybeNode )
82- this . removeClasses ( node , 'appear' )
83- this . removeClasses ( node , 'enter' )
84- this . addClass ( node , 'exit' , 'base' )
96+ const onExit = ( maybeNode : any ) => {
97+ const [ node ] = resolveArguments ( maybeNode )
98+ removeClasses ( node , 'appear' )
99+ removeClasses ( node , 'enter' )
100+ addClass ( node , 'exit' , 'base' )
85101
86- if ( this . props . onExit ) {
87- this . props . onExit ( maybeNode )
102+ if ( _onExit ) {
103+ _onExit ( maybeNode )
88104 }
89105 }
90106
91- onExiting = ( maybeNode ) => {
92- const [ node ] = this . resolveArguments ( maybeNode )
93- this . addClass ( node , 'exit' , 'active' )
107+ const onExiting = ( maybeNode : any ) => {
108+ const [ node ] = resolveArguments ( maybeNode )
109+ addClass ( node , 'exit' , 'active' )
94110
95- if ( this . props . onExiting ) {
96- this . props . onExiting ( maybeNode )
111+ if ( _onExiting ) {
112+ _onExiting ( maybeNode )
97113 }
98114 }
99115
100- onExited = ( maybeNode ) => {
101- const [ node ] = this . resolveArguments ( maybeNode )
102- this . removeClasses ( node , 'exit' )
103- this . addClass ( node , 'exit' , 'done' )
116+ const onExited = ( maybeNode : any ) => {
117+ const [ node ] = resolveArguments ( maybeNode )
118+ removeClasses ( node , 'exit' )
119+ addClass ( node , 'exit' , 'done' )
104120
105- if ( this . props . onExited ) {
106- this . props . onExited ( maybeNode )
121+ if ( _onExited ) {
122+ _onExited ( maybeNode )
107123 }
108124 }
109125
110126 // when prop `nodeRef` is provided `node` is excluded
111- resolveArguments = ( maybeNode , maybeAppearing ) =>
112- this . props . nodeRef
113- ? [ this . props . nodeRef . current , maybeNode ] // here `maybeNode` is actually `appearing`
127+ const resolveArguments = ( maybeNode : any , maybeAppearing : boolean ) =>
128+ _nodeRef
129+ ? [ _nodeRef . current , maybeNode ] // here `maybeNode` is actually `appearing`
114130 : [ maybeNode , maybeAppearing ] // `findDOMNode` was used
115131
116- getClassNames = ( type ) => {
117- const { classNames } = this . props
132+ const getClassNames = ( type : string ) => {
118133 const isStringClassNames = typeof classNames === 'string'
119134 const prefix = isStringClassNames && classNames ? `${ classNames } -` : ''
120135
@@ -137,9 +152,9 @@ class CSSTransition extends React.Component {
137152 }
138153 }
139154
140- addClass ( node , type , phase ) {
141- let className = this . getClassNames ( type ) [ `${ phase } ClassName` ]
142- const { doneClassName } = this . getClassNames ( 'enter' )
155+ const addClass = ( node : HTMLElement | null , type : string , phase : string ) => {
156+ let className = getClassNames ( type ) [ `${ phase } ClassName` ]
157+ const { doneClassName } = getClassNames ( 'enter' )
143158
144159 if ( type === 'appear' && phase === 'done' && doneClassName ) {
145160 className += ` ${ doneClassName } `
@@ -152,46 +167,42 @@ class CSSTransition extends React.Component {
152167 }
153168
154169 if ( className ) {
155- this . appliedClasses [ type ] [ phase ] = className
156- addClass ( node , className )
170+ appliedClasses [ type ] [ phase ] = className
171+ addClassCommon ( node , className )
157172 }
158173 }
159174
160- removeClasses ( node , type ) {
175+ const removeClasses = ( node : HTMLElement | null , type : string ) => {
161176 const {
162177 base : baseClassName ,
163178 active : activeClassName ,
164179 done : doneClassName ,
165- } = this . appliedClasses [ type ]
180+ } = appliedClasses [ type ]
166181
167- this . appliedClasses [ type ] = { }
182+ appliedClasses [ type ] = { }
168183
169184 if ( baseClassName ) {
170- removeClass ( node , baseClassName )
185+ removeClassCommon ( node , baseClassName )
171186 }
172187 if ( activeClassName ) {
173- removeClass ( node , activeClassName )
188+ removeClassCommon ( node , activeClassName )
174189 }
175190 if ( doneClassName ) {
176- removeClass ( node , doneClassName )
191+ removeClassCommon ( node , doneClassName )
177192 }
178193 }
179194
180- render ( ) {
181- const { classNames : _ , ...props } = this . props
182-
183- return (
184- < Transition
185- { ...props }
186- onEnter = { this . onEnter }
187- onEntered = { this . onEntered }
188- onEntering = { this . onEntering }
189- onExit = { this . onExit }
190- onExiting = { this . onExiting }
191- onExited = { this . onExited }
192- />
193- )
194- }
195+ return (
196+ < Transition
197+ { ...childProps }
198+ onEnter = { onEnter }
199+ onEntered = { onEntered }
200+ onEntering = { onEntering }
201+ onExit = { onExit }
202+ onExiting = { onExiting }
203+ onExited = { onExited }
204+ />
205+ )
195206}
196207
197208export default CSSTransition
0 commit comments