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.

627 lines
82 KiB

  1. (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
  2. "use strict";
  3. Object.defineProperty(exports, "__esModule", { value: true });
  4. require("../model/AbstractModel");
  5. require("../model/UserModel");
  6. require("../view/AbstractView");
  7. require("../view/UserView");
  8. const ChatMessageViewModel_1 = require("../viewmodel/ChatMessageViewModel");
  9. class ChatController {
  10. constructor(model, view) {
  11. this._model = model;
  12. this._view = view;
  13. }
  14. /**
  15. * eventHandler
  16. */
  17. eventHandler(vm) {
  18. this._model.someBusinessMethod(vm);
  19. }
  20. test() {
  21. const chatMessageViewModels = [];
  22. let chatMessageViewModelMock = new ChatMessageViewModel_1.ChatMessageViewModel();
  23. chatMessageViewModelMock.fromUser = "user1";
  24. chatMessageViewModelMock.toUser = "user2";
  25. chatMessageViewModelMock.message = "";
  26. chatMessageViewModelMock.messageTime = new Date();
  27. chatMessageViewModels.push(chatMessageViewModelMock);
  28. }
  29. }
  30. exports.ChatController = ChatController;
  31. },{"../model/AbstractModel":4,"../model/UserModel":8,"../view/AbstractView":12,"../view/UserView":14,"../viewmodel/ChatMessageViewModel":16}],2:[function(require,module,exports){
  32. "use strict";
  33. Object.defineProperty(exports, "__esModule", { value: true });
  34. require("../model/AbstractModel");
  35. require("../model/UserModel");
  36. require("../view/AbstractView");
  37. require("../view/UserView");
  38. const ActiveUserViewModel_1 = require("../viewmodel/ActiveUserViewModel");
  39. class UserController {
  40. constructor(model, view) {
  41. this._model = model;
  42. this._view = view;
  43. }
  44. /**
  45. * eventHandler
  46. */
  47. eventHandler(vm) {
  48. this._model.someBusinessMethod(vm);
  49. }
  50. test() {
  51. const activeUsersMock = [];
  52. let activeUserViewModelMock = new ActiveUserViewModel_1.ActiveUserViewModel();
  53. activeUserViewModelMock.userName = "some user";
  54. activeUserViewModelMock.lastActive = "3 hrs ago";
  55. activeUserViewModelMock.online = true;
  56. activeUsersMock.push(activeUserViewModelMock);
  57. activeUserViewModelMock = new ActiveUserViewModel_1.ActiveUserViewModel();
  58. activeUserViewModelMock.lastActive = "3 hrs ago";
  59. activeUserViewModelMock.online = true;
  60. activeUserViewModelMock.userName = "some user 2";
  61. activeUsersMock.push(activeUserViewModelMock);
  62. this.eventHandler(activeUsersMock);
  63. }
  64. getActiveUsers() {
  65. this._model.getActiveUsers();
  66. }
  67. }
  68. exports.UserController = UserController;
  69. },{"../model/AbstractModel":4,"../model/UserModel":8,"../view/AbstractView":12,"../view/UserView":14,"../viewmodel/ActiveUserViewModel":15}],3:[function(require,module,exports){
  70. (function (global){
  71. "use strict";
  72. Object.defineProperty(exports, "__esModule", { value: true });
  73. const UserModel_1 = require("./model/UserModel");
  74. const UserView_1 = require("./view/UserView");
  75. const UserController_1 = require("./controller/UserController");
  76. const Handlebars = (typeof window !== "undefined" ? window['Handlebars'] : typeof global !== "undefined" ? global['Handlebars'] : null);
  77. const markdownit = (typeof window !== "undefined" ? window['markdownit'] : typeof global !== "undefined" ? global['markdownit'] : null);
  78. const ChatModel_1 = require("./model/ChatModel");
  79. const ChatView_1 = require("./view/ChatView");
  80. const ChatController_1 = require("./controller/ChatController");
  81. const JsonAPI_1 = require("./singleton/JsonAPI");
  82. // import log = require('loglevel')
  83. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  84. const SJCLEncryptionService_1 = require("./service/SJCLEncryptionService");
  85. // var markdownit = require('markdown-it');
  86. var md = new markdownit();
  87. const userBox = document.getElementById('contacts-box');
  88. log.setLevel("TRACE");
  89. const chatModel = new ChatModel_1.ChatModel();
  90. const userModel = new UserModel_1.UserModel();
  91. // const userModel = ModelFactory.createModel("USER");
  92. // @ts-ignore: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'HTMLElement'. Type 'null' is not assignable to type 'HTMLElement'.
  93. const userView = new UserView_1.UserView(userModel, chatModel, userBox);
  94. // console.log(userBox);
  95. userModel.attach(userView);
  96. // userView.model
  97. const userController = new UserController_1.UserController(userModel, userView);
  98. // userController.test();
  99. // userModel.someBusinessMethod(activeUsersMock);
  100. log.info("hello");
  101. const chatArea = document.getElementById('chat-area-new');
  102. // @ts-ignore: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'HTMLElement'. Type 'null' is not assignable to type 'HTMLElement'.
  103. const chatView = new ChatView_1.ChatView(chatModel, chatArea);
  104. chatModel.attach(chatView);
  105. const chatController = new ChatController_1.ChatController(chatModel, chatView);
  106. function someFunc(vm) {
  107. // log.info(vm);
  108. // logger.info(vm)
  109. }
  110. userController.getActiveUsers();
  111. log.info("test");
  112. // someFunc(activeUserViewModelMock);
  113. // @ts-ignore: Object is possibly 'null'.
  114. var source = document.getElementById("msg_container_template").innerHTML;
  115. var msgContainerTemplate = Handlebars.compile(source);
  116. JsonAPI_1.JsonAPI.ACTIVE_USERS_GET + 'aef';
  117. const encryptionService = new SJCLEncryptionService_1.SJCLEncryptionService();
  118. let ct = encryptionService.encrypt("password", "data");
  119. console.log(encryptionService.decrypt("password", JSON.parse(ct)));
  120. Handlebars.registerHelper('avatar', function () {
  121. return '<div class="img_cont_msg"> <img src="https://static.turbosquid.com/Preview/001292/481/WV/_D.jpg" class="rounded-circle user_img_msg"> </div>';
  122. });
  123. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  124. },{"./controller/ChatController":1,"./controller/UserController":2,"./model/ChatModel":5,"./model/UserModel":8,"./service/SJCLEncryptionService":9,"./singleton/JsonAPI":10,"./view/ChatView":13,"./view/UserView":14}],4:[function(require,module,exports){
  125. "use strict";
  126. Object.defineProperty(exports, "__esModule", { value: true });
  127. },{}],5:[function(require,module,exports){
  128. (function (global){
  129. "use strict";
  130. Object.defineProperty(exports, "__esModule", { value: true });
  131. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  132. const ChatModelHelper_1 = require("./ChatModelHelper");
  133. class ChatModel {
  134. constructor() {
  135. /**
  136. * @type {Observer[]} List of subscribers. In real life, the list of
  137. * subscribers can be stored more comprehensively (categorized by event
  138. * type, etc.).
  139. */
  140. this._observers = [];
  141. this.state = null;
  142. this._messagesMap = new Map();
  143. }
  144. /**
  145. * The subscription management methods.
  146. */
  147. attach(observer) {
  148. console.log('Subject: Attached an observer.');
  149. this._observers.push(observer);
  150. }
  151. detach(observer) {
  152. const observerIndex = this._observers.indexOf(observer);
  153. this._observers.splice(observerIndex, 1);
  154. console.log('Subject: Detached an observer.');
  155. }
  156. setUserMessages(username, messages) {
  157. this._messagesMap.set(username, messages);
  158. }
  159. /**
  160. * Trigger an update in each subscriber.
  161. */
  162. notify(userName) {
  163. console.log('Subject: Notifying observers...');
  164. for (const observer of this._observers) {
  165. observer.update(this._messagesMap.get(userName));
  166. }
  167. }
  168. someBusinessMethod(chatMessageList) {
  169. this.state = chatMessageList;
  170. this.helperMethod();
  171. console.log(`Subject: My state has just changed`);
  172. console.log(chatMessageList);
  173. this.notify("some user");
  174. }
  175. async getmessages(userName, passphrase, lastMessageTime) {
  176. const cVMs = await ChatModelHelper_1.ChatModelHelper.getMessages(userName, passphrase, lastMessageTime, this);
  177. if (cVMs != null) {
  178. log.info('Subject: My state has just changed');
  179. log.debug(cVMs);
  180. this._messagesMap.set(userName, cVMs);
  181. this.notify(userName);
  182. }
  183. else {
  184. log.error('Messages were null');
  185. }
  186. return cVMs;
  187. }
  188. helperMethod() { }
  189. populateMessages() {
  190. }
  191. }
  192. exports.ChatModel = ChatModel;
  193. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  194. },{"./ChatModelHelper":6}],6:[function(require,module,exports){
  195. (function (global){
  196. "use strict";
  197. Object.defineProperty(exports, "__esModule", { value: true });
  198. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  199. const ChatMessageViewModel_1 = require("../viewmodel/ChatMessageViewModel");
  200. const JsonAPI_1 = require("../singleton/JsonAPI");
  201. const FetchErrorHandler_1 = require("./FetchErrorHandler");
  202. const SJCLEncryptionService_1 = require("../service/SJCLEncryptionService");
  203. class ChatModelHelper {
  204. static async getMessages(userName, passphrase, lastMessageTime, chatModel) {
  205. switch (lastMessageTime) {
  206. case null: {
  207. // this.getAllMessagesAjax(userName)
  208. // .then((data: ChatMessageDTO[]) => {
  209. // log.debug(`Subject: received all messages`);
  210. // // let userNames = data.map(ChatMessageViewModel => ChatMessageViewModel.fromUser)
  211. // // let sumt = data.map(chatMessageViewModel => { return this.encryptionService.decrypt(passphrase, chatMessageViewModel.messageCipher) });
  212. // return data.map(vm => this.toChatMessageVM(vm, passphrase));
  213. // // chatModel.setUserMessages(userName, chatMessageVMs);
  214. // // chatModel.notify();
  215. // })
  216. // break;
  217. const data = await this.getAllMessagesAjax(userName);
  218. return data.map(vm => this.toChatMessageVM(vm, passphrase));
  219. }
  220. default: {
  221. // this.getNewMessagesAjax(userName, lastMessageTime)
  222. // .then((data: ChatMessageDTO[]) => {
  223. // log.debug(`Subject: received new messages`);
  224. // return data.map(vm => this.toChatMessageVM(vm, passphrase));
  225. // // chatModel.setUserMessages(userName, chatMessageVMs);
  226. // // this.state = data;
  227. // // chatModel.notify();
  228. // })
  229. // break;
  230. const data = await this.getNewMessagesAjax(userName, lastMessageTime);
  231. return data.map(vm => this.toChatMessageVM(vm, passphrase));
  232. }
  233. }
  234. // return null;
  235. }
  236. static toChatMessageVM(chatMessageDTO, passphrase) {
  237. const vm = new ChatMessageViewModel_1.ChatMessageViewModel();
  238. vm.fromUser = chatMessageDTO.fromUser;
  239. vm.toUser = chatMessageDTO.toUser;
  240. vm.messageTime = chatMessageDTO.messageTime;
  241. vm.message = this.encryptionService.decrypt(passphrase, chatMessageDTO.messageCipher);
  242. return vm;
  243. }
  244. static async getAllMessagesAjax(toUser) {
  245. const headers = new Headers();
  246. if (JsonAPI_1.JsonAPI.authToken == null) {
  247. log.error("authToken null");
  248. return;
  249. }
  250. ;
  251. headers.append('X-AUTH-TOKEN', JsonAPI_1.JsonAPI.authToken);
  252. const response = await fetch(`${JsonAPI_1.JsonAPI.CHAT_MESSAGES_GET}/${toUser}`, {
  253. method: 'GET',
  254. headers: headers
  255. });
  256. console.log(response.clone());
  257. if (FetchErrorHandler_1.fetchErrorHandler(response.clone())) {
  258. return null;
  259. }
  260. const data = await response.json();
  261. return data;
  262. }
  263. static async getNewMessagesAjax(toUser, lastMessageTimeStamp) {
  264. const headers = new Headers();
  265. if (JsonAPI_1.JsonAPI.authToken == null) {
  266. log.error("authToken null");
  267. return;
  268. }
  269. ;
  270. headers.append('X-AUTH-TOKEN', JsonAPI_1.JsonAPI.authToken);
  271. const response = await fetch(`${JsonAPI_1.JsonAPI.CHAT_MESSAGES_GET}/${toUser}/${lastMessageTimeStamp}`, {
  272. method: 'GET',
  273. headers: headers
  274. });
  275. console.log(response.clone());
  276. if (FetchErrorHandler_1.fetchErrorHandler(response.clone())) {
  277. return null;
  278. }
  279. const data = await response.json();
  280. return data;
  281. }
  282. }
  283. exports.ChatModelHelper = ChatModelHelper;
  284. ChatModelHelper.encryptionService = new SJCLEncryptionService_1.SJCLEncryptionService();
  285. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  286. },{"../service/SJCLEncryptionService":9,"../singleton/JsonAPI":10,"../viewmodel/ChatMessageViewModel":16,"./FetchErrorHandler":7}],7:[function(require,module,exports){
  287. (function (global){
  288. "use strict";
  289. Object.defineProperty(exports, "__esModule", { value: true });
  290. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  291. const sprintf_js_1 = (typeof window !== "undefined" ? window['sprintf'] : typeof global !== "undefined" ? global['sprintf'] : null);
  292. // import sprintf = require('sprintf-js').sprintf;
  293. function fetchErrorHandler(response) {
  294. // alertify.success('Current position : ' + alertify.get('notifier', 'position'));
  295. if (!response.ok) {
  296. return response.text().catch(err => {
  297. // the status was not ok and there is no json body
  298. // throw new Error(response.statusText);
  299. // window.alert(sprintf('Some error occured. Http code is %s', response.status));
  300. // alertify.error(sprintf('Some error occured. Http code is %s', response.status));
  301. log.error(sprintf_js_1.sprintf('Some error occured. Http code is %s', response.status));
  302. log.error();
  303. return true;
  304. }).then(json => {
  305. // the status was not ok but there is a json body
  306. // throw new Error(json.error.message); // example error message returned by a REST API
  307. // window.alert(sprintf('Error: %s (Http code %s)', json, response.status));
  308. // alertify.error(sprintf('Some error occured. Http code is %s', response.status));
  309. log.error(sprintf_js_1.sprintf('Some error occured. Http code is %s', response.status));
  310. log.error(json);
  311. return true;
  312. });
  313. }
  314. }
  315. exports.fetchErrorHandler = fetchErrorHandler;
  316. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  317. },{}],8:[function(require,module,exports){
  318. (function (global){
  319. "use strict";
  320. Object.defineProperty(exports, "__esModule", { value: true });
  321. const FetchErrorHandler_1 = require("./FetchErrorHandler");
  322. const JsonAPI_1 = require("../singleton/JsonAPI");
  323. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  324. class UserModel {
  325. // @ts-ignore: Cannot find name 'hostAddress'.
  326. constructor() {
  327. /**
  328. * @type {Observer[]} List of subscribers. In real life, the list of
  329. * subscribers can be stored more comprehensively (categorized by event
  330. * type, etc.).
  331. */
  332. this.observers = [];
  333. }
  334. /**
  335. * The subscription management methods.
  336. */
  337. attach(observer) {
  338. console.log('Subject: Attached an observer.');
  339. this.observers.push(observer);
  340. }
  341. detach(observer) {
  342. const observerIndex = this.observers.indexOf(observer);
  343. this.observers.splice(observerIndex, 1);
  344. console.log('Subject: Detached an observer.');
  345. }
  346. /**
  347. * Trigger an update in each subscriber.
  348. */
  349. notify() {
  350. console.log('Subject: Notifying observers...');
  351. for (const observer of this.observers) {
  352. observer.update(this.state);
  353. }
  354. }
  355. someBusinessMethod(activeuserList) {
  356. this.state = activeuserList;
  357. this.helperMethod();
  358. console.log(`Subject: My state has just changed`);
  359. console.log(activeuserList);
  360. this.notify();
  361. }
  362. /**
  363. * getActiveUsers
  364. */
  365. getActiveUsers() {
  366. if (JsonAPI_1.JsonAPI.authToken != null) {
  367. this.getActiveUsersAjax(JsonAPI_1.JsonAPI.authToken, JsonAPI_1.JsonAPI.ACTIVE_USERS_GET)
  368. .then(data => {
  369. // // activeUsers = data;
  370. // sessionStorage.setItem('activeUsers', JSON.stringify(data));
  371. // console.log(sessionStorage.getItem('activeUsers'));
  372. console.log(`Subject: received ajax active users`);
  373. this.state = data;
  374. this.notify();
  375. });
  376. }
  377. else {
  378. log.error('Auth token is null');
  379. }
  380. }
  381. async getActiveUsersAjax(authToken2, URL) {
  382. let headers = new Headers();
  383. // headers.append('Authorization', basicAuthToken);
  384. headers.append('X-AUTH-TOKEN', authToken2);
  385. let response = await fetch(JsonAPI_1.JsonAPI.ACTIVE_USERS_GET, {
  386. method: 'GET',
  387. headers: headers
  388. });
  389. console.log(response.clone());
  390. if (FetchErrorHandler_1.fetchErrorHandler(response.clone())) {
  391. return null;
  392. }
  393. let data = await response.json();
  394. // return data;
  395. return new Promise((resolve, reject) => {
  396. if (data != null)
  397. resolve(data);
  398. else
  399. reject('Response data null');
  400. });
  401. }
  402. helperMethod() { }
  403. }
  404. exports.UserModel = UserModel;
  405. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  406. },{"../singleton/JsonAPI":10,"./FetchErrorHandler":7}],9:[function(require,module,exports){
  407. (function (global){
  408. "use strict";
  409. Object.defineProperty(exports, "__esModule", { value: true });
  410. const sjcl = (typeof window !== "undefined" ? window['sjcl'] : typeof global !== "undefined" ? global['sjcl'] : null);
  411. class SJCLEncryptionService {
  412. constructor() {
  413. this.params = { mode: "gcm", ts: 128, adata: "", iter: 10000 };
  414. }
  415. encrypt(passphrase, plainText) {
  416. return sjcl.encrypt(passphrase, plainText, this.params);
  417. }
  418. decrypt(passphrase, cipher) {
  419. // return sjcl.decrypt(passphrase, cipher as sjcl.SjclCipherEncrypted, undefined, undefined);
  420. return sjcl.decrypt(passphrase, JSON.stringify(cipher), undefined, undefined);
  421. }
  422. }
  423. exports.SJCLEncryptionService = SJCLEncryptionService;
  424. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  425. },{}],10:[function(require,module,exports){
  426. "use strict";
  427. Object.defineProperty(exports, "__esModule", { value: true });
  428. var JsonAPI;
  429. (function (JsonAPI) {
  430. // @ts-ignore: Cannot find name 'hostAddress'.
  431. JsonAPI.userName = localStorage.getItem('userName');
  432. JsonAPI.authToken = localStorage.getItem('authToken');
  433. JsonAPI.ACTIVE_USERS_GET = `/api/chat/get/active-users`;
  434. JsonAPI.CHAT_MESSAGES_GET = `/api/chat/get/messages`;
  435. })(JsonAPI = exports.JsonAPI || (exports.JsonAPI = {}));
  436. },{}],11:[function(require,module,exports){
  437. "use strict";
  438. Object.defineProperty(exports, "__esModule", { value: true });
  439. class TemplateFactory {
  440. // static getTemplate(templateName: string): Handlebars.TemplateDelegate<any> {
  441. // switch (templateName) {
  442. // case "user-contact-online-template": {
  443. // // let source = document.getElementById("user-contact-online-template").innerHTML;
  444. // // let msgContainerTemplate = Handlebars.compile(source);
  445. // // return msgContainerTemplate;
  446. // return this.createTemplate(templateName);
  447. // }
  448. // case "msg_container_send_template": {
  449. // // let source = document.getElementById("msg_container_send_template").innerHTML;
  450. // // let msgContainerTemplate = Handlebars.compile(source);
  451. // // return msgContainerTemplate;
  452. // return this.createTemplate(templateName);
  453. // }
  454. // case "msg_container_template": {
  455. // // let source = document.getElementById("msg_container_send_template").innerHTML;
  456. // // let msgContainerTemplate = Handlebars.compile(source);
  457. // // return msgContainerTemplate;
  458. // return this.createTemplate(templateName);
  459. // }
  460. // default:
  461. // throw new Error('invalid template name');
  462. // }
  463. // }
  464. static getTemplate(templateName) {
  465. //@ts-ignore: Object is possibly 'null'.
  466. let source = document.getElementById(templateName).innerHTML;
  467. let msgContainerTemplate = Handlebars.compile(source);
  468. return msgContainerTemplate;
  469. }
  470. }
  471. exports.TemplateFactory = TemplateFactory;
  472. },{}],12:[function(require,module,exports){
  473. "use strict";
  474. Object.defineProperty(exports, "__esModule", { value: true });
  475. },{}],13:[function(require,module,exports){
  476. (function (global){
  477. "use strict";
  478. Object.defineProperty(exports, "__esModule", { value: true });
  479. const TemplateFactory_1 = require("../template/TemplateFactory");
  480. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  481. const DOMPurify = (typeof window !== "undefined" ? window['DOMPurify'] : typeof global !== "undefined" ? global['DOMPurify'] : null);
  482. const markdownit = (typeof window !== "undefined" ? window['markdownit'] : typeof global !== "undefined" ? global['markdownit'] : null);
  483. var md = new markdownit();
  484. class ChatView {
  485. constructor(model, element) {
  486. this._messageSendTemplate = TemplateFactory_1.TemplateFactory.getTemplate('msg_container_send_template');
  487. this._model = model;
  488. this._element = element;
  489. }
  490. update(data) {
  491. log.info('ChatView: updating view');
  492. let html = "";
  493. data.forEach((vm) => {
  494. html += this._messageSendTemplate(vm);
  495. });
  496. /** Very Important!!!
  497. * Sanitizing HTML before displaying on webpage to prevent XSS attacks!!
  498. */
  499. html = DOMPurify.sanitize(md.render(html));
  500. this._element.innerHTML = html;
  501. log.debug(this._element.innerHTML);
  502. }
  503. }
  504. exports.ChatView = ChatView;
  505. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  506. },{"../template/TemplateFactory":11}],14:[function(require,module,exports){
  507. (function (global){
  508. "use strict";
  509. Object.defineProperty(exports, "__esModule", { value: true });
  510. const TemplateFactory_1 = require("../template/TemplateFactory");
  511. const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null);
  512. class UserView {
  513. // private userBoxes: any[] = [];
  514. constructor(model, chatModel, element) {
  515. this._model = model;
  516. this._chatModel = chatModel;
  517. this._element = element;
  518. }
  519. update(data) {
  520. let template = TemplateFactory_1.TemplateFactory.getTemplate('user-contact-online-template');
  521. let html = "";
  522. data.forEach((element) => {
  523. html += template(element);
  524. });
  525. this._element.innerHTML = html;
  526. this.addUserCallBacks();
  527. console.log(this._element.innerHTML);
  528. }
  529. helper() {
  530. }
  531. addUserCallBacks() {
  532. let userBoxes = document.getElementsByClassName('user-box');
  533. for (let i = 0; i < userBoxes.length; i++) {
  534. let userBox = userBoxes[i];
  535. userBoxes[i].addEventListener('click', this.userCallBack.bind(this, userBox));
  536. }
  537. }
  538. userCallBack(el) {
  539. let current = document.getElementsByClassName('user-box active');
  540. let passphrase = '';
  541. if (current.length > 0) {
  542. let passphraseInput = document.getElementById('passphrase');
  543. if (passphraseInput == null) {
  544. log.error('passphraseInput element reference is null');
  545. return;
  546. }
  547. passphrase = passphraseInput.value;
  548. if (passphrase == '' || passphrase == null) {
  549. // alert('Please input passphrase')
  550. // alertify.error('Please enter a passphrase');
  551. log.error('passphrase is empty or null');
  552. return;
  553. }
  554. current[0].className = current[0].className.replace(" active", "");
  555. }
  556. // Add the active class to the current/clicked button
  557. else if (current.length == 0) {
  558. let elem = document.getElementById('passphrase-initial');
  559. if (elem == null) {
  560. log.error('passphraseInput element reference is null');
  561. return;
  562. }
  563. passphrase = elem.value;
  564. if (passphrase == '' || passphrase == null) {
  565. // // alert('Please input passphrase')
  566. // // alertify.error('Please enter a passphrase');
  567. log.error('passphrase is empty or null');
  568. return;
  569. }
  570. // @ts-ignore: Object is possibly 'null'.
  571. document.getElementById('no-user-selected').hidden = true;
  572. // @ts-ignore: Object is possibly 'null'.
  573. document.getElementById('chat-card').hidden = false;
  574. // @ts-ignore: Object is possibly 'null'.
  575. elem.hidden = true;
  576. }
  577. // console.log(this.getElementsByClassName('to-user-span'));
  578. let elem = el.getElementsByClassName('to-user-span')[0];
  579. let userName = elem.innerText;
  580. // @ts-ignore: Object is possibly 'null'.
  581. document.getElementById('user-name-span').innerText = userName;
  582. this._chatModel.getmessages(userName, passphrase, null);
  583. // populateMessages(userName, passphrase);
  584. sessionStorage.setItem('selectedUser', userName);
  585. el.className += " active";
  586. }
  587. }
  588. exports.UserView = UserView;
  589. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  590. },{"../template/TemplateFactory":11}],15:[function(require,module,exports){
  591. "use strict";
  592. Object.defineProperty(exports, "__esModule", { value: true });
  593. class ActiveUserViewModel {
  594. }
  595. exports.ActiveUserViewModel = ActiveUserViewModel;
  596. },{}],16:[function(require,module,exports){
  597. "use strict";
  598. Object.defineProperty(exports, "__esModule", { value: true });
  599. class ChatMessageViewModel {
  600. }
  601. exports.ChatMessageViewModel = ChatMessageViewModel;
  602. },{}]},{},[3])
  603. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL3dhdGNoaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJ0cy9zcmMvY29udHJvbGxlci9DaGF0Q29udHJvbGxlci50cyIsInRzL3NyYy9jb250cm9sbGVyL1VzZXJDb250cm9sbGVyLnRzIiwidHMvc3JjL21haW4udHMiLCJ0cy9zcmMvbW9kZWwvQ2hhdE1vZGVsLnRzIiwidHMvc3JjL21vZGVsL0NoYXRNb2RlbEhlbHBlci50cyIsInRzL3NyYy9tb2RlbC9GZXRjaEVycm9ySGFuZGxlci50cyIsInRzL3NyYy9tb2RlbC9Vc2VyTW9kZWwudHMiLCJ0cy9zcmMvc2VydmljZS9TSkNMRW5jcnlwdGlvblNlcnZpY2UudHMiLCJ0cy9zcmMvc2luZ2xldG9uL0pzb25BUEkudHMiLCJ0cy9zcmMvdGVtcGxhdGUvVGVtcGxhdGVGYWN0b3J5LnRzIiwidHMvc3JjL3ZpZXcvQ2hhdFZpZXcudHMiLCJ0cy9zcmMvdmlldy9Vc2VyVmlldy50cyIsInRzL3NyYy92aWV3bW9kZWwvQWN0aXZlVXNlclZpZXdNb2RlbC50cyIsInRzL3NyYy92aWV3bW9kZWwvQ2hhdE1lc3NhZ2VWaWV3TW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztBQ0NBLGtDQUErQjtBQUMvQiw4QkFBMkI7QUFDM0IsZ0NBQTZCO0FBQzdCLDRCQUF5QjtBQUd6Qiw0RUFBeUU7QUFJekUsTUFBYSxjQUFjO0lBS3ZCLFlBQVksS0FBZ0IsRUFBRSxJQUFjO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFHRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUEwQjtRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENB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