{"version":3,"file":"1072.150c7307f540483e0d8b.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/components/async_load.tsx","webpack://mattermost-webapp/./src/components/threading/channel_threads/posts_channel_reset_watcher/posts_channel_reset_watcher.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/channel_categories.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/channels.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/emojis.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/errors.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/general.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/helpers.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/limits.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/preferences.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/teams.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/threads.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/users.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/client/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/emojis.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/groups.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/utils/emoji_utils.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/utils/event_emitter.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/utils/group_utils.ts","webpack://mattermost-webapp/./src/utils/browser_history.tsx","webpack://mattermost-webapp/./src/utils/desktop_api.ts","webpack://mattermost-webapp/./src/utils/server_version.tsx","webpack://mattermost-webapp/./src/utils/user_agent.tsx","webpack://mattermost-webapp/../platform/types/lib/client4.js"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {type ComponentType} from 'react';\n\nexport function makeAsyncComponent(displayName: string, LazyComponent: React.ComponentType, fallback: React.ReactNode = null) {\n const Component: ComponentType = (props) => (\n \n \n \n );\n Component.displayName = displayName;\n return Component;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useRef} from 'react';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {resetReloadPostsInChannel} from 'mattermost-redux/actions/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nconst PostsChannelResetWatcher = () => {\n const dispatch = useDispatch();\n const isCRTEnabled = useSelector(isCollapsedThreadsEnabled);\n const loaded = useRef(false);\n useEffect(() => {\n if (loaded.current) {\n dispatch(resetReloadPostsInChannel());\n } else {\n loaded.current = true;\n }\n }, [isCRTEnabled]);\n return null;\n};\n\nexport default PostsChannelResetWatcher;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {OrderedChannelCategories, ChannelCategory} from '@mattermost/types/channel_categories';\nimport {CategorySorting} from '@mattermost/types/channel_categories';\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {ChannelCategoryTypes, ChannelTypes} from 'mattermost-redux/action_types';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {Client4} from 'mattermost-redux/client';\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {\n getAllCategoriesByIds,\n getCategory,\n getCategoryIdsForTeam,\n getCategoryInTeamByType,\n getCategoryInTeamWithChannel,\n} from 'mattermost-redux/selectors/entities/channel_categories';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {\n ActionFunc,\n DispatchFunc,\n GetStateFunc,\n NewActionFuncOldVariantDoNotUse,\n} from 'mattermost-redux/types/actions';\nimport {insertMultipleWithoutDuplicates, insertWithoutDuplicates, removeItem} from 'mattermost-redux/utils/array_utils';\n\nimport {General} from '../constants';\n\nexport function expandCategory(categoryId: string) {\n return setCategoryCollapsed(categoryId, false);\n}\n\nexport function collapseCategory(categoryId: string) {\n return setCategoryCollapsed(categoryId, true);\n}\n\nexport function setCategoryCollapsed(categoryId: string, collapsed: boolean) {\n return patchCategory(categoryId, {\n collapsed,\n });\n}\n\nexport function setCategorySorting(categoryId: string, sorting: CategorySorting) {\n return patchCategory(categoryId, {\n sorting,\n });\n}\n\nexport function patchCategory(categoryId: string, patch: Partial): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n\n const category = getCategory(state, categoryId);\n const patchedCategory = {\n ...category,\n ...patch,\n };\n\n dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORY,\n data: patchedCategory,\n });\n\n try {\n await Client4.updateChannelCategory(currentUserId, category.team_id, patchedCategory);\n } catch (error) {\n dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORY,\n data: category,\n });\n\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return {data: patchedCategory};\n };\n}\n\nexport function setCategoryMuted(categoryId: string, muted: boolean) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const category = getCategory(state, categoryId);\n\n const result = await dispatch(updateCategory({\n ...category,\n muted,\n }));\n\n if ('error' in result) {\n return result;\n }\n\n const updated = result.data as ChannelCategory;\n\n return dispatch(batchActions([\n {\n type: ChannelCategoryTypes.RECEIVED_CATEGORY,\n data: updated,\n },\n ...(updated.channel_ids.map((channelId) => ({\n type: ChannelTypes.SET_CHANNEL_MUTED,\n data: {\n channelId,\n muted,\n },\n }))),\n ]));\n };\n}\n\nfunction updateCategory(category: ChannelCategory) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n\n let updatedCategory;\n try {\n updatedCategory = await Client4.updateChannelCategory(currentUserId, category.team_id, category);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n // The updated category will be added to the state after receiving the corresponding websocket event.\n\n return {data: updatedCategory};\n };\n}\n\nexport function fetchMyCategories(teamId: string, isWebSocket?: boolean): NewActionFuncOldVariantDoNotUse {\n return async (dispatch, getState) => {\n const currentUserId = getCurrentUserId(getState());\n\n let data: OrderedChannelCategories;\n try {\n data = await Client4.getChannelCategories(currentUserId, teamId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return dispatch(batchActions([\n {\n type: ChannelCategoryTypes.RECEIVED_CATEGORIES,\n data: data.categories,\n isWebSocket,\n },\n {\n type: ChannelCategoryTypes.RECEIVED_CATEGORY_ORDER,\n data: {\n teamId,\n order: data.order,\n },\n },\n ]));\n };\n}\n\n// addChannelToInitialCategory returns an action that can be dispatched to add a newly-joined or newly-created channel\n// to its either the Channels or Direct Messages category based on the type of channel. New DM and GM channels are\n// added to the Direct Messages category on each team.\n//\n// Unless setOnServer is true, this only affects the categories on this client. If it is set to true, this updates\n// categories on the server too.\nexport function addChannelToInitialCategory(channel: Channel, setOnServer = false): ActionFunc {\n return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const categories = Object.values(getAllCategoriesByIds(state));\n\n if (channel.type === General.DM_CHANNEL || channel.type === General.GM_CHANNEL) {\n const allDmCategories = categories.filter((category) => category.type === CategoryTypes.DIRECT_MESSAGES);\n\n // Get all the categories in which channel exists\n const channelInCategories = categories.filter((category) => {\n return category.channel_ids.findIndex((channelId) => channelId === channel.id) !== -1;\n });\n\n // Skip DM categories where channel already exists in a different category\n const dmCategories = allDmCategories.filter((dmCategory) => {\n return channelInCategories.findIndex((category) => dmCategory.team_id === category.team_id) === -1;\n });\n\n return dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORIES,\n data: dmCategories.map((category) => ({\n ...category,\n channel_ids: insertWithoutDuplicates(category.channel_ids, channel.id, 0),\n })),\n });\n }\n\n // Add the new channel to the Channels category on the channel's team\n if (categories.some((category) => category.channel_ids.some((channelId) => channelId === channel.id))) {\n return {data: false};\n }\n const channelsCategory = getCategoryInTeamByType(state, channel.team_id, CategoryTypes.CHANNELS);\n\n if (!channelsCategory) {\n // No categories were found for this team, so the categories for this team haven't been loaded yet.\n // The channel will have been added to the category by the server, so we'll get it once the categories\n // are actually loaded.\n return {data: false};\n }\n\n if (setOnServer) {\n return dispatch(addChannelToCategory(channelsCategory.id, channel.id));\n }\n\n return dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORY,\n data: {\n ...channelsCategory,\n channel_ids: insertWithoutDuplicates(channelsCategory.channel_ids, channel.id, 0),\n },\n });\n };\n}\n\n// addChannelToCategory returns an action that can be dispatched to add a channel to a given category without specifying\n// its order. The channel will be removed from its previous category (if any) on the given category's team and it will be\n// placed first in its new category.\nexport function addChannelToCategory(categoryId: string, channelId: string): ActionFunc {\n return moveChannelToCategory(categoryId, channelId, 0, false);\n}\n\n// moveChannelToCategory returns an action that moves a channel into a category and puts it at the given index at the\n// category. The channel will also be removed from its previous category (if any) on that category's team. The category's\n// order will also be set to manual by default.\nexport function moveChannelToCategory(categoryId: string, channelId: string, newIndex: number, setManualSorting = true) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const targetCategory = getCategory(state, categoryId);\n const currentUserId = getCurrentUserId(state);\n\n // The default sorting needs to behave like alphabetical sorting until the point that the user rearranges their\n // channels at which point, it becomes manual. Other than that, we never change the sorting method automatically.\n let sorting = targetCategory.sorting;\n if (setManualSorting &&\n targetCategory.type !== CategoryTypes.DIRECT_MESSAGES &&\n targetCategory.sorting === CategorySorting.Default) {\n sorting = CategorySorting.Manual;\n }\n\n // Add the channel to the new category\n const categories = [{\n ...targetCategory,\n sorting,\n channel_ids: insertWithoutDuplicates(targetCategory.channel_ids, channelId, newIndex),\n }];\n\n // And remove it from the old category\n const sourceCategory = getCategoryInTeamWithChannel(getState(), targetCategory.team_id, channelId);\n if (sourceCategory && sourceCategory.id !== targetCategory.id) {\n categories.push({\n ...sourceCategory,\n channel_ids: removeItem(sourceCategory.channel_ids, channelId),\n });\n }\n\n const result = dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORIES,\n data: categories,\n });\n\n try {\n await Client4.updateChannelCategories(currentUserId, targetCategory.team_id, categories);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n\n const originalCategories = [targetCategory];\n if (sourceCategory && sourceCategory.id !== targetCategory.id) {\n originalCategories.push(sourceCategory);\n }\n\n dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORIES,\n data: originalCategories,\n });\n return {error};\n }\n\n return result;\n };\n}\n\nexport function moveChannelsToCategory(categoryId: string, channelIds: string[], newIndex: number, setManualSorting = true) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const targetCategory = getCategory(state, categoryId);\n const currentUserId = getCurrentUserId(state);\n\n // The default sorting needs to behave like alphabetical sorting until the point that the user rearranges their\n // channels at which point, it becomes manual. Other than that, we never change the sorting method automatically.\n let sorting = targetCategory.sorting;\n if (setManualSorting &&\n targetCategory.type !== CategoryTypes.DIRECT_MESSAGES &&\n targetCategory.sorting === CategorySorting.Default) {\n sorting = CategorySorting.Manual;\n }\n\n // Add the channels to the new category\n let categories = {\n [targetCategory.id]: {\n ...targetCategory,\n sorting,\n channel_ids: insertMultipleWithoutDuplicates(targetCategory.channel_ids, channelIds, newIndex),\n },\n };\n\n // Needed if we have to revert categories and for checking for favourites\n let unmodifiedCategories = {[targetCategory.id]: targetCategory};\n let sourceCategories: Record = {};\n\n // And remove it from the old categories\n channelIds.forEach((channelId) => {\n const sourceCategory = getCategoryInTeamWithChannel(getState(), targetCategory.team_id, channelId);\n if (sourceCategory && sourceCategory.id !== targetCategory.id) {\n unmodifiedCategories = {\n ...unmodifiedCategories,\n [sourceCategory.id]: sourceCategory,\n };\n sourceCategories = {...sourceCategories, [channelId]: sourceCategory.id};\n categories = {\n ...categories,\n [sourceCategory.id]: {\n ...(categories[sourceCategory.id] || sourceCategory),\n channel_ids: removeItem((categories[sourceCategory.id] || sourceCategory).channel_ids, channelId),\n },\n };\n }\n });\n\n const categoriesArray = Object.values(categories).reduce((allCategories: ChannelCategory[], category) => {\n allCategories.push(category);\n return allCategories;\n }, []);\n\n const result = dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORIES,\n data: categoriesArray,\n });\n\n try {\n await Client4.updateChannelCategories(currentUserId, targetCategory.team_id, categoriesArray);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n\n const originalCategories = Object.values(unmodifiedCategories).reduce((allCategories: ChannelCategory[], category) => {\n allCategories.push(category);\n return allCategories;\n }, []);\n\n dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORIES,\n data: originalCategories,\n });\n return {error};\n }\n\n return result;\n };\n}\n\nexport function moveCategory(teamId: string, categoryId: string, newIndex: number) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const order = getCategoryIdsForTeam(state, teamId)!;\n const currentUserId = getCurrentUserId(state);\n\n const newOrder = insertWithoutDuplicates(order, categoryId, newIndex);\n\n // Optimistically update the category order\n const result = dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORY_ORDER,\n data: {\n teamId,\n order: newOrder,\n },\n });\n\n try {\n await Client4.updateChannelCategoryOrder(currentUserId, teamId, newOrder);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n\n // Restore original order\n dispatch({\n type: ChannelCategoryTypes.RECEIVED_CATEGORY_ORDER,\n data: {\n teamId,\n order,\n },\n });\n\n return {error};\n }\n\n return result;\n };\n}\n\nexport function receivedCategoryOrder(teamId: string, order: string[]) {\n return {\n type: ChannelCategoryTypes.RECEIVED_CATEGORY_ORDER,\n data: {\n teamId,\n order,\n },\n };\n}\n\nexport function createCategory(teamId: string, displayName: string, channelIds: Array = []): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const currentUserId = getCurrentUserId(getState());\n\n let newCategory;\n try {\n newCategory = await Client4.createChannelCategory(currentUserId, teamId, {\n team_id: teamId,\n user_id: currentUserId,\n display_name: displayName,\n channel_ids: channelIds,\n });\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n // The new category will be added to the state after receiving the corresponding websocket event.\n\n return {data: newCategory};\n };\n}\n\nexport function renameCategory(categoryId: string, displayName: string): ActionFunc {\n return patchCategory(categoryId, {\n display_name: displayName,\n });\n}\n\nexport function deleteCategory(categoryId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const category = getCategory(state, categoryId);\n const currentUserId = getCurrentUserId(state);\n\n try {\n await Client4.deleteChannelCategory(currentUserId, category.team_id, category.id);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n // The category will be deleted from the state after receiving the corresponding websocket event.\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {\n Channel,\n ChannelNotifyProps,\n ChannelMembership,\n ChannelModerationPatch,\n ChannelsWithTotalCount,\n ChannelSearchOpts,\n ServerChannel,\n ChannelModeration,\n ChannelStats,\n ChannelWithTeamData,\n} from '@mattermost/types/channels';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UsersWithGroupsAndCount} from '@mattermost/types/groups';\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport {ChannelTypes, PreferenceTypes, UserTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {MarkUnread} from 'mattermost-redux/constants/channels';\nimport {getCategoryInTeamByType} from 'mattermost-redux/selectors/entities/channel_categories';\nimport {\n getChannel as getChannelSelector,\n getChannelsNameMapInTeam,\n getMyChannelMember as getMyChannelMemberSelector,\n getRedirectChannelNameForTeam,\n isManuallyUnread,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport type {ActionFunc, DispatchFunc, GetStateFunc, NewActionFuncAsync} from 'mattermost-redux/types/actions';\nimport {getChannelByName} from 'mattermost-redux/utils/channel_utils';\n\nimport {addChannelToInitialCategory, addChannelToCategory} from './channel_categories';\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\nimport {savePreferences} from './preferences';\nimport {loadRolesIfNeeded} from './roles';\nimport {getMissingProfilesByIds} from './users';\n\nimport {General, Preferences} from '../constants';\n\nexport function selectChannel(channelId: string) {\n return {\n type: ChannelTypes.SELECT_CHANNEL,\n data: channelId,\n };\n}\n\nexport function createChannel(channel: Channel, userId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let created;\n try {\n created = await Client4.createChannel(channel);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({\n type: ChannelTypes.CREATE_CHANNEL_FAILURE,\n error,\n });\n dispatch(logError(error));\n return {error};\n }\n\n const member = {\n channel_id: created.id,\n user_id: userId,\n roles: `${General.CHANNEL_USER_ROLE} ${General.CHANNEL_ADMIN_ROLE}`,\n last_viewed_at: 0,\n msg_count: 0,\n mention_count: 0,\n notify_props: {desktop: 'default', mark_unread: 'all'},\n last_update_at: created.create_at,\n };\n\n const actions: AnyAction[] = [];\n const {channels, myMembers} = getState().entities.channels;\n\n if (!channels[created.id]) {\n actions.push({type: ChannelTypes.RECEIVED_CHANNEL, data: created});\n }\n\n if (!myMembers[created.id]) {\n actions.push({type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER, data: member});\n dispatch(loadRolesIfNeeded(member.roles.split(' ')));\n }\n\n dispatch(batchActions([\n ...actions,\n {\n type: ChannelTypes.CREATE_CHANNEL_SUCCESS,\n },\n ]));\n\n dispatch(addChannelToInitialCategory(created, true));\n\n return {data: created};\n };\n}\n\nexport function createDirectChannel(userId: string, otherUserId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n dispatch({type: ChannelTypes.CREATE_CHANNEL_REQUEST, data: null});\n\n let created;\n try {\n created = await Client4.createDirectChannel([userId, otherUserId]);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.CREATE_CHANNEL_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n const member = {\n channel_id: created.id,\n user_id: userId,\n roles: `${General.CHANNEL_USER_ROLE}`,\n last_viewed_at: 0,\n msg_count: 0,\n mention_count: 0,\n notify_props: {desktop: 'default', mark_unread: 'all'},\n last_update_at: created.create_at,\n };\n\n const preferences = [\n {user_id: userId, category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, name: otherUserId, value: 'true'},\n {user_id: userId, category: Preferences.CATEGORY_CHANNEL_OPEN_TIME, name: created.id, value: new Date().getTime().toString()},\n ];\n\n dispatch(savePreferences(userId, preferences));\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: created,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER,\n data: member,\n },\n {\n type: PreferenceTypes.RECEIVED_PREFERENCES,\n data: preferences,\n },\n {\n type: ChannelTypes.CREATE_CHANNEL_SUCCESS,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL,\n id: created.id,\n data: [{id: userId}, {id: otherUserId}],\n },\n ]));\n\n dispatch(addChannelToInitialCategory(created));\n\n dispatch(loadRolesIfNeeded(member.roles.split(' ')));\n\n return {data: created};\n };\n}\n\nexport function markGroupChannelOpen(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const {currentUserId} = getState().entities.users;\n\n const preferences: PreferenceType[] = [\n {user_id: currentUserId, category: Preferences.CATEGORY_GROUP_CHANNEL_SHOW, name: channelId, value: 'true'},\n {user_id: currentUserId, category: Preferences.CATEGORY_CHANNEL_OPEN_TIME, name: channelId, value: new Date().getTime().toString()},\n ];\n\n return dispatch(savePreferences(currentUserId, preferences));\n };\n}\n\nexport function createGroupChannel(userIds: string[]): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.CREATE_CHANNEL_REQUEST, data: null});\n\n const {currentUserId} = getState().entities.users;\n\n let created;\n try {\n created = await Client4.createGroupChannel(userIds);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.CREATE_CHANNEL_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n let member: Partial | undefined = {\n channel_id: created.id,\n user_id: currentUserId,\n roles: `${General.CHANNEL_USER_ROLE}`,\n last_viewed_at: 0,\n msg_count: 0,\n mention_count: 0,\n msg_count_root: 0,\n mention_count_root: 0,\n notify_props: {desktop: 'default', mark_unread: 'all'},\n last_update_at: created.create_at,\n };\n\n // Check the channel previous existency: if the channel already have\n // posts is because it existed before.\n if (created.total_msg_count > 0) {\n const storeMember = getMyChannelMemberSelector(getState(), created.id);\n if (storeMember === null) {\n try {\n member = await Client4.getMyChannelMember(created.id);\n } catch (error) {\n // Log the error and keep going with the generated membership.\n dispatch(logError(error));\n }\n } else {\n member = storeMember;\n }\n }\n\n dispatch(markGroupChannelOpen(created.id));\n\n const profilesInChannel = userIds.map((id) => ({id}));\n profilesInChannel.push({id: currentUserId}); // currentUserId is optionally in userIds, but the reducer will get rid of a duplicate\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: created,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER,\n data: member,\n },\n {\n type: ChannelTypes.CREATE_CHANNEL_SUCCESS,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL,\n id: created.id,\n data: profilesInChannel,\n },\n ]));\n\n dispatch(addChannelToInitialCategory(created));\n\n dispatch(loadRolesIfNeeded((member && member.roles && member.roles.split(' ')) || []));\n\n return {data: created};\n };\n}\n\nexport function patchChannel(channelId: string, patch: Partial): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null});\n\n let updated;\n try {\n updated = await Client4.patchChannel(channelId, patch);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: updated,\n },\n {\n type: ChannelTypes.UPDATE_CHANNEL_SUCCESS,\n },\n ]));\n\n return {data: updated};\n };\n}\n\nexport function updateChannel(channel: Channel): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null});\n\n let updated;\n try {\n updated = await Client4.updateChannel(channel);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: updated,\n },\n {\n type: ChannelTypes.UPDATE_CHANNEL_SUCCESS,\n },\n ]));\n\n return {data: updated};\n };\n}\n\nexport function updateChannelPrivacy(channelId: string, privacy: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null});\n\n let updatedChannel;\n try {\n updatedChannel = await Client4.updateChannelPrivacy(channelId, privacy);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: updatedChannel,\n },\n {\n type: ChannelTypes.UPDATE_CHANNEL_SUCCESS,\n },\n ]));\n\n return {data: updatedChannel};\n };\n}\n\nexport function convertGroupMessageToPrivateChannel(channelID: string, teamID: string, displayName: string, name: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_REQUEST, data: null});\n\n let updatedChannel;\n try {\n updatedChannel = await Client4.convertGroupMessageToPrivateChannel(channelID, teamID, displayName, name);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.UPDATE_CHANNEL_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: updatedChannel,\n },\n {\n type: ChannelTypes.UPDATE_CHANNEL_SUCCESS,\n },\n ]));\n\n // move the channel from direct message category to the default \"channels\" category\n const channelsCategory = getCategoryInTeamByType(getState(), teamID, CategoryTypes.CHANNELS);\n if (!channelsCategory) {\n return {};\n }\n\n return updatedChannel;\n };\n}\n\nexport function updateChannelNotifyProps(userId: string, channelId: string, props: Partial): NewActionFuncAsync {\n return async (dispatch, getState) => {\n const notifyProps = {\n user_id: userId,\n channel_id: channelId,\n ...props,\n };\n\n try {\n await Client4.updateChannelNotifyProps(notifyProps);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n\n return {error};\n }\n\n const member = getState().entities.channels.myMembers[channelId] || {};\n const currentNotifyProps = member.notify_props || {};\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL_PROPS,\n data: {\n channel_id: channelId,\n notifyProps: {...currentNotifyProps, ...notifyProps},\n },\n });\n\n return {data: true};\n };\n}\n\nexport function getChannelByNameAndTeamName(teamName: string, channelName: string, includeDeleted = false): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n try {\n data = await Client4.getChannelByNameAndTeamName(teamName, channelName, includeDeleted);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL,\n data,\n });\n\n return {data};\n };\n}\n\nexport function getChannel(channelId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getChannel(channelId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL,\n data,\n });\n\n return {data};\n };\n}\n\nexport function getChannelAndMyMember(channelId: string): NewActionFuncAsync<{channel: Channel; member: ChannelMembership}> {\n return async (dispatch, getState) => {\n let channel;\n let member;\n try {\n const channelRequest = Client4.getChannel(channelId);\n const memberRequest = Client4.getMyChannelMember(channelId);\n\n channel = await channelRequest;\n member = await memberRequest;\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: channel,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER,\n data: member,\n },\n ]));\n dispatch(loadRolesIfNeeded(member.roles.split(' ')));\n\n return {data: {channel, member}};\n };\n}\n\nexport function getChannelTimezones(channelId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let channelTimezones;\n try {\n const channelTimezonesRequest = Client4.getChannelTimezones(channelId);\n\n channelTimezones = await channelTimezonesRequest;\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return {data: channelTimezones};\n };\n}\n\nexport function fetchChannelsAndMembers(teamId: string): ActionFunc<{channels: ServerChannel[]; channelMembers: ChannelMembership[]}> {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let channels;\n let channelMembers;\n try {\n [channels, channelMembers] = await Promise.all([\n Client4.getMyChannels(teamId),\n Client4.getMyChannelMembers(teamId),\n ]);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error: error as ServerError};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNELS,\n teamId,\n data: channels,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS,\n data: channelMembers,\n },\n ]));\n\n const roles = new Set();\n for (const member of channelMembers) {\n for (const role of member.roles.split(' ')) {\n roles.add(role);\n }\n }\n if (roles.size > 0) {\n dispatch(loadRolesIfNeeded(roles));\n }\n\n return {data: {channels, channelMembers}};\n };\n}\n\nexport function fetchAllMyTeamsChannelsAndChannelMembersREST(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const {currentUserId} = state.entities.users;\n let channels;\n let channelsMembers: ChannelMembership[] = [];\n let allMembers = true;\n let page = 0;\n do {\n try {\n // eslint-disable-next-line no-await-in-loop\n await Client4.getAllChannelsMembers(currentUserId, page, 200).then(\n // eslint-disable-next-line no-loop-func\n (data) => {\n channelsMembers = [...channelsMembers, ...data];\n page++;\n if (data.length < 200) {\n allMembers = false;\n }\n });\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n } while (allMembers && page <= 2);\n try {\n channels = await Client4.getAllTeamsChannels();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_ALL_CHANNELS,\n data: channels,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBERS,\n data: channelsMembers,\n currentUserId,\n },\n ]));\n return {data: {channels, channelsMembers}};\n };\n}\n\nexport function getChannelMembers(channelId: string, page = 0, perPage: number = General.CHANNELS_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let channelMembers: ChannelMembership[];\n\n try {\n const channelMembersRequest = Client4.getChannelMembers(channelId, page, perPage);\n\n channelMembers = await channelMembersRequest;\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const userIds = channelMembers.map((cm) => cm.user_id);\n dispatch(getMissingProfilesByIds(userIds));\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL_MEMBERS,\n data: channelMembers,\n });\n\n return {data: channelMembers};\n };\n}\n\nexport function leaveChannel(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const {currentUserId} = state.entities.users;\n const {channels, myMembers} = state.entities.channels;\n const channel = channels[channelId];\n const member = myMembers[channelId];\n\n Client4.trackEvent('action', 'action_channels_leave', {channel_id: channelId});\n\n dispatch({\n type: ChannelTypes.LEAVE_CHANNEL,\n data: {\n id: channelId,\n user_id: currentUserId,\n team_id: channel.team_id,\n type: channel.type,\n },\n });\n\n (async function removeFromChannelWrapper() {\n try {\n await Client4.removeFromChannel(currentUserId, channelId);\n } catch {\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: channel,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER,\n data: member,\n },\n ]));\n\n // The category here may not be the one in which the channel was originally located,\n // much less the order in which it was placed. Treating this as a transient issue\n // for the user to resolve by refreshing or leaving again.\n dispatch(addChannelToInitialCategory(channel, false));\n }\n }());\n\n return {data: true};\n };\n}\n\nexport function joinChannel(userId: string, teamId: string, channelId: string, channelName?: string): NewActionFuncAsync<{channel: Channel; member: ChannelMembership} | null> {\n return async (dispatch, getState) => {\n if (!channelId && !channelName) {\n return {data: null};\n }\n\n let member: ChannelMembership | undefined | null;\n let channel: Channel;\n try {\n if (channelId) {\n member = await Client4.addToChannel(userId, channelId);\n channel = await Client4.getChannel(channelId);\n } else {\n channel = await Client4.getChannelByName(teamId, channelName!, true);\n if ((channel.type === General.GM_CHANNEL) || (channel.type === General.DM_CHANNEL)) {\n member = await Client4.getChannelMember(channel.id, userId);\n } else {\n member = await Client4.addToChannel(userId, channel.id);\n }\n }\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n Client4.trackEvent('action', 'action_channels_join', {channel_id: channelId});\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNEL,\n data: channel,\n },\n {\n type: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER,\n data: member,\n },\n ]));\n\n dispatch(addChannelToInitialCategory(channel));\n\n if (member) {\n dispatch(loadRolesIfNeeded(member.roles.split(' ')));\n }\n\n return {data: {channel, member}};\n };\n}\n\nexport function deleteChannel(channelId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let state = getState();\n const viewArchivedChannels = state.entities.general.config.ExperimentalViewArchivedChannels === 'true';\n\n try {\n await Client4.deleteChannel(channelId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n state = getState();\n const {currentChannelId} = state.entities.channels;\n if (channelId === currentChannelId && !viewArchivedChannels) {\n const teamId = getCurrentTeamId(state);\n const channelsInTeam = getChannelsNameMapInTeam(state, teamId);\n const channel = getChannelByName(channelsInTeam, getRedirectChannelNameForTeam(state, teamId));\n if (channel && channel.id) {\n dispatch({type: ChannelTypes.SELECT_CHANNEL, data: channel.id});\n }\n }\n\n dispatch({type: ChannelTypes.DELETE_CHANNEL_SUCCESS, data: {id: channelId, viewArchivedChannels}});\n\n return {data: true};\n };\n}\n\nexport function unarchiveChannel(channelId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.unarchiveChannel(channelId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const state = getState();\n const config = getConfig(state);\n const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n dispatch({type: ChannelTypes.UNARCHIVED_CHANNEL_SUCCESS, data: {id: channelId, viewArchivedChannels}});\n\n return {data: true};\n };\n}\n\nexport function updateApproximateViewTime(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const {currentUserId} = getState().entities.users;\n\n const {myPreferences} = getState().entities.preferences;\n\n const viewTimePref = myPreferences[`${Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME}--${channelId}`];\n const viewTime = viewTimePref ? parseInt(viewTimePref.value!, 10) : 0;\n if (viewTime < new Date().getTime() - (3 * 60 * 60 * 1000)) {\n const preferences = [\n {user_id: currentUserId, category: Preferences.CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME, name: channelId, value: new Date().getTime().toString()},\n ];\n dispatch(savePreferences(currentUserId, preferences));\n }\n return {data: true};\n };\n}\n\nexport function readMultipleChannels(channelIds: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let response;\n try {\n response = await Client4.readMultipleChannels(channelIds);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(markMultipleChannelsAsRead(response.last_viewed_at_times));\n\n return {data: true};\n };\n}\n\nexport function getChannels(teamId: string, page = 0, perPage: number = General.CHANNELS_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_CHANNELS_REQUEST, data: null});\n\n let channels;\n try {\n channels = await Client4.getChannels(teamId, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNELS,\n teamId,\n data: channels,\n },\n {\n type: ChannelTypes.GET_CHANNELS_SUCCESS,\n },\n ]));\n\n return {data: channels};\n };\n}\n\nexport function getArchivedChannels(teamId: string, page = 0, perPage: number = General.CHANNELS_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let channels;\n try {\n channels = await Client4.getArchivedChannels(teamId, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n return {error};\n }\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNELS,\n teamId,\n data: channels,\n });\n\n return {data: channels};\n };\n}\n\nexport function getAllChannelsWithCount(page = 0, perPage: number = General.CHANNELS_CHUNK_SIZE, notAssociatedToGroup = '', excludeDefaultChannels = false, includeDeleted = false, excludePolicyConstrained = false): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_ALL_CHANNELS_REQUEST, data: null});\n\n let payload;\n try {\n payload = await Client4.getAllChannels(page, perPage, notAssociatedToGroup, excludeDefaultChannels, true, includeDeleted, excludePolicyConstrained);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_ALL_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_ALL_CHANNELS,\n data: payload.channels,\n },\n {\n type: ChannelTypes.GET_ALL_CHANNELS_SUCCESS,\n },\n {\n type: ChannelTypes.RECEIVED_TOTAL_CHANNEL_COUNT,\n data: payload.total_count,\n },\n ]));\n\n return {data: payload};\n };\n}\n\nexport function getAllChannels(page = 0, perPage: number = General.CHANNELS_CHUNK_SIZE, notAssociatedToGroup = '', excludeDefaultChannels = false, excludePolicyConstrained = false): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_ALL_CHANNELS_REQUEST, data: null});\n\n let channels;\n try {\n channels = await Client4.getAllChannels(page, perPage, notAssociatedToGroup, excludeDefaultChannels, false, false, excludePolicyConstrained);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_ALL_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_ALL_CHANNELS,\n data: channels,\n },\n {\n type: ChannelTypes.GET_ALL_CHANNELS_SUCCESS,\n },\n ]));\n\n return {data: channels};\n };\n}\n\nexport function autocompleteChannels(teamId: string, term: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_CHANNELS_REQUEST, data: null});\n\n let channels;\n try {\n channels = await Client4.autocompleteChannels(teamId, term);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNELS,\n teamId,\n data: channels,\n },\n {\n type: ChannelTypes.GET_CHANNELS_SUCCESS,\n },\n ]));\n\n return {data: channels};\n };\n}\n\nexport function autocompleteChannelsForSearch(teamId: string, term: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_CHANNELS_REQUEST, data: null});\n\n let channels;\n try {\n channels = await Client4.autocompleteChannelsForSearch(teamId, term);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNELS,\n teamId,\n data: channels,\n },\n {\n type: ChannelTypes.GET_CHANNELS_SUCCESS,\n },\n ]));\n\n return {data: channels};\n };\n}\n\nexport function searchChannels(teamId: string, term: string, archived?: boolean): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_CHANNELS_REQUEST, data: null});\n\n let channels;\n try {\n if (archived) {\n channels = await Client4.searchArchivedChannels(teamId, term);\n } else {\n channels = await Client4.searchChannels(teamId, term);\n }\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_CHANNELS,\n teamId,\n data: channels,\n },\n {\n type: ChannelTypes.GET_CHANNELS_SUCCESS,\n },\n ]));\n\n return {data: channels};\n };\n}\n\nexport function searchAllChannels(term: string, opts: {page: number; per_page: number} & ChannelSearchOpts): NewActionFuncAsync;\nexport function searchAllChannels(term: string, opts: Omit | undefined): NewActionFuncAsync;\nexport function searchAllChannels(term: string, opts: ChannelSearchOpts = {}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: ChannelTypes.GET_ALL_CHANNELS_REQUEST, data: null});\n\n let response;\n try {\n response = await Client4.searchAllChannels(term, opts);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: ChannelTypes.GET_ALL_CHANNELS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n const channels = 'channels' in response ? response.channels : response;\n\n dispatch(batchActions([\n {\n type: ChannelTypes.RECEIVED_ALL_CHANNELS,\n data: channels,\n },\n {\n type: ChannelTypes.GET_ALL_CHANNELS_SUCCESS,\n },\n ]));\n\n return {data: response};\n };\n}\n\nexport function searchGroupChannels(term: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.searchGroupChannels,\n params: [term],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getChannelStats(channelId: string, includeFileCount?: boolean): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let stat;\n try {\n stat = await Client4.getChannelStats(channelId, includeFileCount);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL_STATS,\n data: stat,\n });\n\n return {data: stat};\n };\n}\n\nexport function getChannelsMemberCount(channelIds: string[]): NewActionFuncAsync> {\n return async (dispatch, getState) => {\n let channelsMemberCount;\n\n try {\n channelsMemberCount = await Client4.getChannelsMemberCount(channelIds);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNELS_MEMBER_COUNT,\n data: channelsMemberCount,\n });\n\n return {data: channelsMemberCount};\n };\n}\n\nexport function addChannelMember(channelId: string, userId: string, postRootId = ''): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let member;\n try {\n member = await Client4.addToChannel(userId, channelId, postRootId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n Client4.trackEvent('action', 'action_channels_add_member', {channel_id: channelId});\n\n const membersInChannel = getState().entities.channels.membersInChannel[channelId];\n if (!(membersInChannel && userId in membersInChannel)) {\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILE_IN_CHANNEL,\n data: {id: channelId, user_id: userId},\n },\n {\n type: ChannelTypes.RECEIVED_CHANNEL_MEMBER,\n data: member,\n },\n {\n type: ChannelTypes.ADD_CHANNEL_MEMBER_SUCCESS,\n id: channelId,\n },\n ], 'ADD_CHANNEL_MEMBER.BATCH'));\n }\n\n return {data: member};\n };\n}\n\nexport function removeChannelMember(channelId: string, userId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.removeFromChannel(userId, channelId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n Client4.trackEvent('action', 'action_channels_remove_member', {channel_id: channelId});\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILE_NOT_IN_CHANNEL,\n data: {id: channelId, user_id: userId},\n },\n {\n type: ChannelTypes.REMOVE_CHANNEL_MEMBER_SUCCESS,\n id: channelId,\n },\n ], 'REMOVE_CHANNEL_MEMBER.BATCH'));\n\n return {data: true};\n };\n}\n\nexport function updateChannelMemberRoles(channelId: string, userId: string, roles: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.updateChannelMemberRoles(channelId, userId, roles);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const membersInChannel = getState().entities.channels.membersInChannel[channelId];\n if (membersInChannel && membersInChannel[userId]) {\n dispatch({\n type: ChannelTypes.RECEIVED_CHANNEL_MEMBER,\n data: {...membersInChannel[userId], roles},\n });\n }\n\n return {data: true};\n };\n}\n\nexport function updateChannelHeader(channelId: string, header: string): ActionFunc {\n return async (dispatch: DispatchFunc) => {\n Client4.trackEvent('action', 'action_channels_update_header', {channel_id: channelId});\n\n dispatch({\n type: ChannelTypes.UPDATE_CHANNEL_HEADER,\n data: {\n channelId,\n header,\n },\n });\n\n return {data: true};\n };\n}\n\nexport function updateChannelPurpose(channelId: string, purpose: string): ActionFunc {\n return async (dispatch: DispatchFunc) => {\n Client4.trackEvent('action', 'action_channels_update_purpose', {channel_id: channelId});\n\n dispatch({\n type: ChannelTypes.UPDATE_CHANNEL_PURPOSE,\n data: {\n channelId,\n purpose,\n },\n });\n\n return {data: true};\n };\n}\n\nexport function markChannelAsRead(channelId: string, skipUpdateViewTime = false): ActionFunc {\n return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n if (skipUpdateViewTime) {\n dispatch(updateApproximateViewTime(channelId));\n }\n dispatch(markChannelAsViewedOnServer(channelId));\n\n const actions = actionsToMarkChannelAsRead(getState, channelId);\n if (actions.length > 0) {\n dispatch(batchActions(actions));\n }\n\n return {data: true};\n };\n}\n\nexport function markMultipleChannelsAsRead(channelTimes: Record): ActionFunc {\n return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const actions: AnyAction[] = [];\n for (const id of Object.keys(channelTimes)) {\n actions.push(...actionsToMarkChannelAsRead(getState, id, channelTimes[id]));\n }\n\n if (actions.length > 0) {\n dispatch(batchActions(actions));\n }\n\n return {data: true};\n };\n}\n\nexport function markChannelAsViewedOnServer(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.viewMyChannel(channelId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n // const actions: AnyAction[] = [];\n // for (const id of Object.keys(response.last_viewed_at_times)) {\n // actions.push({\n // type: ChannelTypes.RECEIVED_LAST_VIEWED_AT,\n // data: {\n // channel_id: channelId,\n // last_viewed_at: response.last_viewed_at_times[id],\n // },\n // });\n // }\n\n return {data: true};\n };\n}\n\nexport function actionsToMarkChannelAsRead(getState: GetStateFunc, channelId: string, viewedAt = Date.now()) {\n const state = getState();\n const {channels, messageCounts, myMembers} = state.entities.channels;\n\n // Update channel member objects to set all mentions and posts as viewed\n const channel = channels[channelId];\n const messageCount = messageCounts[channelId];\n\n // Update team member objects to set mentions and posts in channel as viewed\n const channelMember = myMembers[channelId];\n\n const actions: AnyAction[] = [];\n\n if (channel && channelMember) {\n actions.push({\n type: ChannelTypes.DECREMENT_UNREAD_MSG_COUNT,\n data: {\n teamId: channel.team_id,\n channelId,\n amount: messageCount.total - channelMember.msg_count,\n amountRoot: messageCount.root - channelMember.msg_count_root,\n },\n });\n\n actions.push({\n type: ChannelTypes.DECREMENT_UNREAD_MENTION_COUNT,\n data: {\n teamId: channel.team_id,\n channelId,\n amount: channelMember.mention_count,\n amountRoot: channelMember.mention_count_root,\n amountUrgent: channelMember.urgent_mention_count,\n },\n });\n\n actions.push({\n type: ChannelTypes.RECEIVED_LAST_VIEWED_AT,\n data: {\n channel_id: channelId,\n last_viewed_at: viewedAt,\n },\n });\n }\n\n if (channel && isManuallyUnread(getState(), channelId)) {\n actions.push({\n type: ChannelTypes.REMOVE_MANUALLY_UNREAD,\n data: {channelId},\n });\n }\n\n return actions;\n}\n\nexport function actionsToMarkChannelAsUnread(getState: GetStateFunc, teamId: string, channelId: string, mentions: string[], fetchedChannelMember = false, isRoot = false, priority = '') {\n const state = getState();\n const {myMembers} = state.entities.channels;\n const {currentUserId} = state.entities.users;\n\n const actions: AnyAction[] = [{\n type: ChannelTypes.INCREMENT_UNREAD_MSG_COUNT,\n data: {\n teamId,\n channelId,\n amount: 1,\n amountRoot: isRoot ? 1 : 0,\n onlyMentions: myMembers[channelId] && myMembers[channelId].notify_props &&\n myMembers[channelId].notify_props.mark_unread === MarkUnread.MENTION,\n fetchedChannelMember,\n },\n }];\n\n if (!fetchedChannelMember) {\n actions.push({\n type: ChannelTypes.INCREMENT_TOTAL_MSG_COUNT,\n data: {\n channelId,\n amountRoot: isRoot ? 1 : 0,\n amount: 1,\n },\n });\n }\n\n if (mentions && mentions.indexOf(currentUserId) !== -1) {\n actions.push({\n type: ChannelTypes.INCREMENT_UNREAD_MENTION_COUNT,\n data: {\n teamId,\n channelId,\n amountRoot: isRoot ? 1 : 0,\n amount: 1,\n amountUrgent: priority === 'urgent' ? 1 : 0,\n fetchedChannelMember,\n },\n });\n }\n\n return actions;\n}\n\nexport function getChannelMembersByIds(channelId: string, userIds: string[]) {\n return bindClientFunc({\n clientFunc: Client4.getChannelMembersByIds,\n onSuccess: ChannelTypes.RECEIVED_CHANNEL_MEMBERS,\n params: [\n channelId,\n userIds,\n ],\n });\n}\n\nexport function getChannelMember(channelId: string, userId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getChannelMember,\n onSuccess: ChannelTypes.RECEIVED_CHANNEL_MEMBER,\n params: [\n channelId,\n userId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getMyChannelMember(channelId: string) {\n return bindClientFunc({\n clientFunc: Client4.getMyChannelMember,\n onSuccess: ChannelTypes.RECEIVED_MY_CHANNEL_MEMBER,\n params: [\n channelId,\n ],\n });\n}\n\nexport function loadMyChannelMemberAndRole(channelId: string) {\n return async (dispatch: DispatchFunc) => {\n const result = await dispatch(getMyChannelMember(channelId));\n const roles = result.data?.roles.split(' ');\n if (roles && roles.length > 0) {\n dispatch(loadRolesIfNeeded(roles));\n }\n return {data: true};\n };\n}\n\n// favoriteChannel moves the provided channel into the current team's Favorites category.\nexport function favoriteChannel(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const channel = getChannelSelector(state, channelId);\n const category = getCategoryInTeamByType(state, channel.team_id || getCurrentTeamId(state), CategoryTypes.FAVORITES);\n\n Client4.trackEvent('action', 'action_channels_favorite');\n\n if (!category) {\n return {data: false};\n }\n\n return dispatch(addChannelToCategory(category.id, channelId));\n };\n}\n\n// unfavoriteChannel moves the provided channel into the current team's Channels/DMs category.\nexport function unfavoriteChannel(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const channel = getChannelSelector(state, channelId);\n const category = getCategoryInTeamByType(\n state,\n channel.team_id || getCurrentTeamId(state),\n channel.type === General.DM_CHANNEL || channel.type === General.GM_CHANNEL ? CategoryTypes.DIRECT_MESSAGES : CategoryTypes.CHANNELS,\n );\n\n Client4.trackEvent('action', 'action_channels_unfavorite');\n\n if (!category) {\n return {data: false};\n }\n\n return dispatch(addChannelToCategory(category.id, channel.id));\n };\n}\n\nexport function updateChannelScheme(channelId: string, schemeId: string) {\n return bindClientFunc({\n clientFunc: async () => {\n await Client4.updateChannelScheme(channelId, schemeId);\n return {channelId, schemeId};\n },\n onSuccess: ChannelTypes.UPDATED_CHANNEL_SCHEME,\n });\n}\n\nexport function updateChannelMemberSchemeRoles(channelId: string, userId: string, isSchemeUser: boolean, isSchemeAdmin: boolean): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: async () => {\n await Client4.updateChannelMemberSchemeRoles(channelId, userId, isSchemeUser, isSchemeAdmin);\n return {channelId, userId, isSchemeUser, isSchemeAdmin};\n },\n onSuccess: ChannelTypes.UPDATED_CHANNEL_MEMBER_SCHEME_ROLES,\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function membersMinusGroupMembers(channelID: string, groupIDs: string[], page = 0, perPage: number = General.PROFILE_CHUNK_SIZE): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.channelMembersMinusGroupMembers,\n onSuccess: ChannelTypes.RECEIVED_CHANNEL_MEMBERS_MINUS_GROUP_MEMBERS,\n params: [\n channelID,\n groupIDs,\n page,\n perPage,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getChannelModerations(channelId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: async () => {\n const moderations = await Client4.getChannelModerations(channelId);\n return {channelId, moderations};\n },\n onSuccess: ChannelTypes.RECEIVED_CHANNEL_MODERATIONS,\n params: [\n channelId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function patchChannelModerations(channelId: string, patch: ChannelModerationPatch[]): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: async () => {\n const moderations = await Client4.patchChannelModerations(channelId, patch);\n return {channelId, moderations};\n },\n onSuccess: ChannelTypes.RECEIVED_CHANNEL_MODERATIONS,\n params: [\n channelId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getChannelMemberCountsByGroup(channelId: string): ActionFunc {\n return bindClientFunc({\n clientFunc: async () => {\n const channelMemberCountsByGroup = await Client4.getChannelMemberCountsByGroup(channelId, true);\n return {channelId, memberCounts: channelMemberCountsByGroup};\n },\n onSuccess: ChannelTypes.RECEIVED_CHANNEL_MEMBER_COUNTS_BY_GROUP,\n params: [\n channelId,\n ],\n });\n}\n\nexport default {\n selectChannel,\n createChannel,\n createDirectChannel,\n updateChannel,\n patchChannel,\n updateChannelNotifyProps,\n getChannel,\n fetchChannelsAndMembers,\n getChannelTimezones,\n getChannelMembersByIds,\n leaveChannel,\n joinChannel,\n deleteChannel,\n unarchiveChannel,\n getChannels,\n autocompleteChannels,\n autocompleteChannelsForSearch,\n searchChannels,\n searchGroupChannels,\n getChannelStats,\n addChannelMember,\n removeChannelMember,\n updateChannelHeader,\n updateChannelPurpose,\n markChannelAsRead,\n favoriteChannel,\n unfavoriteChannel,\n membersMinusGroupMembers,\n getChannelModerations,\n getChannelMemberCountsByGroup,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {EmojiTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCustomEmojisByName as selectCustomEmojisByName} from 'mattermost-redux/selectors/entities/emojis';\nimport type {GetStateFunc, DispatchFunc, ActionFunc, NewActionFuncAsync} from 'mattermost-redux/types/actions';\nimport {parseEmojiNamesFromText} from 'mattermost-redux/utils/emoji_utils';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\nimport {getProfilesByIds} from './users';\n\nimport {General, Emoji} from '../constants';\n\nexport let systemEmojis: Set = new Set();\nexport function setSystemEmojis(emojis: Set) {\n systemEmojis = emojis;\n}\n\nexport function createCustomEmoji(emoji: any, image: any): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.createCustomEmoji,\n onSuccess: EmojiTypes.RECEIVED_CUSTOM_EMOJI,\n params: [\n emoji,\n image,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getCustomEmoji(emojiId: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getCustomEmoji,\n onSuccess: EmojiTypes.RECEIVED_CUSTOM_EMOJI,\n params: [\n emojiId,\n ],\n });\n}\n\nexport function getCustomEmojiByName(name: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n\n try {\n data = await Client4.getCustomEmojiByName(name);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n if (error.status_code === 404) {\n dispatch({type: EmojiTypes.CUSTOM_EMOJI_DOES_NOT_EXIST, data: name});\n } else {\n dispatch(logError(error));\n }\n\n return {error};\n }\n\n dispatch({\n type: EmojiTypes.RECEIVED_CUSTOM_EMOJI,\n data,\n });\n\n return {data};\n };\n}\n\nexport function getCustomEmojisByName(names: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const neededNames = filterNeededCustomEmojis(getState(), names);\n\n if (neededNames.length === 0) {\n return {data: true};\n }\n\n // If necessary, split up the list of names into batches based on api4.GetEmojisByNamesMax on the server\n const batchSize = 200;\n\n const batches = [];\n for (let i = 0; i < names.length; i += batchSize) {\n batches.push(neededNames.slice(i, i + batchSize));\n }\n\n let results;\n try {\n results = await Promise.all(batches.map((batch) => {\n return Client4.getCustomEmojisByNames(batch);\n }));\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const data = results.flat();\n const actions: AnyAction[] = [{\n type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,\n data,\n }];\n\n if (data.length !== neededNames.length) {\n const foundNames = new Set(data.map((emoji) => emoji.name));\n\n for (const name of neededNames) {\n if (foundNames.has(name)) {\n continue;\n }\n\n actions.push({\n type: EmojiTypes.CUSTOM_EMOJI_DOES_NOT_EXIST,\n data: name,\n });\n }\n }\n\n return dispatch(actions.length > 1 ? batchActions(actions) : actions[0]);\n };\n}\n\nfunction filterNeededCustomEmojis(state: GlobalState, names: string[]) {\n const nonExistentEmoji = state.entities.emojis.nonExistentEmoji;\n const customEmojisByName = selectCustomEmojisByName(state);\n\n return names.filter((name) => {\n return !systemEmojis.has(name) && !nonExistentEmoji.has(name) && !customEmojisByName.has(name);\n });\n}\n\nexport function getCustomEmojisInText(text: string): ActionFunc {\n return (dispatch: DispatchFunc) => {\n if (!text) {\n return {data: true};\n }\n\n return dispatch(getCustomEmojisByName(parseEmojiNamesFromText(text)));\n };\n}\n\nexport function getCustomEmojis(\n page = 0,\n perPage: number = General.PAGE_SIZE_DEFAULT,\n sort: string = Emoji.SORT_BY_NAME,\n loadUsers = false,\n): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getCustomEmojis(page, perPage, sort);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n if (loadUsers) {\n dispatch(loadProfilesForCustomEmojis(data));\n }\n\n dispatch({\n type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,\n data,\n });\n\n return {data};\n };\n}\n\nexport function loadProfilesForCustomEmojis(emojis: CustomEmoji[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const usersToLoad: Record = {};\n emojis.forEach((emoji: CustomEmoji) => {\n if (!getState().entities.users.profiles[emoji.creator_id]) {\n usersToLoad[emoji.creator_id] = true;\n }\n });\n\n const userIds = Object.keys(usersToLoad);\n\n if (userIds.length > 0) {\n await dispatch(getProfilesByIds(userIds));\n }\n\n return {data: true};\n };\n}\n\nexport function deleteCustomEmoji(emojiId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.deleteCustomEmoji(emojiId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: EmojiTypes.DELETED_CUSTOM_EMOJI,\n data: {id: emojiId},\n });\n\n return {data: true};\n };\n}\n\nexport function searchCustomEmojis(term: string, options: any = {}, loadUsers = false): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.searchCustomEmoji(term, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n if (loadUsers) {\n dispatch(loadProfilesForCustomEmojis(data));\n }\n\n dispatch({\n type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,\n data,\n });\n\n return {data};\n };\n}\n\nexport function autocompleteCustomEmojis(name: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n try {\n data = await Client4.autocompleteCustomEmoji(name);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: EmojiTypes.RECEIVED_CUSTOM_EMOJIS,\n data,\n });\n\n return {data};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {serializeError} from 'serialize-error';\nimport type {ErrorObject} from 'serialize-error';\n\nimport {LogLevel} from '@mattermost/types/client4';\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {ErrorTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport type {DispatchFunc, ActionFunc} from 'mattermost-redux/types/actions';\n\nexport function dismissErrorObject(index: number) {\n return {\n type: ErrorTypes.DISMISS_ERROR,\n index,\n data: null,\n };\n}\n\nexport function dismissError(index: number): ActionFunc {\n return async (dispatch: DispatchFunc) => {\n dispatch(dismissErrorObject(index));\n\n return {data: true};\n };\n}\n\nexport function getLogErrorAction(error: ErrorObject, displayable = false) {\n return {\n type: ErrorTypes.LOG_ERROR,\n displayable,\n error,\n data: null,\n };\n}\n\nexport function logError(error: ServerError, displayable = false, consoleError = false): ActionFunc {\n return async (dispatch, getState) => {\n if (error.server_error_id === 'api.context.session_expired.app_error') {\n return {data: true};\n }\n\n let sendToServer = true;\n\n const message = error.stack || '';\n if (message.includes('TypeError: Failed to fetch')) {\n sendToServer = false;\n }\n if (error.server_error_id) {\n sendToServer = false;\n }\n\n const serializedError = serializeError(error);\n\n if (sendToServer) {\n try {\n const stringifiedSerializedError = JSON.stringify(serializedError).toString();\n await Client4.logClientError(stringifiedSerializedError, LogLevel.Debug);\n } catch (err) {\n // avoid crashing the app if an error sending \"the error\" occurs.\n }\n }\n\n if (consoleError) {\n serializedError.message = 'A JavaScript error has occurred. Please use the JavaScript console to capture and report the error';\n }\n\n const isDevMode = getState()?.entities.general?.config?.EnableDeveloper === 'true';\n let shouldDisplay = displayable;\n\n // Display announcements bar if error is a developer error and we are in dev mode\n if (isDevMode && error.type === 'developer') {\n shouldDisplay = true;\n }\n\n dispatch(getLogErrorAction(serializedError, shouldDisplay));\n\n return {data: true};\n };\n}\n\nexport function clearErrors(): ActionFunc {\n return async (dispatch: DispatchFunc) => {\n dispatch({type: ErrorTypes.CLEAR_ERRORS, data: null});\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {batchActions} from 'redux-batched-actions';\n\nimport {LogLevel} from '@mattermost/types/client4';\nimport type {SystemSetting} from '@mattermost/types/general';\n\nimport {GeneralTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport type {GetStateFunc, DispatchFunc, ActionFunc, NewActionFuncAsync} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from './helpers';\nimport {loadRolesIfNeeded} from './roles';\n\nexport function getClientConfig(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n try {\n data = await Client4.getClientConfigOld();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n return {error};\n }\n\n Client4.setEnableLogging(data.EnableDeveloper === 'true');\n Client4.setDiagnosticId(data.DiagnosticId);\n\n dispatch({type: GeneralTypes.CLIENT_CONFIG_RECEIVED, data});\n\n return {data};\n };\n}\n\nexport function getDataRetentionPolicy(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n try {\n data = await Client4.getDataRetentionPolicy();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({\n type: GeneralTypes.RECEIVED_DATA_RETENTION_POLICY,\n error,\n });\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {type: GeneralTypes.RECEIVED_DATA_RETENTION_POLICY, data},\n ]));\n\n return {data};\n };\n}\n\nexport function getLicenseConfig(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getClientLicenseOld,\n onSuccess: [GeneralTypes.CLIENT_LICENSE_RECEIVED],\n });\n}\n\nexport function logClientError(message: string, level = LogLevel.Error) {\n return bindClientFunc({\n clientFunc: Client4.logClientError,\n onRequest: GeneralTypes.LOG_CLIENT_ERROR_REQUEST,\n onSuccess: GeneralTypes.LOG_CLIENT_ERROR_SUCCESS,\n onFailure: GeneralTypes.LOG_CLIENT_ERROR_FAILURE,\n params: [\n message,\n level,\n ],\n });\n}\n\nexport function setServerVersion(serverVersion: string): ActionFunc {\n return async (dispatch) => {\n dispatch({type: GeneralTypes.RECEIVED_SERVER_VERSION, data: serverVersion});\n dispatch(loadRolesIfNeeded([]));\n\n return {data: true};\n };\n}\n\nexport function setUrl(url: string) {\n Client4.setUrl(url);\n return true;\n}\n\nexport function getWarnMetricsStatus(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n try {\n data = await Client4.getWarnMetricsStatus();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n return {error};\n }\n dispatch({type: GeneralTypes.WARN_METRICS_STATUS_RECEIVED, data});\n\n return {data};\n };\n}\n\nexport function setFirstAdminVisitMarketplaceStatus(): ActionFunc {\n return async (dispatch: DispatchFunc) => {\n try {\n await Client4.setFirstAdminVisitMarketplaceStatus();\n } catch (e) {\n dispatch(logError(e));\n return {error: e.message};\n }\n dispatch({type: GeneralTypes.FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED, data: true});\n return {data: true};\n };\n}\n\nexport function getFirstAdminVisitMarketplaceStatus(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n try {\n data = await Client4.getFirstAdminVisitMarketplaceStatus();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n return {error};\n }\n\n data = JSON.parse(data.value);\n dispatch({type: GeneralTypes.FIRST_ADMIN_VISIT_MARKETPLACE_STATUS_RECEIVED, data});\n return {data};\n };\n}\n\n// accompanying \"set\" happens as part of Client4.completeSetup\nexport function getFirstAdminSetupComplete(): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getFirstAdminSetupComplete();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n return {error};\n }\n\n data = JSON.parse(data.value);\n dispatch({type: GeneralTypes.FIRST_ADMIN_COMPLETE_SETUP_RECEIVED, data});\n return {data};\n };\n}\n\nexport default {\n getClientConfig,\n getDataRetentionPolicy,\n getLicenseConfig,\n logClientError,\n setServerVersion,\n setUrl,\n getWarnMetricsStatus,\n getFirstAdminVisitMarketplaceStatus,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ServerError} from '@mattermost/types/errors';\n\nimport {UserTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionFunc, GenericAction, DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\n\ntype ActionType = string;\nconst HTTP_UNAUTHORIZED = 401;\nexport function forceLogoutIfNecessary(err: ServerError, dispatch: DispatchFunc, getState: GetStateFunc) {\n const {currentUserId} = getState().entities.users;\n\n if ('status_code' in err && err.status_code === HTTP_UNAUTHORIZED && err.url && err.url.indexOf('/login') === -1 && currentUserId) {\n Client4.setToken('');\n dispatch({type: UserTypes.LOGOUT_SUCCESS, data: {}});\n }\n}\n\nfunction dispatcher(type: ActionType, data: any, dispatch: DispatchFunc) {\n if (type.indexOf('SUCCESS') === -1) { // we don't want to pass the data for the request types\n dispatch(requestSuccess(type, data));\n } else {\n dispatch(requestData(type));\n }\n}\n\nexport function requestData(type: ActionType): GenericAction {\n return {\n type,\n data: null,\n };\n}\n\nexport function requestSuccess(type: ActionType, data: any) {\n return {\n type,\n data,\n };\n}\n\nexport function requestFailure(type: ActionType, error: ServerError): any {\n return {\n type,\n error,\n };\n}\n\n/**\n * Returns an ActionFunc which calls a specfied (client) function and\n * dispatches the specifed actions on request, success or failure.\n *\n * @export\n * @param {Object} obj an object for destructirung required properties\n * @param {() => Promise} obj.clientFunc clientFunc to execute\n * @param {ActionType} obj.onRequest ActionType to dispatch on request\n * @param {(ActionType | Array)} obj.onSuccess ActionType to dispatch on success\n * @param {ActionType} obj.onFailure ActionType to dispatch on failure\n * @param {...Array} obj.params\n * @returns {ActionFunc} ActionFunc\n */\n\nexport function bindClientFunc({\n clientFunc,\n onRequest,\n onSuccess,\n onFailure,\n params = [],\n}: {\n clientFunc: (...args: any[]) => Promise;\n onRequest?: ActionType;\n onSuccess?: ActionType | ActionType[];\n onFailure?: ActionType;\n params?: any[];\n}): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n if (onRequest) {\n dispatch(requestData(onRequest));\n }\n\n let data: any = null;\n try {\n data = await clientFunc(...params);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n if (onFailure) {\n dispatch(requestFailure(onFailure, error));\n }\n dispatch(logError(error));\n return {error};\n }\n\n if (Array.isArray(onSuccess)) {\n onSuccess.forEach((s) => {\n dispatcher(s, data, dispatch);\n });\n } else if (onSuccess) {\n dispatcher(onSuccess, data, dispatch);\n }\n\n return {data};\n };\n}\n\n// Debounce function based on underscores modified to use es6 and a cb\n\nexport function debounce(func: (...args: any) => unknown, wait: number, immediate?: boolean, cb?: () => unknown) {\n let timeout: NodeJS.Timeout|null;\n return function fx(...args: any[]) {\n const runLater = () => {\n timeout = null;\n if (!immediate) {\n Reflect.apply(func, null, args);\n if (cb) {\n cb();\n }\n }\n };\n const callNow = immediate && !timeout;\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(runLater, wait);\n if (callNow) {\n Reflect.apply(func, null, args);\n if (cb) {\n cb();\n }\n }\n };\n}\n\nexport class FormattedError extends Error {\n intl: {\n id: string;\n defaultMessage: string;\n values: any;\n };\n\n constructor(id: string, defaultMessage: string, values: any = {}) {\n super(defaultMessage);\n this.intl = {\n id,\n defaultMessage,\n values,\n };\n }\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UsersLimits} from '@mattermost/types/limits';\n\nimport {LimitsTypes} from 'mattermost-redux/action_types';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {Client4} from 'mattermost-redux/client';\nimport {getCurrentUserRoles} from 'mattermost-redux/selectors/entities/users';\nimport type {NewActionFuncAsync} from 'mattermost-redux/types/actions';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nexport function getUsersLimits(): NewActionFuncAsync {\n return async (dispatch, getState) => {\n const roles = getCurrentUserRoles(getState());\n const amIAdmin = isAdmin(roles);\n if (!amIAdmin) {\n return {\n data: {\n activeUserCount: 0,\n maxUsersLimit: 0,\n },\n };\n }\n\n let response;\n try {\n response = await Client4.getUsersLimits();\n } catch (err) {\n forceLogoutIfNecessary(err, dispatch, getState);\n dispatch(logError(err));\n return {error: err as ServerError};\n }\n\n const data: UsersLimits = {\n activeUserCount: response?.data?.activeUserCount ?? 0,\n maxUsersLimit: response?.data?.maxUsersLimit ?? 0,\n };\n\n dispatch({type: LimitsTypes.RECIEVED_USERS_LIMITS, data});\n\n return {data};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport {PreferenceTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {getMyPreferences as getMyPreferencesSelector, makeGetCategory} from 'mattermost-redux/selectors/entities/preferences';\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {GetStateFunc, DispatchFunc, ActionFunc} from 'mattermost-redux/types/actions';\nimport {getPreferenceKey} from 'mattermost-redux/utils/preference_utils';\n\nimport {getChannelAndMyMember, getMyChannelMember} from './channels';\nimport {bindClientFunc} from './helpers';\nimport {getProfilesByIds, getProfilesInChannel} from './users';\n\nimport {Preferences} from '../constants';\n\nexport function deletePreferences(userId: string, preferences: PreferenceType[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const myPreferences = getMyPreferencesSelector(state);\n const currentPreferences = preferences.map((pref) => myPreferences[getPreferenceKey(pref.category, pref.name)]);\n\n (async function deletePreferencesWrapper() {\n try {\n dispatch({\n type: PreferenceTypes.DELETED_PREFERENCES,\n data: preferences,\n });\n\n await Client4.deletePreferences(userId, preferences);\n } catch {\n dispatch({\n type: PreferenceTypes.RECEIVED_PREFERENCES,\n data: currentPreferences,\n });\n }\n }());\n\n return {data: true};\n };\n}\n\nexport function getMyPreferences(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getMyPreferences,\n onSuccess: PreferenceTypes.RECEIVED_ALL_PREFERENCES,\n });\n}\n\nexport function makeDirectChannelVisibleIfNecessary(otherUserId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const myPreferences = getMyPreferencesSelector(state);\n const currentUserId = getCurrentUserId(state);\n\n let preference = myPreferences[getPreferenceKey(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, otherUserId)];\n\n if (!preference || preference.value === 'false') {\n preference = {\n user_id: currentUserId,\n category: Preferences.CATEGORY_DIRECT_CHANNEL_SHOW,\n name: otherUserId,\n value: 'true',\n };\n dispatch(getProfilesByIds([otherUserId]));\n dispatch(savePreferences(currentUserId, [preference]));\n }\n\n return {data: true};\n };\n}\n\nexport function makeGroupMessageVisibleIfNecessary(channelId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const myPreferences = getMyPreferencesSelector(state);\n const currentUserId = getCurrentUserId(state);\n const {channels} = state.entities.channels;\n\n let preference = myPreferences[getPreferenceKey(Preferences.CATEGORY_GROUP_CHANNEL_SHOW, channelId)];\n\n if (!preference || preference.value === 'false') {\n preference = {\n user_id: currentUserId,\n category: Preferences.CATEGORY_GROUP_CHANNEL_SHOW,\n name: channelId,\n value: 'true',\n };\n\n if (channels[channelId]) {\n dispatch(getMyChannelMember(channelId));\n } else {\n dispatch(getChannelAndMyMember(channelId));\n }\n\n dispatch(getProfilesInChannel(channelId, 0));\n dispatch(savePreferences(currentUserId, [preference]));\n }\n\n return {data: true};\n };\n}\n\nexport function setActionsMenuInitialisationState(initializationState: Record) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const preference: PreferenceType = {\n user_id: currentUserId,\n category: Preferences.CATEGORY_ACTIONS_MENU,\n name: Preferences.NAME_ACTIONS_MENU_TUTORIAL_STATE,\n value: JSON.stringify(initializationState),\n };\n await dispatch(savePreferences(currentUserId, [preference]));\n };\n}\n\nexport function setCustomStatusInitialisationState(initializationState: Record) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const preference: PreferenceType = {\n user_id: currentUserId,\n category: Preferences.CATEGORY_CUSTOM_STATUS,\n name: Preferences.NAME_CUSTOM_STATUS_TUTORIAL_STATE,\n value: JSON.stringify(initializationState),\n };\n await dispatch(savePreferences(currentUserId, [preference]));\n };\n}\n\nexport function savePreferences(userId: string, preferences: PreferenceType[]) {\n return async (dispatch: DispatchFunc) => {\n (async function savePreferencesWrapper() {\n try {\n dispatch({\n type: PreferenceTypes.RECEIVED_PREFERENCES,\n data: preferences,\n });\n\n await Client4.savePreferences(userId, preferences);\n } catch {\n dispatch({\n type: PreferenceTypes.DELETED_PREFERENCES,\n data: preferences,\n });\n }\n }());\n\n return {data: true};\n };\n}\n\nexport function saveTheme(teamId: string, theme: Theme): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const preference: PreferenceType = {\n user_id: currentUserId,\n category: Preferences.CATEGORY_THEME,\n name: teamId || '',\n value: JSON.stringify(theme),\n };\n\n await dispatch(savePreferences(currentUserId, [preference]));\n return {data: true};\n };\n}\n\nexport function deleteTeamSpecificThemes(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n\n const themePreferences: PreferenceType[] = makeGetCategory()(state, Preferences.CATEGORY_THEME);\n const currentUserId = getCurrentUserId(state);\n\n const toDelete = themePreferences.filter((pref) => pref.name !== '');\n if (toDelete.length > 0) {\n await dispatch(deletePreferences(currentUserId, toDelete));\n }\n\n return {data: true};\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {UsersWithGroupsAndCount} from '@mattermost/types/groups';\nimport type {ProductNotices} from '@mattermost/types/product_notices';\nimport type {Team, TeamMembership, TeamMemberWithError, GetTeamMembersOpts, TeamsWithCount, TeamSearchOpts, TeamStats, TeamInviteWithError, NotPagedTeamSearchOpts, PagedTeamSearchOpts} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {ChannelTypes, TeamTypes, UserTypes} from 'mattermost-redux/action_types';\nimport {selectChannel} from 'mattermost-redux/actions/channels';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {bindClientFunc, forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {loadRolesIfNeeded} from 'mattermost-redux/actions/roles';\nimport {getProfilesByIds, getStatusesByIds} from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\nimport {General} from 'mattermost-redux/constants';\nimport {isCompatibleWithJoinViewTeamPermissions} from 'mattermost-redux/selectors/entities/general';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {GetStateFunc, DispatchFunc, ActionFunc, ActionResult, NewActionFuncAsync} from 'mattermost-redux/types/actions';\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\n\nasync function getProfilesAndStatusesForMembers(userIds: string[], dispatch: DispatchFunc, getState: GetStateFunc) {\n const {\n currentUserId,\n profiles,\n statuses,\n } = getState().entities.users;\n const profilesToLoad: string[] = [];\n const statusesToLoad: string[] = [];\n userIds.forEach((userId) => {\n if (!profiles[userId] && !profilesToLoad.includes(userId) && userId !== currentUserId) {\n profilesToLoad.push(userId);\n }\n\n if (!statuses[userId] && !statusesToLoad.includes(userId) && userId !== currentUserId) {\n statusesToLoad.push(userId);\n }\n });\n const requests: Array> = [];\n\n if (profilesToLoad.length) {\n requests.push(dispatch(getProfilesByIds(profilesToLoad)));\n }\n\n if (statusesToLoad.length) {\n requests.push(dispatch(getStatusesByIds(statusesToLoad)));\n }\n\n await Promise.all(requests);\n}\n\nexport function selectTeam(team: Team | Team['id']) {\n const teamId = (typeof team === 'string') ? team : team.id;\n return {\n type: TeamTypes.SELECT_TEAM,\n data: teamId,\n };\n}\n\nexport function getMyTeams(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getMyTeams,\n onRequest: TeamTypes.MY_TEAMS_REQUEST,\n onSuccess: [TeamTypes.RECEIVED_TEAMS_LIST, TeamTypes.MY_TEAMS_SUCCESS],\n onFailure: TeamTypes.MY_TEAMS_FAILURE,\n });\n}\n\n// The argument skipCurrentTeam is a (not ideal) workaround for CRT mention counts. Unread mentions are stored in the reducer per\n// team but we do not track unread mentions for DMs/GMs independently. This results in a bit of funky logic and edge case bugs\n// that need workarounds like this. In the future we should fix the root cause with better APIs and redux state.\nexport function getMyTeamUnreads(collapsedThreads: boolean, skipCurrentTeam = false): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let unreads;\n try {\n unreads = await Client4.getMyTeamUnreads(collapsedThreads);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n if (skipCurrentTeam) {\n const currentTeamId = getCurrentTeamId(getState());\n if (currentTeamId) {\n const index = unreads.findIndex((member) => member.team_id === currentTeamId);\n if (index >= 0) {\n unreads.splice(index, 1);\n }\n }\n }\n\n dispatch(\n {\n type: TeamTypes.RECEIVED_MY_TEAM_UNREADS,\n data: unreads,\n },\n );\n\n return {data: unreads};\n };\n}\n\nexport function getTeam(teamId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getTeam,\n onSuccess: TeamTypes.RECEIVED_TEAM,\n params: [\n teamId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getTeamByName(teamName: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getTeamByName,\n onSuccess: TeamTypes.RECEIVED_TEAM,\n params: [\n teamName,\n ],\n });\n}\n\nexport function getTeams(page = 0, perPage: number = General.TEAMS_CHUNK_SIZE, includeTotalCount = false, excludePolicyConstrained = false): NewActionFuncAsync {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n\n dispatch({type: TeamTypes.GET_TEAMS_REQUEST, data});\n\n try {\n data = await Client4.getTeams(page, perPage, includeTotalCount, excludePolicyConstrained);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: TeamTypes.GET_TEAMS_FAILURE, data});\n dispatch(logError(error));\n return {error};\n }\n\n const actions: AnyAction[] = [\n {\n type: TeamTypes.RECEIVED_TEAMS_LIST,\n data: includeTotalCount ? (data as unknown as TeamsWithCount).teams : data,\n },\n {\n type: TeamTypes.GET_TEAMS_SUCCESS,\n data,\n },\n ];\n\n if (includeTotalCount) {\n actions.push({\n type: TeamTypes.RECEIVED_TOTAL_TEAM_COUNT,\n data: (data as unknown as TeamsWithCount).total_count,\n });\n }\n\n dispatch(batchActions(actions));\n\n return {data};\n };\n}\n\nexport function searchTeams(term: string, opts: PagedTeamSearchOpts): NewActionFuncAsync;\nexport function searchTeams(term: string, opts?: NotPagedTeamSearchOpts): NewActionFuncAsync;\nexport function searchTeams(term: string, opts: TeamSearchOpts = {}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: TeamTypes.GET_TEAMS_REQUEST, data: null});\n\n let response;\n try {\n response = await Client4.searchTeams(term, opts);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: TeamTypes.GET_TEAMS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n // The type of the response is determined by whether or not page/perPage were set\n let teams;\n if (!(opts as PagedTeamSearchOpts).page || !(opts as PagedTeamSearchOpts).per_page) {\n teams = response;\n } else {\n teams = response.teams;\n }\n\n dispatch(batchActions([\n {\n type: TeamTypes.RECEIVED_TEAMS_LIST,\n data: teams,\n },\n {\n type: TeamTypes.GET_TEAMS_SUCCESS,\n },\n ]));\n\n return {data: response};\n };\n}\n\nexport function createTeam(team: Team): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let created;\n try {\n created = await Client4.createTeam(team);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const member = {\n team_id: created.id,\n user_id: getState().entities.users.currentUserId,\n roles: `${General.TEAM_ADMIN_ROLE} ${General.TEAM_USER_ROLE}`,\n delete_at: 0,\n msg_count: 0,\n mention_count: 0,\n };\n\n dispatch(batchActions([\n {\n type: TeamTypes.CREATED_TEAM,\n data: created,\n },\n {\n type: TeamTypes.RECEIVED_MY_TEAM_MEMBER,\n data: member,\n },\n {\n type: TeamTypes.SELECT_TEAM,\n data: created.id,\n },\n ]));\n dispatch(loadRolesIfNeeded(member.roles.split(' ')));\n\n return {data: created};\n };\n}\n\nexport function deleteTeam(teamId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.deleteTeam(teamId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const entities = getState().entities;\n const {\n currentTeamId,\n } = entities.teams;\n const actions: AnyAction[] = [];\n if (teamId === currentTeamId) {\n EventEmitter.emit('leave_team');\n actions.push({type: ChannelTypes.SELECT_CHANNEL, data: ''});\n }\n\n actions.push(\n {\n type: TeamTypes.RECEIVED_TEAM_DELETED,\n data: {id: teamId},\n },\n );\n\n dispatch(batchActions(actions));\n\n return {data: true};\n };\n}\n\nexport function unarchiveTeam(teamId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let team: Team;\n try {\n team = await Client4.unarchiveTeam(teamId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: TeamTypes.RECEIVED_TEAM_UNARCHIVED,\n data: team,\n });\n\n return {data: true};\n };\n}\n\nexport function updateTeam(team: Team): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.updateTeam,\n onSuccess: TeamTypes.UPDATED_TEAM,\n params: [\n team,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function patchTeam(team: Partial & {id: string}): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.patchTeam,\n onSuccess: TeamTypes.PATCHED_TEAM,\n params: [\n team,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function regenerateTeamInviteId(teamId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.regenerateTeamInviteId,\n onSuccess: TeamTypes.REGENERATED_TEAM_INVITE_ID,\n params: [\n teamId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getMyTeamMembers(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const getMyTeamMembersFunc = bindClientFunc({\n clientFunc: Client4.getMyTeamMembers,\n onSuccess: TeamTypes.RECEIVED_MY_TEAM_MEMBERS,\n });\n const teamMembers = (await getMyTeamMembersFunc(dispatch, getState)) as ActionResult;\n\n if ('data' in teamMembers && teamMembers.data) {\n const roles = new Set();\n\n for (const teamMember of teamMembers.data) {\n for (const role of teamMember.roles.split(' ')) {\n roles.add(role);\n }\n }\n if (roles.size > 0) {\n dispatch(loadRolesIfNeeded([...roles]));\n }\n }\n\n return teamMembers;\n };\n}\n\nexport function getTeamMembers(teamId: string, page = 0, perPage: number = General.TEAMS_CHUNK_SIZE, options?: GetTeamMembersOpts): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getTeamMembers,\n onRequest: TeamTypes.GET_TEAM_MEMBERS_REQUEST,\n onSuccess: [TeamTypes.RECEIVED_MEMBERS_IN_TEAM, TeamTypes.GET_TEAM_MEMBERS_SUCCESS],\n onFailure: TeamTypes.GET_TEAM_MEMBERS_FAILURE,\n params: [\n teamId,\n page,\n perPage,\n options,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getTeamMember(teamId: string, userId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let member;\n try {\n const memberRequest = Client4.getTeamMember(teamId, userId);\n\n getProfilesAndStatusesForMembers([userId], dispatch, getState);\n\n member = await memberRequest;\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: TeamTypes.RECEIVED_MEMBERS_IN_TEAM,\n data: [member],\n });\n\n return {data: member};\n };\n}\n\nexport function getTeamMembersByIds(teamId: string, userIds: string[]): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let members;\n try {\n const membersRequest = Client4.getTeamMembersByIds(teamId, userIds);\n\n getProfilesAndStatusesForMembers(userIds, dispatch, getState);\n\n members = await membersRequest;\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: TeamTypes.RECEIVED_MEMBERS_IN_TEAM,\n data: members,\n });\n\n return {data: members};\n };\n}\n\nexport function getTeamsForUser(userId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getTeamsForUser,\n onRequest: TeamTypes.GET_TEAMS_REQUEST,\n onSuccess: [TeamTypes.RECEIVED_TEAMS_LIST, TeamTypes.GET_TEAMS_SUCCESS],\n onFailure: TeamTypes.GET_TEAMS_FAILURE,\n params: [\n userId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getTeamMembersForUser(userId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getTeamMembersForUser,\n onSuccess: TeamTypes.RECEIVED_TEAM_MEMBERS,\n params: [\n userId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getTeamStats(teamId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getTeamStats,\n onSuccess: TeamTypes.RECEIVED_TEAM_STATS,\n params: [\n teamId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function addUserToTeamFromInvite(token: string, inviteId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.addToTeamFromInvite,\n onRequest: TeamTypes.ADD_TO_TEAM_FROM_INVITE_REQUEST,\n onSuccess: TeamTypes.ADD_TO_TEAM_FROM_INVITE_SUCCESS,\n onFailure: TeamTypes.ADD_TO_TEAM_FROM_INVITE_FAILURE,\n params: [\n token,\n inviteId,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function addUserToTeam(teamId: string, userId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let member;\n try {\n member = await Client4.addToTeam(teamId, userId);\n } catch (error) {\n forceLogoutIfNecessary(error as ServerError, dispatch, getState);\n dispatch(logError(error as ServerError));\n return {error: error as ServerError};\n }\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILE_IN_TEAM,\n data: {id: teamId, user_id: userId},\n },\n {\n type: TeamTypes.RECEIVED_MEMBER_IN_TEAM,\n data: member,\n },\n ]));\n\n return {data: member};\n };\n}\n\nexport function addUsersToTeam(teamId: string, userIds: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let members;\n try {\n members = await Client4.addUsersToTeam(teamId, userIds);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const profiles: Array> = [];\n members.forEach((m: TeamMembership) => profiles.push({id: m.user_id}));\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_TEAM,\n data: profiles,\n id: teamId,\n },\n {\n type: TeamTypes.RECEIVED_MEMBERS_IN_TEAM,\n data: members,\n },\n ]));\n\n return {data: members};\n };\n}\n\nexport function addUsersToTeamGracefully(teamId: string, userIds: string[]): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let result: TeamMemberWithError[];\n try {\n result = await Client4.addUsersToTeamGracefully(teamId, userIds);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const addedMembers = result ? result.filter((m) => !m.error) : [];\n const profiles: Array> = addedMembers.map((m) => ({id: m.user_id}));\n const members = addedMembers.map((m) => m.member);\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_TEAM,\n data: profiles,\n id: teamId,\n },\n {\n type: TeamTypes.RECEIVED_MEMBERS_IN_TEAM,\n data: members,\n },\n ]));\n\n return {data: result};\n };\n}\n\nexport function removeUserFromTeam(teamId: string, userId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.removeFromTeam(teamId, userId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const member = {\n team_id: teamId,\n user_id: userId,\n };\n\n const actions: AnyAction[] = [\n {\n type: UserTypes.RECEIVED_PROFILE_NOT_IN_TEAM,\n data: {id: teamId, user_id: userId},\n },\n {\n type: TeamTypes.REMOVE_MEMBER_FROM_TEAM,\n data: member,\n },\n ];\n\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n\n if (userId === currentUserId) {\n const {channels, myMembers} = state.entities.channels;\n\n for (const channelMember of Object.values(myMembers)) {\n const channel = channels[channelMember.channel_id];\n\n if (channel && channel.team_id === teamId) {\n actions.push({\n type: ChannelTypes.LEAVE_CHANNEL,\n data: channel,\n });\n }\n }\n\n if (teamId === getCurrentTeamId(state)) {\n actions.push(selectChannel(''));\n }\n }\n\n dispatch(batchActions(actions));\n\n return {data: true};\n };\n}\n\nexport function updateTeamMemberRoles(teamId: string, userId: string, roles: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.updateTeamMemberRoles(teamId, userId, roles);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const membersInTeam = getState().entities.teams.membersInTeam[teamId];\n if (membersInTeam && membersInTeam[userId]) {\n dispatch({\n type: TeamTypes.RECEIVED_MEMBER_IN_TEAM,\n data: {...membersInTeam[userId], roles},\n });\n }\n\n return {data: true};\n };\n}\n\nexport function sendEmailInvitesToTeam(teamId: string, emails: string[]): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.sendEmailInvitesToTeam,\n params: [\n teamId,\n emails,\n ],\n });\n}\n\nexport function sendEmailGuestInvitesToChannels(teamId: string, channelIds: string[], emails: string[], message: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.sendEmailGuestInvitesToChannels,\n params: [\n teamId,\n channelIds,\n emails,\n message,\n ],\n });\n}\nexport function sendEmailInvitesToTeamGracefully(teamId: string, emails: string[]): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.sendEmailInvitesToTeamGracefully,\n params: [\n teamId,\n emails,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function sendEmailGuestInvitesToChannelsGracefully(teamId: string, channelIds: string[], emails: string[], message: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.sendEmailGuestInvitesToChannelsGracefully,\n params: [\n teamId,\n channelIds,\n emails,\n message,\n ],\n });\n}\n\nexport function sendEmailInvitesToTeamAndChannelsGracefully(\n teamId: string,\n channelIds: string[],\n emails: string[],\n message: string,\n): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.sendEmailInvitesToTeamAndChannelsGracefully,\n params: [\n teamId,\n channelIds,\n emails,\n message,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getTeamInviteInfo(inviteId: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getTeamInviteInfo,\n onRequest: TeamTypes.TEAM_INVITE_INFO_REQUEST,\n onSuccess: TeamTypes.TEAM_INVITE_INFO_SUCCESS,\n onFailure: TeamTypes.TEAM_INVITE_INFO_FAILURE,\n params: [\n inviteId,\n ],\n });\n}\n\nexport function checkIfTeamExists(teamName: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.checkIfTeamExists(teamName);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return {data: data.exists};\n };\n}\n\nexport function joinTeam(inviteId: string, teamId: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n dispatch({type: TeamTypes.JOIN_TEAM_REQUEST, data: null});\n\n const state = getState();\n try {\n if (isCompatibleWithJoinViewTeamPermissions(state)) {\n const currentUserId = state.entities.users.currentUserId;\n await Client4.addToTeam(teamId, currentUserId);\n } else {\n await Client4.joinTeam(inviteId);\n }\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: TeamTypes.JOIN_TEAM_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(getMyTeamUnreads(isCollapsedThreadsEnabled(state)));\n\n await Promise.all([\n dispatch(getTeam(teamId)),\n dispatch(getMyTeamMembers()),\n ]);\n\n dispatch({type: TeamTypes.JOIN_TEAM_SUCCESS, data: null});\n return {data: true};\n };\n}\n\nexport function setTeamIcon(teamId: string, imageData: File): NewActionFuncAsync {\n return async (dispatch) => {\n await Client4.setTeamIcon(teamId, imageData);\n const team = await Client4.getTeam(teamId);\n dispatch({\n type: TeamTypes.PATCHED_TEAM,\n data: team,\n });\n return {data: {status: 'OK'}};\n };\n}\n\nexport function removeTeamIcon(teamId: string): NewActionFuncAsync {\n return async (dispatch) => {\n await Client4.removeTeamIcon(teamId);\n const team = await Client4.getTeam(teamId);\n dispatch({\n type: TeamTypes.PATCHED_TEAM,\n data: team,\n });\n return {data: {status: 'OK'}};\n };\n}\n\nexport function updateTeamScheme(teamId: string, schemeId: string): NewActionFuncAsync<{teamId: string; schemeId: string}> {\n return bindClientFunc({\n clientFunc: async () => {\n await Client4.updateTeamScheme(teamId, schemeId);\n return {teamId, schemeId};\n },\n onSuccess: TeamTypes.UPDATED_TEAM_SCHEME,\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function updateTeamMemberSchemeRoles(\n teamId: string,\n userId: string,\n isSchemeUser: boolean,\n isSchemeAdmin: boolean,\n): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: async () => {\n await Client4.updateTeamMemberSchemeRoles(teamId, userId, isSchemeUser, isSchemeAdmin);\n return {teamId, userId, isSchemeUser, isSchemeAdmin};\n },\n onSuccess: TeamTypes.UPDATED_TEAM_MEMBER_SCHEME_ROLES,\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function invalidateAllEmailInvites(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.invalidateAllEmailInvites,\n });\n}\n\nexport function membersMinusGroupMembers(teamID: string, groupIDs: string[], page = 0, perPage: number = General.PROFILE_CHUNK_SIZE): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.teamMembersMinusGroupMembers,\n onSuccess: TeamTypes.RECEIVED_TEAM_MEMBERS_MINUS_GROUP_MEMBERS,\n params: [\n teamID,\n groupIDs,\n page,\n perPage,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getInProductNotices(teamId: string, client: string, clientVersion: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getInProductNotices,\n params: [\n teamId,\n client,\n clientVersion,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function updateNoticesAsViewed(noticeIds: string[]): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.updateNoticesAsViewed,\n params: [\n noticeIds,\n ],\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {uniq} from 'lodash';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserThread, UserThreadList} from '@mattermost/types/threads';\n\nimport {ThreadTypes, PostTypes, UserTypes} from 'mattermost-redux/action_types';\nimport {getMissingFilesByPosts} from 'mattermost-redux/actions/files';\nimport {getMissingProfilesByIds} from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\nimport ThreadConstants from 'mattermost-redux/constants/threads';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {makeGetPostsForThread} from 'mattermost-redux/selectors/entities/posts';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getThread as getThreadSelector, getThreadItemsInChannel} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport type {DispatchFunc, GetStateFunc} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\nimport {forceLogoutIfNecessary} from './helpers';\nimport {getPostThread} from './posts';\n\ntype ExtendedPost = Post & { system_post_ids?: string[] };\n\nexport function fetchThreads(userId: string, teamId: string, {before = '', after = '', perPage = ThreadConstants.THREADS_CHUNK_SIZE, unread = false, totalsOnly = false, threadsOnly = false, extended = false, since = 0} = {}) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data: undefined | UserThreadList;\n\n try {\n data = await Client4.getUserThreads(userId, teamId, {before, after, perPage, extended, unread, totalsOnly, threadsOnly, since});\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return {data};\n };\n}\n\nexport function getThreads(userId: string, teamId: string, {before = '', after = '', perPage = ThreadConstants.THREADS_CHUNK_SIZE, unread = false, extended = true} = {}) {\n return async (dispatch: DispatchFunc) => {\n const response = await dispatch(fetchThreads(userId, teamId, {before, after, perPage, unread, totalsOnly: false, threadsOnly: true, extended}));\n\n if (response.error) {\n return response;\n }\n\n const userThreadList: undefined | UserThreadList = response?.data;\n\n if (!userThreadList) {\n return {error: true};\n }\n\n if (userThreadList?.threads?.length) {\n await dispatch(getMissingProfilesByIds(uniq(userThreadList.threads.map(({participants}) => participants.map(({id}) => id)).flat())));\n\n dispatch({\n type: PostTypes.RECEIVED_POSTS,\n data: {posts: userThreadList.threads.map(({post}) => ({...post, update_at: 0}))},\n });\n\n dispatch(getMissingFilesByPosts(uniq(userThreadList.threads.map(({post}) => post))));\n }\n\n dispatch({\n type: unread ? ThreadTypes.RECEIVED_UNREAD_THREADS : ThreadTypes.RECEIVED_THREADS,\n data: {\n threads: userThreadList?.threads?.map((thread) => ({...thread, is_following: true})) ?? [],\n team_id: teamId,\n },\n });\n\n return {data: userThreadList};\n };\n}\n\nexport function getThreadCounts(userId: string, teamId: string) {\n return async (dispatch: DispatchFunc) => {\n const response = await dispatch(fetchThreads(userId, teamId, {totalsOnly: true, threadsOnly: false}));\n\n if (response.error) {\n return response;\n }\n\n const counts: undefined | UserThreadList = response?.data;\n if (!counts) {\n return {error: true};\n }\n\n const data = {\n total: counts.total,\n total_unread_threads: counts.total_unread_threads,\n total_unread_mentions: counts.total_unread_mentions,\n total_unread_urgent_mentions: counts.total_unread_urgent_mentions,\n };\n\n dispatch({\n type: ThreadTypes.RECEIVED_THREAD_COUNTS,\n data: {\n ...data,\n team_id: teamId,\n },\n });\n\n return {data};\n };\n}\n\nexport function getCountsAndThreadsSince(userId: string, teamId: string, since?: number) {\n return async (dispatch: DispatchFunc) => {\n const response = await dispatch(fetchThreads(userId, teamId, {since, totalsOnly: false, threadsOnly: false, extended: true}));\n\n if (response.error) {\n return response;\n }\n\n const userThreadList: undefined | UserThreadList = response?.data;\n if (!userThreadList) {\n return {error: true};\n }\n\n const actions = [];\n\n if (userThreadList?.threads?.length) {\n await dispatch(getMissingProfilesByIds(uniq(userThreadList.threads.map(({participants}) => participants.map(({id}) => id)).flat())));\n actions.push({\n type: PostTypes.RECEIVED_POSTS,\n data: {posts: userThreadList.threads.map(({post}) => ({...post, update_at: 0}))},\n });\n }\n\n actions.push({\n type: ThreadTypes.RECEIVED_THREADS,\n data: {\n threads: userThreadList?.threads?.map((thread) => ({...thread, is_following: true})) ?? [],\n team_id: teamId,\n },\n });\n\n const counts = {\n total: userThreadList.total,\n total_unread_threads: userThreadList.total_unread_threads,\n total_unread_mentions: userThreadList.total_unread_mentions,\n total_unread_urgent_mentions: userThreadList.total_unread_urgent_mentions,\n };\n\n actions.push({\n type: ThreadTypes.RECEIVED_THREAD_COUNTS,\n data: {\n ...counts,\n team_id: teamId,\n },\n });\n\n dispatch(batchActions(actions));\n\n return {data: userThreadList};\n };\n}\n\nexport function handleThreadArrived(dispatch: DispatchFunc, getState: GetStateFunc, threadData: UserThread, teamId: string, previousUnreadReplies?: number, previousUnreadMentions?: number) {\n const state = getState();\n const currentUserId = getCurrentUserId(state);\n const crtEnabled = isCollapsedThreadsEnabled(state);\n const thread = {...threadData, is_following: true};\n\n dispatch({\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: thread.participants.filter((user) => user.id !== currentUserId),\n });\n\n dispatch({\n type: PostTypes.RECEIVED_POST,\n data: {...thread.post, update_at: 0},\n features: {crtEnabled},\n });\n\n dispatch({\n type: ThreadTypes.RECEIVED_THREAD,\n data: {\n thread,\n team_id: teamId,\n },\n });\n\n const oldThreadData = state.entities.threads.threads[threadData.id];\n\n // update thread read if and only if we have previous unread values\n // upon receiving a thread.\n // we need that guard to ensure that fetching a thread won't skew the counts\n //\n // PS: websocket events should always provide the previous unread values\n if (\n (previousUnreadMentions != null && previousUnreadReplies != null) ||\n oldThreadData != null\n ) {\n dispatch(\n handleReadChanged(\n thread.id,\n teamId,\n thread.post.channel_id,\n {\n lastViewedAt: thread.last_viewed_at,\n prevUnreadMentions: oldThreadData?.unread_mentions ?? previousUnreadMentions,\n newUnreadMentions: thread.unread_mentions,\n prevUnreadReplies: oldThreadData?.unread_replies ?? previousUnreadReplies,\n newUnreadReplies: thread.unread_replies,\n },\n ),\n );\n }\n\n return thread;\n}\n\nexport function getThread(userId: string, teamId: string, threadId: string, extended = true) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let thread;\n try {\n thread = await Client4.getUserThread(userId, teamId, threadId, extended);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n if (thread) {\n thread = handleThreadArrived(dispatch, getState, thread, teamId);\n }\n\n return {data: thread};\n };\n}\n\nexport function handleAllMarkedRead(dispatch: DispatchFunc, teamId: string) {\n dispatch({\n type: ThreadTypes.ALL_TEAM_THREADS_READ,\n data: {\n team_id: teamId,\n },\n });\n}\n\nexport function markAllThreadsInTeamRead(userId: string, teamId: string) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.updateThreadsReadForUser(userId, teamId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n handleAllMarkedRead(dispatch, teamId);\n\n return {};\n };\n}\n\nexport function markThreadAsUnread(userId: string, teamId: string, threadId: string, postId: string) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.markThreadAsUnreadForUser(userId, teamId, threadId, postId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return {};\n };\n}\n\nexport function markLastPostInThreadAsUnread(userId: string, teamId: string, threadId: string) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const getPostsForThread = makeGetPostsForThread();\n let posts = getPostsForThread(getState(), threadId);\n\n const state = getState();\n const thread = getThreadSelector(state, threadId);\n\n // load posts in thread if they are not loaded already\n if (thread?.reply_count === posts.length - 1) {\n dispatch(markThreadAsUnread(userId, teamId, threadId, posts[0].id));\n } else {\n dispatch(getPostThread(threadId)).then(({data, error}) => {\n if (data) {\n posts = getPostsForThread(getState(), threadId);\n dispatch(markThreadAsUnread(userId, teamId, threadId, posts[0].id));\n } else if (error) {\n return {error};\n }\n return {};\n });\n }\n\n return {};\n };\n}\n\nexport function updateThreadRead(userId: string, teamId: string, threadId: string, timestamp: number) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.updateThreadReadForUser(userId, teamId, threadId, timestamp);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n return {};\n };\n}\n\nexport function handleReadChanged(\n threadId: string,\n teamId: string,\n channelId: string,\n {\n lastViewedAt,\n prevUnreadMentions,\n newUnreadMentions,\n prevUnreadReplies,\n newUnreadReplies,\n }: {\n lastViewedAt: number;\n prevUnreadMentions: number;\n newUnreadMentions: number;\n prevUnreadReplies: number;\n newUnreadReplies: number;\n },\n) {\n return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const channel = getChannel(state, channelId);\n const thread = getThreadSelector(state, threadId);\n\n return dispatch({\n type: ThreadTypes.READ_CHANGED_THREAD,\n data: {\n id: threadId,\n teamId,\n channelId,\n lastViewedAt,\n prevUnreadMentions,\n newUnreadMentions,\n prevUnreadReplies,\n newUnreadReplies,\n channelType: channel?.type,\n isUrgent: thread?.is_urgent,\n },\n });\n };\n}\n\nexport function handleFollowChanged(dispatch: DispatchFunc, threadId: string, teamId: string, following: boolean) {\n dispatch({\n type: ThreadTypes.FOLLOW_CHANGED_THREAD,\n data: {\n id: threadId,\n team_id: teamId,\n following,\n },\n });\n}\n\nexport function setThreadFollow(userId: string, teamId: string, threadId: string, newState: boolean) {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n handleFollowChanged(dispatch, threadId, teamId, newState);\n\n try {\n await Client4.updateThreadFollowForUser(userId, teamId, threadId, newState);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n return {};\n };\n}\n\nexport function handleAllThreadsInChannelMarkedRead(dispatch: DispatchFunc, getState: GetStateFunc, channelId: string, lastViewedAt: number) {\n const state = getState();\n const threadsInChannel = getThreadItemsInChannel(state, channelId);\n const channel = getChannel(state, channelId);\n if (channel == null) {\n return;\n }\n const teamId = channel.team_id;\n const actions = [];\n\n for (const thread of threadsInChannel) {\n actions.push({\n type: ThreadTypes.READ_CHANGED_THREAD,\n data: {\n id: thread.id,\n channelId,\n teamId,\n lastViewedAt,\n newUnreadMentions: 0,\n newUnreadReplies: 0,\n isUrgent: thread.is_urgent,\n },\n });\n }\n\n dispatch(batchActions(actions));\n}\n\nexport function decrementThreadCounts(post: ExtendedPost) {\n return (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const thread = getThreadSelector(state, post.id);\n\n if (!thread || (!thread.unread_replies && !thread.unread_mentions)) {\n return {data: false};\n }\n\n const channel = getChannel(state, post.channel_id);\n const teamId = channel?.team_id || getCurrentTeamId(state);\n\n return dispatch({\n type: ThreadTypes.DECREMENT_THREAD_COUNTS,\n teamId,\n replies: thread.unread_replies,\n mentions: thread.unread_mentions,\n channelType: channel.type,\n });\n };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {AnyAction} from 'redux';\nimport {batchActions} from 'redux-batched-actions';\n\nimport type {UserAutocomplete} from '@mattermost/types/autocomplete';\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {TermsOfService} from '@mattermost/types/terms_of_service';\nimport type {UserProfile, UserStatus, GetFilteredUsersStatsOpts, UsersStats, UserCustomStatus, UserAccessToken, AuthChangeResponse} from '@mattermost/types/users';\n\nimport {UserTypes, AdminTypes} from 'mattermost-redux/action_types';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {setServerVersion, getClientConfig, getLicenseConfig} from 'mattermost-redux/actions/general';\nimport {bindClientFunc, forceLogoutIfNecessary, debounce} from 'mattermost-redux/actions/helpers';\nimport {getUsersLimits} from 'mattermost-redux/actions/limits';\nimport {getMyPreferences} from 'mattermost-redux/actions/preferences';\nimport {loadRolesIfNeeded} from 'mattermost-redux/actions/roles';\nimport {getMyTeams, getMyTeamMembers, getMyTeamUnreads} from 'mattermost-redux/actions/teams';\nimport {Client4} from 'mattermost-redux/client';\nimport {General} from 'mattermost-redux/constants';\nimport {getServerVersion} from 'mattermost-redux/selectors/entities/general';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId, getUsers} from 'mattermost-redux/selectors/entities/users';\nimport type {ActionFunc, DispatchFunc, GetStateFunc, NewActionFuncAsync} from 'mattermost-redux/types/actions';\nimport {isMinimumServerVersion} from 'mattermost-redux/utils/helpers';\n\nexport function generateMfaSecret(userId: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.generateMfaSecret,\n params: [\n userId,\n ],\n });\n}\n\nexport function createUser(user: UserProfile, token: string, inviteId: string, redirect: string): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let created;\n\n try {\n created = await Client4.createUser(user, token, inviteId, redirect);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const profiles: {\n [userId: string]: UserProfile;\n } = {\n [created.id]: created,\n };\n dispatch({type: UserTypes.RECEIVED_PROFILES, data: profiles});\n\n return {data: created};\n };\n}\n\nexport function loadMe(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n // Sometimes the server version is set in one or the other\n const serverVersion = getState().entities.general.serverVersion || Client4.getServerVersion();\n dispatch(setServerVersion(serverVersion));\n\n try {\n await Promise.all([\n dispatch(getClientConfig()),\n dispatch(getLicenseConfig()),\n dispatch(getMe()),\n dispatch(getMyPreferences()),\n dispatch(getMyTeams()),\n dispatch(getMyTeamMembers()),\n ]);\n\n const isCollapsedThreads = isCollapsedThreadsEnabled(getState());\n await dispatch(getMyTeamUnreads(isCollapsedThreads));\n\n await dispatch(getUsersLimits());\n } catch (error) {\n dispatch(logError(error as ServerError));\n return {error: error as ServerError};\n }\n\n return {data: true};\n };\n}\n\nexport function logout(): ActionFunc {\n return async (dispatch: DispatchFunc) => {\n dispatch({type: UserTypes.LOGOUT_REQUEST, data: null});\n\n try {\n await Client4.logout();\n } catch (error) {\n // nothing to do here\n }\n\n dispatch({type: UserTypes.LOGOUT_SUCCESS, data: null});\n\n return {data: true};\n };\n}\n\nexport function getTotalUsersStats(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getTotalUsersStats,\n onSuccess: UserTypes.RECEIVED_USER_STATS,\n });\n}\n\nexport function getFilteredUsersStats(options: GetFilteredUsersStatsOpts = {}, updateGlobalState = true): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let stats: UsersStats;\n try {\n stats = await Client4.getFilteredUsersStats(options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n if (updateGlobalState) {\n dispatch({\n type: UserTypes.RECEIVED_FILTERED_USER_STATS,\n data: stats,\n });\n }\n\n return {data: stats};\n };\n}\n\nexport function getProfiles(page = 0, perPage: number = General.PROFILE_CHUNK_SIZE, options: any = {}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles: UserProfile[];\n\n try {\n profiles = await Client4.getProfiles(page, perPage, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n });\n\n return {data: profiles};\n };\n}\n\nexport function getMissingProfilesByIds(userIds: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const {profiles} = getState().entities.users;\n const missingIds: string[] = [];\n userIds.forEach((id) => {\n if (!profiles[id]) {\n missingIds.push(id);\n }\n });\n\n if (missingIds.length > 0) {\n dispatch(getStatusesByIds(missingIds));\n return dispatch(getProfilesByIds(missingIds));\n }\n\n return {data: []};\n };\n}\n\nexport function getMissingProfilesByUsernames(usernames: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const {profiles} = getState().entities.users;\n\n const usernameProfiles = Object.values(profiles).reduce((acc, profile: any) => {\n acc[profile.username] = profile;\n return acc;\n }, {} as Record);\n const missingUsernames: string[] = [];\n usernames.forEach((username) => {\n if (!usernameProfiles[username]) {\n missingUsernames.push(username);\n }\n });\n\n if (missingUsernames.length > 0) {\n return dispatch(getProfilesByUsernames(missingUsernames));\n }\n\n return {data: []};\n };\n}\n\nexport function getProfilesByIds(userIds: string[], options?: any): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let profiles: UserProfile[];\n\n try {\n profiles = await Client4.getProfilesByIds(userIds, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n });\n\n return {data: profiles};\n };\n}\n\nexport function getProfilesByUsernames(usernames: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let profiles;\n\n try {\n profiles = await Client4.getProfilesByUsernames(usernames);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n });\n\n return {data: profiles};\n };\n}\n\nexport function getProfilesInTeam(teamId: string, page: number, perPage: number = General.PROFILE_CHUNK_SIZE, sort = '', options: any = {}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n\n try {\n profiles = await Client4.getProfilesInTeam(teamId, page, perPage, sort, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_TEAM,\n data: profiles,\n id: teamId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport function getProfilesNotInTeam(teamId: string, groupConstrained: boolean, page: number, perPage: number = General.PROFILE_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n try {\n profiles = await Client4.getProfilesNotInTeam(teamId, groupConstrained, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const receivedProfilesListActionType = groupConstrained ? UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_TEAM_AND_REPLACE : UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_TEAM;\n\n dispatch(batchActions([\n {\n type: receivedProfilesListActionType,\n data: profiles,\n id: teamId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport function getProfilesWithoutTeam(page: number, perPage: number = General.PROFILE_CHUNK_SIZE, options: any = {}): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let profiles = null;\n try {\n profiles = await Client4.getProfilesWithoutTeam(page, perPage, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_WITHOUT_TEAM,\n data: profiles,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport enum ProfilesInChannelSortBy {\n None = '',\n Admin = 'admin',\n}\n\nexport function getProfilesInChannel(channelId: string, page: number, perPage: number = General.PROFILE_CHUNK_SIZE, sort = '', options: {active?: boolean} = {}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n\n try {\n profiles = await Client4.getProfilesInChannel(channelId, page, perPage, sort, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL,\n data: profiles,\n id: channelId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport function getProfilesInGroupChannels(channelsIds: string[]): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let channelProfiles;\n\n try {\n channelProfiles = await Client4.getProfilesInGroupChannels(channelsIds.slice(0, General.MAX_GROUP_CHANNELS_FOR_PROFILES));\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const actions: AnyAction[] = [];\n for (const channelId in channelProfiles) {\n if (channelProfiles.hasOwnProperty(channelId)) {\n const profiles = channelProfiles[channelId];\n\n actions.push(\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL,\n data: profiles,\n id: channelId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n );\n }\n }\n\n dispatch(batchActions(actions));\n\n return {data: channelProfiles};\n };\n}\n\nexport function getProfilesNotInChannel(teamId: string, channelId: string, groupConstrained: boolean, page: number, perPage: number = General.PROFILE_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n\n try {\n profiles = await Client4.getProfilesNotInChannel(teamId, channelId, groupConstrained, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const receivedProfilesListActionType = groupConstrained ? UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_CHANNEL_AND_REPLACE : UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_CHANNEL;\n\n dispatch(batchActions([\n {\n type: receivedProfilesListActionType,\n data: profiles,\n id: channelId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport function getMe(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const getMeFunc = bindClientFunc({\n clientFunc: Client4.getMe,\n onSuccess: UserTypes.RECEIVED_ME,\n });\n const me = await getMeFunc(dispatch, getState);\n\n if ('error' in me) {\n return me;\n }\n if ('data' in me) {\n dispatch(loadRolesIfNeeded(me.data.roles.split(' ')));\n }\n return me;\n };\n}\n\nexport function updateMyTermsOfServiceStatus(termsOfServiceId: string, accepted: boolean): NewActionFuncAsync {\n return async (dispatch, getState) => {\n const response = await dispatch(bindClientFunc({\n clientFunc: Client4.updateMyTermsOfServiceStatus,\n params: [\n termsOfServiceId,\n accepted,\n ],\n })) as any; // HARRISONTODO Type bindClientFunc\n\n if ('data' in response) {\n if (accepted) {\n dispatch({\n type: UserTypes.RECEIVED_TERMS_OF_SERVICE_STATUS,\n data: {\n terms_of_service_create_at: new Date().getTime(),\n terms_of_service_id: accepted ? termsOfServiceId : null,\n user_id: getCurrentUserId(getState()),\n },\n });\n }\n\n return {\n data: response.data,\n };\n }\n\n return {\n error: response.error,\n };\n };\n}\n\nexport function getProfilesInGroup(groupId: string, page = 0, perPage: number = General.PROFILE_CHUNK_SIZE, sort = ''): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n\n try {\n profiles = await Client4.getProfilesInGroup(groupId, page, perPage, sort);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_GROUP,\n data: profiles,\n id: groupId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport function getProfilesNotInGroup(groupId: string, page = 0, perPage: number = General.PROFILE_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n\n try {\n profiles = await Client4.getProfilesNotInGroup(groupId, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_GROUP,\n data: profiles,\n id: groupId,\n },\n {\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: profiles,\n },\n ]));\n\n return {data: profiles};\n };\n}\n\nexport function getTermsOfService(): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getTermsOfService,\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function promoteGuestToUser(userId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.promoteGuestToUser,\n params: [userId],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function demoteUserToGuest(userId: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.demoteUserToGuest,\n params: [userId],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function createTermsOfService(text: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.createTermsOfService,\n params: [\n text,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getUser(id: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.getUser,\n onSuccess: UserTypes.RECEIVED_PROFILE,\n params: [\n id,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function getUserByUsername(username: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getUserByUsername,\n onSuccess: UserTypes.RECEIVED_PROFILE,\n params: [\n username,\n ],\n });\n}\n\nexport function getUserByEmail(email: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getUserByEmail,\n onSuccess: UserTypes.RECEIVED_PROFILE,\n params: [\n email,\n ],\n });\n}\n\n// We create an array to hold the id's that we want to get a status for. We build our\n// debounced function that will get called after a set period of idle time in which\n// the array of id's will be passed to the getStatusesByIds with a cb that clears out\n// the array. Helps with performance because instead of making 75 different calls for\n// statuses, we are only making one call for 75 ids.\n// We could maybe clean it up somewhat by storing the array of ids in redux state possbily?\nlet ids: string[] = [];\nconst debouncedGetStatusesByIds = debounce(async (dispatch: DispatchFunc) => {\n dispatch(getStatusesByIds([...new Set(ids)]));\n}, 20, false, () => {\n ids = [];\n});\nexport function getStatusesByIdsBatchedDebounced(id: string) {\n ids = [...ids, id];\n return debouncedGetStatusesByIds;\n}\n\nexport function getStatusesByIds(userIds: string[]): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getStatusesByIds,\n onSuccess: UserTypes.RECEIVED_STATUSES,\n params: [\n userIds,\n ],\n });\n}\n\nexport function getStatus(userId: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getStatus,\n onSuccess: UserTypes.RECEIVED_STATUS,\n params: [\n userId,\n ],\n });\n}\n\nexport function setStatus(status: UserStatus): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.updateStatus(status);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.RECEIVED_STATUS,\n data: status,\n });\n\n return {data: status};\n };\n}\n\nexport function setCustomStatus(customStatus: UserCustomStatus): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.updateCustomStatus,\n params: [\n customStatus,\n ],\n });\n}\n\nexport function unsetCustomStatus(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.unsetCustomStatus,\n });\n}\n\nexport function removeRecentCustomStatus(customStatus: UserCustomStatus): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.removeRecentCustomStatus,\n params: [\n customStatus,\n ],\n });\n}\n\nexport function getSessions(userId: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getSessions,\n onSuccess: UserTypes.RECEIVED_SESSIONS,\n params: [\n userId,\n ],\n });\n}\n\nexport function revokeSession(userId: string, sessionId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.revokeSession(userId, sessionId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.RECEIVED_REVOKED_SESSION,\n sessionId,\n data: null,\n });\n\n return {data: true};\n };\n}\n\nexport function revokeAllSessionsForUser(userId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.revokeAllSessionsForUser(userId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n const data = {isCurrentUser: userId === getCurrentUserId(getState())};\n dispatch(batchActions([\n {\n type: UserTypes.REVOKE_ALL_USER_SESSIONS_SUCCESS,\n data,\n },\n ]));\n\n return {data: true};\n };\n}\n\nexport function revokeSessionsForAllUsers(): ActionFunc {\n return async (dispatch, getState) => {\n try {\n await Client4.revokeSessionsForAllUsers();\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error: error as ServerError};\n }\n\n dispatch({\n type: UserTypes.REVOKE_SESSIONS_FOR_ALL_USERS_SUCCESS,\n data: null,\n });\n\n return {data: true};\n };\n}\n\nexport function getUserAudits(userId: string, page = 0, perPage: number = General.AUDITS_CHUNK_SIZE): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getUserAudits,\n onSuccess: UserTypes.RECEIVED_AUDITS,\n params: [\n userId,\n page,\n perPage,\n ],\n });\n}\n\nexport function autocompleteUsers(term: string, teamId = '', channelId = '', options?: {\n limit: number;\n}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n dispatch({type: UserTypes.AUTOCOMPLETE_USERS_REQUEST, data: null});\n let data;\n try {\n data = await Client4.autocompleteUsers(term, teamId, channelId, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch({type: UserTypes.AUTOCOMPLETE_USERS_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n let users = [...data.users];\n if (data.out_of_channel) {\n users = [...users, ...data.out_of_channel];\n }\n const actions: AnyAction[] = [{\n type: UserTypes.RECEIVED_PROFILES_LIST,\n data: users,\n }, {\n type: UserTypes.AUTOCOMPLETE_USERS_SUCCESS,\n }];\n\n if (channelId) {\n actions.push(\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL,\n data: data.users,\n id: channelId,\n },\n );\n actions.push(\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_CHANNEL,\n data: data.out_of_channel || [],\n id: channelId,\n },\n );\n }\n\n if (teamId) {\n actions.push(\n {\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_TEAM,\n data: users,\n id: teamId,\n },\n );\n }\n\n dispatch(batchActions(actions));\n\n return {data};\n };\n}\n\nexport function searchProfiles(term: string, options: any = {}): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let profiles;\n try {\n profiles = await Client4.searchUsers(term, options);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const actions: AnyAction[] = [{type: UserTypes.RECEIVED_PROFILES_LIST, data: profiles}];\n\n if (options.in_channel_id) {\n actions.push({\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_CHANNEL,\n data: profiles,\n id: options.in_channel_id,\n });\n }\n\n if (options.not_in_channel_id) {\n actions.push({\n type: UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_CHANNEL,\n data: profiles,\n id: options.not_in_channel_id,\n });\n }\n\n if (options.team_id) {\n actions.push({\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_TEAM,\n data: profiles,\n id: options.team_id,\n });\n }\n\n if (options.not_in_team_id) {\n actions.push({\n type: UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_TEAM,\n data: profiles,\n id: options.not_in_team_id,\n });\n }\n\n if (options.in_group_id) {\n actions.push({\n type: UserTypes.RECEIVED_PROFILES_LIST_IN_GROUP,\n data: profiles,\n id: options.in_group_id,\n });\n }\n\n if (options.not_in_group_id) {\n actions.push({\n type: UserTypes.RECEIVED_PROFILES_LIST_NOT_IN_GROUP,\n data: profiles,\n id: options.not_in_group_id,\n });\n }\n\n dispatch(batchActions(actions));\n\n return {data: profiles};\n };\n}\n\nlet statusIntervalId: NodeJS.Timeout|null;\nexport function startPeriodicStatusUpdates(): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n if (statusIntervalId) {\n clearInterval(statusIntervalId);\n }\n\n statusIntervalId = setInterval(\n () => {\n const {statuses} = getState().entities.users;\n\n if (!statuses) {\n return;\n }\n\n const userIds = Object.keys(statuses);\n if (!userIds.length) {\n return;\n }\n\n dispatch(getStatusesByIds(userIds));\n },\n General.STATUS_INTERVAL,\n );\n\n return {data: true};\n };\n}\n\nexport function stopPeriodicStatusUpdates(): ActionFunc {\n return async () => {\n if (statusIntervalId) {\n clearInterval(statusIntervalId);\n }\n\n return {data: true};\n };\n}\n\nexport function updateMe(user: Partial): NewActionFuncAsync {\n return async (dispatch) => {\n dispatch({type: UserTypes.UPDATE_ME_REQUEST, data: null});\n\n let data;\n try {\n data = await Client4.patchMe(user);\n } catch (error) {\n dispatch({type: UserTypes.UPDATE_ME_FAILURE, error});\n dispatch(logError(error));\n return {error};\n }\n\n dispatch(batchActions([\n {type: UserTypes.RECEIVED_ME, data},\n {type: UserTypes.UPDATE_ME_SUCCESS},\n ]));\n dispatch(loadRolesIfNeeded(data.roles.split(' ')));\n\n return {data};\n };\n}\n\nexport function patchUser(user: UserProfile): NewActionFuncAsync {\n return async (dispatch) => {\n let data: UserProfile;\n try {\n data = await Client4.patchUser(user);\n } catch (error) {\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({type: UserTypes.RECEIVED_PROFILE, data});\n\n return {data};\n };\n}\n\nexport function updateUserRoles(userId: string, roles: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.updateUserRoles(userId, roles);\n } catch (error) {\n return {error};\n }\n\n const profile = getState().entities.users.profiles[userId];\n if (profile) {\n dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...profile, roles}});\n }\n\n return {data: true};\n };\n}\n\nexport function updateUserMfa(userId: string, activate: boolean, code = ''): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n try {\n await Client4.updateUserMfa(userId, activate, code);\n } catch (error) {\n dispatch(logError(error));\n return {error};\n }\n\n const profile = getState().entities.users.profiles[userId];\n if (profile) {\n dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...profile, mfa_active: activate}});\n }\n\n return {data: true};\n };\n}\n\nexport function updateUserPassword(userId: string, currentPassword: string, newPassword: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.updateUserPassword(userId, currentPassword, newPassword);\n } catch (error) {\n dispatch(logError(error));\n return {error};\n }\n\n const profile = getState().entities.users.profiles[userId];\n if (profile) {\n dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...profile, last_password_update_at: new Date().getTime()}});\n }\n\n return {data: true};\n };\n}\n\nexport function updateUserActive(userId: string, active: boolean): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.updateUserActive(userId, active);\n } catch (error) {\n dispatch(logError(error));\n return {error};\n }\n\n const profile = getState().entities.users.profiles[userId];\n if (profile) {\n const deleteAt = active ? 0 : new Date().getTime();\n dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...profile, delete_at: deleteAt}});\n }\n\n return {data: true};\n };\n}\n\nexport function verifyUserEmail(token: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.verifyUserEmail,\n params: [\n token,\n ],\n });\n}\n\nexport function sendVerificationEmail(email: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.sendVerificationEmail,\n params: [\n email,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function resetUserPassword(token: string, newPassword: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.resetUserPassword,\n params: [\n token,\n newPassword,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function sendPasswordResetEmail(email: string): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.sendPasswordResetEmail,\n params: [\n email,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function setDefaultProfileImage(userId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.setDefaultProfileImage(userId);\n } catch (error) {\n dispatch(logError(error));\n return {error};\n }\n\n const profile = getState().entities.users.profiles[userId];\n if (profile) {\n dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...profile, last_picture_update: 0}});\n }\n\n return {data: true};\n };\n}\n\nexport function uploadProfileImage(userId: string, imageData: any): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.uploadProfileImage(userId, imageData);\n } catch (error) {\n return {error};\n }\n\n const profile = getState().entities.users.profiles[userId];\n if (profile) {\n dispatch({type: UserTypes.RECEIVED_PROFILE, data: {...profile, last_picture_update: new Date().getTime()}});\n }\n\n return {data: true};\n };\n}\n\nexport function switchEmailToOAuth(service: string, email: string, password: string, mfaCode = ''): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.switchEmailToOAuth,\n params: [\n service,\n email,\n password,\n mfaCode,\n ],\n });\n}\n\nexport function switchOAuthToEmail(currentService: string, email: string, password: string): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.switchOAuthToEmail,\n params: [\n currentService,\n email,\n password,\n ],\n });\n}\n\nexport function switchEmailToLdap(email: string, emailPassword: string, ldapId: string, ldapPassword: string, mfaCode = ''): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.switchEmailToLdap,\n params: [\n email,\n emailPassword,\n ldapId,\n ldapPassword,\n mfaCode,\n ],\n });\n}\n\nexport function switchLdapToEmail(ldapPassword: string, email: string, emailPassword: string, mfaCode = ''): NewActionFuncAsync {\n return bindClientFunc({\n clientFunc: Client4.switchLdapToEmail,\n params: [\n ldapPassword,\n email,\n emailPassword,\n mfaCode,\n ],\n }) as any; // HARRISONTODO Type bindClientFunc\n}\n\nexport function createUserAccessToken(userId: string, description: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n\n try {\n data = await Client4.createUserAccessToken(userId, description);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const actions: AnyAction[] = [{\n type: AdminTypes.RECEIVED_USER_ACCESS_TOKEN,\n data: {...data,\n token: '',\n },\n }];\n\n const {currentUserId} = getState().entities.users;\n if (userId === currentUserId) {\n actions.push(\n {\n type: UserTypes.RECEIVED_MY_USER_ACCESS_TOKEN,\n data: {...data, token: ''},\n },\n );\n }\n\n dispatch(batchActions(actions));\n\n return {data};\n };\n}\n\nexport function getUserAccessToken(tokenId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getUserAccessToken(tokenId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const actions: AnyAction[] = [{\n type: AdminTypes.RECEIVED_USER_ACCESS_TOKEN,\n data,\n }];\n\n const {currentUserId} = getState().entities.users;\n if (data.user_id === currentUserId) {\n actions.push(\n {\n type: UserTypes.RECEIVED_MY_USER_ACCESS_TOKEN,\n data,\n },\n );\n }\n\n dispatch(batchActions(actions));\n\n return {data};\n };\n}\n\nexport function getUserAccessTokens(page = 0, perPage: number = General.PROFILE_CHUNK_SIZE): ActionFunc {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n let data;\n\n try {\n data = await Client4.getUserAccessTokens(page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: AdminTypes.RECEIVED_USER_ACCESS_TOKENS,\n data,\n });\n\n return {data};\n };\n}\n\nexport function getUserAccessTokensForUser(userId: string, page = 0, perPage: number = General.PROFILE_CHUNK_SIZE): NewActionFuncAsync {\n return async (dispatch, getState) => {\n let data;\n try {\n data = await Client4.getUserAccessTokensForUser(userId, page, perPage);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n const actions: AnyAction[] = [{\n type: AdminTypes.RECEIVED_USER_ACCESS_TOKENS_FOR_USER,\n data,\n userId,\n }];\n\n const {currentUserId} = getState().entities.users;\n if (userId === currentUserId) {\n actions.push(\n {\n type: UserTypes.RECEIVED_MY_USER_ACCESS_TOKENS,\n data,\n },\n );\n }\n\n dispatch(batchActions(actions));\n\n return {data};\n };\n}\n\nexport function revokeUserAccessToken(tokenId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.revokeUserAccessToken(tokenId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.REVOKED_USER_ACCESS_TOKEN,\n data: tokenId,\n });\n\n return {data: true};\n };\n}\n\nexport function disableUserAccessToken(tokenId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.disableUserAccessToken(tokenId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.DISABLED_USER_ACCESS_TOKEN,\n data: tokenId,\n });\n\n return {data: true};\n };\n}\n\nexport function enableUserAccessToken(tokenId: string): NewActionFuncAsync {\n return async (dispatch, getState) => {\n try {\n await Client4.enableUserAccessToken(tokenId);\n } catch (error) {\n forceLogoutIfNecessary(error, dispatch, getState);\n dispatch(logError(error));\n return {error};\n }\n\n dispatch({\n type: UserTypes.ENABLED_USER_ACCESS_TOKEN,\n data: tokenId,\n });\n\n return {data: true};\n };\n}\n\nexport function getKnownUsers(): ActionFunc {\n return bindClientFunc({\n clientFunc: Client4.getKnownUsers,\n });\n}\n\nexport function clearUserAccessTokens(): ActionFunc {\n return async (dispatch) => {\n dispatch({type: UserTypes.CLEAR_MY_USER_ACCESS_TOKENS, data: null});\n return {data: true};\n };\n}\n\nexport function checkForModifiedUsers() {\n return async (dispatch: DispatchFunc, getState: GetStateFunc) => {\n const state = getState();\n const users = getUsers(state);\n const lastDisconnectAt = state.websocket.lastDisconnectAt;\n const serverVersion = getServerVersion(state);\n\n if (!isMinimumServerVersion(serverVersion, 5, 14)) {\n return {data: true};\n }\n\n await dispatch(getProfilesByIds(Object.keys(users), {since: lastDisconnectAt}));\n return {data: true};\n };\n}\n\nexport default {\n generateMfaSecret,\n logout,\n getProfiles,\n getProfilesByIds,\n getProfilesInTeam,\n getProfilesInChannel,\n getProfilesNotInChannel,\n getUser,\n getMe,\n getUserByUsername,\n getStatus,\n getStatusesByIds,\n getSessions,\n getTotalUsersStats,\n revokeSession,\n revokeAllSessionsForUser,\n revokeSessionsForAllUsers,\n getUserAudits,\n searchProfiles,\n startPeriodicStatusUpdates,\n stopPeriodicStatusUpdates,\n updateMe,\n updateUserRoles,\n updateUserMfa,\n updateUserPassword,\n updateUserActive,\n verifyUserEmail,\n sendVerificationEmail,\n resetUserPassword,\n sendPasswordResetEmail,\n uploadProfileImage,\n switchEmailToOAuth,\n switchOAuthToEmail,\n switchEmailToLdap,\n switchLdapToEmail,\n getTermsOfService,\n createTermsOfService,\n updateMyTermsOfServiceStatus,\n createUserAccessToken,\n getUserAccessToken,\n getUserAccessTokensForUser,\n revokeUserAccessToken,\n disableUserAccessToken,\n enableUserAccessToken,\n checkForModifiedUsers,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {\n Client4 as ClientClass4,\n DEFAULT_LIMIT_AFTER,\n DEFAULT_LIMIT_BEFORE,\n} from '@mattermost/client';\n\nconst Client4 = new ClientClass4();\n\nexport {\n Client4,\n DEFAULT_LIMIT_AFTER,\n DEFAULT_LIMIT_BEFORE,\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {createIdsSelector} from 'mattermost-redux/utils/helpers';\n\nexport const getCustomEmojisEnabled = (state: GlobalState): boolean => {\n return getConfig(state)?.EnableCustomEmoji === 'true';\n};\n\nexport const getCustomEmojis: (state: GlobalState) => IDMappedObjects = createSelector(\n 'getCustomEmojis',\n getCustomEmojisEnabled,\n (state) => state.entities.emojis.customEmoji,\n (customEmojiEnabled, customEmoji) => {\n if (!customEmojiEnabled) {\n return {};\n }\n\n return customEmoji;\n },\n);\n\nexport const getCustomEmojisAsMap: (state: GlobalState) => Map = createSelector(\n 'getCustomEmojisAsMap',\n getCustomEmojis,\n (emojis) => {\n const map = new Map();\n Object.keys(emojis).forEach((key: string) => {\n map.set(key, emojis[key]);\n });\n return map;\n },\n);\n\nexport const getCustomEmojisByName: (state: GlobalState) => Map = createSelector(\n 'getCustomEmojisByName',\n getCustomEmojis,\n (emojis: IDMappedObjects): Map => {\n const map: Map = new Map();\n\n Object.keys(emojis).forEach((key: string) => {\n map.set(emojis[key].name, emojis[key]);\n });\n\n return map;\n },\n);\n\nexport const getCustomEmojiIdsSortedByName: (state: GlobalState) => string[] = createIdsSelector(\n 'getCustomEmojiIdsSortedByName',\n getCustomEmojis,\n (emojis: IDMappedObjects): string[] => {\n return Object.keys(emojis).sort(\n (a: string, b: string): number => emojis[a].name.localeCompare(emojis[b].name),\n );\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Group} from '@mattermost/types/groups';\nimport {GroupSource} from '@mattermost/types/groups';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeam} from 'mattermost-redux/selectors/entities/teams';\nimport type {UserMentionKey} from 'mattermost-redux/selectors/entities/users';\nimport {filterGroupsMatchingTerm, sortGroups} from 'mattermost-redux/utils/group_utils';\n\nimport {getCurrentUserLocale} from './i18n';\n\nconst emptyList: any[] = [];\nconst emptySyncables = {\n teams: [],\n channels: [],\n};\n\nfunction getGroupInfoForIds(groupsSet: Record, groupIds: string[]) {\n const groups: Group[] = [];\n\n for (let i = 0; i < groupIds.length; i++) {\n const id = groupIds[i];\n groups.push(groupsSet[id]);\n }\n\n return groups;\n}\n\nexport function getAllGroups(state: GlobalState) {\n return state.entities.groups.groups;\n}\n\nexport const getAllGroupsByName: (state: GlobalState) => Record = createSelector(\n 'getAllGroupsByName',\n getAllGroups,\n (groups) => {\n const groupsByName: Record = {};\n\n for (const id in groups) {\n if (groups.hasOwnProperty(id)) {\n const group = groups[id];\n groupsByName[group.name] = group;\n }\n }\n\n return groupsByName;\n },\n);\n\nexport function getMyGroupIds(state: GlobalState) {\n return state.entities.groups.myGroups;\n}\n\nexport function getAllGroupStats(state: GlobalState) {\n return state.entities.groups.stats;\n}\n\nexport function getGroupStats(state: GlobalState, id: string) {\n return getAllGroupStats(state)[id] || {};\n}\n\nexport function getGroup(state: GlobalState, id: string) {\n return getAllGroups(state)[id];\n}\n\nexport function getGroupMemberCount(state: GlobalState, id: string) {\n return getGroupStats(state, id).total_member_count;\n}\n\nfunction getGroupSyncables(state: GlobalState, id: string) {\n return state.entities.groups.syncables[id] || emptySyncables;\n}\n\nexport function getGroupTeams(state: GlobalState, id: string) {\n return getGroupSyncables(state, id).teams;\n}\n\nexport function getGroupChannels(state: GlobalState, id: string) {\n return getGroupSyncables(state, id).channels;\n}\n\nexport const getAssociatedGroupsByName: (state: GlobalState, teamID: string, channelId: string) => Record = createSelector(\n 'getAssociatedGroupsByName',\n getAssociatedGroupsForReference,\n (groups) => {\n const groupsByName: Record = {};\n\n for (const id in groups) {\n if (groups.hasOwnProperty(id)) {\n const group = groups[id];\n groupsByName[group.name] = group;\n }\n }\n\n return groupsByName;\n },\n);\n\nexport const getAssociatedGroupsForReferenceByMention: (state: GlobalState, teamID: string, channelId: string) => Map = createSelector(\n 'getAssociatedGroupsForReferenceByMention',\n getAssociatedGroupsForReference,\n (groups) => {\n return new Map(groups.map((group) => [`@${group.name}`, group]));\n },\n);\n\nexport function searchAssociatedGroupsForReferenceLocal(state: GlobalState, term: string, teamId: string, channelId: string): Group[] {\n const groups = getAssociatedGroupsForReference(state, teamId, channelId);\n if (!groups) {\n return emptyList;\n }\n const filteredGroups = filterGroupsMatchingTerm(groups, term);\n return filteredGroups;\n}\n\nexport function getAssociatedGroupsForReference(state: GlobalState, teamId: string, channelId: string): Group[] {\n const team = getTeam(state, teamId);\n const channel = getChannel(state, channelId);\n\n let groupsForReference = [];\n if (team && team.group_constrained && channel && channel.group_constrained) {\n const groupsFromChannel = getGroupsAssociatedToChannelForReference(state, channelId);\n const groupsFromTeam = getGroupsAssociatedToTeamForReference(state, teamId);\n const customGroups = getAllCustomGroups(state);\n groupsForReference = groupsFromChannel.concat(groupsFromTeam.filter((item) => groupsFromChannel.indexOf(item) < 0), customGroups);\n } else if (team && team.group_constrained) {\n const customGroups = getAllCustomGroups(state);\n const groupsFromTeam = getGroupsAssociatedToTeamForReference(state, teamId);\n groupsForReference = [...customGroups, ...groupsFromTeam];\n } else if (channel && channel.group_constrained) {\n const customGroups = getAllCustomGroups(state);\n const groupsFromChannel = getGroupsAssociatedToChannelForReference(state, channelId);\n groupsForReference = [...customGroups, ...groupsFromChannel];\n } else {\n groupsForReference = getAllAssociatedGroupsForReference(state, false);\n }\n return groupsForReference;\n}\n\nconst teamGroupIDs = (state: GlobalState, teamID: string) => state.entities.teams.groupsAssociatedToTeam[teamID]?.ids || [];\n\nconst channelGroupIDs = (state: GlobalState, channelID: string) => state.entities.channels.groupsAssociatedToChannel[channelID]?.ids || [];\n\nconst getTeamGroupIDSet = createSelector(\n 'getTeamGroupIDSet',\n teamGroupIDs,\n (teamIDs) => new Set(teamIDs),\n);\n\nconst getChannelGroupIDSet = createSelector(\n 'getChannelGroupIDSet',\n channelGroupIDs,\n (channelIDs) => new Set(channelIDs),\n);\n\nexport const getMyGroups: (state: GlobalState) => Group[] = createSelector(\n 'getGroupsNotAssociatedToTeam',\n getAllGroups,\n getMyGroupIds,\n (allGroups, myGroupIds) => {\n return sortGroups(getGroupInfoForIds(allGroups, myGroupIds));\n },\n);\n\nexport const getGroupsNotAssociatedToTeam: (state: GlobalState, teamID: string) => Group[] = createSelector(\n 'getGroupsNotAssociatedToTeam',\n getAllGroups,\n (state: GlobalState, teamID: string) => getTeamGroupIDSet(state, teamID),\n (allGroups, teamGroupIDSet) => {\n return Object.entries(allGroups).filter(([groupID, group]) => !teamGroupIDSet.has(groupID) && group.source === GroupSource.Ldap).map((entry) => entry[1]);\n },\n);\n\nexport const getGroupsAssociatedToTeam: (state: GlobalState, teamID: string) => Group[] = createSelector(\n 'getGroupsAssociatedToTeam',\n getAllGroups,\n (state: GlobalState, teamID: string) => getTeamGroupIDSet(state, teamID),\n (allGroups, teamGroupIDSet) => {\n return Object.entries(allGroups).filter(([groupID]) => teamGroupIDSet.has(groupID)).map((entry) => entry[1]);\n },\n);\n\nexport const getGroupsNotAssociatedToChannel: (state: GlobalState, channelID: string, teamID: string) => Group[] = createSelector(\n 'getGroupsNotAssociatedToChannel',\n getAllGroups,\n (state: GlobalState, channelID: string) => getChannelGroupIDSet(state, channelID),\n (state: GlobalState, channelID: string, teamID: string) => getTeam(state, teamID),\n (state: GlobalState, channelID: string, teamID: string) => getGroupsAssociatedToTeam(state, teamID),\n (allGroups, channelGroupIDSet, team, teamGroups) => {\n let result = Object.values(allGroups).filter((group) => !channelGroupIDSet.has(group.id) && group.source === GroupSource.Ldap);\n if (team.group_constrained) {\n const gids = teamGroups.map((group) => group.id);\n result = result.filter((group) => gids?.includes(group.id));\n }\n return result;\n },\n);\n\nexport const getGroupsAssociatedToChannel: (state: GlobalState, channelID: string) => Group[] = createSelector(\n 'getGroupsAssociatedToChannel',\n getAllGroups,\n (state: GlobalState, channelID: string) => getChannelGroupIDSet(state, channelID),\n (allGroups, channelGroupIDSet) => {\n return Object.entries(allGroups).filter(([groupID]) => channelGroupIDSet.has(groupID)).map((entry) => entry[1]);\n },\n);\n\nexport const getGroupsAssociatedToTeamForReference: (state: GlobalState, teamID: string) => Group[] = createSelector(\n 'getGroupsAssociatedToTeamForReference',\n getAllGroups,\n (state: GlobalState, teamID: string) => getTeamGroupIDSet(state, teamID),\n (allGroups, teamGroupIDSet) => {\n return Object.entries(allGroups).filter(([groupID]) => teamGroupIDSet.has(groupID)).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);\n },\n);\n\nexport const getGroupsAssociatedToChannelForReference: (state: GlobalState, channelID: string) => Group[] = createSelector(\n 'getGroupsAssociatedToChannelForReference',\n getAllGroups,\n (state: GlobalState, channelID: string) => getChannelGroupIDSet(state, channelID),\n (allGroups, channelGroupIDSet) => {\n return Object.entries(allGroups).filter(([groupID]) => channelGroupIDSet.has(groupID)).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0)).map((entry) => entry[1]);\n },\n);\n\nexport const makeGetAllAssociatedGroupsForReference = () => {\n return createSelector(\n 'makeGetAllAssociatedGroupsForReference',\n (state: GlobalState) => getAllGroups(state),\n (state: GlobalState) => getCurrentUserLocale(state),\n (_: GlobalState, includeArchived: boolean) => includeArchived,\n (allGroups, locale, includeArchived) => {\n const groups = Object.entries(allGroups).filter((entry) => {\n if (includeArchived) {\n return entry[1].allow_reference;\n }\n return entry[1].allow_reference && entry[1].delete_at === 0;\n }).map((entry) => entry[1]);\n return sortGroups(groups, locale);\n },\n );\n};\n\nconst getAllAssociatedGroupsForReference = makeGetAllAssociatedGroupsForReference();\n\nexport const getAllGroupsForReferenceByName: (state: GlobalState) => Record = createSelector(\n 'getAllGroupsForReferenceByName',\n (state: GlobalState) => getAllAssociatedGroupsForReference(state, false),\n (groups) => {\n const groupsByName: Record = {};\n\n for (const id in groups) {\n if (groups.hasOwnProperty(id)) {\n const group = groups[id];\n groupsByName[group.name] = group;\n }\n }\n\n return groupsByName;\n },\n);\n\nexport const getAllCustomGroups: (state: GlobalState) => Group[] = createSelector(\n 'getAllCustomGroups',\n getAllGroups,\n (groups) => {\n return Object.entries(groups).filter((entry) => (entry[1].allow_reference && entry[1].delete_at === 0 && entry[1].source === GroupSource.Custom)).map((entry) => entry[1]);\n },\n);\n\nexport const makeGetMyAllowReferencedGroups = () => {\n return createSelector(\n 'makeGetMyAllowReferencedGroups',\n (state: GlobalState) => getMyGroups(state),\n (state: GlobalState) => getCurrentUserLocale(state),\n (_: GlobalState, includeArchived: boolean) => includeArchived,\n (myGroups, locale, includeArchived) => {\n const groups = myGroups.filter((group) => {\n if (includeArchived) {\n return group.allow_reference;\n }\n\n return group.allow_reference && group.delete_at === 0;\n });\n\n return sortGroups(groups, locale);\n },\n );\n};\n\nexport const getMyGroupsAssociatedToChannelForReference: (state: GlobalState, teamId: string, channelId: string) => Group[] = createSelector(\n 'getMyGroupsAssociatedToChannelForReference',\n getMyGroups,\n getAssociatedGroupsByName,\n (myGroups, groups) => {\n return myGroups.filter((group) => group.allow_reference && group.delete_at === 0 && groups[group.name]);\n },\n);\n\nconst getMyAllowReferencedGroups = makeGetMyAllowReferencedGroups();\n\nexport const getMyGroupMentionKeys: (state: GlobalState, includeArchived: boolean) => UserMentionKey[] = createSelector(\n 'getMyGroupMentionKeys',\n (state: GlobalState, includeArchived: boolean) => getMyAllowReferencedGroups(state, includeArchived),\n (groups: Group[]) => {\n const keys: UserMentionKey[] = [];\n groups.forEach((group) => keys.push({key: `@${group.name}`}));\n return keys;\n },\n);\n\nexport const getMyGroupMentionKeysForChannel: (state: GlobalState, teamId: string, channelId: string) => UserMentionKey[] = createSelector(\n 'getMyGroupMentionKeysForChannel',\n getMyGroupsAssociatedToChannelForReference,\n (groups: Group[]) => {\n const keys: UserMentionKey[] = [];\n groups.forEach((group) => keys.push({key: `@${group.name}`}));\n return keys;\n },\n);\n\nconst searchGetAllAssociatedGroupsForReference = makeGetAllAssociatedGroupsForReference();\n\nexport const searchAllowReferencedGroups: (state: GlobalState, term: string, includeArchived: boolean) => Group[] = createSelector(\n 'searchAllowReferencedGroups',\n (state: GlobalState, term: string) => term,\n (state: GlobalState, term: string, includeArchived: boolean) => searchGetAllAssociatedGroupsForReference(state, includeArchived),\n (term, groups) => {\n return filterGroupsMatchingTerm(groups, term);\n },\n);\n\nconst searchGetMyAllowReferencedGroups = makeGetMyAllowReferencedGroups();\n\nexport const searchMyAllowReferencedGroups: (state: GlobalState, term: string, includeArchived: boolean) => Group[] = createSelector(\n 'searchMyAllowReferencedGroups',\n (state: GlobalState, term: string) => term,\n (state: GlobalState, term: string, includeArchived: boolean) => searchGetMyAllowReferencedGroups(state, includeArchived),\n (term, groups) => {\n return filterGroupsMatchingTerm(groups, term);\n },\n);\n\nexport const isMyGroup: (state: GlobalState, groupId: string) => boolean = createSelector(\n 'isMyGroup',\n getMyGroupIds,\n (state: GlobalState, groupId: string) => groupId,\n (myGroupIDs: string[], groupId: string) => {\n let isMyGroup = false;\n myGroupIDs.forEach((myGroupId) => {\n if (myGroupId === groupId) {\n isMyGroup = true;\n }\n });\n return isMyGroup;\n },\n);\n\nexport const getArchivedGroups: (state: GlobalState) => Group[] = createSelector(\n 'getArchivedGroups',\n (state: GlobalState) => getAllGroups(state),\n (state: GlobalState) => getCurrentUserLocale(state),\n (allGroups, locale) => {\n const groups = Object.entries(allGroups).filter((entry) => {\n return entry[1].allow_reference && entry[1].delete_at > 0;\n }).map((entry) => entry[1]);\n return sortGroups(groups, locale);\n },\n);\n\nexport const searchArchivedGroups: (state: GlobalState, term: string) => Group[] = createSelector(\n 'searchArchivedGroups',\n getArchivedGroups,\n (state: GlobalState, term: string) => term,\n (groups, term) => {\n return filterGroupsMatchingTerm(groups, term);\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Emoji, SystemEmoji} from '@mattermost/types/emojis';\n\nimport {Client4} from 'mattermost-redux/client';\n\nexport function isSystemEmoji(emoji: Emoji): emoji is SystemEmoji {\n if ('category' in emoji) {\n return emoji.category !== 'custom';\n }\n\n return !('id' in emoji);\n}\n\nexport function getEmojiImageUrl(emoji: Emoji): string {\n // If its the mattermost custom emoji\n if (!isSystemEmoji(emoji) && emoji.id === 'mattermost') {\n return Client4.getSystemEmojiImageUrl('mattermost');\n }\n\n if (isSystemEmoji(emoji)) {\n const emojiUnified = emoji?.unified?.toLowerCase() ?? '';\n const filename = emojiUnified || emoji.short_names[0];\n\n return Client4.getSystemEmojiImageUrl(filename);\n }\n\n return Client4.getEmojiRoute(emoji.id) + '/image';\n}\n\nexport function parseEmojiNamesFromText(text: string): string[] {\n if (!text.includes(':')) {\n return [];\n }\n\n const pattern = /:([A-Za-z0-9_-]+):/gi;\n const customEmojis = new Set();\n let match;\n while ((match = pattern.exec(text)) !== null) {\n if (!match) {\n continue;\n }\n\n customEmojis.add(match[1]);\n }\n\n return Array.from(customEmojis);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nfunction isFunction(obj: any): boolean {\n return typeof obj === 'function';\n}\n\ntype Listener = (...args: any[]) => void;\n\nclass EventEmitter {\n listeners: Map;\n\n constructor() {\n this.listeners = new Map();\n }\n\n addListener(label: string, callback: Listener): void {\n if (!this.listeners.has(label)) {\n this.listeners.set(label, []);\n }\n\n this.listeners.get(label)!.push(callback);\n }\n\n on(label: string, callback: Listener): void {\n this.addListener(label, callback);\n }\n\n removeListener(label: string, callback: Listener): boolean {\n const listeners = this.listeners.get(label);\n let index;\n\n if (listeners && listeners.length) {\n index = listeners.reduce((i, listener, idx) => {\n return isFunction(listener) && listener === callback ? idx : i;\n }, -1);\n\n if (index > -1) {\n listeners.splice(index, 1);\n this.listeners.set(label, listeners);\n return true;\n }\n }\n return false;\n }\n\n off(label: string, callback: Listener): void {\n this.removeListener(label, callback);\n }\n\n emit(label: string, ...args: any[]): boolean {\n const listeners = this.listeners.get(label);\n\n if (listeners && listeners.length) {\n listeners.forEach((listener) => {\n listener(...args);\n });\n return true;\n }\n return false;\n }\n}\n\nexport default new EventEmitter();\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Group} from '@mattermost/types/groups';\n\nimport {getSuggestionsSplitByMultiple} from './user_utils';\n\nimport {General} from '../constants';\n\nexport function filterGroupsMatchingTerm(groups: Group[], term: string): Group[] {\n const lowercasedTerm = term.toLowerCase();\n let trimmedTerm = lowercasedTerm;\n if (trimmedTerm.startsWith('@')) {\n trimmedTerm = trimmedTerm.substr(1);\n }\n\n return groups.filter((group: Group) => {\n if (!group) {\n return false;\n }\n\n const groupSuggestions: string[] = [];\n\n const groupnameSuggestions = getSuggestionsSplitByMultiple((group.name || '').toLowerCase(), General.AUTOCOMPLETE_SPLIT_CHARACTERS);\n\n groupSuggestions.push(...groupnameSuggestions);\n const displayname = (group.display_name || '').toLowerCase();\n groupSuggestions.push(displayname);\n\n return groupSuggestions.\n filter((suggestion) => suggestion !== '').\n some((suggestion) => suggestion.startsWith(trimmedTerm));\n });\n}\n\nexport function sortGroups(groups: Group[] = [], locale: string = General.DEFAULT_LOCALE): Group[] {\n return groups.sort((a, b) => {\n if ((a.delete_at === 0 && b.delete_at === 0) || (a.delete_at > 0 && b.delete_at > 0)) {\n return a.display_name.localeCompare(b.display_name, locale, {numeric: true});\n }\n if (a.delete_at < b.delete_at) {\n return -1;\n }\n if (a.delete_at > b.delete_at) {\n return 1;\n }\n\n return 0;\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createBrowserHistory} from 'history';\nimport type {History} from 'history';\n\nimport {getModule} from 'module_registry';\nimport DesktopApp from 'utils/desktop_api';\nimport {isServerVersionGreaterThanOrEqualTo} from 'utils/server_version';\nimport {isDesktopApp, getDesktopVersion} from 'utils/user_agent';\n\nconst b = createBrowserHistory({basename: window.basename});\nconst isDesktop = isDesktopApp() && isServerVersionGreaterThanOrEqualTo(getDesktopVersion(), '5.0.0');\nconst browserHistory = {\n ...b,\n push: (path: string | { pathname: string }, ...args: string[]) => {\n if (isDesktop) {\n DesktopApp.doBrowserHistoryPush(typeof path === 'object' ? path.pathname : path);\n } else {\n b.push(path, ...args);\n }\n },\n};\n\nif (isDesktop) {\n DesktopApp.onBrowserHistoryPush((pathName) => b.push(pathName));\n}\n\n/**\n * Returns the current history object.\n *\n * If you're calling this from within a React component, consider using the useHistory hook from react-router-dom.\n */\nexport function getHistory() {\n return getModule('utils/browser_history') ?? browserHistory;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport semver from 'semver';\n\nimport type {DesktopAPI} from '@mattermost/desktop-api';\n\nimport {isDesktopApp} from 'utils/user_agent';\n\ndeclare global {\n interface Window {\n desktopAPI?: Partial;\n }\n}\n\nclass DesktopAppAPI {\n private name?: string;\n private version?: string | null;\n private dev?: boolean;\n\n /**\n * @deprecated\n */\n private postMessageListeners?: Map void>>;\n\n constructor() {\n // Check the user agent string first\n if (!isDesktopApp()) {\n return;\n }\n\n this.getDesktopAppInfo().then(({name, version}) => {\n this.name = name;\n this.version = semver.valid(semver.coerce(version));\n\n // Legacy Desktop App version, used by some plugins\n if (!window.desktop) {\n window.desktop = {};\n }\n window.desktop.version = semver.valid(semver.coerce(version));\n });\n window.desktopAPI?.isDev?.().then((isDev) => {\n this.dev = isDev;\n });\n\n // Legacy code - to be removed\n this.postMessageListeners = new Map();\n window.addEventListener('message', this.postMessageListener);\n window.addEventListener('beforeunload', () => {\n window.removeEventListener('message', this.postMessageListener);\n });\n }\n\n /*******************************************************\n * Getters/setters for Desktop App specific information\n *******************************************************/\n\n getAppName = () => {\n return this.name;\n };\n\n getAppVersion = () => {\n return this.version;\n };\n\n isDev = () => {\n return this.dev;\n };\n\n private getDesktopAppInfo = () => {\n if (window.desktopAPI?.getAppInfo) {\n return window.desktopAPI.getAppInfo();\n }\n\n return this.invokeWithMessaging(\n 'webapp-ready',\n undefined,\n 'register-desktop',\n );\n };\n\n /**********************\n * Exposed API methods\n **********************/\n\n /**\n * Invokes\n */\n\n getBrowserHistoryStatus = async () => {\n if (window.desktopAPI?.requestBrowserHistoryStatus) {\n return window.desktopAPI.requestBrowserHistoryStatus();\n }\n\n const {enableBack, enableForward} = await this.invokeWithMessaging(\n 'history-button',\n undefined,\n 'history-button-return',\n );\n\n return {\n canGoBack: enableBack,\n canGoForward: enableForward,\n };\n };\n\n /**\n * Listeners\n */\n\n onUserActivityUpdate = (listener: (userIsActive: boolean, idleTime: number, isSystemEvent: boolean) => void) => {\n if (window.desktopAPI?.onUserActivityUpdate) {\n return window.desktopAPI.onUserActivityUpdate(listener);\n }\n\n const legacyListener = ({userIsActive, manual}: {userIsActive: boolean; manual: boolean}) => listener(userIsActive, 0, manual);\n this.addPostMessageListener('user-activity-update', legacyListener);\n\n return () => this.removePostMessageListener('user-activity-update', legacyListener);\n };\n\n onNotificationClicked = (listener: (channelId: string, teamId: string, url: string) => void) => {\n if (window.desktopAPI?.onNotificationClicked) {\n return window.desktopAPI.onNotificationClicked(listener);\n }\n\n const legacyListener = ({channel, teamId, url}: {channel: {id: string}; teamId: string; url: string}) => listener(channel.id, teamId, url);\n this.addPostMessageListener('notification-clicked', legacyListener);\n\n return () => this.removePostMessageListener('notification-clicked', legacyListener);\n };\n\n onBrowserHistoryPush = (listener: (pathName: string) => void) => {\n if (window.desktopAPI?.onBrowserHistoryPush) {\n return window.desktopAPI.onBrowserHistoryPush(listener);\n }\n\n const legacyListener = ({pathName}: {pathName: string}) => listener(pathName);\n this.addPostMessageListener('browser-history-push-return', legacyListener);\n\n return () => this.removePostMessageListener('browser-history-push-return', legacyListener);\n };\n\n onBrowserHistoryStatusUpdated = (listener: (enableBack: boolean, enableForward: boolean) => void) => {\n if (window.desktopAPI?.onBrowserHistoryStatusUpdated) {\n return window.desktopAPI.onBrowserHistoryStatusUpdated(listener);\n }\n\n const legacyListener = ({enableBack, enableForward}: {enableBack: boolean; enableForward: boolean}) => listener(enableBack, enableForward);\n this.addPostMessageListener('history-button-return', legacyListener);\n\n return () => this.removePostMessageListener('history-button-return', legacyListener);\n };\n\n /**\n * One-ways\n */\n\n dispatchNotification = (\n title: string,\n body: string,\n channelId: string,\n teamId: string,\n silent: boolean,\n soundName: string,\n url: string,\n ) => {\n if (window.desktopAPI?.sendNotification) {\n window.desktopAPI.sendNotification(title, body, channelId, teamId, url, silent, soundName);\n return;\n }\n\n // get the desktop app to trigger the notification\n window.postMessage(\n {\n type: 'dispatch-notification',\n message: {\n title,\n body,\n channel: {id: channelId},\n teamId,\n silent,\n data: {soundName},\n url,\n },\n },\n window.location.origin,\n );\n };\n\n doBrowserHistoryPush = (path: string) => {\n if (window.desktopAPI?.sendBrowserHistoryPush) {\n window.desktopAPI.sendBrowserHistoryPush(path);\n return;\n }\n\n window.postMessage(\n {\n type: 'browser-history-push',\n message: {path},\n },\n window.location.origin,\n );\n };\n\n updateUnreadsAndMentions = (isUnread: boolean, mentionCount: number) =>\n window.desktopAPI?.setUnreadsAndMentions && window.desktopAPI.setUnreadsAndMentions(isUnread, mentionCount);\n setSessionExpired = (expired: boolean) => window.desktopAPI?.setSessionExpired && window.desktopAPI.setSessionExpired(expired);\n\n /*********************************************************************\n * Helper functions for legacy code\n * Remove all of this once we have no use for message passing anymore\n *********************************************************************/\n\n /**\n * @deprecated\n */\n private postMessageListener = ({origin, data: {type, message}}: {origin: string; data: {type: string; message: unknown}}) => {\n if (origin !== window.location.origin) {\n return;\n }\n\n const listeners = this.postMessageListeners?.get(type);\n if (!listeners) {\n return;\n }\n\n listeners.forEach((listener) => {\n listener(message);\n });\n };\n\n /**\n * @deprecated\n */\n private addPostMessageListener = (channel: string, listener: (message: any) => void) => {\n if (this.postMessageListeners?.has(channel)) {\n this.postMessageListeners.set(channel, this.postMessageListeners.get(channel)!.add(listener));\n } else {\n this.postMessageListeners?.set(channel, new Set([listener]));\n }\n };\n\n /**\n * @deprecated\n */\n private removePostMessageListener = (channel: string, listener: (message: any) => void) => {\n const set = this.postMessageListeners?.get(channel);\n set?.delete(listener);\n if (set?.size) {\n this.postMessageListeners?.set(channel, set);\n } else {\n this.postMessageListeners?.delete(channel);\n }\n };\n\n /**\n * @deprecated\n */\n private invokeWithMessaging = (\n sendChannel: string,\n sendData?: T,\n receiveChannel?: string,\n ) => {\n return new Promise((resolve) => {\n /* create and register a temporary listener if necessary */\n const response = ({origin, data: {type, message}}: {origin: string; data: {type: string; message: T2}}) => {\n /* ignore messages from other frames */\n if (origin !== window.location.origin) {\n return;\n }\n\n /* ignore messages from other channels */\n if (type !== (receiveChannel ?? sendChannel)) {\n return;\n }\n\n /* clean up listener and resolve */\n window.removeEventListener('message', response);\n resolve(message);\n };\n\n window.addEventListener('message', response);\n window.postMessage(\n {type: sendChannel, message: sendData},\n window.location.origin,\n );\n });\n };\n}\n\nconst DesktopApp = new DesktopAppAPI();\nexport default DesktopApp;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/**\n * Boolean function to check if a server version is greater than another.\n *\n * currentVersion: The server version being checked\n * compareVersion: The version to compare the former version against\n *\n * eg. currentVersion = 4.16.0, compareVersion = 4.17.0 returns false\n * currentVersion = 4.16.1, compareVersion = 4.16.1 returns true\n */\nexport function isServerVersionGreaterThanOrEqualTo(currentVersion: string, compareVersion: string): boolean {\n if (currentVersion === compareVersion) {\n return true;\n }\n\n // We only care about the numbers\n const currentVersionNumber = (currentVersion || '').split('.').filter((x) => (/^[0-9]+$/).exec(x) !== null);\n const compareVersionNumber = (compareVersion || '').split('.').filter((x) => (/^[0-9]+$/).exec(x) !== null);\n\n for (let i = 0; i < Math.max(currentVersionNumber.length, compareVersionNumber.length); i++) {\n const currentVersion = parseInt(currentVersionNumber[i], 10) || 0;\n const compareVersion = parseInt(compareVersionNumber[i], 10) || 0;\n if (currentVersion > compareVersion) {\n return true;\n }\n\n if (currentVersion < compareVersion) {\n return false;\n }\n }\n\n // If all components are equal, then return true\n return true;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/*\nExample User Agents\n--------------------\n\nChrome:\n Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\n\nFirefox:\n Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0\n\nIE11:\n Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\n\nEdge:\n Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586\n\nChromeOS Chromebook:\n Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36\n\nDesktop App:\n Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/1.2.1 Chrome/49.0.2623.75 Electron/0.37.8 Safari/537.36\n Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586\n Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.4.1 Chrome/53.0.2785.113 Electron/1.4.2 Safari/537.36\n Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.4.1 Chrome/51.0.2704.106 Electron/1.2.8 Safari/537.36\n\nAndroid Chrome:\n Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19\n\nAndroid Firefox:\n Mozilla/5.0 (Android; U; Android; pl; rv:1.9.2.8) Gecko/20100202 Firefox/3.5.8\n Mozilla/5.0 (Android 7.0; Mobile; rv:54.0) Gecko/54.0 Firefox/54.0\n Mozilla/5.0 (Android 7.0; Mobile; rv:57.0) Gecko/57.0 Firefox/57.0\n\nAndroid App:\n Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30\n Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36\n Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36\n\niOS Safari:\n Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3\n\niOS Android:\n Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3\n\niOS App:\n Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69\n*/\n\nconst userAgent = () => window.navigator.userAgent;\n\nexport function isChrome(): boolean {\n return userAgent().indexOf('Chrome') > -1 && userAgent().indexOf('Edge') === -1;\n}\n\nexport function isSafari(): boolean {\n return userAgent().indexOf('Safari') !== -1 && userAgent().indexOf('Chrome') === -1;\n}\n\nexport function isIosSafari(): boolean {\n return (userAgent().indexOf('iPhone') !== -1 || userAgent().indexOf('iPad') !== -1) && userAgent().indexOf('Safari') !== -1 && userAgent().indexOf('CriOS') === -1;\n}\n\nexport function isIosChrome(): boolean {\n return userAgent().indexOf('CriOS') !== -1;\n}\n\nexport function isIosWeb(): boolean {\n return isIosSafari() || isIosChrome();\n}\n\nexport function isIos(): boolean {\n return userAgent().indexOf('iPhone') !== -1 || userAgent().indexOf('iPad') !== -1;\n}\n\nexport function isAndroid(): boolean {\n return userAgent().indexOf('Android') !== -1;\n}\n\nexport function isAndroidChrome(): boolean {\n return userAgent().indexOf('Android') !== -1 && userAgent().indexOf('Chrome') !== -1 && userAgent().indexOf('Version') === -1;\n}\n\nexport function isAndroidFirefox(): boolean {\n return userAgent().indexOf('Android') !== -1 && userAgent().indexOf('Firefox') !== -1;\n}\n\nexport function isAndroidWeb(): boolean {\n return isAndroidChrome() || isAndroidFirefox();\n}\n\nexport function isIosClassic(): boolean {\n return isMobileApp() && isIos();\n}\n\n// Returns true if and only if the user is using a Mattermost mobile app. This will return false if the user is using the\n// web browser on a mobile device.\nexport function isMobileApp(): boolean {\n return isMobile() && !isIosWeb() && !isAndroidWeb();\n}\n\n// Returns true if and only if the user is using Mattermost from either the mobile app or the web browser on a mobile device.\nexport function isMobile(): boolean {\n return isIos() || isAndroid();\n}\n\nexport function isFirefox(): boolean {\n return userAgent().indexOf('Firefox') !== -1;\n}\n\nexport function isChromebook(): boolean {\n return userAgent().indexOf('CrOS') !== -1;\n}\n\nexport function isInternetExplorer(): boolean {\n return userAgent().indexOf('Trident') !== -1;\n}\n\nexport function isEdge(): boolean {\n return userAgent().indexOf('Edge') !== -1;\n}\n\nexport function isDesktopApp(): boolean {\n return userAgent().indexOf('Mattermost') !== -1 && userAgent().indexOf('Electron') !== -1;\n}\n\nexport function isWindowsApp(): boolean {\n return isDesktopApp() && isWindows();\n}\n\nexport function isMacApp(): boolean {\n return isDesktopApp() && isMac();\n}\n\nexport function isWindows(): boolean {\n return userAgent().indexOf('Windows') !== -1;\n}\n\nexport function isMac(): boolean {\n return userAgent().indexOf('Macintosh') !== -1;\n}\n\nexport function isLinux(): boolean {\n return navigator.platform.toUpperCase().indexOf('LINUX') >= 0;\n}\n\nexport function isWindows7(): boolean {\n const appVersion = navigator.appVersion;\n\n if (!appVersion) {\n return false;\n }\n\n return (/\\bWindows NT 6\\.1\\b/).test(appVersion);\n}\n\nexport function getDesktopVersion(): string {\n // use if the value window.desktop.version is not set yet\n const regex = /Mattermost\\/(\\d+\\.\\d+\\.\\d+)/gm;\n const match = regex.exec(window.navigator.appVersion)?.[1] || '';\n return match;\n}\n","\"use strict\";\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReportDuration = exports.LogLevel = void 0;\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[\"Error\"] = \"ERROR\";\n LogLevel[\"Warning\"] = \"WARNING\";\n LogLevel[\"Info\"] = \"INFO\";\n LogLevel[\"Debug\"] = \"DEBUG\";\n})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));\nvar ReportDuration;\n(function (ReportDuration) {\n ReportDuration[\"Last30Days\"] = \"last_30_days\";\n ReportDuration[\"PreviousMonth\"] = \"previous_month\";\n ReportDuration[\"Last6Months\"] = \"last_6_months\";\n})(ReportDuration = exports.ReportDuration || (exports.ReportDuration = {}));\n"],"names":["makeAsyncComponent","displayName","LazyComponent","fallback","arguments","length","undefined","Component","props","React","PostsChannelResetWatcher","dispatch","useDispatch","isCRTEnabled","useSelector","isCollapsedThreadsEnabled","loaded","useRef","useEffect","current","resetReloadPostsInChannel","setCategoryCollapsed","categoryId","collapsed","patchCategory","setCategorySorting","sorting","patch","async","getState","state","currentUserId","getCurrentUserId","category","getCategory","patchedCategory","_objectSpread","type","ChannelCategoryTypes","data","Client4","team_id","error","forceLogoutIfNecessary","logError","setCategoryMuted","muted","result","updatedCategory","updateCategory","updated","batchActions","channel_ids","map","channelId","ChannelTypes","fetchMyCategories","teamId","isWebSocket","categories","order","addChannelToInitialCategory","channel","setOnServer","Object","values","getAllCategoriesByIds","General","allDmCategories","filter","CategoryTypes","channelInCategories","findIndex","id","dmCategories","dmCategory","insertWithoutDuplicates","some","channelsCategory","getCategoryInTeamByType","addChannelToCategory","newIndex","setManualSorting","targetCategory","CategorySorting","sourceCategory","getCategoryInTeamWithChannel","push","removeItem","originalCategories","moveChannelToCategory","moveChannelsToCategory","channelIds","insertMultipleWithoutDuplicates","unmodifiedCategories","sourceCategories","forEach","categoriesArray","reduce","allCategories","moveCategory","getCategoryIdsForTeam","newOrder","receivedCategoryOrder","createCategory","newCategory","user_id","display_name","renameCategory","deleteCategory","selectChannel","createChannel","userId","created","member","channel_id","roles","concat","last_viewed_at","msg_count","mention_count","notify_props","desktop","mark_unread","last_update_at","create_at","actions","channels","myMembers","entities","loadRolesIfNeeded","split","createDirectChannel","otherUserId","preferences","Preferences","name","value","Date","getTime","toString","savePreferences","PreferenceTypes","UserTypes","markGroupChannelOpen","users","createGroupChannel","userIds","msg_count_root","mention_count_root","total_msg_count","storeMember","getMyChannelMemberSelector","profilesInChannel","patchChannel","updateChannelPrivacy","privacy","updatedChannel","convertGroupMessageToPrivateChannel","channelID","teamID","updateChannelNotifyProps","notifyProps","currentNotifyProps","getChannelByNameAndTeamName","teamName","channelName","includeDeleted","getChannel","getChannelAndMyMember","channelRequest","memberRequest","getChannelTimezones","channelTimezones","channelTimezonesRequest","fetchChannelsAndMembers","channelMembers","Promise","all","Set","role","add","size","fetchAllMyTeamsChannelsAndChannelMembersREST","channelsMembers","allMembers","page","then","getChannelMembers","perPage","channelMembersRequest","cm","getMissingProfilesByIds","leaveChannel","_unused","joinChannel","deleteChannel","viewArchivedChannels","general","config","ExperimentalViewArchivedChannels","currentChannelId","getCurrentTeamId","channelsInTeam","getChannelsNameMapInTeam","getChannelByName","getRedirectChannelNameForTeam","unarchiveChannel","getConfig","updateApproximateViewTime","myPreferences","viewTimePref","parseInt","readMultipleChannels","response","markMultipleChannelsAsRead","last_viewed_at_times","getChannels","getArchivedChannels","getAllChannelsWithCount","notAssociatedToGroup","excludeDefaultChannels","excludePolicyConstrained","payload","total_count","getAllChannels","autocompleteChannels","term","autocompleteChannelsForSearch","searchChannels","archived","searchAllChannels","opts","searchGroupChannels","bindClientFunc","clientFunc","params","getChannelStats","includeFileCount","stat","getChannelsMemberCount","channelsMemberCount","addChannelMember","postRootId","membersInChannel","removeChannelMember","markChannelAsRead","skipUpdateViewTime","markChannelAsViewedOnServer","actionsToMarkChannelAsRead","channelTimes","keys","viewedAt","now","messageCounts","messageCount","channelMember","amount","total","amountRoot","root","amountUrgent","urgent_mention_count","isManuallyUnread","actionsToMarkChannelAsUnread","mentions","fetchedChannelMember","isRoot","priority","onlyMentions","MarkUnread","indexOf","getChannelMembersByIds","onSuccess","getChannelMember","getMyChannelMember","loadMyChannelMemberAndRole","_result$data","favoriteChannel","getChannelSelector","unfavoriteChannel","updateChannelMemberSchemeRoles","isSchemeUser","isSchemeAdmin","membersMinusGroupMembers","groupIDs","getChannelModerations","moderations","patchChannelModerations","getChannelMemberCountsByGroup","channelMemberCountsByGroup","memberCounts","systemEmojis","setSystemEmojis","emojis","createCustomEmoji","emoji","image","EmojiTypes","getCustomEmojiByName","status_code","getCustomEmojisByName","names","neededNames","nonExistentEmoji","customEmojisByName","selectCustomEmojisByName","has","filterNeededCustomEmojis","batches","i","slice","results","batch","flat","foundNames","getCustomEmojisInText","text","parseEmojiNamesFromText","getCustomEmojis","sort","Emoji","loadUsers","loadProfilesForCustomEmojis","usersToLoad","profiles","creator_id","getProfilesByIds","deleteCustomEmoji","emojiId","searchCustomEmojis","options","autocompleteCustomEmojis","dismissError","index","ErrorTypes","dismissErrorObject","getLogErrorAction","displayable","consoleError","_getState","_getState$entities$ge","_getState$entities$ge2","server_error_id","sendToServer","stack","includes","serializedError","serializeError","stringifiedSerializedError","JSON","stringify","LogLevel","err","message","isDevMode","EnableDeveloper","shouldDisplay","clearErrors","getClientConfig","DiagnosticId","GeneralTypes","getLicenseConfig","setServerVersion","serverVersion","setUrl","url","setFirstAdminVisitMarketplaceStatus","e","getFirstAdminSetupComplete","parse","HTTP_UNAUTHORIZED","dispatcher","requestSuccess","requestData","_ref","onRequest","onFailure","requestFailure","Array","isArray","s","debounce","func","wait","immediate","cb","timeout","_len","args","_key","callNow","clearTimeout","setTimeout","runLater","Reflect","apply","Error","getUsersLimits","_response$data$active","_response","_response$data","_response$data$maxUse","_response2","_response2$data","getCurrentUserRoles","isAdmin","activeUserCount","maxUsersLimit","LimitsTypes","deletePreferences","getMyPreferencesSelector","currentPreferences","pref","getPreferenceKey","getMyPreferences","setActionsMenuInitialisationState","initializationState","preference","setCustomStatusInitialisationState","_unused2","saveTheme","theme","deleteTeamSpecificThemes","themePreferences","makeGetCategory","toDelete","getProfilesAndStatusesForMembers","statuses","profilesToLoad","statusesToLoad","requests","getStatusesByIds","selectTeam","team","TeamTypes","getMyTeams","getMyTeamUnreads","collapsedThreads","skipCurrentTeam","unreads","currentTeamId","splice","getTeam","getTeamByName","getTeams","includeTotalCount","teams","searchTeams","per_page","createTeam","delete_at","deleteTeam","EventEmitter","unarchiveTeam","updateTeam","patchTeam","regenerateTeamInviteId","getMyTeamMembers","getMyTeamMembersFunc","teamMembers","teamMember","getTeamMembers","getTeamMember","getTeamMembersByIds","members","membersRequest","getTeamsForUser","getTeamMembersForUser","getTeamStats","addUserToTeamFromInvite","token","inviteId","addUserToTeam","addUsersToTeamGracefully","addedMembers","m","removeUserFromTeam","sendEmailInvitesToTeamGracefully","emails","sendEmailGuestInvitesToChannelsGracefully","sendEmailInvitesToTeamAndChannelsGracefully","getTeamInviteInfo","checkIfTeamExists","exists","setTeamIcon","imageData","status","removeTeamIcon","updateTeamScheme","schemeId","updateTeamMemberSchemeRoles","invalidateAllEmailInvites","getInProductNotices","client","clientVersion","updateNoticesAsViewed","noticeIds","ownKeys","r","t","getOwnPropertySymbols","o","getOwnPropertyDescriptor","enumerable","obj","key","arg","input","hint","prim","Symbol","toPrimitive","res","call","TypeError","String","_toPrimitive","_toPropertyKey","defineProperty","configurable","writable","getOwnPropertyDescriptors","defineProperties","fetchThreads","before","after","ThreadConstants","unread","totalsOnly","threadsOnly","extended","since","getThreads","_userThreadList$threa","_userThreadList$threa2","_userThreadList$threa3","userThreadList","threads","_uniq","participants","_ref2","PostTypes","posts","_ref3","post","update_at","getMissingFilesByPosts","_ref4","ThreadTypes","thread","is_following","getThreadCounts","counts","total_unread_threads","total_unread_mentions","total_unread_urgent_mentions","getCountsAndThreadsSince","_userThreadList$threa4","_userThreadList$threa5","_userThreadList$threa6","_ref5","_ref6","_ref7","handleThreadArrived","threadData","previousUnreadReplies","previousUnreadMentions","crtEnabled","user","features","oldThreadData","_oldThreadData$unread","_oldThreadData$unread2","handleReadChanged","lastViewedAt","prevUnreadMentions","unread_mentions","newUnreadMentions","prevUnreadReplies","unread_replies","newUnreadReplies","getThread","threadId","handleAllMarkedRead","markAllThreadsInTeamRead","markThreadAsUnread","postId","markLastPostInThreadAsUnread","getPostsForThread","makeGetPostsForThread","getThreadSelector","reply_count","getPostThread","_ref8","updateThreadRead","timestamp","_ref9","channelType","isUrgent","is_urgent","handleFollowChanged","following","setThreadFollow","newState","handleAllThreadsInChannelMarkedRead","threadsInChannel","getThreadItemsInChannel","decrementThreadCounts","replies","generateMfaSecret","createUser","redirect","loadMe","getMe","isCollapsedThreads","logout","getTotalUsersStats","getFilteredUsersStats","updateGlobalState","stats","getProfiles","missingIds","getMissingProfilesByUsernames","usernames","usernameProfiles","acc","profile","username","missingUsernames","getProfilesByUsernames","getProfilesInTeam","getProfilesNotInTeam","groupConstrained","receivedProfilesListActionType","getProfilesWithoutTeam","ProfilesInChannelSortBy","getProfilesInChannel","getProfilesInGroupChannels","channelsIds","channelProfiles","hasOwnProperty","getProfilesNotInChannel","getMeFunc","me","updateMyTermsOfServiceStatus","termsOfServiceId","accepted","terms_of_service_create_at","terms_of_service_id","getProfilesInGroup","groupId","getProfilesNotInGroup","getTermsOfService","promoteGuestToUser","demoteUserToGuest","createTermsOfService","getUser","getUserByUsername","getUserByEmail","email","ids","getStatus","setStatus","setCustomStatus","customStatus","unsetCustomStatus","removeRecentCustomStatus","getSessions","revokeSession","sessionId","revokeAllSessionsForUser","isCurrentUser","revokeSessionsForAllUsers","getUserAudits","autocompleteUsers","out_of_channel","searchProfiles","in_channel_id","not_in_channel_id","not_in_team_id","in_group_id","not_in_group_id","updateMe","patchUser","updateUserRoles","updateUserMfa","activate","code","mfa_active","updateUserPassword","currentPassword","newPassword","last_password_update_at","updateUserActive","active","deleteAt","verifyUserEmail","sendVerificationEmail","resetUserPassword","sendPasswordResetEmail","setDefaultProfileImage","last_picture_update","uploadProfileImage","switchEmailToOAuth","service","password","mfaCode","switchOAuthToEmail","currentService","switchEmailToLdap","emailPassword","ldapId","ldapPassword","switchLdapToEmail","createUserAccessToken","description","AdminTypes","getUserAccessToken","tokenId","getUserAccessTokensForUser","revokeUserAccessToken","disableUserAccessToken","enableUserAccessToken","getKnownUsers","clearUserAccessTokens","checkForModifiedUsers","getUsers","lastDisconnectAt","websocket","getServerVersion","isMinimumServerVersion","ClientClass4","getCustomEmojisEnabled","_getConfig","EnableCustomEmoji","createSelector","customEmoji","customEmojiEnabled","Map","set","getCustomEmojiIdsSortedByName","createIdsSelector","a","b","localeCompare","emptyList","emptySyncables","getAllGroups","groups","getAllGroupsByName","groupsByName","group","getMyGroupIds","myGroups","getGroup","getGroupMemberCount","getAllGroupStats","getGroupStats","total_member_count","getGroupSyncables","syncables","getGroupTeams","getGroupChannels","getAssociatedGroupsByName","getAssociatedGroupsForReference","getAssociatedGroupsForReferenceByMention","searchAssociatedGroupsForReferenceLocal","filterGroupsMatchingTerm","groupsForReference","group_constrained","groupsFromChannel","getGroupsAssociatedToChannelForReference","groupsFromTeam","getGroupsAssociatedToTeamForReference","customGroups","getAllCustomGroups","item","getAllAssociatedGroupsForReference","getTeamGroupIDSet","teamGroupIDs","_state$entities$teams","groupsAssociatedToTeam","teamIDs","getChannelGroupIDSet","channelGroupIDs","_state$entities$chann","groupsAssociatedToChannel","channelIDs","getMyGroups","allGroups","myGroupIds","sortGroups","groupsSet","groupIds","getGroupInfoForIds","getGroupsNotAssociatedToTeam","teamGroupIDSet","entries","groupID","source","GroupSource","entry","getGroupsAssociatedToTeam","getGroupsNotAssociatedToChannel","channelGroupIDSet","teamGroups","gids","getGroupsAssociatedToChannel","allow_reference","makeGetAllAssociatedGroupsForReference","getCurrentUserLocale","_","includeArchived","locale","getAllGroupsForReferenceByName","makeGetMyAllowReferencedGroups","getMyGroupsAssociatedToChannelForReference","getMyAllowReferencedGroups","getMyGroupMentionKeys","getMyGroupMentionKeysForChannel","searchGetAllAssociatedGroupsForReference","searchAllowReferencedGroups","searchGetMyAllowReferencedGroups","searchMyAllowReferencedGroups","isMyGroup","myGroupIDs","myGroupId","getArchivedGroups","searchArchivedGroups","isSystemEmoji","getEmojiImageUrl","_emoji$unified$toLowe","_emoji$unified","filename","unified","toLowerCase","short_names","pattern","customEmojis","match","exec","from","constructor","this","listeners","addListener","label","callback","get","on","removeListener","listener","idx","off","emit","trimmedTerm","startsWith","substr","groupSuggestions","groupnameSuggestions","getSuggestionsSplitByMultiple","displayname","suggestion","numeric","createBrowserHistory","basename","window","isDesktop","isDesktopApp","isServerVersionGreaterThanOrEqualTo","getDesktopVersion","browserHistory","path","DesktopApp","pathname","getHistory","_getModule","getModule","pathName","_window$desktopAPI11","_window$desktopAPI11$","_defineProperty","version","dev","_window$desktopAPI","desktopAPI","getAppInfo","invokeWithMessaging","_window$desktopAPI2","requestBrowserHistoryStatus","enableBack","enableForward","canGoBack","canGoForward","_window$desktopAPI3","onUserActivityUpdate","legacyListener","userIsActive","manual","addPostMessageListener","removePostMessageListener","_window$desktopAPI4","onNotificationClicked","_window$desktopAPI5","onBrowserHistoryPush","_window$desktopAPI6","onBrowserHistoryStatusUpdated","title","body","silent","soundName","_window$desktopAPI7","sendNotification","postMessage","location","origin","_window$desktopAPI8","sendBrowserHistoryPush","isUnread","mentionCount","_window$desktopAPI9","setUnreadsAndMentions","expired","_window$desktopAPI10","setSessionExpired","_this$postMessageList","postMessageListeners","_this$postMessageList2","_this$postMessageList3","_this$postMessageList4","_this$postMessageList5","_this$postMessageList6","delete","sendChannel","sendData","receiveChannel","resolve","removeEventListener","addEventListener","getDesktopAppInfo","semver","isDev","postMessageListener","currentVersion","compareVersion","currentVersionNumber","x","compareVersionNumber","Math","max","userAgent","navigator","isChrome","isSafari","isIosSafari","isIosChrome","isIosWeb","isIos","isAndroid","isAndroidWeb","isIosClassic","isMobileApp","isMobile","isFirefox","isChromebook","isInternetExplorer","isEdge","isWindowsApp","isMacApp","isMac","isLinux","platform","toUpperCase","_regex$exec","appVersion","ReportDuration","exports"],"sourceRoot":""}