feat(messenger): SENT/READ status on thread chats + mark-read helper

This commit is contained in:
simoleo89
2026-06-02 20:16:08 +02:00
parent f9c65000bd
commit f5e179f6c9
4 changed files with 65 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
import { describe, expect, it } from 'vitest';
import { MessengerFriend } from './MessengerFriend';
import { MessengerThread } from './MessengerThread';
import { MessengerThreadChat } from './MessengerThreadChat';
const makeThread = (participantId: number): MessengerThread =>
{
const friend = new MessengerFriend();
friend.id = participantId;
return new MessengerThread(friend);
};
describe('MessengerThread.setMessagesReadFromUser', () =>
{
it('marks only the given user\'s messages as READ', () =>
{
const thread = makeThread(7);
const mine = thread.addMessage(100, 'a', 0, null, MessengerThreadChat.CHAT);
const theirs = thread.addMessage(7, 'b', 0, null, MessengerThreadChat.CHAT);
thread.setMessagesReadFromUser(100);
expect(mine.status).toBe(MessengerThreadChat.READ);
expect(theirs.status).toBe(MessengerThreadChat.SENT);
});
});
+10
View File
@@ -99,6 +99,16 @@ export class MessengerThread
this._unreadCount = 0;
}
public setMessagesReadFromUser(userId: number): void
{
for(const group of this._groups)
{
if(group.userId !== userId) continue;
for(const chat of group.chats) chat.setStatus(MessengerThreadChat.READ);
}
}
public get threadId(): number
{
return this._threadId;
@@ -27,3 +27,19 @@ describe('MessengerThreadChat.offlineDelivered', () =>
expect(chat.offlineDelivered).toBe(false);
});
});
describe('MessengerThreadChat status', () =>
{
it('defaults to SENT', () =>
{
const chat = new MessengerThreadChat(5, 'hi', 0, null, MessengerThreadChat.CHAT);
expect(chat.status).toBe(MessengerThreadChat.SENT);
});
it('can be set to READ', () =>
{
const chat = new MessengerThreadChat(5, 'hi', 0, null, MessengerThreadChat.CHAT);
chat.setStatus(MessengerThreadChat.READ);
expect(chat.status).toBe(MessengerThreadChat.READ);
});
});
+13
View File
@@ -4,10 +4,13 @@ export class MessengerThreadChat
public static ROOM_INVITE: number = 1;
public static STATUS_NOTIFICATION: number = 2;
public static SECURITY_NOTIFICATION: number = 3;
public static SENT: number = 0;
public static READ: number = 1;
private static CHAT_ID: number = 0;
private _id: number;
private _type: number;
private _status: number = MessengerThreadChat.SENT;
private _senderId: number;
private _message: string;
private _secondsSinceSent: number;
@@ -79,6 +82,16 @@ export class MessengerThreadChat
return (this._type === MessengerThreadChat.CHAT) && (this._extraData === 'offline');
}
public get status(): number
{
return this._status;
}
public setStatus(status: number): void
{
this._status = status;
}
public get date(): Date
{
return this._date;