Improve screen cache service
authorChocobozzz <me@florianbigard.com>
Mon, 18 Jun 2018 08:04:08 +0000 (10:04 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 18 Jun 2018 08:26:20 +0000 (10:26 +0200)
client/src/app/shared/misc/screen.service.ts

index 5b17a914a5d76dd984d9a9ae56e1b47232baf859..2e01839b2c28c9dd6646c5d1cedaf2fd16fab642 100644 (file)
@@ -1,23 +1,37 @@
-import { Injectable, NgZone } from '@angular/core'
+import { Injectable } from '@angular/core'
 
 @Injectable()
 export class ScreenService {
   private windowInnerWidth: number
+  private lastFunctionCallTime: number
+  private cacheForMs = 500
 
-  constructor (private zone: NgZone) {
-    this.windowInnerWidth = window.innerWidth
-
-    // Try to cache a little bit window.innerWidth
-    this.zone.runOutsideAngular(() => {
-      setInterval(() => this.windowInnerWidth = window.innerWidth, 500)
-    })
+  constructor () {
+    this.refreshWindowInnerWidth()
   }
 
   isInSmallView () {
-    return this.windowInnerWidth < 600
+    return this.getWindowInnerWidth() < 600
   }
 
   isInMobileView () {
-    return this.windowInnerWidth < 500
+    return this.getWindowInnerWidth() < 500
+  }
+
+  // Cache window inner width, because it's an expensive call
+  private getWindowInnerWidth () {
+    if (this.cacheWindowInnerWidthExpired()) this.refreshWindowInnerWidth()
+
+    return this.windowInnerWidth
+  }
+
+  private refreshWindowInnerWidth () {
+    this.lastFunctionCallTime = new Date().getTime()
+
+    this.windowInnerWidth = window.innerWidth
+  }
+
+  private cacheWindowInnerWidthExpired () {
+    return new Date().getTime() > (this.lastFunctionCallTime + this.cacheForMs)
   }
 }