Home Reference Source Test

src/services/messageService.js

//import showdown from 'showdown'

// Using matrixService from ditto in the meanwhile
import matrix from '../services/matrixService'

import Message from '../models/Message'

const debug = require('debug')('ditto:scenes:chat:message:messageService')
//const mdConverter = new showdown.Converter()

class MessageService {
  constructor () {
    this._messages = {}
  }

  //* *******************************************************************************
  // Data
  //* *******************************************************************************
  cleanupRoomMessages (roomId, messageList) {
    if (!this._messages[roomId]) return

    for (const eventId of Object.keys(this._messages[roomId])) {
      if (!messageList.includes(eventId)) delete this._messages[roomId][eventId]
    }
  }

  getMessageById (eventId, roomId, event, pending = false) {
    if (!this._messages[roomId]) this._messages[roomId] = {}
    if (!this._messages[roomId][eventId]) {
      if (eventId) {
        this._messages[roomId][eventId] = new Message(eventId, roomId, event, pending)
      }
    }
    return this._messages[roomId][eventId]
  }

  getMessageByRelationId (eventId, roomId) {
    if (!this._messages[roomId]) return

    for (const message of Object.values(this._messages[roomId])) {
      // Look in reactions
      const reactions = message.reactions$.getValue()
      if (reactions) {
        for (const userEvents of Object.values(reactions)) {
          const reaction = Object.values(userEvents)
            .find(event => event.eventId === eventId)
          if (reaction) return message
        }
      }
    }
  }

  // This is called the first time to get the last message from the database
  getLastTextMessage(chatId) {
    try{
      let text_messages = []
      Object.values(this._messages[chatId]).forEach(msg => {
        if(msg.type === 'm.text')
        text_messages.push(msg)
      })
      return text_messages[0].content$.getValue().text
    } catch(e) {
      return ""
    }
  }

  subscribe (target) {
    this._subscription = target
  }

  updateMessage (eventId, roomId) {
    if (!this._messages[roomId] || !this._messages[roomId][eventId]) return

    this._messages[roomId][eventId].update()
  }

  updateRoomMessages (roomId) {
    if (!this._messages[roomId]) return

    for (const message of Object.values(this._messages[roomId])) {
      message.update()
    }
  }

  //* *******************************************************************************
  // Helpers
  //* *******************************************************************************

  async send (content, type, roomId) { // TODO: Cambiar esto por algo más simple (el type ya viene incluído en content)
    try {
      switch (type) {
        // case 'm.text': {
        //   // NOTE: Showdown is not currently working
        //   const html = content//mdConverter.makeHtml(content)
        //   // If the message doesn't have markdown, don't send the html
        //   if (html !== '<p>' + content + '</p>') {
        //     return matrix.getClient().sendHtmlMessage(roomId, content, html)
        //   } else {
        //     return matrix.getClient().sendTextMessage(roomId, content)
        //   }
        // }
        // case 'm.image': {
        //   return matrix.getClient().sendImageMessage(
        //     roomId,
        //     content.url,
        //     {
        //       w: content.width,
        //       h: content.height,
        //       mimetype: content.type,
        //       size: content.fileSize
        //     },
        //     content.fileName
        //   )
        // }
        // case 'm.file':
        // case 'm.poll':
        // case 'm.sticker':
        // case 'm.audio':
        // case 'm.video':
        // case 'm.location.live':
        // case 'm.location':
        // case 'm.emphasis':
        //? case 'm.reply':
        //? case 'mreaction':
        // case 'm.meetme':
        // case 'm.gif':
        // case 'm.event':
        default:
          return matrix.getClient().sendMessage(roomId, content)
      }
    } catch (e) {
      // console.log('Error sending message:', { roomId, type, content }, e)
      return e
    }
  }

  sortByLastSent (messages) {
    const sorted = [...messages]
    sorted.sort((a, b) => {
      return a.timestamp < b.timestamp ? 1 : a.timestamp > b.timestamp ? -1 : 0
    })
    return sorted
  }
}

const messageService = new MessageService()
export default messageService