All files / dialer justcall-dialer-event-listener.ts

100% Statements 21/21
66.66% Branches 6/9
100% Functions 3/3
100% Lines 19/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98                            8x 8x       8x                     8x 8x 8x       8x                   8x                     16x   16x   16x   13x         13x   1x     1x   1x     1x   1x     1x                            
import {
  CallAnsweredEventData,
  CallEndedEventData,
  CallRingingEventData,
  LoggedInEventData,
  LoginCallback,
  LogoutCallback,
  JustCallDialerEvent,
  IsLoggedInData,
} from "../types";
import { JustCallClientEventEmitter } from "./justcall-client-event-emitter";
 
export class JustCallDialerEventListeners {
  private justcallClientEventEmitter: JustCallClientEventEmitter;
  private onLogin: LoginCallback | null = null;
  private onLogout: LogoutCallback | null = null;
  private awaitedListeners: Map<
    JustCallDialerEvent,
    { resolve: (value: boolean) => void; reject: (reason?: unknown) => void }
  > = new Map();
 
  constructor({
    onLogin,
    onLogout,
    clientEventEmitter,
  }: {
    onLogin: LoginCallback | null;
    onLogout: LogoutCallback | null;
    clientEventEmitter: JustCallClientEventEmitter;
  }) {
    Eif (onLogin) this.onLogin = onLogin;
    Eif (onLogout) this.onLogout = onLogout;
    this.justcallClientEventEmitter = clientEventEmitter;
  }
 
  public startListening() {
    window.addEventListener("message", this.handleMessage);
  }
 
  /* istanbul ignore next -- @preserve */
  public awaitForEvent(event: JustCallDialerEvent) {
    return new Promise<boolean>((resolve, reject) => {
      this.awaitedListeners.set(event, { resolve, reject });
    });
  }
 
  private handleMessage = (
    event: MessageEvent<{
      name: JustCallDialerEvent;
      data:
        | LoggedInEventData
        | CallRingingEventData
        | CallAnsweredEventData
        | CallEndedEventData
        | IsLoggedInData;
    }>
  ): void => {
    const { name: eventType, data: eventData } = event.data;
 
    const awiatedPromise = this.awaitedListeners.get(eventType);
 
    switch (eventType) {
      case "logged-in-status":
        this.justcallClientEventEmitter.handleLoggedIn(
          eventData as LoggedInEventData,
          this.onLogin,
          this.onLogout
        );
        break;
      case "call-ringing":
        this.justcallClientEventEmitter.handleCallRinging(
          eventData as CallRingingEventData
        );
        break;
      case "call-answered":
        this.justcallClientEventEmitter.handleCallAnswered(
          eventData as CallAnsweredEventData
        );
        break;
      case "call-ended":
        this.justcallClientEventEmitter.handleCallEnded(
          eventData as CallEndedEventData
        );
        break;
      case "is-logged-in": {
        /* istanbul ignore next -- @preserve */ {
          if (awiatedPromise) {
            const isLoggedInBool = eventData === "true";
            awiatedPromise.resolve(isLoggedInBool);
            this.awaitedListeners.delete(eventType);
          }
          break;
        }
      }
    }
  };
}