import { createFeatureSelector, createSelector } from '@ngrx/store'; import { MessagesState, messagesAdapter } from './messages.reducer'; export const selectMessagesState = createFeatureSelector('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) );