message-history.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { html } from 'lit';
  2. import { repeat } from 'lit/directives/repeat.js';
  3. import { until } from 'lit/directives/until.js';
  4. import { api } from "@converse/headless";
  5. import { CustomElement } from 'shared/components/element.js';
  6. import { getDayIndicator } from './utils.js';
  7. import "./message";
  8. export default class MessageHistory extends CustomElement {
  9. /**
  10. * @typedef {import('@converse/headless/types/plugins/chat/message').default} Message
  11. */
  12. constructor () {
  13. super();
  14. this.model = null;
  15. this.messages = [];
  16. }
  17. static get properties () {
  18. return {
  19. model: { type: Object },
  20. messages: { type: Array }
  21. }
  22. }
  23. render () {
  24. const msgs = this.messages;
  25. if (msgs.length) {
  26. return repeat(msgs, m => m.get('id'), m => html`${this.renderMessage(m)}`)
  27. } else {
  28. return '';
  29. }
  30. }
  31. /**
  32. * @param {(Message)} model
  33. */
  34. renderMessage (model) {
  35. if (model.get('dangling_retraction') || model.get('dangling_moderation') || model.get('is_only_key')) {
  36. return '';
  37. }
  38. const template_hook = model.get('template_hook')
  39. if (typeof template_hook === 'string') {
  40. const template_promise = api.hook(template_hook, model, '');
  41. return until(template_promise, '');
  42. } else {
  43. const template = html`<converse-chat-message
  44. .model_with_messages=${this.model}
  45. .model=${model}></converse-chat-message>`
  46. const day = getDayIndicator(model);
  47. return day ? [day, template] : template;
  48. }
  49. }
  50. }
  51. api.elements.define('converse-message-history', MessageHistory);