Skip to content

Commit 05167ec

Browse files
committed
Set startedTransitionIn to true before showing animation
1 parent e063ce0 commit 05167ec

File tree

2 files changed

+146
-4
lines changed

2 files changed

+146
-4
lines changed

Diff for: addon/src/modifiers/css-transition.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ if (macroCondition(dependencySatisfies('ember-modifier', '>=3.2.0 || 4.x'))) {
2727
parentElement = null;
2828
nextElementSibling = null;
2929
installed = false;
30-
finishedTransitionIn = false;
30+
startedTransitionIn = false;
3131
isEnabled = true;
3232
parentSelector;
3333

@@ -108,7 +108,7 @@ if (macroCondition(dependencySatisfies('ember-modifier', '>=3.2.0 || 4.x'))) {
108108
super(owner, args);
109109

110110
registerDestructor(this, () => {
111-
if (this.isEnabled === false || !this.finishedTransitionIn) {
111+
if (this.isEnabled === false || !this.startedTransitionIn) {
112112
return;
113113
}
114114

@@ -222,6 +222,8 @@ if (macroCondition(dependencySatisfies('ember-modifier', '>=3.2.0 || 4.x'))) {
222222
}
223223

224224
*transitionIn() {
225+
this.startedTransitionIn = true;
226+
225227
if (this.enterClass) {
226228
yield* this.transition({
227229
className: this.enterClass,
@@ -233,8 +235,6 @@ if (macroCondition(dependencySatisfies('ember-modifier', '>=3.2.0 || 4.x'))) {
233235
this.didTransitionIn();
234236
}
235237
}
236-
237-
this.finishedTransitionIn = true;
238238
}
239239

240240
*transitionOut() {

Diff for: test-app/tests/integration/components/css-transition-test.js

+142
Original file line numberDiff line numberDiff line change
@@ -500,4 +500,146 @@ module('Integration | Component | transition group', function (hooks) {
500500
.dom('#my-element')
501501
.exists({ count: 1 }, 'child element is still rendered');
502502
});
503+
504+
module('Always call didTransitionOut', function () {
505+
let testCases = [
506+
{
507+
name: 'element',
508+
template: hbs`
509+
<style>
510+
.window-enter,
511+
.window-leave-to {
512+
opacity: 0;
513+
transform: scale(0.9);
514+
}
515+
516+
.window-enter-active,
517+
.window-leave-active {
518+
transition: opacity 0.5s ease, transform 0.5s ease;
519+
}
520+
521+
.window-enter-to,
522+
.window-leave {
523+
opacity: 1;
524+
transform: scale(1);
525+
}
526+
</style>
527+
528+
{{#if this.show}}
529+
<div id="my-element" {{css-transition
530+
enterClass="window-enter"
531+
enterActiveClass="window-enter-active"
532+
enterToClass="window-enter-to"
533+
leaveClass="window-leave"
534+
leaveActiveClass="window-leave-active"
535+
leaveToClass="window-leave-to"
536+
didTransitionOut=this.didTransitionOut
537+
}}>
538+
<p class="content">Çup?</p>
539+
</div>
540+
{{/if}}
541+
`,
542+
},
543+
{
544+
name: 'classic component',
545+
template: hbs`
546+
<style>
547+
.window-enter,
548+
.window-leave-to {
549+
opacity: 0;
550+
transform: scale(0.9);
551+
}
552+
553+
.window-enter-active,
554+
.window-leave-active {
555+
transition: opacity 0.5s ease, transform 0.5s ease;
556+
}
557+
558+
.window-enter-to,
559+
.window-leave {
560+
opacity: 1;
561+
transform: scale(1);
562+
}
563+
</style>
564+
565+
{{#if this.show}}
566+
<MyComponent id="my-element" {{css-transition
567+
enterClass="window-enter"
568+
enterActiveClass="window-enter-active"
569+
enterToClass="window-enter-to"
570+
leaveClass="window-leave"
571+
leaveActiveClass="window-leave-active"
572+
leaveToClass="window-leave-to"
573+
didTransitionOut=this.didTransitionOut
574+
}}>
575+
<p class="content">Çup?</p>
576+
</MyComponent>
577+
{{/if}}
578+
`,
579+
},
580+
{
581+
name: 'glimmer component',
582+
template: hbs`
583+
<style>
584+
.window-enter,
585+
.window-leave-to {
586+
opacity: 0;
587+
transform: scale(0.9);
588+
}
589+
590+
.window-enter-active,
591+
.window-leave-active {
592+
transition: opacity 0.5s ease, transform 0.5s ease;
593+
}
594+
595+
.window-enter-to,
596+
.window-leave {
597+
opacity: 1;
598+
transform: scale(1);
599+
}
600+
</style>
601+
602+
{{#if this.show}}
603+
<GlimmerComponent id="my-element" {{css-transition
604+
enterClass="window-enter"
605+
enterActiveClass="window-enter-active"
606+
enterToClass="window-enter-to"
607+
leaveClass="window-leave"
608+
leaveActiveClass="window-leave-active"
609+
leaveToClass="window-leave-to"
610+
didTransitionOut=this.didTransitionOut
611+
}}>
612+
<p class="content">Çup?</p>
613+
</GlimmerComponent>
614+
{{/if}}
615+
`,
616+
},
617+
];
618+
619+
testCases.forEach((i) => {
620+
test(`didTransitionOut is called for (${i.name})`, async function (assert) {
621+
this.didTransitionOut = () => {
622+
assert.step('transition-out');
623+
};
624+
625+
this.set('show', false);
626+
627+
await render(i.template);
628+
629+
this.set('show', true);
630+
631+
await new Promise((resolve) => {
632+
setTimeout(resolve, 1);
633+
});
634+
635+
this.set('show', false);
636+
637+
await new Promise((resolve) => {
638+
setTimeout(resolve, 2000);
639+
});
640+
641+
assert.verifySteps(['transition-out']);
642+
});
643+
});
644+
});
503645
});

0 commit comments

Comments
 (0)