fix: multiple bug fixes
isolated users, db backup, weird disconnect issues for long voice sessions,
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import { type Message } from '../../../../shared-kernel';
|
||||
import { groupMessagesByRoom } from './notifications.effects';
|
||||
|
||||
function createMessage(overrides: Partial<Message> = {}): Message {
|
||||
return {
|
||||
id: 'message-1',
|
||||
roomId: 'room-1',
|
||||
senderId: 'user-1',
|
||||
senderName: 'User 1',
|
||||
content: 'hello',
|
||||
timestamp: 1,
|
||||
reactions: [],
|
||||
isDeleted: false,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
describe('groupMessagesByRoom', () => {
|
||||
it('groups sync batches by room id', () => {
|
||||
const grouped = groupMessagesByRoom([
|
||||
createMessage({ id: 'a1', roomId: 'room-a' }),
|
||||
createMessage({ id: 'b1', roomId: 'room-b' }),
|
||||
createMessage({ id: 'a2', roomId: 'room-a' })
|
||||
]);
|
||||
|
||||
expect(Array.from(grouped.keys())).toEqual(['room-a', 'room-b']);
|
||||
expect(grouped.get('room-a')?.map((message) => message.id)).toEqual(['a1', 'a2']);
|
||||
expect(grouped.get('room-b')?.map((message) => message.id)).toEqual(['b1']);
|
||||
});
|
||||
|
||||
it('returns empty map for empty sync batch', () => {
|
||||
expect(groupMessagesByRoom([]).size).toBe(0);
|
||||
});
|
||||
});
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
tap,
|
||||
withLatestFrom
|
||||
} from 'rxjs/operators';
|
||||
import type { Message } from '../../../../shared-kernel';
|
||||
import { MessagesActions } from '../../../../store/messages/messages.actions';
|
||||
import { RoomsActions } from '../../../../store/rooms/rooms.actions';
|
||||
import { selectCurrentRoom, selectSavedRooms } from '../../../../store/rooms/rooms.selectors';
|
||||
@@ -18,6 +19,23 @@ import { UsersActions } from '../../../../store/users/users.actions';
|
||||
import { selectCurrentUser } from '../../../../store/users/users.selectors';
|
||||
import { NotificationsFacade } from '../facades/notifications.facade';
|
||||
|
||||
export function groupMessagesByRoom(messages: Message[]): Map<string, Message[]> {
|
||||
const messagesByRoom = new Map<string, Message[]>();
|
||||
|
||||
for (const message of messages) {
|
||||
const roomMessages = messagesByRoom.get(message.roomId);
|
||||
|
||||
if (roomMessages) {
|
||||
roomMessages.push(message);
|
||||
continue;
|
||||
}
|
||||
|
||||
messagesByRoom.set(message.roomId, [message]);
|
||||
}
|
||||
|
||||
return messagesByRoom;
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class NotificationsEffects {
|
||||
private readonly actions$ = inject(Actions);
|
||||
@@ -92,10 +110,10 @@ export class NotificationsEffects {
|
||||
{ dispatch: false }
|
||||
);
|
||||
|
||||
refreshCurrentRoomUnread$ = createEffect(
|
||||
refreshViewedRoomUnread$ = createEffect(
|
||||
() =>
|
||||
this.actions$.pipe(
|
||||
ofType(MessagesActions.loadMessagesSuccess, MessagesActions.syncMessages),
|
||||
ofType(MessagesActions.loadMessagesSuccess),
|
||||
withLatestFrom(this.store.select(selectCurrentRoom)),
|
||||
tap(([{ messages }, room]) => {
|
||||
if (room) {
|
||||
@@ -105,4 +123,17 @@ export class NotificationsEffects {
|
||||
),
|
||||
{ dispatch: false }
|
||||
);
|
||||
|
||||
refreshSyncedRoomUnread$ = createEffect(
|
||||
() =>
|
||||
this.actions$.pipe(
|
||||
ofType(MessagesActions.syncMessages),
|
||||
tap(({ messages }) => {
|
||||
for (const [roomId, roomMessages] of groupMessagesByRoom(messages)) {
|
||||
this.notifications.refreshRoomUnreadFromMessages(roomId, roomMessages);
|
||||
}
|
||||
})
|
||||
)
|
||||
, { dispatch: false }
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user