* Fetch posts for unread channels on loadChannelsForTeam * Add unit tests * Remove unneeded setRetryFailed and getState * Update getChannelSinceValue comment * Move to post.js and pass in channels and channelMembers * Exclude current channel * Address PR review comments * Fix import * Fix mm-redux references
250 lines
7.2 KiB
TypeScript
250 lines
7.2 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
import {Client4} from '@mm-redux/client';
|
|
import {EmojiTypes} from '@mm-redux/action_types';
|
|
import {General, Emoji} from '../constants';
|
|
import {getProfilesByIds} from './users';
|
|
import {getCustomEmojisByName as selectCustomEmojisByName} from '@mm-redux/selectors/entities/emojis';
|
|
import {parseNeededCustomEmojisFromText} from '@mm-redux/utils/emoji_utils';
|
|
|
|
import {GetStateFunc, DispatchFunc, ActionFunc, ActionResult} from '@mm-redux/types/actions';
|
|
|
|
import {logError} from './errors';
|
|
import {bindClientFunc, forceLogoutIfNecessary} from './helpers';
|
|
import {SystemEmoji, CustomEmoji} from '@mm-redux/types/emojis';
|
|
import {Dictionary} from '@mm-redux/types/utilities';
|
|
export let systemEmojis: Map<string, SystemEmoji> = new Map();
|
|
export function setSystemEmojis(emojis: Map<string, SystemEmoji>) {
|
|
systemEmojis = emojis;
|
|
}
|
|
|
|
export function createCustomEmoji(emoji: any, image: any): ActionFunc {
|
|
return bindClientFunc({
|
|
clientFunc: Client4.createCustomEmoji,
|
|
onSuccess: EmojiTypes.RECEIVED_CUSTOM_EMOJI,
|
|
params: [
|
|
emoji,
|
|
image,
|
|
],
|
|
});
|
|
}
|
|
|
|
export function getCustomEmoji(emojiId: string): ActionFunc {
|
|
return bindClientFunc({
|
|
clientFunc: Client4.getCustomEmoji,
|
|
onSuccess: EmojiTypes.RECEIVED_CUSTOM_EMOJI,
|
|
params: [
|
|
emojiId,
|
|
],
|
|
});
|
|
}
|
|
|
|
export function getCustomEmojiByName(name: string): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
let data;
|
|
|
|
try {
|
|
data = await Client4.getCustomEmojiByName(name);
|
|
} catch (error) {
|
|
forceLogoutIfNecessary(error, dispatch, getState);
|
|
|
|
if (error.status_code === 404) {
|
|
dispatch({type: EmojiTypes.CUSTOM_EMOJI_DOES_NOT_EXIST, data: name});
|
|
} else {
|
|
dispatch(logError(error));
|
|
}
|
|
|
|
return {error};
|
|
}
|
|
|
|
dispatch({
|
|
type: EmojiTypes.RECEIVED_CUSTOM_EMOJI,
|
|
data,
|
|
});
|
|
|
|
return {data};
|
|
};
|
|
}
|
|
|
|
export function getCustomEmojisByName(names: Array<string>): ActionFunc {
|
|
return async (dispatch: DispatchFunc) => {
|
|
if (!names || names.length === 0) {
|
|
return {data: true};
|
|
}
|
|
|
|
const promises: Promise<ActionResult|ActionResult[]>[] = [];
|
|
names.forEach((name) => promises.push(dispatch(getCustomEmojiByName(name))));
|
|
|
|
await Promise.all(promises);
|
|
return {data: true};
|
|
};
|
|
}
|
|
|
|
export function getCustomEmojisInText(text: string): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
if (!text) {
|
|
return {data: true};
|
|
}
|
|
|
|
const state = getState();
|
|
const nonExistentEmoji = state.entities.emojis.nonExistentEmoji;
|
|
const customEmojisByName = selectCustomEmojisByName(state);
|
|
|
|
const emojisToLoad = parseNeededCustomEmojisFromText(text, systemEmojis, customEmojisByName, nonExistentEmoji);
|
|
|
|
return getCustomEmojisByName(Array.from(emojisToLoad))(dispatch, getState);
|
|
};
|
|
}
|
|
|
|
export function getCustomEmojis(
|
|
page = 0,
|
|
perPage: number = General.PAGE_SIZE_DEFAULT,
|
|
sort: string = Emoji.SORT_BY_NAME,
|
|
loadUsers = false,
|
|
): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
let data;
|
|
try {
|
|
data = await Client4.getCustomEmojis(page, perPage, sort);
|
|
} catch (error) {
|
|
forceLogoutIfNecessary(error, dispatch, getState);
|
|
|
|
dispatch(logError(error));
|
|
return {error};
|
|
}
|
|
|
|
if (loadUsers) {
|
|
dispatch(loadProfilesForCustomEmojis(data));
|
|
}
|
|
|
|
dispatch({
|
|
type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,
|
|
data,
|
|
});
|
|
|
|
return {data};
|
|
};
|
|
}
|
|
|
|
export function loadProfilesForCustomEmojis(emojis: Array<CustomEmoji>): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
const usersToLoad: Dictionary<boolean> = {};
|
|
emojis.forEach((emoji: CustomEmoji) => {
|
|
if (!getState().entities.users.profiles[emoji.creator_id]) {
|
|
usersToLoad[emoji.creator_id] = true;
|
|
}
|
|
});
|
|
|
|
const userIds = Object.keys(usersToLoad);
|
|
|
|
if (userIds.length > 0) {
|
|
await dispatch(getProfilesByIds(userIds));
|
|
}
|
|
|
|
return {data: true};
|
|
};
|
|
}
|
|
|
|
export function getAllCustomEmojis(perPage: number = General.PAGE_SIZE_MAXIMUM): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
dispatch({
|
|
type: EmojiTypes.CLEAR_CUSTOM_EMOJIS,
|
|
data: null,
|
|
});
|
|
|
|
let hasMore = true;
|
|
let page = 0;
|
|
const allEmojis = [];
|
|
|
|
do {
|
|
try {
|
|
let emojis = [];
|
|
emojis = await Client4.getCustomEmojis(page, perPage, Emoji.SORT_BY_NAME); // eslint-disable-line no-await-in-loop
|
|
if (emojis.length < perPage) {
|
|
hasMore = false;
|
|
} else {
|
|
page += 1;
|
|
}
|
|
allEmojis.push(...emojis);
|
|
} catch (error) {
|
|
forceLogoutIfNecessary(error, dispatch, getState);
|
|
|
|
dispatch(logError(error));
|
|
return {error: true};
|
|
}
|
|
} while (hasMore);
|
|
|
|
dispatch({
|
|
type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,
|
|
data: allEmojis,
|
|
});
|
|
|
|
return {data: true};
|
|
};
|
|
}
|
|
|
|
export function deleteCustomEmoji(emojiId: string): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
try {
|
|
await Client4.deleteCustomEmoji(emojiId);
|
|
} catch (error) {
|
|
forceLogoutIfNecessary(error, dispatch, getState);
|
|
|
|
dispatch(logError(error));
|
|
return {error};
|
|
}
|
|
|
|
dispatch({
|
|
type: EmojiTypes.DELETED_CUSTOM_EMOJI,
|
|
data: {id: emojiId},
|
|
});
|
|
|
|
return {data: true};
|
|
};
|
|
}
|
|
|
|
export function searchCustomEmojis(term: string, options: any = {}, loadUsers = false): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
let data;
|
|
try {
|
|
data = await Client4.searchCustomEmoji(term, options);
|
|
} catch (error) {
|
|
forceLogoutIfNecessary(error, dispatch, getState);
|
|
|
|
dispatch(logError(error));
|
|
return {error};
|
|
}
|
|
|
|
if (loadUsers) {
|
|
dispatch(loadProfilesForCustomEmojis(data));
|
|
}
|
|
|
|
dispatch({
|
|
type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,
|
|
data,
|
|
});
|
|
|
|
return {data};
|
|
};
|
|
}
|
|
|
|
export function autocompleteCustomEmojis(name: string): ActionFunc {
|
|
return async (dispatch: DispatchFunc, getState: GetStateFunc) => {
|
|
let data;
|
|
try {
|
|
data = await Client4.autocompleteCustomEmoji(name);
|
|
} catch (error) {
|
|
forceLogoutIfNecessary(error, dispatch, getState);
|
|
|
|
dispatch(logError(error));
|
|
return {error};
|
|
}
|
|
|
|
dispatch({
|
|
type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,
|
|
data,
|
|
});
|
|
|
|
return {data};
|
|
};
|
|
}
|