From 78d9c9f9c3a2b006c3968efbcd2ada28ae549b67 Mon Sep 17 00:00:00 2001
From: Enlcxx <8032887+Enlcxx@users.noreply.github.com>
Date: Sat, 1 Dec 2018 10:27:55 -0500
Subject: [PATCH] feat(core): add resize event

---
 src/lib/public_api.ts      |  1 +
 src/lib/src/dom/overlay.ts | 28 +++++++++++++++-------------
 src/lib/src/dom/resize.ts  | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 13 deletions(-)
 create mode 100644 src/lib/src/dom/resize.ts

diff --git a/src/lib/public_api.ts b/src/lib/public_api.ts
index 4a0dc4f15..fecc21916 100644
--- a/src/lib/public_api.ts
+++ b/src/lib/public_api.ts
@@ -21,6 +21,7 @@ export * from './src/dom/overlay-container';
 export * from './src/dom/overlay';
 export * from './src/dom/overlay.module';
 export * from './src/dom/mutation-observer-factory';
+export * from './src/dom/resize';
 export * from './src/common/index';
 export * from './src/ripple/index';
 export * from './src/position/position';
diff --git a/src/lib/src/dom/overlay.ts b/src/lib/src/dom/overlay.ts
index cd3a2a632..0f4674e85 100644
--- a/src/lib/src/dom/overlay.ts
+++ b/src/lib/src/dom/overlay.ts
@@ -1,6 +1,7 @@
 import { TemplateRef, EmbeddedViewRef, Injectable, ApplicationRef, ComponentFactoryResolver, Injector, ComponentRef, Type } from '@angular/core';
 import { LyOverlayContainer, LyOverlayBackdrop, WindowScrollService } from './overlay-container';
-import { Subscription } from 'rxjs';
+import { Subscription, merge } from 'rxjs';
+import { ResizeService } from './resize';
 
 interface OverlayConfig {
   styles: Object;
@@ -28,7 +29,7 @@ class CreateFromTemplateRef implements OverlayFromTemplateRef {
   private _el: HTMLDivElement;
   private _compRef: ComponentRef<any>;
   private _compRefOverlayBackdrop: ComponentRef<any>;
-  windowScrollSub: Subscription = Subscription.EMPTY;
+  windowSRSub: Subscription = Subscription.EMPTY;
   get containerElement() {
     return this._el;
   }
@@ -40,6 +41,7 @@ class CreateFromTemplateRef implements OverlayFromTemplateRef {
     _context: any,
     private _injector: Injector,
     windowScroll: WindowScrollService,
+    resizeService: ResizeService,
     config?: OverlayConfig
   ) {
     // this._viewRef = _templateRef.createEmbeddedView(_context);
@@ -71,15 +73,13 @@ class CreateFromTemplateRef implements OverlayFromTemplateRef {
 
     this.updateStyles(__styles);
     if (config.host) {
-      this.windowScrollSub = windowScroll.scroll$.subscribe(() => {
+      this.windowSRSub = merge(windowScroll.scroll$, resizeService.resize$).subscribe(() => {
         const rect = config.host.getBoundingClientRect();
-        if (rect.top !== __styles.top || rect.left !== __styles.left) {
-          const newStyles = {
-            top: rect.top,
-            left: rect.left
-          };
-          this.updateStyles(newStyles);
-        }
+        const newStyles = {
+          top: rect.top,
+          left: rect.left
+        };
+        this.updateStyles(newStyles);
       });
     }
 
@@ -161,7 +161,7 @@ class CreateFromTemplateRef implements OverlayFromTemplateRef {
       const backdropEl = this._compRefOverlayBackdrop.location.nativeElement;
       this._overlayContainer._remove(backdropEl);
     }
-    this.windowScrollSub.unsubscribe();
+    this.windowSRSub.unsubscribe();
   }
 
   destroy() {
@@ -180,10 +180,12 @@ export class LyOverlay {
     private _componentFactoryResolver: ComponentFactoryResolver,
     private _appRef: ApplicationRef,
     private _injector: Injector,
-    private _windowScroll: WindowScrollService
+    private _windowScroll: WindowScrollService,
+    private _resizeService: ResizeService
   ) { }
 
   create(template: TemplateRef<any> | string, context?: any, config?: OverlayConfig): OverlayFromTemplateRef {
-    return new CreateFromTemplateRef(this._componentFactoryResolver, this._appRef, template, this._overlayContainer, context, this._injector, this._windowScroll, config);
+    return new CreateFromTemplateRef(
+      this._componentFactoryResolver, this._appRef, template, this._overlayContainer, context, this._injector, this._windowScroll, this._resizeService, config);
   }
 }
diff --git a/src/lib/src/dom/resize.ts b/src/lib/src/dom/resize.ts
new file mode 100644
index 000000000..efd5985e1
--- /dev/null
+++ b/src/lib/src/dom/resize.ts
@@ -0,0 +1,33 @@
+import { Injectable, Inject, NgZone } from '@angular/core';
+import { DOCUMENT } from '@angular/common';
+import { fromEvent , Observable, empty } from 'rxjs';
+import { map, share, auditTime } from 'rxjs/operators';
+
+import { Platform } from '../platform/index';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ResizeService {
+
+  public resize$: Observable<number>;
+
+  constructor(
+    @Inject(DOCUMENT) private document: any,
+    ngZone: NgZone
+  ) {
+    if (Platform.isBrowser) {
+      ngZone.runOutsideAngular(() => {
+        this.resize$ = fromEvent(window, 'resize').pipe(
+          auditTime(20),
+          map(() => {
+            return window.innerHeight || this.document.documentElement.clientHeight;
+          }),
+          share()
+        );
+      });
+    } else {
+      this.resize$ = empty();
+    }
+  }
+}