message-body.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import 'shared/registry.js';
  2. import ImageModal from 'modals/image.js';
  3. import renderRichText from 'shared/directives/rich-text.js';
  4. import { CustomElement } from 'shared/components/element.js';
  5. import { api } from "@converse/headless/core";
  6. import { getAppSettings } from '@converse/headless/shared/settings/utils.js';
  7. import './styles/message-body.scss';
  8. export default class MessageBody extends CustomElement {
  9. static get properties () {
  10. return {
  11. // We make this a string instead of a boolean, since we want to
  12. // distinguish between true, false and undefined states
  13. hide_url_previews: { type: String },
  14. is_me_message: { type: Boolean },
  15. model: { type: Object },
  16. text: { type: String },
  17. }
  18. }
  19. initialize () {
  20. const settings = getAppSettings();
  21. this.listenTo(settings, 'change:allowed_audio_domains', () => this.requestUpdate());
  22. this.listenTo(settings, 'change:allowed_image_domains', () => this.requestUpdate());
  23. this.listenTo(settings, 'change:allowed_video_domains', () => this.requestUpdate());
  24. this.listenTo(settings, 'change:render_media', () => this.requestUpdate());
  25. }
  26. onImgClick (ev) { // eslint-disable-line class-methods-use-this
  27. ev.preventDefault();
  28. api.modal.create(ImageModal, {'src': ev.target.src}, ev).show(ev);
  29. }
  30. onImgLoad () {
  31. this.dispatchEvent(new CustomEvent('imageLoaded', { detail: this, 'bubbles': true }));
  32. }
  33. render () {
  34. const callback = () => this.model.collection?.trigger('rendered', this.model);
  35. const offset = 0;
  36. const options = {
  37. 'media_urls': this.model.get('media_urls'),
  38. 'mentions': this.model.get('references'),
  39. 'nick': this.model.collection.chatbox.get('nick'),
  40. 'onImgClick': (ev) => this.onImgClick(ev),
  41. 'onImgLoad': () => this.onImgLoad(),
  42. 'render_styling': !this.model.get('is_unstyled') && api.settings.get('allow_message_styling'),
  43. 'show_me_message': true,
  44. }
  45. if (this.hide_url_previews === "false") {
  46. options.embed_audio = true;
  47. options.embed_videos = true;
  48. options.show_images = true;
  49. } else if (this.hide_url_previews === "true") {
  50. options.embed_audio = false;
  51. options.embed_videos = false;
  52. options.show_images = false;
  53. }
  54. return renderRichText(this.text, offset, options, callback);
  55. }
  56. }
  57. api.elements.define('converse-chat-message-body', MessageBody);