import { WebViewWindow } from 'background/webViewWindow'; import { Logger } from 'common/logger'; export enum JoinClassOptOutUserChoice { Reject, Accept } type MonitoringStatusWindowState = 'None' | 'UserRequest' | 'ActiveMonitoring' | 'ConfirmStopMonitoring'; export interface IMonitoringStatusEventHandler { onClassOptOut(userChoice: JoinClassOptOutUserChoice): void; getTeacherName(): string; } export class MonitoringStatusWindowController { private monitorWindow: WebViewWindow; private lastMonitoringWindowState: MonitoringStatusWindowState | null = null; private myState: MonitoringStatusWindowState = 'None'; private myEventHandler: IMonitoringStatusEventHandler; private logger = Logger.getInstance(); public constructor(eventHandler: IMonitoringStatusEventHandler) { this.monitorWindow = new WebViewWindow(); this.myEventHandler = eventHandler; chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { switch (request.message) { case 'UserAllowsMonitoring': { this.myEventHandler.onClassOptOut(JoinClassOptOutUserChoice.Accept); } break; case 'UserRejectsMonitoring': { this.myEventHandler.onClassOptOut(JoinClassOptOutUserChoice.Reject); } break; case 'MonitoringWindowState': { this.lastMonitoringWindowState = request.stateObj; } break; case 'RequestMonitoringWindowState': { //2nd RequestMonitoringWindowState request from the dialog itself, and will result in monitor prompt buttons being created if (this.lastMonitoringWindowState) { sendResponse(this.lastMonitoringWindowState); } sendResponse({ presentation: 'UserRequest', param: chrome.i18n.getMessage('your_teacher') || 'Your teacher' }); } break; case 'MonitoringWindowLogMessage': { this.logger.logMessage('Monitor Window:' + request.data); } break; } }); } public displayJoinClassOptOut(): void { //state could be UserRequest if user has 'closed all windows' while monitor prompt is up. // the dialog will reload and this function will get run again if (this.myState !== 'None' && this.myState !== 'UserRequest') { return; } this.myState = 'UserRequest'; return this.displayMonitoringWindow(); } public displayWeAreActiveMonitoring(): void { this.myState = 'ActiveMonitoring'; return this.displayMonitoringWindow(); } protected displayMonitoringWindow(): void { chrome.app.window.create( 'monitoringStatus.html', { hidden: false, id: 'monitoringStatus', resizable: false, alwaysOnTop: true, frame: 'none' }, (win: chrome.app.window.AppWindow) => { this.logger.logMessage('displayMonitoringWindow(): Created window'); if (win) { this.monitorWindow.setAppWindow(win); this.monitorWindow.onWindowLoad(() => { var w = 430; var h = 130; const bounds = { width: w, height: h, top: Math.round(screen.height / 2 - h / 2), left: Math.round(screen.width / 2 - w / 2) }; this.monitorWindow.setSizeAndPosition(bounds); this.monitorWindow.makeModal(); }); this.monitorWindow.onClosed(() => { //@ts-ignore - typescript is not using both interfaces of myEventHandler, so it doesn't recognize that this method is allowed this.myEventHandler.joinClassOptOut(); }); } } ); } public closeWindow() { chrome.runtime.sendMessage({ message: 'CloseMonitoringStatusWindow' }); this.myState = 'None'; this.lastMonitoringWindowState = null; } }