import { Observer } from "../observe/Observer"; import { ActiveUserViewModel } from "../viewmodel/ActiveUserViewModel"; import { ChatModel } from "../model/ChatModel"; import log = require("loglevel"); import * as DOMPurify from "dompurify"; import { SearchService } from "../service/SearchService"; import { UserModel } from "../model/UserModel"; import { UserViewDeps } from "./UserViewDeps"; export class UserView implements Observer { private readonly _model: UserModel; private readonly _chatModel: ChatModel; private readonly _usersListElement: HTMLElement; private readonly _userSearchInputElement: HTMLInputElement; private readonly _userSearchButton: HTMLElement; private readonly _userSearchCancelButton: HTMLElement; private readonly _searchService: SearchService; private readonly _userContactOnlineTemplate: Handlebars.TemplateDelegate; private readonly _userContactOfflineTemplate: Handlebars.TemplateDelegate; constructor(deps: UserViewDeps) { this._model = deps.model; this._chatModel = deps.chatModel; this._usersListElement = deps.usersListElement; this._userSearchInputElement = deps.userSearchInputElement; this._userSearchButton = deps.userSearchButton; this._userSearchCancelButton = deps.userSearchCancelButton; this._searchService = deps.searchService; this._userContactOnlineTemplate = deps.userContactOnlineTemplate; this._userContactOfflineTemplate = deps.userContactOfflineTemplate; this.addSearchEventListeners(); } update(data: ActiveUserViewModel[]): void { let html: string = ""; data.forEach((element: ActiveUserViewModel) => { element.online ? html += this._userContactOnlineTemplate(element) : html += this._userContactOfflineTemplate(element); }); $(this._usersListElement).html(DOMPurify.sanitize(html)); this.addUserCallBacks(); console.log(this._usersListElement.innerHTML); } private addSearchEventListeners(): void { this.addSearchButtonEL(); this.addSearchCancelEL(); this.addSearchInputEL(); } private addUserCallBacks(): void { let userBoxes = document.getElementsByClassName('user-box'); for (let i = 0; i < userBoxes.length; i++) { let userBox = userBoxes[i]; userBoxes[i].addEventListener('click', this.userCallBack.bind(this, userBox)); } } private userCallBack(el: Element): void { let current = document.getElementsByClassName('user-box active'); let passphrase: string = ''; if (current.length > 0) { let passphraseInput = document.getElementById('passphrase') as any; if (passphraseInput == null) { log.error('passphraseInput element reference is null'); return; } passphrase = passphraseInput.value if (passphrase == '' || passphrase == null) { // alert('Please input passphrase') // alertify.error('Please enter a passphrase'); log.error('passphrase is empty or null'); return; } current[0].className = current[0].className.replace(" active", ""); } // Add the active class to the current/clicked button else if (current.length == 0) { let elem = document.getElementById('passphrase-initial') as any; if (elem == null) { log.error('passphraseInput element reference is null'); return; } passphrase = elem.value; if (passphrase == '' || passphrase == null) { // // alert('Please input passphrase') // // alertify.error('Please enter a passphrase'); log.error('passphrase is empty or null'); return; } // @ts-ignore: Object is possibly 'null'. document.getElementById('no-user-selected').hidden = true; // @ts-ignore: Object is possibly 'null'. document.getElementById('chat-card').hidden = false; // @ts-ignore: Object is possibly 'null'. elem.hidden = true; } // console.log(this.getElementsByClassName('to-user-span')); let elem = el.getElementsByClassName('to-user-span')[0] as HTMLElement; let userName = elem.innerText; // @ts-ignore: Object is possibly 'null'. document.getElementById('user-name-span').innerText = userName; this._chatModel.getmessages(userName, passphrase, null); // populateMessages(userName, passphrase); sessionStorage.setItem('selectedUser', userName); el.className += " active"; } private addSearchButtonEL() { this._userSearchButton.addEventListener('submit', (e) => { e.preventDefault(); // log.trace(temp); const searchTerm = this._userSearchInputElement.value; log.debug("search term value = " + searchTerm); const list = this._model.activeUsersList; log.debug("active users"); log.debug(list); if (list == null) { log.error("Users list is null"); return; } let searchResult = this._searchService.search(list, searchTerm); this.update(searchResult); log.debug(searchResult); }) } private addSearchInputEL() { this._userSearchInputElement.addEventListener('input', (e) => { e.preventDefault(); if (this._userSearchInputElement.value.length < 2) { log.debug("inputted") this._userSearchCancelButton.hidden = false; } }) } private addSearchCancelEL() { this._userSearchCancelButton.addEventListener('click', (e) => { e.preventDefault(); this._userSearchInputElement.value = ""; this._userSearchCancelButton.hidden = true; let list = this._model.activeUsersList; // @ts-ignore this.update(list) }) } }