mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
88 lines (74 loc) • 2.65 kB
text/typescript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {createSelector} from 'reselect';
import {getCurrentTeamId} from 'selectors/entities/teams';
import {GlobalState} from 'types/store';
import {Team} from 'types/teams';
import {UserThread, ThreadsState} from 'types/threads';
import {$ID, RelationOneToMany} from 'types/utilities';
export function getThreadsInTeam(state: GlobalState): RelationOneToMany<Team, UserThread> {
return state.entities.threads.threadsInTeam;
}
export const getThreadsInCurrentTeam: (state: GlobalState) => Array<$ID<UserThread>> = createSelector(
getCurrentTeamId,
getThreadsInTeam,
(
currentTeamId,
threadsInTeam,
) => {
return threadsInTeam?.[currentTeamId] ?? [];
},
);
export function getThreadCounts(state: GlobalState): ThreadsState['counts'] {
return state.entities.threads.counts;
}
export function getTeamThreadCounts(state: GlobalState, teamId: $ID<Team>): ThreadsState['counts'][$ID<Team>] {
return getThreadCounts(state)[teamId];
}
export const getThreadCountsInCurrentTeam: (state: GlobalState) => ThreadsState['counts'][$ID<Team>] = createSelector(
getCurrentTeamId,
getThreadCounts,
(
currentTeamId,
counts,
) => {
return counts?.[currentTeamId];
},
);
export function getThreads(state: GlobalState) {
return state.entities.threads.threads;
}
export function getThread(state: GlobalState, threadId: $ID<UserThread> | undefined): UserThread | null {
if (!threadId || !getThreadsInCurrentTeam(state)?.includes(threadId)) {
return null;
}
return getThreads(state)[threadId];
}
export const getThreadOrderInCurrentTeam: (state: GlobalState) => Array<$ID<UserThread>> = createSelector(
getThreadsInCurrentTeam,
getThreads,
(
threadsInTeam,
threads,
) => {
const ids = [...threadsInTeam];
return sortByLastReply(ids, threads);
},
);
export const getUnreadThreadOrderInCurrentTeam: (state: GlobalState) => Array<$ID<UserThread>> = createSelector(
getThreadsInCurrentTeam,
getThreads,
(
threadsInTeam,
threads,
) => {
const ids = threadsInTeam.filter((id) => {
const thread = threads[id];
return thread.unread_mentions || thread.unread_replies;
});
return sortByLastReply(ids, threads);
},
);
function sortByLastReply(ids: Array<$ID<UserThread>>, threads: ReturnType<typeof getThreads>) {
return ids.sort((a, b) => threads[b].last_reply_at - threads[a].last_reply_at);
}