diff --git a/src/api/friends/MessengerThread.test.ts b/src/api/friends/MessengerThread.test.ts new file mode 100644 index 0000000..1045c50 --- /dev/null +++ b/src/api/friends/MessengerThread.test.ts @@ -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); + }); +}); diff --git a/src/api/friends/MessengerThread.ts b/src/api/friends/MessengerThread.ts index a8cdb3c..d64ecdb 100644 --- a/src/api/friends/MessengerThread.ts +++ b/src/api/friends/MessengerThread.ts @@ -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; diff --git a/src/api/friends/MessengerThreadChat.test.ts b/src/api/friends/MessengerThreadChat.test.ts index 53320c4..1a31e0d 100644 --- a/src/api/friends/MessengerThreadChat.test.ts +++ b/src/api/friends/MessengerThreadChat.test.ts @@ -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); + }); +}); diff --git a/src/api/friends/MessengerThreadChat.ts b/src/api/friends/MessengerThreadChat.ts index c58b366..cbf5c9a 100644 --- a/src/api/friends/MessengerThreadChat.ts +++ b/src/api/friends/MessengerThreadChat.ts @@ -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;