Skip to content

Commit 52cdc34

Browse files
dimensijquense
authored andcommitted
feat: add appear timeout (#462)
* add appear timeout and tests for this * update jsdoc * add todo for fallback
1 parent ea5761b commit 52cdc34

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

src/Transition.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ class Transition extends React.Component {
212212
if (timeout != null && typeof timeout !== 'number') {
213213
exit = timeout.exit
214214
enter = timeout.enter
215-
appear = timeout.appear
215+
// TODO: remove fallback for next major
216+
appear = timeout.appear !== undefined ? timeout.appear : enter
216217
}
217218
return { exit, enter, appear }
218219
}
@@ -240,7 +241,7 @@ class Transition extends React.Component {
240241
: mounting
241242

242243
const timeouts = this.getTimeouts()
243-
244+
const enterTimeout = appearing ? timeouts.appear : timeouts.enter
244245
// no enter animation skip right to ENTERED
245246
// if we are mounting and running this it means appear _must_ be set
246247
if (!mounting && !enter) {
@@ -255,8 +256,7 @@ class Transition extends React.Component {
255256
this.safeSetState({ status: ENTERING }, () => {
256257
this.props.onEntering(node, appearing)
257258

258-
// FIXME: appear timeout?
259-
this.onTransitionEnd(node, timeouts.enter, () => {
259+
this.onTransitionEnd(node, enterTimeout, () => {
260260
this.safeSetState({ status: ENTERED }, () => {
261261
this.props.onEntered(node, appearing)
262262
})
@@ -438,9 +438,12 @@ Transition.propTypes = {
438438
* timeout={{
439439
* enter: 300,
440440
* exit: 500,
441+
* appear: 500,
441442
* }}
442443
* ```
443444
*
445+
* If the value of appear is not set, then the value from enter is taken.
446+
*
444447
* @type {number | { enter?: number, exit?: number }}
445448
*/
446449
timeout: (props, ...args) => {

src/utils/PropTypes.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ export const timeoutsShape =
66
PropTypes.number,
77
PropTypes.shape({
88
enter: PropTypes.number,
9-
exit: PropTypes.number
9+
exit: PropTypes.number,
10+
appear: PropTypes.number,
1011
}).isRequired
1112
])
1213
: null;

test/Transition-test.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,53 @@ describe('Transition', () => {
131131
inst.setProps({ in: true })
132132
})
133133

134+
describe('appearing timeout', () => {
135+
it('should use enter timeout if appear not set', done => {
136+
let calledBeforeEntered = false
137+
setTimeout(() => {
138+
calledBeforeEntered = true
139+
}, 10)
140+
const wrapper = mount(
141+
<Transition in={true} timeout={{ enter: 20, exit: 10 }} appear>
142+
<div />
143+
</Transition>
144+
)
145+
146+
wrapper.setProps({
147+
onEntered() {
148+
if (calledBeforeEntered) {
149+
done()
150+
} else {
151+
throw new Error('wrong timeout')
152+
}
153+
},
154+
})
155+
})
156+
157+
it('should use appear timeout if appear is set', done => {
158+
const wrapper = mount(
159+
<Transition in={true} timeout={{ enter: 20, exit: 10, appear: 5 }} appear>
160+
<div />
161+
</Transition>
162+
)
163+
164+
let isCausedLate = false
165+
setTimeout(() => {
166+
isCausedLate = true
167+
}, 15)
168+
169+
wrapper.setProps({
170+
onEntered() {
171+
if (isCausedLate) {
172+
throw new Error('wrong timeout')
173+
} else {
174+
done()
175+
}
176+
}
177+
})
178+
})
179+
})
180+
134181
describe('entering', () => {
135182
let wrapper
136183

0 commit comments

Comments
 (0)