Files
Toju/src/app/store/messages/messages.selectors.ts
2026-03-02 00:13:34 +01:00

72 lines
2.2 KiB
TypeScript

import { createFeatureSelector, createSelector } from '@ngrx/store';
import { MessagesState, messagesAdapter } from './messages.reducer';
export const selectMessagesState = createFeatureSelector<MessagesState>('messages');
const { selectIds, selectEntities, selectAll, selectTotal } = messagesAdapter.getSelectors();
export const selectAllMessages = createSelector(selectMessagesState, selectAll);
export const selectMessagesEntities = createSelector(selectMessagesState, selectEntities);
export const selectMessagesIds = createSelector(selectMessagesState, selectIds);
export const selectMessagesTotal = createSelector(selectMessagesState, selectTotal);
export const selectMessagesLoading = createSelector(
selectMessagesState,
(state) => state.loading
);
export const selectMessagesError = createSelector(
selectMessagesState,
(state) => state.error
);
export const selectMessagesSyncing = createSelector(
selectMessagesState,
(state) => state.syncing
);
export const selectCurrentRoomId = createSelector(
selectMessagesState,
(state) => state.currentRoomId
);
export const selectCurrentRoomMessages = createSelector(
selectAllMessages,
selectCurrentRoomId,
(messages, roomId) => roomId ? messages.filter((m) => m.roomId === roomId) : []
);
/** Select messages for the currently active text channel */
export const selectChannelMessages = (channelId: string) =>
createSelector(
selectAllMessages,
selectCurrentRoomId,
(messages, roomId) => {
if (!roomId) return [];
return messages.filter(
(m) => m.roomId === roomId && (m.channelId || 'general') === channelId
);
}
);
export const selectMessageById = (id: string) =>
createSelector(selectMessagesEntities, (entities) => entities[id]);
export const selectMessagesByRoomId = (roomId: string) =>
createSelector(selectAllMessages, (messages) =>
messages.filter((m) => m.roomId === roomId)
);
export const selectRecentMessages = (limit: number) =>
createSelector(selectAllMessages, (messages) =>
messages.slice(-limit)
);
export const selectMessagesWithReactions = createSelector(
selectAllMessages,
(messages) => messages.filter((m) => m.reactions.length > 0)
);