@@ -11,6 +11,7 @@ import {
1111 SIZES_HEIGHT_DEFAULT ,
1212} from 'ember-element-query' ;
1313import { inject as service } from '@ember/service' ;
14+ import { waitFor } from '@ember/test-waiters' ;
1415export interface SizeObject {
1516 name : string ;
1617 value : number ;
@@ -22,6 +23,7 @@ export type RangeDirection = 'at' | 'from' | 'to';
2223interface ResizeObserverService {
2324 observe ( element : HTMLElement , callback ?: ( ) => void ) : void ;
2425 unobserve ( element : HTMLElement , callback ?: ( ) => void ) : void ;
26+ isEnabled : boolean ;
2527}
2628
2729/** @internal */
@@ -41,6 +43,7 @@ export default class ElementQueryModifier extends Modifier<ModifierArgs> {
4143 sizesRatioDefault : Sizes = SIZES_RATIO_DEFAULT ;
4244
4345 _element ?: HTMLElement ; // For some reason, this.element is not always available
46+ _promiseResolveHasBeenInstalled ?: ( value ?: unknown ) => void ;
4447
4548 // -------------------
4649 // Computed properties
@@ -541,12 +544,20 @@ export default class ElementQueryModifier extends Modifier<ModifierArgs> {
541544 : sizeObjectsSortedAsc [ sizeObjectsSortedAsc . length - 1 ] ;
542545 }
543546
547+ _maybeRunPromiseResolveHasBeenInstalled ( ) : void {
548+ if ( this . _promiseResolveHasBeenInstalled ) {
549+ this . _promiseResolveHasBeenInstalled ( ) ;
550+ this . _promiseResolveHasBeenInstalled = undefined ;
551+ }
552+ }
553+
544554 _didResizeHandler ( ) : void {
545555 window . requestAnimationFrame ( ( ) => {
546556 if ( ! this . args . named . isDisabled && ! this . isDestroying && ! this . isDestroyed ) {
547557 this . applyAttributesToElement ( ) ;
548558 this . callOnResize ( ) ;
549559 }
560+ this . _maybeRunPromiseResolveHasBeenInstalled ?.( ) ;
550561 } ) ;
551562 }
552563
@@ -561,18 +572,25 @@ export default class ElementQueryModifier extends Modifier<ModifierArgs> {
561572 // -------------------
562573 // Lifecycle hooks
563574 // -------------------
564-
565- didInstall ( ) : void {
575+ @ waitFor
576+ didInstall ( ) : void | Promise < void > {
566577 if ( ! this . element ) throw new Error ( 'Expected this.element to be available' ) ;
567578
568579 this . _element = this . element ;
569580
570581 this . resizeObserver . observe ( this . element , this . didResizeHandler ) ; // eslint-disable-line @typescript-eslint/unbound-method
582+
583+ if ( ! this . args . named . isDisabled && this . resizeObserver . isEnabled ) {
584+ return new Promise ( ( resolve ) => {
585+ this . _promiseResolveHasBeenInstalled = resolve ;
586+ } ) ;
587+ } else {
588+ return Promise . resolve ( ) ;
589+ }
571590 }
572591
573592 didUpdateArguments ( ) : void {
574- // @ts -ignore https://github.com/Microsoft/TypeScript/issues/28502#issuecomment-609607344
575- if ( ! ResizeObserver ) return ;
593+ if ( ! this . resizeObserver . isEnabled ) return ;
576594
577595 this . didResizeHandler ( ) ;
578596 }
0 commit comments