ember-nav-stack 6.0.3 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v6.1.1 (2025-12-02)
2
+
3
+ ## v6.1.0 (2025-10-30)
4
+
1
5
  ## v6.0.3 (2024-03-01)
2
6
 
3
7
  ## v6.0.2 (2023-12-15)
package/README.md CHANGED
@@ -25,6 +25,11 @@ Usage
25
25
 
26
26
  [Longer description of how to use the addon in apps.]
27
27
 
28
+ Testing
29
+ ------------------------------------------------------------------------------
30
+
31
+ `ember-nav-stack` registers waiters for stack recomputes and transition animations. Ember's built-in test helpers such as `visit` and `click` wait for these operations automatically, so downstream apps should not need custom "nav stack idle" helpers or manual `waitFor` calls.
32
+
28
33
 
29
34
  Contributing
30
35
  ------------------------------------------------------------------------------
@@ -520,7 +520,6 @@ export default class NavStack extends Component {
520
520
  this.parentHeaderElement,
521
521
  this.currentHeaderElement,
522
522
  );
523
- run(this.args, this.args.back);
524
523
  } else {
525
524
  setTransform(this.containerElement, `translateX(${this.startingX}px)`);
526
525
  styleHeaderElements(
@@ -544,6 +543,9 @@ export default class NavStack extends Component {
544
543
  }
545
544
  this.navStacksService.notifyTransitionEnd();
546
545
  this._activeSpring = null;
546
+ if (shouldNavigateBack) {
547
+ run(this.args, this.args.back);
548
+ }
547
549
  };
548
550
  if (fromValue === toValue && initialVelocity === 0) {
549
551
  finalize();
@@ -5,10 +5,13 @@ import EmberObject from '@ember/object';
5
5
  import { Promise as EmberPromise } from 'rsvp';
6
6
  import { buildWaiter } from '@ember/test-waiters';
7
7
  import { set } from '@ember/object';
8
- let waiter = buildWaiter('ember-nav-stack:transition-waiter');
8
+ let transitionWaiter = buildWaiter('ember-nav-stack:transition');
9
+ let stackWaiter = buildWaiter('ember-nav-stack:stack-update');
9
10
 
10
11
  export default class NavStacks extends Service {
11
- waiterToken;
12
+ transitionToken;
13
+ _stackUpdateToken;
14
+ _initialRenderToken;
12
15
 
13
16
  constructor() {
14
17
  super(...arguments);
@@ -18,6 +21,7 @@ export default class NavStacks extends Service {
18
21
  this._counter = 1;
19
22
  this._runningTransitions = 0;
20
23
  this.isInitialRender = true;
24
+ this._initialRenderToken = stackWaiter.beginAsync();
21
25
  }
22
26
 
23
27
  pushItem(sourceId, layer, component, headerComponent) {
@@ -46,15 +50,20 @@ export default class NavStacks extends Service {
46
50
  notifyTransitionStart() {
47
51
  this._runningTransitions++;
48
52
  if (this._runningTransitions === 1) {
49
- this.waiterToken = waiter.beginAsync();
53
+ this.transitionToken = transitionWaiter.beginAsync();
50
54
  }
51
55
  }
52
56
 
53
57
  notifyTransitionEnd() {
54
58
  this._runningTransitions--;
59
+ if (this._runningTransitions < 0) {
60
+ this._runningTransitions = 0;
61
+ }
55
62
  if (this._runningTransitions === 0) {
56
- waiter.endAsync(this.waiterToken);
57
- this.waiterToken = undefined;
63
+ if (this.transitionToken) {
64
+ transitionWaiter.endAsync(this.transitionToken);
65
+ }
66
+ this.transitionToken = undefined;
58
67
  }
59
68
  next(() => {
60
69
  this._maybeResolveIdle();
@@ -84,7 +93,12 @@ export default class NavStacks extends Service {
84
93
  didUpdate() {} // hook
85
94
 
86
95
  _maybeResolveIdle() {
87
- if (this._runningTransitions === 0 && this._resolveWaiting) {
96
+ if (
97
+ this._runningTransitions === 0 &&
98
+ !this._stackUpdateToken &&
99
+ !this._initialRenderToken &&
100
+ this._resolveWaiting
101
+ ) {
88
102
  let resolveWaiting = this._resolveWaiting;
89
103
  this._resolveWaiting = null;
90
104
  this._waitingPromise = null;
@@ -93,12 +107,16 @@ export default class NavStacks extends Service {
93
107
  }
94
108
 
95
109
  _schedule() {
110
+ if (!this._stackUpdateToken) {
111
+ this._stackUpdateToken = stackWaiter.beginAsync();
112
+ }
96
113
  scheduleOnce('afterRender', this, this._process);
97
114
  }
98
115
 
99
116
  _process() {
100
117
  let newStacks = {};
101
118
  let itemsById = this._itemsById;
119
+ let wasInitialRender = this.isInitialRender === true;
102
120
 
103
121
  for (var sourceId in itemsById) {
104
122
  let { layer, component, headerComponent, order } = itemsById[sourceId];
@@ -117,6 +135,17 @@ export default class NavStacks extends Service {
117
135
  }
118
136
  this._listeners.invoke('stackItemsDidChange');
119
137
  this.didUpdate();
138
+ next(() => {
139
+ if (wasInitialRender && this._initialRenderToken) {
140
+ stackWaiter.endAsync(this._initialRenderToken);
141
+ this._initialRenderToken = undefined;
142
+ }
143
+ if (this._stackUpdateToken) {
144
+ stackWaiter.endAsync(this._stackUpdateToken);
145
+ this._stackUpdateToken = undefined;
146
+ }
147
+ this._maybeResolveIdle();
148
+ });
120
149
  }
121
150
 
122
151
  _clearIsInitialRender() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-nav-stack",
3
- "version": "6.0.3",
3
+ "version": "6.1.1",
4
4
  "description": "The default blueprint for ember-cli addons.",
5
5
  "keywords": [
6
6
  "ember-addon"