{"version":3,"file":"122.cf82633efe9620f1.js","mappings":"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","names":["i0","ctx_r20","VisitorLogComponent","constructor","eventService","exhibitService","auth","toaster","this","EventRole","EventEmitter","ngOnInit","user","getUser","activeUsers","initSignalR","getActiveUsers","initialized","exhibit","id","subscribe","usersUpdated","emit","connection","on","exhibitId","mergeUser","index","findIndex","x","push","close","closed","selectors","ctx_r19","ctx_r21","ctx_r23","ctx_r25","ctx_r27","ctx_r29","ctx_r31","ctx_r33","ctx_r45","ctx_r47","ctx_r48","ctx_r49","ctx_r52","ctx_r54","ctx_r55","ctx_r56","ctx_r57","ctx_r58","ctx_r59","ctx_r60","ctx_r61","ctx_r62","ctx_r64","initLayoutContainer","require","ExhibitDashboardComponent","modalService","renderer","opentokService","ref","route","router","Array","document","body","style","backgroundColor","zE","preview","snapshot","data","routeSubscription","paramMap","param","parseInt","get","getExhibitById","InitSignalR","InitOpenTok","checkAndDisplayPreviewError","messageDialog","HubConnectionBuilder","withUrl","accessTokenFactory","getToken","withAutomaticReconnect","DefaultReconnectPolicy","build","start","then","invoke","name","message","userId","console","log","messages","ChatViewModel","scrollToBottom","of","pipe","delay","result","messageContainer","nativeElement","scrollTop","scrollHeight","detectChanges","layout","webRTCLayoutContainer","initSessionForExhibits","session","event","stream","streamCount","subscription","insertMode","nameDisplayMode","element","addEventListener","classList","contains","remove","add","getSubscribersForStream","forEach","subscriber","setTimeout","connect","catch","err","error","alert","showDeviceSettings","modalRef","open","CameraTestModalComponent","size","backdrop","ariaLabelledBy","selectedDevice","componentInstance","publisher","destroy","publishing","activateCamera","reason","OT","getOT","el","createElement","initPublisher","publishAudio","publishingAudio","publishVideo","publishingVideo","resolution","width","insertDefaultUI","archiveStatusDisplayMode","buttonDisplayMode","audioSource","audioDeviceId","videoSource","videoDeviceId","appendChild","isConnected","publish","toggleVideo","toggleAudio","unpublish","exitPage","navigate","confirmDialog","sendMessage","firstName","lastName","chatMessage","shareScreen","screenPublisher","publishScreen","screenPublishing","techSupportClicked","userCount","filter","connected","length","randomUserIds","map","slice","stopScreenSharing","handleSelection","char","toggled","chatbox","focus","fullscreen","elem","fullScreen","doc","isFullScreen","exitFullscreen","n","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","requestFullscreen","t","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","exit","ev","resize","evt","ngOnDestroy","unsubscribe","stop","disconnect","ctx","ctx_r3","ExhibitVideoModalComponent","actieveModal","sanitizer","url1","url2","url3","url","indexOf","youtubeVideoId","youtubeUrl","bypassSecurityTrustResourceUrl","vimeoId","vimeoUrl","ctx_r5","ctx_r7","ExhibitMaterialsComponent","materialsDownloaded","filesDownloaded","ctx_r15","ctx_r17","ctx_r35","ctx_r36","ctx_r37","ctx_r40","ctx_r41","ctx_r42","ctx_r43","ctx_r44","ctx_r46","ctx_r50","ExhibitorBoothComponent","checkAndShowVideo","introVideoAssetPath","turnedOnCamera","checkIn","websiteClicked","organizationSlug","fullScreenContainer","off","ExhibitsModule","NgbModalModule","ApplicationPipesModule","RouterModule","path","component","title"],"sourceRoot":"webpack:///","sources":["./src/app/exhibits/exhibit-dashboard/visitor-log/visitor-log.component.html","./src/app/exhibits/exhibit-dashboard/visitor-log/visitor-log.component.ts","./src/app/exhibits/exhibit-dashboard/exhibit-dashboard.component.html","./src/app/exhibits/exhibit-dashboard/exhibit-dashboard.component.ts","./src/app/exhibits/public/exhibit-video-modal.component.html","./src/app/exhibits/public/exhibit-video-modal.component.ts","./src/app/exhibits/public/materials/exhibit-materials.component.html","./src/app/exhibits/public/materials/exhibit-materials.component.ts","./src/app/exhibits/public/exhibitor-booth.component.html","./src/app/exhibits/public/exhibitor-booth.component.ts","./src/app/exhibits.module.ts"],"sourcesContent":["<div *ngIf=\"initialized\" class=\"card\">\r\n <!-- Header -->\r\n <header class=\"card-header bg-light py-3 px-5\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3 class=\"h6 mb-0\">Visitor Log</h3>\r\n\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"close()\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n </header>\r\n <!-- End Header -->\r\n\r\n <!-- Body -->\r\n <div #peopleContainer class=\"card-body\" style=\"\">\r\n <span class=\"ml-3 mr-2 mb-2\"><a role=\"button\" class=\"text-primary cursor-pointer\" [ngClass]=\"{ selected: active }\" (click)=\"active = true\">Active</a></span>\r\n <span class=\"mr-2 mb-2\"><a role=\"button\" class=\"text-primary cursor-pointer\" [ngClass]=\"{ selected: !active }\" (click)=\"active = false\">In-Active</a></span>\r\n <div class=\"participant-list\" style=\"\">\r\n <div>\r\n <ul>\r\n <ng-container *ngFor=\"let activeUser of activeUsers\">\r\n <li *ngIf=\"activeUser.connected && active\">\r\n <div class=\"d-flex align-items-center pb-3\">\r\n <div class=\"mr-auto\">\r\n <img class=\"avatar u-sm-avatar rounded-circle\" [fallback]=\"'fetch-avatar?userId=' + activeUser.id\" src=\"https://bxlimages.blob.core.windows.net/avatar-cache/{{ activeUser.id }}-avatar.png\" />\r\n <span class=\"participant-name ml-2\">{{ activeUser.firstName }} {{ activeUser.lastName }} </span>\r\n <span class=\"visitor-email\"\r\n ><a href=\"mailto:{{ activeUser.email }}\">{{ activeUser.email }} </a></span\r\n >\r\n </div>\r\n\r\n <span class=\"participant-menu\">\r\n <span *ngIf=\"activeUser.engagementIndex >= 0 && activeUser.engagementIndex <= 33\" class=\"btn btn-icon btn-soft-danger rounded-circle mb-3\">\r\n <span class=\"btn-icon__inner\">{{ activeUser.engagementIndex }}%</span>\r\n </span>\r\n <span *ngIf=\"activeUser.engagementIndex > 33 && activeUser.engagementIndex <= 70\" class=\"btn btn-icon btn-soft-warning rounded-circle mb-3\">\r\n <span class=\"btn-icon__inner\">{{ activeUser.engagementIndex }}%</span>\r\n </span>\r\n <span *ngIf=\"activeUser.engagementIndex > 70 && activeUser.engagementIndex <= 100\" class=\"btn btn-icon btn-soft-success rounded-circle mb-3\">\r\n <span class=\"btn-icon__inner\">{{ activeUser.engagementIndex }}%</span>\r\n </span>\r\n </span>\r\n\r\n <!-- <span *ngIf=\"user.id == activeUser.id\" class=\"participant-menu\">\r\n <strong>This is you</strong>\r\n </span> -->\r\n </div>\r\n </li>\r\n <li *ngIf=\"!activeUser.connected && !active\">\r\n <div class=\"d-flex align-items-center pb-3\">\r\n <div class=\"mr-auto\">\r\n <img class=\"avatar u-sm-avatar rounded-circle\" [fallback]=\"'fetch-avatar?userId=' + activeUser.id\" src=\"https://bxlimages.blob.core.windows.net/avatar-cache/{{ activeUser.id }}-avatar.png\" />\r\n <span class=\"participant-name ml-2\">{{ activeUser.firstName }} {{ activeUser.lastName }} </span>\r\n <span class=\"visitor-email\"\r\n ><a href=\"mailto:{{ activeUser.email }}\">{{ activeUser.email }} </a></span\r\n >\r\n </div>\r\n\r\n <span class=\"participant-menu\">\r\n <span *ngIf=\"activeUser.engagementIndex >= 0 && activeUser.engagementIndex <= 33\" class=\"btn btn-icon btn-soft-danger rounded-circle mb-3\">\r\n <span class=\"btn-icon__inner\">{{ activeUser.engagementIndex }}%</span>\r\n </span>\r\n <span *ngIf=\"activeUser.engagementIndex > 33 && activeUser.engagementIndex <= 70\" class=\"btn btn-icon btn-soft-warning rounded-circle mb-3\">\r\n <span class=\"btn-icon__inner\">{{ activeUser.engagementIndex }}%</span>\r\n </span>\r\n <span *ngIf=\"activeUser.engagementIndex > 70 && activeUser.engagementIndex <= 100\" class=\"btn btn-icon btn-soft-success rounded-circle mb-3\">\r\n <span class=\"btn-icon__inner\">{{ activeUser.engagementIndex }}%</span>\r\n </span>\r\n </span>\r\n\r\n <!-- <span *ngIf=\"user.id == activeUser.id\" class=\"participant-menu\">\r\n <strong>This is you</strong>\r\n </span> -->\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <a class=\"ml-3 mt-2\" target=\"_blank\" href=\"api/exhibits/{{ exhibit.id }}/export?access_token={{ auth.getToken() }}\">Download user data</a>\r\n </div>\r\n <!-- End Body -->\r\n\r\n <!-- End Footer -->\r\n</div>\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport { LiveEventViewModel, ActiveUserViewModel, UserAuthenticationViewModel, ExhibitDesignerViewModel, ActiveExhibitUserViewModel } from 'src/app/_models/generatedModels';\r\nimport { HubConnection } from '@microsoft/signalr';\r\nimport { EventService, LiveEventService, ExhibitService } from 'src/app/_services/generatedServices';\r\nimport { EventRole } from 'src/app/_models/models';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\n\r\n@Component({\r\n selector: 'visitor-log',\r\n templateUrl: 'visitor-log.component.html',\r\n})\r\nexport class VisitorLogComponent implements OnInit {\r\n initialized = false;\r\n @Input() exhibit: ExhibitDesignerViewModel;\r\n @Input() connection: HubConnection;\r\n public EventRole = EventRole;\r\n @Output()\r\n closed = new EventEmitter();\r\n\r\n @Output()\r\n usersUpdated = new EventEmitter<ActiveExhibitUserViewModel[]>();\r\n\r\n activeUsers: ActiveExhibitUserViewModel[];\r\n user: UserAuthenticationViewModel;\r\n\r\n active:boolean = true;\r\n\r\n constructor(private eventService: LiveEventService, private exhibitService: ExhibitService, public auth: AuthenticationService, private toaster: ToasterService) {}\r\n\r\n ngOnInit(): void {\r\n this.user = this.auth.getUser();\r\n this.activeUsers = [];\r\n this.initSignalR();\r\n this.getActiveUsers();\r\n this.initialized = true;\r\n }\r\n\r\n getActiveUsers() {\r\n this.exhibitService.getActiveUsers(this.exhibit.id).subscribe((activeUsers) => {\r\n this.activeUsers = activeUsers;\r\n this.usersUpdated.emit(activeUsers);\r\n // activeUsers.forEach((user) => {\r\n // this.mergeUser(user);\r\n // });\r\n });\r\n }\r\n\r\n initSignalR() {\r\n this.connection.on('userDisconnected', (exhibitId: number, user: ActiveExhibitUserViewModel) => {\r\n if (exhibitId !== this.exhibit.id) {\r\n return;\r\n }\r\n this.mergeUser(user);\r\n });\r\n\r\n this.connection.on('userConnected', (exhibitId: number, user: ActiveExhibitUserViewModel) => {\r\n if (exhibitId !== this.exhibit.id) {\r\n return;\r\n }\r\n this.getActiveUsers();\r\n });\r\n\r\n this.connection.on('activeUserUpdated', (exhibitId: number, user: ActiveExhibitUserViewModel) => {\r\n if (exhibitId !== this.exhibit.id) {\r\n return;\r\n }\r\n this.mergeUser(user);\r\n });\r\n }\r\n\r\n mergeUser(user: ActiveExhibitUserViewModel) {\r\n let index = this.activeUsers.findIndex((x) => x.id === user.id);\r\n if (index === -1) {\r\n this.activeUsers.push(user);\r\n } else {\r\n this.activeUsers[index] = user;\r\n }\r\n }\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n}\r\n","<!--component html goes here -->\r\n<!--component html goes here -->\r\n<page-load-header *ngIf=\"!initialized\"></page-load-header>\r\n<ng-container *ngIf=\"initialized\">\r\n <div #fullScreen>\r\n <header>\r\n <!-- Fixed navbar -->\r\n <nav class=\"navbar nowrap navbar-expand-md navbar-light bg-white\">\r\n <a class=\"navbar-brand text-truncate\" [routerLink]=\"[]\">Exhibit Dashboard {{ exhibit.title }}</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\r\n <!-- <ul class=\"navbar-nav mr-auto\">\r\n <li class=\"nav-item active\">\r\n <a class=\"nav-link\" href=\"#\">Home <span class=\"sr-only\">(current)</span></a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link\" href=\"#\">Link</a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link disabled\" href=\"#\">Disabled</a>\r\n </li>\r\n </ul> -->\r\n <div class=\"form-inline ml-auto mt-2 mt-md-0\">\r\n <button type=\"button\" (click)=\"fullscreen()\" class=\"btn btn-icon text-muted transition-3d-hover\">\r\n <h3><span class=\"fas fa-compress-wide btn-icon__inner\"></span></h3>\r\n </button>\r\n\r\n <button type=\"button\" class=\"btn btn-icon\" (click)=\"exitPage()\">\r\n <h3 class=\"m-0 text-muted\"><i class=\"fas fa-times\"></i></h3>\r\n </button>\r\n </div>\r\n </div>\r\n </nav>\r\n </header>\r\n\r\n <main id=\"live-event\" class=\"main-container\">\r\n <div class=\"main-theater\">\r\n <div class=\"row no-gutters\">\r\n <div class=\"col text-center video-container\">\r\n <div id=\"webRTCLayoutContainer\" #webRTCLayoutContainer>\r\n \r\n <!-- <img *ngIf=\"!publishing && streamCount == 0 \" class=\"img-fluid poster\" src=\"../../assets/off-air.png\" /> -->\r\n </div>\r\n </div>\r\n <footer class=\"live-footer\">\r\n <div class=\"row no-gutters\">\r\n <div class=\"col pl-2 pr-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"mr-auto\">\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button *ngIf=\"!publishing\" type=\"button\" (click)=\"activateCamera()\" class=\"btn btn-xs btn-success transition-3d-hover\"><i class=\"fas fa-video\"></i> Join Video</button>\r\n <button *ngIf=\"publishing\" type=\"button\" (click)=\"unpublish()\" class=\"btn btn-xs btn-danger transition-3d-hover\"><i class=\"fas fa-video-slash\"></i> Leave Video</button>\r\n </li>\r\n <li *ngIf=\"publishing && !screenPublishing\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Share Screen\">\r\n <button type=\"button\" (click)=\"shareScreen()\" class=\"btn btn-xs btn-github transition-3d-hover\"><i class=\"fas fa-laptop\"></i> Share Screen</button>\r\n </li>\r\n <li *ngIf=\"screenPublishing\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Stop Sharing\">\r\n <button type=\"button\" (click)=\"stopScreenSharing()\" class=\"btn btn-xs btn-outline-warning transition-3d-hover\"><i class=\"fas fa-laptop\"></i> Stop Sharing</button>\r\n </li>\r\n <li *ngIf=\"publishing && publishingVideo\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleVideo()\" class=\"btn btn-sm btn-icon btn-success transition-3d-hover\">\r\n <span class=\"fas fa-video\"></span>\r\n </button>\r\n </li>\r\n <li *ngIf=\"publishing && !publishingVideo\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleVideo()\" class=\"btn btn-sm btn-icon btn-primary transition-3d-hover\">\r\n <span class=\"fas fa-video-slash\"></span>\r\n </button>\r\n </li>\r\n\r\n <li *ngIf=\"publishing && publishingAudio\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleAudio()\" class=\"btn btn-sm btn-icon btn-success transition-3d-hover\">\r\n <span class=\"fas fa-microphone\"></span>\r\n </button>\r\n </li>\r\n <li *ngIf=\"publishing && !publishingAudio\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleAudio()\" class=\"btn btn-sm btn-icon btn-primary transition-3d-hover\">\r\n <span class=\"fas fa-microphone-slash\"></span>\r\n </button>\r\n </li>\r\n <li class=\"list-inline-item device-settings-button\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button (click)=\"showDeviceSettings()\" type=\"button\" class=\"btn btn-sm btn-icon btn-secondary transition-3d-hover\">\r\n <span class=\"fas fa-cog btn-icon__inner\"></span>\r\n </button>\r\n </li>\r\n <li class=\"list-inline-item mr-2 font-size-1\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Tech Support\">\r\n <p class=\"text-primary\"><a class=\"cursor-pointer\" type=\"button\" (click)=\"techSupportClicked()\">Help</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"d-block d-xl-none\">\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-3\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Chat\">\r\n <p class=\"text-primary\"><a [ngClass]=\"{ 'live-event-link-active': showChat }\" type=\"button\" (click)=\"showChat = !showChat;\">Chat</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <!-- <div class=\"\">\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-3\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Access CEU tokens and generate certificates\">\r\n <p class=\"text-primary\"><a [ngClass]=\"{ 'live-event-link-active': showAnalytics }\" type=\"button\" (click)=\"showAnalytics = !showAnalytics; showVisitors = false;\">Analytics</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div> -->\r\n <div class=\"\">\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-1\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\">\r\n <p class=\"text-primary\"><a [ngClass]=\"{ 'live-event-link-active': showVisitors }\" type=\"button\" (click)=\"showVisitors = !showVisitors; showAnalytics = false\">Visitor Log</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"\">\r\n <div class=\"align-middle d-none d-md-block\" style=\"line-height: 0; padding-top: 14px\">\r\n <ul class=\"list-inline mb-0\">\r\n <li *ngFor=\"let id of randomUserIds; let idx = index\" class=\"list-inline-item mr-0\" [ngClass]=\"{ 'ml-n3': idx > 0 }\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"James Collins\">\r\n <div class=\"u-sm-avatar u-sm-avatar--bordered rounded-circle\">\r\n <img class=\"img-fluid rounded-circle\" src=\"fetch-avatar?userId={{ id }}&width=32&height=32&mode=crop\" />\r\n </div>\r\n </li>\r\n\r\n <li *ngIf=\"userCount > 0\" class=\"list-inline-item ml-n3 mr-0\">\r\n <a class=\"btn btn-sm btn-icon btn-light rounded-circle\" type=\"button\" (click)=\"showVisitors = !showVisitors\">\r\n <span class=\"btn-icon__inner\">{{ userCount }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col chat-sidebar pt-1\"></div>\r\n </div>\r\n </footer>\r\n <div class=\"popover-window col\" [ngClass]=\"{ 'd-none': !showVisitors }\">\r\n <visitor-log [exhibit]=\"exhibit\" (usersUpdated)=\"usersUpdated($event)\" [connection]=\"connection\" (closed)=\"showVisitors = false\"></visitor-log>\r\n </div>\r\n <div class=\"col chat-sidebar pt-1\">\r\n <div #messageContainer class=\"live-messages\">\r\n <ul>\r\n <li *ngFor=\"let message of exhibit.chatHistory\" class=\"mb-3\" [ngClass]=\"{ replies: user.id != message.user.id, sent: user.id == message.user.id }\">\r\n <img class=\"avatar u-sm-avatar rounded-circle\" src=\"fetch-avatar?userId={{ message.user.id }}&width=32&height=32&mode=crop\" />\r\n <span *ngIf=\"user.id != message.user.id\">{{ message.user.firstName + ' ' + message.user.lastName }}</span>\r\n <p class=\"message-content\" innerHTML=\"{{ message.message }}\"></p>\r\n </li>\r\n <li *ngFor=\"let message of messages\" class=\"mb-3\" [ngClass]=\"{ replies: user.id != message.userId, sent: user.id == message.userId }\">\r\n <img class=\"avatar u-sm-avatar rounded-circle\" src=\"fetch-avatar?userId={{ message.userId }}&width=32&height=32&mode=crop\" /><span *ngIf=\"user.id != message.userId\">{{ message.name }}</span>\r\n <p class=\"message-content\" innerHTML=\"{{ message.message }}\"></p>\r\n </li>\r\n <li style=\"line-height: 0\"> </li>\r\n </ul>\r\n <p *ngIf=\"messages.length + exhibit.chatHistory.length == 0\" class=\"no-chats\">Say hello.</p>\r\n </div>\r\n <div class=\"bxl-emoji-picker\" [style.visibility]=\"toggled ? 'visible' : 'hidden'\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"First group\">\r\n <button type=\"button\" (click)=\"handleSelection('😀')\" class=\"btn btn-lg xs-no-padding btn-white\">😀</button>\r\n <button type=\"button\" (click)=\"handleSelection('😂')\" class=\"btn btn-lg xs-no-padding btn-white\">😂</button>\r\n <button type=\"button\" (click)=\"handleSelection('😲')\" class=\"btn btn-lg xs-no-padding btn-white\">😲</button>\r\n <button type=\"button\" (click)=\"handleSelection('😞')\" class=\"btn btn-lg xs-no-padding btn-white\">😞</button>\r\n <button type=\"button\" (click)=\"handleSelection('ðŸ‘')\" class=\"btn btn-lg xs-no-padding btn-white\">ðŸ‘</button>\r\n <button type=\"button\" (click)=\"handleSelection('👎')\" class=\"btn btn-lg xs-no-padding btn-white\">👎</button>\r\n <button type=\"button\" (click)=\"handleSelection('â¤ï¸')\" class=\"btn btn-lg xs-no-padding btn-white\">â¤ï¸</button>\r\n <button type=\"button\" (click)=\"handleSelection('â—ï¸')\" class=\"btn btn-lg xs-no-padding btn-white\">â—ï¸</button>\r\n <button type=\"button\" (click)=\"handleSelection('â“')\" class=\"btn btn-lg xs-no-padding btn-white\">â“</button>\r\n </div>\r\n </div>\r\n <div class=\"input-group\" style=\"margin-bottom: 5px\">\r\n <input #chatbox type=\"text\" class=\"form-control\" [(ngModel)]=\"chatMessage\" (keyup.enter)=\"sendMessage()\" placeholder=\"Type a message...\" aria-label=\"\" aria-describedby=\"button-addon2\" />\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-white\" (click)=\"toggled = !toggled\" type=\"button\" id=\"button-addon2\">😄</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </main>\r\n </div>\r\n <!-- <footer class=\"live-footer\">\r\n <div class=\"container-fluid\">\r\n <p>hello</p>\r\n </div>\r\n\r\n </footer> -->\r\n</ng-container>\r\n","import { Component, OnInit, OnDestroy, ElementRef, ViewChild, ChangeDetectorRef, Renderer2, HostListener } from '@angular/core';\r\nimport { ExhibitService } from 'src/app/_services/generatedServices';\r\nimport { Subscription, of } from 'rxjs';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { ExhibitDesignerViewModel, UserAuthenticationViewModel, ActiveExhibitUserViewModel } from 'src/app/_models/generatedModels';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\nimport { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';\r\nimport { DefaultReconnectPolicy } from 'src/app/_helpers/signalR-retry-policy';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { OpentokService } from 'src/app/_services/opentok.service';\r\nimport { ChatViewModel, SelectedDevice } from 'src/app/_models/models';\r\nimport { CameraTestModalComponent } from '../../events/live/camera-test/camera-test-modal.component';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { delay } from 'rxjs/operators';\r\nconst initLayoutContainer = require('opentok-layout-js');\r\ndeclare var zE: any;\r\n\r\n@Component({\r\n selector: 'bxl-exhibit-dashboard',\r\n templateUrl: 'exhibit-dashboard.component.html',\r\n})\r\nexport class ExhibitDashboardComponent implements OnInit, OnDestroy {\r\n initialized = false;\r\n showVisitors = false;\r\n showAnalytics = false;\r\n session: OT.Session;\r\n userCount: number;\r\n randomUserIds: number[];\r\n public user: UserAuthenticationViewModel;\r\n exhibitId: number;\r\n public selectedDevice: SelectedDevice;\r\n public connection: HubConnection;\r\n public isFullScreen: boolean;\r\n publisher: OT.Publisher;\r\n public showChat = true;\r\n\r\n screenPublisher: OT.Publisher;\r\n public publishing: boolean;\r\n public screenPublishing: boolean;\r\n public publishingAudio = true;\r\n public publishingVideo = true;\r\n public streamCount = 0;\r\n public chatMessage: string;\r\n public messages: ChatViewModel[] = new Array();\r\n toggled: boolean = false;\r\n showPicker: boolean = false;\r\n preview: boolean = false;\r\n\r\n exhibit: ExhibitDesignerViewModel;\r\n private routeSubscription: Subscription;\r\n @ViewChild('messageContainer') private messageContainer: ElementRef;\r\n @ViewChild('webRTCLayoutContainer') webRTCLayoutContainer: ElementRef;\r\n @ViewChild('fullScreen') fullScreen: ElementRef;\r\n @ViewChild('chatbox') private chatbox: ElementRef;\r\n layout: any;\r\n\r\n constructor(private exhibitService: ExhibitService, private modalService: NgbModal, private renderer: Renderer2, private opentokService: OpentokService, private ref: ChangeDetectorRef, private auth: AuthenticationService, private route: ActivatedRoute, private router: Router, private toaster: ToasterService) {}\r\n\r\n ngOnInit(): void {\r\n this.user = this.auth.getUser();\r\n document.body.style.backgroundColor = '#fff';\r\n zE('webWidget', 'hide');\r\n zE('webWidget:on', 'close', () => {\r\n zE('webWidget', 'hide');\r\n });\r\n\r\n this.preview = this.route.snapshot.data.preview;\r\n\r\n this.routeSubscription = this.route.paramMap.subscribe((param) => {\r\n this.exhibitId = parseInt(param.get('id'));\r\n\r\n this.exhibitService.getExhibitById(this.exhibitId).subscribe((exhibit) => {\r\n this.exhibit = exhibit;\r\n this.InitSignalR();\r\n this.InitOpenTok();\r\n });\r\n });\r\n }\r\n\r\n checkAndDisplayPreviewError(): boolean {\r\n if (this.preview) {\r\n this.toaster.messageDialog('You are in preview mode, and this function is not available.', 'Preview Mode').subscribe();\r\n return this.preview;\r\n }\r\n return this.preview;\r\n }\r\n\r\n InitSignalR(): any {\r\n this.connection = new HubConnectionBuilder()\r\n .withUrl('/exhibitHub', { accessTokenFactory: () => this.auth.getToken() })\r\n .withAutomaticReconnect(new DefaultReconnectPolicy())\r\n .build();\r\n\r\n this.connection.start().then(() => {\r\n this.connection.invoke('connectToExhibit', this.exhibitId);\r\n });\r\n\r\n this.connection.on('postChat', (id: number, name: string, message: string, userId: number, exhibitId: number) => {\r\n console.log('chat received' + exhibitId);\r\n if (exhibitId === this.exhibitId) {\r\n this.messages.push(new ChatViewModel(id, name, message, userId));\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.initialized = true;\r\n }\r\n\r\n scrollToBottom(): void {\r\n of(null)\r\n .pipe(delay(100))\r\n .subscribe((result) => {\r\n try {\r\n this.messageContainer.nativeElement.scrollTop = this.messageContainer.nativeElement.scrollHeight;\r\n } catch (err) {}\r\n });\r\n }\r\n\r\n InitOpenTok() {\r\n this.ref.detectChanges();\r\n this.layout = initLayoutContainer(this.webRTCLayoutContainer.nativeElement).layout;\r\n let layout = this.layout;\r\n\r\n this.opentokService\r\n .initSessionForExhibits(this.exhibitId)\r\n .then((session: OT.Session) => {\r\n this.session = session;\r\n this.session.on('streamCreated', (event) => {\r\n console.log(event.stream.name);\r\n console.log(event.stream.connection.data);\r\n this.streamCount++;\r\n\r\n let subscription = this.session.subscribe(event.stream, 'webRTCLayoutContainer', {\r\n insertMode: 'append',\r\n style: { nameDisplayMode: 'off' },\r\n });\r\n\r\n subscription.element.addEventListener('dblclick', function () {\r\n if (subscription.element.classList.contains('OT_big')) {\r\n subscription.element.classList.remove('OT_big');\r\n } else {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n layout();\r\n this.ref.detectChanges();\r\n });\r\n this.session.on('streamDestroyed', (event) => {\r\n this.streamCount--;\r\n session.getSubscribersForStream(event.stream).forEach((subscriber) => {\r\n subscriber.element.classList.remove('ot-layout');\r\n setTimeout(() => {\r\n layout();\r\n }, 200);\r\n });\r\n });\r\n })\r\n .then(() => this.opentokService.connect())\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect. Make sure you have updated the config.ts file with your OpenTok details.');\r\n });\r\n }\r\n\r\n showDeviceSettings() {\r\n const modalRef = this.modalService.open(CameraTestModalComponent, { size: 'lg', backdrop: 'static', ariaLabelledBy: 'modal-basic-title' });\r\n if (this.selectedDevice) {\r\n console.log(this.selectedDevice);\r\n modalRef.componentInstance.selectedDevice = this.selectedDevice;\r\n }\r\n modalRef.result.then(\r\n (result) => {\r\n this.selectedDevice = result;\r\n\r\n if (this.publisher) {\r\n this.publisher.destroy();\r\n if (this.publishing) {\r\n this.activateCamera();\r\n }\r\n }\r\n },\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n\r\n activateCamera() {\r\n if (this.checkAndDisplayPreviewError()) {\r\n return;\r\n }\r\n\r\n this.ref.detectChanges();\r\n\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n\r\n if (this.selectedDevice) {\r\n this.publisher = OT.initPublisher(el, { publishAudio: this.publishingAudio, publishVideo: this.publishingVideo, resolution: '1280x720', name: 'billbob', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' }, audioSource: this.selectedDevice.audioDeviceId, videoSource: this.selectedDevice.videoDeviceId });\r\n } else {\r\n this.publisher = OT.initPublisher(el, { publishAudio: this.publishingAudio, publishVideo: this.publishingVideo, resolution: '1280x720', name: 'billbob', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' } });\r\n }\r\n\r\n let layout = this.layout;\r\n\r\n el.addEventListener('dblclick', function () {\r\n if (el.classList.contains('OT_big')) {\r\n el.classList.remove('OT_big');\r\n } else {\r\n el.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n\r\n this.renderer.appendChild(this.webRTCLayoutContainer.nativeElement, el);\r\n layout();\r\n\r\n if (this.session) {\r\n if (this.session['isConnected']()) {\r\n this.publish();\r\n }\r\n this.session.on('sessionConnected', () => this.publish());\r\n }\r\n }\r\n\r\n publish() {\r\n this.session.publish(this.publisher, (err) => {\r\n if (err) {\r\n alert(err.message);\r\n } else {\r\n this.publishing = true;\r\n this.layout();\r\n this.ref.detectChanges();\r\n this.layout();\r\n }\r\n });\r\n }\r\n\r\n toggleVideo() {\r\n this.publishingVideo = !this.publishingVideo;\r\n this.publisher.publishVideo(this.publishingVideo);\r\n }\r\n\r\n toggleAudio() {\r\n this.publishingAudio = !this.publishingAudio;\r\n this.publisher.publishAudio(this.publishingAudio);\r\n }\r\n\r\n unpublish() {\r\n this.publishing = false;\r\n this.ref.detectChanges();\r\n this.session.unpublish(this.publisher);\r\n this.layout();\r\n }\r\n\r\n exitPage() {\r\n if (this.preview) {\r\n this.router.navigate(['/account/exhibits']);\r\n return;\r\n }\r\n\r\n this.toaster.confirmDialog('Are you sure you want to leave this exhibit?', 'Exit?', 'Yes, Exit', 'Cancel').subscribe((result) => {\r\n if (result) {\r\n this.router.navigate(['/account/exhibits']);\r\n }\r\n });\r\n }\r\n\r\n public sendMessage() {\r\n if (this.checkAndDisplayPreviewError()) {\r\n return;\r\n }\r\n\r\n this.connection.invoke('postChat', this.user.firstName + ' ' + this.user.lastName, this.chatMessage, this.user.id, this.exhibitId);\r\n this.chatMessage = null;\r\n }\r\n\r\n shareScreen() {\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n this.screenPublisher = OT.initPublisher(el, { videoSource: 'screen', width: '100%', insertDefaultUI: true });\r\n\r\n let layout = this.layout;\r\n\r\n el.classList.add('OT_big');\r\n\r\n el.addEventListener('dblclick', function () {\r\n if (el.classList.contains('OT_big')) {\r\n el.classList.remove('OT_big');\r\n } else {\r\n el.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n\r\n this.renderer.appendChild(this.webRTCLayoutContainer.nativeElement, el);\r\n layout();\r\n\r\n if (this.session) {\r\n if (this.session['isConnected']()) {\r\n this.publishScreen();\r\n }\r\n this.session.on('sessionConnected', () => this.publishScreen());\r\n }\r\n }\r\n\r\n publishScreen() {\r\n this.session.publish(this.screenPublisher, (err) => {\r\n if (err) {\r\n alert(err.message);\r\n this.layout();\r\n } else {\r\n this.screenPublishing = true;\r\n this.layout();\r\n this.ref.detectChanges();\r\n this.layout();\r\n }\r\n });\r\n }\r\n\r\n techSupportClicked() {\r\n zE('webWidget', 'show');\r\n zE('webWidget', 'open');\r\n }\r\n\r\n\r\n usersUpdated(event: ActiveExhibitUserViewModel[]) {\r\n this.userCount = event.filter((x) => x.connected).length;\r\n this.randomUserIds = event\r\n .filter((x) => x.connected)\r\n .map((x) => x.id)\r\n .slice(0, 6);\r\n }\r\n\r\n stopScreenSharing() {\r\n this.session.unpublish(this.screenPublisher);\r\n this.screenPublishing = false;\r\n this.layout();\r\n }\r\n\r\n handleSelection(char) {\r\n if (this.chatMessage == null) {\r\n this.chatMessage = '';\r\n }\r\n\r\n this.chatMessage = this.chatMessage + char;\r\n this.toggled = false;\r\n this.chatbox.nativeElement.focus();\r\n }\r\n\r\n fullscreen() {\r\n this.ref.detectChanges();\r\n let elem = this.fullScreen.nativeElement;\r\n let doc = <any>document;\r\n if (!this.isFullScreen) {\r\n if (elem.requestFullscreen) {\r\n elem.requestFullscreen();\r\n } else if (elem.mozRequestFullScreen) {\r\n /* Firefox */\r\n elem.mozRequestFullScreen();\r\n } else if (elem.webkitRequestFullscreen) {\r\n /* Chrome, Safari and Opera */\r\n elem.webkitRequestFullscreen();\r\n } else if (elem.msRequestFullscreen) {\r\n /* IE/Edge */\r\n elem.msRequestFullscreen();\r\n }\r\n setTimeout(() => {\r\n this.layout();\r\n this.isFullScreen = true;\r\n }, 500);\r\n } else {\r\n if (document.exitFullscreen) {\r\n doc.exitFullscreen();\r\n } else if (doc.mozCancelFullScreen) {\r\n /* Firefox */\r\n doc.mozCancelFullScreen();\r\n } else if (doc.webkitExitFullscreen) {\r\n /* Chrome, Safari and Opera */\r\n doc.webkitExitFullscreen();\r\n } else if (doc.msExitFullscreen) {\r\n /* IE/Edge */\r\n doc.msExitFullscreen();\r\n }\r\n setTimeout(() => {\r\n this.isFullScreen = false;\r\n this.layout();\r\n }, 500);\r\n }\r\n }\r\n\r\n @HostListener('document:fullscreenchange', ['$event'])\r\n @HostListener('document:webkitfullscreenchange', ['$event'])\r\n @HostListener('document:mozfullscreenchange', ['$event'])\r\n @HostListener('document:MSFullscreenChange', ['$event'])\r\n exit(ev) {\r\n if (this.isFullScreen) {\r\n of(null)\r\n .pipe(delay(3000))\r\n .subscribe((result) => {\r\n this.isFullScreen = false;\r\n console.log('exiting');\r\n this.layout();\r\n });\r\n }\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n resize(evt) {\r\n this.layout();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n document.body.style.backgroundColor = '#fff';\r\n\r\n this.routeSubscription.unsubscribe();\r\n\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n\r\n if (this.publisher) {\r\n this.publisher.destroy();\r\n }\r\n\r\n if (this.screenPublisher) {\r\n this.screenPublisher.destroy();\r\n }\r\n\r\n if (this.session) {\r\n this.session.disconnect();\r\n }\r\n\r\n }\r\n}\r\n","<div class=\"modal-content\" *ngIf=\"initialized\">\r\n <div class=\"modal-header d-block\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3 class=\"h6 mb-0\">Welcome Video</h3>\r\n\r\n <button type=\"button\" class=\"close\" (click)=\"this.actieveModal.dismiss()\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-body text-center\">\r\n <iframe *ngIf=\"youtubeUrl\" width=\"700\" height=\"450\" [src]=\"youtubeUrl\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\r\n <iframe *ngIf=\"vimeoUrl\" [src]=\"vimeoUrl\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe>\r\n\r\n </div>\r\n\r\n</div>\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'bxl-exhibit-video-modal',\r\n templateUrl: 'exhibit-video-modal.component.html',\r\n})\r\nexport class ExhibitVideoModalComponent implements OnInit {\r\n initialized = false;\r\n\r\n @Input()\r\n url: string;\r\n\r\n\r\n youtubeUrl: SafeUrl;\r\n vimeoUrl: SafeUrl;\r\n\r\n constructor(public actieveModal: NgbActiveModal, private sanitizer: DomSanitizer) {}\r\n\r\n ngOnInit(): void {\r\n let url1 = 'https://youtu.be/';\r\n let url2 = 'https://www.youtube.com/watch?v=';\r\n let url3 = 'https://vimeo.com/';\r\n\r\n let index = this.url.indexOf(url1);\r\n if (index > -1) {\r\n let youtubeVideoId = this.url.slice(index + url1.length);\r\n this.youtubeUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://www.youtube.com/embed/' + youtubeVideoId + '?autoplay=1');\r\n }\r\n\r\n index = this.url.indexOf(url2);\r\n if (index > -1) {\r\n let youtubeVideoId = this.url.slice(index + url2.length);\r\n this.youtubeUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://www.youtube.com/embed/' + youtubeVideoId + '?autoplay=1');\r\n }\r\n\r\n index = this.url.indexOf(url3);\r\n if (index > -1) {\r\n let vimeoId = this.url.slice(index + url3.length);\r\n this.vimeoUrl = this.sanitizer.bypassSecurityTrustResourceUrl('https://player.vimeo.com/video/' + vimeoId + '?autoplay=1');\r\n }\r\n\r\n\r\n this.initialized = true;\r\n }\r\n\r\n\r\n}\r\n","<div *ngIf=\"initialized\" class=\"card\">\r\n <!-- Header -->\r\n <header class=\"card-header bg-light py-3 px-5\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3 class=\"h6 mb-0\">Exhibit Materials</h3>\r\n\r\n <button type=\"button\" class=\"close\" aria-label=\"Close\" (click)=\"close()\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n </header>\r\n <!-- End Header -->\r\n\r\n <!-- Body -->\r\n\r\n <div #questionContainer class=\"card-body\" style=\"\">\r\n <div *ngIf=\"!exhibit.materials || exhibit.materials.length == 0\" class=\"text-center\">\r\n <div class=\"mb-5\">\r\n <p class=\"font-size-3\">No Materials</p>\r\n </div>\r\n </div>\r\n <div>\r\n <table>\r\n <tr *ngFor=\"let material of exhibit.materials\">\r\n <td>\r\n <h4>\r\n <a (click)=\"materialsDownloaded()\" href=\"/fetchMaterial?fileName={{ material.blobPath | encodeUrl }}&downloadName={{ material.description }}&access_token={{ auth.getToken() }}\"><img style=\"width: 40px\" src=\"../../assets/filetypes/{{ material.fileType }}.png\" /> {{ material.description }}</a>\r\n </h4>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, OnInit, Input, ViewChild, ElementRef, Output, EventEmitter, AfterViewChecked, OnDestroy } from '@angular/core';\r\nimport { EventViewModel, LiveEventViewModel, UserAuthenticationViewModel, ExhibitDesignerViewModel } from 'src/app/_models/generatedModels';\r\nimport { ChatViewModel } from 'src/app/_models/models';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { HubConnection } from '@microsoft/signalr';\r\nimport { of, interval, Subscription } from 'rxjs';\r\nimport { ExhibitService } from 'src/app/_services/generatedServices';\r\n\r\n@Component({\r\n selector: 'exhibit-materials',\r\n templateUrl: 'exhibit-materials.component.html',\r\n})\r\nexport class ExhibitMaterialsComponent implements OnInit {\r\n initialized = false;\r\n\r\n @Input() exhibit: ExhibitDesignerViewModel;\r\n @Output()\r\n closed = new EventEmitter();\r\n\r\n constructor(public auth: AuthenticationService, private exhibitService: ExhibitService) {}\r\n\r\n ngOnInit(): void {\r\n this.initialized = true;\r\n }\r\n\r\n materialsDownloaded(){\r\n this.exhibitService.filesDownloaded(this.exhibit.id).subscribe();\r\n }\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n}\r\n","<!--component html goes here -->\r\n<!--component html goes here -->\r\n<page-load-header *ngIf=\"!initialized\"></page-load-header>\r\n<ng-container *ngIf=\"initialized\">\r\n <header>\r\n <!-- Fixed navbar -->\r\n <nav class=\"navbar nowrap navbar-expand-md navbar-light bg-white\">\r\n <a class=\"navbar-brand text-truncate\" [routerLink]=\"[]\">Exhibit {{ exhibit.title }}</a>\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\r\n <!-- <ul class=\"navbar-nav mr-auto\">\r\n <li class=\"nav-item active\">\r\n <a class=\"nav-link\" href=\"#\">Home <span class=\"sr-only\">(current)</span></a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link\" href=\"#\">Link</a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a class=\"nav-link disabled\" href=\"#\">Disabled</a>\r\n </li>\r\n </ul> -->\r\n <div class=\"form-inline ml-auto mt-2 mt-md-0\">\r\n <button type=\"button\" class=\"btn btn-icon\" (click)=\"exitPage()\">\r\n <h3 class=\"m-0 text-muted\"><i class=\"fas fa-times\"></i></h3>\r\n </button>\r\n </div>\r\n </div>\r\n </nav>\r\n </header>\r\n\r\n <main id=\"exhibit\" class=\"main-container\">\r\n <div class=\"main-theater\">\r\n <div class=\"row no-gutters\">\r\n <div class=\"col text-center exhibit-container order-12 order-xl-1\">\r\n <img class=\"img-fluid\" src=\"fetchimage?filename={{ exhibit.bannerAssetPath }}\" />\r\n <div class=\"text-left p-3 mt-3\" [innerHTML]=\"exhibit.description | safeHtml\"></div>\r\n </div>\r\n <footer class=\"live-footer\">\r\n <div class=\"row no-gutters\">\r\n <div class=\"col pl-2 pr-2\">\r\n <div class=\"d-flex\">\r\n <div class=\"mr-auto\">\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-2 font-size-1\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Tech Support\">\r\n <p class=\"text-primary\"><a type=\"button\" (click)=\"techSupportClicked()\">Help</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-3\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Chat\">\r\n <p class=\"text-primary\"><a type=\"button\" (click)=\"checkIn()\">Check-in</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-3\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Chat\">\r\n <p class=\"text-primary\"><a type=\"button\" target=\"_blank\" (click)=\"websiteClicked()\" href=\"{{ exhibit.website | websiteUrlPipe }} \">Website</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"align-middle\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-3\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Chat\">\r\n <p class=\"text-primary\"><a type=\"button\" (click)=\"showDownloads = !showDownloads\">Downloads</a></p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col chat-sidebar pt-1\"></div>\r\n </div>\r\n </footer>\r\n\r\n <div class=\"popover-window col\" [ngClass]=\"{ 'd-none': !showDownloads }\">\r\n <exhibit-materials [exhibit]=\"exhibit\" (closed)=\"showDownloads = false\"></exhibit-materials>\r\n </div>\r\n\r\n <div class=\"col chat-sidebar order-1 order-xl-12\">\r\n <div class=\"full-screen-wrapper\" #fullScreenContainer>\r\n <div class=\"exhibit-video\" id=\"webRTCLayoutContainer\" #webRTCLayoutContainer>\r\n \r\n <!-- Banner display -->\r\n </div>\r\n <div class=\"bg-dark p-2 d-flex\">\r\n <div class=\"mr-auto\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button *ngIf=\"!publishing\" type=\"button\" (click)=\"activateCamera()\" class=\"btn btn-xs btn-success transition-3d-hover\"><i class=\"fas fa-video\"></i> Join Video</button>\r\n <button *ngIf=\"publishing\" type=\"button\" (click)=\"unpublish()\" class=\"btn btn-xs btn-danger transition-3d-hover\"><i class=\"fas fa-video-slash\"></i> Leave Video</button>\r\n </li>\r\n <li *ngIf=\"publishing && publishingVideo\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleVideo()\" class=\"btn btn-sm btn-icon btn-success transition-3d-hover\">\r\n <span class=\"fas fa-video\"></span>\r\n </button>\r\n </li>\r\n <li *ngIf=\"publishing && !publishingVideo\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleVideo()\" class=\"btn btn-sm btn-icon btn-primary transition-3d-hover\">\r\n <span class=\"fas fa-video-slash\"></span>\r\n </button>\r\n </li>\r\n <li *ngIf=\"publishing && publishingAudio\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleAudio()\" class=\"btn btn-sm btn-icon btn-success transition-3d-hover\">\r\n <span class=\"fas fa-microphone\"></span>\r\n </button>\r\n </li>\r\n <li *ngIf=\"publishing && !publishingAudio\" class=\"list-inline-item mr-2\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"toggleAudio()\" class=\"btn btn-sm btn-icon btn-primary transition-3d-hover\">\r\n <span class=\"fas fa-microphone-slash\"></span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"ml-auto\">\r\n <ul class=\"list-inline mb-0\">\r\n <li class=\"list-inline-item device-settings-button\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button (click)=\"showDeviceSettings()\" type=\"button\" class=\"btn btn-sm btn-icon btn-secondary transition-3d-hover\">\r\n <span class=\"fas fa-cog btn-icon__inner\"></span>\r\n </button>\r\n </li>\r\n <li class=\"list-inline-item\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\" data-original-title=\"Settings\">\r\n <button type=\"button\" (click)=\"fullscreen()\" class=\"btn btn-icon btn-sm text-white transition-3d-hover\">\r\n <h3><span class=\"fas fa-compress-wide btn-icon__inner\"></span></h3>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div #messageContainer class=\"live-messages\">\r\n <ul>\r\n <li *ngFor=\"let message of exhibit.chatHistory\" [ngClass]=\"{ replies: user.id != message.user.id, sent: user.id == message.user.id }\">\r\n <img class=\"avatar u-sm-avatar rounded-circle\" [fallback]=\"'fetch-avatar?userId=' + message.user.id\" src=\"https://bxlimages.blob.core.windows.net/avatar-cache/{{ message.user.id }}-avatar.png\"/>\r\n <span *ngIf=\"user.id != message.user.id\">{{ message.user.firstName + ' ' + message.user.lastName }}</span>\r\n <p class=\"message-content\" innerHTML=\"{{ message.message }}\"></p>\r\n </li>\r\n <li *ngFor=\"let message of messages\" [ngClass]=\"{ replies: user.id != message.userId, sent: user.id == message.userId }\">\r\n <img class=\"avatar u-sm-avatar rounded-circle\" [fallback]=\"'fetch-avatar?userId=' + message.userId\" src=\"https://bxlimages.blob.core.windows.net/avatar-cache/{{ message.userId }}-avatar.png\" /><span *ngIf=\"user.id != message.userId\">{{ message.name }}</span>\r\n <p class=\"message-content\" innerHTML=\"{{ message.message }}\"></p>\r\n </li>\r\n </ul>\r\n <p *ngIf=\"messages.length + exhibit.chatHistory.length == 0\" class=\"no-chats\">Say hello.</p>\r\n </div>\r\n <div class=\"bxl-emoji-picker\" [style.visibility]=\"toggled ? 'visible' : 'hidden'\">\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"First group\">\r\n <button type=\"button\" (click)=\"handleSelection('😀')\" class=\"btn btn-lg xs-no-padding btn-white\">😀</button>\r\n <button type=\"button\" (click)=\"handleSelection('😂')\" class=\"btn btn-lg xs-no-padding btn-white\">😂</button>\r\n <button type=\"button\" (click)=\"handleSelection('😲')\" class=\"btn btn-lg xs-no-padding btn-white\">😲</button>\r\n <button type=\"button\" (click)=\"handleSelection('😞')\" class=\"btn btn-lg xs-no-padding btn-white\">😞</button>\r\n <button type=\"button\" (click)=\"handleSelection('ðŸ‘')\" class=\"btn btn-lg xs-no-padding btn-white\">ðŸ‘</button>\r\n <button type=\"button\" (click)=\"handleSelection('👎')\" class=\"btn btn-lg xs-no-padding btn-white\">👎</button>\r\n <button type=\"button\" (click)=\"handleSelection('â¤ï¸')\" class=\"btn btn-lg xs-no-padding btn-white\">â¤ï¸</button>\r\n <button type=\"button\" (click)=\"handleSelection('â—ï¸')\" class=\"btn btn-lg xs-no-padding btn-white\">â—ï¸</button>\r\n <button type=\"button\" (click)=\"handleSelection('â“')\" class=\"btn btn-lg xs-no-padding btn-white\">â“</button>\r\n </div>\r\n </div>\r\n <div class=\"input-group\" style=\"margin-bottom: 5px\">\r\n <input #chatbox type=\"text\" class=\"form-control\" [(ngModel)]=\"chatMessage\" (keyup.enter)=\"sendMessage()\" placeholder=\"Type a message...\" aria-label=\"\" aria-describedby=\"button-addon2\" />\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-white\" (click)=\"toggled = !toggled\" type=\"button\" id=\"button-addon2\">😄</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </main>\r\n <!-- <footer class=\"live-footer\">\r\n <div class=\"container-fluid\">\r\n <p>hello</p>\r\n </div>\r\n\r\n </footer> -->\r\n</ng-container>\r\n","import { Component, OnInit, OnDestroy, ElementRef, ViewChild, ChangeDetectorRef, Renderer2, HostListener } from '@angular/core';\r\nimport { ExhibitService } from 'src/app/_services/generatedServices';\r\nimport { Subscription, of } from 'rxjs';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { ExhibitDesignerViewModel, UserAuthenticationViewModel } from 'src/app/_models/generatedModels';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\nimport { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';\r\nimport { DefaultReconnectPolicy } from 'src/app/_helpers/signalR-retry-policy';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { OpentokService } from 'src/app/_services/opentok.service';\r\nimport { ChatViewModel, SelectedDevice } from 'src/app/_models/models';\r\nimport { CameraTestModalComponent } from '../../events/live/camera-test/camera-test-modal.component';\r\nimport { mapTo, delay } from 'rxjs/operators';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ExhibitVideoModalComponent } from './exhibit-video-modal.component';\r\nconst initLayoutContainer = require('opentok-layout-js');\r\ndeclare var zE: any;\r\n\r\n@Component({\r\n selector: 'bxl-exhibitor-booth',\r\n templateUrl: 'exhibitor-booth.component.html',\r\n})\r\nexport class ExhibitorBoothComponent implements OnInit, OnDestroy {\r\n initialized = false;\r\n showDownloads = false;\r\n session: OT.Session;\r\n public user: UserAuthenticationViewModel;\r\n exhibitId: number;\r\n public selectedDevice: SelectedDevice;\r\n public connection: HubConnection;\r\n public isFullScreen: boolean;\r\n publisher: OT.Publisher;\r\n @ViewChild('fullScreenContainer') fullScreenContainer: ElementRef;\r\n publishing: Boolean;\r\n public publishingAudio = true;\r\n public publishingVideo = true;\r\n public chatMessage: string;\r\n public messages: ChatViewModel[] = new Array();\r\n toggled: boolean = false;\r\n showPicker: boolean = false;\r\n preview: boolean = false;\r\n\r\n exhibit: ExhibitDesignerViewModel;\r\n private routeSubscription: Subscription;\r\n @ViewChild('messageContainer') private messageContainer: ElementRef;\r\n @ViewChild('webRTCLayoutContainer') webRTCLayoutContainer: ElementRef;\r\n @ViewChild('chatbox') private chatbox: ElementRef;\r\n layout: any;\r\n\r\n constructor(private exhibitService: ExhibitService, private modalService: NgbModal, private renderer: Renderer2, private opentokService: OpentokService, private ref: ChangeDetectorRef, private auth: AuthenticationService, private route: ActivatedRoute, private router: Router, private toaster: ToasterService) {}\r\n\r\n ngOnInit(): void {\r\n this.user = this.auth.getUser();\r\n console.log(this.user);\r\n document.body.style.backgroundColor = '#fff';\r\n zE('webWidget', 'hide');\r\n zE('webWidget:on', 'close', () => {\r\n zE('webWidget', 'hide');\r\n });\r\n\r\n this.preview = this.route.snapshot.data.preview;\r\n\r\n this.routeSubscription = this.route.paramMap.subscribe((param) => {\r\n this.exhibitId = parseInt(param.get('id'));\r\n\r\n this.exhibitService.getExhibitById(this.exhibitId).subscribe((exhibit) => {\r\n this.exhibit = exhibit;\r\n this.InitSignalR();\r\n this.InitOpenTok();\r\n });\r\n });\r\n }\r\n\r\n checkAndDisplayPreviewError(): boolean {\r\n if (this.preview) {\r\n this.toaster.messageDialog('You are in preview mode, and this function is not available.', 'Preview Mode').subscribe();\r\n return this.preview;\r\n }\r\n return this.preview;\r\n }\r\n\r\n InitSignalR(): any {\r\n this.connection = new HubConnectionBuilder()\r\n .withUrl('/exhibitHub', { accessTokenFactory: () => this.auth.getToken() })\r\n .withAutomaticReconnect(new DefaultReconnectPolicy())\r\n .build();\r\n\r\n this.connection.start().then(() => {\r\n this.connection.invoke('connectToExhibit', this.exhibitId);\r\n });\r\n\r\n this.connection.on('postChat', (id: number, name: string, message: string, userId: number, exhibitId: number) => {\r\n console.log('chat received' + exhibitId);\r\n if (exhibitId === this.exhibitId) {\r\n this.messages.push(new ChatViewModel(id, name, message, userId));\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.initialized = true;\r\n this.checkAndShowVideo();\r\n }\r\n\r\n techSupportClicked() {\r\n zE('webWidget', 'show');\r\n zE('webWidget', 'open');\r\n }\r\n\r\n checkAndShowVideo() {\r\n if (this.exhibit.introVideoAssetPath) {\r\n const modalRef = this.modalService.open(ExhibitVideoModalComponent, { size: 'lg', ariaLabelledBy: 'modal-basic-title' });\r\n modalRef.componentInstance.url = this.exhibit.introVideoAssetPath;\r\n modalRef.result.then(\r\n (result) => {},\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n }\r\n\r\n scrollToBottom(): void {\r\n of(null)\r\n .pipe(delay(100))\r\n .subscribe((result) => {\r\n try {\r\n this.messageContainer.nativeElement.scrollTop = this.messageContainer.nativeElement.scrollHeight;\r\n } catch (err) {}\r\n });\r\n }\r\n\r\n InitOpenTok() {\r\n this.ref.detectChanges();\r\n this.layout = initLayoutContainer(this.webRTCLayoutContainer.nativeElement).layout;\r\n let layout = this.layout;\r\n\r\n this.opentokService\r\n .initSessionForExhibits(this.exhibitId)\r\n .then((session: OT.Session) => {\r\n this.session = session;\r\n this.session.on('streamCreated', (event) => {\r\n console.log(event.stream.name);\r\n console.log(event.stream.connection.data);\r\n\r\n let subscription = this.session.subscribe(event.stream, 'webRTCLayoutContainer', {\r\n insertMode: 'append',\r\n style: { nameDisplayMode: 'off' },\r\n });\r\n\r\n subscription.element.addEventListener('dblclick', function () {\r\n if (subscription.element.classList.contains('OT_big')) {\r\n subscription.element.classList.remove('OT_big');\r\n } else {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n layout();\r\n this.ref.detectChanges();\r\n });\r\n this.session.on('streamDestroyed', (event) => {\r\n session.getSubscribersForStream(event.stream).forEach((subscriber) => {\r\n subscriber.element.classList.remove('ot-layout');\r\n setTimeout(() => {\r\n layout();\r\n }, 200);\r\n });\r\n });\r\n })\r\n .then(() => this.opentokService.connect())\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect. Make sure you have updated the config.ts file with your OpenTok details.');\r\n });\r\n }\r\n\r\n showDeviceSettings() {\r\n const modalRef = this.modalService.open(CameraTestModalComponent, { size: 'lg', backdrop: 'static', ariaLabelledBy: 'modal-basic-title' });\r\n if (this.selectedDevice) {\r\n console.log(this.selectedDevice);\r\n modalRef.componentInstance.selectedDevice = this.selectedDevice;\r\n }\r\n modalRef.result.then(\r\n (result) => {\r\n this.selectedDevice = result;\r\n\r\n if (this.publisher) {\r\n this.publisher.destroy();\r\n if (this.publishing) {\r\n this.activateCamera();\r\n }\r\n }\r\n },\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n\r\n activateCamera() {\r\n if (this.checkAndDisplayPreviewError()) {\r\n return;\r\n }\r\n\r\n this.exhibitService.turnedOnCamera(this.exhibitId).subscribe();\r\n\r\n this.ref.detectChanges();\r\n\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n\r\n if (this.selectedDevice) {\r\n this.publisher = OT.initPublisher(el, { publishAudio: this.publishingAudio, publishVideo: this.publishingVideo, resolution: '1280x720', name: 'billbob', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' }, audioSource: this.selectedDevice.audioDeviceId, videoSource: this.selectedDevice.videoDeviceId });\r\n } else {\r\n this.publisher = OT.initPublisher(el, { publishAudio: this.publishingAudio, publishVideo: this.publishingVideo, resolution: '1280x720', name: 'billbob', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' } });\r\n }\r\n\r\n let layout = this.layout;\r\n\r\n el.addEventListener('dblclick', function () {\r\n if (el.classList.contains('OT_big')) {\r\n el.classList.remove('OT_big');\r\n } else {\r\n el.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n\r\n this.renderer.appendChild(this.webRTCLayoutContainer.nativeElement, el);\r\n layout();\r\n\r\n if (this.session) {\r\n if (this.session['isConnected']()) {\r\n this.publish();\r\n }\r\n this.session.on('sessionConnected', () => this.publish());\r\n }\r\n }\r\n\r\n publish() {\r\n this.session.publish(this.publisher, (err) => {\r\n if (err) {\r\n alert(err.message);\r\n } else {\r\n this.publishing = true;\r\n }\r\n });\r\n }\r\n\r\n checkIn() {\r\n this.toaster.confirmDialog('Are you sure you want to check in? This will share your name and email with the exhibitor?', 'Check In?').subscribe((result) => {\r\n if (result) {\r\n this.exhibitService.checkIn(this.exhibitId).subscribe();\r\n }\r\n });\r\n }\r\n\r\n websiteClicked() {\r\n this.exhibitService.websiteClicked(this.exhibitId).subscribe();\r\n }\r\n\r\n toggleVideo() {\r\n this.publishingVideo = !this.publishingVideo;\r\n this.publisher.publishVideo(this.publishingVideo);\r\n }\r\n\r\n toggleAudio() {\r\n this.publishingAudio = !this.publishingAudio;\r\n this.publisher.publishAudio(this.publishingAudio);\r\n }\r\n\r\n unpublish() {\r\n this.session.unpublish(this.publisher);\r\n this.publishing = false;\r\n this.layout();\r\n }\r\n\r\n exitPage() {\r\n if (this.preview) {\r\n this.router.navigate(['/account/exhibits']);\r\n return;\r\n }\r\n\r\n this.toaster.confirmDialog('Are you sure you want to leave this exhibit?', 'Exit?', 'Yes, Exit', 'Cancel').subscribe((result) => {\r\n if (result) {\r\n this.router.navigate(['/', this.exhibit.organizationSlug, 'exhibits']);\r\n }\r\n });\r\n }\r\n\r\n public sendMessage() {\r\n if (this.checkAndDisplayPreviewError()) {\r\n return;\r\n }\r\n\r\n this.connection.invoke('postChat', this.user.firstName + ' ' + this.user.lastName, this.chatMessage, this.user.id, this.exhibitId);\r\n this.chatMessage = null;\r\n }\r\n\r\n handleSelection(char) {\r\n if (this.chatMessage == null) {\r\n this.chatMessage = '';\r\n }\r\n\r\n this.chatMessage = this.chatMessage + char;\r\n this.toggled = false;\r\n this.chatbox.nativeElement.focus();\r\n }\r\n\r\n fullscreen() {\r\n let elem = this.fullScreenContainer.nativeElement;\r\n let doc = <any>document;\r\n if (!this.isFullScreen) {\r\n if (elem.requestFullscreen) {\r\n elem.requestFullscreen();\r\n } else if (elem.mozRequestFullScreen) {\r\n /* Firefox */\r\n elem.mozRequestFullScreen();\r\n } else if (elem.webkitRequestFullscreen) {\r\n /* Chrome, Safari and Opera */\r\n elem.webkitRequestFullscreen();\r\n } else if (elem.msRequestFullscreen) {\r\n /* IE/Edge */\r\n elem.msRequestFullscreen();\r\n }\r\n setTimeout(() => {\r\n this.layout();\r\n this.isFullScreen = true;\r\n }, 500);\r\n } else {\r\n if (document.exitFullscreen) {\r\n doc.exitFullscreen();\r\n } else if (doc.mozCancelFullScreen) {\r\n /* Firefox */\r\n doc.mozCancelFullScreen();\r\n } else if (doc.webkitExitFullscreen) {\r\n /* Chrome, Safari and Opera */\r\n doc.webkitExitFullscreen();\r\n } else if (doc.msExitFullscreen) {\r\n /* IE/Edge */\r\n doc.msExitFullscreen();\r\n }\r\n setTimeout(() => {\r\n this.isFullScreen = false;\r\n this.layout();\r\n }, 500);\r\n }\r\n }\r\n\r\n @HostListener('document:fullscreenchange', ['$event'])\r\n @HostListener('document:webkitfullscreenchange', ['$event'])\r\n @HostListener('document:mozfullscreenchange', ['$event'])\r\n @HostListener('document:MSFullscreenChange', ['$event'])\r\n exit(ev) {\r\n if (this.isFullScreen) {\r\n of(null)\r\n .pipe(delay(3000))\r\n .subscribe((result) => {\r\n this.isFullScreen = false;\r\n console.log('exiting');\r\n this.layout();\r\n });\r\n }\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n resize(evt) {\r\n this.layout();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.routeSubscription.unsubscribe();\r\n\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n\r\n if (this.publisher) {\r\n this.publisher.destroy();\r\n }\r\n\r\n if (this.session) {\r\n this.session.off('streamCreated');\r\n this.session.off('streamDestroyed');\r\n this.session.disconnect();\r\n }\r\n\r\n zE('webWidget', 'show');\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NgbModalModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ExhibitDashboardComponent } from './exhibits/exhibit-dashboard/exhibit-dashboard.component';\r\nimport { VisitorLogComponent } from './exhibits/exhibit-dashboard/visitor-log/visitor-log.component';\r\nimport { ExhibitVideoModalComponent } from './exhibits/public/exhibit-video-modal.component';\r\nimport { ExhibitorBoothComponent } from './exhibits/public/exhibitor-booth.component';\r\nimport { ExhibitMaterialsComponent } from './exhibits/public/materials/exhibit-materials.component';\r\nimport { IsAuthenticatedGuard } from './_guards/isAuthenticated.gaurd';\r\nimport { ApplicationPipesModule } from './_shared/modules/application-pipes.module';\r\n\r\n@NgModule({\r\n declarations:[\r\n ExhibitorBoothComponent,\r\n ExhibitDashboardComponent,\r\n ExhibitMaterialsComponent,\r\n VisitorLogComponent,\r\n ExhibitVideoModalComponent\r\n ],\r\n entryComponents:[\r\n ExhibitVideoModalComponent,\r\n ],\r\n imports:[\r\n NgbModalModule,\r\n ApplicationPipesModule,\r\n RouterModule.forChild([\r\n { path: ':id', component: ExhibitorBoothComponent, data: { preview: false, title:'View Exhibit' } },\r\n { path: ':id/preview', component: ExhibitorBoothComponent, data: { preview: true, title:'Preview Exhibit' } },\r\n { path: ':id/dashboard', component: ExhibitDashboardComponent, data: { title: \"Exhibit Dashboard\"} },\r\n ])\r\n ],\r\n exports:[]\r\n})\r\nexport class ExhibitsModule{}\r\n"]}