A self hosted chat application with end-to-end encrypted messaging.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

155 lines
6.2 KiB

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<ActiveUserViewModel>;
private readonly _userContactOnlineTemplate: Handlebars.TemplateDelegate<ActiveUserViewModel>;
private readonly _userContactOfflineTemplate: Handlebars.TemplateDelegate<ActiveUserViewModel>;
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)
})
}
}