Advertisement
Guest User

Untitled

a guest
May 25th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import {Directive, HostListener} from '@angular/core';
  2. import {MetricsModel} from "../models/metrics";
  3. import {MetricsProcessorService} from "./services/metrics-processor.service";
  4. import {DeviceDetectorService} from "ngx-device-detector";
  5. import * as html2canvas from "html2canvas";
  6. import {DistanceCalculatorService} from "./services/distance-calculator.service";
  7.  
  8.  
  9. @Directive({
  10.   selector: '[appMetricsProcessor]'
  11. })
  12. export class MetricsProcessorDirective {
  13.  
  14.   private readonly width: number;
  15.   private readonly height: number;
  16.  
  17.   private metricsModel: MetricsModel;
  18.  
  19.   private isProcessing: boolean;
  20.   private startTime: number;
  21.   private endTime: number;
  22.   private blurTime: number;
  23.   private blurTimeStamp: number;
  24.  
  25.   constructor(private deviceDetector: DeviceDetectorService,
  26.               private metricsProcessorService: MetricsProcessorService,
  27.               private distanceCalculator: DistanceCalculatorService) {
  28.  
  29.     this.metricsModel = new MetricsModel();
  30.     this.width = window.innerWidth;
  31.     this.height = window.innerHeight;
  32.   }
  33.  
  34.   @HostListener('window:keyup.shift.d', ['$event'])
  35.   dKeyEvent(event: KeyboardEvent) {
  36.     this.storeScreenShot();
  37.  
  38.     this.distanceCalculator.switchProcessing();
  39.  
  40.     if (this.isProcessing) {
  41.       this.endTime = event.timeStamp;
  42.       this.stopProcessing();
  43.     } else {
  44.       this.startTime = event.timeStamp;
  45.       this.startProcessing();
  46.     }
  47.     this.isProcessing = !this.isProcessing;
  48.   }
  49.  
  50.   @HostListener('window:keyup.shift.w', ['$event'])
  51.   wKeyEvent(event: KeyboardEvent) {
  52.     this.distanceCalculator.switchProcessing();
  53.     this.isProcessing = !this.isProcessing;
  54.   }
  55.  
  56.   @HostListener('window:keyup.shift.r', ['$event'])
  57.   rKeyEvent(event: KeyboardEvent) {
  58.     this.distanceCalculator.switchProcessing();
  59.      
  60.     if (this.isProcessing) {
  61.       this.endTime = event.timeStamp;
  62.       this.stopProcessing(true);
  63.       this.isProcessing = false;
  64.     }
  65.   }
  66.  
  67.   @HostListener('window:click', ['$event'])
  68.   clickEvent(event) {
  69.     this.handleClick();
  70.   }
  71.  
  72.   @HostListener('window:contextmenu', ['$event'])
  73.   rightClickEvent(event) {
  74.     this.handleClick();
  75.   }
  76.  
  77.   @HostListener('window:auxclick', ['$event'])
  78.   mouseWheelClickEvent(event) {
  79.     this.handleClick();
  80.   }
  81.  
  82.   @HostListener('window:scroll', ['$event'])
  83.   mouseWheelMoveEvent(event) {
  84.     if (this.isProcessing) {
  85.       this.distanceCalculator.addScrollDistance(50);
  86.     }
  87.   }
  88.  
  89.   @HostListener('window:blur', ['$event'])
  90.   onBlur(event: Event): void {
  91.     if (this.isProcessing) {
  92.       this.blurTimeStamp = event.timeStamp;
  93.     }
  94.   }
  95.  
  96.   @HostListener('window:focus', ['$event'])
  97.   onFocus(event: Event): void {
  98.     if (this.isProcessing) {
  99.       this.blurTime += event.timeStamp - this.blurTimeStamp;
  100.     }
  101.   }
  102.  
  103.   private handleClick() {
  104.     if (this.isProcessing) {
  105.       this.metricsModel.incrementClickCount();
  106.     }
  107.   }
  108.  
  109.   private startProcessing() {
  110.     this.metricsModel = new MetricsModel();
  111.     this.blurTime = 0;
  112.   }
  113.  
  114.   private stopProcessing(failed = false) {
  115.     this.prepareModelToPersist(failed);
  116.     this.metricsProcessorService.persist(this.metricsModel).subscribe(() => {
  117.       console.log("Metrics saved successfully");
  118.     }, () => {
  119.       console.log("Metrics save failed");
  120.     });
  121.   }
  122.  
  123.   private prepareModelToPersist(failed = false) {
  124.     this.metricsModel.browser = this.deviceDetector.browser;
  125.     this.metricsModel.width = this.width;
  126.     this.metricsModel.height = this.height;
  127.     this.metricsModel.time = this.endTime - this.startTime - this.blurTime;
  128.     this.metricsModel.failed = failed;
  129.     this.metricsModel.distance = this.distanceCalculator.getDistance();
  130.   }
  131.  
  132.   private storeScreenShot() {
  133.     html2canvas(document.body).then(canvas => {
  134.       const imgData = canvas.toDataURL("image/png");
  135.       this.metricsProcessorService.saveScreen(imgData).subscribe();
  136.     });
  137.   }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement