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.

40 lines
1.5 KiB

  1. import { Observer } from "../observe/Observer";
  2. import { Model } from "../model/AbstractModel";
  3. import { Subject } from "../observe/Observable";
  4. import { View } from "./AbstractView";
  5. import { Controller } from "../controller/AbstractController";
  6. import { TemplateFactory } from "../template/TemplateFactory";
  7. import { ActiveUserViewModel } from "../viewmodel/ActiveUserViewModel";
  8. import { ChatModel } from "../model/ChatModel";
  9. import { ChatMessageViewModel } from "../viewmodel/ChatMessageViewModel";
  10. import * as log from 'loglevel';
  11. import * as DOMPurify from 'dompurify';
  12. import markdownit = require('markdown-it');
  13. var md = new markdownit();
  14. export class ChatView implements Observer {
  15. private readonly _model: ChatModel;
  16. private readonly _element: HTMLElement;
  17. private readonly _messageSendTemplate = TemplateFactory.getTemplate('msg_container_send_template');
  18. constructor(model: ChatModel, element: HTMLElement) {
  19. this._model = model;
  20. this._element = element;
  21. }
  22. update(data: ChatMessageViewModel[]): void {
  23. log.info('ChatView: updating view');
  24. let html: string = "";
  25. data.forEach((vm: ChatMessageViewModel) => {
  26. html += this._messageSendTemplate(vm);
  27. });
  28. /** Very Important!!!
  29. * Sanitizing HTML before displaying on webpage to prevent XSS attacks!!
  30. */
  31. html = DOMPurify.sanitize(md.render(html));
  32. this._element.innerHTML = html;
  33. log.debug(this._element.innerHTML);
  34. }
  35. }