You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
import { MessageCollection } from '../models/message';
 | 
						|
 | 
						|
import { Data } from '../data/data';
 | 
						|
import { getConversationController } from '../session/conversations';
 | 
						|
 | 
						|
async function getTargetMessage(reader: string, messages: MessageCollection) {
 | 
						|
  if (messages.length === 0) {
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
  const message = messages.find(msg => msg.isOutgoing() && reader === msg.get('conversationId'));
 | 
						|
  if (message) {
 | 
						|
    return message;
 | 
						|
  }
 | 
						|
 | 
						|
  // we do not support read messages for groups
 | 
						|
  return null;
 | 
						|
}
 | 
						|
 | 
						|
async function onReadReceipt(receipt: { source: string; timestamp: number; readAt: number }) {
 | 
						|
  try {
 | 
						|
    const messages = await Data.getMessagesBySentAt(receipt.timestamp);
 | 
						|
 | 
						|
    const message = await getTargetMessage(receipt.source, messages);
 | 
						|
 | 
						|
    if (!message) {
 | 
						|
      window.log.info('No message for read receipt', receipt.source, receipt.timestamp);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    const convoId = message.get('conversationId'); // this might be a group and we don't want to handle them
 | 
						|
    if (
 | 
						|
      !convoId ||
 | 
						|
      !getConversationController().get(convoId) ||
 | 
						|
      !getConversationController().get(convoId).isPrivate()
 | 
						|
    ) {
 | 
						|
      window.log.info(
 | 
						|
        'Convo is undefined or not a private chat for read receipt in convo',
 | 
						|
        convoId
 | 
						|
      );
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // readBy is only used for private conversations
 | 
						|
    // we do not care of who read it. If the length is > 0 , it is read and false otherwise
 | 
						|
    let readBy = message.get('read_by') || [];
 | 
						|
 | 
						|
    if (!readBy.length) {
 | 
						|
      readBy.push(receipt.source);
 | 
						|
    }
 | 
						|
    if (readBy.length > 1) {
 | 
						|
      readBy = readBy.slice(0, 1);
 | 
						|
    }
 | 
						|
 | 
						|
    message.set({
 | 
						|
      read_by: readBy,
 | 
						|
      sent: true,
 | 
						|
    });
 | 
						|
 | 
						|
    await message.commit();
 | 
						|
 | 
						|
    // notify frontend listeners
 | 
						|
    const conversation = getConversationController().get(message.get('conversationId'));
 | 
						|
    if (conversation) {
 | 
						|
      conversation.updateLastMessage();
 | 
						|
    }
 | 
						|
  } catch (error) {
 | 
						|
    window.log.error('ReadReceipts.onReceipt error:', error && error.stack ? error.stack : error);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export const ReadReceipts = { onReadReceipt };
 |