mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
179 lines (150 loc) • 5.56 kB
text/typescript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {ThreadTypes, PostTypes, UserTypes} from 'action_types';
import {Client4} from 'client';
import ThreadConstants from 'constants/threads';
import {DispatchFunc, GetStateFunc} from 'types/actions';
import {UserThreadList} from 'types/threads';
import {logError} from './errors';
import {forceLogoutIfNecessary} from './helpers';
export function getThreads(userId: string, teamId: string, {before = '', after = '', perPage = ThreadConstants.THREADS_CHUNK_SIZE, unread = false} = {}) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
let userThreadList: undefined | UserThreadList;
try {
userThreadList = await Client4.getUserThreads(userId, teamId, {before, after, pageSize: perPage, extended: true, unread});
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(logError(error));
return {error};
}
if (userThreadList?.threads?.length) {
dispatch({
type: UserTypes.RECEIVED_PROFILES_LIST,
data: userThreadList.threads.map(({participants: users}) => users).flat(),
});
dispatch({
type: PostTypes.RECEIVED_POSTS,
data: {posts: userThreadList.threads.map(({post}) => post)},
});
}
dispatch({
type: ThreadTypes.RECEIVED_THREADS,
data: {
...userThreadList,
threads: userThreadList?.threads?.map((thread) => ({...thread, is_following: true})) ?? [],
team_id: teamId,
},
});
return {data: userThreadList};
};
}
export function getThreadMentionCountsByChannel(teamId: string) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
let result: Record<string, number>;
try {
const {currentUserId} = getState().entities.users;
result = await Client4.getThreadMentionCountsByChannel(currentUserId, teamId);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(logError(error));
return {error};
}
dispatch({
type: ThreadTypes.RECEIVED_PER_CHANNEL_MENTION_COUNTS,
data: {
counts: result,
team_id: teamId,
},
});
return {data: result};
};
}
export function getThread(userId: string, teamId: string, threadId: string, extended = false) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
let thread;
try {
thread = await Client4.getUserThread(userId, teamId, threadId, extended);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(logError(error));
return {error};
}
if (thread) {
thread = {...thread, is_following: true};
dispatch({
type: UserTypes.RECEIVED_PROFILES_LIST,
data: thread.participants,
});
dispatch({
type: PostTypes.RECEIVED_POSTS,
data: {posts: [thread.post]},
});
dispatch({
type: ThreadTypes.RECEIVED_THREAD,
data: {
thread,
team_id: teamId,
},
});
}
return {data: thread};
};
}
export function markAllThreadsInTeamRead(userId: string, teamId: string) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
try {
await Client4.updateThreadsReadForUser(userId, teamId);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(logError(error));
return {error};
}
dispatch({
type: ThreadTypes.ALL_TEAM_THREADS_READ,
data: {
team_id: teamId,
},
});
return {};
};
}
export function updateThreadRead(userId: string, teamId: string, threadId: string, timestamp: number) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
try {
await Client4.updateThreadReadForUser(userId, teamId, threadId, timestamp);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(logError(error));
return {error};
}
dispatch({
type: ThreadTypes.READ_CHANGED_THREAD,
data: {
id: threadId,
team_id: teamId,
timestamp,
},
});
return {};
};
}
export function setThreadFollow(userId: string, teamId: string, threadId: string, newState: boolean) {
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
dispatch({
type: ThreadTypes.FOLLOW_CHANGED_THREAD,
data: {
id: threadId,
team_id: teamId,
following: newState,
},
});
try {
await Client4.updateThreadFollowForUser(userId, teamId, threadId, newState);
} catch (error) {
forceLogoutIfNecessary(error, dispatch, getState);
dispatch(logError(error));
return {error};
}
return {};
};
}