UNPKG

mattermost-redux

Version:

Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client

88 lines (74 loc) 2.65 kB
// 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); }