54 lines
1.7 KiB
TypeScript
54 lines
1.7 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 selectCurrentRoomId = createSelector(
|
|
selectMessagesState,
|
|
(state) => state.currentRoomId
|
|
);
|
|
|
|
export const selectCurrentRoomMessages = createSelector(
|
|
selectAllMessages,
|
|
selectCurrentRoomId,
|
|
(messages, roomId) => roomId ? messages.filter((m) => m.roomId === roomId) : []
|
|
);
|
|
|
|
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)
|
|
);
|