VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /opt/mattermost/client/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/mattermost/client/6743.0044bcd54c3717f53eed.js.map
{"version":3,"file":"6743.0044bcd54c3717f53eed.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/actions/channel_bookmarks.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/channel_bookmarks.ts","webpack://mattermost-webapp/./src/actions/views/channel_sidebar.ts","webpack://mattermost-webapp/./src/components/add_groups_to_channel_modal/add_groups_to_channel_modal.tsx","webpack://mattermost-webapp/./src/components/add_groups_to_channel_modal/index.ts","webpack://mattermost-webapp/./src/components/common/svg_images_components/magnifying_glass_svg.tsx","webpack://mattermost-webapp/./src/components/searchable_channel_list.tsx","webpack://mattermost-webapp/./src/components/browse_channels/browse_channels.tsx","webpack://mattermost-webapp/./src/components/browse_channels/index.ts","webpack://mattermost-webapp/./src/components/channel_bookmarks/utils.ts","webpack://mattermost-webapp/./src/components/common/hooks/useGetUsageDeltas.ts","webpack://mattermost-webapp/./src/components/edit_category_modal/edit_category_modal.tsx","webpack://mattermost-webapp/./src/components/edit_category_modal/index.ts","webpack://mattermost-webapp/./src/components/search_shortcut/search_shortcut.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category_menu/create_new_category_menu_item.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category_menu/mark_as_read_confirm_modal.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category_menu/mark_as_read_menu_item.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category_menu/sidebar_category_generic_menu.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category_header.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/channel_mention_badge.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/channel_pencil_icon/channel_pencil_icon.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/channel_pencil_icon/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_channel_icon/sidebar_channel_icon.tsx","webpack://mattermost-webapp/./src/components/channel_move_to_sub_menu/index.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_channel_menu/sidebar_channel_menu.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_channel_menu/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_channel_link/sidebar_channel_link.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_channel_link/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_base_channel/sidebar_base_channel_icon.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_base_channel/sidebar_base_channel.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_base_channel/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_direct_channel/sidebar_direct_channel.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_direct_channel/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_group_channel/sidebar_group_channel.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_group_channel/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_channel/sidebar_channel.tsx","webpack://mattermost-webapp/./src/components/team_controller/actions/index.ts","webpack://mattermost-webapp/./src/components/channel_layout/channel_identifier_router/actions.ts","webpack://mattermost-webapp/./src/components/center_message_lock/index.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/channel_intro_private_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/channel_intro_public_svg.tsx","webpack://mattermost-webapp/./src/components/common/svg_images_components/channel_intro_town_square_svg.tsx","webpack://mattermost-webapp/./src/components/post_view/channel_intro_message/add_members_button.tsx","webpack://mattermost-webapp/./src/components/post_view/channel_intro_message/pluggable_intro_buttons/pluggable_intro_buttons.tsx","webpack://mattermost-webapp/./src/components/post_view/channel_intro_message/pluggable_intro_buttons/index.ts","webpack://mattermost-webapp/./src/components/post_view/channel_intro_message/channel_intro_message.tsx","webpack://mattermost-webapp/./src/components/post_view/channel_intro_message/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_list_row/post_list_row.tsx","webpack://mattermost-webapp/./src/components/post_view/post_list_row/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/scroll_to_bottom_icon.tsx","webpack://mattermost-webapp/./src/components/post_view/scroll_to_bottom_arrows.tsx","webpack://mattermost-webapp/./src/components/hint-toast/hint_toast.tsx","webpack://mattermost-webapp/./src/components/scroll_to_bottom_toast/scroll_to_bottom_toast.tsx","webpack://mattermost-webapp/./src/components/scroll_to_bottom_toast/index.tsx","webpack://mattermost-webapp/./src/components/toast_wrapper/toast_wrapper.tsx","webpack://mattermost-webapp/./src/components/toast_wrapper/index.ts","webpack://mattermost-webapp/./src/components/post_view/post_list_virtualized/latest_post_reader.tsx","webpack://mattermost-webapp/./src/components/post_view/post_list_virtualized/post_list_virtualized.tsx","webpack://mattermost-webapp/./src/components/post_view/post_list/post_list.tsx","webpack://mattermost-webapp/./src/components/post_view/post_list/index.tsx","webpack://mattermost-webapp/./src/components/post_view/post_view.tsx","webpack://mattermost-webapp/./src/components/post_view/index.ts","webpack://mattermost-webapp/./src/components/channel_view/input_loading.tsx","webpack://mattermost-webapp/./src/components/channel_view/channel_view.tsx","webpack://mattermost-webapp/./src/components/channel_view/index.ts","webpack://mattermost-webapp/./src/components/channel_layout/channel_identifier_router/channel_identifier_router.tsx","webpack://mattermost-webapp/./src/components/channel_layout/channel_identifier_router/index.ts","webpack://mattermost-webapp/./src/components/channel_layout/center_channel/center_channel.tsx","webpack://mattermost-webapp/./src/components/channel_layout/center_channel/index.ts","webpack://mattermost-webapp/./src/components/query_param_actions/query_param_action_controller.tsx","webpack://mattermost-webapp/./src/components/data_prefetch/actions.ts","webpack://mattermost-webapp/./src/components/data_prefetch/data_prefetch.tsx","webpack://mattermost-webapp/./src/components/data_prefetch/index.ts","webpack://mattermost-webapp/./src/components/resizable_sidebar/resizable_lhs/index.tsx","webpack://mattermost-webapp/./src/selectors/views/add_channel_dropdown.ts","webpack://mattermost-webapp/./src/components/sidebar/add_channel_dropdown.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_header/sidebar_header.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_header/index.ts","webpack://mattermost-webapp/./src/components/quick_switch_modal/quick_switch_modal.tsx","webpack://mattermost-webapp/./src/components/quick_switch_modal/index.tsx","webpack://mattermost-webapp/./src/components/sidebar/channel_filter/channel_filter.tsx","webpack://mattermost-webapp/./src/components/sidebar/channel_filter/index.ts","webpack://mattermost-webapp/./src/components/sidebar/channel_navigator/channel_navigator.tsx","webpack://mattermost-webapp/./src/components/sidebar/channel_navigator/index.ts","webpack://mattermost-webapp/./src/components/delete_category_modal/delete_category_modal.tsx","webpack://mattermost-webapp/./src/components/delete_category_modal/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category_menu/index.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category_sorting_menu.tsx","webpack://mattermost-webapp/./src/components/sidebar/add_channels_cta_button.tsx","webpack://mattermost-webapp/./src/components/sidebar/invite_members_button.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/sidebar_category.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_category/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar_list/sidebar_list.tsx","webpack://mattermost-webapp/./src/components/sidebar/sidebar_list/index.ts","webpack://mattermost-webapp/./src/components/sidebar/sidebar.tsx","webpack://mattermost-webapp/./src/components/sidebar/index.ts","webpack://mattermost-webapp/./src/components/threading/channel_threads/posts_channel_reset_watcher/posts_channel_reset_watcher.tsx","webpack://mattermost-webapp/./src/components/unreads_status_handler/unreads_status_handler.tsx","webpack://mattermost-webapp/./src/components/unreads_status_handler/index.ts","webpack://mattermost-webapp/./src/components/channel_layout/channel_controller.tsx","webpack://mattermost-webapp/./src/components/team_controller/team_controller.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useTelemetryIdentifySync.tsx","webpack://mattermost-webapp/./src/components/team_controller/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/checkbox_checked_icon.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/channel_bookmarks.ts","webpack://mattermost-webapp/./src/selectors/lhs.ts","webpack://mattermost-webapp/./src/types/actions.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChannelBookmark, ChannelBookmarkCreate, ChannelBookmarkPatch} from '@mattermost/types/channel_bookmarks';\n\nimport * as Actions from 'mattermost-redux/actions/channel_bookmarks';\n\nimport {getConnectionId} from 'selectors/general';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nexport function deleteBookmark(channelId: string, id: string): ActionFuncAsync<boolean> {\n    return (dispatch, getState) => {\n        const state = getState();\n        const connectionId = getConnectionId(state);\n        return dispatch(Actions.deleteBookmark(channelId, id, connectionId));\n    };\n}\n\nexport function createBookmark(channelId: string, bookmark: ChannelBookmarkCreate): ActionFuncAsync<boolean> {\n    return (dispatch, getState) => {\n        const state = getState();\n        const connectionId = getConnectionId(state);\n        return dispatch(Actions.createBookmark(channelId, bookmark, connectionId));\n    };\n}\n\nexport function editBookmark(channelId: string, id: string, patch: ChannelBookmarkPatch): ActionFuncAsync<boolean> {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const connectionId = getConnectionId(state);\n        return dispatch(Actions.editBookmark(channelId, id, patch, connectionId));\n    };\n}\n\nexport function reorderBookmark(channelId: string, id: string, newOrder: number): ActionFuncAsync<boolean> {\n    return (dispatch, getState) => {\n        const state = getState();\n        const connectionId = getConnectionId(state);\n        return dispatch(Actions.reorderBookmark(channelId, id, newOrder, connectionId));\n    };\n}\n\nexport function fetchChannelBookmarks(channelId: string): ActionFuncAsync<ChannelBookmark[]> {\n    return Actions.fetchChannelBookmarks(channelId);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChannelBookmark, ChannelBookmarkCreate, ChannelBookmarkPatch} from '@mattermost/types/channel_bookmarks';\n\nimport {ChannelBookmarkTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\nimport {getChannelBookmark} from 'mattermost-redux/selectors/entities/channel_bookmarks';\nimport type {ActionFuncAsync, DispatchFunc} from 'mattermost-redux/types/actions';\n\nimport {logError} from './errors';\nimport {forceLogoutIfNecessary} from './helpers';\n\nexport function deleteBookmark(channelId: string, id: string, connectionId: string): ActionFuncAsync<boolean> {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const bookmark = getChannelBookmark(state, channelId, id);\n\n        try {\n            await Client4.deleteChannelBookmark(channelId, id, connectionId);\n\n            dispatch({\n                type: ChannelBookmarkTypes.BOOKMARK_DELETED,\n                data: bookmark,\n            });\n        } catch (error) {\n            return {\n                data: false,\n                error,\n            };\n        }\n\n        return {data: true};\n    };\n}\n\nexport function createBookmark(channelId: string, bookmark: ChannelBookmarkCreate, connectionId: string): ActionFuncAsync<boolean> {\n    return async (dispatch: DispatchFunc) => {\n        try {\n            const createdBookmark = await Client4.createChannelBookmark(channelId, bookmark, connectionId);\n\n            dispatch({\n                type: ChannelBookmarkTypes.RECEIVED_BOOKMARK,\n                data: createdBookmark,\n            });\n        } catch (error) {\n            return {\n                data: false,\n                error,\n            };\n        }\n\n        return {data: true};\n    };\n}\n\nexport function editBookmark(channelId: string, id: string, patch: ChannelBookmarkPatch, connectionId: string): ActionFuncAsync<boolean> {\n    return async (dispatch: DispatchFunc) => {\n        try {\n            const {updated, deleted} = await Client4.updateChannelBookmark(channelId, id, patch, connectionId);\n\n            if (updated) {\n                dispatch({\n                    type: ChannelBookmarkTypes.RECEIVED_BOOKMARK,\n                    data: updated,\n                });\n            }\n\n            if (deleted) {\n                dispatch({\n                    type: ChannelBookmarkTypes.BOOKMARK_DELETED,\n                    data: deleted,\n                });\n            }\n        } catch (error) {\n            return {\n                data: false,\n                error,\n            };\n        }\n\n        return {data: true};\n    };\n}\n\nexport function reorderBookmark(channelId: string, id: string, newOrder: number, connectionId: string): ActionFuncAsync<boolean> {\n    return async (dispatch: DispatchFunc) => {\n        try {\n            const bookmarks = await Client4.updateChannelBookmarkSortOrder(channelId, id, newOrder, connectionId);\n\n            dispatch({\n                type: ChannelBookmarkTypes.RECEIVED_BOOKMARKS,\n                data: {channelId, bookmarks},\n            });\n        } catch (error) {\n            return {\n                data: false,\n                error,\n            };\n        }\n\n        return {data: true};\n    };\n}\n\nexport function fetchChannelBookmarks(channelId: string): ActionFuncAsync<ChannelBookmark[]> {\n    return async (dispatch, getState) => {\n        let bookmarks;\n        try {\n            bookmarks = await Client4.getChannelBookmarks(channelId);\n\n            dispatch({\n                type: ChannelBookmarkTypes.RECEIVED_BOOKMARKS,\n                data: {channelId, bookmarks},\n            });\n        } catch (error) {\n            forceLogoutIfNecessary(error, dispatch, getState);\n            dispatch(logError(error));\n            return {error};\n        }\n\n        return {data: bookmarks};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createCategory as createCategoryRedux, moveChannelsToCategory} from 'mattermost-redux/actions/channel_categories';\nimport {General} from 'mattermost-redux/constants';\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {getCategory, makeGetChannelIdsForCategory} from 'mattermost-redux/selectors/entities/channel_categories';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {insertMultipleWithoutDuplicates} from 'mattermost-redux/utils/array_utils';\n\nimport {getCategoriesForCurrentTeam, getChannelsInCategoryOrder, getDisplayedChannels} from 'selectors/views/channel_sidebar';\n\nimport {ActionTypes} from 'utils/constants';\n\nimport type {ActionFunc, ActionFuncAsync, DraggingState, GlobalState} from 'types/store';\n\nexport function setUnreadFilterEnabled(enabled: boolean) {\n    return {\n        type: ActionTypes.SET_UNREAD_FILTER_ENABLED,\n        enabled,\n    };\n}\n\nexport function setDraggingState(data: DraggingState) {\n    return {\n        type: ActionTypes.SIDEBAR_DRAGGING_SET_STATE,\n        data,\n    };\n}\n\nexport function stopDragging() {\n    return {type: ActionTypes.SIDEBAR_DRAGGING_STOP};\n}\n\nexport function createCategory(teamId: string, displayName: string, channelIds?: string[]): ActionFuncAsync<unknown> {\n    return async (dispatch, getState) => {\n        if (channelIds) {\n            const state = getState();\n            const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n            channelIds.forEach((channelId) => {\n                if (multiSelectedChannelIds.indexOf(channelId) >= 0) {\n                    dispatch(multiSelectChannelAdd(channelId));\n                }\n            });\n        }\n\n        const result = await dispatch(createCategoryRedux(teamId, displayName, channelIds));\n        return dispatch({\n            type: ActionTypes.ADD_NEW_CATEGORY_ID,\n            data: result.data!.id,\n        });\n    };\n}\n\n// addChannelsInSidebar moves channels to a given category without specifying the order in the sidebar, so the channels\n// will always go to the first position in the category\nexport function addChannelsInSidebar(categoryId: string, channelId: string) {\n    return moveChannelsInSidebar(categoryId, 0, channelId, false);\n}\n\n// moveChannelsInSidebar moves channels to a given category in the sidebar, but it accounts for when the target index\n// may have changed due to archived channels not being shown in the sidebar.\nexport function moveChannelsInSidebar(categoryId: string, targetIndex: number, draggableChannelId: string, setManualSorting = true): ActionFuncAsync<unknown> {\n    return (dispatch, getState) => {\n        const state = getState();\n        const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n        let channelIds = [];\n\n        // Multi channel case\n        if (multiSelectedChannelIds.length && multiSelectedChannelIds.indexOf(draggableChannelId) !== -1) {\n            const categories = getCategoriesForCurrentTeam(state);\n            const displayedChannels = getDisplayedChannels(state);\n\n            let channelsToMove = [draggableChannelId];\n\n            // Filter out channels that can't go in the category specified\n            const targetCategory = categories.find((category) => category.id === categoryId);\n            channelsToMove = multiSelectedChannelIds.filter((channelId) => {\n                const selectedChannel = displayedChannels.find((channel) => channelId === channel.id);\n                const isDMGM = selectedChannel?.type === General.DM_CHANNEL || selectedChannel?.type === General.GM_CHANNEL;\n                return targetCategory?.type === CategoryTypes.CUSTOM || targetCategory?.type === CategoryTypes.FAVORITES || (isDMGM && targetCategory?.type === CategoryTypes.DIRECT_MESSAGES) || (!isDMGM && targetCategory?.type !== CategoryTypes.DIRECT_MESSAGES);\n            });\n\n            // Reorder such that the channels move in the order that they appear in the sidebar\n            const displayedChannelIds = displayedChannels.map((channel) => channel.id);\n            channelsToMove.sort((a, b) => displayedChannelIds.indexOf(a) - displayedChannelIds.indexOf(b));\n\n            // Remove selection from channels that were moved\n            channelsToMove.forEach((channelId) => dispatch(multiSelectChannelAdd(channelId)));\n            channelIds = channelsToMove;\n        } else {\n            channelIds = [draggableChannelId];\n        }\n\n        const newIndex = adjustTargetIndexForMove(state, categoryId, channelIds, targetIndex, draggableChannelId);\n        return dispatch(moveChannelsToCategory(categoryId, channelIds, newIndex, setManualSorting));\n    };\n}\n\nexport function adjustTargetIndexForMove(state: GlobalState, categoryId: string, channelIds: string[], targetIndex: number, draggableChannelId: string) {\n    if (targetIndex === 0) {\n        // The channel is being placed first, so there's nothing above that could affect the index\n        return 0;\n    }\n\n    const category = getCategory(state, categoryId);\n    const filteredChannelIds = makeGetChannelIdsForCategory()(state, category);\n\n    // When dragging multiple channels, we don't actually remove all of them from the list as react-beautiful-dnd doesn't support that\n    // Account for channels removed above the insert point, except the one currently being dragged which is already accounted for by react-beautiful-dnd\n    const removedChannelsAboveInsert = filteredChannelIds.filter((channel, index) => channel !== draggableChannelId && channelIds.indexOf(channel) !== -1 && index <= targetIndex);\n    const shiftedIndex = targetIndex - removedChannelsAboveInsert.length;\n\n    if (category.channel_ids.length === filteredChannelIds.length) {\n        // There are no archived channels in the category, so the shiftedIndex will be correct\n        return shiftedIndex;\n    }\n\n    const updatedChannelIds = insertMultipleWithoutDuplicates(filteredChannelIds, channelIds, shiftedIndex);\n\n    // After \"moving\" the channel in the sidebar, find what channel comes above it\n    const previousChannelId = updatedChannelIds[updatedChannelIds.indexOf(channelIds[0]) - 1];\n\n    // We want the channel to still be below that channel, so place the new index below it\n    let newIndex = category.channel_ids.indexOf(previousChannelId) + 1;\n\n    // If the channel is moving downwards, then the target index will need to be reduced by one to account for\n    // the channel being removed. For example, if we're moving channelA from [channelA, channelB, channelC] to\n    // [channelB, channelA, channelC], newIndex would currently be 2 (which comes after channelB), but we need\n    // it to be 1 (which comes after channelB once channelA is removed).\n    const sourceIndex = category.channel_ids.indexOf(channelIds[0]);\n    if (sourceIndex !== -1 && sourceIndex < newIndex) {\n        newIndex -= 1;\n    }\n\n    return Math.max(newIndex - removedChannelsAboveInsert.length, 0);\n}\n\nexport function clearChannelSelection(): ActionFunc<unknown> {\n    return (dispatch, getState) => {\n        const state = getState();\n\n        if (state.views.channelSidebar.multiSelectedChannelIds.length === 0) {\n            // No selection to clear\n            return {data: false};\n        }\n\n        dispatch({\n            type: ActionTypes.MULTISELECT_CHANNEL_CLEAR,\n        });\n\n        return {data: true};\n    };\n}\n\nexport function multiSelectChannelAdd(channelId: string): ActionFunc<unknown> {\n    return (dispatch, getState) => {\n        const state = getState();\n        const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n\n        // Nothing already selected, so we include the active channel\n        if (!multiSelectedChannelIds.length) {\n            const currentChannel = getCurrentChannelId(state);\n            dispatch({\n                type: ActionTypes.MULTISELECT_CHANNEL,\n                data: currentChannel,\n            });\n        }\n\n        return dispatch({\n            type: ActionTypes.MULTISELECT_CHANNEL_ADD,\n            data: channelId,\n        });\n    };\n}\n\n// Much of this logic was pulled from the react-beautiful-dnd sample multiselect implementation\n// Found here: https://github.com/atlassian/react-beautiful-dnd/tree/master/stories/src/multi-drag\nexport function multiSelectChannelTo(channelId: string): ActionFunc<unknown> {\n    return (dispatch, getState) => {\n        const state = getState();\n        const multiSelectedChannelIds = state.views.channelSidebar.multiSelectedChannelIds;\n        let lastSelected = state.views.channelSidebar.lastSelectedChannel;\n\n        // Nothing already selected, so start with the active channel\n        if (!multiSelectedChannelIds.length) {\n            const currentChannel = getCurrentChannelId(state);\n            dispatch({\n                type: ActionTypes.MULTISELECT_CHANNEL,\n                data: currentChannel,\n            });\n            lastSelected = currentChannel;\n        }\n\n        const allChannelsIdsInOrder = getChannelsInCategoryOrder(state).map((channel) => channel.id);\n        const indexOfNew: number = allChannelsIdsInOrder.indexOf(channelId);\n        const indexOfLast: number = allChannelsIdsInOrder.indexOf(lastSelected);\n\n        // multi selecting in the same column\n        // need to select everything between the last index and the current index inclusive\n\n        // nothing to do here\n        if (indexOfNew === indexOfLast) {\n            return {data: false};\n        }\n\n        const start: number = Math.min(indexOfLast, indexOfNew);\n        const end: number = Math.max(indexOfLast, indexOfNew);\n\n        const inBetween = allChannelsIdsInOrder.slice(start, end + 1);\n\n        // everything inbetween needs to have it's selection toggled.\n        // with the exception of the start and end values which will always be selected\n\n        return dispatch({\n            type: ActionTypes.MULTISELECT_CHANNEL_TO,\n            data: inBetween,\n        });\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport type {IntlShape} from 'react-intl';\nimport {injectIntl, FormattedMessage, defineMessage} from 'react-intl';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {Group, SyncablePatch} from '@mattermost/types/groups';\nimport {SyncableType} from '@mattermost/types/groups';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport MultiSelect from 'components/multiselect/multiselect';\nimport type {Value} from 'components/multiselect/multiselect';\n\nimport groupsAvatar from 'images/groups-avatar.png';\nimport Constants from 'utils/constants';\n\nconst GROUPS_PER_PAGE = 50;\nconst MAX_SELECTABLE_VALUES = 10;\n\ntype GroupValue = (Group & Value);\n\nexport type Props = {\n    currentChannelName: string;\n    currentChannelId: string;\n    intl: IntlShape;\n    teamID: string;\n    searchTerm: string;\n    groups: Group[];\n    excludeGroups?: Group[];\n    includeGroups?: Group[];\n    onExited: () => void;\n    skipCommit?: boolean;\n    onAddCallback?: (groupIDs: string[]) => void;\n\n    actions: {\n        getGroupsNotAssociatedToChannel: (channelID: string, q?: string, page?: number, perPage?: number, filterParentTeamPermitted?: boolean) => Promise<ActionResult>;\n        setModalSearchTerm: (term: string) => void;\n        linkGroupSyncable: (groupID: string, syncableID: string, syncableType: SyncableType, patch: Partial<SyncablePatch>) => Promise<ActionResult>;\n        getAllGroupsAssociatedToChannel: (channelID: string, filterAllowReference: boolean, includeMemberCount: boolean) => Promise<ActionResult>;\n        getTeam: (teamId: string) => Promise<ActionResult>;\n        getAllGroupsAssociatedToTeam: (teamID: string, filterAllowReference: boolean, includeMemberCount: boolean) => Promise<ActionResult>;\n    };\n}\n\ntype State = {\n    values: GroupValue[];\n    show: boolean;\n    search: boolean;\n    saving: boolean;\n    addError: string | null;\n    loadingGroups: boolean;\n}\n\nexport class AddGroupsToChannelModal extends React.PureComponent<Props, State> {\n    private searchTimeoutId: number;\n    private selectedItemRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            values: [],\n            show: true,\n            search: false,\n            saving: false,\n            addError: null,\n            loadingGroups: true,\n        };\n\n        this.selectedItemRef = React.createRef();\n    }\n\n    componentDidMount() {\n        Promise.all([\n            this.props.actions.getTeam(this.props.teamID),\n            this.props.actions.getAllGroupsAssociatedToTeam(this.props.teamID, false, true),\n            this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, '', 0, GROUPS_PER_PAGE + 1, true),\n            this.props.actions.getAllGroupsAssociatedToChannel(this.props.currentChannelId, false, true),\n        ]).then(() => {\n            this.setGroupsLoadingState(false);\n        });\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.searchTerm !== prevProps.searchTerm) {\n            clearTimeout(this.searchTimeoutId);\n\n            const searchTerm = this.props.searchTerm;\n            if (searchTerm === '') {\n                return;\n            }\n\n            this.searchTimeoutId = window.setTimeout(\n                async () => {\n                    this.setGroupsLoadingState(true);\n                    await this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, searchTerm, undefined, undefined, true);\n                    this.setGroupsLoadingState(false);\n                },\n                Constants.SEARCH_TIMEOUT_MILLISECONDS,\n            );\n        }\n    }\n\n    handleHide = () => {\n        this.props.actions.setModalSearchTerm('');\n        this.setState({show: false});\n    };\n\n    handleResponse = (err?: ServerError) => {\n        let addError = null;\n        if (err && err.message) {\n            addError = err.message;\n        }\n\n        this.setState({\n            saving: false,\n            addError,\n        });\n    };\n\n    handleSubmit = async () => {\n        const groupIDs = this.state.values.map((v) => v.id);\n        if (groupIDs.length === 0) {\n            return;\n        }\n\n        if (this.props.skipCommit) {\n            if (this.props.onAddCallback) {\n                this.props.onAddCallback(groupIDs);\n            }\n            this.handleHide();\n            return;\n        }\n\n        this.setState({saving: true});\n\n        await Promise.all(groupIDs.map(async (groupID) => {\n            const {error} = await this.props.actions.linkGroupSyncable(groupID, this.props.currentChannelId, SyncableType.Channel, {auto_add: true});\n            this.handleResponse(error);\n            if (!error) {\n                this.handleHide();\n            }\n        }));\n    };\n\n    addValue = (value: GroupValue) => {\n        const values = Object.assign([], this.state.values);\n        const userIds = values.map((v: Group) => v.id);\n        if (value && value.id && userIds.indexOf(value.id) === -1) {\n            values.push(value);\n        }\n\n        this.setState({values});\n    };\n\n    setGroupsLoadingState = (loadingState: boolean) => {\n        this.setState({\n            loadingGroups: loadingState,\n        });\n    };\n\n    handlePageChange = (page: number, prevPage: number) => {\n        if (page > prevPage) {\n            this.setGroupsLoadingState(true);\n            this.props.actions.getGroupsNotAssociatedToChannel(this.props.currentChannelId, this.props.searchTerm, page, GROUPS_PER_PAGE + 1, true).then(() => {\n                this.setGroupsLoadingState(false);\n            });\n        }\n    };\n\n    handleDelete = (values: GroupValue[]) => {\n        this.setState({values});\n    };\n\n    search = (term: string) => {\n        this.props.actions.setModalSearchTerm(term);\n    };\n\n    renderOption = (option: GroupValue, isSelected: boolean, onAdd: (value: GroupValue) => void, onMouseMove?: (value: GroupValue) => void) => {\n        const rowSelected = isSelected ? 'more-modal__row--selected' : '';\n\n        return (\n            <div\n                key={option.id}\n                ref={isSelected ? this.selectedItemRef : option.id}\n                className={'more-modal__row clickable ' + rowSelected}\n                onClick={() => onAdd(option)}\n                onMouseMove={() => (onMouseMove ? onMouseMove(option) : undefined)}\n            >\n                <img\n                    className='more-modal__image'\n                    src={groupsAvatar}\n                    alt='group picture'\n                    width='32'\n                    height='32'\n                />\n                <div\n                    className='more-modal__details'\n                >\n                    <div className='more-modal__name'>\n                        {option.display_name}{'\\u00A0-\\u00A0'}<span className='more-modal__name_sub'>\n                            <FormattedMessage\n                                id='numMembers'\n                                defaultMessage='{num, number} {num, plural, one {member} other {members}}'\n                                values={{\n                                    num: option.member_count,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n                <div className='more-modal__actions'>\n                    <div className='more-modal__actions--round'>\n                        <i className='icon icon-plus'/>\n                    </div>\n                </div>\n            </div>\n        );\n    };\n\n    renderValue(props: { data: Partial<Value> }) {\n        return props.data.display_name;\n    }\n\n    render() {\n        const numRemainingText = (\n            <div id='numGroupsRemaining'>\n                <FormattedMessage\n                    id='multiselect.numGroupsRemaining'\n                    defaultMessage='Use ↑↓ to browse, ↵ to select. You can add {num, number} more {num, plural, one {group} other {groups}}. '\n                    values={{\n                        num: MAX_SELECTABLE_VALUES - this.state.values.length,\n                    }}\n                />\n            </div>\n        );\n\n        const buttonSubmitText = defineMessage({id: 'multiselect.add', defaultMessage: 'Add'});\n        const buttonSubmitLoadingText = defineMessage({id: 'multiselect.adding', defaultMessage: 'Adding...'});\n\n        let addError = null;\n        if (this.state.addError) {\n            addError = (<div className='has-error col-sm-12'><label className='control-label font-weight--normal'>{this.state.addError}</label></div>);\n        }\n        let groupsToShow = this.props.groups;\n        if (this.props.excludeGroups) {\n            const hasGroup = (og: Group) => !this.props.excludeGroups!.find((g) => g.id === og.id);\n            groupsToShow = groupsToShow.filter(hasGroup);\n        }\n        if (this.props.includeGroups) {\n            const hasGroup = (og: Group) => this.props.includeGroups!.find((g) => g.id === og.id);\n            groupsToShow = [...groupsToShow, ...this.props.includeGroups.filter(hasGroup)];\n        }\n        const groupsToShowValues = groupsToShow.map((group) => {\n            return {label: group.display_name, value: group.id, ...group};\n        });\n\n        return (\n            <Modal\n                id='addGroupsToChannelModal'\n                dialogClassName={'a11y__modal more-modal more-direct-channels'}\n                show={this.state.show}\n                onHide={this.handleHide}\n                onExited={this.props.onExited}\n            >\n                <Modal.Header closeButton={true}>\n                    <Modal.Title componentClass='h1'>\n                        <FormattedMessage\n                            id='add_groups_to_channel.title'\n                            defaultMessage='Add New Groups to {channelName} Channel'\n                            values={{\n                                channelName: (\n                                    <strong>{this.props.currentChannelName}</strong>\n                                ),\n                            }}\n                        />\n                    </Modal.Title>\n                </Modal.Header>\n                <Modal.Body>\n                    {addError}\n                    <MultiSelect\n                        key='addGroupsToChannelKey'\n                        options={groupsToShowValues}\n                        optionRenderer={this.renderOption}\n                        intl={this.props.intl}\n                        selectedItemRef={this.selectedItemRef}\n                        values={this.state.values}\n                        valueRenderer={this.renderValue}\n                        perPage={GROUPS_PER_PAGE}\n                        handlePageChange={this.handlePageChange}\n                        handleInput={this.search}\n                        handleDelete={this.handleDelete}\n                        handleAdd={this.addValue}\n                        handleSubmit={this.handleSubmit}\n                        maxValues={MAX_SELECTABLE_VALUES}\n                        numRemainingText={numRemainingText}\n                        buttonSubmitText={buttonSubmitText}\n                        buttonSubmitLoadingText={buttonSubmitLoadingText}\n                        saving={this.state.saving}\n                        loading={this.state.loadingGroups}\n                        placeholderText={defineMessage({id: 'multiselect.addGroupsPlaceholder', defaultMessage: 'Search and add groups'})}\n                    />\n                </Modal.Body>\n            </Modal>\n        );\n    }\n}\n\nexport default injectIntl(AddGroupsToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Group} from '@mattermost/types/groups';\n\nimport {getGroupsNotAssociatedToChannel, linkGroupSyncable, getAllGroupsAssociatedToChannel, getAllGroupsAssociatedToTeam} from 'mattermost-redux/actions/groups';\nimport {getTeam} from 'mattermost-redux/actions/teams';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getGroupsNotAssociatedToChannel as selectGroupsNotAssociatedToChannel} from 'mattermost-redux/selectors/entities/groups';\n\nimport {setModalSearchTerm} from 'actions/views/search';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddGroupsToChannelModal from './add_groups_to_channel_modal';\n\ntype OwnProps = {\n    channel: Channel;\n    skipCommit: boolean;\n    onAddCallback: (groupIDs: string[]) => void;\n    excludeGroups: Group[];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const searchTerm = state.views.search.modalSearch;\n\n    const channel = ownProps.channel || getCurrentChannel(state) || {};\n\n    let groups = selectGroupsNotAssociatedToChannel(state, channel.id, channel.team_id);\n    if (searchTerm) {\n        const regex = RegExp(searchTerm, 'i');\n        groups = groups.filter((group) => regex.test(group.display_name) || regex.test(group.name));\n    }\n\n    return {\n        currentChannelName: channel.display_name,\n        currentChannelId: channel.id,\n        skipCommit: ownProps.skipCommit,\n        onAddCallback: ownProps.onAddCallback,\n        excludeGroups: ownProps.excludeGroups,\n        searchTerm,\n        groups,\n        teamID: channel.team_id,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getGroupsNotAssociatedToChannel,\n            setModalSearchTerm,\n            linkGroupSyncable,\n            getAllGroupsAssociatedToChannel,\n            getTeam,\n            getAllGroupsAssociatedToTeam,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddGroupsToChannelModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {SVGProps} from 'react';\n\nconst SvgComponent = (props: SVGProps<SVGSVGElement>) => (\n    <svg\n        width={140}\n        height={141}\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        {...props}\n    >\n        <path\n            opacity={0.4}\n            d='M37.593 38.008c4.754-4.815 10.754-7.295 17.989-7.428 7.101.133 13.065 2.601 17.892 7.428 4.815 4.827 7.295 10.791 7.428 17.892-.133 7.235-2.601 13.223-7.428 17.99-4.827 4.754-10.791 7.27-17.892 7.512-7.235-.254-13.223-2.758-17.99-7.513-4.754-4.766-7.258-10.766-7.512-18 .254-7.102 2.758-13.066 7.513-17.881Z'\n            fill='#fff'\n        />\n        <path\n            d='M78.887 51.382c-2.151-6.992-6.225-12.225-12.226-15.69-6.001-3.465-12.57-4.376-19.701-2.743-3.9.995-7.297 2.717-10.22 5.162 3.269-3.567 7.415-6.037 12.428-7.416 7.13-1.633 13.732-.703 19.787 2.793s10.161 8.748 12.313 15.74c1.323 5.037 1.257 9.862-.21 14.47-1.454 4.614-4.066 8.49-7.84 11.611 2.833-3.087 4.783-6.713 5.844-10.894 1.05-4.187.991-8.522-.175-13.033Z'\n            fill='#000'\n            fillOpacity={0.4}\n        />\n        <path\n            d='M86.76 53.929c-.508-7.506-3.553-14.097-9.125-19.774-6.346-6.05-13.67-9.08-21.974-9.08-8.303 0-15.616 3.03-21.961 9.08-6.08 6.315-9.126 13.591-9.126 21.855 0 8.262 3.046 15.551 9.126 21.854 5.826 5.556 12.485 8.551 19.967 8.984 7.481.445 14.383-1.611 20.728-6.146l4.75 4.727 6.08-6.05-4.75-4.727c4.69-6.302 6.78-13.218 6.285-20.723Zm-13.126 19.87c-4.823 4.726-10.781 7.228-17.876 7.468-7.228-.252-13.21-2.742-17.973-7.469-4.75-4.727-7.252-10.692-7.506-17.885.254-7.06 2.756-12.99 7.506-17.789 4.75-4.787 10.745-7.252 17.973-7.385 7.095.133 13.053 2.586 17.876 7.385 4.81 4.8 7.288 10.73 7.421 17.79-.133 7.192-2.599 13.157-7.421 17.884Z'\n            fill='#BABEC9'\n        />\n        <path\n            d='M106.202 114.187c-1.567.449-2.728.291-3.482-.472L78.06 86.651c-.753-.762-1.064-1.743-.945-2.954.12-1.211.874-2.567 2.262-4.093 1.507-1.393 2.847-2.192 4.044-2.385 1.196-.194 2.165.157 2.92 1.053l26.921 24.957c.753.763.873 1.901.37 3.427-.502 1.525-1.447 3.051-2.823 4.577-1.496 1.526-3.039 2.506-4.607 2.954Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='m108.007 98.343-10.08 10.164-12.154-13.34 8.914-9.106 13.32 12.282Z'\n            fill='#7A5600'\n        />\n    </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage, defineMessages, injectIntl, type WrappedComponentProps} from 'react-intl';\n\nimport {ArchiveOutlineIcon, CheckIcon, ChevronDownIcon, GlobeIcon, LockOutlineIcon, AccountOutlineIcon, GlobeCheckedIcon} from '@mattermost/compass-icons/components';\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {isPrivateChannel} from 'mattermost-redux/utils/channel_utils';\n\nimport MagnifyingGlassSVG from 'components/common/svg_images_components/magnifying_glass_svg';\nimport LoadingScreen from 'components/loading_screen';\nimport * as Menu from 'components/menu';\nimport QuickInput from 'components/quick_input';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport CheckboxCheckedIcon from 'components/widgets/icons/checkbox_checked_icon';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {isArchivedChannel} from 'utils/channel_utils';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport * as UserAgent from 'utils/user_agent';\n\nimport type {FilterType} from './browse_channels/browse_channels';\nimport {Filter} from './browse_channels/browse_channels';\n\nconst NEXT_BUTTON_TIMEOUT_MILLISECONDS = 500;\n\ninterface Props extends WrappedComponentProps {\n    channels: Channel[];\n    channelsPerPage: number;\n    nextPage: (page: number) => void;\n    isSearch: boolean;\n    search: (term: string) => void;\n    handleJoin: (channel: Channel, done: () => void) => void;\n    noResultsText: JSX.Element;\n    changeFilter: (filter: FilterType) => void;\n    filter: FilterType;\n    myChannelMemberships: RelationOneToOne<Channel, ChannelMembership>;\n    closeModal: (modalId: string) => void;\n    hideJoinedChannelsPreference: (shouldHideJoinedChannels: boolean) => void;\n    rememberHideJoinedChannelsChecked: boolean;\n    canShowArchivedChannels?: boolean;\n    loading?: boolean;\n    channelsMemberCount?: Record<string, number>;\n}\n\ntype State = {\n    joiningChannel: string;\n    page: number;\n    nextDisabled: boolean;\n    channelSearchValue: string;\n    isSearch?: boolean;\n}\n\nexport class SearchableChannelList extends React.PureComponent<Props, State> {\n    private nextTimeoutId: number | NodeJS.Timeout;\n    private filter: React.RefObject<HTMLInputElement>;\n    private channelListScroll: React.RefObject<HTMLDivElement>;\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        return {isSearch: props.isSearch, page: props.isSearch && !state.isSearch ? 0 : state.page};\n    }\n\n    constructor(props: Props) {\n        super(props);\n\n        this.nextTimeoutId = 0;\n\n        this.state = {\n            joiningChannel: '',\n            page: 0,\n            nextDisabled: false,\n            channelSearchValue: '',\n        };\n\n        this.filter = React.createRef();\n        this.channelListScroll = React.createRef();\n    }\n\n    componentDidMount() {\n        // only focus the search box on desktop so that we don't cause the keyboard to open on mobile\n        if (!UserAgent.isMobile() && this.filter.current) {\n            this.filter.current.focus();\n        }\n        document.addEventListener('keydown', this.onKeyDown);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.onKeyDown);\n    }\n\n    onKeyDown = (e: KeyboardEvent) => {\n        const target = e.target as HTMLElement;\n        const isEnterKeyPressed = isKeyPressed(e, Constants.KeyCodes.ENTER);\n        if (isEnterKeyPressed && (e.shiftKey || e.ctrlKey || e.altKey)) {\n            return;\n        }\n        if (isEnterKeyPressed && target?.classList.contains('more-modal__row')) {\n            target.click();\n        }\n    };\n\n    handleJoin = (channel: Channel, e: React.MouseEvent) => {\n        e.stopPropagation();\n        this.setState({joiningChannel: channel.id});\n        this.props.handleJoin(\n            channel,\n            () => {\n                this.setState({joiningChannel: ''});\n            },\n        );\n        if (this.isMemberOfChannel(channel.id)) {\n            this.props.closeModal(ModalIdentifiers.MORE_CHANNELS);\n        }\n    };\n\n    isMemberOfChannel(channelId: string) {\n        return this.props.myChannelMemberships[channelId];\n    }\n\n    createChannelRow = (channel: Channel) => {\n        const ariaLabel = `${channel.display_name}, ${channel.purpose}`.toLowerCase();\n        let channelTypeIcon;\n\n        if (isArchivedChannel(channel)) {\n            channelTypeIcon = <ArchiveOutlineIcon size={18}/>;\n        } else if (isPrivateChannel(channel)) {\n            channelTypeIcon = <LockOutlineIcon size={18}/>;\n        } else {\n            channelTypeIcon = <GlobeIcon size={18}/>;\n        }\n        let memberCount = 0;\n        if (this.props.channelsMemberCount?.[channel.id]) {\n            memberCount = this.props.channelsMemberCount[channel.id];\n        }\n\n        const membershipIndicator = this.isMemberOfChannel(channel.id) ? (\n            <div\n                id='membershipIndicatorContainer'\n                aria-label={this.props.intl.formatMessage({id: 'more_channels.membership_indicator', defaultMessage: 'Membership Indicator: Joined'})}\n            >\n                <CheckIcon size={14}/>\n                <FormattedMessage\n                    id={'more_channels.joined'}\n                    defaultMessage={'Joined'}\n                />\n            </div>\n        ) : null;\n\n        const channelPurposeContainerAriaLabel = this.props.intl.formatMessage(\n            messages.channelPurpose,\n            {memberCount, channelPurpose: channel.purpose || ''},\n        );\n\n        const channelPurposeContainer = (\n            <div\n                id='channelPurposeContainer'\n                aria-label={channelPurposeContainerAriaLabel}\n            >\n                {membershipIndicator}\n                {membershipIndicator ? <span className='dot'/> : null}\n                <AccountOutlineIcon size={14}/>\n                <span data-testid={`channelMemberCount-${channel.name}`} >{memberCount}</span>\n                {channel.purpose.length > 0 ? <span className='dot'/> : null}\n                <span className='more-modal__description'>{channel.purpose}</span>\n            </div>\n        );\n\n        const joinViewChannelButtonClass = classNames('btn btn-sm', {\n            'btn-secondary outlineButton': this.isMemberOfChannel(channel.id),\n            'btn-primary primaryButton': !this.isMemberOfChannel(channel.id),\n        });\n\n        const joinViewChannelButton = (\n            <button\n                id='joinViewChannelButton'\n                onClick={(e) => this.handleJoin(channel, e)}\n                className={joinViewChannelButtonClass}\n                disabled={Boolean(this.state.joiningChannel)}\n                tabIndex={-1}\n                aria-label={this.isMemberOfChannel(channel.id) ? this.props.intl.formatMessage({id: 'more_channels.view', defaultMessage: 'View'}) : this.props.intl.formatMessage({id: 'joinChannel.JoinButton', defaultMessage: 'Join'})}\n            >\n                <LoadingWrapper\n                    loading={this.state.joiningChannel === channel.id}\n                    text={messages.joiningButton}\n                >\n                    <FormattedMessage\n                        id={this.isMemberOfChannel(channel.id) ? 'more_channels.view' : 'joinChannel.JoinButton'}\n                        defaultMessage={this.isMemberOfChannel(channel.id) ? 'View' : 'Join'}\n                    />\n                </LoadingWrapper>\n            </button>\n        );\n\n        const sharedChannelIcon = channel.shared ? (\n            <SharedChannelIndicator\n                className='shared-channel-icon'\n                withTooltip={true}\n            />\n        ) : null;\n\n        return (\n            <div\n                className='more-modal__row'\n                key={channel.id}\n                id={`ChannelRow-${channel.name}`}\n                data-testid={`ChannelRow-${channel.name}`}\n                aria-label={ariaLabel}\n                onClick={(e) => this.handleJoin(channel, e)}\n                tabIndex={0}\n            >\n                <div className='more-modal__details'>\n                    <div className='style--none more-modal__name'>\n                        {channelTypeIcon}\n                        <span id='channelName'>{channel.display_name}</span>\n                        {sharedChannelIcon}\n                    </div>\n                    {channelPurposeContainer}\n                </div>\n                <div className='more-modal__actions'>\n                    {joinViewChannelButton}\n                </div>\n            </div>\n        );\n    };\n\n    nextPage = (e: React.MouseEvent) => {\n        e.preventDefault();\n        this.setState({page: this.state.page + 1, nextDisabled: true});\n        this.nextTimeoutId = setTimeout(() => this.setState({nextDisabled: false}), NEXT_BUTTON_TIMEOUT_MILLISECONDS);\n        this.props.nextPage(this.state.page + 1);\n        this.channelListScroll.current?.scrollTo({top: 0});\n    };\n\n    previousPage = (e: React.MouseEvent) => {\n        e.preventDefault();\n        this.setState({page: this.state.page - 1});\n        this.channelListScroll.current?.scrollTo({top: 0});\n    };\n\n    doSearch = () => {\n        this.props.search(this.state.channelSearchValue);\n        if (this.state.channelSearchValue === '') {\n            this.setState({page: 0});\n        }\n    };\n    handleChange = (e?: React.FormEvent<HTMLInputElement>) => {\n        if (e?.currentTarget) {\n            this.setState({channelSearchValue: e?.currentTarget.value}, () => this.doSearch());\n        }\n    };\n    handleClear = () => {\n        this.setState({channelSearchValue: ''}, () => this.doSearch());\n    };\n    handleChecked = () => {\n        // If it was checked, and now we're unchecking it, clear the preference\n        if (this.props.rememberHideJoinedChannelsChecked) {\n            this.props.hideJoinedChannelsPreference(false);\n        } else {\n            this.props.hideJoinedChannelsPreference(true);\n        }\n    };\n    getEmptyStateMessage = () => {\n        if (this.state.channelSearchValue.length > 0) {\n            return (\n                <FormattedMessage\n                    id='more_channels.noMore'\n                    tagName='strong'\n                    defaultMessage='No results for {text}'\n                    values={{text: this.state.channelSearchValue}}\n                />\n            );\n        }\n        switch (this.props.filter) {\n        case Filter.Archived:\n            return (\n                <FormattedMessage\n                    id={'more_channels.noArchived'}\n                    tagName='strong'\n                    defaultMessage={'No archived channels'}\n                />\n            );\n        case Filter.Private:\n            return (\n                <FormattedMessage\n                    id={'more_channels.noPrivate'}\n                    tagName='strong'\n                    defaultMessage={'No private channels'}\n                />\n            );\n        case Filter.Public:\n            return (\n                <FormattedMessage\n                    id={'more_channels.noPublic'}\n                    tagName='strong'\n                    defaultMessage={'No public channels'}\n                />\n            );\n        default:\n            return (\n                <FormattedMessage\n                    id={'more_channels.noChannels'}\n                    tagName='strong'\n                    defaultMessage={'No channels'}\n                />\n            );\n        }\n    };\n    getFilterLabel = () => {\n        switch (this.props.filter) {\n        case Filter.Archived:\n            return (\n                <FormattedMessage\n                    id='more_channels.show_archived_channels'\n                    defaultMessage='Channel Type: Archived'\n                />\n            );\n        case Filter.Public:\n            return (\n                <FormattedMessage\n                    id='more_channels.show_public_channels'\n                    defaultMessage='Channel Type: Public'\n                />\n            );\n        case Filter.Private:\n            return (\n                <FormattedMessage\n                    id='more_channels.show_private_channels'\n                    defaultMessage='Channel Type: Private'\n                />\n            );\n        default:\n            return (\n                <FormattedMessage\n                    id='more_channels.show_all_channels'\n                    defaultMessage='Channel Type: All'\n                />\n            );\n        }\n    };\n\n    render() {\n        const channels = this.props.channels;\n        let listContent;\n        let nextButton;\n        let previousButton;\n\n        if (this.props.loading && channels.length === 0) {\n            listContent = <LoadingScreen/>;\n        } else if (channels.length === 0) {\n            listContent = (\n                <div\n                    className='no-channel-message'\n                    aria-label={this.state.channelSearchValue.length > 0 ? this.props.intl.formatMessage(messages.noMore, {text: this.state.channelSearchValue}) : this.props.intl.formatMessage({id: 'widgets.channels_input.empty', defaultMessage: 'No channels found'})\n                    }\n                >\n                    <MagnifyingGlassSVG/>\n                    <h3 className='primary-message'>\n                        {this.getEmptyStateMessage()}\n                    </h3>\n                    {this.props.noResultsText}\n                </div>\n            );\n        } else {\n            const pageStart = this.state.page * this.props.channelsPerPage;\n            const pageEnd = pageStart + this.props.channelsPerPage;\n            const channelsToDisplay = this.props.channels.slice(pageStart, pageEnd);\n            listContent = channelsToDisplay.map(this.createChannelRow);\n\n            if (channelsToDisplay.length >= this.props.channelsPerPage && pageEnd < this.props.channels.length) {\n                nextButton = (\n                    <button\n                        className='btn btn-sm btn-tertiary filter-control filter-control__next'\n                        onClick={this.nextPage}\n                        disabled={this.state.nextDisabled}\n                        aria-label={this.props.intl.formatMessage({id: 'more_channels.next', defaultMessage: 'Next'})}\n                    >\n                        <FormattedMessage\n                            id='more_channels.next'\n                            defaultMessage='Next'\n                        />\n                    </button>\n                );\n            }\n\n            if (this.state.page > 0) {\n                previousButton = (\n                    <button\n                        className='btn btn-sm btn-tertiary filter-control filter-control__prev'\n                        onClick={this.previousPage}\n                        aria-label={this.props.intl.formatMessage({id: 'more_channels.prev', defaultMessage: 'Previous'})}\n                    >\n                        <FormattedMessage\n                            id='more_channels.prev'\n                            defaultMessage='Previous'\n                        />\n                    </button>\n                );\n            }\n        }\n\n        const input = (\n            <div className='filter-row filter-row--full'>\n                <span\n                    id='searchIcon'\n                    aria-hidden='true'\n                >\n                    <i className='icon icon-magnify'/>\n                </span>\n                <QuickInput\n                    id='searchChannelsTextbox'\n                    ref={this.filter}\n                    className='form-control filter-textbox'\n                    placeholder={this.props.intl.formatMessage({id: 'filtered_channels_list.search', defaultMessage: 'Search channels'})}\n                    onInput={this.handleChange}\n                    clearable={true}\n                    onClear={this.handleClear}\n                    value={this.state.channelSearchValue}\n                    aria-label={this.props.intl.formatMessage({id: 'filtered_channels_list.search', defaultMessage: 'Search Channels'})}\n                />\n            </div>\n        );\n\n        const checkIcon = (\n            <CheckIcon\n                size={18}\n                color={'var(--button-bg)'}\n            />\n        );\n        const channelDropdownItems = [\n            <Menu.Item\n                key='channelsMoreDropdownAll'\n                id='channelsMoreDropdownAll'\n                onClick={() => this.props.changeFilter(Filter.All)}\n                leadingElement={<GlobeCheckedIcon size={16}/>}\n                labels={\n                    <FormattedMessage\n                        id='suggestion.all'\n                        defaultMessage='All channel types'\n                    />\n                }\n                trailingElements={this.props.filter === Filter.All ? checkIcon : null}\n                aria-label={this.props.intl.formatMessage({id: 'suggestion.all', defaultMessage: 'All channel types'})}\n            />,\n            <Menu.Item\n                key='channelsMoreDropdownPublic'\n                id='channelsMoreDropdownPublic'\n                onClick={() => this.props.changeFilter(Filter.Public)}\n                leadingElement={<GlobeIcon size={16}/>}\n                labels={\n                    <FormattedMessage\n                        id='suggestion.public'\n                        defaultMessage='Public channels'\n                    />\n                }\n                trailingElements={this.props.filter === Filter.Public ? checkIcon : null}\n                aria-label={this.props.intl.formatMessage({id: 'suggestion.public', defaultMessage: 'Public channels'})}\n            />,\n            <Menu.Item\n                key='channelsMoreDropdownPrivate'\n                id='channelsMoreDropdownPrivate'\n                onClick={() => this.props.changeFilter(Filter.Private)}\n                leadingElement={<LockOutlineIcon size={16}/>}\n                labels={\n                    <FormattedMessage\n                        id='suggestion.private'\n                        defaultMessage='Private channels'\n                    />\n                }\n                trailingElements={this.props.filter === Filter.Private ? checkIcon : null}\n                aria-label={this.props.intl.formatMessage({id: 'suggestion.private', defaultMessage: 'Private channels'})}\n            />,\n        ];\n\n        if (this.props.canShowArchivedChannels) {\n            channelDropdownItems.push(\n                <Menu.Separator key='channelsMoreDropdownSeparator'/>,\n                <Menu.Item\n                    key='channelsMoreDropdownArchived'\n                    id='channelsMoreDropdownArchived'\n                    onClick={() => this.props.changeFilter(Filter.Archived)}\n                    leadingElement={<ArchiveOutlineIcon size={16}/>}\n                    labels={\n                        <FormattedMessage\n                            id='suggestion.archive'\n                            defaultMessage='Archived channels'\n                        />\n                    }\n                    trailingElements={this.props.filter === Filter.Archived ? checkIcon : null}\n                    aria-label={this.props.intl.formatMessage({id: 'suggestion.archive', defaultMessage: 'Archived channels'})}\n                />,\n            );\n        }\n        const menuButton = (\n            <>\n                {this.getFilterLabel()}\n                <ChevronDownIcon\n                    color={'rgba(var(--center-channel-color-rgb), 0.64)'}\n                    size={16}\n                />\n            </>\n        );\n        const channelDropdown = (\n            <Menu.Container\n                menuButton={{\n                    id: 'menuWrapper',\n                    children: menuButton,\n                }}\n                menu={{\n                    id: 'browseChannelsDropdown',\n                    'aria-label': this.props.intl.formatMessage({id: 'more_channels.title', defaultMessage: 'Browse channels'}),\n                }}\n            >\n                {channelDropdownItems.map((item) => item)}\n            </Menu.Container >\n        );\n\n        const hideJoinedButtonClass = classNames('get-app__checkbox', {checked: this.props.rememberHideJoinedChannelsChecked});\n        const hideJoinedPreferenceCheckbox = (\n            <div\n                id={'hideJoinedPreferenceCheckbox'}\n                onClick={this.handleChecked}\n            >\n                <button\n                    className={hideJoinedButtonClass}\n                    aria-label={this.props.rememberHideJoinedChannelsChecked ? this.props.intl.formatMessage({id: 'more_channels.hide_joined_checked', defaultMessage: 'Hide joined channels checkbox, checked'}) : this.props.intl.formatMessage({id: 'more_channels.hide_joined_not_checked', defaultMessage: 'Hide joined channels checkbox, not checked'})}\n                >\n                    {this.props.rememberHideJoinedChannelsChecked ? <CheckboxCheckedIcon/> : null}\n                </button>\n                <FormattedMessage\n                    id='more_channels.hide_joined'\n                    defaultMessage='Hide Joined'\n                />\n            </div>\n        );\n\n        let channelCountLabel;\n        if (channels.length === 0) {\n            channelCountLabel = this.props.intl.formatMessage({id: 'more_channels.count_zero', defaultMessage: '0 Results'});\n        } else if (channels.length === 1) {\n            channelCountLabel = this.props.intl.formatMessage({id: 'more_channels.count_one', defaultMessage: '1 Result'});\n        } else if (channels.length > 1) {\n            channelCountLabel = this.props.intl.formatMessage(messages.channelCount, {count: channels.length});\n        } else {\n            channelCountLabel = this.props.intl.formatMessage({id: 'more_channels.count_zero', defaultMessage: '0 Results'});\n        }\n\n        const dropDownContainer = (\n            <div className='more-modal__dropdown'>\n                <span id='channelCountLabel'>{channelCountLabel}</span>\n                <div id='modalPreferenceContainer'>\n                    {channelDropdown}\n                    {hideJoinedPreferenceCheckbox}\n                </div>\n            </div>\n        );\n\n        return (\n            <div className='filtered-user-list'>\n                {input}\n                {dropDownContainer}\n                <div\n                    role='search'\n                    className='more-modal__list'\n                    tabIndex={-1}\n                >\n                    <div\n                        id='moreChannelsList'\n                        tabIndex={-1}\n                        ref={this.channelListScroll}\n                    >\n                        {listContent}\n                    </div>\n                </div>\n                <div className='filter-controls'>\n                    {previousButton}\n                    {nextButton}\n                </div>\n            </div>\n        );\n    }\n}\n\nconst messages = defineMessages({\n    channelCount: {\n        id: 'more_channels.count',\n        defaultMessage: '{count} Results',\n    },\n    channelPurpose: {\n        id: 'more_channels.channel_purpose',\n        defaultMessage: 'Channel Information: Membership Indicator: Joined, Member count {memberCount} , Purpose: {channelPurpose}',\n    },\n    joiningButton: {\n        id: 'joinChannel.joiningButton',\n        defaultMessage: 'Joining...',\n    },\n    noMore: {\n        id: 'more_channels.noMore',\n        defaultMessage: 'No results for {text}',\n    },\n});\n\nexport default injectIntl(SearchableChannelList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {Channel, ChannelMembership, ChannelSearchOpts, ChannelsWithTotalCount} from '@mattermost/types/channels';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport LoadingScreen from 'components/loading_screen';\nimport NewChannelModal from 'components/new_channel_modal/new_channel_modal';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport SearchableChannelList from 'components/searchable_channel_list';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants, {ModalIdentifiers, RHSStates, StoragePrefixes} from 'utils/constants';\nimport {getRelativeChannelURL} from 'utils/url';\nimport {localizeMessage} from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\nimport type {RhsState} from 'types/store/rhs';\n\nimport './browse_channels.scss';\n\nconst CHANNELS_CHUNK_SIZE = 50;\nconst CHANNELS_PER_PAGE = 50;\nconst SEARCH_TIMEOUT_MILLISECONDS = 100;\nexport enum Filter {\n    All = 'All',\n    Public = 'Public',\n    Private = 'Private',\n    Archived = 'Archived',\n}\n\nexport type FilterType = keyof typeof Filter;\n\ntype Actions = {\n    getChannels: (teamId: string, page: number, perPage: number) => Promise<ActionResult<Channel[]>>;\n    getArchivedChannels: (teamId: string, page: number, channelsPerPage: number) => Promise<ActionResult<Channel[]>>;\n    joinChannel: (currentUserId: string, teamId: string, channelId: string) => Promise<ActionResult>;\n    searchAllChannels: (term: string, opts?: ChannelSearchOpts) => Promise<ActionResult<Channel[] | ChannelsWithTotalCount>>;\n    openModal: <P>(modalData: ModalData<P>) => void;\n    closeModal: (modalId: string) => void;\n\n    /*\n     * Function to set a key-value pair in the local storage\n     */\n    setGlobalItem: (name: string, value: string) => void;\n    closeRightHandSide: () => void;\n    getChannelsMemberCount: (channelIds: string[]) => Promise<ActionResult>;\n}\n\nexport type Props = {\n    channels: Channel[];\n    archivedChannels: Channel[];\n    privateChannels: Channel[];\n    currentUserId: string;\n    teamId: string;\n    teamName?: string;\n    channelsRequestStarted?: boolean;\n    canShowArchivedChannels?: boolean;\n    myChannelMemberships: RelationOneToOne<Channel, ChannelMembership>;\n    shouldHideJoinedChannels: boolean;\n    rhsState?: RhsState;\n    rhsOpen?: boolean;\n    channelsMemberCount?: Record<string, number>;\n    actions: Actions;\n}\n\ntype State = {\n    loading: boolean;\n    filter: FilterType;\n    search: boolean;\n    searchedChannels: Channel[];\n    serverError: React.ReactNode | string;\n    searching: boolean;\n    searchTerm: string;\n}\n\nexport default class BrowseChannels extends React.PureComponent<Props, State> {\n    public searchTimeoutId: number;\n    activeChannels: Channel[] = [];\n\n    constructor(props: Props) {\n        super(props);\n\n        this.searchTimeoutId = 0;\n\n        this.state = {\n            loading: true,\n            filter: Filter.All,\n            search: false,\n            searchedChannels: [],\n            serverError: null,\n            searching: false,\n            searchTerm: '',\n        };\n    }\n\n    componentDidMount() {\n        if (!this.props.teamId) {\n            this.loadComplete();\n            return;\n        }\n\n        const promises = [\n            this.props.actions.getChannels(this.props.teamId, 0, CHANNELS_CHUNK_SIZE * 2),\n        ];\n\n        if (this.props.canShowArchivedChannels) {\n            promises.push(this.props.actions.getArchivedChannels(this.props.teamId, 0, CHANNELS_CHUNK_SIZE * 2));\n        }\n\n        Promise.all(promises).then((results) => {\n            const channelIDsForMemberCount = results.flatMap((result) => {\n                return result.data ? result.data.map((channel) => channel.id) : [];\n            },\n            );\n            this.props.privateChannels.forEach((channel) => channelIDsForMemberCount.push(channel.id));\n            if (channelIDsForMemberCount.length > 0) {\n                this.props.actions.getChannelsMemberCount(channelIDsForMemberCount);\n            }\n        });\n        this.loadComplete();\n    }\n\n    loadComplete = () => {\n        this.setState({loading: false});\n    };\n\n    handleNewChannel = () => {\n        this.handleExit();\n        this.closeEditRHS();\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.NEW_CHANNEL_MODAL,\n            dialogType: NewChannelModal,\n        });\n    };\n\n    handleExit = () => {\n        this.props.actions.closeModal(ModalIdentifiers.MORE_CHANNELS);\n    };\n\n    closeEditRHS = () => {\n        if (this.props.rhsOpen && this.props.rhsState === RHSStates.EDIT_HISTORY) {\n            this.props.actions.closeRightHandSide();\n        }\n    };\n\n    onChange = (force: boolean) => {\n        if (this.state.search && !force) {\n            return;\n        }\n\n        this.setState({\n            searchedChannels: [],\n            serverError: null,\n        });\n    };\n\n    nextPage = (page: number) => {\n        this.props.actions.getChannels(this.props.teamId, page + 1, CHANNELS_PER_PAGE).then((result) => {\n            if (result.data && result.data.length > 0) {\n                this.props.actions.getChannelsMemberCount(result.data.map((channel) => channel.id));\n            }\n        });\n    };\n\n    handleJoin = async (channel: Channel, done: () => void) => {\n        const {actions, currentUserId, teamId, teamName} = this.props;\n        let result;\n\n        if (!this.isMemberOfChannel(channel.id)) {\n            result = await actions.joinChannel(currentUserId, teamId, channel.id);\n        }\n\n        if (result?.error) {\n            this.setState({serverError: result.error.message});\n        } else {\n            this.props.actions.getChannelsMemberCount([channel.id]);\n            getHistory().push(getRelativeChannelURL(teamName!, channel.name));\n            this.closeEditRHS();\n        }\n\n        if (done) {\n            done();\n        }\n    };\n\n    search = (term: string) => {\n        clearTimeout(this.searchTimeoutId);\n\n        if (term === '') {\n            this.onChange(true);\n            this.setState({search: false, searchedChannels: [], searching: false, searchTerm: term});\n            this.searchTimeoutId = 0;\n            return;\n        }\n        this.setState({search: true, searching: true, searchTerm: term});\n\n        const searchTimeoutId = window.setTimeout(\n            async () => {\n                try {\n                    const {data} = await this.props.actions.searchAllChannels(term, {team_ids: [this.props.teamId], nonAdminSearch: true, include_deleted: true}) as ActionResult<Channel[]>;\n                    if (searchTimeoutId !== this.searchTimeoutId) {\n                        return;\n                    }\n\n                    if (data) {\n                        const channelIDsForMemberCount = data.map((channel: Channel) => channel.id);\n                        if (channelIDsForMemberCount.length > 0) {\n                            this.props.actions.getChannelsMemberCount(channelIDsForMemberCount);\n                        }\n                        this.setSearchResults(data.filter((channel) => channel.team_id === this.props.teamId));\n                    } else {\n                        this.setState({searchedChannels: [], searching: false});\n                    }\n                } catch (ignoredErr) {\n                    this.setState({searchedChannels: [], searching: false});\n                }\n            },\n            SEARCH_TIMEOUT_MILLISECONDS,\n        );\n\n        this.searchTimeoutId = searchTimeoutId;\n    };\n\n    setSearchResults = (channels: Channel[]) => {\n        // filter out private channels that the user is not a member of\n        let searchedChannels = channels.filter((c) => c.type !== Constants.PRIVATE_CHANNEL || this.isMemberOfChannel(c.id));\n        if (this.state.filter === Filter.Private) {\n            searchedChannels = channels.filter((c) => c.type === Constants.PRIVATE_CHANNEL && this.isMemberOfChannel(c.id));\n        }\n        if (this.state.filter === Filter.Public) {\n            searchedChannels = channels.filter((c) => c.type === Constants.OPEN_CHANNEL && c.delete_at === 0);\n        }\n        if (this.state.filter === Filter.Archived) {\n            searchedChannels = channels.filter((c) => c.delete_at !== 0);\n        }\n        if (this.props.shouldHideJoinedChannels) {\n            searchedChannels = this.getChannelsWithoutJoined(searchedChannels);\n        }\n        this.setState({searchedChannels, searching: false});\n    };\n\n    changeFilter = (filter: FilterType) => {\n        // search again when switching channels to update search results\n        this.search(this.state.searchTerm);\n        this.setState({filter});\n    };\n\n    isMemberOfChannel(channelId: string) {\n        return this.props.myChannelMemberships[channelId];\n    }\n\n    handleShowJoinedChannelsPreference = (shouldHideJoinedChannels: boolean) => {\n        // search again when switching channels to update search results\n        this.search(this.state.searchTerm);\n        this.props.actions.setGlobalItem(StoragePrefixes.HIDE_JOINED_CHANNELS, shouldHideJoinedChannels.toString());\n    };\n\n    getChannelsWithoutJoined = (channelList: Channel[]) => channelList.filter((channel) => !this.isMemberOfChannel(channel.id));\n\n    getActiveChannels = () => {\n        const {channels, archivedChannels, shouldHideJoinedChannels, privateChannels} = this.props;\n        const {search, searchedChannels, filter} = this.state;\n\n        const allChannels = channels.concat(privateChannels).sort((a, b) => a.display_name.localeCompare(b.display_name));\n        const allChannelsWithoutJoined = this.getChannelsWithoutJoined(allChannels);\n        const publicChannelsWithoutJoined = this.getChannelsWithoutJoined(channels);\n        const archivedChannelsWithoutJoined = this.getChannelsWithoutJoined(archivedChannels);\n        const privateChannelsWithoutJoined = this.getChannelsWithoutJoined(privateChannels);\n\n        const filterOptions = {\n            [Filter.All]: shouldHideJoinedChannels ? allChannelsWithoutJoined : allChannels,\n            [Filter.Archived]: shouldHideJoinedChannels ? archivedChannelsWithoutJoined : archivedChannels,\n            [Filter.Private]: shouldHideJoinedChannels ? privateChannelsWithoutJoined : privateChannels,\n            [Filter.Public]: shouldHideJoinedChannels ? publicChannelsWithoutJoined : channels,\n        };\n\n        if (search) {\n            return searchedChannels;\n        }\n\n        return filterOptions[filter] || filterOptions[Filter.All];\n    };\n\n    render() {\n        const {teamId, channelsRequestStarted, shouldHideJoinedChannels} = this.props;\n        const {search, serverError: serverErrorState, searching} = this.state;\n\n        this.activeChannels = this.getActiveChannels();\n\n        let serverError;\n        if (serverErrorState) {\n            serverError =\n                <div className='form-group has-error'><label className='control-label'>{serverErrorState}</label></div>;\n        }\n\n        const createNewChannelButton = (className: string, icon?: JSX.Element) => {\n            const buttonClassName = classNames('btn', className);\n            return (\n                <TeamPermissionGate\n                    teamId={teamId}\n                    permissions={[Permissions.CREATE_PUBLIC_CHANNEL]}\n                >\n                    <button\n                        type='button'\n                        id='createNewChannelButton'\n                        className={buttonClassName}\n                        onClick={this.handleNewChannel}\n                        aria-label={localizeMessage({id: 'more_channels.create', defaultMessage: 'Create New Channel'})}\n                    >\n                        {icon}\n                        <FormattedMessage\n                            id='more_channels.create'\n                            defaultMessage='Create New Channel'\n                        />\n                    </button>\n                </TeamPermissionGate>\n            );\n        };\n\n        const noResultsText = (\n            <>\n                <p className='secondary-message'>\n                    <FormattedMessage\n                        id='more_channels.searchError'\n                        defaultMessage='Try searching different keywords, checking for typos or adjusting the filters.'\n                    />\n                </p>\n                {createNewChannelButton('btn-primary', <i className='icon-plus'/>)}\n            </>\n        );\n\n        const body = this.state.loading ? <LoadingScreen/> : (\n            <>\n                <SearchableChannelList\n                    channels={this.activeChannels}\n                    channelsPerPage={CHANNELS_PER_PAGE}\n                    nextPage={this.nextPage}\n                    isSearch={search}\n                    search={this.search}\n                    handleJoin={this.handleJoin}\n                    noResultsText={noResultsText}\n                    loading={search ? searching : channelsRequestStarted}\n                    changeFilter={this.changeFilter}\n                    filter={this.state.filter}\n                    canShowArchivedChannels={this.props.canShowArchivedChannels}\n                    myChannelMemberships={this.props.myChannelMemberships}\n                    closeModal={this.props.actions.closeModal}\n                    hideJoinedChannelsPreference={this.handleShowJoinedChannelsPreference}\n                    rememberHideJoinedChannelsChecked={shouldHideJoinedChannels}\n                    channelsMemberCount={this.props.channelsMemberCount}\n                />\n                {serverError}\n            </>\n        );\n\n        const title = (\n            <FormattedMessage\n                id='more_channels.title'\n                defaultMessage='Browse Channels'\n            />\n        );\n\n        return (\n            <GenericModal\n                id='browseChannelsModal'\n                aria-labelledby='browseChannelsModalLabel'\n                onExited={this.handleExit}\n                compassDesign={true}\n                modalHeaderText={title}\n                headerButton={createNewChannelButton('btn-secondary btn-sm')}\n                autoCloseOnConfirmButton={false}\n                aria-modal={true}\n                enforceFocus={false}\n                bodyPadding={false}\n            >\n                {body}\n            </GenericModal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getChannels, getArchivedChannels, joinChannel, getChannelsMemberCount, searchAllChannels} from 'mattermost-redux/actions/channels';\nimport {RequestStatus} from 'mattermost-redux/constants';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getChannelsInCurrentTeam, getMyChannelMemberships, getChannelsMemberCount as getChannelsMemberCountSelector} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam, getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {setGlobalItem} from 'actions/storage';\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {makeGetGlobalItem} from 'selectors/storage';\n\nimport Constants, {StoragePrefixes} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport BrowseChannels from './browse_channels';\n\nconst getChannelsWithoutArchived = createSelector(\n    'getChannelsWithoutArchived',\n    getChannelsInCurrentTeam,\n    (channels: Channel[]) => channels && channels.filter((c) => c.delete_at === 0 && c.type !== Constants.PRIVATE_CHANNEL),\n);\n\nconst getArchivedOtherChannels = createSelector(\n    'getArchivedOtherChannels',\n    getChannelsInCurrentTeam,\n    (channels: Channel[]) => channels && channels.filter((c) => c.delete_at !== 0),\n);\n\nconst getPrivateChannelsSelector = createSelector(\n    'getPrivateChannelsSelector',\n    getChannelsInCurrentTeam,\n    (channels: Channel[]) => channels && channels.filter((c) => c.type === Constants.PRIVATE_CHANNEL),\n);\n\nfunction mapStateToProps(state: GlobalState) {\n    const team = getCurrentTeam(state);\n    const getGlobalItem = makeGetGlobalItem(StoragePrefixes.HIDE_JOINED_CHANNELS, 'false');\n\n    return {\n        channels: getChannelsWithoutArchived(state) || [],\n        archivedChannels: getArchivedOtherChannels(state) || [],\n        privateChannels: getPrivateChannelsSelector(state) || [],\n        currentUserId: getCurrentUserId(state),\n        teamId: getCurrentTeamId(state),\n        teamName: team?.name,\n        channelsRequestStarted: state.requests.channels.getChannels.status === RequestStatus.STARTED,\n        canShowArchivedChannels: (getConfig(state).ExperimentalViewArchivedChannels === 'true'),\n        myChannelMemberships: getMyChannelMemberships(state) || {},\n        shouldHideJoinedChannels: getGlobalItem(state) === 'true',\n        rhsState: getRhsState(state),\n        rhsOpen: getIsRhsOpen(state),\n        channelsMemberCount: getChannelsMemberCountSelector(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getChannels,\n            getArchivedChannels,\n            joinChannel,\n            searchAllChannels,\n            openModal,\n            closeModal,\n            setGlobalItem,\n            closeRightHandSide,\n            getChannelsMemberCount,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(BrowseChannels);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect, useMemo, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getChannelBookmarks} from 'mattermost-redux/selectors/entities/channel_bookmarks';\nimport {getChannel, getMyChannelMember} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, getFeatureFlagValue, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {insertWithoutDuplicates} from 'mattermost-redux/utils/array_utils';\n\nimport {fetchChannelBookmarks, reorderBookmark} from 'actions/channel_bookmarks';\nimport {loadCustomEmojisIfNeeded} from 'actions/emoji_actions';\n\nimport Constants from 'utils/constants';\nimport {trimmedEmojiName} from 'utils/emoji_utils';\nimport {canUploadFiles, isPublicLinksEnabled} from 'utils/file_utils';\n\nexport const MAX_BOOKMARKS_PER_CHANNEL = 50;\n\nconst {OPEN_CHANNEL, PRIVATE_CHANNEL, GM_CHANNEL, DM_CHANNEL} = Constants as {OPEN_CHANNEL: 'O'; PRIVATE_CHANNEL: 'P'; GM_CHANNEL: 'G'; DM_CHANNEL: 'D'};\n\ntype TAction = 'add' | 'edit' | 'delete' | 'order';\ntype TActionKey = `${TAction}${typeof OPEN_CHANNEL | typeof PRIVATE_CHANNEL}`;\n\nconst key = (a: TAction, c: typeof OPEN_CHANNEL | typeof PRIVATE_CHANNEL): TActionKey => {\n    return `${a}${c}`;\n};\n\nconst BOOKMARK_PERMISSION = {\n\n    // open channel\n    [key('add', OPEN_CHANNEL)]: Permissions.ADD_BOOKMARK_PUBLIC_CHANNEL,\n    [key('edit', OPEN_CHANNEL)]: Permissions.EDIT_BOOKMARK_PUBLIC_CHANNEL,\n    [key('delete', OPEN_CHANNEL)]: Permissions.DELETE_BOOKMARK_PUBLIC_CHANNEL,\n    [key('order', OPEN_CHANNEL)]: Permissions.ORDER_BOOKMARK_PUBLIC_CHANNEL,\n\n    // private channel\n    [key('add', PRIVATE_CHANNEL)]: Permissions.ADD_BOOKMARK_PRIVATE_CHANNEL,\n    [key('edit', PRIVATE_CHANNEL)]: Permissions.EDIT_BOOKMARK_PRIVATE_CHANNEL,\n    [key('delete', PRIVATE_CHANNEL)]: Permissions.DELETE_BOOKMARK_PRIVATE_CHANNEL,\n    [key('order', PRIVATE_CHANNEL)]: Permissions.ORDER_BOOKMARK_PRIVATE_CHANNEL,\n} as const;\n\nexport const useChannelBookmarkPermission = (channelId: string, action: TAction) => {\n    return useSelector((state: GlobalState) => getHaveIChannelBookmarkPermission(state, channelId, action));\n};\n\nexport const getHaveIChannelBookmarkPermission = (state: GlobalState, channelId: string, action: TAction) => {\n    const channel: Channel | undefined = getChannel(state, channelId);\n\n    if (!channel) {\n        return false;\n    }\n\n    if (channel.delete_at !== 0) {\n        return false;\n    }\n\n    const {type} = channel;\n\n    if (type === 'threads') {\n        return false;\n    }\n\n    if (type === GM_CHANNEL || type === DM_CHANNEL) {\n        const myMembership = getMyChannelMember(state, channelId);\n        return myMembership?.channel_id === channelId;\n    }\n\n    const permission = BOOKMARK_PERMISSION[key(action, type)];\n\n    return channel && permission && haveIChannelPermission(state, channel.team_id, channelId, permission);\n};\n\nexport const useCanUploadFiles = () => {\n    return useSelector((state: GlobalState) => canUploadFiles(getConfig(state)));\n};\n\nexport const useCanGetPublicLink = () => {\n    return useSelector((state: GlobalState) => isPublicLinksEnabled(getConfig(state)));\n};\n\nexport const useCanGetLinkPreviews = () => {\n    return useSelector((state: GlobalState) => getConfig(state).EnableLinkPreviews === 'true');\n};\n\nexport const getIsChannelBookmarksEnabled = (state: GlobalState) => {\n    const isEnabled = getFeatureFlagValue(state, 'ChannelBookmarks') === 'true';\n\n    if (!isEnabled) {\n        return false;\n    }\n\n    const license = getLicense(state);\n\n    return license?.IsLicensed === 'true';\n};\n\nexport const useChannelBookmarks = (channelId: string) => {\n    const dispatch = useDispatch();\n    const bookmarks = useSelector((state: GlobalState) => getChannelBookmarks(state, channelId));\n\n    const order = useMemo(() => {\n        return Object.keys(bookmarks).sort((a, b) => bookmarks[a].sort_order - bookmarks[b].sort_order);\n    }, [bookmarks]);\n    const [tempOrder, setTempOrder] = useState<typeof order>();\n\n    useEffect(() => {\n        if (tempOrder) {\n            setTempOrder(undefined);\n        }\n    }, [order]);\n\n    useEffect(() => {\n        if (channelId) {\n            dispatch(fetchChannelBookmarks(channelId));\n        }\n    }, [channelId]);\n\n    useEffect(() => {\n        const emojis = Object.values(bookmarks).reduce<string[]>((result, {emoji}) => {\n            if (emoji) {\n                result.push(trimmedEmojiName(emoji));\n            }\n\n            return result;\n        }, []);\n\n        if (emojis.length) {\n            dispatch(loadCustomEmojisIfNeeded(emojis));\n        }\n    }, [bookmarks]);\n\n    const reorder = async (id: string, prevOrder: number, nextOrder: number) => {\n        setTempOrder(insertWithoutDuplicates(order, id, nextOrder));\n        const {error} = await dispatch(reorderBookmark(channelId, id, nextOrder));\n\n        if (error) {\n            setTempOrder(undefined);\n        }\n    };\n\n    return {\n        bookmarks,\n        order: tempOrder ?? order,\n        reorder,\n    } as const;\n};\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useMemo} from 'react';\n\nimport type {CloudUsage} from '@mattermost/types/cloud';\n\nimport useGetLimits from './useGetLimits';\nimport useGetUsage from './useGetUsage';\n\n// Returns an object of type CloudUsage with the values being the delta between the limit, and the actual usage of this installation.\n// A value < 0 means that they are NOT over the limit. A value > 0 means they've exceeded that limit\n// 2 teams used, minus 1 team limit = value > 0, limit exceeded\n// 10MB files used, minus 1000MB limit = value < 0, limit not exceeded.\n// etc.\n// withBackupValue will set the limit arbitrarily high in the event that the limit isn't set\nexport const withBackupValue = (maybeLimit: number | undefined, limitsLoaded: boolean) => (limitsLoaded ? (maybeLimit ?? Number.MAX_VALUE) : Number.MAX_VALUE);\n\nexport default function useGetUsageDeltas(): CloudUsage {\n    const usage = useGetUsage();\n    const [limits, limitsLoaded] = useGetLimits();\n\n    const usageDelta = useMemo(() => {\n        return (\n            {\n                files: {\n                    totalStorage: usage.files.totalStorage - withBackupValue(limits.files?.total_storage, limitsLoaded),\n                    totalStorageLoaded: usage.files.totalStorageLoaded,\n                },\n                messages: {\n                    history: usage.messages.history - withBackupValue(limits.messages?.history, limitsLoaded),\n                    historyLoaded: usage.messages.historyLoaded,\n                },\n                teams: {\n                    active: usage.teams.active - withBackupValue(limits.teams?.active, limitsLoaded),\n\n                    // cloudArchived doesn't count against usage, but we pass the value along for convenience\n                    cloudArchived: usage.teams.cloudArchived,\n                    teamsLoaded: usage.teams.teamsLoaded,\n                },\n            }\n        );\n    }, [usage, limits, limitsLoaded]);\n\n    return usageDelta;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport QuickInput, {MaxLengthInput} from 'components/quick_input';\n\nimport {localizeMessage} from 'utils/utils';\n\nimport '../category_modal.scss';\n\nconst MAX_LENGTH = 22;\nconst ACTION_WAIT_MS = 1000;\n\ntype Props = {\n    onExited: () => void;\n    currentTeamId: string;\n    categoryId?: string;\n    initialCategoryName?: string;\n    channelIdsToAdd?: string[];\n    actions: {\n        createCategory: (teamId: string, displayName: string, channelIds?: string[] | undefined) => void;\n        renameCategory: (categoryId: string, newName: string) => void;\n    };\n};\n\ntype State = {\n    categoryName: string;\n}\n\nexport default class EditCategoryModal extends React.PureComponent<Props, State> {\n    timeoutId: NodeJS.Timeout | null = null;\n    isProcessing = false;\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            categoryName: props.initialCategoryName || '',\n        };\n    }\n\n    handleClear = () => {\n        this.setState({categoryName: ''});\n    };\n\n    handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        this.setState({categoryName: e.target.value});\n    };\n\n    handleCancel = () => {\n        this.handleClear();\n    };\n\n    componentWillUnmount() {\n        if (this.timeoutId) {\n            clearTimeout(this.timeoutId);\n        }\n    }\n\n    handleConfirm = () => {\n        if (this.isProcessing) {\n            return;\n        }\n        this.isProcessing = true;\n        this.timeoutId = setTimeout(() => {\n            this.isProcessing = false;\n        }, ACTION_WAIT_MS);\n\n        if (this.props.categoryId) {\n            this.props.actions.renameCategory(this.props.categoryId, this.state.categoryName);\n        } else {\n            this.props.actions.createCategory(this.props.currentTeamId, this.state.categoryName, this.props.channelIdsToAdd);\n            trackEvent('ui', 'ui_sidebar_created_category');\n        }\n    };\n\n    isConfirmDisabled = () => {\n        return !this.state.categoryName ||\n            (Boolean(this.props.initialCategoryName) && this.props.initialCategoryName === this.state.categoryName) || this.state.categoryName.length > MAX_LENGTH;\n    };\n\n    getText = () => {\n        let modalHeaderText;\n        let editButtonText;\n        let helpText;\n\n        if (this.props.categoryId) {\n            modalHeaderText = (\n                <FormattedMessage\n                    id='rename_category_modal.renameCategory'\n                    defaultMessage='Rename Category'\n                />\n            );\n            editButtonText = (\n                <FormattedMessage\n                    id='rename_category_modal.rename'\n                    defaultMessage='Rename'\n                />\n            );\n        } else {\n            modalHeaderText = (\n                <FormattedMessage\n                    id='create_category_modal.createCategory'\n                    defaultMessage='Create New Category'\n                />\n            );\n            editButtonText = (\n                <FormattedMessage\n                    id='create_category_modal.create'\n                    defaultMessage='Create'\n                />\n            );\n            helpText = (\n                <FormattedMessage\n                    id='edit_category_modal.helpText'\n                    defaultMessage='Drag channels into this category to organize your sidebar.'\n                />\n            );\n        }\n\n        return {\n            modalHeaderText,\n            editButtonText,\n            helpText,\n        };\n    };\n\n    render() {\n        const {\n            modalHeaderText,\n            editButtonText,\n            helpText,\n        } = this.getText();\n\n        return (\n            <GenericModal\n                id='editCategoryModal'\n                ariaLabel={localizeMessage({id: 'rename_category_modal.renameCategory', defaultMessage: 'Rename Category'})}\n                modalHeaderText={modalHeaderText}\n                confirmButtonText={editButtonText}\n                compassDesign={true}\n                onExited={this.props.onExited}\n                handleEnterKeyPress={this.handleConfirm}\n                handleConfirm={this.handleConfirm}\n                handleCancel={this.handleCancel}\n                isConfirmDisabled={this.isConfirmDisabled()}\n            >\n                <QuickInput\n                    inputComponent={MaxLengthInput}\n                    autoFocus={true}\n                    className='form-control filter-textbox'\n                    type='text'\n                    value={this.state.categoryName}\n                    placeholder={localizeMessage({id: 'edit_category_modal.placeholder', defaultMessage: 'Name your category'})}\n                    clearable={true}\n                    onClear={this.handleClear}\n                    onChange={this.handleChange}\n                    maxLength={MAX_LENGTH}\n                />\n                {Boolean(helpText) && <span className='edit-category__helpText'>\n                    {helpText}\n                </span>}\n            </GenericModal>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {renameCategory} from 'mattermost-redux/actions/channel_categories';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {createCategory} from 'actions/views/channel_sidebar';\n\nimport type {GlobalState} from 'types/store';\n\nimport EditCategoryModal from './edit_category_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        currentTeamId: getCurrentTeamId(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            createCategory,\n            renameCategory,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditCategoryModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport {ShortcutKey, ShortcutKeyVariant} from 'components/shortcut_key';\n\nimport {isDesktopApp, isMac} from 'utils/user_agent';\n\nimport './search_shortcut.scss';\n\nexport type SearchShortcutProps = {\n    className?: string;\n    variant?: ShortcutKeyVariant;\n}\n\nexport const SearchShortcut = ({className, variant}: SearchShortcutProps) => {\n    const controlKey = isMac() ? '⌘' : 'Ctrl';\n    const shortcutKeyVariant = variant || ShortcutKeyVariant.Contrast;\n\n    return (\n        <span className={classNames('search-shortcut', className)}>\n            <ShortcutKey variant={shortcutKeyVariant}>{controlKey}</ShortcutKey>\n            {!isDesktopApp() && <ShortcutKey variant={shortcutKeyVariant}>{'Shift'}</ShortcutKey>}\n            <ShortcutKey variant={shortcutKeyVariant}>{'F'}</ShortcutKey>\n        </span>\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {FolderPlusOutlineIcon} from '@mattermost/compass-icons/components';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport EditCategoryModal from 'components/edit_category_modal';\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n    id: string;\n}\n\nconst CreateNewCategoryMenuItem = ({\n    id,\n    ...otherProps\n}: Props) => {\n    const dispatch = useDispatch();\n    const handleCreateCategory = useCallback(() => {\n        dispatch(openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n        }));\n        trackEvent('ui', 'ui_sidebar_category_menu_createCategory');\n    }, [dispatch]);\n\n    return (\n        <Menu.Item\n            id={`create-${id}`}\n            onClick={handleCreateCategory}\n            aria-haspopup={true}\n            leadingElement={<FolderPlusOutlineIcon size={18}/>}\n            labels={(\n                <FormattedMessage\n                    id='sidebar_left.sidebar_category_menu.createCategory'\n                    defaultMessage='Create New Category'\n                />\n            )}\n            {...otherProps}\n        />\n    );\n};\n\nexport default CreateNewCategoryMenuItem;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\n\nimport 'components/category_modal.scss';\n\ntype Props = {\n    handleConfirm: () => void;\n    numChannels: number;\n    onExited: () => void;\n};\n\nconst handleCancel = () => null;\n\nconst MarkAsReadConfirmModal = ({\n    handleConfirm,\n    numChannels,\n    onExited,\n}: Props) => {\n    const intl = useIntl();\n\n    const header = intl.formatMessage({id: 'mark_as_read_confirm_modal.header', defaultMessage: 'Mark as read'});\n    const body = intl.formatMessage({id: 'mark_as_read_confirm_modal.body', defaultMessage: 'Are you sure you want to mark {numChannels} channels as read?'}, {numChannels});\n    const confirm = intl.formatMessage({id: 'mark_as_read_confirm_modal.confirm', defaultMessage: 'Mark as read'});\n\n    return (\n        <GenericModal\n            ariaLabel={header}\n            compassDesign={true}\n            modalHeaderText={header}\n            handleConfirm={handleConfirm}\n            handleCancel={handleCancel}\n            onExited={onExited}\n            confirmButtonText={confirm}\n        >\n            <span className='mark-as-read__helpText'>\n                {body}\n            </span>\n        </GenericModal>\n    );\n};\n\nexport default MarkAsReadConfirmModal;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport {MarkAsUnreadIcon} from '@mattermost/compass-icons/components';\n\nimport {openModal} from 'actions/views/modals';\n\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport MarkAsReadConfirmModal from './mark_as_read_confirm_modal';\n\ntype Props = {\n    id: string;\n    handleViewCategory: () => void;\n    numChannels: number;\n}\n\nconst MarkAsUnreadItem = ({\n    id,\n    handleViewCategory,\n    numChannels,\n    ...otherProps\n}: Props) => {\n    const dispatch = useDispatch();\n\n    const onClick = useCallback(() => {\n        if (numChannels <= 0) {\n            return;\n        }\n\n        if (numChannels === 1) {\n            handleViewCategory();\n            return;\n        }\n\n        dispatch(openModal({\n            modalId: ModalIdentifiers.DELETE_CATEGORY,\n            dialogType: MarkAsReadConfirmModal,\n            dialogProps: {\n                handleConfirm: handleViewCategory,\n                numChannels,\n            },\n        }));\n    }, [dispatch, handleViewCategory, numChannels]);\n\n    return (\n        <Menu.Item\n            id={`view-${id}`}\n            onClick={onClick}\n            aria-haspopup={numChannels > 1}\n            leadingElement={<MarkAsUnreadIcon size={18}/>}\n            labels={(\n                <FormattedMessage\n                    id='sidebar_left.sidebar_category_menu.viewCategory'\n                    defaultMessage='Mark category as read'\n                />\n            )}\n            {...otherProps}\n        />\n    );\n};\n\nexport default MarkAsUnreadItem;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useState} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {\n    DotsVerticalIcon,\n} from '@mattermost/compass-icons/components';\n\nimport * as Menu from 'components/menu';\n\ntype Props = {\n    id: string;\n    children: React.ReactNode[];\n};\n\nconst SidebarCategoryGenericMenu = ({\n    id,\n    children,\n}: Props) => {\n    const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n    const {formatMessage} = useIntl();\n\n    function handleMenuToggle(isOpen: boolean) {\n        setIsMenuOpen(isOpen);\n    }\n\n    return (\n        <div\n            className={classNames(\n                'SidebarMenu',\n                'MenuWrapper',\n                {\n                    'MenuWrapper--open': isMenuOpen,\n                    menuOpen: isMenuOpen,\n                },\n            )}\n        >\n            <Menu.Container\n                menuButton={{\n                    id: `SidebarCategoryMenu-Button-${id}`,\n                    'aria-label': formatMessage({id: 'sidebar_left.sidebar_category_menu.editCategory', defaultMessage: 'Category options'}),\n                    class: 'SidebarMenu_menuButton',\n                    children: <DotsVerticalIcon size={16}/>,\n                }}\n                menuButtonTooltip={{\n                    text: formatMessage({id: 'sidebar_left.sidebar_category_menu.editCategory', defaultMessage: 'Category options'}),\n                    class: 'hidden-xs',\n                }}\n                menu={{\n                    id: `SidebarChannelMenu-MenuList-${id}`,\n                    'aria-label': formatMessage({id: 'sidebar_left.sidebar_category_menu.dropdownAriaLabel', defaultMessage: 'Edit category menu'}),\n                    onToggle: handleMenuToggle,\n                }}\n            >\n                {children}\n            </Menu.Container>\n        </div>\n    );\n};\n\nexport default memo(SidebarCategoryGenericMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {DraggableProvidedDragHandleProps} from 'react-beautiful-dnd';\n\nimport {wrapEmojis} from 'utils/emoji_utils';\n\ntype StaticProps = {\n    children?: React.ReactNode;\n    displayName: string;\n}\n\nexport const SidebarCategoryHeaderStatic = React.forwardRef((props: StaticProps, ref?: React.Ref<HTMLDivElement>) => {\n    return (\n        <div className='SidebarChannelGroupHeader SidebarChannelGroupHeader--static'>\n            <div\n                ref={ref}\n                className='SidebarChannelGroupHeader_groupButton'\n            >\n                <div className='SidebarChannelGroupHeader_text'>\n                    {wrapEmojis(props.displayName)}\n                </div>\n                {props.children}\n            </div>\n        </div>\n    );\n});\nSidebarCategoryHeaderStatic.displayName = 'SidebarCategoryHeaderStatic';\n\ntype Props = StaticProps & {\n    dragHandleProps?: DraggableProvidedDragHandleProps;\n    isCollapsed: boolean;\n    isCollapsible: boolean;\n    isDragging?: boolean;\n    isDraggingOver?: boolean;\n    muted: boolean;\n    onClick: (event: React.MouseEvent<HTMLElement>) => void;\n}\n\nexport const SidebarCategoryHeader = React.forwardRef((props: Props, ref?: React.Ref<HTMLButtonElement>) => {\n    const {dragHandleProps} = props;\n\n    // (Accessibility) Ensures interactive controls are not nested as they are not always announced\n    // by screen readers or can cause focus problems for assistive technologies.\n    if (dragHandleProps && dragHandleProps.role) {\n        Reflect.deleteProperty(dragHandleProps, 'role');\n    }\n\n    return (\n        <div\n            className={classNames('SidebarChannelGroupHeader', {\n                muted: props.muted,\n                dragging: props.isDragging,\n            })}\n        >\n            <button\n                ref={ref}\n                className={classNames('SidebarChannelGroupHeader_groupButton')}\n                aria-label={props.displayName}\n                onClick={props.onClick}\n            >\n                <i\n                    className={classNames('icon icon-chevron-down', {\n                        'icon-rotate-minus-90': props.isCollapsed,\n                        'hide-arrow': !props.isCollapsible,\n                    })}\n                />\n                <div\n                    className='SidebarChannelGroupHeader_text'\n                    {...dragHandleProps}\n                >\n                    {wrapEmojis(props.displayName)}\n                </div>\n            </button>\n            {props.children}\n        </div>\n    );\n});\nSidebarCategoryHeader.defaultProps = {\n    isCollapsible: true,\n    isDragging: false,\n    isDraggingOver: false,\n};\nSidebarCategoryHeader.displayName = 'SidebarCategoryHeader';\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\ntype Props = {\n    unreadMentions: number;\n    hasUrgent?: boolean;\n    icon?: React.ReactNode;\n    className?: string;\n};\n\nexport default function ChannelMentionBadge({unreadMentions, hasUrgent, icon, className}: Props) {\n    if (unreadMentions > 0) {\n        return (\n            <span\n                id='unreadMentions'\n                className={classNames({badge: true, urgent: hasUrgent}, className)}\n            >\n                {icon}\n                <span className='unreadMentions'>\n                    {unreadMentions}\n                </span>\n            </span>\n        );\n    }\n\n    return null;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport './channel_pencil_icon.scss';\n\ntype Props = {\n    hasDraft: boolean;\n};\n\nfunction ChannelPencilIcon({hasDraft}: Props) {\n    if (hasDraft) {\n        return (\n            <i\n                data-testid='draftIcon'\n                className='icon icon-pencil-outline channel-pencil-icon'\n            />\n        );\n    }\n    return null;\n}\n\nexport default memo(ChannelPencilIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\n\nimport {getPostDraft} from 'selectors/rhs';\n\nimport {StoragePrefixes} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\nimport type {PostDraft} from 'types/store/draft';\n\nimport ChannelPencilIcon from './channel_pencil_icon';\n\ntype OwnProps = {\n    id: Channel['id'];\n}\n\nfunction hasDraft(draft: PostDraft|null, id: Channel['id'], currentChannelId?: string): boolean {\n    if (draft === null) {\n        return false;\n    }\n\n    return Boolean(draft.message.trim() || draft.fileInfos.length || draft.uploadsInProgress.length) && currentChannelId !== id;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const currentChannelId = getCurrentChannelId(state);\n    const draft = getPostDraft(state, StoragePrefixes.DRAFT, ownProps.id);\n\n    return {\n        hasDraft: hasDraft(draft, ownProps.id, currentChannelId),\n    };\n}\n\nexport default connect(mapStateToProps)(ChannelPencilIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype Props = {\n    icon: JSX.Element | null;\n    isDeleted: boolean;\n};\n\nfunction SidebarChannelIcon({isDeleted, icon}: Props) {\n    if (isDeleted) {\n        return (\n            <i className='icon icon-archive-outline'/>\n        );\n    }\n    return icon;\n}\n\nexport default SidebarChannelIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {MouseEvent, KeyboardEvent} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {\n    FolderOutlineIcon,\n    StarOutlineIcon,\n    FolderMoveOutlineIcon,\n    ChevronRightIcon,\n    CheckIcon,\n} from '@mattermost/compass-icons/components';\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {getCategoryInTeamWithChannel} from 'mattermost-redux/selectors/entities/channel_categories';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {addChannelsInSidebar} from 'actions/views/channel_sidebar';\nimport {openModal} from 'actions/views/modals';\nimport {getCategoriesForCurrentTeam} from 'selectors/views/channel_sidebar';\n\nimport EditCategoryModal from 'components/edit_category_modal';\nimport * as Menu from 'components/menu';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n    channel: Channel;\n    inHeaderDropdown?: boolean;\n};\n\nconst ChannelMoveToSubMenu = (props: Props) => {\n    const {formatMessage} = useIntl();\n\n    const dispatch = useDispatch();\n\n    const allChannels = useSelector(getAllChannels);\n    const multiSelectedChannelIds = useSelector((state: GlobalState) => state.views.channelSidebar.multiSelectedChannelIds);\n\n    const currentTeam = useSelector(getCurrentTeam);\n    const categories = useSelector((state: GlobalState) => {\n        return currentTeam ? getCategoriesForCurrentTeam(state) : undefined;\n    });\n    const currentCategory = useSelector((state: GlobalState) => {\n        return currentTeam ? getCategoryInTeamWithChannel(state, currentTeam?.id || '', props.channel.id) : undefined;\n    });\n\n    function handleMoveToCategory(event: MouseEvent<HTMLLIElement> | KeyboardEvent<HTMLLIElement>, categoryId: string) {\n        event.preventDefault();\n\n        if (currentCategory?.id !== categoryId) {\n            dispatch(addChannelsInSidebar(categoryId, props.channel.id));\n            trackEvent('ui', 'ui_sidebar_channel_menu_moveToExistingCategory');\n        }\n    }\n\n    function handleMoveToNewCategory() {\n        dispatch(openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n            dialogProps: {\n                channelIdsToAdd: multiSelectedChannelIds.indexOf(props.channel.id) === -1 ? [props.channel.id] : multiSelectedChannelIds,\n            },\n        }));\n        trackEvent('ui', 'ui_sidebar_channel_menu_createCategory');\n    }\n\n    function createSubmenuItemsForCategoryArray(categories: ChannelCategory[], currentCategory?: ChannelCategory) {\n        const allCategories = categories.map((category: ChannelCategory) => {\n            let text = <span>{category.display_name}</span>;\n\n            if (category.type === CategoryTypes.FAVORITES) {\n                text = (\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.favorites'\n                        defaultMessage='Favorites'\n                    />\n                );\n            }\n            if (category.type === CategoryTypes.CHANNELS) {\n                text = (\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.channels'\n                        defaultMessage='Channels'\n                    />\n                );\n            }\n\n            let selectedCategory = null;\n            if (currentCategory && currentCategory.display_name === category.display_name) {\n                selectedCategory = (\n                    <CheckIcon\n                        color='var(--button-bg)'\n                        size={18}\n                    />\n                );\n            }\n\n            return (\n                <Menu.Item\n                    id={`moveToCategory-${props.channel.id}-${category.id}`}\n                    key={`moveToCategory-${props.channel.id}-${category.id}`}\n                    leadingElement={category.type === CategoryTypes.FAVORITES ? (<StarOutlineIcon size={18}/>) : (<FolderOutlineIcon size={18}/>)}\n                    labels={text}\n                    trailingElements={selectedCategory}\n                    onClick={(event) => handleMoveToCategory(event, category.id)}\n                />\n            );\n        });\n\n        const dividerAndNewCategory = [\n            <Menu.Separator key='ChannelMenu-moveToDivider'/>,\n            <Menu.Item\n                id={`moveToNewCategory-${props.channel.id}`}\n                key={`moveToNewCategory-${props.channel.id}`}\n                aria-haspopup={true}\n                leadingElement={<FolderMoveOutlineIcon size={18}/>}\n                labels={\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.moveToNewCategory'\n                        defaultMessage='New Category'\n                    />\n                }\n                onClick={handleMoveToNewCategory}\n            />,\n        ];\n\n        return [...allCategories, ...dividerAndNewCategory];\n    }\n\n    function filterCategoriesBasedOnChannelType(categories: ChannelCategory[], isDmOrGm = false) {\n        if (isDmOrGm) {\n            return categories.filter((category) => category.type !== CategoryTypes.CHANNELS);\n        }\n\n        return categories.filter((category) => category.type !== CategoryTypes.DIRECT_MESSAGES);\n    }\n\n    function getMoveToCategorySubmenuItems(categories: ChannelCategory[], currentCategory?: ChannelCategory) {\n        const isSubmenuOneOfSelectedChannels = multiSelectedChannelIds.includes(props.channel.id);\n\n        // If sub menu is in channel header dropdown OR If multiple channels are selected but the menu is open outside of those selected channels\n        if (props.inHeaderDropdown || !isSubmenuOneOfSelectedChannels) {\n            const isDmOrGm = props.channel.type === Constants.DM_CHANNEL || props.channel.type === Constants.GM_CHANNEL;\n            const filteredCategories = filterCategoriesBasedOnChannelType(categories, isDmOrGm);\n            return createSubmenuItemsForCategoryArray(filteredCategories, currentCategory);\n        }\n\n        const areAllSelectedChannelsDMorGM = multiSelectedChannelIds.every((channelId) => allChannels[channelId].type === Constants.DM_CHANNEL || allChannels[channelId].type === Constants.GM_CHANNEL);\n        if (areAllSelectedChannelsDMorGM) {\n            const filteredCategories = filterCategoriesBasedOnChannelType(categories, true);\n            return createSubmenuItemsForCategoryArray(filteredCategories, currentCategory);\n        }\n\n        const areAllSelectedChannelsAreNotDMorGM = multiSelectedChannelIds.every((channelId) => allChannels[channelId].type !== Constants.DM_CHANNEL && allChannels[channelId].type !== Constants.GM_CHANNEL);\n        if (areAllSelectedChannelsAreNotDMorGM) {\n            const filteredCategories = filterCategoriesBasedOnChannelType(categories, false);\n            return createSubmenuItemsForCategoryArray(filteredCategories, currentCategory);\n        }\n\n        // If we have a mix of channel types, we need to filter out both the DM and Channel categories\n        const filteredCategories = categories.filter((category) => category.type !== CategoryTypes.CHANNELS && category.type !== CategoryTypes.DIRECT_MESSAGES);\n        return createSubmenuItemsForCategoryArray(filteredCategories, currentCategory);\n    }\n\n    if (!categories) {\n        return null;\n    }\n\n    return (\n        <Menu.SubMenu\n            id={`moveTo-${props.channel.id}`}\n            labels={\n                <FormattedMessage\n                    id='sidebar_left.sidebar_channel_menu.moveTo'\n                    defaultMessage='Move to...'\n                />\n            }\n            leadingElement={props.inHeaderDropdown ? null : <FolderMoveOutlineIcon size={18}/>}\n            trailingElements={<ChevronRightIcon size={16}/>}\n            menuId={`moveTo-${props.channel.id}-menu`}\n            menuAriaLabel={formatMessage({id: 'sidebar_left.sidebar_channel_menu.moveTo.dropdownAriaLabel', defaultMessage: 'Move to submenu'})}\n        >\n            {getMoveToCategorySubmenuItems(categories, currentCategory)}\n        </Menu.SubMenu>\n    );\n};\n\nexport default memo(ChannelMoveToSubMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useRef, memo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport {\n    MarkAsUnreadIcon,\n    StarIcon,\n    StarOutlineIcon,\n    BellOutlineIcon,\n    BellOffOutlineIcon,\n    LinkVariantIcon,\n    AccountPlusOutlineIcon,\n    DotsVerticalIcon,\n    ExitToAppIcon,\n} from '@mattermost/compass-icons/components';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ChannelMoveToSubmenu from 'components/channel_move_to_sub_menu';\nimport * as Menu from 'components/menu';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {copyToClipboard} from 'utils/utils';\n\nimport type {PropsFromRedux, OwnProps} from './index';\n\ntype Props = PropsFromRedux & OwnProps;\n\nconst SidebarChannelMenu = ({\n    channel,\n    channelLink,\n    currentUserId,\n    favoriteChannel,\n    isFavorite,\n    isMuted,\n    isUnread,\n    managePrivateChannelMembers,\n    managePublicChannelMembers,\n    readMultipleChannels,\n    markMostRecentPostInChannelAsUnread,\n    muteChannel,\n    onMenuToggle,\n    openModal,\n    unfavoriteChannel,\n    unmuteChannel,\n    channelLeaveHandler,\n}: Props) => {\n    const isLeaving = useRef(false);\n\n    const {formatMessage} = useIntl();\n\n    let markAsReadUnreadMenuItem: JSX.Element | null = null;\n    if (isUnread) {\n        function handleMarkAsRead() {\n            // We use mark multiple to not update the active channel in the server\n            readMultipleChannels([channel.id]);\n            trackEvent('ui', 'ui_sidebar_channel_menu_markAsRead');\n        }\n\n        markAsReadUnreadMenuItem = (\n            <Menu.Item\n                id={`markAsRead-${channel.id}`}\n                onClick={handleMarkAsRead}\n                leadingElement={<MarkAsUnreadIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.markAsRead'\n                        defaultMessage='Mark as Read'\n                    />\n                )}\n            />\n\n        );\n    } else {\n        function handleMarkAsUnread() {\n            markMostRecentPostInChannelAsUnread(channel.id);\n            trackEvent('ui', 'ui_sidebar_channel_menu_markAsUnread');\n        }\n\n        markAsReadUnreadMenuItem = (\n            <Menu.Item\n                id={`markAsUnread-${channel.id}`}\n                onClick={handleMarkAsUnread}\n                leadingElement={<MarkAsUnreadIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.markAsUnread'\n                        defaultMessage='Mark as Unread'\n                    />\n                )}\n            />\n        );\n    }\n\n    let favoriteUnfavoriteMenuItem: JSX.Element | null = null;\n    if (isFavorite) {\n        function handleUnfavoriteChannel() {\n            unfavoriteChannel(channel.id);\n            trackEvent('ui', 'ui_sidebar_channel_menu_unfavorite');\n        }\n\n        favoriteUnfavoriteMenuItem = (\n            <Menu.Item\n                id={`unfavorite-${channel.id}`}\n                onClick={handleUnfavoriteChannel}\n                leadingElement={<StarIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.unfavoriteChannel'\n                        defaultMessage='Unfavorite'\n                    />\n                )}\n            />\n        );\n    } else {\n        function handleFavoriteChannel() {\n            favoriteChannel(channel.id);\n            trackEvent('ui', 'ui_sidebar_channel_menu_favorite');\n        }\n\n        favoriteUnfavoriteMenuItem = (\n\n            <Menu.Item\n                id={`favorite-${channel.id}`}\n                onClick={handleFavoriteChannel}\n                leadingElement={<StarOutlineIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.favoriteChannel'\n                        defaultMessage='Favorite'\n                    />\n                )}\n            />\n        );\n    }\n\n    let muteUnmuteChannelMenuItem: JSX.Element | null = null;\n    if (isMuted) {\n        let muteChannelText = (\n            <FormattedMessage\n                id='sidebar_left.sidebar_channel_menu.unmuteChannel'\n                defaultMessage='Unmute Channel'\n            />\n        );\n        if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n            muteChannelText = (\n                <FormattedMessage\n                    id='sidebar_left.sidebar_channel_menu.unmuteConversation'\n                    defaultMessage='Unmute Conversation'\n                />\n            );\n        }\n\n        function handleUnmuteChannel() {\n            unmuteChannel(currentUserId, channel.id);\n        }\n\n        muteUnmuteChannelMenuItem = (\n            <Menu.Item\n                id={`unmute-${channel.id}`}\n                onClick={handleUnmuteChannel}\n                leadingElement={<BellOffOutlineIcon size={18}/>}\n                labels={muteChannelText}\n            />\n        );\n    } else {\n        let muteChannelText = (\n            <FormattedMessage\n                id='sidebar_left.sidebar_channel_menu.muteChannel'\n                defaultMessage='Mute Channel'\n            />\n        );\n        if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n            muteChannelText = (\n                <FormattedMessage\n                    id='sidebar_left.sidebar_channel_menu.muteConversation'\n                    defaultMessage='Mute Conversation'\n                />\n            );\n        }\n\n        function handleMuteChannel() {\n            muteChannel(currentUserId, channel.id);\n        }\n\n        muteUnmuteChannelMenuItem = (\n            <Menu.Item\n                id={`mute-${channel.id}`}\n                onClick={handleMuteChannel}\n                leadingElement={<BellOutlineIcon size={18}/>}\n                labels={muteChannelText}\n            />\n        );\n    }\n\n    let copyLinkMenuItem: JSX.Element | null = null;\n    if (channel.type === Constants.OPEN_CHANNEL || channel.type === Constants.PRIVATE_CHANNEL) {\n        function handleCopyLink() {\n            copyToClipboard(channelLink);\n        }\n\n        copyLinkMenuItem = (\n            <Menu.Item\n                id={`copyLink-${channel.id}`}\n                onClick={handleCopyLink}\n                leadingElement={<LinkVariantIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.copyLink'\n                        defaultMessage='Copy Link'\n                    />\n                )}\n            />\n        );\n    }\n\n    let addMembersMenuItem: JSX.Element | null = null;\n    if ((channel.type === Constants.PRIVATE_CHANNEL && managePrivateChannelMembers) || (channel.type === Constants.OPEN_CHANNEL && managePublicChannelMembers)) {\n        function handleAddMembers() {\n            openModal({\n                modalId: ModalIdentifiers.CHANNEL_INVITE,\n                dialogType: ChannelInviteModal,\n                dialogProps: {channel},\n            });\n            trackEvent('ui', 'ui_sidebar_channel_menu_addMembers');\n        }\n\n        addMembersMenuItem = (\n            <Menu.Item\n                id={`addMembers-${channel.id}`}\n                onClick={handleAddMembers}\n                aria-haspopup='true'\n                leadingElement={<AccountPlusOutlineIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel_menu.addMembers'\n                        defaultMessage='Add Members'\n                    />\n                )}\n            />\n        );\n    }\n\n    let leaveChannelMenuItem: JSX.Element | null = null;\n    if (channel.name !== Constants.DEFAULT_CHANNEL) {\n        let leaveChannelText = (\n            <FormattedMessage\n                id='sidebar_left.sidebar_channel_menu.leaveChannel'\n                defaultMessage='Leave Channel'\n            />\n        );\n        if (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL) {\n            leaveChannelText = (\n                <FormattedMessage\n                    id='sidebar_left.sidebar_channel_menu.leaveConversation'\n                    defaultMessage='Close Conversation'\n                />\n            );\n        }\n\n        function handleLeaveChannel() {\n            if (isLeaving.current || !channelLeaveHandler) {\n                return;\n            }\n\n            isLeaving.current = true;\n\n            channelLeaveHandler(() => {\n                isLeaving.current = false;\n            });\n            trackEvent('ui', 'ui_sidebar_channel_menu_leave');\n        }\n\n        leaveChannelMenuItem = (\n            <Menu.Item\n                id={`leave-${channel.id}`}\n                onClick={handleLeaveChannel}\n                leadingElement={<ExitToAppIcon size={18}/>}\n                labels={leaveChannelText}\n                isDestructive={true}\n            />\n        );\n    }\n\n    return (\n        <Menu.Container\n            menuButton={{\n                id: `SidebarChannelMenu-Button-${channel.id}`,\n                class: 'SidebarMenu_menuButton',\n                'aria-label': formatMessage({\n                    id: 'sidebar_left.sidebar_channel_menu.editChannel.ariaLabel',\n                    defaultMessage: 'Channel options for {channelName}',\n                }, {channelName: channel.name}),\n                children: <DotsVerticalIcon size={16}/>,\n            }}\n            menuButtonTooltip={{\n                class: 'hidden-xs',\n                text: formatMessage({id: 'sidebar_left.sidebar_channel_menu.editChannel', defaultMessage: 'Channel options'}),\n            }}\n            menu={{\n                id: `SidebarChannelMenu-MenuList-${channel.id}`,\n                'aria-label': formatMessage({id: 'sidebar_left.sidebar_channel_menu.dropdownAriaLabel', defaultMessage: 'Edit channel menu'}),\n                onToggle: onMenuToggle,\n            }}\n        >\n            {markAsReadUnreadMenuItem}\n            {favoriteUnfavoriteMenuItem}\n            {muteUnmuteChannelMenuItem}\n            <Menu.Separator/>\n            <ChannelMoveToSubmenu channel={channel}/>\n            {(copyLinkMenuItem || addMembersMenuItem) && <Menu.Separator/>}\n            {copyLinkMenuItem}\n            {addMembersMenuItem}\n            {leaveChannelMenuItem && <Menu.Separator/>}\n            {leaveChannelMenuItem}\n        </Menu.Container>\n    );\n};\n\nexport default memo(SidebarChannelMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {favoriteChannel, unfavoriteChannel, readMultipleChannels} from 'mattermost-redux/actions/channels';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {isFavoriteChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyChannelMemberships, getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\n\nimport {unmuteChannel, muteChannel} from 'actions/channel_actions';\nimport {markMostRecentPostInChannelAsUnread} from 'actions/post_actions';\nimport {openModal} from 'actions/views/modals';\n\nimport {getSiteURL} from 'utils/url';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarChannelMenu from './sidebar_channel_menu';\n\nexport type OwnProps = {\n    channel: Channel;\n    channelLink: string;\n    isUnread: boolean;\n    channelLeaveHandler?: (callback: () => void) => void;\n    onMenuToggle: (open: boolean) => void;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const member = getMyChannelMemberships(state)[ownProps.channel.id];\n    const currentTeam = getCurrentTeam(state);\n\n    let managePublicChannelMembers = false;\n    let managePrivateChannelMembers = false;\n\n    if (currentTeam) {\n        managePublicChannelMembers = haveIChannelPermission(state, currentTeam.id, ownProps.channel.id, Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS);\n        managePrivateChannelMembers = haveIChannelPermission(state, currentTeam.id, ownProps.channel.id, Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS);\n    }\n\n    return {\n        currentUserId: getCurrentUserId(state),\n        isFavorite: isFavoriteChannel(state, ownProps.channel.id),\n        isMuted: isChannelMuted(member),\n        channelLink: `${getSiteURL()}${ownProps.channelLink}`,\n        managePublicChannelMembers,\n        managePrivateChannelMembers,\n    };\n}\n\nconst mapDispatchToProps = {\n    readMultipleChannels,\n    markMostRecentPostInChannelAsUnread,\n    favoriteChannel,\n    unfavoriteChannel,\n    muteChannel,\n    unmuteChannel,\n    openModal,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(SidebarChannelMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {type WrappedComponentProps, injectIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {mark, trackEvent} from 'actions/telemetry_actions';\n\nimport CustomStatusEmoji from 'components/custom_status/custom_status_emoji';\nimport SharedChannelIndicator from 'components/shared_channel_indicator';\nimport {ChannelsAndDirectMessagesTour} from 'components/tours/onboarding_tour';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Pluggable from 'plugins/pluggable';\nimport Constants, {RHSStates} from 'utils/constants';\nimport {wrapEmojis} from 'utils/emoji_utils';\nimport {cmdOrCtrlPressed} from 'utils/keyboard';\nimport {Mark} from 'utils/performance_telemetry';\n\nimport type {RhsState} from 'types/store/rhs';\n\nimport ChannelMentionBadge from '../channel_mention_badge';\nimport ChannelPencilIcon from '../channel_pencil_icon';\nimport SidebarChannelIcon from '../sidebar_channel_icon';\nimport SidebarChannelMenu from '../sidebar_channel_menu';\n\ntype Props = WrappedComponentProps & {\n    channel: Channel;\n    link: string;\n    label: string;\n    ariaLabelPrefix?: string;\n    channelLeaveHandler?: (callback: () => void) => void;\n    icon: JSX.Element | null;\n\n    /**\n     * Number of unread mentions in this channel\n     */\n    unreadMentions: number;\n\n    /**\n     * Whether or not the channel is shown as unread\n     */\n    isUnread: boolean;\n\n    /**\n     * Checks if the current channel is muted\n     */\n    isMuted: boolean;\n\n    isChannelSelected: boolean;\n\n    teammateId?: string;\n\n    firstChannelName?: string;\n\n    showChannelsTutorialStep: boolean;\n\n    hasUrgent: boolean;\n    rhsState?: RhsState;\n    rhsOpen?: boolean;\n    isSharedChannel?: boolean;\n\n    actions: {\n        markMostRecentPostInChannelAsUnread: (channelId: string) => void;\n        clearChannelSelection: () => void;\n        multiSelectChannelTo: (channelId: string) => void;\n        multiSelectChannelAdd: (channelId: string) => void;\n        unsetEditingPost: () => void;\n        closeRightHandSide: () => void;\n    };\n};\n\ntype State = {\n    isMenuOpen: boolean;\n    showTooltip: boolean;\n};\n\nexport class SidebarChannelLink extends React.PureComponent<Props, State> {\n    labelRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.labelRef = React.createRef();\n\n        this.state = {\n            isMenuOpen: false,\n            showTooltip: false,\n        };\n    }\n\n    componentDidMount(): void {\n        this.enableToolTipIfNeeded();\n    }\n\n    componentDidUpdate(prevProps: Props): void {\n        if (prevProps.label !== this.props.label) {\n            this.enableToolTipIfNeeded();\n        }\n    }\n\n    enableToolTipIfNeeded = (): void => {\n        const element = this.labelRef.current;\n        const showTooltip = element && element.offsetWidth < element.scrollWidth;\n        this.setState({showTooltip: Boolean(showTooltip)});\n    };\n\n    getAriaLabel = (): string => {\n        const {label, ariaLabelPrefix, unreadMentions, intl} = this.props;\n\n        let ariaLabel = label;\n\n        if (ariaLabelPrefix) {\n            ariaLabel += ` ${ariaLabelPrefix}`;\n        }\n\n        if (unreadMentions === 1) {\n            ariaLabel += ` ${unreadMentions} ${intl.formatMessage({id: 'accessibility.sidebar.types.mention', defaultMessage: 'mention'})}`;\n        } else if (unreadMentions > 1) {\n            ariaLabel += ` ${unreadMentions} ${intl.formatMessage({id: 'accessibility.sidebar.types.mentions', defaultMessage: 'mentions'})}`;\n        }\n\n        if (this.props.isUnread && unreadMentions === 0) {\n            ariaLabel += ` ${intl.formatMessage({id: 'accessibility.sidebar.types.unread', defaultMessage: 'unread'})}`;\n        }\n\n        return ariaLabel.toLowerCase();\n    };\n\n    handleChannelClick = (event: React.MouseEvent<HTMLAnchorElement>): void => {\n        mark(Mark.ChannelLinkClicked);\n        this.handleSelectChannel(event);\n\n        if (this.props.rhsOpen && this.props.rhsState === RHSStates.EDIT_HISTORY) {\n            this.props.actions.closeRightHandSide();\n        }\n\n        setTimeout(() => {\n            trackEvent('ui', 'ui_channel_selected_v2');\n        }, 0);\n    };\n\n    handleSelectChannel = (event: React.MouseEvent<HTMLAnchorElement>): void => {\n        if (event.defaultPrevented || event.button !== 0) {\n            return;\n        }\n\n        if (cmdOrCtrlPressed(event as unknown as React.KeyboardEvent)) {\n            event.preventDefault();\n            this.props.actions.multiSelectChannelAdd(this.props.channel.id);\n        } else if (event.shiftKey) {\n            event.preventDefault();\n            this.props.actions.multiSelectChannelTo(this.props.channel.id);\n        } else if (event.altKey && !this.props.isUnread) {\n            event.preventDefault();\n            this.props.actions.markMostRecentPostInChannelAsUnread(this.props.channel.id);\n        } else {\n            this.props.actions.clearChannelSelection();\n        }\n    };\n\n    handleMenuToggle = (isMenuOpen: boolean) => {\n        this.setState({isMenuOpen});\n    };\n\n    render(): JSX.Element {\n        const {\n            channel,\n            icon,\n            isChannelSelected,\n            isMuted,\n            isUnread,\n            label,\n            link,\n            unreadMentions,\n            firstChannelName,\n            showChannelsTutorialStep,\n            hasUrgent,\n        } = this.props;\n\n        let channelsTutorialTip: JSX.Element | null = null;\n\n        // firstChannelName is based on channel.name,\n        // but we want to display `display_name` to the user, so we check against `.name` for channel equality but pass in the .display_name value\n        if (firstChannelName === channel.name || (!firstChannelName && showChannelsTutorialStep && channel.name === Constants.DEFAULT_CHANNEL)) {\n            channelsTutorialTip = firstChannelName ? (<ChannelsAndDirectMessagesTour firstChannelName={channel.display_name}/>) : <ChannelsAndDirectMessagesTour/>;\n        }\n\n        let labelElement: JSX.Element = (\n            <span\n                ref={this.labelRef}\n                className='SidebarChannelLinkLabel'\n            >\n                {wrapEmojis(label)}\n            </span>\n        );\n        if (this.state.showTooltip) {\n            labelElement = (\n                <WithTooltip\n                    title={label}\n                >\n                    {labelElement}\n                </WithTooltip>\n            );\n        }\n\n        const customStatus = this.props.teammateId ? (\n            <CustomStatusEmoji\n                userID={this.props.teammateId}\n                showTooltip={true}\n                spanStyle={{\n                    height: 18,\n                }}\n                emojiStyle={{\n                    marginTop: -4,\n                    marginBottom: 0,\n                    opacity: 0.8,\n                }}\n            />\n        ) : null;\n\n        const sharedChannelIcon = this.props.isSharedChannel ? (\n            <SharedChannelIndicator\n                className='icon'\n                withTooltip={true}\n            />\n        ) : null;\n\n        const content = (\n            <>\n                <SidebarChannelIcon\n                    isDeleted={channel.delete_at !== 0}\n                    icon={icon}\n                />\n                <div\n                    className='SidebarChannelLinkLabel_wrapper'\n                >\n                    {labelElement}\n                    {customStatus}\n                    <Pluggable\n                        pluggableName='SidebarChannelLinkLabel'\n                        channel={this.props.channel}\n                    />\n                    {sharedChannelIcon}\n                </div>\n                <ChannelPencilIcon id={channel.id}/>\n                <ChannelMentionBadge\n                    unreadMentions={unreadMentions}\n                    hasUrgent={hasUrgent}\n                />\n                <div\n                    className={classNames(\n                        'SidebarMenu',\n                        'MenuWrapper',\n                        {menuOpen: this.state.isMenuOpen},\n                        {'MenuWrapper--open': this.state.isMenuOpen},\n                    )}\n                >\n                    <SidebarChannelMenu\n                        channel={channel}\n                        channelLink={link}\n                        isUnread={isUnread}\n                        channelLeaveHandler={this.props.channelLeaveHandler}\n                        onMenuToggle={this.handleMenuToggle}\n                    />\n                </div>\n            </>\n        );\n\n        // NOTE: class added to temporarily support the desktop app's at-mention DOM scraping of the old sidebar\n        const className = classNames([\n            'SidebarLink',\n            {\n                menuOpen: this.state.isMenuOpen,\n                muted: isMuted,\n                'unread-title': this.props.isUnread,\n                selected: isChannelSelected,\n            },\n        ]);\n        return (\n            <Link\n                className={className}\n                id={`sidebarItem_${channel.name}`}\n                aria-label={this.getAriaLabel()}\n                to={link}\n                onClick={this.handleChannelClick}\n                tabIndex={0}\n            >\n                {content}\n                {channelsTutorialTip}\n            </Link>\n        );\n    }\n}\n\nexport default injectIntl(SidebarChannelLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {makeGetChannelUnreadCount} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserId, getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getInt} from 'mattermost-redux/selectors/entities/preferences';\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\n\nimport {markMostRecentPostInChannelAsUnread, unsetEditingPost} from 'actions/post_actions';\nimport {clearChannelSelection, multiSelectChannelAdd, multiSelectChannelTo} from 'actions/views/channel_sidebar';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getFirstChannelName} from 'selectors/onboarding';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {isChannelSelected} from 'selectors/views/channel_sidebar';\n\nimport {\n    GenericTaskSteps,\n    OnboardingTaskCategory,\n    OnboardingTasksName,\n} from 'components/onboarding_tasks';\nimport {FINISHED, OnboardingTourSteps, TutorialTourName} from 'components/tours';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarChannelLink from './sidebar_channel_link';\n\ntype OwnProps = {\n    channel: Channel;\n}\n\nfunction makeMapStateToProps() {\n    const getUnreadCount = makeGetChannelUnreadCount();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const member = getMyChannelMemberships(state)[ownProps.channel.id];\n        const unreadCount = getUnreadCount(state, ownProps.channel.id);\n        const config = getConfig(state);\n        const enableTutorial = config.EnableTutorial === 'true';\n        const currentUserId = getCurrentUserId(state);\n        const tutorialStep = getInt(state, TutorialTourName.ONBOARDING_TUTORIAL_STEP, currentUserId, 0);\n        const triggerStep = getInt(state, OnboardingTaskCategory, OnboardingTasksName.CHANNELS_TOUR, FINISHED);\n        const channelTourTriggered = triggerStep === GenericTaskSteps.STARTED;\n        const isOnboardingFlowEnabled = config.EnableOnboardingFlow;\n        const showChannelsTour = enableTutorial && tutorialStep === OnboardingTourSteps.CHANNELS_AND_DIRECT_MESSAGES;\n        const showChannelsTutorialStep = showChannelsTour && channelTourTriggered && isOnboardingFlowEnabled === 'true';\n        return {\n            unreadMentions: unreadCount.mentions,\n            unreadMsgs: unreadCount.messages,\n            isUnread: unreadCount.showUnread,\n            isMuted: isChannelMuted(member),\n            hasUrgent: unreadCount.hasUrgent,\n            isChannelSelected: isChannelSelected(state, ownProps.channel.id),\n            firstChannelName: showChannelsTutorialStep ? getFirstChannelName(state) : '',\n            showChannelsTutorialStep,\n            rhsState: getRhsState(state),\n            rhsOpen: getIsRhsOpen(state),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            markMostRecentPostInChannelAsUnread,\n            unsetEditingPost,\n            clearChannelSelection,\n            multiSelectChannelTo,\n            multiSelectChannelAdd,\n            closeRightHandSide,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SidebarChannelLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {ChannelType} from '@mattermost/types/channels';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n    channelType: ChannelType;\n}\n\nconst SidebarBaseChannelIcon = ({\n    channelType,\n}: Props) => {\n    if (channelType === Constants.OPEN_CHANNEL) {\n        return (\n            <i className='icon icon-globe'/>\n        );\n    }\n    if (channelType === Constants.PRIVATE_CHANNEL) {\n        return (\n            <i className='icon icon-lock-outline'/>\n        );\n    }\n    return null;\n};\n\nexport default SidebarBaseChannelIcon;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport LeaveChannelModal from 'components/leave_channel_modal';\nimport SidebarChannelLink from 'components/sidebar/sidebar_channel/sidebar_channel_link';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport SidebarBaseChannelIcon from './sidebar_base_channel_icon';\n\nimport type {PropsFromRedux} from './index';\n\nexport interface Props extends PropsFromRedux {\n    channel: Channel;\n    currentTeamName: string;\n}\n\nconst SidebarBaseChannel = ({\n    channel,\n    currentTeamName,\n    actions,\n}: Props) => {\n    const intl = useIntl();\n\n    const handleLeavePublicChannel = useCallback((callback: () => void) => {\n        actions.leaveChannel(channel.id);\n        trackEvent('ui', 'ui_public_channel_x_button_clicked');\n        callback();\n    }, [channel.id, actions.leaveChannel]);\n\n    const handleLeavePrivateChannel = useCallback((callback: () => void) => {\n        actions.openModal({modalId: ModalIdentifiers.LEAVE_PRIVATE_CHANNEL_MODAL, dialogType: LeaveChannelModal, dialogProps: {channel}});\n        trackEvent('ui', 'ui_private_channel_x_button_clicked');\n        callback();\n    }, [channel, actions.openModal]);\n\n    let channelLeaveHandler = null;\n    if (channel.type === Constants.OPEN_CHANNEL && channel.name !== Constants.DEFAULT_CHANNEL) {\n        channelLeaveHandler = handleLeavePublicChannel;\n    } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n        channelLeaveHandler = handleLeavePrivateChannel;\n    }\n\n    const channelIcon = (\n        <SidebarBaseChannelIcon\n            channelType={channel.type}\n        />\n    );\n\n    let ariaLabelPrefix;\n    if (channel.type === Constants.OPEN_CHANNEL) {\n        ariaLabelPrefix = intl.formatMessage({id: 'accessibility.sidebar.types.public', defaultMessage: 'public channel'});\n    } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n        ariaLabelPrefix = intl.formatMessage({id: 'accessibility.sidebar.types.private', defaultMessage: 'private channel'});\n    }\n\n    return (\n        <SidebarChannelLink\n            channel={channel}\n            link={`/${currentTeamName}/channels/${channel.name}`}\n            label={channel.display_name}\n            ariaLabelPrefix={ariaLabelPrefix}\n            channelLeaveHandler={channelLeaveHandler!}\n            icon={channelIcon}\n            isSharedChannel={channel.shared}\n        />\n    );\n};\n\nexport default SidebarBaseChannel;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {leaveChannel} from 'actions/views/channel';\nimport {openModal} from 'actions/views/modals';\n\nimport SidebarBaseChannel from './sidebar_base_channel';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            leaveChannel,\n            openModal,\n        }, dispatch),\n    };\n}\n\nconst connector = connect(null, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(SidebarBaseChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {PreferenceType} from '@mattermost/types/preferences';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport ProfilePicture from 'components/profile_picture';\n\nimport {getHistory} from 'utils/browser_history';\nimport {Constants} from 'utils/constants';\n\nimport SidebarChannelLink from '../sidebar_channel_link';\n\ntype Props = {\n    intl: IntlShape;\n    channel: Channel;\n    teammate?: UserProfile;\n    currentTeamName: string;\n    currentUserId: string;\n    redirectChannel: string;\n    active: boolean;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<ActionResult>;\n        leaveDirectChannel: (channelId: string) => Promise<ActionResult>;\n    };\n};\n\nclass SidebarDirectChannel extends React.PureComponent<Props> {\n    handleLeaveChannel = (callback: () => void) => {\n        const id = this.props.channel.teammate_id;\n        const category = Constants.Preferences.CATEGORY_DIRECT_CHANNEL_SHOW;\n\n        const currentUserId = this.props.currentUserId;\n        this.props.actions.savePreferences(currentUserId, [{user_id: currentUserId, category, name: id!, value: 'false'}]).then(callback);\n        this.props.actions.leaveDirectChannel(this.props.channel.name);\n\n        trackEvent('ui', 'ui_direct_channel_x_button_clicked');\n\n        if (this.props.active) {\n            getHistory().push(`/${this.props.currentTeamName}/channels/${this.props.redirectChannel}`);\n        }\n    };\n\n    getIcon = () => {\n        const {channel, teammate} = this.props;\n\n        if (!teammate) {\n            return null;\n        }\n\n        if (teammate.id && teammate.delete_at) {\n            return (\n                <i className='icon icon-archive-outline'/>\n            );\n        }\n\n        let className = '';\n        if (channel.status === 'online') {\n            className = 'status-online';\n        } else if (channel.status === 'away') {\n            className = 'status-away';\n        } else if (channel.status === 'dnd') {\n            className = 'status-dnd';\n        }\n\n        return (\n            <ProfilePicture\n                src={Client4.getProfilePictureUrl(teammate.id, teammate.last_picture_update)}\n                size={'xs'}\n                status={teammate.is_bot ? '' : channel.status}\n                wrapperClass='DirectChannel__profile-picture'\n                newStatusIcon={true}\n                statusClass={`DirectChannel__status-icon ${className}`}\n            />\n        );\n    };\n\n    render() {\n        const {channel, teammate, currentTeamName} = this.props;\n\n        if (!teammate) {\n            return null;\n        }\n\n        let displayName = channel.display_name;\n        if (this.props.currentUserId === teammate.id) {\n            displayName = this.props.intl.formatMessage({\n                id: 'sidebar.directchannel.you',\n                defaultMessage: '{displayname} (you)',\n            }, {\n                displayname: channel.display_name,\n            });\n        }\n\n        return (\n            <SidebarChannelLink\n                teammateId={teammate.id}\n                channel={channel}\n                link={`/${currentTeamName}/messages/@${teammate.username}`}\n                label={displayName}\n                channelLeaveHandler={this.handleLeaveChannel}\n                icon={this.getIcon()}\n                isSharedChannel={Boolean(teammate.remote_id)}\n            />\n        );\n    }\n}\n\nexport default injectIntl(SidebarDirectChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentChannelId, getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {leaveDirectChannel} from 'actions/views/channel';\n\nimport SidebarDirectChannel from './sidebar_direct_channel';\n\ntype OwnProps = {\n    channel: Channel;\n    currentTeamName: string;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const teammate = getUser(state, ownProps.channel.teammate_id!);\n    const currentUser = getCurrentUser(state);\n    const currentTeam = getCurrentTeam(state);\n    const redirectChannel = currentTeam ? getRedirectChannelNameForTeam(state, currentTeam.id) : '';\n    const currentChannelId = getCurrentChannelId(state);\n    const active = ownProps.channel.id === currentChannelId;\n\n    return {\n        teammate,\n        currentUserId: currentUser.id,\n        redirectChannel,\n        active,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            savePreferences,\n            leaveDirectChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarDirectChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback} from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport SidebarChannelLink from 'components/sidebar/sidebar_channel/sidebar_channel_link';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\n\ntype Props = {\n    channel: Channel;\n    currentTeamName: string;\n    currentUserId: string;\n    redirectChannel: string;\n    active: boolean;\n    membersCount: number;\n    actions: {\n        savePreferences: (userId: string, preferences: PreferenceType[]) => Promise<ActionResult>;\n    };\n};\n\nconst SidebarGroupChannel = ({\n    channel,\n    currentUserId,\n    actions,\n    active,\n    currentTeamName,\n    redirectChannel,\n    membersCount,\n}: Props) => {\n    const handleLeaveChannel = useCallback((callback: () => void) => {\n        const id = channel.id;\n        const category = Constants.Preferences.CATEGORY_GROUP_CHANNEL_SHOW;\n\n        actions.savePreferences(currentUserId, [{user_id: currentUserId, category, name: id, value: 'false'}]).then(callback);\n\n        trackEvent('ui', 'ui_direct_channel_x_button_clicked');\n\n        if (active) {\n            getHistory().push(`/${currentTeamName}/channels/${redirectChannel}`);\n        }\n    }, [channel.id, actions, active, currentTeamName, redirectChannel, currentUserId]);\n\n    const getIcon = () => {\n        return (\n            <div className='status status--group'>{membersCount}</div>\n        );\n    };\n\n    return (\n        <SidebarChannelLink\n            channel={channel}\n            link={`/${currentTeamName}/messages/${channel.name}`}\n            label={channel.display_name}\n            channelLeaveHandler={handleLeaveChannel}\n            icon={getIcon()}\n        />\n    );\n};\n\nexport default memo(SidebarGroupChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentChannelId, getRedirectChannelNameForTeam, makeGetGmChannelMemberCount} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport SidebarGroupChannel from './sidebar_group_channel';\n\ntype OwnProps = {\n    channel: Channel;\n}\n\nfunction makeMapStateToProps() {\n    const getMemberCount = makeGetGmChannelMemberCount();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const currentUserId = getCurrentUserId(state);\n        const currentTeam = getCurrentTeam(state);\n        const redirectChannel = currentTeam ? getRedirectChannelNameForTeam(state, currentTeam.id) : '';\n        const currentChannelId = getCurrentChannelId(state);\n        const membersCount = getMemberCount(state, ownProps.channel);\n        const active = ownProps.channel.id === currentChannelId;\n\n        return {\n            currentUserId,\n            redirectChannel,\n            active,\n            membersCount,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SidebarGroupChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\n\nimport {getCurrentChannelId, makeGetChannel, makeGetChannelUnreadCount} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getAutoSortedCategoryIds, getDraggingState, isChannelSelected} from 'selectors/views/channel_sidebar';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarChannel from './sidebar_channel';\n\ntype OwnProps = {\n    channelId: string;\n    channelIndex: number;\n    isCategoryCollapsed: boolean;\n    isCategoryDragged: boolean;\n    isDraggable: boolean;\n    isAutoSortedCategory: boolean;\n\n    /**\n     * Sets the ref for the sidebar channel div element, so that it can be used by parent components\n     */\n    setChannelRef: (channelId: string, ref: HTMLLIElement) => void;\n}\n\nfunction makeMapStateToProps() {\n    const getChannel = makeGetChannel();\n    const getUnreadCount = makeGetChannelUnreadCount();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        const channel = getChannel(state, ownProps.channelId);\n        const currentTeam = getCurrentTeam(state);\n\n        const currentChannelId = getCurrentChannelId(state);\n\n        const unreadCount = getUnreadCount(state, channel?.id || '');\n\n        return {\n            channel,\n            isCurrentChannel: channel?.id === currentChannelId,\n            currentTeamName: currentTeam?.name,\n            unreadMentions: unreadCount.mentions,\n            isUnread: unreadCount.showUnread,\n            draggingState: getDraggingState(state),\n            isChannelSelected: isChannelSelected(state, ownProps.channelId),\n            multiSelectedChannelIds: state.views.channelSidebar.multiSelectedChannelIds,\n            autoSortedCategoryIds: getAutoSortedCategoryIds(state),\n        };\n    };\n}\n\nconst connector = connect(makeMapStateToProps);\n\ntype PropsFromRedux = Omit<ConnectedProps<typeof connector>, 'dispatch'>;\n\nexport type Props = OwnProps & PropsFromRedux;\n\nexport default connector(SidebarChannel);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useState} from 'react';\nimport type {AnimationEvent, ReactNode} from 'react';\nimport {Draggable} from 'react-beautiful-dnd';\nimport {FormattedMessage} from 'react-intl';\n\nimport Constants from 'utils/constants';\n\nimport SidebarBaseChannel from './sidebar_base_channel';\nimport SidebarDirectChannel from './sidebar_direct_channel';\nimport SidebarGroupChannel from './sidebar_group_channel';\n\nimport type {Props} from './index';\n\nfunction SidebarChannel({\n    isCategoryCollapsed,\n    isCategoryDragged,\n    isUnread,\n    isCurrentChannel,\n    setChannelRef,\n    channel,\n    currentTeamName,\n    isDraggable,\n    isChannelSelected,\n    draggingState,\n    multiSelectedChannelIds,\n    channelIndex,\n    isAutoSortedCategory,\n    autoSortedCategoryIds,\n}: Props) {\n    const [show, setShow] = useState(true);\n    if (!channel) {\n        return null;\n    }\n\n    if (!currentTeamName) {\n        return null;\n    }\n\n    function isCollapsed() {\n        return isCategoryDragged || (isCategoryCollapsed && !isUnread && !isCurrentChannel);\n    }\n\n    function setRef(refMethod?: (element: HTMLLIElement) => void) {\n        return (ref: HTMLLIElement) => {\n            setChannelRef(channel?.id || '', ref);\n            refMethod?.(ref);\n        };\n    }\n\n    function handleAnimationStart(event: AnimationEvent) {\n        if (event && event.animationName === 'toOpaqueAnimation' && !isCollapsed()) {\n            setShow(true);\n        }\n    }\n\n    function handleAnimationEnd(event: AnimationEvent) {\n        if (event && event.animationName === 'toTransparentAnimation' && isCollapsed()) {\n            setShow(false);\n        }\n    }\n\n    let component: ReactNode;\n    if (!show) {\n        component = null;\n    } else if (channel.type === Constants.DM_CHANNEL) {\n        component = (\n            <SidebarDirectChannel\n                channel={channel}\n                currentTeamName={currentTeamName}\n            />\n        );\n    } else if (channel.type === Constants.GM_CHANNEL) {\n        component = (\n            <SidebarGroupChannel\n                channel={channel}\n                currentTeamName={currentTeamName}\n            />\n        );\n    } else {\n        component = (\n            <SidebarBaseChannel\n                channel={channel}\n                currentTeamName={currentTeamName}\n            />\n        );\n    }\n\n    if (isDraggable) {\n        let selectedCount: React.ReactNode;\n        if (isChannelSelected && draggingState.state && draggingState.id === channel.id && multiSelectedChannelIds.length > 1) {\n            selectedCount = show ? (\n                <div className='SidebarChannel__selectedCount'>\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_channel.selectedCount'\n                        defaultMessage='{count} selected'\n                        values={{count: multiSelectedChannelIds.length}}\n                    />\n                </div>\n            ) : null;\n        }\n\n        return (\n            <Draggable\n                draggableId={channel.id}\n                index={channelIndex}\n            >\n                {(provided, snapshot) => {\n                    return (\n                        <li\n                            draggable='false'\n                            ref={setRef(provided.innerRef)}\n                            className={classNames('SidebarChannel', {\n                                collapsed: isCollapsed(),\n                                expanded: !isCollapsed(),\n                                unread: isUnread,\n                                active: isCurrentChannel,\n                                dragging: snapshot.isDragging,\n                                selectedDragging: isChannelSelected && draggingState.state && draggingState.id !== channel.id,\n                                fadeOnDrop: snapshot.isDropAnimating && snapshot.draggingOver && autoSortedCategoryIds.has(snapshot.draggingOver),\n                                noFloat: isAutoSortedCategory && !snapshot.isDragging,\n                            })}\n                            {...provided.draggableProps}\n                            {...provided.dragHandleProps}\n                            onAnimationStart={handleAnimationStart}\n                            onAnimationEnd={handleAnimationEnd}\n                            role='listitem'\n                            tabIndex={-1}\n                        >\n                            {component}\n                            {selectedCount}\n                        </li>\n                    );\n                }}\n            </Draggable>\n        );\n    }\n\n    return (\n        <li\n            ref={setRef()}\n            className={classNames('SidebarChannel', {\n                collapsed: isCollapsed(),\n                expanded: !isCollapsed(),\n                unread: isUnread,\n                active: isCurrentChannel,\n            })}\n            onAnimationStart={handleAnimationStart}\n            onAnimationEnd={handleAnimationEnd}\n            role='listitem'\n        >\n            {component}\n        </li>\n    );\n}\n\nexport default SidebarChannel;\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 {GetGroupsForUserParams, GetGroupsParams} from '@mattermost/types/groups';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {fetchChannelsAndMembers} from 'mattermost-redux/actions/channels';\nimport {logError} from 'mattermost-redux/actions/errors';\nimport {getGroups, getAllGroupsAssociatedToChannelsInTeam, getAllGroupsAssociatedToTeam, getGroupsByUserIdPaginated} from 'mattermost-redux/actions/groups';\nimport {forceLogoutIfNecessary} from 'mattermost-redux/actions/helpers';\nimport {getTeamByName, selectTeam} from 'mattermost-redux/actions/teams';\nimport {getIsUserStatusesConfigEnabled} from 'mattermost-redux/selectors/entities/common';\nimport {getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {addVisibleUsersInCurrentChannelAndSelfToStatusPoll} from 'actions/status_actions';\nimport {addUserToTeam} from 'actions/team_actions';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport {isSuccess} from 'types/actions';\nimport type {ActionFuncAsync} from 'types/store';\n\nexport function initializeTeam(team: Team): ActionFuncAsync<Team> {\n    return async (dispatch, getState) => {\n        dispatch(selectTeam(team.id));\n\n        const state = getState();\n        const currentUser = getCurrentUser(state);\n        LocalStorageStore.setPreviousTeamId(currentUser.id, team.id);\n\n        try {\n            await dispatch(fetchChannelsAndMembers(team.id));\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        const enabledUserStatuses = getIsUserStatusesConfigEnabled(state);\n        if (enabledUserStatuses) {\n            dispatch(addVisibleUsersInCurrentChannelAndSelfToStatusPoll());\n        }\n\n        const license = getLicense(state);\n        const customGroupEnabled = isCustomGroupsEnabled(state);\n        if (license &&\n            license.IsLicensed === 'true' &&\n            (license.LDAPGroups === 'true' || customGroupEnabled)) {\n            const groupsParams: GetGroupsParams = {\n                filter_allow_reference: false,\n                page: 0,\n                per_page: 60,\n                include_member_count: true,\n                include_member_ids: true,\n                include_archived: false,\n            };\n            const myGroupsParams: GetGroupsForUserParams = {\n                ...groupsParams,\n                filter_has_member: currentUser.id,\n            };\n\n            if (currentUser) {\n                dispatch(getGroupsByUserIdPaginated(myGroupsParams));\n            }\n\n            if (license.LDAPGroups === 'true') {\n                dispatch(getAllGroupsAssociatedToChannelsInTeam(team.id, true));\n            }\n\n            if (team.group_constrained && license.LDAPGroups === 'true') {\n                dispatch(getAllGroupsAssociatedToTeam(team.id, true));\n            } else {\n                dispatch(getGroups(groupsParams));\n            }\n        }\n\n        return {data: team};\n    };\n}\n\nexport function joinTeam(teamname: string, joinedOnFirstLoad: boolean): ActionFuncAsync<Team> {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const currentUser = getCurrentUser(state);\n\n        try {\n            const teamByNameResult = await dispatch(getTeamByName(teamname));\n            if (isSuccess(teamByNameResult)) {\n                const team = teamByNameResult.data;\n\n                if (currentUser && team && team.delete_at === 0) {\n                    const addUserToTeamResult = await dispatch(addUserToTeam(team.id, currentUser.id));\n                    if (isSuccess(addUserToTeamResult)) {\n                        if (joinedOnFirstLoad) {\n                            LocalStorageStore.setTeamIdJoinedOnLoad(team.id);\n                        }\n\n                        await dispatch(initializeTeam(team));\n\n                        return {data: team};\n                    }\n                    throw addUserToTeamResult.error;\n                }\n                throw new Error('Team not found or deleted');\n            } else {\n                throw teamByNameResult.error;\n            }\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}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {History} from 'history';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {joinChannel, getChannelByNameAndTeamName, getChannelMember, markGroupChannelOpen, fetchChannelsAndMembers} from 'mattermost-redux/actions/channels';\nimport {getUser, getUserByUsername, getUserByEmail} from 'mattermost-redux/actions/users';\nimport {Client4} from 'mattermost-redux/client';\nimport {getChannelByName, getOtherChannels, getChannel, getChannelsNameMapInTeam, getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeamByName, getMyTeamMember} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getCurrentUserId, getUserByUsername as selectUserByUsername, getUser as selectUser, getUserByEmail as selectUserByEmail} from 'mattermost-redux/selectors/entities/users';\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport * as GlobalActions from 'actions/global_actions';\n\nimport {joinPrivateChannelPrompt} from 'utils/channel_utils';\nimport {Constants} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nimport type {Match, MatchAndHistory} from './channel_identifier_router';\n\nconst LENGTH_OF_ID = 26;\nconst LENGTH_OF_GROUP_ID = 40;\nconst LENGTH_OF_USER_ID_PAIR = 54;\nconst USER_ID_PAIR_REGEXP = new RegExp(`^[a-zA-Z0-9]{${LENGTH_OF_ID}}__[a-zA-Z0-9]{${LENGTH_OF_ID}}$`);\n\nexport function onChannelByIdentifierEnter({match, history}: MatchAndHistory): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {path, identifier, team} = match.params;\n\n        if (!identifier) {\n            return {data: undefined};\n        }\n\n        const teamObj = getTeamByName(state, team);\n        if (!teamObj) {\n            return {data: undefined};\n        }\n\n        const channelPath = await getPathFromIdentifier(state, path, identifier);\n\n        switch (channelPath) {\n        case 'channel_name':\n            dispatch(goToChannelByChannelName(match, history));\n            break;\n        case 'channel_id':\n            dispatch(goToChannelByChannelId(match, history));\n            break;\n        case 'group_channel_group_id':\n            dispatch(goToGroupChannelByGroupId(match, history));\n            break;\n        case 'direct_channel_username':\n            dispatch(goToDirectChannelByUsername(match, history));\n            break;\n        case 'direct_channel_email':\n            dispatch(goToDirectChannelByEmail(match, history));\n            break;\n        case 'direct_channel_user_ids':\n            dispatch(goToDirectChannelByUserIds(match, history));\n            break;\n        case 'direct_channel_user_id':\n            dispatch(goToDirectChannelByUserId(match, history, identifier));\n            break;\n        case 'error':\n            await dispatch(fetchChannelsAndMembers(teamObj!.id));\n            handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n            break;\n        }\n        return {data: undefined};\n    };\n}\n\nexport async function getPathFromIdentifier(state: GlobalState, path: string, identifier: string) {\n    if (path === 'channels') {\n        // It's hard to tell an ID apart from a channel name of the same length, so check first if\n        // the identifier matches a channel that we have\n        const channelsByName = getChannelByName(state, identifier);\n        const moreChannelsByName = getOtherChannels(state).find((chan) => chan.name === identifier);\n\n        if (identifier.length === LENGTH_OF_ID) {\n            if (!channelsByName && !moreChannelsByName) {\n                try {\n                    await Client4.getChannel(identifier);\n                    return 'channel_id';\n                } catch (e) {\n                    if (e.status_code === 404) {\n                        return 'channel_name';\n                    }\n                    return 'error';\n                }\n            }\n            return 'channel_name';\n        } else if (\n            (!channelsByName && !moreChannelsByName && identifier.length === LENGTH_OF_GROUP_ID) ||\n            (\n                (channelsByName && channelsByName.type === Constants.GM_CHANNEL) ||\n                (moreChannelsByName && moreChannelsByName.type === Constants.GM_CHANNEL)\n            )\n        ) {\n            return 'group_channel_group_id';\n        } else if (isDirectChannelIdentifier(identifier)) {\n            return 'direct_channel_user_ids';\n        }\n        return 'channel_name';\n    } else if (path === 'messages') {\n        if (identifier.indexOf('@') === 0) {\n            return 'direct_channel_username';\n        } else if (identifier.indexOf('@') > 0) {\n            return 'direct_channel_email';\n        } else if (identifier.length === LENGTH_OF_ID) {\n            return 'direct_channel_user_id';\n        } else if (identifier.length === LENGTH_OF_GROUP_ID) {\n            return 'group_channel_group_id';\n        }\n        return 'error';\n    }\n\n    return 'error';\n}\n\nexport function goToChannelByChannelId(match: Match, history: History): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const channelId = identifier.toLowerCase();\n\n        let channel = getChannel(state, channelId);\n        const member = state.entities.channels.myMembers[channelId];\n        const teamObj = getTeamByName(state, team);\n        if (!channel || !member) {\n            const dispatchResult = await dispatch(joinChannel(getCurrentUserId(state), teamObj!.id, channelId, ''));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                handleChannelJoinError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            channel = dispatchResult.data!.channel;\n        }\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            dispatch(goToDirectChannelByUserId(match, history, Utils.getUserIdFromChannelId(channel.name, getCurrentUserId(state))));\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            history.replace(`/${team}/messages/${channel.name}`);\n        } else {\n            history.replace(`/${team}/channels/${channel.name}`);\n        }\n        return {data: undefined};\n    };\n}\n\nexport function goToChannelByChannelName(match: Match, history: History): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const channelName = identifier.toLowerCase();\n\n        const teamObj = getTeamByName(state, team);\n        if (!teamObj) {\n            return {data: undefined};\n        }\n\n        let channel = getChannelsNameMapInTeam(state, teamObj!.id)[channelName];\n        if (!channel) {\n            const getChannelDispatchResult = await dispatch(getChannelByNameAndTeamName(team, channelName, true));\n            if ('data' in getChannelDispatchResult) {\n                channel = getChannelDispatchResult.data!;\n            }\n        }\n\n        let member;\n        if (channel) {\n            member = state.entities.channels.myMembers[channel.id];\n            if (!member) {\n                const membership = await dispatch(getChannelMember(channel.id, getCurrentUserId(state)));\n                if ('data' in membership) {\n                    member = membership.data;\n                }\n            }\n        }\n\n        if (!channel || !member) {\n            if (channel?.type === Constants.PRIVATE_CHANNEL) {\n                // Prompt system admins and team admins before joining the private channel\n                const user = getCurrentUser(getState());\n                const isSystemAdmin = UserUtils.isSystemAdmin(user?.roles);\n                let prompt = false;\n                if (isSystemAdmin) {\n                    prompt = true;\n                } else {\n                    const teamMember = getMyTeamMember(state, teamObj.id);\n                    prompt = Boolean(teamMember && teamMember.scheme_admin);\n                }\n                if (prompt) {\n                    const joinPromptResult = await dispatch(joinPrivateChannelPrompt(teamObj, channel.display_name));\n                    if ('data' in joinPromptResult && !joinPromptResult.data!.join) {\n                        return {data: undefined};\n                    }\n                }\n            }\n\n            const joinChannelDispatchResult = await dispatch(joinChannel(getCurrentUserId(state), teamObj!.id, channel?.id || '', channelName));\n            if ('error' in joinChannelDispatchResult) {\n                if (!channel) {\n                    const getChannelDispatchResult = await dispatch(getChannelByNameAndTeamName(team, channelName, true));\n                    if ('error' in getChannelDispatchResult || getChannelDispatchResult.data!.delete_at === 0) {\n                        await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                        handleChannelJoinError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                        return {data: undefined};\n                    }\n                    channel = getChannelDispatchResult.data!;\n                }\n            } else {\n                channel = joinChannelDispatchResult.data!.channel;\n            }\n        }\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            dispatch(goToDirectChannelByUserIds(match, history));\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            history.replace(`/${team}/messages/${channel.name}`);\n        } else {\n            doChannelChange(channel);\n        }\n        return {data: undefined};\n    };\n}\n\nfunction goToDirectChannelByUsername(match: Match, history: History): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const username = identifier.slice(1, identifier.length).toLowerCase();\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUserByUsername(state, username);\n        if (!user) {\n            const dispatchResult = await dispatch(getUserByUsername(username));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data!;\n        }\n\n        const directChannelDispatchRes = await dispatch(openDirectChannelToUserId(user.id));\n        if ('error' in directChannelDispatchRes) {\n            await dispatch(fetchChannelsAndMembers(teamObj!.id));\n            handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n            return {data: undefined};\n        }\n\n        doChannelChange(directChannelDispatchRes.data!);\n        return {data: undefined};\n    };\n}\n\nexport function goToDirectChannelByUserId(match: Match, history: History, userId: string): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {team} = match.params;\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUser(state, userId);\n        if (!user) {\n            const dispatchResult = await dispatch(getUser(userId));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data!;\n        }\n\n        history.replace(`/${team}/messages/@${user.username}`);\n        return {data: undefined};\n    };\n}\n\nexport function goToDirectChannelByUserIds(match: Match, history: History): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const userId = Utils.getUserIdFromChannelId(identifier.toLowerCase(), getCurrentUserId(getState()));\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUser(state, userId);\n        if (!user) {\n            const dispatchResult = await dispatch(getUser(userId));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data!;\n        }\n\n        history.replace(`/${team}/messages/@${user.username}`);\n        return {data: undefined};\n    };\n}\n\nexport function goToDirectChannelByEmail(match: Match, history: History): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {team, identifier} = match.params;\n        const email = identifier.toLowerCase();\n        const teamObj = getTeamByName(state, team);\n\n        let user = selectUserByEmail(state, email);\n        if (!user) {\n            const dispatchResult = await dispatch(getUserByEmail(email));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            user = dispatchResult.data!;\n        }\n\n        history.replace(`/${team}/messages/@${user.username}`);\n        return {data: undefined};\n    };\n}\n\nfunction goToGroupChannelByGroupId(match: Match, history: History): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const {identifier, team} = match.params;\n        const groupId = identifier.toLowerCase();\n\n        history.replace(match.url.replace('/channels/', '/messages/'));\n\n        let channel = getChannelByName(state, groupId);\n        const teamObj = getTeamByName(state, team);\n        if (!channel) {\n            const dispatchResult = await dispatch(joinChannel(getCurrentUserId(state), teamObj!.id, '', groupId));\n            if ('error' in dispatchResult) {\n                await dispatch(fetchChannelsAndMembers(teamObj!.id));\n                handleError(match, history, getRedirectChannelNameForTeam(state, teamObj!.id));\n                return {data: undefined};\n            }\n            channel = dispatchResult.data!.channel;\n        }\n\n        dispatch(markGroupChannelOpen(channel!.id));\n\n        doChannelChange(channel!);\n        return {data: undefined};\n    };\n}\n\nfunction doChannelChange(channel: Channel) {\n    GlobalActions.emitChannelClickEvent(channel);\n}\n\nfunction handleError(match: Match, history: History, defaultChannel: string) {\n    const {team} = match.params;\n    history.push(team ? `/${team}/channels/${defaultChannel}` : '/');\n}\n\nfunction isDirectChannelIdentifier(identifier: string) {\n    return identifier.length === LENGTH_OF_USER_ID_PAIR && USER_ID_PAIR_REGEXP.test(identifier);\n}\n\nasync function handleChannelJoinError(match: Match, history: History, defaultChannel: string) {\n    const {team} = match.params;\n    history.push(team ? `/error?type=channel_not_found&returnTo=/${team}/channels/${defaultChannel}` : '/');\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\nimport type {FormatDateOptions} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {EyeOffOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getOldestPostTimeInChannel} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport useGetLimits from 'components/common/hooks/useGetLimits';\nimport {NotifyStatus} from 'components/common/hooks/useGetNotifyAdmin';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\nimport {useNotifyAdmin} from 'components/notify_admin_cta/notify_admin_cta';\n\nimport {LicenseSkus, MattermostFeatures} from 'utils/constants';\n\nimport './index.scss';\n\nconst ONE_DAY_MS = 1000 * 60 * 60 * 24;\nconst ONE_YEAR_MS = ONE_DAY_MS * 365;\n\ninterface Props {\n    channelId?: string;\n    firstInaccessiblePostTime?: number;\n}\n\n// returns the same time on the next day.\nfunction getNextDay(timestamp?: number): number {\n    if (timestamp === undefined) {\n        return 0;\n    }\n\n    return timestamp + ONE_DAY_MS;\n}\n\nexport default function CenterMessageLock(props: Props) {\n    const intl = useIntl();\n\n    const openPricingModal = useOpenPricingModal();\n    const isAdminUser = isAdmin(useSelector(getCurrentUser).roles);\n    const [cloudLimits, limitsLoaded] = useGetLimits();\n    const currentTeam = useSelector(getCurrentTeam);\n\n    // firstInaccessiblePostTime is the most recently inaccessible post's created at date.\n    // It is used as a backup for when there are no available posts in the channel;\n    // The message then shows that the user can retrieve messages prior to the day\n    // **after** the most recent day with inaccessible posts.\n    const oldestPostTime = useSelector((state: GlobalState) => getOldestPostTimeInChannel(state, props.channelId || '')) || getNextDay(props.firstInaccessiblePostTime);\n    const [notifyAdminBtnText, notifyAdmin, notifyRequestStatus] = useNotifyAdmin({\n        ctaText: intl.formatMessage({\n            id: 'workspace_limits.message_history.locked.cta.end_user',\n            defaultMessage: 'Notify Admin',\n        }),\n    }, {\n        required_feature: MattermostFeatures.UNLIMITED_MESSAGES,\n        required_plan: LicenseSkus.Professional,\n        trial_notification: false,\n    });\n\n    if (!limitsLoaded) {\n        return null;\n    }\n\n    const dateFormat: FormatDateOptions = {month: 'long', day: 'numeric'};\n    if (Date.now() - oldestPostTime >= ONE_YEAR_MS) {\n        dateFormat.year = 'numeric';\n    }\n    const titleValues = {\n        date: intl.formatDate(oldestPostTime, dateFormat),\n        team: currentTeam?.display_name,\n    };\n\n    const limit = intl.formatNumber(cloudLimits?.messages?.history || 0);\n\n    let title = intl.formatMessage(\n        {\n            id: 'workspace_limits.message_history.locked.title.end_user',\n            defaultMessage: 'Notify your admin to unlock messages prior to {date} in {team}',\n        },\n        titleValues,\n    );\n    let description: React.ReactNode = intl.formatMessage(\n        {\n            id: 'workspace_limits.message_history.locked.description.end_user',\n            defaultMessage: 'Some older messages may not be shown because your workspace has over {limit} messages. Select Notify Admin to send an automatic request to your System Admins to upgrade.',\n        },\n        {\n            limit,\n        },\n    );\n\n    let cta = (\n        <button\n            className='btn btn-primary'\n            onClick={(e) => notifyAdmin(e, 'center_channel_posts_over_limit_banner')}\n            disabled={notifyRequestStatus === NotifyStatus.AlreadyComplete}\n        >\n            {notifyAdminBtnText}\n        </button>);\n\n    if (isAdminUser) {\n        title = intl.formatMessage({\n            id: 'workspace_limits.message_history.locked.title.admin',\n            defaultMessage: 'Unlock messages prior to {date} in {team}',\n        }, titleValues);\n\n        description = intl.formatMessage(\n            {\n                id: 'workspace_limits.message_history.locked.description.admin',\n                defaultMessage: 'To view and search all of the messages in your workspace’s history, rather than just the most recent {limit} messages, upgrade to one of our paid plans. <a>Review our plan options and pricing.</a>',\n            },\n            {\n                limit,\n                a: (chunks: React.ReactNode | React.ReactNodeArray) => (\n                    <a\n                        href='#'\n                        onClick={(e: React.MouseEvent) => {\n                            e.preventDefault();\n                            openPricingModal({trackingLocation: 'center_channel_posts_over_limit_banner'});\n                        }}\n                    >\n                        {chunks}\n                    </a>\n                ),\n            },\n        );\n\n        cta = (\n            <button\n                className='btn is-admin'\n                onClick={() => openPricingModal({trackingLocation: 'center_channel_posts_over_limit_banner'})}\n            >\n                {\n                    intl.formatMessage({\n                        id: 'workspace_limits.message_history.locked.cta.admin',\n                        defaultMessage: 'Upgrade now',\n                    })\n                }\n            </button>\n        );\n    }\n\n    return (<div className='CenterMessageLock'>\n        <div className='CenterMessageLock__left'>\n            <EyeOffOutlineIcon color={'rgba(var(--center-channel-color-rgb), 0.75)'}/>\n        </div>\n        <div className='CenterMessageLock__right'>\n            <div className='CenterMessageLock__title'>\n                {title}\n            </div>\n            <div className='CenterMessageLock__description'>\n                {description}\n            </div>\n            <div className='CenterMessageLock__cta'>\n                {cta}\n            </div>\n        </div>\n    </div>);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as React from 'react';\n\ntype SvgProps = {\n    width?: number;\n    height?: number;\n};\n\nconst PrivateChannelIntroSvg = (props: SvgProps) => (\n    <svg\n        width={props.width ?? '130'}\n        height={props.height ?? '102'}\n        viewBox='0 0 130 102'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n        {...props}\n    >\n        <g clipPath='url(#clip0_4212_90419)'>\n            <path\n                d='M2.50001 16L2.5 31L127.5 31L127.5 75L66 75'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.32'\n                strokeLinecap='round'\n            />\n            <path\n                d='M2.5 69L2.5 42L29 42'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.32'\n                strokeLinecap='round'\n            />\n            <path\n                d='M18.5 70.5L18.5 56.5L106 56.5'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.32'\n                strokeLinecap='round'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 0 16)'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 0 74)'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 16 74)'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='71'\n                cy='59'\n                r='43'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.12'\n            />\n            <path\n                d='M110.748 91.5258L119 100V56C119 54.8954 118.105 54 117 54H76.0005C74.8959 54 74.0005 54.8954 74.0005 56V88.9211C74.0005 90.0256 74.8959 90.9211 76.0005 90.9211H109.316C109.855 90.9211 110.372 91.1391 110.748 91.5258Z'\n                fill='#28427B'\n            />\n            <circle\n                opacity='0.48'\n                cx='86.831'\n                cy='65.831'\n                r='5.83099'\n                fill='var(--button-color)'\n            />\n            <path\n                opacity='0.4'\n                d='M96 64H112'\n                stroke='var(--button-color-rgb)'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M82 79H103.38'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M82 83H96.2535'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M96 68H110'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M82 75H93.0141'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M95.6064 75H107.268'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                d='M28.605 67.5638L15 81V12C15 10.8954 15.8954 10 17 10H83C84.1046 10 85 10.8954 85 12V64.9868C85 66.0914 84.1046 66.9868 83 66.9868H30.0103C29.4842 66.9868 28.9793 67.1941 28.605 67.5638Z'\n                fill='var(--center-channel-bg)'\n            />\n            <path\n                d='M28.2536 67.2081L15.5 79.8035V12C15.5 11.1716 16.1716 10.5 17 10.5H83C83.8284 10.5 84.5 11.1716 84.5 12V64.9868C84.5 65.8153 83.8284 66.4868 83 66.4868H30.0103C29.3527 66.4868 28.7215 66.746 28.2536 67.2081Z'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n            />\n            <circle\n                cx='33'\n                cy='29'\n                r='9'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.4'\n            />\n            <path\n                d='M48 25H64'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 49H62'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 55H47'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M48 31H73'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 43H42'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M46 43H64'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <circle\n                cx='78'\n                cy='19'\n                r='19'\n                fill='#32539A'\n            />\n            <path\n                d='M98 49L80 49'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <path\n                d='M76 49L70 49'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <path\n                d='M67 49L65 49'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <circle\n                cx='44'\n                cy='75'\n                r='2'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='52'\n                cy='75'\n                r='2'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='60'\n                cy='75'\n                r='2'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <rect\n                x='70.5'\n                y='15.5'\n                width='15'\n                height='12'\n                rx='1.5'\n                stroke='var(--button-color)'\n            />\n            <path\n                d='M73 16V13C73 10.2386 75.2386 8 78 8V8C80.7614 8 83 10.2386 83 13V16'\n                stroke='var(--button-color)'\n            />\n        </g>\n        <defs>\n            <clipPath id='clip0_4212_90419'>\n                <rect\n                    width='130'\n                    height='102'\n                    fill='white'\n                />\n            </clipPath>\n        </defs>\n    </svg>\n);\n\nexport default PrivateChannelIntroSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\ntype SvgProps = {\n    width?: number;\n    height?: number;\n};\n\nconst PublicChannelIntroSvg = (props: SvgProps) => (\n    <svg\n        width={props.width ?? '130'}\n        height={props.height ?? '102'}\n        viewBox='0 0 130 102'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n    >\n        <g clipPath='url(#clip0_4212_90121)'>\n            <path\n                d='M2.50001 16L2.5 31L127.5 31L127.5 75L66 75'\n                stroke='rgba(var(--center-channel-color-rgb), 0.32)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M2.5 69L2.5 42L29 42'\n                stroke='rgba(var(--center-channel-color-rgb), 0.32)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M18.5 70.5L18.5 56.5L106 56.5'\n                stroke='rgba(var(--center-channel-color-rgb), 0.32)'\n                strokeLinecap='round'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 0 16)'\n                fill='rgba(var(--center-channel-color-rgb), 0.32)'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 0 74)'\n                fill='rgba(var(--center-channel-color-rgb), 0.32)'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 16 74)'\n                fill='rgba(var(--center-channel-color-rgb), 0.32)'\n            />\n            <circle\n                cx='71'\n                cy='59'\n                r='43'\n                fill='rgba(var(--center-channel-color-rgb), 0.12)'\n            />\n            <path\n                d='M110.748 91.5258L119 100V56C119 54.8954 118.105 54 117 54H76.0005C74.8959 54 74.0005 54.8954 74.0005 56V88.9211C74.0005 90.0256 74.8959 90.9211 76.0005 90.9211H109.316C109.855 90.9211 110.372 91.1391 110.748 91.5258Z'\n                fill='#28427B'\n            />\n            <circle\n                opacity='0.48'\n                cx='86.831'\n                cy='65.831'\n                r='5.83099'\n                fill='var(--button-color)'\n            />\n            <path\n                opacity='0.4'\n                d='M96 64H112'\n                stroke='var(--button-color-rgb)'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M82 79H103.38'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M82 83H96.2535'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M96 68H110'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M82 75H93.0141'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M95.6064 75H107.268'\n                stroke='rgba(var(--button-color-rgb))'\n                strokeLinecap='round'\n            />\n            <path\n                d='M28.605 67.5638L15 81V12C15 10.8954 15.8954 10 17 10H83C84.1046 10 85 10.8954 85 12V64.9868C85 66.0914 84.1046 66.9868 83 66.9868H30.0103C29.4842 66.9868 28.9793 67.1941 28.605 67.5638Z'\n                fill='rgba(var(--center-channel-bg-rgb))'\n            />\n            <path\n                d='M28.2536 67.2081L15.5 79.8035V12C15.5 11.1716 16.1716 10.5 17 10.5H83C83.8284 10.5 84.5 11.1716 84.5 12V64.9868C84.5 65.8153 83.8284 66.4868 83 66.4868H30.0103C29.3527 66.4868 28.7215 66.746 28.2536 67.2081Z'\n                stroke='rgba(var(--center-channel-color-rgb), 0.8)'\n            />\n            <circle\n                cx='33'\n                cy='29'\n                r='9'\n                fill='rgba(var(--center-channel-color-rgb), 0.4)'\n            />\n            <path\n                d='M48 25H64'\n                stroke='rgba(var(--center-channel-color-rgb), 0.4)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 49H62'\n                stroke='rgba(var(--center-channel-color-rgb), 0.4)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 55H47'\n                stroke='rgba(var(--center-channel-color-rgb), 0.4)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M48 31H73'\n                stroke='rgba(var(--center-channel-color-rgb), 0.4)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 43H42'\n                stroke='rgba(var(--center-channel-color-rgb), 0.4)'\n                strokeLinecap='round'\n            />\n            <path\n                d='M46 43H64'\n                stroke='rgba(var(--center-channel-color-rgb), 0.4)'\n                strokeLinecap='round'\n            />\n            <circle\n                cx='78'\n                cy='19'\n                r='19'\n                fill='#32539A'\n            />\n            <path\n                d='M98 49L80 49'\n                stroke='rgba(var(--center-channel-color-rgb), 0.8)'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <path\n                d='M76 49L70 49'\n                stroke='rgba(var(--center-channel-color-rgb), 0.8)'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <path\n                d='M67 49L65 49'\n                stroke='rgba(var(--center-channel-color-rgb), 0.8)'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <circle\n                cx='44'\n                cy='75'\n                r='2'\n                fill='rgba(var(--center-channel-color-rgb), 0.32)'\n            />\n            <circle\n                cx='52'\n                cy='75'\n                r='2'\n                fill='rgba(var(--center-channel-color-rgb), 0.32)'\n            />\n            <circle\n                cx='60'\n                cy='75'\n                r='2'\n                fill='rgba(var(--center-channel-color-rgb), 0.32)'\n            />\n            <circle\n                cx='78'\n                cy='19'\n                r='9.5'\n                stroke='rgba(var(--button-color-rgb))'\n            />\n            <path\n                d='M87.5 20.2525C86.1859 21.8482 82.4292 23 78 23C73.5708 23 69.8141 21.8482 68.5 20.2525'\n                stroke='rgba(var(--button-color-rgb))'\n            />\n            <path\n                d='M86.6622 15C84.9331 16.1956 81.7014 17 78 17C74.2986 17 71.0669 16.1956 69.3378 15'\n                stroke='rgba(var(--button-color-rgb))'\n            />\n            <path\n                d='M81.5 19C81.5 21.7141 81.059 24.1482 80.3642 25.8854C80.0162 26.7553 79.6144 27.4258 79.1937 27.8706C78.7741 28.3143 78.3705 28.5 78 28.5C77.6295 28.5 77.2259 28.3143 76.8063 27.8706C76.3856 27.4258 75.9838 26.7553 75.6358 25.8854C74.941 24.1482 74.5 21.7141 74.5 19C74.5 16.2859 74.941 13.8518 75.6358 12.1146C75.9838 11.2447 76.3856 10.5742 76.8063 10.1294C77.2259 9.6857 77.6295 9.5 78 9.5C78.3705 9.5 78.7741 9.6857 79.1937 10.1294C79.6144 10.5742 80.0162 11.2447 80.3642 12.1146C81.059 13.8518 81.5 16.2859 81.5 19Z'\n                stroke='rgba(var(--button-color-rgb))'\n            />\n        </g>\n        <defs>\n            <clipPath id='clip0_4212_90121'>\n                <rect\n                    width='130'\n                    height='102'\n                    fill='rgba(var(--center-channel-bg-rgb))'\n                />\n            </clipPath>\n        </defs>\n    </svg>\n\n);\n\nexport default PublicChannelIntroSvg;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport * as React from 'react';\n\ntype SvgProps = {\n    width?: number;\n    height?: number;\n};\n\nconst SvgComponent = (props: SvgProps) => (\n    <svg\n        width={props.width ?? '130'}\n        height={props.height ?? '92'}\n        viewBox='0 0 130 92'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n        xmlnsXlink='http://www.w3.org/1999/xlink'\n        {...props}\n    >\n        <g clipPath='url(#clip0_4210_88396)'>\n            <path\n                d='M2.50001 6.00001L2.5 21L127.5 21L127.5 65L66 65'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.24'\n                strokeLinecap='round'\n            />\n            <path\n                d='M2.49999 59L2.49999 32L29 32'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.24'\n                strokeLinecap='round'\n            />\n            <path\n                d='M18.5 60.5L18.5 46.5L106 46.5'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.24'\n                strokeLinecap='round'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 0 6)'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 0 64)'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='2.5'\n                cy='2.5'\n                r='2.5'\n                transform='matrix(1 8.74228e-08 8.74228e-08 -1 16 64)'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.4'\n            />\n            <circle\n                cx='71'\n                cy='49'\n                r='43'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.12'\n            />\n            <path\n                d='M109.748 82.5258L117.999 91V47C117.999 45.8954 117.104 45 115.999 45H74.9998C73.8952 45 72.9998 45.8954 72.9998 47V79.9211C72.9998 81.0256 73.8952 81.9211 74.9998 81.9211H108.315C108.855 81.9211 109.371 82.1391 109.748 82.5258Z'\n                fill='#28427B'\n            />\n            <circle\n                opacity='0.48'\n                cx='85.8309'\n                cy='56.831'\n                r='5.83099'\n                fill='#FFFFFF'\n            />\n            <path\n                opacity='0.4'\n                d='M94.9999 55H111'\n                stroke='#FFFFFF'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M80.9999 70H102.38'\n                stroke='#FFFFFF'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M80.9999 74H95.2535'\n                stroke='#FFFFFF'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M94.9999 59H109'\n                stroke='#FFFFFF'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M80.9999 66H92.014'\n                stroke='#FFFFFF'\n                strokeLinecap='round'\n            />\n            <path\n                opacity='0.4'\n                d='M94.6064 66H106.268'\n                stroke='#FFFFFF'\n                strokeLinecap='round'\n            />\n            <path\n                d='M28.605 57.5638L15 71V2C15 0.895431 15.8954 0 17 0H83C84.1046 0 85 0.89543 85 2V54.9868C85 56.0914 84.1046 56.9868 83 56.9868H30.0103C29.4842 56.9868 28.9793 57.1941 28.605 57.5638Z'\n                fill='var(--center-channel-bg)'\n            />\n            <path\n                d='M28.2536 57.2081L15.5 69.8035V2C15.5 1.17157 16.1716 0.5 17 0.5H83C83.8284 0.5 84.5 1.17157 84.5 2V54.9868C84.5 55.8153 83.8284 56.4868 83 56.4868H30.0103C29.3527 56.4868 28.7215 56.746 28.2536 57.2081Z'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n            />\n            <circle\n                cx='33'\n                cy='19'\n                r='9'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.4'\n            />\n            <path\n                d='M48 15H64'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 39H69'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 45H47'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M48 21H73'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M25 33H42'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <path\n                d='M46 33H64'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.4'\n                strokeLinecap='round'\n            />\n            <circle\n                cx='44'\n                cy='65'\n                r='2'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='52'\n                cy='65'\n                r='2'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <circle\n                cx='60'\n                cy='65'\n                r='2'\n                fill='var(--center-channel-color)'\n                fillOpacity='0.32'\n            />\n            <path\n                d='M101 33L83 33'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <path\n                d='M79 33L73 33'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n            <path\n                d='M70 33L68 33'\n                stroke='var(--center-channel-color)'\n                strokeOpacity='0.8'\n                strokeLinecap='round'\n                strokeLinejoin='round'\n            />\n        </g>\n        <defs>\n            <clipPath id='clip0_4210_88396'>\n                <rect\n                    width='130'\n                    height='92'\n                    fill='white'\n                />\n            </clipPath>\n        </defs>\n    </svg>\n);\n\nexport default SvgComponent;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport AddGroupsToChannelModal from 'components/add_groups_to_channel_modal';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport InvitationModal from 'components/invitation_modal';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\n\nimport './add_members_button.scss';\n\nexport interface AddMembersButtonProps {\n    totalUsers?: number;\n    usersLimit: number;\n    channel: Channel;\n    pluginButtons?: React.ReactNode;\n}\n\nconst AddMembersButton: React.FC<AddMembersButtonProps> = ({totalUsers, usersLimit, channel, pluginButtons}: AddMembersButtonProps) => {\n    const currentTeamId = useSelector(getCurrentTeamId);\n\n    if (!totalUsers) {\n        return (<LoadingSpinner/>);\n    }\n\n    const inviteUsers = totalUsers < usersLimit;\n\n    return (\n        <TeamPermissionGate\n            teamId={currentTeamId}\n            permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n        >\n            {inviteUsers ? (\n                <LessThanMaxFreeUsers\n                    pluginButtons={pluginButtons}\n                />\n            ) : (\n                <MoreThanMaxFreeUsers\n                    channel={channel}\n                    pluginButtons={pluginButtons}\n                />\n            )}\n        </TeamPermissionGate>\n    );\n};\n\nconst LessThanMaxFreeUsers = ({pluginButtons}: {pluginButtons: React.ReactNode}) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <>\n            {pluginButtons}\n            <div className='LessThanMaxFreeUsers'>\n                <ToggleModalButton\n                    ariaLabel={formatMessage({id: 'intro_messages.inviteOthers', defaultMessage: 'Invite others to the workspace'})}\n                    id='introTextInvite'\n                    className='btn btn-sm btn-primary'\n                    modalId={ModalIdentifiers.INVITATION}\n                    dialogType={InvitationModal}\n                    onClick={() => trackEvent('channel_intro_message', 'click_invite_button')}\n                >\n                    <i\n                        className='icon-email-plus-outline'\n                        title={formatMessage({id: 'generic_icons.add', defaultMessage: 'Add Icon'})}\n                    />\n                    <FormattedMessage\n                        id='intro_messages.inviteOthersToWorkspace.button'\n                        defaultMessage='Invite others to the workspace'\n                    />\n                </ToggleModalButton>\n            </div>\n        </>\n    );\n};\n\nconst MoreThanMaxFreeUsers = ({channel, pluginButtons}: {channel: Channel; pluginButtons: React.ReactNode}) => {\n    const {formatMessage} = useIntl();\n\n    const modalId = channel.group_constrained ? ModalIdentifiers.ADD_GROUPS_TO_CHANNEL : ModalIdentifiers.CHANNEL_INVITE;\n    const modal = channel.group_constrained ? AddGroupsToChannelModal : ChannelInviteModal;\n    const channelIsArchived = channel.delete_at !== 0;\n    if (channelIsArchived) {\n        return null;\n    }\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n\n    return (\n        <div className='MoreThanMaxFreeUsersWrapper'>\n            <div className='MoreThanMaxFreeUsers'>\n                <ChannelPermissionGate\n                    channelId={channel.id}\n                    teamId={channel.team_id}\n                    permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS : Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS]}\n                >\n                    <ToggleModalButton\n                        className='action-button'\n                        modalId={modalId}\n                        dialogType={modal}\n                        dialogProps={{channel}}\n                    >\n                        <i\n                            className='icon-account-plus-outline'\n                            title={formatMessage({id: 'generic_icons.add', defaultMessage: 'Add Icon'})}\n                        />\n                        {channel.group_constrained &&\n                            <FormattedMessage\n                                id='intro_messages.inviteGropusToChannel.button'\n                                defaultMessage='Add groups'\n                            />}\n                        {!channel.group_constrained &&\n                            <FormattedMessage\n                                id='intro_messages.inviteMembersToChannel.button'\n                                defaultMessage='Add people'\n                            />}\n                    </ToggleModalButton>\n                </ChannelPermissionGate>\n            </div>\n            {pluginButtons}\n        </div>\n    );\n};\n\nexport default React.memo(AddMembersButton);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\n\nimport type {PluginComponent} from 'types/store/plugins';\n\ntype Props = {\n    channel: Channel;\n    channelMember?: ChannelMembership;\n    pluginButtons: PluginComponent[];\n}\n\nconst PluggableIntroButtons = React.memo((props: Props) => {\n    const channelIsArchived = props.channel.delete_at !== 0;\n    if (channelIsArchived || props.pluginButtons.length === 0) {\n        return null;\n    }\n\n    const buttons = props.pluginButtons.map((buttonProps) => {\n        return (\n            <button\n                key={buttonProps.id}\n                className={'action-button'}\n                onClick={() => buttonProps.action?.(props.channel, props.channelMember)}\n            >\n                {buttonProps.icon}\n                {buttonProps.text}\n            </button>\n        );\n    });\n\n    return <>{buttons}</>;\n});\nPluggableIntroButtons.displayName = 'PluggableIntroButtons';\n\nexport default PluggableIntroButtons;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {getMyChannelMembership} from 'mattermost-redux/selectors/entities/channels';\n\nimport {getChannelIntroPluginButtons} from 'selectors/plugins';\n\nimport type {GlobalState} from 'types/store';\n\nimport PluggableIntroButtons from './pluggable_intro_buttons';\n\ntype OwnProps = {\n    channel: Channel;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    return {\n        channelMember: getMyChannelMembership(state, ownProps.channel.id),\n        pluginButtons: getChannelIntroPluginButtons(state),\n    };\n}\n\nexport default connect(mapStateToProps)(PluggableIntroButtons);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedDate, FormattedMessage, defineMessages} from 'react-intl';\n\nimport {BellRingOutlineIcon, GlobeIcon, PencilOutlineIcon, StarOutlineIcon, LockOutlineIcon, StarIcon} from '@mattermost/compass-icons/components';\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile as UserProfileType} from '@mattermost/types/users';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {NotificationLevel} from 'mattermost-redux/constants/channels';\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\n\nimport AddGroupsToTeamModal from 'components/add_groups_to_team_modal';\nimport ChannelNotificationsModal from 'components/channel_notifications_modal';\nimport ChannelIntroPrivateSvg from 'components/common/svg_images_components/channel_intro_private_svg';\nimport ChannelIntroPublicSvg from 'components/common/svg_images_components/channel_intro_public_svg';\nimport ChannelIntroTownSquareSvg from 'components/common/svg_images_components/channel_intro_town_square_svg';\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport ProfilePicture from 'components/profile_picture';\nimport ToggleModalButton from 'components/toggle_modal_button';\nimport UserProfile from 'components/user_profile';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {getMonthLong} from 'utils/i18n';\nimport * as Utils from 'utils/utils';\n\nimport AddMembersButton from './add_members_button';\nimport PluggableIntroButtons from './pluggable_intro_buttons';\n\ntype Props = {\n    currentUserId: string;\n    channel?: Channel;\n    fullWidth: boolean;\n    locale: string;\n    channelProfiles: UserProfileType[];\n    enableUserCreation?: boolean;\n    isReadOnly?: boolean;\n    isFavorite: boolean;\n    teamIsGroupConstrained?: boolean;\n    creatorName: string;\n    teammate?: UserProfileType;\n    teammateName?: string;\n    currentUser: UserProfileType;\n    stats: any;\n    usersLimit: number;\n    channelMember?: ChannelMembership;\n    isMobileView: boolean;\n    actions: {\n        getTotalUsersStats: () => any;\n        favoriteChannel: (channelId: string) => any;\n        unfavoriteChannel: (channelId: string) => any;\n    };\n}\n\nexport default class ChannelIntroMessage extends React.PureComponent<Props> {\n    toggleFavorite = () => {\n        if (!this.props.channel) {\n            return;\n        }\n\n        if (this.props.isFavorite) {\n            this.props.actions.unfavoriteChannel(this.props.channel.id);\n        } else {\n            this.props.actions.favoriteChannel(this.props.channel.id);\n        }\n    };\n\n    componentDidMount() {\n        if (!this.props.stats?.total_users_count) {\n            this.props.actions.getTotalUsersStats();\n        }\n    }\n\n    render() {\n        const {\n            currentUserId,\n            channel,\n            fullWidth,\n            locale,\n            channelProfiles,\n            enableUserCreation,\n            isReadOnly,\n            isFavorite,\n            teamIsGroupConstrained,\n            creatorName,\n            teammate,\n            teammateName,\n            currentUser,\n            stats,\n            usersLimit,\n            channelMember,\n            isMobileView,\n        } = this.props;\n\n        let centeredIntro = '';\n        if (!fullWidth) {\n            centeredIntro = 'channel-intro--centered';\n        }\n\n        if (!channel) {\n            return null;\n        }\n\n        if (channel.type === Constants.DM_CHANNEL) {\n            return createDMIntroMessage(channel, centeredIntro, currentUser, isFavorite, isMobileView, this.toggleFavorite, teammate, teammateName);\n        } else if (channel.type === Constants.GM_CHANNEL) {\n            return createGMIntroMessage(channel, centeredIntro, isFavorite, isMobileView, this.toggleFavorite, channelProfiles, currentUserId, currentUser, channelMember);\n        } else if (channel.name === Constants.DEFAULT_CHANNEL) {\n            return createDefaultIntroMessage(channel, centeredIntro, currentUser, isFavorite, isMobileView, this.toggleFavorite, stats, usersLimit, enableUserCreation, isReadOnly, teamIsGroupConstrained);\n        } else if (channel.name === Constants.OFFTOPIC_CHANNEL) {\n            return createOffTopicIntroMessage(channel, centeredIntro, isFavorite, isMobileView, currentUser, this.toggleFavorite, stats, usersLimit);\n        } else if (channel.type === Constants.OPEN_CHANNEL || channel.type === Constants.PRIVATE_CHANNEL) {\n            return createStandardIntroMessage(channel, centeredIntro, currentUser, isFavorite, isMobileView, this.toggleFavorite, stats, usersLimit, locale, creatorName);\n        }\n        return null;\n    }\n}\n\nconst gmIntroMessages = defineMessages({\n    muted: {id: 'intro_messages.GM.muted', defaultMessage: 'This group message is currently <b>muted</b>, so you will not be notified.'},\n    [NotificationLevel.ALL]: {id: 'intro_messages.GM.all', defaultMessage: 'You\\'ll be notified <b>for all activity</b> in this group message.'},\n    [NotificationLevel.DEFAULT]: {id: 'intro_messages.GM.all', defaultMessage: 'You\\'ll be notified <b>for all activity</b> in this group message.'},\n    [NotificationLevel.MENTION]: {id: 'intro_messages.GM.mention', defaultMessage: 'You have selected to be notified <b>only when mentioned</b> in this group message.'},\n    [NotificationLevel.NONE]: {id: 'intro_messages.GM.none', defaultMessage: 'You have selected to <b>never</b> be notified in this group message.'},\n});\n\nconst getGMIntroMessageSpecificPart = (userProfile: UserProfileType | undefined, membership: ChannelMembership | undefined) => {\n    const isMuted = isChannelMuted(membership);\n    if (isMuted) {\n        return (\n            <FormattedMessage\n                {...gmIntroMessages.muted}\n                values={{\n                    b: (chunks) => <b>{chunks}</b>,\n                }}\n            />\n        );\n    }\n    const channelNotifyProp = membership?.notify_props?.desktop || NotificationLevel.DEFAULT;\n    const userNotifyProp = userProfile?.notify_props?.desktop || NotificationLevel.MENTION;\n    let notifyLevelToUse = channelNotifyProp;\n    if (notifyLevelToUse === NotificationLevel.DEFAULT) {\n        notifyLevelToUse = userNotifyProp;\n    }\n    if (channelNotifyProp === NotificationLevel.DEFAULT && userNotifyProp === NotificationLevel.MENTION) {\n        notifyLevelToUse = NotificationLevel.ALL;\n    }\n\n    return (\n        <FormattedMessage\n            {...gmIntroMessages[notifyLevelToUse]}\n            values={{\n                b: (chunks) => <b>{chunks}</b>,\n            }}\n        />\n    );\n};\n\nfunction createGMIntroMessage(\n    channel: Channel,\n    centeredIntro: string,\n    isFavorite: boolean,\n    isMobileView: boolean,\n    toggleFavorite: () => void,\n    profiles: UserProfileType[],\n    currentUserId: string,\n    currentUser: UserProfileType,\n    channelMembership?: ChannelMembership,\n) {\n    const channelIntroId = 'channelIntro';\n\n    if (profiles.length > 0) {\n        const currentUserProfile = profiles.find((v) => v.id === currentUserId);\n\n        const pictures = profiles.\n            filter((profile) => profile.id !== currentUserId).\n            map((profile) => (\n                <ProfilePicture\n                    key={'introprofilepicture' + profile.id}\n                    src={Utils.imageURLForUser(profile.id, profile.last_picture_update)}\n                    size='xl-custom-GM'\n                    userId={profile.id}\n                    username={profile.username}\n                />\n            ));\n\n        const actionButtons = (\n            <div className='channel-intro__actions'>\n                {createFavoriteButton(isFavorite, toggleFavorite)}\n                {createSetHeaderButton(channel)}\n                {!isMobileView && createNotificationPreferencesButton(channel, currentUser)}\n                <PluggableIntroButtons channel={channel}/>\n            </div>\n        );\n\n        return (\n            <div\n                id={channelIntroId}\n                className={'channel-intro ' + centeredIntro}\n            >\n                <div className='post-profile-img__container channel-intro-img channel-intro-img__group'>\n                    {pictures}\n                </div>\n                <h2 className='channel-intro__title'>\n                    {channel.display_name}\n                </h2>\n                <p className='channel-intro__text'>\n                    <FormattedMessage\n                        id='intro_messages.group_message'\n                        defaultMessage={'This is the start of your group message history with these teammates. '}\n                    />\n                    {getGMIntroMessageSpecificPart(currentUserProfile, channelMembership)}\n                </p>\n                {actionButtons}\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id={channelIntroId}\n            className={'channel-intro ' + centeredIntro}\n        >\n            <p className='channel-intro__text'>\n                <FormattedMessage\n                    id='intro_messages.group_message'\n                    defaultMessage='This is the start of your group message history with these teammates. Messages and files shared here are not shown to people outside this area.'\n                />\n            </p>\n        </div>\n    );\n}\n\nfunction createDMIntroMessage(\n    channel: Channel,\n    centeredIntro: string,\n    currentUser: UserProfileType,\n    isFavorite: boolean,\n    isMobileView: boolean,\n    toggleFavorite: () => void,\n    teammate?: UserProfileType,\n    teammateName?: string,\n) {\n    const channelIntroId = 'channelIntro';\n    if (teammate) {\n        const src = teammate ? Utils.imageURLForUser(teammate.id, teammate.last_picture_update) : '';\n\n        let pluggableButton = null;\n        let setHeaderButton = null;\n        if (!teammate?.is_bot) {\n            pluggableButton = <PluggableIntroButtons channel={channel}/>;\n            setHeaderButton = createSetHeaderButton(channel);\n        }\n\n        const actionButtons = (\n            <div className='channel-intro__actions'>\n                {createFavoriteButton(isFavorite, toggleFavorite)}\n                {setHeaderButton}\n                {pluggableButton}\n            </div>\n        );\n\n        return (\n            <div\n                id={channelIntroId}\n                className={'channel-intro ' + centeredIntro}\n            >\n                <div className='post-profile-img__container channel-intro-img'>\n                    <ProfilePicture\n                        src={src}\n                        size='xl-custom-DM'\n                        status={teammate.is_bot ? '' : channel.status}\n                        userId={teammate?.id}\n                        username={teammate?.username}\n                    />\n                </div>\n                <h2 className='channel-intro__title'>\n                    <UserProfile\n                        userId={teammate?.id}\n                    />\n                </h2>\n                <p className='channel-intro__text'>\n                    <FormattedMessage\n                        id='intro_messages.DM'\n                        defaultMessage='This is the start of your direct message history with {teammate}. Messages and files shared here are not shown to anyone else.'\n                        values={{\n                            teammate: teammateName,\n                        }}\n                    />\n                </p>\n                {actionButtons}\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id={channelIntroId}\n            className={'channel-intro ' + centeredIntro}\n        >\n            <p className='channel-intro__text'>\n                <FormattedMessage\n                    id='intro_messages.teammate'\n                    defaultMessage='This is the start of your direct message history with this teammate. Messages and files shared here are not shown to anyone else.'\n                />\n            </p>\n        </div>\n    );\n}\n\nfunction createOffTopicIntroMessage(\n    channel: Channel,\n    centeredIntro: string,\n    isFavorite: boolean,\n    isMobileView: boolean,\n    currentUser: UserProfileType,\n    toggleFavorite: () => void,\n    stats: any,\n    usersLimit: number,\n) {\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    const children = createSetHeaderButton(channel);\n    const totalUsers = stats.total_users_count;\n    const inviteUsers = totalUsers < usersLimit;\n\n    let setHeaderButton = null;\n    let actionButtons = null;\n\n    if (children) {\n        setHeaderButton = (\n            <ChannelPermissionGate\n                teamId={channel.team_id}\n                channelId={channel.id}\n                permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n            >\n                {children}\n            </ChannelPermissionGate>\n        );\n    }\n\n    const channelInviteButton = (\n        <AddMembersButton\n            totalUsers={totalUsers}\n            usersLimit={usersLimit}\n            channel={channel}\n            pluginButtons={<PluggableIntroButtons channel={channel}/>}\n        />\n    );\n\n    if (inviteUsers) {\n        actionButtons = (\n            <div className='channel-intro__actions'>\n                {actionButtons = channelInviteButton}\n            </div>\n        );\n    } else {\n        actionButtons = (\n            <div className='channel-intro__actions'>\n                {createFavoriteButton(isFavorite, toggleFavorite)}\n                {setHeaderButton}\n                {createNotificationPreferencesButton(channel, currentUser)}\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id='channelIntro'\n            className={'channel-intro ' + centeredIntro}\n        >\n            <ChannelIntroPublicSvg/>\n            <h2 className='channel-intro__title'>\n                {channel.display_name}\n            </h2>\n            <p className='channel-intro__text'>\n                <FormattedMessage\n                    id='intro_messages.offTopic'\n                    defaultMessage='This is the start of {display_name}, a channel for non-work-related conversations.'\n                    values={{\n                        display_name: channel.display_name,\n                    }}\n                />\n            </p>\n            {actionButtons}\n        </div>\n    );\n}\n\nfunction createDefaultIntroMessage(\n    channel: Channel,\n    centeredIntro: string,\n    currentUser: UserProfileType,\n    isFavorite: boolean,\n    isMobileView: boolean,\n    toggleFavorite: () => void,\n    stats: any,\n    usersLimit: number,\n    enableUserCreation?: boolean,\n    isReadOnly?: boolean,\n    teamIsGroupConstrained?: boolean,\n) {\n    let teamInviteLink = null;\n    const totalUsers = stats.total_users_count;\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    const inviteUsers = totalUsers < usersLimit;\n\n    let setHeaderButton = null;\n    let pluginButtons = null;\n    let actionButtons = null;\n\n    if (!isReadOnly) {\n        pluginButtons = <PluggableIntroButtons channel={channel}/>;\n        const children = createSetHeaderButton(channel);\n        if (children) {\n            setHeaderButton = (\n                <ChannelPermissionGate\n                    teamId={channel.team_id}\n                    channelId={channel.id}\n                    permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n                >\n                    {children}\n                </ChannelPermissionGate>\n            );\n        }\n    }\n\n    if (!isReadOnly && enableUserCreation) {\n        teamInviteLink = (\n            <TeamPermissionGate\n                teamId={channel.team_id}\n                permissions={[Permissions.INVITE_USER]}\n            >\n                <TeamPermissionGate\n                    teamId={channel.team_id}\n                    permissions={[Permissions.ADD_USER_TO_TEAM]}\n                >\n                    {!teamIsGroupConstrained &&\n                        <AddMembersButton\n                            totalUsers={totalUsers}\n                            usersLimit={usersLimit}\n                            channel={channel}\n                            pluginButtons={pluginButtons}\n                        />\n                    }\n                    {teamIsGroupConstrained &&\n                    <ToggleModalButton\n                        className='intro-links color--link'\n                        modalId={ModalIdentifiers.ADD_GROUPS_TO_TEAM}\n                        dialogType={AddGroupsToTeamModal}\n                        dialogProps={{channel}}\n                    >\n                        <i\n                            className='fa fa-user-plus'\n                        />\n                        <FormattedMessage\n                            id='intro_messages.addGroupsToTeam'\n                            defaultMessage='Add other groups to this team'\n                        />\n                    </ToggleModalButton>\n                    }\n                </TeamPermissionGate>\n            </TeamPermissionGate>\n        );\n    }\n\n    if (inviteUsers) {\n        actionButtons = (\n            <div className='channel-intro__actions'>\n                {actionButtons = teamInviteLink}\n            </div>\n        );\n    } else {\n        actionButtons = (\n            <div className='channel-intro__actions'>\n                {createFavoriteButton(isFavorite, toggleFavorite)}\n                {setHeaderButton}\n                {createNotificationPreferencesButton(channel, currentUser)}\n                {teamIsGroupConstrained && pluginButtons}\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id='channelIntro'\n            className={'channel-intro ' + centeredIntro}\n        >\n            <ChannelIntroTownSquareSvg/>\n            <h2 className='channel-intro__title'>\n                {channel.display_name}\n            </h2>\n            <p className='channel-intro__text'>\n                {!isReadOnly &&\n                    <FormattedMessage\n                        id='intro_messages.default'\n                        defaultMessage='Welcome to {display_name}. Post messages here that you want everyone to see. Everyone automatically becomes a member of this channel when they join the team.'\n                        values={{\n                            display_name: channel.display_name,\n                        }}\n                    />\n                }\n                {isReadOnly &&\n                    <FormattedMessage\n                        id='intro_messages.readonly.default'\n                        defaultMessage='Welcome to {display_name}. Messages can only be posted by admins. Everyone automatically becomes a permanent member of this channel when they join the team.'\n                        values={{\n                            display_name: channel.display_name,\n                        }}\n                    />\n                }\n            </p>\n            {actionButtons}\n        </div>\n    );\n}\n\nfunction createStandardIntroMessage(\n    channel: Channel,\n    centeredIntro: string,\n    currentUser: UserProfileType,\n    isFavorite: boolean,\n    isMobileView: boolean,\n    toggleFavorite: () => void,\n    stats: any,\n    usersLimit: number,\n    locale: string,\n    creatorName: string,\n) {\n    const uiName = channel.display_name;\n    let memberMessage;\n    let teamInviteLink = null;\n    const channelIsArchived = channel.delete_at !== 0;\n    const totalUsers = stats.total_users_count;\n    const inviteUsers = totalUsers < usersLimit;\n\n    if (channelIsArchived) {\n        memberMessage = '';\n    } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n        memberMessage = (\n            <FormattedMessage\n                id='intro_messages.onlyInvited'\n                defaultMessage='This is the start of {display_name}. Only invited members can see this private channel.'\n                values={{\n                    display_name: channel.display_name,\n                }}\n            />\n        );\n    } else {\n        memberMessage = (\n            <FormattedMessage\n                id='intro_messages.anyMember'\n                defaultMessage='This is the start of {display_name}. Any team member can join and read this channel.'\n                values={{\n                    display_name: channel.display_name,\n                }}\n            />\n        );\n    }\n\n    const date = (\n        <FormattedDate\n            value={channel.create_at}\n            month={getMonthLong(locale)}\n            day='2-digit'\n            year='numeric'\n        />\n    );\n\n    let createMessage;\n    if (creatorName === '') {\n        if (channel.type === Constants.PRIVATE_CHANNEL) {\n            createMessage = (\n                <FormattedMessage\n                    id='intro_messages.noCreatorPrivate'\n                    defaultMessage='Private channel created on {date}.'\n                    values={{name: (uiName), date}}\n                />\n            );\n        } else if (channel.type === Constants.OPEN_CHANNEL) {\n            createMessage = (\n                <FormattedMessage\n                    id='intro_messages.noCreator'\n                    defaultMessage='Public channel created on {date}.'\n                    values={{name: (uiName), date}}\n                />\n            );\n        }\n    } else if (channel.type === Constants.PRIVATE_CHANNEL) {\n        createMessage = (\n            <span>\n                <FormattedMessage\n                    id='intro_messages.creatorPrivate'\n                    defaultMessage='Private channel created by {creator} on {date}.'\n                    values={{\n                        name: (uiName),\n                        creator: (creatorName),\n                        date,\n                    }}\n                />\n            </span>\n        );\n    } else if (channel.type === Constants.OPEN_CHANNEL) {\n        createMessage = (\n            <span>\n                <FormattedMessage\n                    id='intro_messages.creator'\n                    defaultMessage='Public channel created by {creator} on {date}.'\n                    values={{\n                        name: (uiName),\n                        creator: (creatorName),\n                        date,\n                    }}\n                />\n            </span>\n        );\n    }\n\n    let purposeMessage;\n    if (channel.purpose && channel.purpose !== '') {\n        purposeMessage = (\n            <span>\n                <FormattedMessage\n                    id='intro_messages.purpose'\n                    defaultMessage=\" This channel's purpose is: {purpose}\"\n                    values={{purpose: channel.purpose}}\n                />\n            </span>\n        );\n    }\n\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    let setHeaderButton = null;\n    let actionButtons = null;\n    const children = createSetHeaderButton(channel);\n    if (children) {\n        setHeaderButton = (\n            <ChannelPermissionGate\n                teamId={channel.team_id}\n                channelId={channel.id}\n                permissions={[isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES]}\n            >\n                {children}\n            </ChannelPermissionGate>\n        );\n    }\n\n    teamInviteLink = (\n        <AddMembersButton\n            totalUsers={totalUsers}\n            usersLimit={usersLimit}\n            channel={channel}\n            pluginButtons={<PluggableIntroButtons channel={channel}/>}\n        />\n    );\n\n    if (inviteUsers) {\n        actionButtons = (\n            <div className='channel-intro__actions'>\n                {actionButtons = teamInviteLink}\n            </div>\n        );\n    } else {\n        actionButtons = (\n            <div className='channel-intro__actions'>\n                {createFavoriteButton(isFavorite, toggleFavorite)}\n                {teamInviteLink}\n                {setHeaderButton}\n                {!isMobileView && createNotificationPreferencesButton(channel, currentUser)}\n                <PluggableIntroButtons channel={channel}/>\n            </div>\n        );\n    }\n\n    return (\n        <div\n            id='channelIntro'\n            className={'channel-intro ' + centeredIntro}\n        >\n            {isPrivate ? <ChannelIntroPrivateSvg/> : <ChannelIntroPublicSvg/>}\n            <h2 className='channel-intro__title'>\n                {channel.display_name}\n            </h2>\n            <div className='channel-intro__created'>\n                {isPrivate ? <LockOutlineIcon size={14}/> : <GlobeIcon size={14}/>}\n                {createMessage}\n            </div>\n            <p className='channel-intro__text'>\n                {memberMessage}\n                {purposeMessage}\n            </p>\n            {actionButtons}\n        </div>\n    );\n}\n\nfunction createSetHeaderButton(channel: Channel) {\n    const channelIsArchived = channel.delete_at !== 0;\n    if (channelIsArchived) {\n        return null;\n    }\n\n    return (\n        <ToggleModalButton\n            modalId={ModalIdentifiers.EDIT_CHANNEL_HEADER}\n            ariaLabel={Utils.localizeMessage({id: 'intro_messages.setHeader', defaultMessage: 'Set header'})}\n            className={'action-button'}\n            dialogType={EditChannelHeaderModal}\n            dialogProps={{channel}}\n        >\n            <PencilOutlineIcon\n                size={24}\n            />\n            <FormattedMessage\n                id='intro_messages.setHeader'\n                defaultMessage='Set header'\n            />\n        </ToggleModalButton>\n    );\n}\n\nfunction createFavoriteButton(isFavorite: boolean, toggleFavorite: () => void, classes?: string) {\n    let favoriteText;\n    if (isFavorite) {\n        favoriteText = (\n            <FormattedMessage\n                id='channel_info_rhs.top_buttons.favorited'\n                defaultMessage='Favorited'\n            />);\n    } else {\n        favoriteText = (\n            <FormattedMessage\n                id='channel_info_rhs.top_buttons.favorite'\n                defaultMessage='Favorite'\n            />);\n    }\n    return (\n        <button\n            id='toggleFavoriteIntroButton'\n            className={`action-button ${isFavorite ? 'active' : ''}  ${classes}`}\n            onClick={toggleFavorite}\n            aria-label={'Favorite'}\n        >\n            {isFavorite ? <StarIcon size={24}/> : <StarOutlineIcon size={24}/>}\n            {favoriteText}\n        </button>\n    );\n}\n\nfunction createNotificationPreferencesButton(channel: Channel, currentUser: UserProfileType) {\n    return (\n        <ToggleModalButton\n            modalId={ModalIdentifiers.CHANNEL_NOTIFICATIONS}\n            ariaLabel={Utils.localizeMessage({id: 'intro_messages.notificationPreferences', defaultMessage: 'Notification Preferences'})}\n            className={'action-button'}\n            dialogType={ChannelNotificationsModal}\n            dialogProps={{channel, currentUser}}\n        >\n            <BellRingOutlineIcon size={24}/>\n            <FormattedMessage\n                id='intro_messages.notificationPreferences'\n                defaultMessage='Notifications'\n            />\n        </ToggleModalButton>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {favoriteChannel, unfavoriteChannel} from 'mattermost-redux/actions/channels';\nimport {getTotalUsersStats} from 'mattermost-redux/actions/users';\nimport {getCurrentChannel, getDirectTeammate, getMyCurrentChannelMembership, isCurrentChannelFavorite} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {get} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser, getProfilesInCurrentChannel, getCurrentUserId, getUser, getTotalUsersStats as getTotalUsersStatsSelector} from 'mattermost-redux/selectors/entities/users';\n\nimport {getCurrentLocale} from 'selectors/i18n';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {Preferences} from 'utils/constants';\nimport {getDisplayNameByUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelIntroMessage from './channel_intro_message';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const enableUserCreation = config.EnableUserCreation === 'true';\n    const isReadOnly = false;\n    const team = getCurrentTeam(state);\n    const channel = getCurrentChannel(state);\n    const channelMember = getMyCurrentChannelMembership(state);\n    const teammate = channel ? getDirectTeammate(state, channel.id) : undefined;\n    const currentUser = getCurrentUser(state);\n    const creator = channel ? getUser(state, channel.creator_id) : undefined;\n\n    const usersLimit = 10;\n\n    const stats = getTotalUsersStatsSelector(state) || {total_users_count: 0};\n\n    return {\n        currentUserId: getCurrentUserId(state),\n        channel,\n        fullWidth: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN,\n        locale: getCurrentLocale(state),\n        channelProfiles: getProfilesInCurrentChannel(state),\n        enableUserCreation,\n        isReadOnly,\n        isFavorite: isCurrentChannelFavorite(state),\n        teamIsGroupConstrained: Boolean(team?.group_constrained),\n        creatorName: getDisplayNameByUser(state, creator),\n        teammate,\n        teammateName: getDisplayNameByUser(state, teammate),\n        currentUser,\n        stats,\n        usersLimit,\n        channelMember,\n        isMobileView: getIsMobileView(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getTotalUsersStats,\n            favoriteChannel,\n            unfavoriteChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelIntroMessage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {CloudUsage, Limits} from '@mattermost/types/cloud';\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport * as PostListUtils from 'mattermost-redux/utils/post_list';\n\nimport type {emitShortcutReactToLastPostFrom} from 'actions/post_actions';\n\nimport CenterMessageLock from 'components/center_message_lock';\nimport PostComponent from 'components/post';\nimport ChannelIntroMessage from 'components/post_view/channel_intro_message/';\nimport CombinedUserActivityPost from 'components/post_view/combined_user_activity_post';\nimport DateSeparator from 'components/post_view/date_separator';\nimport NewMessageSeparator from 'components/post_view/new_message_separator/new_message_separator';\n\nimport {PostListRowListIds, Locations} from 'utils/constants';\nimport {isIdNotPost} from 'utils/post_utils';\n\nimport type {PluginComponent} from 'types/store/plugins';\n\nexport type PostListRowProps = {\n    listId: string;\n    previousListId?: string;\n    fullWidth?: boolean;\n    shouldHighlight?: boolean;\n    loadOlderPosts: () => void;\n    loadNewerPosts: () => void;\n    togglePostMenu: (opened: boolean) => void;\n    post: Post;\n    currentUserId: UserProfile['id'];\n\n    /**\n     * To Check if the current post is last in the list\n     */\n    isLastPost: boolean;\n\n    /**\n     * To check if the state of emoji for last message and from where it was emitted\n     */\n    shortcutReactToLastPostEmittedFrom: string;\n\n    /**\n     * is used for hiding animation of loader\n     */\n    loadingNewerPosts: boolean;\n    loadingOlderPosts: boolean;\n\n    usage: CloudUsage;\n    limits: Limits;\n    limitsLoaded: boolean;\n    exceededLimitChannelId?: string;\n    firstInaccessiblePostTime?: number;\n    channelId: string;\n\n    newMessagesSeparatorActions: PluginComponent[];\n\n    actions: {\n\n        /**\n          * Function to set or unset emoji picker for last message\n          */\n        emitShortcutReactToLastPostFrom: typeof emitShortcutReactToLastPostFrom;\n    };\n}\n\nexport default class PostListRow extends React.PureComponent<PostListRowProps> {\n    blockShortcutReactToLastPostForNonMessages(listId: string) {\n        const {actions: {emitShortcutReactToLastPostFrom}} = this.props;\n\n        if (isIdNotPost(listId)) {\n            // This is a good escape hatch as any of the above conditions don't return <Post/> component, Emoji picker is only at Post component\n            emitShortcutReactToLastPostFrom(Locations.NO_WHERE);\n        }\n    }\n\n    componentDidUpdate(prevProps: PostListRowProps) {\n        const {listId, isLastPost, shortcutReactToLastPostEmittedFrom} = this.props;\n\n        const shortcutReactToLastPostEmittedFromCenter = prevProps.shortcutReactToLastPostEmittedFrom !== shortcutReactToLastPostEmittedFrom &&\n            shortcutReactToLastPostEmittedFrom === Locations.CENTER;\n\n        // If last post is not a message then we block the shortcut to react to last message, early on\n        if (isLastPost && shortcutReactToLastPostEmittedFromCenter) {\n            this.blockShortcutReactToLastPostForNonMessages(listId);\n        }\n    }\n\n    render() {\n        const {listId, previousListId, loadingOlderPosts, loadingNewerPosts} = this.props;\n        const {\n            OLDER_MESSAGES_LOADER,\n            NEWER_MESSAGES_LOADER,\n            CHANNEL_INTRO_MESSAGE,\n            LOAD_OLDER_MESSAGES_TRIGGER,\n            LOAD_NEWER_MESSAGES_TRIGGER,\n        } = PostListRowListIds;\n\n        if (PostListUtils.isDateLine(listId)) {\n            const date = PostListUtils.getDateForDateLine(listId);\n\n            return (\n                <DateSeparator\n                    key={date}\n                    date={date}\n                />\n            );\n        }\n\n        if (PostListUtils.isStartOfNewMessages(listId)) {\n            return (\n                <NewMessageSeparator\n                    separatorId={listId}\n                    newMessagesSeparatorActions={this.props.newMessagesSeparatorActions}\n                    channelId={this.props.channelId}\n                />\n            );\n        }\n\n        if (this.props.exceededLimitChannelId) {\n            return (\n                <CenterMessageLock\n                    channelId={this.props.exceededLimitChannelId}\n                    firstInaccessiblePostTime={this.props.firstInaccessiblePostTime}\n                />\n            );\n        }\n\n        if (listId === CHANNEL_INTRO_MESSAGE) {\n            return (\n                <ChannelIntroMessage/>\n            );\n        }\n\n        if (listId === LOAD_OLDER_MESSAGES_TRIGGER || listId === LOAD_NEWER_MESSAGES_TRIGGER) {\n            return (\n                <button\n                    className='more-messages-text theme style--none color--link'\n                    onClick={listId === LOAD_OLDER_MESSAGES_TRIGGER ? this.props.loadOlderPosts : this.props.loadNewerPosts}\n                >\n                    <FormattedMessage\n                        id='posts_view.loadMore'\n                        defaultMessage='Load More Messages'\n                    />\n                </button>\n            );\n        }\n\n        const isOlderMessagesLoader = listId === OLDER_MESSAGES_LOADER;\n        const isNewerMessagesLoader = listId === NEWER_MESSAGES_LOADER;\n        if (isOlderMessagesLoader || isNewerMessagesLoader) {\n            const shouldHideAnimation = !loadingOlderPosts && !loadingNewerPosts;\n\n            return (\n                <div\n                    className='loading-screen'\n                >\n                    <div className={classNames('loading__content', {hideAnimation: shouldHideAnimation})}>\n                        <div className='round round-1'/>\n                        <div className='round round-2'/>\n                        <div className='round round-3'/>\n                    </div>\n                </div>\n            );\n        }\n\n        const postProps = {\n            previousPostId: previousListId,\n            shouldHighlight: Boolean(this.props.shouldHighlight),\n            togglePostMenu: this.props.togglePostMenu,\n            isLastPost: this.props.isLastPost,\n        };\n\n        if (PostListUtils.isCombinedUserActivityPost(listId)) {\n            return (\n                <CombinedUserActivityPost\n                    location={Locations.CENTER}\n                    combinedId={listId}\n                    {...postProps}\n                />\n            );\n        }\n\n        return (\n            <PostComponent\n                post={this.props.post}\n                location={Locations.CENTER}\n                {...postProps}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getCloudLimits, getCloudLimitsLoaded} from 'mattermost-redux/selectors/entities/cloud';\nimport {getCurrentChannelId, getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getLimitedViews, getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getUsage} from 'mattermost-redux/selectors/entities/usage';\n\nimport {emitShortcutReactToLastPostFrom} from 'actions/post_actions';\nimport {getShortcutReactToLastPostEmittedFrom} from 'selectors/emojis';\n\nimport {PostListRowListIds} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostListRow from './post_list_row';\nimport type {PostListRowProps} from './post_list_row';\n\ntype OwnProps = Pick<PostListRowProps, 'listId'>\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const shortcutReactToLastPostEmittedFrom = getShortcutReactToLastPostEmittedFrom(state);\n    const usage = getUsage(state);\n    const limits = getCloudLimits(state);\n    const limitsLoaded = getCloudLimitsLoaded(state);\n    const post = getPost(state, ownProps.listId);\n    const currentUserId = getCurrentUserId(state);\n    const newMessagesSeparatorActions = state.plugins.components.NewMessagesSeparatorAction;\n\n    const props: Pick<\n    PostListRowProps,\n    'shortcutReactToLastPostEmittedFrom' | 'usage' | 'limits' | 'limitsLoaded' | 'exceededLimitChannelId' | 'firstInaccessiblePostTime' | 'post' | 'currentUserId' | 'newMessagesSeparatorActions'\n    > = {\n        shortcutReactToLastPostEmittedFrom,\n        usage,\n        limits,\n        limitsLoaded,\n        post,\n        currentUserId,\n        newMessagesSeparatorActions,\n    };\n    if ((ownProps.listId === PostListRowListIds.OLDER_MESSAGES_LOADER || ownProps.listId === PostListRowListIds.CHANNEL_INTRO_MESSAGE) && limitsLoaded) {\n        const currentChannelId = getCurrentChannelId(state);\n        const firstInaccessiblePostTime = getLimitedViews(state).channels[currentChannelId];\n        const channelLimitExceeded = Boolean(firstInaccessiblePostTime) || firstInaccessiblePostTime === 0;\n        if (channelLimitExceeded) {\n            props.exceededLimitChannelId = currentChannelId;\n            props.firstInaccessiblePostTime = firstInaccessiblePostTime;\n        }\n    }\n    return props;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            emitShortcutReactToLastPostFrom,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PostListRow);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function ScrollToBottomIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                x='0px'\n                y='0px'\n                viewBox='-239 239 21 23'\n                enableBackground='new -239 239 21 23'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.arrow.down', defaultMessage: 'Down Arrow Icon'})}\n            >\n                <path d='M-239,241.4l2.4-2.4l8.1,8.2l8.1-8.2l2.4,2.4l-10.5,10.6L-239,241.4z M-228.5,257.2l8.1-8.2l2.4,2.4l-10.5,10.6l-10.5-10.6 l2.4-2.4L-228.5,257.2z'/>\n            </svg>\n        </span>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport ScrollToBottomIcon from 'components/widgets/icons/scroll_to_bottom_icon';\n\ntype Props = {\n    isScrolling: boolean;\n    atBottom?: boolean;\n    onClick: () => void;\n};\n\nconst ScrollToBottomArrows = ({isScrolling, atBottom, onClick}: Props) => {\n    // only show on mobile\n    if (window.innerWidth > 768) {\n        return null;\n    }\n\n    return (\n        <div\n            className={classNames('post-list__arrows', {\n                scrolling: isScrolling && atBottom === false,\n            })}\n            onClick={onClick}\n        >\n            <ScrollToBottomIcon/>\n        </div>\n    );\n};\n\nexport default ScrollToBottomArrows;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport CloseIcon from 'components/widgets/icons/close_icon';\n\nimport './hint_toast.scss';\n\nexport const HINT_TOAST_TESTID = 'hint-toast';\n\ntype Props = {\n    children: React.ReactNode;\n    onDismiss: () => void;\n}\n\nexport const HintToast: React.FC<Props> = ({children, onDismiss}: Props) => {\n    const handleDismiss = () => {\n        if (typeof onDismiss === 'function') {\n            onDismiss();\n        }\n    };\n\n    return (\n        <div\n            data-testid={HINT_TOAST_TESTID}\n            className='hint-toast'\n        >\n            <div\n                className='hint-toast__message'\n            >\n                {children}\n            </div>\n            <div\n                className='hint-toast__dismiss'\n                onClick={handleDismiss}\n                data-testid='dismissHintToast'\n            >\n                <CloseIcon\n                    className='close-btn'\n                    id='dismissHintToast'\n                />\n            </div>\n        </div>\n    );\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport CloseIcon from 'components/widgets/icons/close_icon';\nimport UnreadBelowIcon from 'components/widgets/icons/unread_below_icon';\n\nimport './scroll_to_bottom_toast.scss';\n\nexport const SCROLL_TO_BOTTOM_TOAST_TESTID = 'scroll-to-bottom-toast';\nexport const SCROLL_TO_BOTTOM_DISMISS_BUTTON_TESTID = 'scroll-to-bottom-toast--dismiss-button';\n\ntype ScrollToBottomToastProps = {\n    onDismiss: () => void;\n    onClick: () => void;\n}\n\nexport const ScrollToBottomToast = ({onDismiss, onClick}: ScrollToBottomToastProps) => {\n    const {formatMessage} = useIntl();\n\n    const jumpToRecentsMessage = formatMessage({\n        id: 'postlist.toast.scrollToBottom',\n        defaultMessage: 'Jump to recents',\n    });\n\n    const handleScrollToBottom: React.MouseEventHandler<HTMLDivElement> = (e) => {\n        e.preventDefault();\n        onClick();\n    };\n\n    const handleDismiss: React.MouseEventHandler<HTMLDivElement> = (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        onDismiss();\n    };\n\n    return (\n        <div\n            data-testid={SCROLL_TO_BOTTOM_TOAST_TESTID}\n            className='scroll-to-bottom-toast btn btn-primary'\n            onClick={handleScrollToBottom}\n        >\n            <UnreadBelowIcon/>\n            {jumpToRecentsMessage}\n            <div\n                className='scroll-to-bottom-toast__dismiss'\n                onClick={handleDismiss}\n                data-testid={SCROLL_TO_BOTTOM_DISMISS_BUTTON_TESTID}\n            >\n                <CloseIcon\n                    className='close-btn'\n                    id='dismissScrollToBottomToast'\n                />\n            </div>\n        </div>\n    );\n};\n\nexport default ScrollToBottomToast;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport ScrollToBottomToast from './scroll_to_bottom_toast';\n\nexport default ScrollToBottomToast;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {IntlShape, WrappedComponentProps} from 'react-intl';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getNewMessagesIndex} from 'mattermost-redux/utils/post_list';\n\nimport {HintToast} from 'components/hint-toast/hint_toast';\nimport ScrollToBottomToast from 'components/scroll_to_bottom_toast';\nimport {SearchShortcut} from 'components/search_shortcut';\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport Toast from 'components/toast/toast';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\nimport {isToday} from 'utils/datetime';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {isIdNotPost} from 'utils/post_utils';\n\nimport './toast__wrapper.scss';\n\nconst TOAST_TEXT_COLLAPSE_WIDTH = 500;\n\nconst TOAST_REL_RANGES = [\n    RelativeRanges.TODAY_YESTERDAY,\n];\n\nexport type Props = WrappedComponentProps & RouteComponentProps<{team: string}> & {\n    channelMarkedAsUnread?: boolean;\n    postListIds: string[];\n    latestPostTimeStamp?: number;\n    atBottom: boolean | null;\n    lastViewedBottom: number;\n    width: number;\n    focusedPostId?: string;\n    initScrollOffsetFromBottom: number;\n    updateNewMessagesAtInChannel: (lastViewedAt?: number) => void;\n    scrollToNewMessage: () => void;\n    scrollToLatestMessages: () => void;\n    scrollToUnreadMessages: () => void;\n    updateLastViewedBottomAt: (lastViewedBottom?: number) => void;\n    showSearchHintToast: boolean;\n    onSearchHintDismiss: () => void;\n    showScrollToBottomToast: boolean;\n    onScrollToBottomToastDismiss: () => void;\n    hideScrollToBottomToast: () => void;\n    shouldStartFromBottomWhenUnread: boolean;\n    isNewMessageLineReached: boolean;\n    rootPosts: Record<string, boolean>;\n    lastViewedAt: number;\n    newRecentMessagesCount: number;\n    unreadScrollPosition: string;\n    isCollapsedThreadsEnabled: boolean;\n    unreadCountInChannel: number;\n    atLatestPost?: boolean;\n    channelId: string;\n    intl: IntlShape;\n    actions: {\n        updateToastStatus: (status: boolean) => void;\n    };\n};\n\ntype State = {\n    unreadCount: number;\n    unreadCountInChannel: number;\n    channelMarkedAsUnread?: boolean;\n    lastViewedAt?: number;\n    showUnreadToast?: boolean;\n    showNewMessagesToast?: boolean;\n    showMessageHistoryToast?: boolean;\n    showUnreadWithBottomStartToast?: boolean;\n    showScrollToBottomToast?: boolean;\n};\n\nexport class ToastWrapperClass extends React.PureComponent<Props, State> {\n    mounted?: boolean;\n    static defaultProps = {\n        focusedPostId: '',\n    };\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            unreadCountInChannel: props.unreadCountInChannel,\n            unreadCount: 0,\n        };\n    }\n\n    static countNewMessages = (rootPosts: Record<string, boolean>, isCollapsedThreadsEnabled: boolean, postListIds: string[] = []) => {\n        const mark = getNewMessagesIndex(postListIds);\n        if (mark <= 0) {\n            return 0;\n        }\n        let newMessages = postListIds.slice(0, mark).filter((id) => !isIdNotPost(id));\n        if (isCollapsedThreadsEnabled) { // in collapsed mode we only count root posts\n            newMessages = newMessages.filter((id) => rootPosts[id]);\n        }\n        return newMessages.length;\n    };\n\n    static getDerivedStateFromProps(props: Props, prevState: State) {\n        let {showUnreadToast, showNewMessagesToast, showMessageHistoryToast, showUnreadWithBottomStartToast} = prevState;\n        let unreadCount;\n\n        if (props.atLatestPost) {\n            if (props.unreadScrollPosition === Preferences.UNREAD_SCROLL_POSITION_START_FROM_NEWEST && prevState.unreadCountInChannel) {\n                unreadCount = prevState.unreadCountInChannel + props.newRecentMessagesCount;\n            } else {\n                unreadCount = ToastWrapperClass.countNewMessages(props.rootPosts, props.isCollapsedThreadsEnabled, props.postListIds);\n            }\n        } else if (props.channelMarkedAsUnread) {\n            if (props.unreadScrollPosition === Preferences.UNREAD_SCROLL_POSITION_START_FROM_NEWEST) {\n                unreadCount = props.unreadCountInChannel + props.newRecentMessagesCount;\n            } else {\n                unreadCount = prevState.unreadCountInChannel;\n            }\n        } else {\n            unreadCount = prevState.unreadCountInChannel + props.newRecentMessagesCount;\n        }\n\n        // show unread toast on mount when channel is not at bottom and unread count greater than 0\n        if (typeof showUnreadToast === 'undefined' && props.atBottom !== null) {\n            showUnreadToast = unreadCount > 0 && !props.atBottom;\n        }\n\n        if (typeof showMessageHistoryToast === 'undefined' && props.focusedPostId !== '' && props.atBottom !== null) {\n            showMessageHistoryToast = props.initScrollOffsetFromBottom > 1000 || !props.atLatestPost;\n        }\n\n        // show unread toast when a channel is marked as unread\n        if (props.channelMarkedAsUnread && (props.atBottom === false) && !prevState.channelMarkedAsUnread && !prevState.showUnreadToast) {\n            showUnreadToast = true;\n        }\n\n        // show unread toast when a channel is remarked as unread using the change in lastViewedAt\n        // lastViewedAt changes only if a channel is remarked as unread in channelMarkedAsUnread state\n        if (props.channelMarkedAsUnread && props.lastViewedAt !== prevState.lastViewedAt && (props.atBottom === false)) {\n            showUnreadToast = true;\n        }\n\n        if (!showUnreadToast && unreadCount > 0 && (props.atBottom === false) && props.latestPostTimeStamp && (props.lastViewedBottom < props.latestPostTimeStamp)) {\n            showNewMessagesToast = true;\n        }\n\n        if (props.unreadScrollPosition === Preferences.UNREAD_SCROLL_POSITION_START_FROM_NEWEST && !props.channelMarkedAsUnread) {\n            showUnreadToast = false;\n        }\n\n        if (!unreadCount) {\n            showUnreadToast = false;\n            showNewMessagesToast = false;\n        }\n\n        if (props.isNewMessageLineReached) {\n            showUnreadWithBottomStartToast = false;\n        }\n\n        if (\n            typeof showUnreadWithBottomStartToast === 'undefined' &&\n            props.lastViewedAt &&\n            props.lastViewedAt !== prevState.lastViewedAt &&\n            props.shouldStartFromBottomWhenUnread &&\n            unreadCount > 0 &&\n            !props.isNewMessageLineReached\n        ) {\n            showUnreadWithBottomStartToast = true;\n        }\n\n        return {\n            unreadCount,\n            showUnreadToast,\n            showNewMessagesToast,\n            showUnreadWithBottomStartToast,\n            lastViewedAt: props.lastViewedAt,\n            atBottom: props.atBottom,\n            channelMarkedAsUnread: props.channelMarkedAsUnread,\n            showMessageHistoryToast,\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        const {showUnreadToast, showNewMessagesToast, showMessageHistoryToast, showUnreadWithBottomStartToast} = this.state;\n        const toastPresent = Boolean(showUnreadToast || showNewMessagesToast || showMessageHistoryToast || showUnreadWithBottomStartToast);\n        document.addEventListener('keydown', this.handleShortcut);\n        this.props.actions.updateToastStatus(toastPresent);\n    }\n\n    componentDidUpdate(prevProps: Props, prevState: State) {\n        const {showUnreadToast, showNewMessagesToast, showMessageHistoryToast, showUnreadWithBottomStartToast} = this.state;\n        const {\n            atBottom,\n            atLatestPost,\n            postListIds,\n            lastViewedBottom,\n            updateNewMessagesAtInChannel,\n            actions,\n        } = this.props;\n\n        if (!prevProps.atBottom && atBottom && atLatestPost) {\n            this.hideNewMessagesToast(false);\n            this.hideUnreadToast();\n            this.hideArchiveToast();\n        }\n\n        const prevPostsCount = prevProps.postListIds.length;\n        const presentPostsCount = postListIds.length;\n        const postsAddedAtBottom = presentPostsCount !== prevPostsCount && postListIds[0] !== prevProps.postListIds[0];\n        const notBottomWithLatestPosts = atBottom === false && atLatestPost && presentPostsCount > 0;\n\n        //Marking existing messages as read based on last time user reached to the bottom\n        //This moves the new message indicator to the latest posts and keeping in sync with the toast count\n        if (postsAddedAtBottom && notBottomWithLatestPosts && !showUnreadToast) {\n            updateNewMessagesAtInChannel(lastViewedBottom);\n        }\n\n        const toastStateChanged = prevState.showUnreadToast !== showUnreadToast ||\n                                  prevState.showNewMessagesToast !== showNewMessagesToast ||\n                                  prevState.showMessageHistoryToast !== showMessageHistoryToast ||\n                                  prevState.showUnreadWithBottomStartToast !== showUnreadWithBottomStartToast;\n\n        if (toastStateChanged) {\n            const toastPresent = Boolean(showUnreadToast || showNewMessagesToast || showMessageHistoryToast || showUnreadWithBottomStartToast);\n            actions.updateToastStatus(toastPresent);\n        }\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleShortcut);\n    }\n\n    handleShortcut = (e: KeyboardEvent) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ESCAPE)) {\n            if (this.state.showUnreadToast) {\n                this.hideUnreadToast();\n            } else if (this.state.showNewMessagesToast) {\n                this.hideNewMessagesToast();\n            } else if (this.state.showUnreadWithBottomStartToast) {\n                this.hideUnreadWithBottomStartToast();\n            } else {\n                this.hideArchiveToast();\n            }\n        }\n    };\n\n    hideUnreadToast = () => {\n        if (this.state.showUnreadToast) {\n            this.setState({\n                showUnreadToast: false,\n            });\n        }\n    };\n\n    hideArchiveToast = () => {\n        if (this.state.showMessageHistoryToast) {\n            this.setState({\n                showMessageHistoryToast: false,\n            });\n        }\n    };\n\n    hideNewMessagesToast = (updateLastViewedBottomAt = true) => {\n        if (this.state.showNewMessagesToast) {\n            this.setState({\n                showNewMessagesToast: false,\n            });\n            if (updateLastViewedBottomAt) {\n                this.props.updateLastViewedBottomAt();\n            }\n        }\n    };\n\n    hideSearchHintToast = () => {\n        if (this.props.onSearchHintDismiss) {\n            this.props.onSearchHintDismiss();\n        }\n    };\n\n    hideUnreadWithBottomStartToast = () => {\n        if (this.state.showUnreadWithBottomStartToast) {\n            this.setState({\n                showUnreadWithBottomStartToast: false,\n            });\n        }\n    };\n\n    newMessagesToastText = (count: number | undefined, since: number) => {\n        if (this.props.width > TOAST_TEXT_COLLAPSE_WIDTH && typeof since !== 'undefined') {\n            return (\n                <FormattedMessage\n                    id='postlist.toast.newMessagesSince'\n                    defaultMessage='{count, number} new {count, plural, one {message} other {messages}} {isToday, select, true {} other {since}} {date}'\n                    values={{\n                        count,\n                        isToday: isToday(new Date(since)).toString(),\n                        date: (\n                            <Timestamp\n                                value={since}\n                                useTime={false}\n                                ranges={TOAST_REL_RANGES}\n                            />\n                        ),\n                    }}\n                />\n            );\n        }\n        return (\n            <FormattedMessage\n                id='postlist.toast.newMessages'\n                defaultMessage={'{count, number} new {count, plural, one {message} other {messages}}'}\n                values={{count}}\n            />\n        );\n    };\n\n    archiveToastText = () => {\n        return (\n            <FormattedMessage\n                id='postlist.toast.history'\n                defaultMessage='Viewing message history'\n            />\n        );\n    };\n\n    getSearchHintToastText = () => {\n        return (\n            <FormattedMessage\n                id='postlist.toast.searchHint'\n                defaultMessage='Tip: Try {searchShortcut} to search this channel'\n                values={{\n                    searchShortcut: <SearchShortcut/>,\n                }}\n            />\n        );\n    };\n\n    changeUrlToRemountChannelView = () => {\n        const {match} = this.props;\n\n        // Inorder of mount the channel view we are redirecting to /team url to load the channel again\n        // Todo: Can be changed to dispatch if we put focussedPostId in redux state.\n        getHistory().replace(`/${match.params.team}`);\n    };\n\n    scrollToNewMessage = () => {\n        const {focusedPostId, atLatestPost, scrollToNewMessage, updateLastViewedBottomAt} = this.props;\n\n        // if latest set of posts are not loaded in the view then we cannot scroll to the message\n        // We will be chaging the url to remount the channel view so we can remove the focussedPostId react state\n        // if we don't remove the focussedPostId state then scroll tries to correct to that instead of new message line\n        if (focusedPostId && !atLatestPost) {\n            this.changeUrlToRemountChannelView();\n            return;\n        }\n\n        scrollToNewMessage();\n        updateLastViewedBottomAt();\n        this.hideNewMessagesToast();\n    };\n\n    scrollToLatestMessages = () => {\n        const {focusedPostId, atLatestPost, scrollToLatestMessages} = this.props;\n\n        if (focusedPostId) {\n            if (!atLatestPost) {\n                this.changeUrlToRemountChannelView();\n                return;\n            }\n            this.hideArchiveToast();\n        }\n\n        scrollToLatestMessages();\n        this.hideUnreadToast();\n        this.props.hideScrollToBottomToast?.();\n    };\n\n    scrollToUnreadMessages = () => {\n        this.props.scrollToUnreadMessages();\n        this.hideUnreadWithBottomStartToast();\n    };\n\n    getToastToRender() {\n        const {atLatestPost, atBottom, width, lastViewedAt, showSearchHintToast, showScrollToBottomToast} = this.props;\n        const {showUnreadToast, showNewMessagesToast, showMessageHistoryToast, showUnreadWithBottomStartToast, unreadCount} = this.state;\n\n        const unreadToastProps = {\n            show: true,\n            width,\n            onDismiss: this.hideUnreadToast,\n            onClick: this.scrollToLatestMessages,\n            onClickMessage: (\n                <FormattedMessage\n                    id='postlist.toast.scrollToBottom'\n                    defaultMessage='Jump to recents'\n                />\n            ),\n            showActions: !atLatestPost || (atLatestPost && (atBottom === false)),\n        };\n\n        if (showUnreadToast && unreadCount > 0) {\n            return (\n                <Toast {...unreadToastProps}>\n                    {this.newMessagesToastText(unreadCount, lastViewedAt)}\n                </Toast>\n            );\n        }\n\n        const unreadWithBottomStartToastProps = {\n            show: true,\n            width,\n            onDismiss: this.hideUnreadWithBottomStartToast,\n            onClick: this.scrollToUnreadMessages,\n            onClickMessage: (\n                <FormattedMessage\n                    id='postlist.toast.scrollToUnread'\n                    defaultMessage='Jump to unreads'\n                />\n            ),\n            showActions: true,\n            jumpDirection: 'up' as const,\n        };\n\n        if (showUnreadWithBottomStartToast && unreadCount > 0) {\n            return (\n                <Toast {...unreadWithBottomStartToastProps}>\n                    {this.newMessagesToastText(unreadCount, lastViewedAt)}\n                </Toast>\n            );\n        }\n\n        if (showNewMessagesToast) {\n            const showNewMessagesToastOverrides = {\n                onDismiss: this.hideNewMessagesToast,\n                onClick: this.scrollToNewMessage,\n                onClickMessage: (\n                    <FormattedMessage\n                        id='postlist.toast.scrollToLatest'\n                        defaultMessage='Jump to new messages'\n                    />\n                ),\n            };\n\n            return (\n                <Toast\n                    {...unreadToastProps}\n                    {...showNewMessagesToastOverrides}\n                >\n                    {this.newMessagesToastText(unreadCount, lastViewedAt)}\n                </Toast>\n            );\n        }\n\n        if (showMessageHistoryToast) {\n            const archiveToastProps = {\n                show: true,\n                width,\n                onDismiss: this.hideArchiveToast,\n                onClick: this.scrollToLatestMessages,\n                onClickMessage: (\n                    <FormattedMessage\n                        id='postlist.toast.scrollToBottom'\n                        defaultMessage='Jump to recents'\n                    />\n                ),\n                showActions: true,\n                extraClasses: 'toast__history',\n            };\n\n            return (\n                <Toast {...archiveToastProps}>\n                    {this.archiveToastText()}\n                </Toast>\n            );\n        }\n\n        const toasts = [];\n        if (showScrollToBottomToast) {\n            toasts.push(\n                <ScrollToBottomToast\n                    key='scroll-to-bottom-toast'\n                    onClick={this.scrollToLatestMessages}\n                    onDismiss={this.props.onScrollToBottomToastDismiss}\n                />,\n            );\n        }\n\n        if (showSearchHintToast) {\n            toasts.push(\n                <HintToast\n                    key='search-hint-toast'\n                    onDismiss={this.hideSearchHintToast}\n                >\n                    {this.getSearchHintToastText()}\n                </HintToast>,\n            );\n        }\n\n        if (toasts.length > 0) {\n            return (\n                <div className='toasts-wrapper'>\n                    {toasts}\n                </div>\n            );\n        }\n\n        return null;\n    }\n\n    render() {\n        const toastToRender = this.getToastToRender();\n\n        return (\n            <>\n                {toastToRender}\n            </>\n        );\n    }\n}\n\nexport default injectIntl(ToastWrapperClass);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {Posts} from 'mattermost-redux/constants';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getCurrentChannel, countCurrentChannelUnreadMessages, isManuallyUnread} from 'mattermost-redux/selectors/entities/channels';\nimport {getAllPosts, getPostIdsInChannel} from 'mattermost-redux/selectors/entities/posts';\nimport {getUnreadScrollPositionPreference, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {makePreparePostIdsForPostList} from 'mattermost-redux/utils/post_list';\n\nimport {updateToastStatus} from 'actions/views/channel';\n\nimport type {GlobalState} from 'types/store/index';\n\nimport ToastWrapper from './toast_wrapper';\n\ninterface OwnProps {\n    atLatestPost?: boolean;\n    channelId: string;\n}\n\nexport function makeGetRootPosts() {\n    return createSelector(\n        'makeGetRootPosts',\n        getAllPosts,\n        getCurrentUserId,\n        getCurrentChannel,\n        (allPosts, currentUserId, channel) => {\n            // Count the number of new posts that haven't been deleted and are root posts\n            return Object.values(allPosts).filter((post) => {\n                return (\n                    post.root_id === '' &&\n                    post.channel_id === channel?.id &&\n                    post.state !== Posts.POST_DELETED\n                );\n            }).reduce((map: Record<string, boolean>, obj) => {\n                map[obj.id] = true;\n                return map;\n            }, {});\n        },\n    );\n}\n\nexport function makeCountUnreadsBelow() {\n    return createSelector(\n        'makeCountUnreadsBelow',\n        getAllPosts,\n        getCurrentUserId,\n        (state: GlobalState, postIds: string[]) => postIds,\n        (state: GlobalState, postIds, lastViewedBottom: number) => lastViewedBottom,\n        isCollapsedThreadsEnabled,\n        (allPosts, currentUserId, postIds, lastViewedBottom, isCollapsed) => {\n            if (!postIds) {\n                return 0;\n            }\n\n            // Count the number of new posts made by other users that haven't been deleted\n            return postIds.map((id) => allPosts[id]).filter((post) => {\n                return post &&\n                    post.user_id !== currentUserId &&\n                    post.state !== Posts.POST_DELETED &&\n                    post.create_at > lastViewedBottom &&\n                    (isCollapsed ? post.root_id === '' : true); // in collapsed threads mode, only count root posts\n            }).length;\n        },\n    );\n}\n\n/* This connected component is written mainly for maintaining the unread count to be passed to the toast\n   Unread count logic:\n   * If channel is at the latest set of posts:\n      Unread count is the Number of posts below new message line\n   * if channel is not at the latest set of posts:\n      1. UnreadCount + any recent messages in the latest chunk.\n      2. If channel was marked as unread.\n        * Unread count of channel alone.\n*/\n\nfunction makeMapStateToProps() {\n    const countUnreadsBelow = makeCountUnreadsBelow();\n    const getRootPosts = makeGetRootPosts();\n    const preparePostIdsForPostList = makePreparePostIdsForPostList();\n    return function mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n        let newRecentMessagesCount = 0;\n        const channelMarkedAsUnread = isManuallyUnread(state, ownProps.channelId);\n        const lastViewedAt = state.views.channel.lastChannelViewTime[ownProps.channelId];\n        const unreadScrollPosition = getUnreadScrollPositionPreference(state);\n        if (!ownProps.atLatestPost) {\n            let postIds = getPostIdsInChannel(state, ownProps.channelId) || [];\n            if (postIds) {\n                postIds = preparePostIdsForPostList(state, {postIds, lastViewedAt});\n            }\n            newRecentMessagesCount = countUnreadsBelow(state, postIds, lastViewedAt);\n        }\n        return {\n            rootPosts: getRootPosts(state),\n            lastViewedAt,\n            newRecentMessagesCount,\n            unreadScrollPosition,\n            isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n            unreadCountInChannel: countCurrentChannelUnreadMessages(state),\n            channelMarkedAsUnread,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateToastStatus,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(makeMapStateToProps, mapDispatchToProps)(ToastWrapper));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useMemo} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {getLatestPostId, usePostAriaLabel} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\ninterface Props {\n    postIds?: string[];\n}\n\nconst LatestPostReader = (props: Props): JSX.Element => {\n    const {postIds} = props;\n    const latestPostId = useMemo(() => getLatestPostId(postIds || []), [postIds]);\n    const latestPost = useSelector<GlobalState, Post>((state) => getPost(state, latestPostId));\n\n    const ariaLabel = usePostAriaLabel(latestPost);\n\n    return (\n        <span\n            className='sr-only'\n            aria-live='polite'\n        >\n            {ariaLabel}\n        </span>\n    );\n};\n\nexport default LatestPostReader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n/* eslint-disable max-lines */\n\nimport {DynamicSizeList} from 'dynamic-virtualized-list';\nimport type {OnItemsRenderedArgs} from 'dynamic-virtualized-list';\nimport React from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport EventEmitter from 'mattermost-redux/utils/event_emitter';\nimport {getNewMessagesIndex, isDateLine, isStartOfNewMessages} from 'mattermost-redux/utils/post_list';\n\nimport type {updateNewMessagesAtInChannel} from 'actions/global_actions';\nimport type {CanLoadMorePosts} from 'actions/views/channel';\n\nimport FloatingTimestamp from 'components/post_view/floating_timestamp';\nimport PostListRow from 'components/post_view/post_list_row';\nimport ScrollToBottomArrows from 'components/post_view/scroll_to_bottom_arrows';\nimport ToastWrapper from 'components/toast_wrapper';\n\nimport Pluggable from 'plugins/pluggable';\nimport Constants, {PostListRowListIds, EventTypes, PostRequestTypes} from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\nimport {getPreviousPostId, getLatestPostId} from 'utils/post_utils';\nimport * as Utils from 'utils/utils';\n\nimport LatestPostReader from './latest_post_reader';\n\nconst OVERSCAN_COUNT_BACKWARD = 80;\nconst OVERSCAN_COUNT_FORWARD = 80;\nconst HEIGHT_TRIGGER_FOR_MORE_POSTS = 1000;\nconst BUFFER_TO_BE_CONSIDERED_BOTTOM = 10;\n\nconst MAXIMUM_POSTS_FOR_SLICING = {\n    channel: 50,\n    permalink: 100,\n};\n\nconst postListStyle = {\n    padding: '14px 0px 7px',\n};\n\nconst virtListStyles = {\n    position: 'absolute',\n    bottom: '0',\n    maxHeight: '100%',\n};\n\nconst OFFSET_TO_SHOW_TOAST = -50;\n\ntype Props = {\n\n    /*\n     * Array of Ids in the channel including date separators, new message indicator, more messages loader,\n     * manual load messages trigger and postId in the order of newest to oldest for populating virtual list rows\n     */\n    postListIds?: string[];\n\n    /*\n     * The current channel id\n     */\n    channelId: string;\n\n    /*\n     * Used for disabling auto retry of posts and enabling manual link for loading posts\n     */\n    autoRetryEnable: boolean;\n\n    /*\n     * Used in passing to post row for enabling animation when loading posts\n     */\n    loadingNewerPosts: boolean;\n    loadingOlderPosts: boolean;\n\n    isMobileView: boolean;\n\n    /*\n     * Used for populating header, scroll correction and disabling triggering loadOlderPosts\n     */\n    atOldestPost?: boolean;\n\n    /*\n     * Used for disabling triggering loadNewerPosts\n     */\n    atLatestPost?: boolean;\n\n    latestPostTimeStamp?: number;\n    lastViewedAt: number;\n\n    /*\n     * Set to focus this post\n     */\n    focusedPostId?: string;\n\n    shouldStartFromBottomWhenUnread: boolean;\n\n    actions: {\n\n        /*\n         * Function to get older posts in the channel\n         */\n        loadOlderPosts: () => Promise<void>;\n\n        /*\n         * Function to get newer posts in the channel\n         */\n        loadNewerPosts: () => Promise<void>;\n\n        /*\n         * Function used for autoLoad of posts incase screen is not filled with posts\n         */\n        canLoadMorePosts: (type: CanLoadMorePosts) => Promise<void>;\n\n        /*\n         * Function to change the post selected for postList\n         */\n        changeUnreadChunkTimeStamp: (lastViewedAt: number) => void;\n\n        updateNewMessagesAtInChannel: typeof updateNewMessagesAtInChannel;\n\n        toggleShouldStartFromBottomWhenUnread: () => void;\n    };\n}\n\ntype State = {\n    isScrolling: boolean;\n\n    // Intentionally setting null so that toast can determine when the first time this state is defined\n    atBottom: boolean | null;\n    lastViewedBottom: number;\n    postListIds: string[];\n    topPostId: string;\n    postMenuOpened: boolean;\n    dynamicListStyle: {\n        willChange: string;\n    };\n    initScrollCompleted: boolean;\n    initScrollOffsetFromBottom: number;\n    showSearchHint: boolean;\n    isSearchHintDismissed: boolean;\n    isMobileView?: boolean;\n    isNewMessageLineReached: boolean;\n    showScrollToBottomToast: boolean;\n    isScrollToBottomDismissed: boolean;\n}\n\nexport default class PostList extends React.PureComponent<Props, State> {\n    listRef: React.RefObject<DynamicSizeList>;\n    postListRef: React.RefObject<HTMLDivElement>;\n    scrollStopAction: DelayedAction | null = null;\n    initRangeToRender: number[];\n    showSearchHintThreshold: number;\n    mounted: boolean;\n    newMessageLineIndex: number;\n\n    constructor(props: Props) {\n        super(props);\n\n        const channelIntroMessage = PostListRowListIds.CHANNEL_INTRO_MESSAGE;\n        this.mounted = true;\n\n        this.state = {\n            isScrolling: false,\n\n            // Intentionally setting null so that toast can determine when the first time this state is defined\n            atBottom: null,\n            lastViewedBottom: Date.now(),\n            postListIds: [channelIntroMessage],\n            topPostId: '',\n            postMenuOpened: false,\n            dynamicListStyle: {\n                willChange: 'transform',\n            },\n            initScrollCompleted: false,\n            initScrollOffsetFromBottom: 0,\n            showSearchHint: false,\n            isSearchHintDismissed: false,\n            isNewMessageLineReached: false,\n            showScrollToBottomToast: false,\n            isScrollToBottomDismissed: false,\n        };\n\n        this.listRef = React.createRef();\n        this.postListRef = React.createRef();\n        if (this.props.isMobileView) {\n            this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n        }\n\n        this.initRangeToRender = this.props.focusedPostId ? [0, MAXIMUM_POSTS_FOR_SLICING.permalink] : [0, MAXIMUM_POSTS_FOR_SLICING.channel];\n\n        let postIndex = 0;\n        if (props.focusedPostId) {\n            postIndex = (this.props.postListIds || []).findIndex((postId) => postId === this.props.focusedPostId);\n        } else {\n            postIndex = getNewMessagesIndex(props.postListIds || []);\n        }\n        this.newMessageLineIndex = getNewMessagesIndex(props.postListIds || []);\n\n        const maxPostsForSlicing = props.focusedPostId ? MAXIMUM_POSTS_FOR_SLICING.permalink : MAXIMUM_POSTS_FOR_SLICING.channel;\n        this.initRangeToRender = [\n            Math.max(postIndex - 30, 0),\n            Math.max(postIndex + 30, Math.min((props.postListIds || []).length - 1, maxPostsForSlicing)),\n        ];\n        this.showSearchHintThreshold = this.getShowSearchHintThreshold();\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n\n        window.addEventListener('resize', this.handleWindowResize);\n        EventEmitter.addListener(EventTypes.POST_LIST_SCROLL_TO_BOTTOM, this.scrollToLatestMessages);\n    }\n\n    getSnapshotBeforeUpdate(prevProps: Props) {\n        if (this.postListRef && this.postListRef.current) {\n            const postsAddedAtTop = this.props.postListIds && this.props.postListIds.length !== (prevProps.postListIds || []).length && this.props.postListIds[0] === (prevProps.postListIds || [])[0];\n            const channelHeaderAdded = this.props.atOldestPost !== prevProps.atOldestPost;\n            if ((postsAddedAtTop || channelHeaderAdded) && this.state.atBottom === false) {\n                const postListNode = this.postListRef.current;\n                const previousScrollTop = postListNode.parentElement?.scrollTop;\n                const previousScrollHeight = postListNode.scrollHeight;\n\n                return {\n                    previousScrollTop,\n                    previousScrollHeight,\n                };\n            }\n        }\n        return null;\n    }\n\n    componentDidUpdate(prevProps: Props, _prevState: State, snapshot: {previousScrollTop: number; previousScrollHeight: number}) {\n        if (this.props.isMobileView && !prevProps.isMobileView) {\n            this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n        }\n\n        if (!this.postListRef.current) {\n            return;\n        }\n        const prevPostsCount = (prevProps.postListIds || []).length;\n        const presentPostsCount = (this.props.postListIds || []).length;\n\n        this.newMessageLineIndex = getNewMessagesIndex(this.props.postListIds || []);\n\n        if (snapshot) {\n            const postlistScrollHeight = this.postListRef.current.scrollHeight;\n            const postsAddedAtTop = presentPostsCount !== prevPostsCount && (this.props.postListIds || [])[0] === (prevProps.postListIds || [])[0];\n            const channelHeaderAdded = this.props.atOldestPost !== prevProps.atOldestPost;\n            if ((postsAddedAtTop || channelHeaderAdded) && !this.state.atBottom && snapshot) {\n                const scrollValue = snapshot.previousScrollTop + (postlistScrollHeight - snapshot.previousScrollHeight);\n                if (scrollValue !== 0 && (scrollValue - snapshot.previousScrollTop) !== 0) {\n                    //true as third param so chrome can use animationFrame when correcting scroll\n                    this.listRef.current?.scrollTo(scrollValue, scrollValue - snapshot.previousScrollTop, true);\n                }\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n        window.removeEventListener('resize', this.handleWindowResize);\n        EventEmitter.removeListener(EventTypes.POST_LIST_SCROLL_TO_BOTTOM, this.scrollToLatestMessages);\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        const postListIds = props.postListIds || [];\n        let newPostListIds;\n\n        if (props.atOldestPost) {\n            newPostListIds = [...postListIds, PostListRowListIds.CHANNEL_INTRO_MESSAGE];\n        } else if (props.autoRetryEnable) {\n            newPostListIds = [...postListIds, PostListRowListIds.OLDER_MESSAGES_LOADER];\n        } else {\n            newPostListIds = [...postListIds, PostListRowListIds.LOAD_OLDER_MESSAGES_TRIGGER];\n        }\n\n        if (!props.atLatestPost) {\n            if (props.autoRetryEnable) {\n                newPostListIds = [PostListRowListIds.NEWER_MESSAGES_LOADER, ...newPostListIds];\n            } else {\n                newPostListIds = [PostListRowListIds.LOAD_NEWER_MESSAGES_TRIGGER, ...newPostListIds];\n            }\n        }\n\n        const nextState: Partial<State> = {\n            postListIds: newPostListIds,\n        };\n\n        if (props.isMobileView !== state.isMobileView) {\n            nextState.isMobileView = props.isMobileView;\n\n            const dynamicListStyle = state.dynamicListStyle;\n            if (state.postMenuOpened) {\n                if (!props.isMobileView && dynamicListStyle.willChange === 'unset') {\n                    nextState.dynamicListStyle = {\n                        ...dynamicListStyle,\n                        willChange: 'transform',\n                    };\n                } else if (props.isMobileView && dynamicListStyle.willChange === 'transform') {\n                    nextState.dynamicListStyle = {\n                        ...dynamicListStyle,\n                        willChange: 'unset',\n                    };\n                }\n            }\n        }\n\n        return nextState;\n    }\n\n    handleWindowResize = () => {\n        this.showSearchHintThreshold = this.getShowSearchHintThreshold();\n    };\n\n    togglePostMenu = (opened: boolean) => {\n        let dynamicListStyle = this.state.dynamicListStyle;\n        if (this.props.isMobileView) {\n            dynamicListStyle = {\n                ...dynamicListStyle,\n                willChange: opened ? 'unset' : 'transform',\n            };\n        }\n\n        this.setState({\n            postMenuOpened: opened,\n            dynamicListStyle,\n        });\n    };\n\n    onNewMessageLineReached = () => {\n        this.setState({\n            isNewMessageLineReached: true,\n        });\n    };\n\n    renderRow = ({data, itemId, style}: {data: string[]; itemId: string; style: Record<string, string>}) => {\n        const index = data.indexOf(itemId);\n        let className = '';\n        const basePaddingClass = 'post-row__padding';\n        const previousItemId = (index !== -1 && index < data.length - 1) ? data[index + 1] : '';\n        const nextItemId = (index > 0 && index < data.length) ? data[index - 1] : '';\n\n        if (isDateLine(nextItemId) || isStartOfNewMessages(nextItemId)) {\n            className += basePaddingClass + ' bottom';\n        }\n\n        if (isDateLine(previousItemId) || isStartOfNewMessages(previousItemId)) {\n            if (className.includes(basePaddingClass)) {\n                className += ' top';\n            } else {\n                className += basePaddingClass + ' top';\n            }\n        }\n\n        // Since the first in the list is the latest message\n        const isLastPost = itemId === this.state.postListIds[0];\n\n        return (\n            <div\n                style={style}\n                className={className}\n            >\n                <PostListRow\n                    listId={itemId}\n                    previousListId={getPreviousPostId(data, index)}\n                    shouldHighlight={itemId === this.props.focusedPostId}\n                    loadOlderPosts={this.props.actions.loadOlderPosts}\n                    loadNewerPosts={this.props.actions.loadNewerPosts}\n                    togglePostMenu={this.togglePostMenu}\n                    isLastPost={isLastPost}\n                    loadingNewerPosts={this.props.loadingNewerPosts}\n                    loadingOlderPosts={this.props.loadingOlderPosts}\n                    channelId={this.props.channelId}\n                />\n            </div>\n        );\n    };\n\n    scrollToFailed = (index: number) => {\n        if (index === 0) {\n            this.props.actions.changeUnreadChunkTimeStamp(0);\n        } else {\n            this.props.actions.changeUnreadChunkTimeStamp(this.props.lastViewedAt);\n        }\n    };\n\n    onScroll = ({\n        scrollDirection,\n        scrollOffset,\n        scrollUpdateWasRequested,\n        clientHeight,\n        scrollHeight}:\n    {\n        scrollDirection: string;\n        scrollOffset: number;\n        scrollUpdateWasRequested: boolean;\n        clientHeight: number;\n        scrollHeight: number;\n    }) => {\n        if (scrollHeight <= 0) {\n            return;\n        }\n\n        const didUserScrollBackwards = scrollDirection === 'backward' && !scrollUpdateWasRequested;\n        const didUserScrollForwards = scrollDirection === 'forward' && !scrollUpdateWasRequested;\n        const isOffsetWithInRange = scrollOffset < HEIGHT_TRIGGER_FOR_MORE_POSTS;\n        const offsetFromBottom = this.getOffsetFromBottom(scrollOffset, scrollHeight, clientHeight);\n        const shouldLoadNewPosts = offsetFromBottom < HEIGHT_TRIGGER_FOR_MORE_POSTS;\n\n        if (didUserScrollBackwards && isOffsetWithInRange && !this.props.atOldestPost) {\n            this.props.actions.loadOlderPosts();\n        } else if (didUserScrollForwards && shouldLoadNewPosts && !this.props.atLatestPost) {\n            this.props.actions.loadNewerPosts();\n        }\n\n        if (this.props.isMobileView) {\n            if (!this.state.isScrolling) {\n                this.setState({\n                    isScrolling: true,\n                });\n            }\n\n            if (this.scrollStopAction) {\n                this.scrollStopAction.fireAfter(Constants.SCROLL_DELAY);\n            }\n        }\n\n        this.checkBottom(scrollOffset, scrollHeight, clientHeight);\n\n        if (scrollUpdateWasRequested) { //if scroll change is programatically requested i.e by calling scrollTo\n            //This is a private method on virtlist\n            const postsRenderedRange = this.listRef.current?._getRangeToRender(); //eslint-disable-line no-underscore-dangle\n\n            // postsRenderedRange[3] is the visibleStopIndex which is post at the bottom of the screen\n            if (postsRenderedRange && postsRenderedRange[3] <= 1 && !this.props.atLatestPost) {\n                this.props.actions.canLoadMorePosts(PostRequestTypes.AFTER_ID);\n            }\n\n            if (!this.state.atBottom && scrollHeight) {\n                this.setState({\n                    initScrollOffsetFromBottom: offsetFromBottom,\n                });\n            }\n        }\n\n        if (this.props.isMobileView && this.state.showSearchHint) {\n            this.setState({\n                showSearchHint: false,\n            });\n        }\n\n        if (!this.props.isMobileView && !this.state.isSearchHintDismissed) {\n            this.setState({\n                showSearchHint: offsetFromBottom > this.showSearchHintThreshold,\n            });\n        }\n\n        this.updateScrollToBottomToastVisibility(scrollOffset, scrollHeight, clientHeight);\n    };\n\n    getShowSearchHintThreshold = () => {\n        return window.screen.height * 3;\n    };\n\n    checkBottom = (scrollOffset: number, scrollHeight: number, clientHeight: number) => {\n        this.updateAtBottom(this.isAtBottom(scrollOffset, scrollHeight, clientHeight));\n    };\n\n    // Calculate how far the post list is from being scrolled to the bottom\n    getOffsetFromBottom = (scrollOffset: number, scrollHeight: number, clientHeight: number) => scrollHeight - clientHeight - scrollOffset;\n\n    isAtBottom = (scrollOffset: number, scrollHeight: number, clientHeight: number) => {\n        const offsetFromBottom = this.getOffsetFromBottom(scrollOffset, scrollHeight, clientHeight);\n\n        return offsetFromBottom <= BUFFER_TO_BE_CONSIDERED_BOTTOM && scrollHeight > 0;\n    };\n\n    updateAtBottom = (atBottom: boolean) => {\n        if (atBottom !== this.state.atBottom) {\n            // Update lastViewedBottom when the list reaches or leaves the bottom\n            let lastViewedBottom = Date.now();\n            if (this.props.latestPostTimeStamp && this.props.latestPostTimeStamp > lastViewedBottom) {\n                lastViewedBottom = this.props.latestPostTimeStamp;\n            }\n\n            // if we hit the bottom, we haven't just landed on the unread channel\n            this.setState({\n                atBottom,\n                lastViewedBottom,\n            });\n        }\n    };\n\n    updateLastViewedBottomAt = (lastViewedBottom = Date.now()) => {\n        this.setState({\n            lastViewedBottom,\n        });\n    };\n\n    handleScrollStop = () => {\n        if (this.mounted) {\n            this.setState({\n                isScrolling: false,\n            });\n        }\n    };\n\n    handleSearchHintDismiss = () => {\n        this.setState({\n            showSearchHint: false,\n            isSearchHintDismissed: true,\n        });\n    };\n\n    handleScrollToBottomToastDismiss = () => {\n        this.setState({\n            showScrollToBottomToast: false,\n            isScrollToBottomDismissed: true,\n        });\n    };\n\n    hideScrollToBottomToast = () => {\n        this.setState({\n            showScrollToBottomToast: false,\n        });\n    };\n\n    /*\n     * - Show the scroll-to-bottom toast at the same time as the search-hint toast.\n     * - Only show if the user hasn't dismissed it before, within a session.\n     * - Hide it if the user is at the bottom of the list.\n     */\n    updateScrollToBottomToastVisibility = (scrollOffset: number, scrollHeight: number, clientHeight: number) => {\n        if (this.state.showScrollToBottomToast && this.state.atBottom) {\n            this.setState({\n                showScrollToBottomToast: false,\n            });\n            return;\n        }\n\n        if (!this.state.isScrollToBottomDismissed) {\n            const offsetFromBottom = this.getOffsetFromBottom(scrollOffset, scrollHeight, clientHeight);\n            this.setState({\n                showScrollToBottomToast: offsetFromBottom > this.showSearchHintThreshold,\n            });\n        }\n    };\n\n    updateFloatingTimestamp = (visibleTopItem: number) => {\n        if (!this.props.isMobileView) {\n            return;\n        }\n\n        if (!this.props.postListIds) {\n            return;\n        }\n\n        this.setState({\n            topPostId: getLatestPostId(this.props.postListIds.slice(visibleTopItem)),\n        });\n    };\n\n    onItemsRendered = ({visibleStartIndex, visibleStopIndex}: Pick<OnItemsRenderedArgs, 'visibleStartIndex' | 'visibleStopIndex'>) => {\n        this.updateFloatingTimestamp(visibleStartIndex);\n\n        if (\n            this.newMessageLineIndex > 0 &&\n             !this.state.isNewMessageLineReached &&\n             this.newMessageLineIndex <= visibleStartIndex &&\n             this.newMessageLineIndex >= visibleStopIndex\n        ) {\n            this.onNewMessageLineReached();\n        }\n    };\n\n    initScrollToIndex = () => {\n        if (this.props.focusedPostId) {\n            const index = this.state.postListIds.findIndex(\n                (item) => item === this.props.focusedPostId,\n            );\n            return {\n                index,\n                position: 'center',\n            };\n        }\n\n        if (this.props.shouldStartFromBottomWhenUnread) {\n            return {\n                index: 0,\n                position: 'end',\n            };\n        }\n\n        const newMessagesSeparatorIndex = getNewMessagesIndex(this.state.postListIds);\n\n        if (newMessagesSeparatorIndex > 0) {\n            // if there is a dateLine above START_OF_NEW_MESSAGES then scroll to date line\n            if (isDateLine(this.state.postListIds[newMessagesSeparatorIndex + 1])) {\n                return {\n                    index: newMessagesSeparatorIndex + 1,\n                    position: 'start',\n                    offset: OFFSET_TO_SHOW_TOAST,\n                };\n            }\n            return {\n                index: newMessagesSeparatorIndex,\n                position: 'start',\n                offset: OFFSET_TO_SHOW_TOAST,\n            };\n        }\n\n        return {\n            index: 0,\n            position: 'end',\n        };\n    };\n\n    scrollToLatestMessages = () => {\n        if (this.props.atLatestPost) {\n            this.scrollToBottom();\n        } else {\n            this.updateNewMessagesAtInChannel();\n            this.props.actions.changeUnreadChunkTimeStamp(0);\n        }\n    };\n\n    scrollToUnreadMessages = () => {\n        this.props.actions.toggleShouldStartFromBottomWhenUnread();\n    };\n\n    scrollToBottom = () => {\n        this.listRef.current?.scrollToItem(0, 'end');\n    };\n\n    scrollToNewMessage = () => {\n        this.listRef.current?.scrollToItem(getNewMessagesIndex(this.state.postListIds), 'start', OFFSET_TO_SHOW_TOAST);\n    };\n\n    updateNewMessagesAtInChannel = (lastViewedAt = Date.now()) => {\n        this.props.actions.updateNewMessagesAtInChannel(this.props.channelId, lastViewedAt);\n    };\n\n    renderToasts = (width: number) => {\n        return (\n            <ToastWrapper\n                atLatestPost={this.props.atLatestPost}\n                postListIds={this.state.postListIds}\n                atBottom={this.state.atBottom}\n                width={width}\n                lastViewedBottom={this.state.lastViewedBottom}\n                latestPostTimeStamp={this.props.latestPostTimeStamp}\n                scrollToUnreadMessages={this.scrollToUnreadMessages}\n                scrollToNewMessage={this.scrollToNewMessage}\n                scrollToLatestMessages={this.scrollToLatestMessages}\n                updateNewMessagesAtInChannel={this.updateNewMessagesAtInChannel}\n                updateLastViewedBottomAt={this.updateLastViewedBottomAt}\n                shouldStartFromBottomWhenUnread={this.props.shouldStartFromBottomWhenUnread}\n                isNewMessageLineReached={this.state.isNewMessageLineReached}\n                channelId={this.props.channelId}\n                focusedPostId={this.props.focusedPostId}\n                initScrollOffsetFromBottom={this.state.initScrollOffsetFromBottom}\n                onSearchHintDismiss={this.handleSearchHintDismiss}\n                showSearchHintToast={this.state.showSearchHint}\n                showScrollToBottomToast={this.state.showScrollToBottomToast}\n                onScrollToBottomToastDismiss={this.handleScrollToBottomToastDismiss}\n                hideScrollToBottomToast={this.hideScrollToBottomToast}\n            />\n        );\n    };\n\n    render() {\n        const {channelId} = this.props;\n        const {dynamicListStyle} = this.state;\n\n        return (\n            <div\n                className='a11y__region'\n                data-a11y-sort-order='1'\n                data-a11y-focus-child={true}\n                data-a11y-order-reversed={true}\n                data-a11y-loop-navigation={false}\n                aria-label={Utils.localizeMessage({id: 'accessibility.sections.centerContent', defaultMessage: 'message list main region'})}\n            >\n                {this.props.isMobileView && (\n                    <>\n                        <FloatingTimestamp\n                            isScrolling={this.state.isScrolling}\n                            postId={this.state.topPostId}\n                        />\n                        <ScrollToBottomArrows\n                            isScrolling={this.state.isScrolling}\n                            atBottom={Boolean(this.state.atBottom)}\n                            onClick={this.scrollToBottom}\n                        />\n                    </>\n                )}\n                <div\n                    className='post-list-holder-by-time'\n                    key={'postlist-' + channelId}\n                >\n                    <div\n                        className='post-list__table'\n                    >\n                        <div\n                            id='postListContent'\n                            className='post-list__content'\n                        >\n                            <LatestPostReader postIds={this.props.postListIds}/>\n                            <AutoSizer>\n                                {({height, width}) => (\n                                    <>\n                                        <div>\n                                            <Pluggable\n                                                pluggableName='ChannelToast'\n                                            />\n\n                                            {this.renderToasts(width)}\n                                        </div>\n\n                                        <DynamicSizeList\n                                            ref={this.listRef}\n                                            height={height}\n                                            width={width}\n                                            className='post-list__dynamic'\n                                            itemData={this.state.postListIds}\n                                            overscanCountForward={OVERSCAN_COUNT_FORWARD}\n                                            overscanCountBackward={OVERSCAN_COUNT_BACKWARD}\n                                            onScroll={this.onScroll}\n                                            initScrollToIndex={this.initScrollToIndex}\n                                            canLoadMorePosts={this.props.actions.canLoadMorePosts}\n                                            innerRef={this.postListRef}\n                                            style={{...virtListStyles, ...dynamicListStyle}}\n                                            innerListStyle={postListStyle}\n                                            initRangeToRender={this.initRangeToRender}\n                                            loaderId={PostListRowListIds.OLDER_MESSAGES_LOADER}\n                                            correctScrollToBottom={this.props.atLatestPost}\n                                            onItemsRendered={this.onItemsRendered}\n                                            scrollToFailed={this.scrollToFailed}\n                                        >\n                                            {this.renderRow}\n                                        </DynamicSizeList>\n                                    </>\n                                )}\n                            </AutoSizer>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport type {updateNewMessagesAtInChannel} from 'actions/global_actions';\nimport {clearMarks, countRequestsBetween, mark, shouldTrackPerformance, trackEvent} from 'actions/telemetry_actions.jsx';\nimport type {LoadPostsParameters, LoadPostsReturnValue, CanLoadMorePosts} from 'actions/views/channel';\n\nimport LoadingScreen from 'components/loading_screen';\nimport VirtPostList from 'components/post_view/post_list_virtualized/post_list_virtualized';\n\nimport {PostRequestTypes} from 'utils/constants';\nimport {Mark, Measure, measureAndReport} from 'utils/performance_telemetry';\nimport {getOldestPostId, getLatestPostId} from 'utils/post_utils';\n\nconst MAX_NUMBER_OF_AUTO_RETRIES = 3;\nexport const MAX_EXTRA_PAGES_LOADED = 10;\n\n// Measures the time between channel or team switch started and the post list component rendering posts.\n// Set \"fresh\" to true when the posts have not been loaded before.\nfunction markAndMeasureChannelSwitchEnd(fresh = false) {\n    mark(Mark.PostListLoaded);\n\n    // Send new performance metrics to server\n    const channelSwitch = measureAndReport({\n        name: Measure.ChannelSwitch,\n        startMark: Mark.ChannelLinkClicked,\n        endMark: Mark.PostListLoaded,\n        labels: {\n            fresh: fresh.toString(),\n        },\n        canFail: true,\n    });\n    const teamSwitch = measureAndReport({\n        name: Measure.TeamSwitch,\n        startMark: Mark.TeamLinkClicked,\n        endMark: Mark.PostListLoaded,\n        labels: {\n            fresh: fresh.toString(),\n        },\n        canFail: true,\n    });\n\n    // Send old performance metrics to Rudder\n    if (shouldTrackPerformance()) {\n        if (channelSwitch) {\n            const requestCount1 = countRequestsBetween(Mark.ChannelLinkClicked, Mark.PostListLoaded);\n\n            trackEvent('performance', Measure.ChannelSwitch, {\n                duration: Math.round(channelSwitch.duration),\n                fresh,\n                requestCount: requestCount1,\n            });\n        }\n\n        if (teamSwitch) {\n            const requestCount2 = countRequestsBetween(Mark.TeamLinkClicked, Mark.PostListLoaded);\n\n            trackEvent('performance', Measure.TeamSwitch, {\n                duration: Math.round(teamSwitch.duration),\n                fresh,\n                requestCount: requestCount2,\n            });\n        }\n    }\n\n    // Clear all the metrics so that we can differentiate between a channel and team switch next time this is called\n    clearMarks([\n        Mark.ChannelLinkClicked,\n        Mark.TeamLinkClicked,\n        Mark.PostListLoaded,\n    ]);\n}\n\nexport interface Props {\n\n    /**\n     *  Array of formatted post ids in the channel\n     *  This will be different from postListIds because of grouping and filtering of posts\n     *  This array should be used for making Before and After API calls\n     */\n    formattedPostIds?: string[];\n\n    /**\n     *  Array of post ids in the channel, ordered from newest to oldest\n     */\n    postListIds?: string[];\n\n    /**\n     * The channel the posts are in\n     */\n    channelId: string;\n\n    /*\n     * To get posts for perma view\n     */\n    focusedPostId?: string;\n\n    /*\n     * Used for determining if we are not at the recent most chunk in channel\n     */\n    atLatestPost: boolean;\n\n    /*\n     * Used for determining if we are at the channels oldest post\n     */\n    atOldestPost?: boolean;\n\n    /*\n     * Used for loading posts using unread API\n     */\n    isFirstLoad: boolean;\n\n    /*\n     * Used for syncing posts and is also passed down to virt list for newMessages indicator\n     */\n    latestPostTimeStamp?: number;\n\n    /*\n     * Used for passing down to virt list so it can change the chunk of posts selected\n     */\n    changeUnreadChunkTimeStamp: (lastViewedAt: number) => void;\n\n    /*\n     * Used for skipping the call on load\n     */\n    isPrefetchingInProcess: boolean;\n\n    isMobileView: boolean;\n\n    lastViewedAt: number;\n\n    toggleShouldStartFromBottomWhenUnread: () => void;\n    shouldStartFromBottomWhenUnread: boolean;\n    hasInaccessiblePosts: boolean;\n\n    actions: {\n\n        /*\n         * Used for getting permalink view posts\n         */\n        loadPostsAround: (channelId: string, focusedPostId: string) => Promise<ActionResult>;\n\n        /*\n         * Used for geting unreads posts\n         */\n        loadUnreads: (channelId: string) => Promise<ActionResult>;\n\n        /*\n         * Used for getting posts using BEFORE_ID and AFTER_ID\n         */\n        loadPosts: (parameters: LoadPostsParameters) => Promise<LoadPostsReturnValue>;\n\n        /*\n         * Used to loading posts since a timestamp to sync the posts\n         */\n        syncPostsInChannel: (channelId: string, since: number, prefetch: boolean) => Promise<ActionResult>;\n\n        /*\n         * Used to loading posts if it not first visit, permalink or there exists any postListIds\n         * This happens when previous channel visit has a chunk which is not the latest set of posts\n         */\n        loadLatestPosts: (channelId: string) => Promise<ActionResult>;\n\n        markChannelAsRead: (channelId: string) => void;\n        updateNewMessagesAtInChannel: typeof updateNewMessagesAtInChannel;\n    };\n}\n\ninterface State {\n    loadingNewerPosts: boolean;\n    loadingOlderPosts: boolean;\n    autoRetryEnable: boolean;\n}\n\nexport default class PostList extends React.PureComponent<Props, State> {\n    private autoRetriesCount: number;\n    private actionsForPostList: {\n        loadOlderPosts: () => Promise<void>;\n        loadNewerPosts: () => Promise<void>;\n        canLoadMorePosts: (type: CanLoadMorePosts) => Promise<void>;\n        changeUnreadChunkTimeStamp: (lastViewedAt: number) => void;\n        updateNewMessagesAtInChannel: typeof updateNewMessagesAtInChannel;\n        toggleShouldStartFromBottomWhenUnread: () => void;\n    };\n    private mounted: boolean | undefined;\n\n    // public for testing purposes only\n    public extraPagesLoaded: number;\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            loadingNewerPosts: false,\n            loadingOlderPosts: false,\n            autoRetryEnable: true,\n        };\n\n        this.extraPagesLoaded = 0;\n\n        this.autoRetriesCount = 0;\n        this.actionsForPostList = {\n            loadOlderPosts: this.getPostsBefore,\n            loadNewerPosts: this.getPostsAfter,\n            canLoadMorePosts: this.canLoadMorePosts,\n            changeUnreadChunkTimeStamp: props.changeUnreadChunkTimeStamp,\n            toggleShouldStartFromBottomWhenUnread: props.toggleShouldStartFromBottomWhenUnread,\n            updateNewMessagesAtInChannel: this.props.actions.updateNewMessagesAtInChannel,\n        };\n    }\n\n    componentDidMount() {\n        this.mounted = true;\n        if (this.props.channelId) {\n            this.postsOnLoad(this.props.channelId);\n            if (this.props.postListIds) {\n                markAndMeasureChannelSwitchEnd();\n            }\n        }\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.channelId !== prevProps.channelId) {\n            this.postsOnLoad(this.props.channelId);\n        }\n        if (this.props.postListIds != null && prevProps.postListIds == null) {\n            markAndMeasureChannelSwitchEnd(true);\n        }\n    }\n\n    componentWillUnmount() {\n        this.mounted = false;\n    }\n\n    postsOnLoad = async (channelId: string) => {\n        const {focusedPostId, isFirstLoad, latestPostTimeStamp, isPrefetchingInProcess, actions} = this.props;\n        if (focusedPostId) {\n            await actions.loadPostsAround(channelId, focusedPostId);\n        } else if (isFirstLoad) {\n            if (!isPrefetchingInProcess) {\n                await actions.loadUnreads(channelId);\n            }\n        } else if (latestPostTimeStamp) {\n            await actions.syncPostsInChannel(channelId, latestPostTimeStamp, false);\n        } else {\n            await actions.loadLatestPosts(channelId);\n        }\n\n        if (!focusedPostId) {\n            // Posts are marked as read from here to not cause a race when loading posts\n            // marking channel as read and viewed after calling for posts in channel\n            this.props.actions.markChannelAsRead(channelId);\n        }\n\n        if (this.mounted) {\n            this.setState({\n                loadingOlderPosts: false,\n                loadingNewerPosts: false,\n            });\n        }\n    };\n\n    callLoadPosts = async (channelId: string, postId: string, type: CanLoadMorePosts) => {\n        const {error} = await this.props.actions.loadPosts({\n            channelId,\n            postId,\n            type,\n        });\n\n        if (type === PostRequestTypes.BEFORE_ID) {\n            this.setState({loadingOlderPosts: false});\n        } else {\n            this.setState({loadingNewerPosts: false});\n        }\n\n        if (error) {\n            if (this.autoRetriesCount < MAX_NUMBER_OF_AUTO_RETRIES) {\n                this.autoRetriesCount++;\n                await this.callLoadPosts(channelId, postId, type);\n            } else if (this.mounted) {\n                this.setState({autoRetryEnable: false});\n            }\n        } else {\n            if (this.mounted) {\n                this.setState({autoRetryEnable: true});\n            }\n\n            if (!this.state.autoRetryEnable) {\n                this.autoRetriesCount = 0;\n            }\n        }\n\n        return {error};\n    };\n\n    getOldestVisiblePostId = () => {\n        return getOldestPostId(this.props.postListIds || []);\n    };\n\n    getLatestVisiblePostId = () => {\n        return getLatestPostId(this.props.postListIds || []);\n    };\n\n    canLoadMorePosts = async (type: CanLoadMorePosts = PostRequestTypes.BEFORE_ID) => {\n        if (this.props.hasInaccessiblePosts) {\n            return;\n        }\n\n        if (!this.props.postListIds) {\n            return;\n        }\n\n        if (this.state.loadingOlderPosts || this.state.loadingNewerPosts) {\n            return;\n        }\n\n        if (this.extraPagesLoaded > MAX_EXTRA_PAGES_LOADED) {\n            // Prevent this from loading a lot of pages in a channel with only hidden messages\n            // Enable load more messages manual link\n            if (this.state.autoRetryEnable) {\n                this.setState({autoRetryEnable: false});\n            }\n            return;\n        }\n\n        if (!this.props.atOldestPost && type === PostRequestTypes.BEFORE_ID) {\n            await this.getPostsBefore();\n        } else if (!this.props.atLatestPost) {\n            // if all olderPosts are loaded load new ones\n            await this.getPostsAfter();\n        }\n\n        this.extraPagesLoaded += 1;\n    };\n\n    getPostsBefore = async () => {\n        if (this.state.loadingOlderPosts) {\n            return;\n        }\n\n        // Reset counter after \"Load more\" button click\n        if (!this.state.autoRetryEnable) {\n            this.extraPagesLoaded = 0;\n        }\n\n        const oldestPostId = this.getOldestVisiblePostId();\n        this.setState({loadingOlderPosts: true});\n        await this.callLoadPosts(this.props.channelId, oldestPostId, PostRequestTypes.BEFORE_ID);\n    };\n\n    getPostsAfter = async () => {\n        if (this.state.loadingNewerPosts) {\n            return;\n        }\n\n        // Reset counter after \"Load more\" button click\n        if (!this.state.autoRetryEnable) {\n            this.extraPagesLoaded = 0;\n        }\n\n        const latestPostId = this.getLatestVisiblePostId();\n        this.setState({loadingNewerPosts: true});\n        await this.callLoadPosts(this.props.channelId, latestPostId, PostRequestTypes.AFTER_ID);\n    };\n\n    render() {\n        if (!this.props.postListIds) {\n            return (\n                <LoadingScreen centered={true}/>\n            );\n        }\n\n        return (\n            <div\n                className='post-list-holder-by-time'\n                key={'postlist-' + this.props.channelId}\n            >\n                <div className='post-list__table'>\n                    <div\n                        id='virtualizedPostListContent'\n                        className='post-list__content'\n                    >\n                        <VirtPostList\n                            loadingNewerPosts={this.state.loadingNewerPosts}\n                            loadingOlderPosts={this.state.loadingOlderPosts}\n                            atOldestPost={this.props.atOldestPost}\n                            atLatestPost={this.props.atLatestPost}\n                            focusedPostId={this.props.focusedPostId}\n                            channelId={this.props.channelId}\n                            autoRetryEnable={this.state.autoRetryEnable}\n                            shouldStartFromBottomWhenUnread={this.props.shouldStartFromBottomWhenUnread}\n                            actions={this.actionsForPostList}\n                            postListIds={this.props.formattedPostIds}\n                            latestPostTimeStamp={this.props.latestPostTimeStamp}\n                            isMobileView={this.props.isMobileView}\n                            lastViewedAt={this.props.lastViewedAt}\n                        />\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {markChannelAsRead} from 'mattermost-redux/actions/channels';\nimport {RequestStatus} from 'mattermost-redux/constants';\nimport {getRecentPostsChunkInChannel, makeGetPostsChunkAroundPost, getUnreadPostsChunk, getPost, isPostsChunkIncludingUnreadsPosts, getLimitedViews} from 'mattermost-redux/selectors/entities/posts';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {makePreparePostIdsForPostList} from 'mattermost-redux/utils/post_list';\n\nimport {updateNewMessagesAtInChannel} from 'actions/global_actions';\nimport {\n    loadPosts,\n    loadUnreads,\n    loadPostsAround,\n    syncPostsInChannel,\n    loadLatestPosts,\n} from 'actions/views/channel';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {getLatestPostId} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostList from './post_list';\n\nconst isFirstLoad = (state: GlobalState, channelId: string) => !state.entities.posts.postsInChannel[channelId];\nconst memoizedGetLatestPostId = memoizeResult((postIds: string[]) => getLatestPostId(postIds));\n\n// This function is added as a fail safe for the channel sync issue we have.\n// When the user switches to a team for the first time we show the channel of previous team and then settle for the right channel after that\n// This causes the scroll correction etc an issue because post_list is not mounted for new channel instead it is updated\n\ninterface Props {\n    focusedPostId?: string;\n    unreadChunkTimeStamp?: number;\n    changeUnreadChunkTimeStamp: (lastViewedAt: number) => void;\n    channelId: string;\n}\n\nfunction makeMapStateToProps() {\n    const getPostsChunkAroundPost = makeGetPostsChunkAroundPost();\n    const preparePostIdsForPostList = makePreparePostIdsForPostList();\n\n    return function mapStateToProps(state: GlobalState, ownProps: Pick<Props, 'focusedPostId' | 'unreadChunkTimeStamp' | 'channelId'> & {shouldStartFromBottomWhenUnread: boolean}) {\n        let latestPostTimeStamp = 0;\n        let postIds: string[] | undefined;\n        let chunk;\n        let atLatestPost = false;\n        let atOldestPost = false;\n        let formattedPostIds: string[] | undefined;\n        const {focusedPostId, unreadChunkTimeStamp, channelId, shouldStartFromBottomWhenUnread} = ownProps;\n        const channelViewState = state.views.channel;\n        const lastViewedAt = channelViewState.lastChannelViewTime[channelId];\n        const isPrefetchingInProcess = channelViewState.channelPrefetchStatus[channelId] === RequestStatus.STARTED;\n        const limitedViews = getLimitedViews(state);\n        const hasInaccessiblePosts = Boolean(limitedViews.channels[channelId]) || limitedViews.channels[channelId] === 0;\n\n        const focusedPost = getPost(state, focusedPostId || '');\n\n        if (focusedPostId && focusedPost !== undefined) {\n            chunk = getPostsChunkAroundPost(state, focusedPostId, channelId);\n        } else if (unreadChunkTimeStamp && !shouldStartFromBottomWhenUnread) {\n            chunk = getUnreadPostsChunk(state, channelId, unreadChunkTimeStamp);\n        } else {\n            chunk = getRecentPostsChunkInChannel(state, channelId);\n        }\n\n        if (chunk) {\n            postIds = chunk.order;\n            atLatestPost = Boolean(chunk.recent);\n            atOldestPost = Boolean(chunk.oldest);\n        }\n\n        let shouldHideNewMessageIndicator = false;\n        if (unreadChunkTimeStamp != null) {\n            shouldHideNewMessageIndicator = shouldStartFromBottomWhenUnread && !isPostsChunkIncludingUnreadsPosts(state, chunk!, unreadChunkTimeStamp);\n        }\n\n        if (postIds) {\n            formattedPostIds = preparePostIdsForPostList(state, {postIds, lastViewedAt, indicateNewMessages: !shouldHideNewMessageIndicator});\n            if (postIds.length) {\n                const latestPostId = memoizedGetLatestPostId(postIds);\n                const latestPost = getPost(state, latestPostId);\n                latestPostTimeStamp = latestPost.create_at;\n            }\n        }\n\n        return {\n            lastViewedAt,\n            isFirstLoad: isFirstLoad(state, channelId),\n            formattedPostIds,\n            atLatestPost,\n            atOldestPost,\n            latestPostTimeStamp,\n            postListIds: postIds,\n            isPrefetchingInProcess,\n            shouldStartFromBottomWhenUnread,\n            isMobileView: getIsMobileView(state),\n            hasInaccessiblePosts,\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadUnreads,\n            loadPosts,\n            loadLatestPosts,\n            loadPostsAround,\n            syncPostsInChannel,\n            markChannelAsRead,\n            updateNewMessagesAtInChannel,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(PostList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LoadingScreen from 'components/loading_screen';\n\nimport {Preferences} from 'utils/constants';\n\nimport PostList from './post_list';\n\ntype Props = {\n    lastViewedAt?: number;\n    channelLoading: boolean;\n    channelId: string;\n    focusedPostId?: string;\n    unreadScrollPosition: string;\n};\n\ninterface State {\n    unreadChunkTimeStamp?: number;\n    loaderForChangeOfPostsChunk: boolean;\n    channelLoading: boolean;\n    shouldStartFromBottomWhenUnread: boolean;\n}\n\nexport default class PostView extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        const shouldStartFromBottomWhenUnread = this.props.unreadScrollPosition === Preferences.UNREAD_SCROLL_POSITION_START_FROM_NEWEST;\n        this.state = {\n            unreadChunkTimeStamp: props.lastViewedAt,\n            shouldStartFromBottomWhenUnread,\n            loaderForChangeOfPostsChunk: false,\n            channelLoading: props.channelLoading,\n        };\n    }\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        if (state.unreadChunkTimeStamp === null && props.lastViewedAt) {\n            return {\n                unreadChunkTimeStamp: props.lastViewedAt,\n            };\n        }\n        if (props.channelLoading !== state.channelLoading) {\n            return {\n                unreadChunkTimeStamp: props.lastViewedAt,\n                channelLoading: props.channelLoading,\n            };\n        }\n\n        return null;\n    }\n\n    changeUnreadChunkTimeStamp = (unreadChunkTimeStamp: number) => {\n        this.setState({\n            unreadChunkTimeStamp,\n            loaderForChangeOfPostsChunk: true,\n        }, () => {\n            window.requestAnimationFrame(() => {\n                this.setState({\n                    loaderForChangeOfPostsChunk: false,\n                });\n            });\n        });\n    };\n\n    toggleShouldStartFromBottomWhenUnread = () => {\n        this.setState((state) => ({\n            loaderForChangeOfPostsChunk: true,\n            shouldStartFromBottomWhenUnread: !state.shouldStartFromBottomWhenUnread,\n        }), () => {\n            window.requestAnimationFrame(() => {\n                this.setState({\n                    loaderForChangeOfPostsChunk: false,\n                });\n            });\n        });\n    };\n\n    render() {\n        if (this.props.channelLoading || this.state.loaderForChangeOfPostsChunk) {\n            return (\n                <div id='post-list'>\n                    <LoadingScreen centered={true}/>\n                </div>\n            );\n        }\n\n        return (\n            <div\n                id='post-list'\n                role='main'\n            >\n                <PostList\n                    unreadChunkTimeStamp={this.state.unreadChunkTimeStamp}\n                    channelId={this.props.channelId}\n                    changeUnreadChunkTimeStamp={this.changeUnreadChunkTimeStamp}\n                    shouldStartFromBottomWhenUnread={this.state.shouldStartFromBottomWhenUnread}\n                    toggleShouldStartFromBottomWhenUnread={this.toggleShouldStartFromBottomWhenUnread}\n                    focusedPostId={this.props.focusedPostId}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Team, TeamMembership} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getUnreadScrollPositionPreference} from 'mattermost-redux/selectors/entities/preferences';\nimport {getTeamByName, getTeamMemberships} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {Constants} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostView from './post_view';\n\nexport const isChannelLoading = (params: RouteViewParams, channel?: Channel, team?: Team, teammate?: UserProfile, teamMemberships?: Record<string, TeamMembership>) => {\n    if (params.postid) {\n        return false;\n    }\n\n    const identifier = params.identifier?.toLowerCase();\n\n    if (channel && team) {\n        if (channel.type !== Constants.DM_CHANNEL && channel.name !== identifier) {\n            return true;\n        } else if (channel.type === Constants.DM_CHANNEL && teammate && identifier !== `@${teammate.username}`) {\n            return true;\n        }\n\n        const teamId = team.id;\n        if ((channel.team_id && channel.team_id !== teamId) || (teamMemberships && !teamMemberships[teamId])) {\n            return true;\n        }\n\n        return false;\n    }\n\n    return true;\n};\n\ntype RouteViewParams = {\n    team?: string;\n    identifier?: string;\n    postid?: string;\n};\n\ntype Props = {channelId: string} & RouteComponentProps<RouteViewParams>\n\nfunction makeMapStateToProps() {\n    return function mapStateToProps(state: GlobalState, ownProps: Props) {\n        const params = ownProps.match?.params;\n        const team = getTeamByName(state, params?.team || '');\n        let teammate;\n\n        const channel = getChannel(state, ownProps.channelId);\n        let lastViewedAt = state.views.channel.lastChannelViewTime[ownProps.channelId];\n        if (channel) {\n            if (channel.type === Constants.DM_CHANNEL && channel.teammate_id) {\n                teammate = getUser(state, channel.teammate_id);\n            }\n            lastViewedAt = channel.last_post_at ? lastViewedAt : channel.last_post_at;\n        }\n\n        const teamMemberships = getTeamMemberships(state);\n        const channelLoading = isChannelLoading(params!, channel, team, teammate, teamMemberships);\n        const unreadScrollPosition = getUnreadScrollPositionPreference(state);\n        return {\n            unreadScrollPosition,\n            lastViewedAt,\n            channelLoading,\n        };\n    };\n}\n\nexport default withRouter(connect(makeMapStateToProps)(PostView));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nconst onClickRefresh = () => {\n    location.reload();\n};\n\nconst TIME_TO_SHOW = 5000;\nconst TIME_TO_DISMISS = 2000;\n\ntype Props = {\n    updateWaitForLoader: (v: boolean) => void;\n}\n\nconst InputLoading = ({\n    updateWaitForLoader,\n}: Props) => {\n    const [showMessage, setShowMessage] = useState(false);\n\n    useEffect(() => {\n        let timeout = setTimeout(() => {\n            setShowMessage(true);\n            updateWaitForLoader(true);\n            timeout = setTimeout(() => {\n                updateWaitForLoader(false);\n            }, TIME_TO_DISMISS);\n        }, TIME_TO_SHOW);\n\n        return () => {\n            clearTimeout(timeout);\n            updateWaitForLoader(false);\n        };\n    }, []);\n\n    return (\n        <div\n            className='AdvancedTextEditor__skeleton'\n        >\n            {showMessage && (\n                <>\n                    <FormattedMessage\n                        id='center_panel.input.cannot_load_component'\n                        defaultMessage='Something went wrong while loading the component. Please wait a moment, or try reloading the app.'\n                    />\n                    <button\n                        className='btn btn-tertiary channel-archived__close-btn'\n                        onClick={onClickRefresh}\n                    >\n                        <FormattedMessage\n                            id='center_panel.reloadPage'\n                            defaultMessage='Reload'\n                        />\n                    </button>\n                </>\n            )}\n        </div>\n    );\n};\n\nexport default InputLoading;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {lazy} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport deferComponentRender from 'components/deferComponentRender';\nimport {DropOverlayIdCenterChannel} from 'components/file_upload_overlay/file_upload_overlay';\nimport PostView from 'components/post_view';\n\nimport WebSocketClient from 'client/web_websocket_client';\n\nimport InputLoading from './input_loading';\n\nimport type {PropsFromRedux} from './index';\n\nconst ChannelHeader = makeAsyncComponent('ChannelHeader', lazy(() => import('components/channel_header')));\nconst FileUploadOverlay = makeAsyncComponent('FileUploadOverlay', lazy(() => import('components/file_upload_overlay')));\nconst ChannelBookmarks = makeAsyncComponent('ChannelBookmarks', lazy(() => import('components/channel_bookmarks')));\nconst AdvancedCreatePost = makeAsyncComponent('AdvancedCreatePost', lazy(() => import('components/advanced_create_post')));\n\nexport type Props = PropsFromRedux & RouteComponentProps<{\n    postid?: string;\n}>;\n\ntype State = {\n    channelId: string;\n    url: string;\n    focusedPostId?: string;\n    deferredPostView: any;\n    waitForLoader: boolean;\n};\n\nexport default class ChannelView extends React.PureComponent<Props, State> {\n    public static createDeferredPostView = () => {\n        return deferComponentRender(\n            PostView,\n            <div\n                id='post-list'\n                className='a11y__region'\n                data-a11y-sort-order='1'\n                data-a11y-focus-child={true}\n                data-a11y-order-reversed={true}\n            />,\n        );\n    };\n\n    static getDerivedStateFromProps(props: Props, state: State) {\n        let updatedState = {};\n        const focusedPostId = props.match.params.postid;\n\n        if (props.match.url !== state.url && props.channelId !== state.channelId) {\n            updatedState = {deferredPostView: ChannelView.createDeferredPostView(), url: props.match.url, focusedPostId};\n        }\n\n        if (props.channelId !== state.channelId) {\n            updatedState = {...updatedState, channelId: props.channelId, focusedPostId};\n        }\n\n        if (focusedPostId && focusedPostId !== state.focusedPostId) {\n            updatedState = {...updatedState, focusedPostId};\n        }\n\n        if (Object.keys(updatedState).length) {\n            return updatedState;\n        }\n\n        return null;\n    }\n\n    channelViewRef: React.RefObject<HTMLDivElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            url: props.match.url,\n            channelId: props.channelId,\n            focusedPostId: props.match.params.postid,\n            deferredPostView: ChannelView.createDeferredPostView(),\n            waitForLoader: false,\n        };\n\n        this.channelViewRef = React.createRef();\n    }\n\n    onClickCloseChannel = () => {\n        this.props.goToLastViewedChannel();\n    };\n\n    onUpdateInputShowLoader = (v: boolean) => {\n        this.setState({waitForLoader: v});\n    };\n\n    componentDidUpdate(prevProps: Props) {\n        // TODO: debounce\n        if (prevProps.channelId !== this.props.channelId && this.props.enableWebSocketEventScope) {\n            WebSocketClient.updateActiveChannel(this.props.channelId);\n        }\n        if (prevProps.channelId !== this.props.channelId || prevProps.channelIsArchived !== this.props.channelIsArchived) {\n            if (this.props.channelIsArchived && !this.props.viewArchivedChannels) {\n                this.props.goToLastViewedChannel();\n            }\n        }\n    }\n\n    render() {\n        let createPost;\n        if (this.props.deactivatedChannel) {\n            createPost = (\n                <div\n                    className='post-create__container AdvancedTextEditor__ctr'\n                    id='post-create'\n                >\n                    <div\n                        className='channel-archived__message'\n                    >\n                        <FormattedMessage\n                            id='channelView.archivedChannelWithDeactivatedUser'\n                            defaultMessage='You are viewing an archived channel with a <b>deactivated user</b>. New messages cannot be posted.'\n                            values={{\n                                b: (chunks: string) => <b>{chunks}</b>,\n                            }}\n                        />\n                        <button\n                            className='btn btn-primary channel-archived__close-btn'\n                            onClick={this.onClickCloseChannel}\n                        >\n                            <FormattedMessage\n                                id='center_panel.archived.closeChannel'\n                                defaultMessage='Close Channel'\n                            />\n                        </button>\n                    </div>\n                </div>\n            );\n        } else if (this.props.channelIsArchived) {\n            createPost = (\n                <div\n                    className='post-create__container'\n                    id='post-create'\n                >\n                    <div\n                        id='channelArchivedMessage'\n                        className='channel-archived__message'\n                    >\n                        <FormattedMessage\n                            id='channelView.archivedChannel'\n                            defaultMessage='You are viewing an <b>archived channel</b>. New messages cannot be posted.'\n                            values={{\n                                b: (chunks: string) => <b>{chunks}</b>,\n                            }}\n                        />\n                        <button\n                            className='btn btn-primary channel-archived__close-btn'\n                            onClick={this.onClickCloseChannel}\n                        >\n                            <FormattedMessage\n                                id='center_panel.archived.closeChannel'\n                                defaultMessage='Close Channel'\n                            />\n                        </button>\n                    </div>\n                </div>\n            );\n        } else if (this.props.missingChannelRole || this.state.waitForLoader) {\n            createPost = <InputLoading updateWaitForLoader={this.onUpdateInputShowLoader}/>;\n        } else {\n            createPost = (\n                <div\n                    id='post-create'\n                    data-testid='post-create'\n                    className='post-create__container AdvancedTextEditor__ctr'\n                >\n                    <AdvancedCreatePost/>\n                </div>\n            );\n        }\n\n        const DeferredPostView = this.state.deferredPostView;\n\n        return (\n            <div\n                ref={this.channelViewRef}\n                id='app-content'\n                className='app__content'\n            >\n                <FileUploadOverlay\n                    overlayType='center'\n                    id={DropOverlayIdCenterChannel}\n                />\n                <ChannelHeader {...this.props}/>\n                {this.props.isChannelBookmarksEnabled && <ChannelBookmarks channelId={this.props.channelId}/>}\n                <DeferredPostView\n                    channelId={this.props.channelId}\n                    focusedPostId={this.state.focusedPostId}\n                />\n                {createPost}\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {\n    getCurrentChannel,\n    getMyChannelMembership,\n    isDeactivatedDirectChannel,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig, getLicense} from 'mattermost-redux/selectors/entities/general';\nimport {getRoles} from 'mattermost-redux/selectors/entities/roles_helpers';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {isFirstAdmin} from 'mattermost-redux/selectors/entities/users';\n\nimport {goToLastViewedChannel} from 'actions/views/channel';\n\nimport {getIsChannelBookmarksEnabled} from 'components/channel_bookmarks/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelView from './channel_view';\n\nfunction isMissingChannelRoles(state: GlobalState, channel?: Channel) {\n    const channelRoles = channel ? getMyChannelMembership(state, channel.id)?.roles || '' : '';\n    return !channelRoles.split(' ').some((v) => Boolean(getRoles(state)[v]));\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const channel = getCurrentChannel(state);\n\n    const config = getConfig(state);\n\n    const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n    const enableOnboardingFlow = config.EnableOnboardingFlow === 'true';\n    const enableWebSocketEventScope = config.FeatureFlagWebSocketEventScope === 'true';\n\n    const missingChannelRole = isMissingChannelRoles(state, channel);\n\n    return {\n        channelId: channel ? channel.id : '',\n        deactivatedChannel: channel ? isDeactivatedDirectChannel(state, channel.id) : false,\n        enableOnboardingFlow,\n        channelIsArchived: channel ? channel.delete_at !== 0 : false,\n        viewArchivedChannels,\n        isCloud: getLicense(state).Cloud === 'true',\n        teamUrl: getCurrentRelativeTeamUrl(state),\n        isFirstAdmin: isFirstAdmin(state),\n        enableWebSocketEventScope,\n        isChannelBookmarksEnabled: getIsChannelBookmarksEnabled(state),\n        missingChannelRole,\n    };\n}\n\nconst mapDispatchToProps = ({\n    goToLastViewedChannel,\n});\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default withRouter(connector(ChannelView));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport ChannelView from 'components/channel_view/index';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants from 'utils/constants';\n\nexport interface Match {\n    params: {\n        identifier: string;\n        team: string;\n        postid?: string;\n        path: string;\n    };\n    url: string;\n}\n\nexport type MatchAndHistory = Pick<Props, 'match' | 'history'>\n\ntype Props = {\n    match: Match;\n    actions: {\n        onChannelByIdentifierEnter: (props: MatchAndHistory) => any;\n    };\n    history: any;\n};\n\nexport default class ChannelIdentifierRouter extends React.PureComponent<Props> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            prevProps: props,\n        };\n    }\n\n    private replaceUrlTimeout!: NodeJS.Timeout;\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.match.params.team !== prevProps.match.params.team ||\n            this.props.match.params.identifier !== prevProps.match.params.identifier) {\n            clearTimeout(this.replaceUrlTimeout);\n            this.props.actions.onChannelByIdentifierEnter(this.props);\n            this.replaceUrlIfPermalink();\n        }\n    }\n    componentDidMount() {\n        this.props.actions.onChannelByIdentifierEnter(this.props);\n        this.replaceUrlIfPermalink();\n    }\n\n    componentWillUnmount() {\n        clearTimeout(this.replaceUrlTimeout);\n    }\n\n    replaceUrlIfPermalink = () => {\n        if (this.props.match.params.postid) {\n            this.replaceUrlTimeout = setTimeout(() => {\n                const channelUrl = this.props.match.url.split('/').slice(0, -1).join('/');\n                getHistory().replace(channelUrl);\n            }, Constants.PERMALINK_FADEOUT);\n        }\n    };\n\n    render() {\n        return <ChannelView/>;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {onChannelByIdentifierEnter} from './actions';\nimport ChannelIdentifierRouter from './channel_identifier_router';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            onChannelByIdentifierEnter,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(null, mapDispatchToProps)(ChannelIdentifierRouter));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {lazy} from 'react';\nimport {Route, Switch, Redirect} from 'react-router-dom';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport ChannelIdentifierRouter from 'components/channel_layout/channel_identifier_router';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {SCHEDULED_POST_URL_SUFFIX} from 'utils/constants';\nimport {IDENTIFIER_PATH_PATTERN, ID_PATH_PATTERN, TEAM_NAME_PATH_PATTERN} from 'utils/path';\n\nimport type {OwnProps, PropsFromRedux} from './index';\n\nconst ChannelHeaderMobile = makeAsyncComponent('ChannelHeaderMobile', lazy(() => import('components/channel_header_mobile')));\nconst GlobalThreads = makeAsyncComponent('GlobalThreads', lazy(() => import('components/threading/global_threads')),\n    (\n        <div className='app__content'>\n            <LoadingScreen/>\n        </div>\n    ),\n);\nconst Drafts = makeAsyncComponent('Drafts', lazy(() => import('components/drafts')),\n    (\n        <div className='app__content'>\n            <LoadingScreen/>\n        </div>\n    ),\n);\nconst PermalinkView = makeAsyncComponent('PermalinkView', lazy(() => import('components/permalink_view')));\nconst PlaybookRunner = makeAsyncComponent('PlaybookRunner', lazy(() => import('components/channel_layout/playbook_runner')));\n\ntype Props = PropsFromRedux & OwnProps;\n\ntype State = {\n    returnTo: string;\n    lastReturnTo: string;\n};\n\nexport default class CenterChannel extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            returnTo: '',\n            lastReturnTo: '',\n        };\n    }\n\n    static getDerivedStateFromProps(nextProps: Props, prevState: State) {\n        if (prevState.lastReturnTo !== nextProps.location.pathname && nextProps.location.pathname.includes('/pl/')) {\n            return {\n                lastReturnTo: nextProps.location.pathname,\n                returnTo: prevState.lastReturnTo,\n            };\n        }\n        return {lastReturnTo: nextProps.location.pathname};\n    }\n\n    async componentDidMount() {\n        const {actions} = this.props;\n        await actions.getProfiles();\n    }\n\n    render() {\n        const {lastChannelPath, isCollapsedThreadsEnabled, isMobileView} = this.props;\n        const url = this.props.match.url;\n\n        return (\n            <div\n                key='inner-wrap'\n                className={classNames('inner-wrap', 'channel__wrap', {\n                    'move--right': this.props.lhsOpen,\n                    'move--left': this.props.rhsOpen,\n                    'move--left-small': this.props.rhsMenuOpen,\n                })}\n            >\n                {isMobileView && (\n                    <>\n                        <div className='row header'>\n                            <div id='navbar_wrapper'>\n                                <ChannelHeaderMobile/>\n                            </div>\n                        </div>\n                    </>\n                )}\n                <div className='row main'>\n                    <Switch>\n                        <Route\n                            path={`${url}/pl/:postid(${ID_PATH_PATTERN})`}\n                            render={(props) => (\n                                <PermalinkView\n                                    {...props}\n                                    returnTo={this.state.returnTo}\n                                />\n                            )}\n                        />\n                        <Route\n                            path={`/:team(${TEAM_NAME_PATH_PATTERN})/:path(channels|messages)/:identifier(${IDENTIFIER_PATH_PATTERN})/:postid(${ID_PATH_PATTERN})?`}\n                            component={ChannelIdentifierRouter}\n                        />\n                        <Route\n                            path={`/:team(${TEAM_NAME_PATH_PATTERN})/_playbooks/:playbookId(${ID_PATH_PATTERN})/run`}\n                        >\n                            <PlaybookRunner/>\n                        </Route>\n                        {isCollapsedThreadsEnabled ? (\n                            <Route\n                                path={`/:team(${TEAM_NAME_PATH_PATTERN})/threads/:threadIdentifier(${ID_PATH_PATTERN})?`}\n                                component={GlobalThreads}\n                            />\n                        ) : null}\n                        <Route\n                            path={`/:team(${TEAM_NAME_PATH_PATTERN})/drafts`}\n                            component={Drafts}\n                        />\n                        <Route\n                            path={`/:team(${TEAM_NAME_PATH_PATTERN})/${SCHEDULED_POST_URL_SUFFIX}`}\n                            component={Drafts}\n                        />\n\n                        <Redirect to={lastChannelPath}/>\n                    </Switch>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getProfiles} from 'mattermost-redux/actions/users';\nimport {getRedirectChannelNameForTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getTeamByName} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {getIsLhsOpen} from 'selectors/lhs';\nimport {getLastViewedChannelNameByTeamName, getLastViewedTypeByTeamName, getPreviousTeamId, getPreviousTeamLastViewedType} from 'selectors/local_storage';\nimport {getIsRhsOpen, getIsRhsMenuOpen} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {PreviousViewedTypes} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport CenterChannel from './center_channel';\n\ntype Params = {\n    team: string;\n}\n\nexport type OwnProps = RouteComponentProps<Params>;\n\nconst mapStateToProps = (state: GlobalState, ownProps: OwnProps) => {\n    const lastViewedType = getLastViewedTypeByTeamName(state, ownProps.match.params.team);\n    let channelName = getLastViewedChannelNameByTeamName(state, ownProps.match.params.team);\n\n    const previousTeamId = getPreviousTeamId(state);\n    const team = getTeamByName(state, ownProps.match.params.team);\n\n    let previousTeamLastViewedType;\n\n    if (previousTeamId !== team?.id) {\n        previousTeamLastViewedType = getPreviousTeamLastViewedType(state);\n    }\n\n    if (!channelName) {\n        channelName = getRedirectChannelNameForTeam(state, team!.id);\n    }\n\n    let lastChannelPath;\n    if (isCollapsedThreadsEnabled(state) && (previousTeamLastViewedType === PreviousViewedTypes.THREADS || lastViewedType === PreviousViewedTypes.THREADS)) {\n        lastChannelPath = `${ownProps.match.url}/threads`;\n    } else {\n        lastChannelPath = `${ownProps.match.url}/channels/${channelName}`;\n    }\n\n    return {\n        lastChannelPath,\n        lhsOpen: getIsLhsOpen(state),\n        rhsOpen: getIsRhsOpen(state),\n        rhsMenuOpen: getIsRhsMenuOpen(state),\n        isCollapsedThreadsEnabled: isCollapsedThreadsEnabled(state),\n        currentUserId: getCurrentUserId(state),\n        isMobileView: getIsMobileView(state),\n    };\n};\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getProfiles,\n        }, dispatch),\n    };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default withRouter(connector(CenterChannel));\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect} from 'react';\nimport {useDispatch} from 'react-redux';\nimport {useHistory, useLocation} from 'react-router-dom';\n\nimport {openModal} from 'actions/views/modals';\n\nimport InvitationModal from 'components/invitation_modal';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\ninterface ActionMap {\n    [key: string]: ModalData<any>;\n}\n\nfunction QueryParamActionController() {\n    const location = useLocation();\n    const dispatch = useDispatch();\n    const history = useHistory();\n\n    const actionMap: ActionMap = {\n        open_invitation_modal: {\n            modalId: ModalIdentifiers.INVITATION,\n            dialogType: InvitationModal,\n        },\n    };\n\n    useEffect(() => {\n        const searchParams = new URLSearchParams(location.search);\n        const action = searchParams.get('action');\n\n        if (action && actionMap[action]) {\n            dispatch(openModal(actionMap[action]));\n\n            // Delete the action after it's been invoked so that it's not locked for subsequent refreshes\n            searchParams.delete('action');\n            history.replace({\n                search: searchParams.toString(),\n            });\n        }\n    }, [location, actionMap]);\n\n    return null;\n}\n\nexport default QueryParamActionController;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Dispatch} from 'redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {getChannelIdsForCurrentTeam} from 'mattermost-redux/selectors/entities/channels';\nimport {isChannelMuted} from 'mattermost-redux/utils/channel_utils';\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport type {GlobalState} from 'types/store';\n\nlet isFirstPreload = true;\n\nexport function trackPreloadedChannels(prefetchQueueObj: Record<string, string[]>) {\n    return (dispatch: Dispatch, getState: () => GlobalState) => {\n        const state = getState();\n        const channelIdsForTeam = getChannelIdsForCurrentTeam(state);\n\n        trackEvent('performance', 'preloaded_channels', {\n            numHigh: prefetchQueueObj[1]?.length || 0,\n            numMedium: prefetchQueueObj[2]?.length || 0,\n            numLow: prefetchQueueObj[3]?.length || 0,\n\n            numTotal: channelIdsForTeam.length,\n\n            // Tracks whether this is the first team that we've preloaded channels for in this session since\n            // the first preload will likely include DMs and GMs\n            isFirstPreload,\n        });\n\n        isFirstPreload = false;\n    };\n}\n\nenum Priority {\n    high = 1,\n    medium,\n    low\n}\n\nenum PrefetchLimits {\n    mentionMax = 10,\n    unreadMax = 20,\n}\n\n// function to return a queue obj with priotiy as key and array of channelIds as values.\n// high priority has channels with mentions\n// medium priority has channels with unreads\n// <10 unread channels. Prefetch everything.\n// 10-20 unread. Prefetch only mentions, capped to 10.\n// >20 unread. Don't prefetch anything.\nexport const prefetchQueue = memoizeResult((\n    unreadChannels: Channel[],\n    memberships: RelationOneToOne<Channel, ChannelMembership>,\n    collapsedThreads: boolean,\n) => {\n    const unreadChannelsCount = unreadChannels.length;\n    let result: {\n        1: string[];\n        2: string[];\n        3: string[];\n    } = {\n        [Priority.high]: [], // 1 being high priority requests\n        [Priority.medium]: [],\n        [Priority.low]: [], //TODO: add chanenls such as fav.\n    };\n    if (!unreadChannelsCount || unreadChannelsCount > PrefetchLimits.unreadMax) {\n        return result;\n    }\n    for (const channel of unreadChannels) {\n        const channelId = channel.id;\n        const membership = memberships[channelId];\n\n        if (unreadChannelsCount >= PrefetchLimits.mentionMax && result[Priority.high].length >= PrefetchLimits.mentionMax) {\n            break;\n        }\n\n        // TODO We check for muted channels 3 times here: getUnreadChannels checks it, this checks it, and the mark_unread\n        // check below is equivalent to checking if its muted.\n        if (membership && !isChannelMuted(membership)) {\n            if (collapsedThreads ? membership.mention_count_root : membership.mention_count) {\n                result = {\n                    ...result,\n                    [Priority.high]: [...result[Priority.high], channelId],\n                };\n            } else if (\n                membership.notify_props &&\n                membership.notify_props.mark_unread !== 'mention' &&\n                unreadChannelsCount < PrefetchLimits.mentionMax\n            ) {\n                result = {\n                    ...result,\n                    [Priority.medium]: [...result[Priority.medium], channelId],\n                };\n            }\n        }\n    }\n    return result;\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PQueue from 'p-queue';\nimport React from 'react';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {loadProfilesForSidebar} from 'actions/user_actions';\n\nimport {Constants} from 'utils/constants';\n\nconst queue = new PQueue({concurrency: 2});\n\ntype Props = {\n    currentChannelId: string;\n    prefetchQueueObj: Record<string, string[]>;\n    prefetchRequestStatus: Record<string, string>;\n\n    // Whether or not the categories in the sidebar have been loaded for the current team\n    sidebarLoaded: boolean;\n\n    unreadChannels: Channel[];\n\n    actions: {\n        prefetchChannelPosts: (channelId: string, delay?: number) => Promise<ActionResult>;\n        trackPreloadedChannels: (prefetchQueueObj: Record<string, string[]>) => void;\n    };\n}\n\n/*\n    This component is responsible for prefetching data. As of now component only fetches for channel posts based on the below set of rules.\n    * Priority order:\n        Fetches channel posts 2 at a time, with mentions followed channels with unreads.\n\n    * Conditions for prefetching posts:\n        On load of webapp\n        On socket reconnect or system comes from sleep\n        On new message in a channel where user has not visited in the present session\n        On addition of user to a channel/GM\n        On Team switch\n\n        In order to solve the above conditions the component looks for changes in selector unread channels.\n        if there is a change in unreads selector, then component clears existing queue as it can be obselete\n        i.e there can be new mentions and we need to prioritise instead of unreads so, contructs a new queue\n        with dispacthes of unreads posts for channels which do not have prefetched requests.\n\n    * other changes:\n        Adds current channel posts requests to be dispatched as soon as it is set in redux state instead of dispatching it from actions down the hierarchy. Otherwise couple of prefetching requests are sent before the postlist makes a request for posts.\n        Add a jitter(0-1sec) for delaying post requests in case of a new message in open/private channels. This is to prevent a case when all clients request messages when new post is made in a channel with thousands of users.\n*/\nexport default class DataPrefetch extends React.PureComponent<Props> {\n    private prefetchTimeout?: number;\n\n    async componentDidUpdate(prevProps: Props) {\n        const {currentChannelId, prefetchQueueObj, sidebarLoaded} = this.props;\n        if (sidebarLoaded && !prevProps.sidebarLoaded) {\n            loadProfilesForSidebar();\n        }\n\n        if (currentChannelId && sidebarLoaded && (!prevProps.currentChannelId || !prevProps.sidebarLoaded)) {\n            queue.add(async () => this.prefetchPosts(currentChannelId));\n            this.prefetchData();\n        } else if (prevProps.prefetchQueueObj !== prefetchQueueObj) {\n            clearTimeout(this.prefetchTimeout);\n            await queue.clear();\n            this.prefetchData();\n        }\n\n        if (currentChannelId && sidebarLoaded && (!prevProps.currentChannelId || !prevProps.sidebarLoaded)) {\n            this.props.actions.trackPreloadedChannels(prefetchQueueObj);\n        }\n    }\n\n    public prefetchPosts = (channelId: string) => {\n        let delay;\n        const channel = this.props.unreadChannels.find((unreadChannel) => channelId === unreadChannel.id);\n        if (channel && (channel.type === Constants.PRIVATE_CHANNEL || channel.type === Constants.OPEN_CHANNEL)) {\n            const isLatestPostInLastMin = (Date.now() - channel.last_post_at) <= 1000;\n            if (isLatestPostInLastMin) {\n                delay = Math.random() * 1000; // 1ms - 1000ms random wait to not choke server\n            }\n        }\n        return this.props.actions.prefetchChannelPosts(channelId, delay);\n    };\n\n    private prefetchData = () => {\n        const {prefetchRequestStatus, prefetchQueueObj} = this.props;\n        for (const priority in prefetchQueueObj) {\n            if (!Object.hasOwn(prefetchQueueObj, priority)) {\n                continue;\n            }\n\n            const priorityQueue = prefetchQueueObj[priority];\n            for (const channelId of priorityQueue) {\n                if (!Object.hasOwn(prefetchRequestStatus, channelId)) {\n                    queue.add(async () => this.prefetchPosts(channelId));\n                }\n            }\n        }\n    };\n\n    render() {\n        return null;\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getCurrentChannelId, getUnreadChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getMyChannelMemberships} from 'mattermost-redux/selectors/entities/common';\nimport {isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {prefetchChannelPosts} from 'actions/views/channel';\nimport {getCategoriesForCurrentTeam} from 'selectors/views/channel_sidebar';\n\nimport type {GlobalState} from 'types/store';\n\nimport {prefetchQueue, trackPreloadedChannels} from './actions';\nimport DataPrefetch from './data_prefetch';\n\nfunction isSidebarLoaded(state: GlobalState) {\n    return getCategoriesForCurrentTeam(state).length > 0;\n}\n\nfunction mapStateToProps(state: GlobalState) {\n    const lastUnreadChannel = state.views.channel.lastUnreadChannel;\n    const memberships = getMyChannelMemberships(state);\n    const unreadChannels = getUnreadChannels(state, lastUnreadChannel);\n    const prefetchQueueObj = prefetchQueue(unreadChannels, memberships, isCollapsedThreadsEnabled(state));\n    const prefetchRequestStatus = state.views.channel.channelPrefetchStatus;\n\n    return {\n        currentChannelId: getCurrentChannelId(state),\n        prefetchQueueObj,\n        prefetchRequestStatus,\n        sidebarLoaded: isSidebarLoaded(state),\n        unreadChannels,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            prefetchChannelPosts,\n            trackPreloadedChannels,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DataPrefetch);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {HTMLAttributes} from 'react';\nimport React, {useRef} from 'react';\n\nimport {DEFAULT_LHS_WIDTH, CssVarKeyForResizable, ResizeDirection} from '../constants';\nimport ResizableDivider from '../resizable_divider';\n\ninterface Props extends HTMLAttributes<'div'> {\n    children: React.ReactNode;\n}\n\nfunction ResizableLhs({\n    children,\n    id,\n    className,\n}: Props) {\n    const containerRef = useRef<HTMLDivElement>(null);\n\n    return (\n        <div\n            id={id}\n            className={className}\n            ref={containerRef}\n        >\n            {children}\n            <ResizableDivider\n                name={'lhsResizeHandle'}\n                globalCssVar={CssVarKeyForResizable.LHS}\n                defaultWidth={DEFAULT_LHS_WIDTH}\n                dir={ResizeDirection.LEFT}\n                containerRef={containerRef}\n            />\n        </div>\n    );\n}\n\nexport default ResizableLhs;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {GlobalState} from 'types/store';\n\nexport function isAddChannelDropdownOpen(state: GlobalState) {\n    return state.views.addChannelDropdown.isOpen;\n}\n\nexport function isAddChannelCtaDropdownOpen(state: GlobalState) {\n    return state.views.addChannelCtaDropdown.isOpen;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {CreateAndJoinChannelsTour, InvitePeopleTour} from 'components/tours/onboarding_tour';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\ntype Props = {\n    canCreateChannel: boolean;\n    canJoinPublicChannel: boolean;\n    userGroupsEnabled: boolean;\n    showMoreChannelsModal: () => void;\n    showCreateUserGroupModal: () => void;\n    invitePeopleModal: () => void;\n    showNewChannelModal: () => void;\n    showCreateCategoryModal: () => void;\n    handleOpenDirectMessagesModal: (e: Event) => void;\n    unreadFilterEnabled: boolean;\n    showCreateTutorialTip: boolean;\n    showInviteTutorialTip: boolean;\n    isAddChannelOpen: boolean;\n    openAddChannelOpen: (open: boolean) => void;\n    canCreateCustomGroups: boolean;\n};\n\nconst AddChannelDropdown = ({\n    canCreateChannel,\n    canJoinPublicChannel,\n    showMoreChannelsModal,\n    showCreateUserGroupModal,\n    invitePeopleModal,\n    showNewChannelModal,\n    showCreateCategoryModal,\n    handleOpenDirectMessagesModal,\n    unreadFilterEnabled,\n    showCreateTutorialTip,\n    showInviteTutorialTip,\n    isAddChannelOpen,\n    openAddChannelOpen,\n    canCreateCustomGroups,\n}: Props) => {\n    const intl = useIntl();\n\n    const renderDropdownItems = () => {\n        const invitePeople = (\n            <Menu.Group>\n                <Menu.ItemAction\n                    id='invitePeople'\n                    onClick={invitePeopleModal}\n                    icon={<i className='icon-account-plus-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.invitePeople', defaultMessage: 'Invite people'})}\n                    extraText={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.invitePeopleExtraText', defaultMessage: 'Add people to the team'})}\n                />\n                {showInviteTutorialTip && <InvitePeopleTour/>}\n            </Menu.Group>\n        );\n\n        let joinPublicChannel;\n        if (canJoinPublicChannel) {\n            joinPublicChannel = (\n                <Menu.ItemAction\n                    id='showMoreChannels'\n                    onClick={showMoreChannelsModal}\n                    icon={<i className='icon-globe'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.browseChannels', defaultMessage: 'Browse channels'})}\n                />\n            );\n        }\n\n        let createChannel;\n        if (canCreateChannel) {\n            createChannel = (\n                <Menu.ItemAction\n                    id='showNewChannel'\n                    onClick={showNewChannelModal}\n                    icon={<i className='icon-plus'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.createNewChannel', defaultMessage: 'Create new channel'})}\n                />\n            );\n        }\n\n        let createCategory;\n        if (!unreadFilterEnabled) {\n            createCategory = (\n                <Menu.Group>\n                    <Menu.ItemAction\n                        id='createCategory'\n                        onClick={showCreateCategoryModal}\n                        icon={<i className='icon-folder-plus-outline'/>}\n                        text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.createCategory', defaultMessage: 'Create new category'})}\n                    />\n                </Menu.Group>);\n        }\n\n        const createDirectMessage = (\n            <Menu.ItemAction\n                id={'openDirectMessageMenuItem'}\n                onClick={handleOpenDirectMessagesModal}\n                icon={<i className='icon-account-outline'/>}\n                text={intl.formatMessage({id: 'sidebar.openDirectMessage', defaultMessage: 'Open a direct message'})}\n            />\n        );\n\n        let createUserGroup;\n        if (canCreateCustomGroups) {\n            createUserGroup = (\n                <Menu.ItemAction\n                    id={'createUserGroup'}\n                    onClick={showCreateUserGroupModal}\n                    icon={<i className='icon-account-multiple-plus-outline'/>}\n                    text={intl.formatMessage({id: 'sidebar.createUserGroup', defaultMessage: 'Create New User Group'})}\n                />\n            );\n        }\n\n        return (\n            <>\n                <Menu.Group>\n                    {createChannel}\n                    {joinPublicChannel}\n                    {createDirectMessage}\n                    {showCreateTutorialTip && <CreateAndJoinChannelsTour/>}\n                    {createUserGroup}\n                </Menu.Group>\n                {createCategory}\n                {invitePeople}\n            </>\n        );\n    };\n\n    const trackOpen = (opened: boolean) => {\n        openAddChannelOpen(opened);\n        if (opened) {\n            trackEvent('ui', 'ui_add_channel_dropdown_opened');\n        }\n    };\n\n    if (!(canCreateChannel || canJoinPublicChannel)) {\n        return null;\n    }\n\n    return (\n        <MenuWrapper\n            className='AddChannelDropdown'\n            onToggle={trackOpen}\n            open={isAddChannelOpen}\n        >\n            <WithTooltip\n                title={intl.formatMessage({\n                    id: 'sidebar_left.add_channel_dropdown.browseOrCreateChannels',\n                    defaultMessage: 'Browse or create channels',\n                })}\n            >\n                <button\n                    className={'AddChannelDropdown_dropdownButton'}\n                    aria-label={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                >\n                    <i className='icon-plus'/>\n                </button>\n            </WithTooltip>\n            <Menu\n                id='AddChannelDropdown'\n                ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n            >\n                {renderDropdownItems()}\n            </Menu>\n        </MenuWrapper>\n    );\n};\n\nexport default AddChannelDropdown;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport Flex from '@mattermost/compass-components/utilities/layout/Flex'; // eslint-disable-line no-restricted-imports\n\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setAddChannelDropdown} from 'actions/views/add_channel_dropdown';\nimport {isAddChannelDropdownOpen} from 'selectors/views/add_channel_dropdown';\n\nimport useGetUsageDeltas from 'components/common/hooks/useGetUsageDeltas';\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\nimport MainMenu from 'components/main_menu';\nimport AddChannelDropdown from 'components/sidebar/add_channel_dropdown';\nimport {OnboardingTourSteps} from 'components/tours';\nimport {useShowOnboardingTutorialStep} from 'components/tours/onboarding_tour';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport './sidebar_header.scss';\n\nimport type {GlobalState} from 'types/store';\n\ntype SidebarHeaderContainerProps = {\n    id?: string;\n}\n\nconst SidebarHeaderContainer = styled(Flex).attrs(() => ({\n    element: 'header',\n    row: true,\n    justify: 'space-between',\n    alignment: 'center',\n}))<SidebarHeaderContainerProps>`\n    height: 55px;\n    padding: 0 16px;\n    gap: 8px;\n\n    .dropdown-menu {\n        position: absolute;\n        transform: translate(0, 0);\n        margin-left: 0;\n        min-width: 210px;\n    }\n\n    #SidebarContainer & .AddChannelDropdown_dropdownButton {\n        border-radius: 16px;\n        font-size: 18px;\n    }\n`;\n\nexport type Props = {\n    showNewChannelModal: () => void;\n    showMoreChannelsModal: () => void;\n    showCreateUserGroupModal: () => void;\n    invitePeopleModal: () => void;\n    showCreateCategoryModal: () => void;\n    canCreateChannel: boolean;\n    canJoinPublicChannel: boolean;\n    handleOpenDirectMessagesModal: (e: Event) => void;\n    unreadFilterEnabled: boolean;\n    userGroupsEnabled: boolean;\n    canCreateCustomGroups: boolean;\n}\n\nconst SidebarHeader = (props: Props) => {\n    const dispatch = useDispatch();\n    const currentTeam = useSelector((state: GlobalState) => getCurrentTeam(state));\n    const showCreateTutorialTip = useShowOnboardingTutorialStep(OnboardingTourSteps.CREATE_AND_JOIN_CHANNELS);\n    const showInviteTutorialTip = useShowOnboardingTutorialStep(OnboardingTourSteps.INVITE_PEOPLE);\n    const usageDeltas = useGetUsageDeltas();\n    const isAddChannelOpen = useSelector(isAddChannelDropdownOpen);\n    const theme = useSelector(getTheme);\n    const openAddChannelOpen = useCallback((open: boolean) => {\n        dispatch(setAddChannelDropdown(open));\n    }, []);\n\n    const [menuToggled, setMenuToggled] = useState(false);\n\n    const handleMenuToggle = () => {\n        setMenuToggled(!menuToggled);\n    };\n\n    if (!currentTeam) {\n        return null;\n    }\n\n    return (\n        <CompassThemeProvider theme={theme}>\n            <SidebarHeaderContainer\n                id={'sidebar-header-container'}\n            >\n                <MenuWrapper\n                    onToggle={handleMenuToggle}\n                    className='SidebarHeaderMenuWrapper test-team-header'\n                >\n                    <WithTooltip\n                        title={currentTeam.description ? currentTeam.description : currentTeam.display_name}\n                    >\n                        <h1 className='sidebarHeader'>\n                            <button className='style--none sidebar-header'>\n                                <span className='title'>{currentTeam.display_name}</span>\n                                <i className='icon icon-chevron-down'/>\n                            </button>\n                        </h1>\n                    </WithTooltip>\n                    <MainMenu\n                        id='sidebarDropdownMenu'\n                        usageDeltaTeams={usageDeltas.teams.active}\n                    />\n                </MenuWrapper>\n                <AddChannelDropdown\n                    showNewChannelModal={props.showNewChannelModal}\n                    showMoreChannelsModal={props.showMoreChannelsModal}\n                    invitePeopleModal={props.invitePeopleModal}\n                    showCreateCategoryModal={props.showCreateCategoryModal}\n                    canCreateChannel={props.canCreateChannel}\n                    canJoinPublicChannel={props.canJoinPublicChannel}\n                    handleOpenDirectMessagesModal={props.handleOpenDirectMessagesModal}\n                    unreadFilterEnabled={props.unreadFilterEnabled}\n                    showCreateTutorialTip={showCreateTutorialTip}\n                    showInviteTutorialTip={showInviteTutorialTip}\n                    isAddChannelOpen={isAddChannelOpen}\n                    openAddChannelOpen={openAddChannelOpen}\n                    canCreateCustomGroups={props.canCreateCustomGroups}\n                    showCreateUserGroupModal={props.showCreateUserGroupModal}\n                    userGroupsEnabled={props.userGroupsEnabled}\n                />\n            </SidebarHeaderContainer>\n        </CompassThemeProvider>\n    );\n};\n\nexport default SidebarHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport SidebarHeader from './sidebar_header';\nexport default SidebarHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport NoResultsIndicator from 'components/no_results_indicator/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\nimport SuggestionBox from 'components/suggestion/suggestion_box';\nimport type SuggestionBoxComponent from 'components/suggestion/suggestion_box/suggestion_box';\nimport SuggestionList from 'components/suggestion/suggestion_list';\nimport SwitchChannelProvider from 'components/suggestion/switch_channel_provider';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants, {RHSStates} from 'utils/constants';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils';\n\nimport type {RhsState} from 'types/store/rhs';\n\nconst CHANNEL_MODE = 'channel';\n\ntype ProviderSuggestions = {\n    matchedPretext: any;\n    terms: string[];\n    items: any[];\n    component: React.ReactNode;\n}\n\nexport type Props = {\n\n    /**\n     * The function called to immediately hide the modal\n     */\n    onExited: () => void;\n\n    isMobileView: boolean;\n    rhsState?: RhsState;\n    rhsOpen?: boolean;\n\n    actions: {\n        joinChannelById: (channelId: string) => Promise<ActionResult>;\n        switchToChannel: (channel: Channel) => Promise<ActionResult>;\n        closeRightHandSide: () => void;\n    };\n}\n\ntype State = {\n    text: string;\n    mode: string|null;\n    hasSuggestions: boolean;\n    shouldShowLoadingSpinner: boolean;\n    pretext: string;\n}\n\nexport default class QuickSwitchModal extends React.PureComponent<Props, State> {\n    private channelProviders: SwitchChannelProvider[];\n    private switchBox: SuggestionBoxComponent|null;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.channelProviders = [new SwitchChannelProvider()];\n\n        this.switchBox = null;\n\n        this.state = {\n            text: '',\n            mode: CHANNEL_MODE,\n            hasSuggestions: true,\n            shouldShowLoadingSpinner: true,\n            pretext: '',\n        };\n    }\n\n    private focusTextbox = (): void => {\n        if (this.switchBox === null) {\n            return;\n        }\n\n        const textbox = this.switchBox.getTextbox();\n        if (document.activeElement !== textbox) {\n            textbox.focus();\n            Utils.placeCaretAtEnd(textbox);\n        }\n    };\n\n    private setSwitchBoxRef = (input: SuggestionBoxComponent): void => {\n        this.switchBox = input;\n        this.focusTextbox();\n    };\n\n    private hideOnSelect = (): void => {\n        this.focusPostTextbox();\n        this.setState({\n            text: '',\n        });\n        this.props.onExited();\n    };\n\n    private focusPostTextbox = (): void => {\n        if (!UserAgent.isMobile()) {\n            setTimeout(() => {\n                const textbox = document.querySelector('#post_textbox') as HTMLElement;\n                if (textbox) {\n                    textbox.focus();\n                }\n            });\n        }\n    };\n\n    private hideOnCancel = () => {\n        this.props.onExited?.();\n        setTimeout(() => {\n            const modalButton = document.querySelector('.SidebarChannelNavigator_jumpToButton') as HTMLElement;\n            if (modalButton) {\n                modalButton.focus();\n            }\n        });\n    };\n\n    private onChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n        this.setState({text: e.target.value, shouldShowLoadingSpinner: true});\n    };\n\n    public handleSubmit = async (selected?: any): Promise<void> => {\n        if (!selected) {\n            return;\n        }\n\n        if (this.props.rhsOpen && this.props.rhsState === RHSStates.EDIT_HISTORY) {\n            this.props.actions.closeRightHandSide();\n        }\n\n        if (this.state.mode === CHANNEL_MODE) {\n            const {joinChannelById, switchToChannel} = this.props.actions;\n            const selectedChannel = selected.channel;\n\n            if (selected.type === Constants.MENTION_MORE_CHANNELS && selectedChannel.type === Constants.OPEN_CHANNEL) {\n                await joinChannelById(selectedChannel.id);\n            }\n            switchToChannel(selectedChannel).then((result: ActionResult) => {\n                if ('data' in result) {\n                    this.hideOnSelect();\n                }\n            });\n        } else {\n            getHistory().push('/' + selected.name);\n            this.hideOnSelect();\n        }\n    };\n\n    private handleSuggestionsReceived = (suggestions: ProviderSuggestions): void => {\n        const loadingPropPresent = suggestions.items.some((item: any) => item.loading);\n        this.setState({\n            shouldShowLoadingSpinner: loadingPropPresent,\n            pretext: suggestions.matchedPretext,\n            hasSuggestions: suggestions.items.length > 0,\n        });\n    };\n\n    public render = (): JSX.Element => {\n        const providers: SwitchChannelProvider[] = this.channelProviders;\n\n        const header = (\n            <h1 id='quickSwitchHeader'>\n                <FormattedMessage\n                    id='quick_switch_modal.switchChannels'\n                    defaultMessage='Find Channels'\n                />\n            </h1>\n        );\n\n        let help;\n        if (this.props.isMobileView) {\n            help = (\n                <FormattedMessage\n                    id='quick_switch_modal.help_mobile'\n                    defaultMessage='Type to find a channel.'\n                />\n            );\n        } else {\n            help = (\n                <FormattedMessage\n                    id='quickSwitchModal.help_no_team'\n                    defaultMessage='Type to find a channel. Use <b>UP/DOWN</b> to browse, <b>ENTER</b> to select, <b>ESC</b> to dismiss.'\n                    values={{\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n            );\n        }\n\n        return (\n            <Modal\n                dialogClassName='a11y__modal channel-switcher'\n                show={true}\n                onHide={this.hideOnCancel}\n                enforceFocus={false}\n                restoreFocus={false}\n                role='none'\n                aria-labelledby='quickSwitchHeader'\n                aria-describedby='quickSwitchHeaderWithHint'\n                animation={false}\n            >\n                <Modal.Header\n                    className='modal-header'\n                    id='quickSwitchModalLabel'\n                    closeButton={true}\n                >\n                    <div\n                        className='channel-switcher__header'\n                        id='quickSwitchHeaderWithHint'\n                    >\n                        {header}\n                        <div\n                            className='channel-switcher__hint'\n                            id='quickSwitchHint'\n                        >\n                            {help}\n                        </div>\n                    </div>\n                </Modal.Header>\n                <Modal.Body>\n                    <div className='channel-switcher__suggestion-box'>\n                        <i className='icon icon-magnify icon-16'/>\n                        <SuggestionBox\n                            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n                            // @ts-ignore\n                            ref={this.setSwitchBoxRef}\n                            id='quickSwitchInput'\n                            aria-label={Utils.localizeMessage({id: 'quick_switch_modal.input', defaultMessage: 'quick switch input'})}\n                            className='form-control focused'\n                            onChange={this.onChange}\n                            value={this.state.text}\n                            onItemSelected={this.handleSubmit}\n                            listComponent={SuggestionList}\n                            listPosition='bottom'\n                            maxLength='64'\n                            providers={providers}\n                            completeOnTab={false}\n                            spellCheck='false'\n                            delayInputUpdate={true}\n                            openWhenEmpty={true}\n                            onSuggestionsReceived={this.handleSuggestionsReceived}\n                            forceSuggestionsWhenBlur={true}\n                            renderDividers={[Constants.MENTION_UNREAD, Constants.MENTION_RECENT_CHANNELS]}\n                            shouldSearchCompleteText={true}\n                        />\n                        {!this.state.shouldShowLoadingSpinner && !this.state.hasSuggestions && this.state.text &&\n                            <NoResultsIndicator\n                                variant={NoResultsVariant.Search}\n                                titleValues={{channelName: `${this.state.pretext}`}}\n                            />\n                        }\n                    </div>\n                </Modal.Body>\n            </Modal>\n        );\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {joinChannelById, switchToChannel} from 'actions/views/channel';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport QuickSwitchModal from './quick_switch_modal';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        isMobileView: getIsMobileView(state),\n        rhsState: getRhsState(state),\n        rhsOpen: getIsRhsOpen(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            joinChannelById,\n            switchToChannel,\n            closeRightHandSide,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(QuickSwitchModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {defineMessages, injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport WithTooltip from 'components/with_tooltip';\nimport {ShortcutKeys} from 'components/with_tooltip/tooltip_shortcut';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\n\nconst messages = defineMessages({\n    disableTooltip: {\n        id: 'sidebar_left.channel_filter.showAllChannels',\n        defaultMessage: 'Show all channels',\n    },\n    enableTooltip: {\n        id: 'sidebar_left.channel_filter.filterByUnread',\n        defaultMessage: 'Filter by unread',\n    },\n});\n\nconst shortcut = {\n    default: [ShortcutKeys.ctrl, ShortcutKeys.shift, 'U'],\n    mac: [ShortcutKeys.cmd, ShortcutKeys.shift, 'U'],\n};\n\ntype Props = {\n    intl: IntlShape;\n    unreadFilterEnabled: boolean;\n    actions: {\n        setUnreadFilterEnabled: (enabled: boolean) => void;\n    };\n};\n\nexport class ChannelFilter extends React.PureComponent<Props> {\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleUnreadFilterKeyPress);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleUnreadFilterKeyPress);\n    }\n\n    handleUnreadFilterClick = (e?: React.MouseEvent) => {\n        e?.preventDefault();\n        e?.stopPropagation();\n        this.toggleUnreadFilter();\n    };\n\n    handleUnreadFilterKeyPress = (e: KeyboardEvent) => {\n        if (Keyboard.cmdOrCtrlPressed(e) && e.shiftKey && Keyboard.isKeyPressed(e, Constants.KeyCodes.U)) {\n            e.preventDefault();\n            e.stopPropagation();\n            this.toggleUnreadFilter();\n        }\n    };\n\n    toggleUnreadFilter = () => {\n        const {unreadFilterEnabled} = this.props;\n\n        if (unreadFilterEnabled) {\n            trackEvent('ui', 'ui_sidebar_unread_filter_disabled');\n        } else {\n            trackEvent('ui', 'ui_sidebar_unread_filter_enabled');\n        }\n\n        this.props.actions.setUnreadFilterEnabled(!unreadFilterEnabled);\n    };\n\n    render() {\n        const {intl, unreadFilterEnabled} = this.props;\n\n        const unreadsAriaLabel = intl.formatMessage({id: 'sidebar_left.channel_filter.filterUnreadAria', defaultMessage: 'unreads filter'});\n\n        return (\n            <div className='SidebarFilters'>\n                <WithTooltip\n                    title={unreadFilterEnabled ? messages.disableTooltip : messages.enableTooltip}\n                    shortcut={shortcut}\n                >\n                    <a\n                        href='#'\n                        className={classNames('SidebarFilters_filterButton', {\n                            active: unreadFilterEnabled,\n                        })}\n                        onClick={this.toggleUnreadFilter}\n                        aria-label={unreadsAriaLabel}\n                    >\n                        <i className='icon icon-filter-variant'/>\n                    </a>\n                </WithTooltip>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(ChannelFilter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getMyTeams} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setUnreadFilterEnabled} from 'actions/views/channel_sidebar';\nimport {isUnreadFilterEnabled} from 'selectors/views/channel_sidebar';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelFilter from './channel_filter';\n\nfunction mapStateToProps(state: GlobalState) {\n    const teams = getMyTeams(state);\n\n    return {\n        hasMultipleTeams: teams && teams.length > 1,\n        unreadFilterEnabled: isUnreadFilterEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            setUnreadFilterEnabled,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelFilter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport QuickSwitchModal from 'components/quick_switch_modal';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport * as UserAgent from 'utils/user_agent';\nimport * as Utils from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\n\nimport ChannelFilter from '../channel_filter';\n\nexport type Props = {\n    showUnreadsCategory: boolean;\n    isQuickSwitcherOpen: boolean;\n    actions: {\n        openModal: <P>(modalData: ModalData<P>) => void;\n        closeModal: (modalId: string) => void;\n    };\n};\n\nexport default class ChannelNavigator extends React.PureComponent<Props> {\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleShortcut);\n        document.addEventListener('keydown', this.handleQuickSwitchKeyPress);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleShortcut);\n        document.removeEventListener('keydown', this.handleQuickSwitchKeyPress);\n    }\n\n    openQuickSwitcher = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.preventDefault();\n\n        trackEvent('ui', 'ui_sidebar_open_channel_switcher_v2');\n\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.QUICK_SWITCH,\n            dialogType: QuickSwitchModal,\n        });\n    };\n\n    handleShortcut = (e: KeyboardEvent) => {\n        const {actions: {closeModal}} = this.props;\n\n        if (Keyboard.cmdOrCtrlPressed(e) && e.shiftKey) {\n            if (Keyboard.isKeyPressed(e, Constants.KeyCodes.M)) {\n                e.preventDefault();\n                closeModal(ModalIdentifiers.QUICK_SWITCH);\n            }\n            if (Keyboard.isKeyPressed(e, Constants.KeyCodes.L)) {\n                // just close the modal if it's open, but let someone else handle the shortcut\n                closeModal(ModalIdentifiers.QUICK_SWITCH);\n            }\n        }\n    };\n\n    handleQuickSwitchKeyPress = (e: KeyboardEvent) => {\n        if (Keyboard.cmdOrCtrlPressed(e) && !e.shiftKey && Keyboard.isKeyPressed(e, Constants.KeyCodes.K)) {\n            if (!e.altKey && !Utils.isTextSelectedInPostOrReply(e)) {\n                e.preventDefault();\n                this.toggleQuickSwitchModal();\n            }\n        }\n    };\n\n    toggleQuickSwitchModal = () => {\n        const {isQuickSwitcherOpen, actions: {openModal, closeModal}} = this.props;\n\n        if (isQuickSwitcherOpen) {\n            closeModal(ModalIdentifiers.QUICK_SWITCH);\n        } else {\n            openModal({\n                modalId: ModalIdentifiers.QUICK_SWITCH,\n                dialogType: QuickSwitchModal,\n            });\n        }\n    };\n\n    render() {\n        return (\n            <div className={'SidebarChannelNavigator webapp'}>\n                {!this.props.showUnreadsCategory && <ChannelFilter/>}\n                <button\n                    className={'SidebarChannelNavigator_jumpToButton'}\n                    onClick={this.openQuickSwitcher}\n                    aria-label={Utils.localizeMessage({id: 'sidebar_left.channel_navigator.channelSwitcherLabel', defaultMessage: 'Channel Switcher'})}\n                    aria-haspopup='dialog'\n                    data-testid='SidebarChannelNavigatorButton'\n                >\n                    <i className='icon icon-magnify'/>\n                    <FormattedMessage\n                        id='sidebar_left.channel_navigator.jumpTo'\n                        defaultMessage='Find channel'\n                    />\n                    <div className={'SidebarChannelNavigator_shortcutText'}>\n                        {`${UserAgent.isMac() ? '⌘' : 'Ctrl+'}K`}\n                    </div>\n                </button>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {shouldShowUnreadsCategory} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openModal, closeModal} from 'actions/views/modals';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport ChannelNavigator from './channel_navigator';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        showUnreadsCategory: shouldShowUnreadsCategory(state),\n        isQuickSwitcherOpen: isModalOpen(state, ModalIdentifiers.QUICK_SWITCH),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n            closeModal,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ChannelNavigator);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\n\nimport '../category_modal.scss';\n\ntype Props = {\n    category: ChannelCategory;\n    onExited: () => void;\n    actions: {\n        deleteCategory: (categoryId: string) => void;\n    };\n};\n\nexport default function DeleteCategoryModal(props: Props) {\n    const intl = useIntl();\n\n    const handleConfirm = useCallback(() => {\n        props.actions.deleteCategory(props.category.id);\n    }, [props.actions.deleteCategory, props.category]);\n\n    return (\n        <GenericModal\n            compassDesign={true}\n            ariaLabel={intl.formatMessage({id: 'delete_category_modal.deleteCategory', defaultMessage: 'Delete this category?'})}\n            onExited={props.onExited}\n            modalHeaderText={(\n                <FormattedMessage\n                    id='delete_category_modal.deleteCategory'\n                    defaultMessage='Delete this category?'\n                />\n            )}\n            handleCancel={props.onExited}\n            handleConfirm={handleConfirm}\n            confirmButtonText={(\n                <FormattedMessage\n                    id='delete_category_modal.delete'\n                    defaultMessage='Delete'\n                />\n            )}\n            confirmButtonClassName={'delete'}\n        >\n            <span className='delete-category__helpText'>\n                <FormattedMessage\n                    id='delete_category_modal.helpText'\n                    defaultMessage=\"Channels in <b>{category_name}</b> will move back to the Channels and Direct messages categories. You're not removed from any channels.\"\n                    values={{\n                        category_name: props.category.display_name,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n            </span>\n        </GenericModal>\n    );\n}\n\n// TODO MM-52680 These strings are properly defined in @mattermost/components, but the i18n tooling currently can't\n// find them there, so we've had to redefine them here\ndefineMessages({\n    cancel: {\n        id: 'generic_modal.cancel',\n        defaultMessage: 'Cancel',\n    },\n    confirm: {\n        id: 'generic_modal.confirm',\n        defaultMessage: 'Confirm',\n    },\n    paginationCount: {\n        id: 'footer_pagination.count',\n        defaultMessage: 'Showing {startCount, number}-{endCount, number} of {total, number}',\n    },\n    paginationNext: {\n        id: 'footer_pagination.next',\n        defaultMessage: 'Next',\n    },\n    paginationPrev: {\n        id: 'footer_pagination.prev',\n        defaultMessage: 'Previous',\n    },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {deleteCategory} from 'mattermost-redux/actions/channel_categories';\n\nimport DeleteCategoryModal from './delete_category_modal';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            deleteCategory,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(DeleteCategoryModal);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useMemo} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {\n    BellOutlineIcon,\n    TrashCanOutlineIcon,\n    PencilOutlineIcon,\n    FormatListBulletedIcon,\n    SortAlphabeticalAscendingIcon,\n    ClockOutlineIcon,\n    ChevronRightIcon,\n    CheckIcon,\n} from '@mattermost/compass-icons/components';\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\nimport {CategorySorting} from '@mattermost/types/channel_categories';\n\nimport {setCategoryMuted, setCategorySorting} from 'mattermost-redux/actions/channel_categories';\nimport {readMultipleChannels} from 'mattermost-redux/actions/channels';\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {shouldShowUnreadsCategory} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {openModal} from 'actions/views/modals';\nimport {makeGetUnreadIdsForCategory} from 'selectors/views/channel_sidebar';\n\nimport DeleteCategoryModal from 'components/delete_category_modal';\nimport EditCategoryModal from 'components/edit_category_modal';\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport CreateNewCategoryMenuItem from './create_new_category_menu_item';\nimport MarkAsReadMenuItem from './mark_as_read_menu_item';\nimport SidebarCategoryGenericMenu from './sidebar_category_generic_menu';\n\ntype Props = {\n    category: ChannelCategory;\n};\n\nconst SidebarCategoryMenu = ({\n    category,\n}: Props) => {\n    const dispatch = useDispatch();\n    const showUnreadsCategory = useSelector(shouldShowUnreadsCategory);\n    const getUnreadsIdsForCategory = useMemo(makeGetUnreadIdsForCategory, [category]);\n    const unreadsIds = useSelector((state: GlobalState) => getUnreadsIdsForCategory(state, category));\n    const {formatMessage} = useIntl();\n\n    let muteUnmuteCategoryMenuItem: JSX.Element | null = null;\n    if (category.type !== CategoryTypes.DIRECT_MESSAGES) {\n        function toggleCategoryMute() {\n            dispatch(setCategoryMuted(category.id, !category.muted));\n        }\n\n        muteUnmuteCategoryMenuItem = (\n            <Menu.Item\n                id={`mute-${category.id}`}\n                onClick={toggleCategoryMute}\n                leadingElement={<BellOutlineIcon size={18}/>}\n                labels={\n                    category.muted ? (\n                        <FormattedMessage\n                            id='sidebar_left.sidebar_category_menu.unmuteCategory'\n                            defaultMessage='Unmute Category'\n                        />\n                    ) : (\n                        <FormattedMessage\n                            id='sidebar_left.sidebar_category_menu.muteCategory'\n                            defaultMessage='Mute Category'\n                        />\n                    )\n                }\n            />\n        );\n    }\n\n    let deleteCategoryMenuItem: JSX.Element | null = null;\n    let renameCategoryMenuItem: JSX.Element | null = null;\n    if (category.type === CategoryTypes.CUSTOM) {\n        function handleDeleteCategory() {\n            dispatch(openModal({\n                modalId: ModalIdentifiers.DELETE_CATEGORY,\n                dialogType: DeleteCategoryModal,\n                dialogProps: {\n                    category,\n                },\n            }));\n        }\n\n        deleteCategoryMenuItem = (\n            <Menu.Item\n                id={`delete-${category.id}`}\n                isDestructive={true}\n                aria-haspopup={true}\n                onClick={handleDeleteCategory}\n                leadingElement={<TrashCanOutlineIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_category_menu.deleteCategory'\n                        defaultMessage='Delete Category'\n                    />\n                )}\n            />\n        );\n\n        function handleRenameCategory() {\n            dispatch(openModal({\n                modalId: ModalIdentifiers.EDIT_CATEGORY,\n                dialogType: EditCategoryModal,\n                dialogProps: {\n                    categoryId: category.id,\n                    initialCategoryName: category.display_name,\n                },\n            }));\n        }\n\n        renameCategoryMenuItem = (\n            <Menu.Item\n                id={`rename-${category.id}`}\n                onClick={handleRenameCategory}\n                aria-haspopup={true}\n                leadingElement={<PencilOutlineIcon size={18}/>}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_category_menu.renameCategory'\n                        defaultMessage='Rename Category'\n                    />\n                )}\n            />\n        );\n    }\n\n    function handleSortChannels(sorting: CategorySorting) {\n        dispatch(setCategorySorting(category.id, sorting));\n        trackEvent('ui', `ui_sidebar_sort_dm_${sorting}`);\n    }\n\n    let sortChannelsSelectedValue = (\n        <FormattedMessage\n            id='sidebar.sortedManually'\n            defaultMessage='Manually'\n        />\n    );\n    let sortChannelsIcon = <FormatListBulletedIcon size={18}/>;\n    if (category.sorting === CategorySorting.Alphabetical) {\n        sortChannelsSelectedValue = (\n            <FormattedMessage\n                id='user.settings.sidebar.sortAlpha'\n                defaultMessage='Alphabetically'\n            />\n        );\n        sortChannelsIcon = <SortAlphabeticalAscendingIcon size={18}/>;\n    } else if (category.sorting === CategorySorting.Recency) {\n        sortChannelsSelectedValue = (\n            <FormattedMessage\n                id='user.settings.sidebar.recent'\n                defaultMessage='Recent Activity'\n            />\n        );\n        sortChannelsIcon = <ClockOutlineIcon size={18}/>;\n    }\n\n    const sortChannelsMenuItem = (\n        <Menu.SubMenu\n            id={`sortChannels-${category.id}`}\n            leadingElement={sortChannelsIcon}\n            labels={(\n                <FormattedMessage\n                    id='sidebar.sort'\n                    defaultMessage='Sort'\n                />\n            )}\n            trailingElements={(\n                <>\n                    {sortChannelsSelectedValue}\n                    <ChevronRightIcon size={16}/>\n                </>\n            )}\n            menuId={`sortChannels-${category.id}-menu`}\n            menuAriaLabel={formatMessage({id: 'sidebar_left.sidebar_category_menu.sort.dropdownAriaLabel', defaultMessage: 'Sort submenu'})}\n        >\n            <Menu.Item\n                id={`sortAplhabetical-${category.id}`}\n                labels={(\n                    <FormattedMessage\n                        id='user.settings.sidebar.sortAlpha'\n                        defaultMessage='Alphabetically'\n                    />\n                )}\n                onClick={() => handleSortChannels(CategorySorting.Alphabetical)}\n                trailingElements={category.sorting === CategorySorting.Alphabetical ? <CheckIcon size={16}/> : null}\n            />\n            <Menu.Item\n                id={`sortByMostRecent-${category.id}`}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar.sortedByRecencyLabel'\n                        defaultMessage='Recent Activity'\n                    />\n                )}\n                onClick={() => handleSortChannels(CategorySorting.Recency)}\n                trailingElements={category.sorting === CategorySorting.Recency ? <CheckIcon size={16}/> : null}\n            />\n            <Menu.Item\n                id={`sortManual-${category.id}`}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar.sortedManually'\n                        defaultMessage='Manually'\n                    />\n                )}\n                onClick={() => handleSortChannels(CategorySorting.Manual)}\n                trailingElements={category.sorting === CategorySorting.Manual ? <CheckIcon size={16}/> : null}\n            />\n        </Menu.SubMenu>\n    );\n\n    const handleViewCategory = useCallback(() => {\n        dispatch(readMultipleChannels(unreadsIds));\n        trackEvent('ui', 'ui_sidebar_category_menu_viewCategory');\n    }, [dispatch, unreadsIds]);\n\n    const markAsReadMenuItem = showUnreadsCategory ?\n        null :\n        (\n            <MarkAsReadMenuItem\n                id={category.id}\n                handleViewCategory={handleViewCategory}\n                numChannels={unreadsIds.length}\n            />\n        );\n\n    return (\n        <SidebarCategoryGenericMenu id={category.id}>\n            {markAsReadMenuItem}\n            {markAsReadMenuItem && <Menu.Separator/>}\n            {muteUnmuteCategoryMenuItem}\n            {renameCategoryMenuItem}\n            {deleteCategoryMenuItem}\n            <Menu.Separator/>\n            {sortChannelsMenuItem}\n            <Menu.Separator/>\n            <CreateNewCategoryMenuItem id={category.id}/>\n        </SidebarCategoryGenericMenu>\n    );\n};\n\nexport default memo(SidebarCategoryMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useState} from 'react';\nimport type {MouseEvent, KeyboardEvent} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {\n    SortAlphabeticalAscendingIcon,\n    ClockOutlineIcon,\n    AccountMultipleOutlineIcon,\n    AccountPlusOutlineIcon,\n    DotsVerticalIcon,\n    ChevronRightIcon,\n    CheckIcon,\n} from '@mattermost/compass-icons/components';\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\nimport {CategorySorting} from '@mattermost/types/channel_categories';\n\nimport {setCategorySorting} from 'mattermost-redux/actions/channel_categories';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {Preferences} from 'mattermost-redux/constants';\nimport {getVisibleDmGmLimit} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport * as Menu from 'components/menu';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n    category: ChannelCategory;\n    handleOpenDirectMessagesModal: (e: MouseEvent<HTMLLIElement> | KeyboardEvent<HTMLLIElement>) => void;\n};\n\nconst SidebarCategorySortingMenu = ({\n    category,\n    handleOpenDirectMessagesModal,\n}: Props) => {\n    const [isMenuOpen, setIsMenuOpen] = useState(false);\n    const {formatMessage} = useIntl();\n\n    const dispatch = useDispatch();\n    const selectedDmNumber = useSelector(getVisibleDmGmLimit);\n    const currentUserId = useSelector(getCurrentUserId);\n\n    function handleSortDirectMessages(sorting: CategorySorting) {\n        dispatch(setCategorySorting(category.id, sorting));\n        trackEvent('ui', `ui_sidebar_sort_dm_${sorting}`);\n    }\n\n    let sortDirectMessagesIcon = <ClockOutlineIcon size={18}/>;\n    let sortDirectMessagesSelectedValue = (\n        <FormattedMessage\n            id='user.settings.sidebar.recent'\n            defaultMessage='Recent Activity'\n        />\n    );\n    if (category.sorting === CategorySorting.Alphabetical) {\n        sortDirectMessagesSelectedValue = (\n            <FormattedMessage\n                id='user.settings.sidebar.sortAlpha'\n                defaultMessage='Alphabetically'\n            />\n        );\n        sortDirectMessagesIcon = <SortAlphabeticalAscendingIcon size={18}/>;\n    }\n\n    const sortDirectMessagesMenuItem = (\n        <Menu.SubMenu\n            id={`sortDirectMessages-${category.id}`}\n            leadingElement={sortDirectMessagesIcon}\n            labels={(\n                <FormattedMessage\n                    id='sidebar.sort'\n                    defaultMessage='Sort'\n                />\n            )}\n            trailingElements={\n                <>\n                    {sortDirectMessagesSelectedValue}\n                    <ChevronRightIcon size={16}/>\n                </>\n            }\n            menuId={`sortDirectMessages-${category.id}-menu`}\n        >\n            <Menu.Item\n                id={`sortAlphabetical-${category.id}`}\n                labels={(\n                    <FormattedMessage\n                        id='user.settings.sidebar.sortAlpha'\n                        defaultMessage='Alphabetically'\n                    />\n                )}\n                onClick={() => handleSortDirectMessages(CategorySorting.Alphabetical)}\n                trailingElements={category.sorting === CategorySorting.Alphabetical ? <CheckIcon size={16}/> : null}\n            />\n            <Menu.Item\n                id={`sortByMostRecent-${category.id}`}\n                labels={(\n                    <FormattedMessage\n                        id='sidebar.sortedByRecencyLabel'\n                        defaultMessage='Recent Activity'\n                    />\n                )}\n                onClick={() => handleSortDirectMessages(CategorySorting.Recency)}\n                trailingElements={category.sorting === CategorySorting.Recency ? <CheckIcon size={16}/> : null}\n            />\n        </Menu.SubMenu>\n\n    );\n\n    function handlelimitVisibleDMsGMs(number: number) {\n        dispatch(savePreferences(currentUserId, [{\n            user_id: currentUserId,\n            category: Constants.Preferences.CATEGORY_SIDEBAR_SETTINGS,\n            name: Preferences.LIMIT_VISIBLE_DMS_GMS,\n            value: number.toString(),\n        }]));\n    }\n\n    let showMessagesCountSelectedValue = <span>{selectedDmNumber}</span>;\n    if (selectedDmNumber === 10000) {\n        showMessagesCountSelectedValue = (\n            <FormattedMessage\n                id='channel_notifications.levels.all'\n                defaultMessage='All'\n            />\n        );\n    }\n\n    const showMessagesCountMenuItem = (\n        <Menu.SubMenu\n            id={`showMessagesCount-${category.id}`}\n            leadingElement={<AccountMultipleOutlineIcon size={18}/>}\n            labels={(\n                <FormattedMessage\n                    id='sidebar.show'\n                    defaultMessage='Show'\n                />\n            )}\n            trailingElements={(\n                <>\n                    {showMessagesCountSelectedValue}\n                    <ChevronRightIcon size={16}/>\n                </>\n            )}\n            menuId={`showMessagesCount-${category.id}-menu`}\n        >\n            {Constants.DM_AND_GM_SHOW_COUNTS.map((dmGmShowCount) => (\n                <Menu.Item\n                    id={`showDmCount-${category.id}-${dmGmShowCount}`}\n                    key={`showDmCount-${category.id}-${dmGmShowCount}`}\n                    labels={<span>{dmGmShowCount}</span>}\n                    onClick={() => handlelimitVisibleDMsGMs(dmGmShowCount)}\n                    trailingElements={selectedDmNumber === dmGmShowCount ? <CheckIcon size={16}/> : null}\n                />\n            ))}\n        </Menu.SubMenu>\n\n    );\n\n    const openDirectMessageMenuItem = (\n        <Menu.Item\n            id={`openDirectMessage-${category.id}`}\n            onClick={handleOpenDirectMessagesModal}\n            leadingElement={<AccountPlusOutlineIcon size={18}/>}\n            labels={(\n                <FormattedMessage\n                    id='sidebar.openDirectMessage'\n                    defaultMessage='Open a direct message'\n                />\n            )}\n        />\n    );\n\n    function handleMenuToggle(isOpen: boolean) {\n        setIsMenuOpen(isOpen);\n    }\n\n    return (\n        <div\n            className={classNames(\n                'SidebarMenu',\n                'MenuWrapper',\n                {menuOpen: isMenuOpen},\n                {'MenuWrapper--open': isMenuOpen},\n            )}\n        >\n            <Menu.Container\n                menuButton={{\n                    id: `SidebarCategorySortingMenu-Button-${category.id}`,\n                    'aria-label': formatMessage({id: 'sidebar_left.sidebar_category_menu.editCategory', defaultMessage: 'Category options'}),\n                    class: 'SidebarMenu_menuButton sortingMenu',\n                    children: <DotsVerticalIcon size={16}/>,\n                }}\n                menuButtonTooltip={{\n                    text: formatMessage({id: 'sidebar_left.sidebar_category_menu.editCategory', defaultMessage: 'Category options'}),\n                    class: 'hidden-xs',\n                }}\n                menu={{\n                    id: `SidebarCategorySortingMenu-MenuList-${category.id}`,\n                    'aria-label': formatMessage({id: 'sidebar_left.sidebar_category_menu.dropdownAriaLabel', defaultMessage: 'Edit category menu'}),\n                    onToggle: handleMenuToggle,\n                }}\n            >\n                {sortDirectMessagesMenuItem}\n                {showMessagesCountMenuItem}\n                <Menu.Separator/>\n                {openDirectMessageMenuItem}\n            </Menu.Container>\n        </div>\n    );\n};\n\nexport default memo(SidebarCategorySortingMenu);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector, useDispatch} from 'react-redux';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\nimport {getBool} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveICurrentChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions';\nimport {setAddChannelCtaDropdown} from 'actions/views/add_channel_dropdown';\nimport {openModal} from 'actions/views/modals';\nimport {isAddChannelCtaDropdownOpen} from 'selectors/views/add_channel_dropdown';\n\nimport BrowseChannels from 'components/browse_channels';\nimport NewChannelModal from 'components/new_channel_modal/new_channel_modal';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\n\nimport {ModalIdentifiers, Preferences, Touched} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nconst AddChannelsCtaButton = (): JSX.Element | null => {\n    const dispatch = useDispatch();\n    const currentTeamId = useSelector(getCurrentTeamId);\n    const intl = useIntl();\n    const touchedAddChannelsCtaButton = useSelector((state: GlobalState) => getBool(state, Preferences.TOUCHED, Touched.ADD_CHANNELS_CTA));\n\n    const canCreatePublicChannel = useSelector((state: GlobalState) => haveICurrentChannelPermission(state, Permissions.CREATE_PUBLIC_CHANNEL));\n    const canCreatePrivateChannel = useSelector((state: GlobalState) => haveICurrentChannelPermission(state, Permissions.CREATE_PRIVATE_CHANNEL));\n    const canCreateChannel = canCreatePrivateChannel || canCreatePublicChannel;\n    const canJoinPublicChannel = useSelector((state: GlobalState) => haveICurrentChannelPermission(state, Permissions.JOIN_PUBLIC_CHANNELS));\n    const isAddChannelCtaOpen = useSelector(isAddChannelCtaDropdownOpen);\n    const currentUserId = useSelector(getCurrentUserId);\n    const openAddChannelsCtaOpen = useCallback((open: boolean) => {\n        dispatch(setAddChannelCtaDropdown(open));\n    }, []);\n\n    let buttonClass = 'SidebarChannelNavigator__addChannelsCtaLhsButton';\n\n    if (!touchedAddChannelsCtaButton) {\n        buttonClass += ' SidebarChannelNavigator__addChannelsCtaLhsButton--untouched';\n    }\n\n    if ((!canCreateChannel && !canJoinPublicChannel) || !currentTeamId) {\n        return null;\n    }\n\n    const showMoreChannelsModal = () => {\n        dispatch(openModal({\n            modalId: ModalIdentifiers.MORE_CHANNELS,\n            dialogType: BrowseChannels,\n        }));\n        trackEvent('ui', 'browse_channels_button_is_clicked');\n    };\n\n    const showNewChannelModal = () => {\n        dispatch(openModal({\n            modalId: ModalIdentifiers.NEW_CHANNEL_MODAL,\n            dialogType: NewChannelModal,\n        }));\n        trackEvent('ui', 'create_new_channel_button_is_clicked');\n    };\n\n    const renderDropdownItems = () => {\n        let joinPublicChannel;\n        if (canJoinPublicChannel) {\n            joinPublicChannel = (\n                <Menu.ItemAction\n                    id='showMoreChannels'\n                    onClick={showMoreChannelsModal}\n                    icon={<i className='icon-globe'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.browseChannels', defaultMessage: 'Browse channels'})}\n                />\n            );\n        }\n\n        let createChannel;\n        if (canCreateChannel) {\n            createChannel = (\n                <Menu.ItemAction\n                    id='showNewChannel'\n                    onClick={showNewChannelModal}\n                    icon={<i className='icon-plus'/>}\n                    text={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.createNewChannel', defaultMessage: 'Create new channel'})}\n                />\n            );\n        }\n\n        return (\n            <>\n                <Menu.Group>\n                    {createChannel}\n                    {joinPublicChannel}\n                </Menu.Group>\n            </>\n        );\n    };\n\n    const addChannelsButton = (btnCallback?: () => void) => {\n        const handleClick = () => btnCallback?.();\n        return (\n            <button\n                className={buttonClass}\n                id={'addChannelsCta'}\n                aria-label={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                onClick={handleClick}\n            >\n                <div\n                    aria-label={intl.formatMessage({id: 'sidebar_left.sidebar_channel_navigator.addChannelsCta', defaultMessage: 'Add channels'})}\n                >\n                    <i className='icon-plus-box'/>\n                    <span>\n                        {intl.formatMessage({id: 'sidebar_left.addChannelsCta', defaultMessage: 'Add Channels'})}\n                    </span>\n                </div>\n            </button>\n        );\n    };\n\n    const storePreferencesAndTrackEvent = () => {\n        trackEvent('ui', 'add_channels_cta_button_clicked');\n        if (!touchedAddChannelsCtaButton) {\n            dispatch(savePreferences(\n                currentUserId,\n                [{\n                    category: Preferences.TOUCHED,\n                    user_id: currentUserId,\n                    name: Touched.ADD_CHANNELS_CTA,\n                    value: 'true',\n                }],\n            ));\n        }\n    };\n\n    const trackOpen = (opened: boolean) => {\n        openAddChannelsCtaOpen(opened);\n        storePreferencesAndTrackEvent();\n    };\n\n    if (!canCreateChannel) {\n        const browseChannelsAction = () => {\n            showMoreChannelsModal();\n            storePreferencesAndTrackEvent();\n        };\n        return addChannelsButton(browseChannelsAction);\n    }\n\n    return (\n        <MenuWrapper\n            className='AddChannelsCtaDropdown'\n            onToggle={trackOpen}\n            open={isAddChannelCtaOpen}\n        >\n            {addChannelsButton()}\n            <Menu\n                id='AddChannelCtaDropdown'\n                ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_cta_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channels Dropdown'})}\n            >\n                {renderDropdownItems()}\n            </Menu>\n        </MenuWrapper>\n    );\n};\n\nexport default AddChannelsCtaButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl, FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport InvitationModal from 'components/invitation_modal';\nimport {getAnalyticsCategory} from 'components/onboarding_tasks';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\nimport ToggleModalButton from 'components/toggle_modal_button';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\ntype Props = {\n    className?: string;\n    isAdmin: boolean;\n}\n\nconst InviteMembersButton = (props: Props): JSX.Element | null => {\n    const intl = useIntl();\n    const currentTeamId = useSelector(getCurrentTeamId);\n\n    const handleButtonClick = () => {\n        trackEvent(getAnalyticsCategory(props.isAdmin), 'click_sidebar_invite_members_button');\n    };\n\n    if (!currentTeamId) {\n        return null;\n    }\n\n    return (\n        <TeamPermissionGate\n            teamId={currentTeamId}\n            permissions={[Permissions.ADD_USER_TO_TEAM, Permissions.INVITE_GUEST]}\n        >\n            <ToggleModalButton\n                ariaLabel={intl.formatMessage({id: 'sidebar_left.inviteMembers', defaultMessage: 'Invite Members'})}\n                id='inviteMembersButton'\n                className={`intro-links color--link cursor--pointer${props.className ? ` ${props.className}` : ''}`}\n                modalId={ModalIdentifiers.INVITATION}\n                dialogType={InvitationModal}\n                onClick={handleButtonClick}\n            >\n                <div\n                    className='SidebarChannelNavigator__inviteMembersLhsButton'\n                    aria-label={intl.formatMessage({id: 'sidebar_left.sidebar_channel_navigator.inviteUsers', defaultMessage: 'Invite Members'})}\n                >\n                    <i className='icon-plus-box'/>\n                    <FormattedMessage\n                        id={'sidebar_left.inviteMembers'}\n                        defaultMessage='Invite Members'\n                    />\n                </div>\n            </ToggleModalButton>\n        </TeamPermissionGate>\n    );\n};\n\nexport default InviteMembersButton;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {MouseEvent, KeyboardEvent} from 'react';\nimport {Draggable, Droppable} from 'react-beautiful-dnd';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\nimport {CategorySorting} from '@mattermost/types/channel_categories';\nimport type {PreferenceType} from '@mattermost/types/preferences';\n\nimport {CategoryTypes} from 'mattermost-redux/constants/channel_categories';\nimport {localizeMessage} from 'mattermost-redux/utils/i18n_utils';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport KeyboardShortcutSequence, {\n    KEYBOARD_SHORTCUTS,\n} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants, {A11yCustomEventTypes, DraggingStateTypes, DraggingStates} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport type {DraggingState} from 'types/store';\n\nimport SidebarCategoryMenu from './sidebar_category_menu';\nimport SidebarCategorySortingMenu from './sidebar_category_sorting_menu';\n\nimport AddChannelsCtaButton from '../add_channels_cta_button';\nimport InviteMembersButton from '../invite_members_button';\nimport {SidebarCategoryHeader} from '../sidebar_category_header';\nimport SidebarChannel from '../sidebar_channel';\n\ntype Props = {\n    category: ChannelCategory;\n    categoryIndex: number;\n    channelIds: string[];\n    setChannelRef: (channelId: string, ref: HTMLLIElement) => void;\n    handleOpenMoreDirectChannelsModal: (e: Event) => void;\n    isNewCategory: boolean;\n    draggingState: DraggingState;\n    currentUserId: string;\n    isAdmin: boolean;\n    actions: {\n        setCategoryCollapsed: (categoryId: string, collapsed: boolean) => void;\n        setCategorySorting: (categoryId: string, sorting: CategorySorting) => void;\n        savePreferences: (userId: string, preferences: PreferenceType[]) => void;\n    };\n};\n\ntype State = {\n    isMenuOpen: boolean;\n}\n\nexport default class SidebarCategory extends React.PureComponent<Props, State> {\n    categoryTitleRef: React.RefObject<HTMLButtonElement>;\n    newDropBoxRef: React.RefObject<HTMLDivElement>;\n\n    a11yKeyDownRegistered: boolean;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.categoryTitleRef = React.createRef();\n        this.newDropBoxRef = React.createRef();\n\n        this.state = {\n            isMenuOpen: false,\n        };\n\n        this.a11yKeyDownRegistered = false;\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.category.collapsed !== prevProps.category.collapsed && this.newDropBoxRef.current) {\n            this.newDropBoxRef.current.classList.add('animating');\n        }\n    }\n\n    componentDidMount() {\n        this.categoryTitleRef.current?.addEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n        this.categoryTitleRef.current?.addEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n    }\n\n    componentWillUnmount() {\n        this.categoryTitleRef.current?.removeEventListener(A11yCustomEventTypes.ACTIVATE, this.handleA11yActivateEvent);\n        this.categoryTitleRef.current?.removeEventListener(A11yCustomEventTypes.DEACTIVATE, this.handleA11yDeactivateEvent);\n\n        if (this.a11yKeyDownRegistered) {\n            this.handleA11yDeactivateEvent();\n        }\n    }\n\n    handleA11yActivateEvent = () => {\n        this.categoryTitleRef.current?.addEventListener('keydown', this.handleA11yKeyDown);\n\n        this.a11yKeyDownRegistered = true;\n    };\n\n    handleA11yDeactivateEvent = () => {\n        this.categoryTitleRef.current?.removeEventListener('keydown', this.handleA11yKeyDown);\n\n        this.a11yKeyDownRegistered = false;\n    };\n\n    handleA11yKeyDown = (e: KeyboardEvent<HTMLButtonElement>['nativeEvent']) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ENTER)) {\n            this.handleCollapse();\n        }\n    };\n\n    renderChannel = (channelId: string, index: number) => {\n        const {setChannelRef, category, draggingState} = this.props;\n        return (\n            <SidebarChannel\n                key={channelId}\n                channelIndex={index}\n                channelId={channelId}\n                isDraggable={true}\n                setChannelRef={setChannelRef}\n                isCategoryCollapsed={category.collapsed}\n                isCategoryDragged={draggingState.type === DraggingStateTypes.CATEGORY && draggingState.id === category.id}\n                isAutoSortedCategory={category.sorting === CategorySorting.Alphabetical || category.sorting === CategorySorting.Recency}\n            />\n        );\n    };\n\n    handleCollapse = () => {\n        const {category} = this.props;\n\n        if (category.collapsed) {\n            trackEvent('ui', 'ui_sidebar_expand_category');\n        } else {\n            trackEvent('ui', 'ui_sidebar_collapse_category');\n        }\n\n        this.props.actions.setCategoryCollapsed(category.id, !category.collapsed);\n    };\n\n    removeAnimation = () => {\n        if (this.newDropBoxRef.current) {\n            this.newDropBoxRef.current.classList.remove('animating');\n        }\n    };\n\n    handleOpenDirectMessagesModal = (event: MouseEvent<HTMLLIElement | HTMLButtonElement> | KeyboardEvent<HTMLLIElement | HTMLButtonElement>) => {\n        event.preventDefault();\n\n        this.props.handleOpenMoreDirectChannelsModal(event.nativeEvent);\n        trackEvent('ui', 'ui_sidebar_create_direct_message');\n    };\n\n    isDropDisabled = () => {\n        const {draggingState, category} = this.props;\n\n        if (category.type === CategoryTypes.DIRECT_MESSAGES) {\n            return draggingState.type === DraggingStateTypes.CHANNEL;\n        } else if (category.type === CategoryTypes.CHANNELS) {\n            return draggingState.type === DraggingStateTypes.DM;\n        }\n\n        return false;\n    };\n\n    renderNewDropBox = (isDraggingOver: boolean) => {\n        const {draggingState, category, isNewCategory, channelIds} = this.props;\n\n        if (!isNewCategory || channelIds?.length) {\n            return null;\n        }\n\n        return (\n            <>\n                <Draggable\n                    draggableId={`NEW_CHANNEL_SPACER__${category.id}`}\n                    isDragDisabled={true}\n                    index={0}\n                >\n                    {(provided) => {\n                        // NEW_CHANNEL_SPACER here is used as a spacer to ensure react-beautiful-dnd will not try and place the first channel\n                        // on the header. This acts as a space filler for the header so that the first channel dragged in will float below it.\n                        return (\n                            <li\n                                ref={provided.innerRef}\n                                draggable='false'\n                                className={'SidebarChannel noFloat newChannelSpacer'}\n                                {...provided.draggableProps}\n                                role='listitem'\n                                tabIndex={-1}\n                            />\n                        );\n                    }}\n                </Draggable>\n                <div className='SidebarCategory_newDropBox'>\n                    <div\n                        ref={this.newDropBoxRef}\n                        className={classNames('SidebarCategory_newDropBox-content', {\n                            collapsed: category.collapsed || (draggingState.type === DraggingStateTypes.CATEGORY && draggingState.id === category.id),\n                            isDraggingOver,\n                        })}\n                        onTransitionEnd={this.removeAnimation}\n                    >\n                        <i className='icon-hand-right'/>\n                        <span className='SidebarCategory_newDropBox-label'>\n                            <FormattedMessage\n                                id='sidebar_left.sidebar_category.newDropBoxLabel'\n                                defaultMessage='Drag channels here...'\n                            />\n                        </span>\n                    </div>\n                </div>\n            </>\n        );\n    };\n\n    showPlaceholder = () => {\n        const {channelIds, draggingState, category, isNewCategory} = this.props;\n\n        if (category.sorting === CategorySorting.Alphabetical ||\n            category.sorting === CategorySorting.Recency ||\n            isNewCategory) {\n            // Always show the placeholder if the channel being dragged is from the current category\n            if (channelIds.find((id) => id === draggingState.id)) {\n                return true;\n            }\n\n            return false;\n        }\n\n        return true;\n    };\n\n    render() {\n        const {\n            category,\n            categoryIndex,\n            channelIds,\n            isNewCategory,\n        } = this.props;\n\n        if (!category) {\n            return null;\n        }\n\n        if (category.type === CategoryTypes.FAVORITES && !channelIds?.length) {\n            return null;\n        }\n\n        const renderedChannels = channelIds.map(this.renderChannel);\n\n        let categoryMenu: JSX.Element;\n        let newLabel: JSX.Element;\n        let directMessagesModalButton: JSX.Element;\n        let isCollapsible = true;\n        if (isNewCategory) {\n            newLabel = (\n                <div className='SidebarCategory_newLabel'>\n                    <FormattedMessage\n                        id='sidebar_left.sidebar_category.newLabel'\n                        defaultMessage='new'\n                    />\n                </div>\n            );\n\n            categoryMenu = <SidebarCategoryMenu category={category}/>;\n        } else if (category.type === CategoryTypes.DIRECT_MESSAGES) {\n            const addHelpLabel = localizeMessage({id: 'sidebar.createDirectMessage', defaultMessage: 'Create new direct message'});\n\n            categoryMenu = (\n                <>\n                    <SidebarCategorySortingMenu\n                        category={category}\n                        handleOpenDirectMessagesModal={this.handleOpenDirectMessagesModal}\n                    />\n                    <WithTooltip\n                        title={\n                            <>\n                                {addHelpLabel}\n                                <KeyboardShortcutSequence\n                                    shortcut={KEYBOARD_SHORTCUTS.navDMMenu}\n                                    hideDescription={true}\n                                    isInsideTooltip={true}\n                                />\n                            </>\n                        }\n                    >\n                        <button\n                            className='SidebarChannelGroupHeader_addButton'\n                            onClick={this.handleOpenDirectMessagesModal}\n                            aria-label={addHelpLabel}\n                        >\n                            <i className='icon-plus'/>\n                        </button>\n                    </WithTooltip>\n                </>\n            );\n\n            if (!channelIds || !channelIds.length) {\n                isCollapsible = false;\n            }\n        } else {\n            categoryMenu = <SidebarCategoryMenu category={category}/>;\n        }\n\n        let displayName = category.display_name;\n        if (category.type !== CategoryTypes.CUSTOM) {\n            const message = categoryNames[category.type as keyof typeof categoryNames];\n            displayName = localizeMessage({id: message.id, defaultMessage: message.defaultMessage});\n        }\n\n        return (\n            <Draggable\n                draggableId={category.id}\n                index={categoryIndex}\n                disableInteractiveElementBlocking={true}\n            >\n                {(provided, snapshot) => {\n                    let inviteMembersButton = null;\n                    if (category.type === 'direct_messages' && !category.collapsed) {\n                        inviteMembersButton = (\n                            <InviteMembersButton\n                                className='followingSibling'\n                                isAdmin={this.props.isAdmin}\n                            />\n                        );\n                    }\n\n                    let addChannelsCtaButton = null;\n                    if (category.type === 'channels' && !category.collapsed) {\n                        addChannelsCtaButton = (\n                            <AddChannelsCtaButton/>\n                        );\n                    }\n\n                    return (\n                        <div\n                            className={classNames('SidebarChannelGroup a11y__section', {\n                                dropDisabled: this.isDropDisabled(),\n                                menuIsOpen: this.state.isMenuOpen,\n                                capture: this.props.draggingState.state === DraggingStates.CAPTURE,\n                                isCollapsed: category.collapsed,\n                            })}\n                            ref={provided.innerRef}\n                            {...provided.draggableProps}\n                        >\n                            <Droppable\n                                droppableId={category.id}\n                                type='SIDEBAR_CHANNEL'\n                                isDropDisabled={this.isDropDisabled()}\n                            >\n                                {(droppableProvided, droppableSnapshot) => {\n                                    return (\n                                        <div\n                                            {...droppableProvided.droppableProps}\n                                            ref={droppableProvided.innerRef}\n                                            className={classNames({\n                                                draggingOver: droppableSnapshot.isDraggingOver,\n                                            })}\n                                        >\n                                            <SidebarCategoryHeader\n                                                ref={this.categoryTitleRef}\n                                                displayName={displayName}\n                                                dragHandleProps={provided.dragHandleProps}\n                                                isCollapsed={category.collapsed}\n                                                isCollapsible={isCollapsible}\n                                                isDragging={snapshot.isDragging}\n                                                isDraggingOver={droppableSnapshot.isDraggingOver}\n                                                muted={category.muted}\n                                                onClick={this.handleCollapse}\n                                            >\n                                                {newLabel}\n                                                {directMessagesModalButton}\n                                                {categoryMenu}\n                                            </SidebarCategoryHeader>\n                                            <div\n                                                className={classNames('SidebarChannelGroup_content')}\n                                            >\n                                                <ul\n                                                    role='list'\n                                                    className='NavGroupContent'\n                                                >\n                                                    {this.renderNewDropBox(droppableSnapshot.isDraggingOver)}\n                                                    {renderedChannels}\n                                                    {this.showPlaceholder() ? droppableProvided.placeholder : null}\n                                                </ul>\n                                            </div>\n                                        </div>\n                                    );\n                                }}\n                            </Droppable>\n                            {inviteMembersButton}\n                            {addChannelsCtaButton}\n                        </div>\n                    );\n                }}\n            </Draggable>\n        );\n    }\n}\n\nconst categoryNames = defineMessages({\n    channels: {\n        id: 'sidebar.types.channels',\n        defaultMessage: 'CHANNELS',\n    },\n    direct_messages: {\n        id: 'sidebar.types.direct_messages',\n        defaultMessage: 'DIRECT MESSAGES',\n    },\n    favorites: {\n        id: 'sidebar.types.favorites',\n        defaultMessage: 'FAVORITES',\n    },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\n\nimport {setCategoryCollapsed, setCategorySorting} from 'mattermost-redux/actions/channel_categories';\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentUser, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\nimport {isAdmin} from 'mattermost-redux/utils/user_utils';\n\nimport {getDraggingState, makeGetFilteredChannelIdsForCategory} from 'selectors/views/channel_sidebar';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarCategory from './sidebar_category';\n\ntype OwnProps = {\n    category: ChannelCategory;\n}\n\nfunction makeMapStateToProps() {\n    const getChannelIdsForCategory = makeGetFilteredChannelIdsForCategory();\n\n    return (state: GlobalState, ownProps: OwnProps) => {\n        return {\n            channelIds: getChannelIdsForCategory(state, ownProps.category),\n            draggingState: getDraggingState(state),\n            currentUserId: getCurrentUserId(state),\n            isAdmin: isAdmin(getCurrentUser(state).roles),\n        };\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            setCategoryCollapsed,\n            setCategorySorting,\n            savePreferences,\n        }, dispatch),\n    };\n}\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(SidebarCategory);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport debounce from 'lodash/debounce';\nimport React, {lazy} from 'react';\nimport type {CSSProperties} from 'react';\nimport {DragDropContext, Droppable} from 'react-beautiful-dnd';\nimport type {DropResult, DragStart, BeforeCapture} from 'react-beautiful-dnd';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {FormattedMessage, injectIntl, type WrappedComponentProps} from 'react-intl';\nimport {SpringSystem} from 'rebound';\nimport type {Spring} from 'rebound';\n\nimport type {ChannelCategory} from '@mattermost/types/channel_categories';\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {General} from 'mattermost-redux/constants';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport SidebarCategory from 'components/sidebar/sidebar_category';\n\nimport {findNextUnreadChannelId} from 'utils/channel_utils';\nimport {Constants, DraggingStates, DraggingStateTypes} from 'utils/constants';\nimport {isKeyPressed, cmdOrCtrlPressed} from 'utils/keyboard';\nimport {mod} from 'utils/utils';\n\nimport type {DraggingState} from 'types/store';\nimport type {StaticPage} from 'types/store/lhs';\n\nconst DraftsLink = makeAsyncComponent('DraftsLink', lazy(() => import('components/drafts/drafts_link/drafts_link')));\nconst GlobalThreadsLink = makeAsyncComponent('GlobalThreadsLink', lazy(() => import('components/threading/global_threads_link')));\nconst UnreadChannelIndicator = makeAsyncComponent('UnreadChannelIndicator', lazy(() => import('../unread_channel_indicator')));\nconst UnreadChannels = makeAsyncComponent('UnreadChannels', lazy(() => import('../unread_channels')));\n\nexport function renderView(props: React.HTMLProps<HTMLDivElement>) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--view'\n        />\n    );\n}\n\nexport function renderThumbHorizontal(props: React.HTMLProps<HTMLDivElement>) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--horizontal'\n        />\n    );\n}\n\nexport function renderTrackVertical(props: React.HTMLProps<HTMLDivElement>) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--verticalTrack'\n        />\n    );\n}\n\nexport function renderThumbVertical(props: React.HTMLProps<HTMLDivElement>) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--vertical'\n        />\n    );\n}\n\nconst scrollbarStyles: CSSProperties = {position: 'absolute'};\n\ntype Props = WrappedComponentProps & {\n    currentTeam?: Team;\n    currentChannelId: string;\n    categories: ChannelCategory[];\n    unreadChannelIds: string[];\n    isUnreadFilterEnabled: boolean;\n    displayedChannels: Channel[];\n    newCategoryIds: string[];\n    draggingState: DraggingState;\n    multiSelectedChannelIds: string[];\n    showUnreadsCategory: boolean;\n    collapsedThreads: boolean;\n    hasUnreadThreads: boolean;\n    currentStaticPageId: string;\n    staticPages: StaticPage[];\n\n    handleOpenMoreDirectChannelsModal: (e: Event) => void;\n    onDragStart: (initial: DragStart) => void;\n    onDragEnd: (result: DropResult) => void;\n\n    actions: {\n        moveChannelsInSidebar: (categoryId: string, targetIndex: number, draggableChannelId: string) => void;\n        moveCategory: (teamId: string, categoryId: string, newIndex: number) => void;\n        switchToChannelById: (channelId: string) => void;\n        switchToLhsStaticPage: (pageId: string) => void;\n        close: () => void;\n        setDraggingState: (data: DraggingState) => void;\n        stopDragging: () => void;\n        clearChannelSelection: () => void;\n    };\n};\n\ntype State = {\n    showTopUnread: boolean;\n    showBottomUnread: boolean;\n    autoHide: boolean;\n};\n\n// scrollMargin is the margin at the edge of the channel list that we leave when scrolling to a channel.\nconst scrollMargin = 10;\n\n// categoryHeaderHeight is the height of the category header\nconst categoryHeaderHeight = 32;\n\n// scrollMarginWithUnread is the margin that we leave at the edge of the channel list when scrolling to a channel so\n// that the channel is not under the unread indicator.\nconst scrollMarginWithUnread = 55;\n\nexport class SidebarList extends React.PureComponent<Props, State> {\n    channelRefs: Map<string, HTMLLIElement>;\n    scrollbar: React.RefObject<Scrollbars>;\n    animate: SpringSystem;\n    scrollAnimation: Spring;\n    channelsListScrollTimeout: NodeJS.Timeout | null = null;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.channelRefs = new Map();\n        this.state = {\n            showTopUnread: false,\n            showBottomUnread: false,\n            autoHide: true,\n        };\n        this.scrollbar = React.createRef();\n\n        this.animate = new SpringSystem();\n        this.scrollAnimation = this.animate.createSpring();\n        this.scrollAnimation.setOvershootClampingEnabled(true); // disables the spring action at the end of animation\n        this.scrollAnimation.addListener({onSpringUpdate: this.handleScrollAnimationUpdate});\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.navigateChannelShortcut);\n        document.addEventListener('keydown', this.navigateUnreadChannelShortcut);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.navigateChannelShortcut);\n        document.removeEventListener('keydown', this.navigateUnreadChannelShortcut);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (!this.props.currentChannelId || !prevProps.currentChannelId) {\n            return;\n        }\n\n        // reset the scrollbar upon switching teams\n        if (this.props.currentTeam !== prevProps.currentTeam) {\n            this.scrollbar.current!.scrollToTop();\n        }\n\n        // Scroll to selected channel so it's in view\n        if (this.props.currentChannelId !== prevProps.currentChannelId) {\n            // This will be re-enabled when we can avoid animating the scroll on first load and team switch\n            // this.scrollToChannel(this.props.currentChannelId);\n        }\n\n        // TODO: Copying over so it doesn't get lost, but we don't have a design for the sidebar on mobile yet\n        // close the LHS on mobile when you change channels\n        if (this.props.currentChannelId !== prevProps.currentChannelId) {\n            this.props.actions.close();\n        }\n\n        this.updateUnreadIndicators();\n    }\n\n    getDisplayedChannelIds = () => {\n        return this.props.displayedChannels.map((channel) => channel.id);\n    };\n\n    getDisplayedStaticPageIds = () => {\n        return this.props.staticPages.map((item) => item.id);\n    };\n\n    setChannelRef = (channelId: string, ref: HTMLLIElement) => {\n        if (ref) {\n            this.channelRefs.set(channelId, ref);\n        } else {\n            this.channelRefs.delete(channelId);\n        }\n    };\n\n    getFirstUnreadChannelFromChannelIdArray = (channelIds: string[]) => {\n        return channelIds.find((channelId) => {\n            return channelId !== this.props.currentChannelId && this.props.unreadChannelIds.includes(channelId);\n        });\n    };\n\n    handleScrollAnimationUpdate = (spring: Spring) => {\n        const val = spring.getCurrentValue();\n        this.scrollbar.current!.scrollTop(val);\n    };\n\n    scrollToFirstUnreadChannel = () => {\n        this.scrollToChannel(this.getFirstUnreadChannel(), true);\n    };\n\n    scrollToLastUnreadChannel = () => {\n        this.scrollToChannel(this.getLastUnreadChannel(), true);\n    };\n\n    scrollToChannel = (channelId: string | null | undefined, scrollingToUnread = false) => {\n        if (!channelId) {\n            return;\n        }\n\n        const element = this.channelRefs.get(channelId);\n        if (!element) {\n            return;\n        }\n\n        const top = element.offsetTop;\n        const bottom = top + element.offsetHeight;\n\n        const scrollTop = this.scrollbar.current!.getScrollTop();\n        const scrollHeight = this.scrollbar.current!.getClientHeight();\n\n        if (top < (scrollTop + categoryHeaderHeight)) {\n            // Scroll up to the item\n            const margin = (scrollingToUnread || !this.state.showTopUnread) ? scrollMargin : scrollMarginWithUnread;\n\n            let scrollEnd;\n            const displayedChannels = this.getDisplayedChannelIds();\n            if (displayedChannels.length > 0 && displayedChannels[0] === channelId) {\n                // This is the first channel, so scroll right to the top\n                scrollEnd = 0;\n            } else {\n                scrollEnd = top - margin - categoryHeaderHeight;\n            }\n\n            this.scrollToPosition(scrollEnd);\n        } else if (bottom > scrollTop + scrollHeight) {\n            // Scroll down to the item\n            const margin = (scrollingToUnread || !this.state.showBottomUnread) ? scrollMargin : scrollMarginWithUnread;\n            const scrollEnd = (bottom - scrollHeight) + margin;\n\n            this.scrollToPosition(scrollEnd);\n        }\n    };\n\n    scrollToPosition = (scrollEnd: number) => {\n        // Stop the current animation before scrolling\n        this.scrollAnimation.setCurrentValue(this.scrollbar.current!.getScrollTop()).setAtRest();\n\n        this.scrollAnimation.setEndValue(scrollEnd);\n    };\n\n    updateUnreadIndicators = () => {\n        if (this.props.draggingState.state) {\n            this.setState({\n                showTopUnread: false,\n                showBottomUnread: false,\n            });\n            return;\n        }\n\n        let showTopUnread = false;\n        let showBottomUnread = false;\n\n        // Consider partially obscured channels as above/below\n        const firstUnreadChannel = this.getFirstUnreadChannel();\n        const lastUnreadChannel = this.getLastUnreadChannel();\n\n        if (firstUnreadChannel) {\n            const firstUnreadElement = this.channelRefs.get(firstUnreadChannel);\n\n            if (firstUnreadElement && ((firstUnreadElement.offsetTop + firstUnreadElement.offsetHeight) - scrollMargin - categoryHeaderHeight) < this.scrollbar.current!.getScrollTop()) {\n                showTopUnread = true;\n            }\n        }\n\n        if (lastUnreadChannel) {\n            const lastUnreadElement = this.channelRefs.get(lastUnreadChannel);\n\n            if (lastUnreadElement && (lastUnreadElement.offsetTop + scrollMargin) > (this.scrollbar.current!.getScrollTop() + this.scrollbar.current!.getClientHeight())) {\n                showBottomUnread = true;\n            }\n        }\n\n        if (showTopUnread !== this.state.showTopUnread || showBottomUnread !== this.state.showBottomUnread) {\n            this.setState({\n                showTopUnread,\n                showBottomUnread,\n            });\n        }\n    };\n\n    getFirstUnreadChannel = () => {\n        return this.getFirstUnreadChannelFromChannelIdArray(this.getDisplayedChannelIds());\n    };\n\n    getLastUnreadChannel = () => {\n        return this.getFirstUnreadChannelFromChannelIdArray(this.getDisplayedChannelIds().reverse());\n    };\n\n    navigateById = (id: string) => {\n        if (this.props.staticPages.findIndex((i) => i.id === id) === -1) {\n            this.props.actions.switchToChannelById(id);\n        } else {\n            this.props.actions.switchToLhsStaticPage(id);\n        }\n    };\n\n    navigateChannelShortcut = (e: KeyboardEvent) => {\n        if (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey && (isKeyPressed(e, Constants.KeyCodes.UP) || isKeyPressed(e, Constants.KeyCodes.DOWN))) {\n            e.preventDefault();\n\n            const staticPageIds = this.getDisplayedStaticPageIds();\n            const allIds = [...staticPageIds, ...this.getDisplayedChannelIds()];\n\n            const curSelectedId = this.props.currentChannelId || this.props.currentStaticPageId;\n            const curIndex = allIds.indexOf(curSelectedId);\n\n            let nextIndex;\n            if (isKeyPressed(e, Constants.KeyCodes.DOWN)) {\n                nextIndex = curIndex + 1;\n            } else {\n                nextIndex = curIndex - 1;\n            }\n\n            const nextId = allIds[mod(nextIndex, allIds.length)];\n            this.navigateById(nextId);\n            if (nextIndex >= staticPageIds.length) {\n                this.scrollToChannel(nextId);\n            }\n        } else if (cmdOrCtrlPressed(e) && e.shiftKey && isKeyPressed(e, Constants.KeyCodes.K)) {\n            this.props.handleOpenMoreDirectChannelsModal(e);\n        }\n    };\n\n    navigateUnreadChannelShortcut = (e: KeyboardEvent) => {\n        if (e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey && (isKeyPressed(e, Constants.KeyCodes.UP) || isKeyPressed(e, Constants.KeyCodes.DOWN))) {\n            e.preventDefault();\n\n            const allChannelIds = this.getDisplayedChannelIds();\n            const unreadChannelIds = [...this.props.unreadChannelIds];\n\n            if (this.props.collapsedThreads) {\n                allChannelIds.unshift('');\n\n                if (this.props.hasUnreadThreads) {\n                    unreadChannelIds.unshift('');\n                }\n            }\n\n            let direction = 0;\n            if (isKeyPressed(e, Constants.KeyCodes.UP)) {\n                direction = -1;\n            } else {\n                direction = 1;\n            }\n\n            const nextIndex = findNextUnreadChannelId(\n                this.props.currentChannelId,\n                allChannelIds,\n                unreadChannelIds,\n                direction,\n            );\n\n            if (nextIndex !== -1) {\n                const nextChannelId = allChannelIds[nextIndex];\n                this.navigateById(nextChannelId);\n                this.scrollToChannel(nextChannelId);\n            }\n        }\n    };\n\n    renderCategory = (category: ChannelCategory, index: number) => {\n        return (\n            <SidebarCategory\n                key={category.id}\n                category={category}\n                categoryIndex={index}\n                setChannelRef={this.setChannelRef}\n                handleOpenMoreDirectChannelsModal={this.props.handleOpenMoreDirectChannelsModal}\n                isNewCategory={this.props.newCategoryIds.includes(category.id)}\n            />\n        );\n    };\n\n    onScroll = debounce(() => {\n        this.updateUnreadIndicators();\n    }, 100);\n\n    onTransitionEnd = debounce(() => {\n        this.updateUnreadIndicators();\n    }, 100);\n\n    onBeforeCapture = (before: BeforeCapture) => {\n        // // Ensure no channels are animating\n        this.channelRefs.forEach((ref) => ref.classList.remove('animating'));\n\n        // Turn off scrolling temporarily so that dimensions can be captured\n        const droppable = [...document.querySelectorAll<HTMLDivElement>('[data-rbd-droppable-id*=\"droppable-categories\"]')];\n        droppable[0].style.height = `${droppable[0].scrollHeight}px`;\n\n        if (!this.props.multiSelectedChannelIds.find((id) => before.draggableId === id)) {\n            this.props.actions.clearChannelSelection();\n        }\n\n        const draggingState: DraggingState = {\n            state: DraggingStates.CAPTURE,\n            id: before.draggableId,\n        };\n\n        if (this.props.categories.some((category) => category.id === before.draggableId)) {\n            draggingState.type = DraggingStateTypes.CATEGORY;\n        } else {\n            const draggingChannels = this.props.displayedChannels.filter((channel) => this.props.multiSelectedChannelIds.indexOf(channel.id) !== -1 || channel.id === before.draggableId);\n            if (draggingChannels.every((channel) => channel.type === General.DM_CHANNEL || channel.type === General.GM_CHANNEL)) {\n                draggingState.type = DraggingStateTypes.DM;\n            } else if (draggingChannels.every((channel) => channel.type !== General.DM_CHANNEL && channel.type !== General.GM_CHANNEL)) {\n                draggingState.type = DraggingStateTypes.CHANNEL;\n            } else {\n                draggingState.type = DraggingStateTypes.MIXED_CHANNELS;\n            }\n        }\n\n        this.props.actions.setDraggingState(draggingState);\n    };\n\n    onBeforeDragStart = () => {\n        this.props.actions.setDraggingState({state: DraggingStates.BEFORE});\n    };\n\n    onDragStart = (initial: DragStart) => {\n        this.props.onDragStart(initial);\n\n        this.props.actions.setDraggingState({state: DraggingStates.DURING});\n\n        // Re-enable scroll box resizing\n        const droppable = [...document.querySelectorAll<HTMLDivElement>('[data-rbd-droppable-id*=\"droppable-categories\"]')];\n        droppable[0].style.height = '';\n    };\n\n    onDragEnd = (result: DropResult) => {\n        this.props.onDragEnd(result);\n\n        if (result.reason === 'DROP' && result.destination) {\n            if (result.type === 'SIDEBAR_CHANNEL') {\n                this.props.actions.moveChannelsInSidebar(result.destination.droppableId, result.destination.index, result.draggableId);\n                trackEvent('ui', 'ui_sidebar_dragdrop_dropped_channel');\n            } else if (result.type === 'SIDEBAR_CATEGORY') {\n                this.props.actions.moveCategory(this.props.currentTeam!.id, result.draggableId, result.destination.index);\n                trackEvent('ui', 'ui_sidebar_dragdrop_dropped_category');\n            }\n        }\n\n        this.props.actions.stopDragging();\n    };\n\n    showChannelListScrollbar = () => {\n        if (this.channelsListScrollTimeout !== null) {\n            clearTimeout(this.channelsListScrollTimeout);\n        }\n\n        this.setState({autoHide: false});\n    };\n\n    hideChannelListScrollbar = () => {\n        this.channelsListScrollTimeout = setTimeout(() => {\n            this.setState({autoHide: true});\n        }, 300);\n    };\n\n    render() {\n        const {categories} = this.props;\n\n        let channelList: React.ReactNode;\n        if (this.props.isUnreadFilterEnabled) {\n            channelList = (\n                <UnreadChannels\n                    setChannelRef={this.setChannelRef}\n                />\n            );\n        } else {\n            let unreadsCategory;\n            if (this.props.showUnreadsCategory) {\n                unreadsCategory = (\n                    <UnreadChannels\n                        setChannelRef={this.setChannelRef}\n                    />\n                );\n            }\n\n            const renderedCategories = categories.map(this.renderCategory);\n\n            channelList = (\n                <>\n                    {unreadsCategory}\n                    <DragDropContext\n                        onDragEnd={this.onDragEnd}\n                        onBeforeDragStart={this.onBeforeDragStart}\n                        onBeforeCapture={this.onBeforeCapture}\n                        onDragStart={this.onDragStart}\n                    >\n                        <Droppable\n                            droppableId='droppable-categories'\n                            type='SIDEBAR_CATEGORY'\n                        >\n                            {(provided) => {\n                                return (\n                                    <div\n                                        id={'sidebar-droppable-categories'}\n                                        ref={provided.innerRef}\n                                        {...provided.droppableProps}\n                                    >\n                                        {renderedCategories}\n                                        {provided.placeholder}\n                                    </div>\n                                );\n                            }}\n                        </Droppable>\n                    </DragDropContext>\n                </>\n            );\n        }\n\n        const above = (\n            <FormattedMessage\n                id='sidebar.unreads'\n                defaultMessage='More unreads'\n            />\n        );\n\n        const below = (\n            <FormattedMessage\n                id='sidebar.unreads'\n                defaultMessage='More unreads'\n            />\n        );\n\n        const ariaLabel = this.props.intl.formatMessage({id: 'accessibility.sections.lhsList', defaultMessage: 'channel sidebar region'});\n\n        return (\n\n            // NOTE: id attribute added to temporarily support the desktop app's at-mention DOM scraping of the old sidebar\n            <>\n                <GlobalThreadsLink/>\n                <DraftsLink/>\n                <div\n                    id='sidebar-left'\n                    role='application'\n                    aria-label={ariaLabel}\n                    className={classNames('SidebarNavContainer a11y__region', {\n                        disabled: this.props.isUnreadFilterEnabled,\n                    })}\n                    data-a11y-disable-nav={Boolean(this.props.draggingState.type)}\n                    data-a11y-sort-order='7'\n                    onTransitionEnd={this.onTransitionEnd}\n                >\n                    <UnreadChannelIndicator\n                        name='Top'\n                        show={this.state.showTopUnread}\n                        onClick={this.scrollToFirstUnreadChannel}\n                        extraClass='nav-pills__unread-indicator-top'\n                        content={above}\n                    />\n                    <UnreadChannelIndicator\n                        name='Bottom'\n                        show={this.state.showBottomUnread}\n                        onClick={this.scrollToLastUnreadChannel}\n                        extraClass='nav-pills__unread-indicator-bottom'\n                        content={below}\n                    />\n                    <div\n                        onPointerLeave={this.hideChannelListScrollbar}\n                        onPointerOver={this.showChannelListScrollbar}\n                    >\n                        <Scrollbars\n                            ref={this.scrollbar}\n                            autoHide={this.state.autoHide}\n                            renderThumbHorizontal={renderThumbHorizontal}\n                            renderThumbVertical={renderThumbVertical}\n                            renderTrackVertical={renderTrackVertical}\n                            renderView={renderView}\n                            onScroll={this.onScroll}\n                            style={scrollbarStyles}\n                        >\n                            {channelList}\n                        </Scrollbars>\n                    </div>\n                </div>\n            </>\n        );\n    }\n}\n\nexport default injectIntl(SidebarList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {moveCategory} from 'mattermost-redux/actions/channel_categories';\nimport {getCurrentChannelId, getUnreadChannelIds} from 'mattermost-redux/selectors/entities/channels';\nimport {shouldShowUnreadsCategory, isCollapsedThreadsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getThreadCountsInCurrentTeam} from 'mattermost-redux/selectors/entities/threads';\n\nimport {switchToChannelById} from 'actions/views/channel';\nimport {\n    moveChannelsInSidebar,\n    setDraggingState,\n    stopDragging,\n    clearChannelSelection,\n} from 'actions/views/channel_sidebar';\nimport {close, switchToLhsStaticPage} from 'actions/views/lhs';\nimport {getCurrentStaticPageId, getVisibleStaticPages} from 'selectors/lhs';\nimport {\n    getDisplayedChannels,\n    getDraggingState,\n    getCategoriesForCurrentTeam,\n    isUnreadFilterEnabled,\n} from 'selectors/views/channel_sidebar';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarList from './sidebar_list';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n    const collapsedThreads = isCollapsedThreadsEnabled(state);\n\n    let hasUnreadThreads = false;\n    if (collapsedThreads) {\n        hasUnreadThreads = Boolean(getThreadCountsInCurrentTeam(state)?.total_unread_threads);\n    }\n\n    return {\n        currentTeam,\n        currentChannelId: getCurrentChannelId(state),\n        categories: getCategoriesForCurrentTeam(state),\n        isUnreadFilterEnabled: isUnreadFilterEnabled(state),\n        unreadChannelIds: getUnreadChannelIds(state),\n        displayedChannels: getDisplayedChannels(state),\n        draggingState: getDraggingState(state),\n        newCategoryIds: state.views.channelSidebar.newCategoryIds,\n        multiSelectedChannelIds: state.views.channelSidebar.multiSelectedChannelIds,\n        showUnreadsCategory: shouldShowUnreadsCategory(state),\n        collapsedThreads,\n        hasUnreadThreads,\n        currentStaticPageId: getCurrentStaticPageId(state),\n        staticPages: getVisibleStaticPages(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            close,\n            switchToChannelById,\n            moveChannelsInSidebar,\n            moveCategory,\n            setDraggingState,\n            stopDragging,\n            clearChannelSelection,\n            switchToLhsStaticPage,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(SidebarList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {lazy} from 'react';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport DataPrefetch from 'components/data_prefetch';\nimport ResizableLhs from 'components/resizable_sidebar/resizable_lhs';\nimport SidebarHeader from 'components/sidebar/sidebar_header';\n\nimport Pluggable from 'plugins/pluggable';\nimport Constants, {ModalIdentifiers, RHSStates} from 'utils/constants';\nimport {isKeyPressed, cmdOrCtrlPressed} from 'utils/keyboard';\nimport {localizeMessage} from 'utils/utils';\n\nimport type {ModalData} from 'types/actions';\nimport type {RhsState} from 'types/store/rhs';\n\nimport ChannelNavigator from './channel_navigator';\nimport SidebarList from './sidebar_list';\n\nconst MobileSidebarHeader = makeAsyncComponent('MobileSidebarHeader', lazy(() => import('./mobile_sidebar_header')));\nconst MoreDirectChannels = makeAsyncComponent('MoreDirectChannels', lazy(() => import('components/more_direct_channels')));\nconst BrowseChannels = makeAsyncComponent('BrowseChannels', lazy(() => import('components/browse_channels')));\nconst EditCategoryModal = makeAsyncComponent('EditCategoryModal', lazy(() => import('components/edit_category_modal')));\nconst CreateUserGroupsModal = makeAsyncComponent('CreateUserGroupsModal', lazy(() => import('components/create_user_groups_modal')));\nconst InvitationModal = makeAsyncComponent('InvitationModal', lazy(() => import('components/invitation_modal')));\nconst KeyboardShortcutsModal = makeAsyncComponent('KeyboardShortcutsModal', lazy(() => import('components/keyboard_shortcuts/keyboard_shortcuts_modal/keyboard_shortcuts_modal')));\nconst NewChannelModal = makeAsyncComponent('NewChannelModal', lazy(() => import('components/new_channel_modal/new_channel_modal')));\nconst UserSettingsModal = makeAsyncComponent('UserSettingsModal', lazy(() => import('components/user_settings/modal')));\n\ntype Props = {\n    teamId: string;\n    canCreatePublicChannel: boolean;\n    canCreatePrivateChannel: boolean;\n    canJoinPublicChannel: boolean;\n    isOpen: boolean;\n    actions: {\n        fetchMyCategories: (teamId: string) => void;\n        openModal: <P>(modalData: ModalData<P>) => void;\n        closeModal: (modalId: string) => void;\n        clearChannelSelection: () => void;\n        closeRightHandSide: () => void;\n    };\n    unreadFilterEnabled: boolean;\n    isMobileView: boolean;\n    isKeyBoardShortcutModalOpen: boolean;\n    userGroupsEnabled: boolean;\n    canCreateCustomGroups: boolean;\n    rhsState?: RhsState;\n    rhsOpen?: boolean;\n};\n\ntype State = {\n    showDirectChannelsModal: boolean;\n    isDragging: boolean;\n};\n\nexport default class Sidebar extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            showDirectChannelsModal: false,\n            isDragging: false,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.teamId) {\n            this.props.actions.fetchMyCategories(this.props.teamId);\n        }\n\n        window.addEventListener('click', this.handleClickClearChannelSelection);\n        window.addEventListener('keydown', this.handleKeyDownEvent);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        if (this.props.teamId && prevProps.teamId !== this.props.teamId) {\n            this.props.actions.fetchMyCategories(this.props.teamId);\n        }\n    }\n\n    componentWillUnmount() {\n        window.removeEventListener('click', this.handleClickClearChannelSelection);\n        window.removeEventListener('keydown', this.handleKeyDownEvent);\n    }\n\n    handleClickClearChannelSelection = (event: MouseEvent) => {\n        if (event.defaultPrevented) {\n            return;\n        }\n\n        this.props.actions.clearChannelSelection();\n    };\n\n    handleKeyDownEvent = (event: KeyboardEvent) => {\n        if (isKeyPressed(event, Constants.KeyCodes.ESCAPE)) {\n            this.props.actions.clearChannelSelection();\n            return;\n        }\n\n        const ctrlOrMetaKeyPressed = cmdOrCtrlPressed(event, true);\n\n        if (ctrlOrMetaKeyPressed) {\n            if (isKeyPressed(event, Constants.KeyCodes.FORWARD_SLASH)) {\n                event.preventDefault();\n                if (this.props.isKeyBoardShortcutModalOpen) {\n                    this.props.actions.closeModal(ModalIdentifiers.KEYBOARD_SHORTCUTS_MODAL);\n                } else {\n                    this.props.actions.openModal({\n                        modalId: ModalIdentifiers.KEYBOARD_SHORTCUTS_MODAL,\n                        dialogType: KeyboardShortcutsModal,\n                    });\n                }\n            } else if (isKeyPressed(event, Constants.KeyCodes.A) && event.shiftKey) {\n                event.preventDefault();\n\n                this.props.actions.openModal({\n                    modalId: ModalIdentifiers.USER_SETTINGS,\n                    dialogType: UserSettingsModal,\n                    dialogProps: {\n                        isContentProductSettings: true,\n                    },\n                });\n            }\n        }\n    };\n\n    showMoreDirectChannelsModal = () => {\n        this.setState({showDirectChannelsModal: true});\n        trackEvent('ui', 'ui_channels_more_direct_v2');\n    };\n\n    hideMoreDirectChannelsModal = () => {\n        this.setState({showDirectChannelsModal: false});\n    };\n\n    showCreateCategoryModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.EDIT_CATEGORY,\n            dialogType: EditCategoryModal,\n            dialogProps: {},\n        });\n        trackEvent('ui', 'ui_sidebar_menu_createCategory');\n    };\n\n    showMoreChannelsModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.MORE_CHANNELS,\n            dialogType: BrowseChannels,\n        });\n        trackEvent('ui', 'ui_channels_more_public_v2');\n    };\n\n    invitePeopleModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.INVITATION,\n            dialogType: InvitationModal,\n        });\n        trackEvent('ui', 'ui_channels_dropdown_invite_people');\n    };\n\n    showNewChannelModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.NEW_CHANNEL_MODAL,\n            dialogType: NewChannelModal,\n        });\n        this.closeEditRHS();\n        trackEvent('ui', 'ui_channels_create_channel_v2');\n    };\n\n    showCreateUserGroupModal = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.USER_GROUPS_CREATE,\n            dialogType: CreateUserGroupsModal,\n        });\n        trackEvent('ui', 'ui_channels_create_user_group');\n    };\n\n    handleOpenMoreDirectChannelsModal = (e: Event) => {\n        e.preventDefault();\n        if (this.state.showDirectChannelsModal) {\n            this.hideMoreDirectChannelsModal();\n        } else {\n            this.showMoreDirectChannelsModal();\n            this.closeEditRHS();\n        }\n    };\n\n    onDragStart = () => {\n        this.setState({isDragging: true});\n    };\n\n    onDragEnd = () => {\n        this.setState({isDragging: false});\n    };\n\n    renderModals = () => {\n        let moreDirectChannelsModal;\n        if (this.state.showDirectChannelsModal) {\n            moreDirectChannelsModal = (\n                <MoreDirectChannels\n                    onModalDismissed={this.hideMoreDirectChannelsModal}\n                    isExistingChannel={false}\n                />\n            );\n        }\n\n        return (\n            <>\n                {moreDirectChannelsModal}\n            </>\n        );\n    };\n\n    closeEditRHS = () => {\n        if (this.props.rhsOpen && this.props.rhsState === RHSStates.EDIT_HISTORY) {\n            this.props.actions.closeRightHandSide();\n        }\n    };\n\n    render() {\n        if (!this.props.teamId) {\n            return (<div/>);\n        }\n\n        const ariaLabel = localizeMessage({id: 'accessibility.sections.lhsNavigator', defaultMessage: 'channel navigator region'});\n\n        return (\n            <ResizableLhs\n                id='SidebarContainer'\n                className={classNames({\n                    'move--right': this.props.isOpen && this.props.isMobileView,\n                    dragging: this.state.isDragging,\n                })}\n            >\n                {this.props.isMobileView ? <MobileSidebarHeader/> : (\n                    <SidebarHeader\n                        showNewChannelModal={this.showNewChannelModal}\n                        showMoreChannelsModal={this.showMoreChannelsModal}\n                        showCreateUserGroupModal={this.showCreateUserGroupModal}\n                        invitePeopleModal={this.invitePeopleModal}\n                        showCreateCategoryModal={this.showCreateCategoryModal}\n                        canCreateChannel={this.props.canCreatePrivateChannel || this.props.canCreatePublicChannel}\n                        canJoinPublicChannel={this.props.canJoinPublicChannel}\n                        handleOpenDirectMessagesModal={this.handleOpenMoreDirectChannelsModal}\n                        unreadFilterEnabled={this.props.unreadFilterEnabled}\n                        userGroupsEnabled={this.props.userGroupsEnabled}\n                        canCreateCustomGroups={this.props.canCreateCustomGroups}\n                    />\n                )}\n                <div\n                    id='lhsNavigator'\n                    role='application'\n                    aria-label={ariaLabel}\n                    className='a11y__region'\n                    data-a11y-sort-order='6'\n                >\n                    <ChannelNavigator/>\n                </div>\n                <div className='sidebar--left__icons'>\n                    <Pluggable pluggableName='LeftSidebarHeader'/>\n                </div>\n                <SidebarList\n                    handleOpenMoreDirectChannelsModal={this.handleOpenMoreDirectChannelsModal}\n                    onDragStart={this.onDragStart}\n                    onDragEnd={this.onDragEnd}\n                />\n                <DataPrefetch/>\n                {this.renderModals()}\n            </ResizableLhs>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {fetchMyCategories} from 'mattermost-redux/actions/channel_categories';\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport {isCustomGroupsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveICurrentChannelPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {clearChannelSelection} from 'actions/views/channel_sidebar';\nimport {closeModal, openModal} from 'actions/views/modals';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getIsLhsOpen} from 'selectors/lhs';\nimport {getIsRhsOpen, getRhsState} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\nimport {isUnreadFilterEnabled} from 'selectors/views/channel_sidebar';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport Sidebar from './sidebar';\n\nfunction mapStateToProps(state: GlobalState) {\n    const currentTeam = getCurrentTeam(state);\n    const unreadFilterEnabled = isUnreadFilterEnabled(state);\n    const userGroupsEnabled = isCustomGroupsEnabled(state);\n\n    let canCreatePublicChannel = false;\n    let canCreatePrivateChannel = false;\n    let canJoinPublicChannel = false;\n\n    if (currentTeam) {\n        canCreatePublicChannel = haveICurrentChannelPermission(state, Permissions.CREATE_PUBLIC_CHANNEL);\n        canCreatePrivateChannel = haveICurrentChannelPermission(state, Permissions.CREATE_PRIVATE_CHANNEL);\n        canJoinPublicChannel = haveICurrentChannelPermission(state, Permissions.JOIN_PUBLIC_CHANNELS);\n    }\n\n    const canCreateCustomGroups = haveISystemPermission(state, {permission: Permissions.CREATE_CUSTOM_GROUP}) && isCustomGroupsEnabled(state);\n\n    return {\n        teamId: currentTeam ? currentTeam.id : '',\n        canCreatePrivateChannel,\n        canCreatePublicChannel,\n        canJoinPublicChannel,\n        isOpen: getIsLhsOpen(state),\n        unreadFilterEnabled,\n        isMobileView: getIsMobileView(state),\n        isKeyBoardShortcutModalOpen: isModalOpen(state, ModalIdentifiers.KEYBOARD_SHORTCUTS_MODAL),\n        userGroupsEnabled,\n        canCreateCustomGroups,\n        rhsState: getRhsState(state),\n        rhsOpen: getIsRhsOpen(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            clearChannelSelection,\n            fetchMyCategories,\n            openModal,\n            closeModal,\n            closeRightHandSide,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Sidebar);\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 React from 'react';\nimport {injectIntl} from 'react-intl';\nimport type {IntlShape} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {basicUnreadMeta} from 'mattermost-redux/selectors/entities/channels';\nimport type {BasicUnreadStatus} from 'mattermost-redux/selectors/entities/channels';\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport faviconDefault16x16 from 'images/favicon/favicon-default-16x16.png';\nimport faviconDefault24x24 from 'images/favicon/favicon-default-24x24.png';\nimport faviconDefault32x32 from 'images/favicon/favicon-default-32x32.png';\nimport faviconDefault64x64 from 'images/favicon/favicon-default-64x64.png';\nimport faviconDefault96x96 from 'images/favicon/favicon-default-96x96.png';\nimport faviconMention16x16 from 'images/favicon/favicon-mentions-16x16.png';\nimport faviconMention24x24 from 'images/favicon/favicon-mentions-24x24.png';\nimport faviconMention32x32 from 'images/favicon/favicon-mentions-32x32.png';\nimport faviconMention64x64 from 'images/favicon/favicon-mentions-64x64.png';\nimport faviconMention96x96 from 'images/favicon/favicon-mentions-96x96.png';\nimport faviconUnread16x16 from 'images/favicon/favicon-unread-16x16.png';\nimport faviconUnread24x24 from 'images/favicon/favicon-unread-24x24.png';\nimport faviconUnread32x32 from 'images/favicon/favicon-unread-32x32.png';\nimport faviconUnread64x64 from 'images/favicon/favicon-unread-64x64.png';\nimport faviconUnread96x96 from 'images/favicon/favicon-unread-96x96.png';\nimport {Constants} from 'utils/constants';\nimport DesktopApp from 'utils/desktop_api';\nimport * as UserAgent from 'utils/user_agent';\n\nenum BadgeStatus {\n    Mention = 'Mention',\n    Unread = 'Unread',\n    None = 'None'\n}\n\ntype Props = {\n    intl: IntlShape;\n    unreadStatus: BasicUnreadStatus;\n    siteName?: string;\n    currentChannel?: Channel;\n    currentTeam?: Team;\n    currentTeammate: Channel | null;\n    inGlobalThreads: boolean;\n    inDrafts: boolean;\n};\n\nexport class UnreadsStatusHandlerClass extends React.PureComponent<Props> {\n    componentDidUpdate(prevProps: Props) {\n        this.updateTitle();\n        const oldBadgeStatus = this.getBadgeStatus(prevProps.unreadStatus);\n        const newBadgeStatus = this.getBadgeStatus(this.props.unreadStatus);\n\n        if (oldBadgeStatus !== newBadgeStatus) {\n            this.updateFavicon(newBadgeStatus);\n        }\n\n        this.updateDesktopApp();\n    }\n\n    get isDynamicFaviconSupported() {\n        return UserAgent.isChrome() || UserAgent.isFirefox();\n    }\n\n    getBadgeStatus(unreadStatus: BasicUnreadStatus) {\n        if (typeof unreadStatus === 'number') {\n            return BadgeStatus.Mention;\n        } else if (unreadStatus) {\n            return BadgeStatus.Unread;\n        }\n        return BadgeStatus.None;\n    }\n\n    updateDesktopApp = () => {\n        const {unreadStatus} = this.props;\n        const {isUnread, unreadMentionCount} = basicUnreadMeta(unreadStatus);\n\n        DesktopApp.updateUnreadsAndMentions(isUnread, unreadMentionCount);\n    };\n\n    updateTitle = () => {\n        const {\n            siteName,\n            currentChannel,\n            currentTeam,\n            currentTeammate,\n            unreadStatus,\n            inGlobalThreads,\n            inDrafts,\n        } = this.props;\n        const {formatMessage} = this.props.intl;\n\n        const currentSiteName = siteName || '';\n\n        const {isUnread, unreadMentionCount} = basicUnreadMeta(unreadStatus);\n\n        const mentionTitle = unreadMentionCount > 0 ? `(${unreadMentionCount}) ` : '';\n        const unreadTitle = !this.isDynamicFaviconSupported && isUnread ? '* ' : '';\n\n        if (currentChannel && currentTeam && currentChannel.id) {\n            let currentChannelName = currentChannel.display_name;\n            if (currentChannel.type === Constants.DM_CHANNEL) {\n                if (currentTeammate != null) {\n                    currentChannelName = currentTeammate.display_name;\n                }\n            }\n            document.title = `${mentionTitle}${unreadTitle}${currentChannelName} - ${currentTeam.display_name} ${currentSiteName}`;\n        } else if (currentTeam && inGlobalThreads) {\n            document.title = formatMessage({\n                id: 'globalThreads.title',\n                defaultMessage: '{prefix}Threads - {displayName} {siteName}',\n            }, {\n                prefix: `${mentionTitle}${unreadTitle}`,\n                displayName: currentTeam.display_name,\n                siteName: currentSiteName,\n            });\n        } else if (currentTeam && inDrafts) {\n            document.title = formatMessage({\n                id: 'drafts.title',\n                defaultMessage: '{prefix}Drafts - {displayName} {siteName}',\n            }, {\n                prefix: `${mentionTitle}${unreadTitle}`,\n                displayName: currentTeam.display_name,\n                siteName: currentSiteName,\n            });\n        } else {\n            document.title = formatMessage({id: 'sidebar.team_select', defaultMessage: '{siteName} - Join a team'}, {siteName: currentSiteName || 'Mattermost'});\n        }\n    };\n\n    updateFavicon = (badgeStatus: BadgeStatus) => {\n        if (!(UserAgent.isFirefox() || UserAgent.isChrome())) {\n            return;\n        }\n\n        const link = document.querySelector('link[rel=\"icon\"]');\n\n        if (!link) {\n            return;\n        }\n        const link16x16 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"16x16\"]');\n        const link24x24 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"24x24\"]');\n        const link32x32 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"32x32\"]');\n        const link64x64 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"64x64\"]');\n        const link96x96 = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"][sizes=\"96x96\"]');\n\n        const getFavicon = (url: string): string => ensureString(url);\n\n        switch (badgeStatus) {\n        case BadgeStatus.Mention: {\n            link16x16!.href = getFavicon(faviconMention16x16);\n            link24x24!.href = getFavicon(faviconMention24x24);\n            link32x32!.href = getFavicon(faviconMention32x32);\n            link64x64!.href = getFavicon(faviconMention64x64);\n            link96x96!.href = getFavicon(faviconMention96x96);\n            break;\n        }\n        case BadgeStatus.Unread: {\n            link16x16!.href = getFavicon(faviconUnread16x16);\n            link24x24!.href = getFavicon(faviconUnread24x24);\n            link32x32!.href = getFavicon(faviconUnread32x32);\n            link64x64!.href = getFavicon(faviconUnread64x64);\n            link96x96!.href = getFavicon(faviconUnread96x96);\n            break;\n        }\n        default: {\n            link16x16!.href = getFavicon(faviconDefault16x16);\n            link24x24!.href = getFavicon(faviconDefault24x24);\n            link32x32!.href = getFavicon(faviconDefault32x32);\n            link64x64!.href = getFavicon(faviconDefault64x64);\n            link96x96!.href = getFavicon(faviconDefault96x96);\n        }\n        }\n    };\n\n    render() {\n        return null;\n    }\n}\n\nexport default injectIntl(UnreadsStatusHandlerClass);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter, matchPath} from 'react-router-dom';\nimport type {RouteChildrenProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCurrentChannel, getUnreadStatus} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport UnreadsStatusHandler from './unreads_status_handler';\n\ntype Props = RouteChildrenProps;\n\nfunction mapStateToProps(state: GlobalState, {location: {pathname}}: Props) {\n    const config = getConfig(state);\n    const currentChannel = getCurrentChannel(state);\n    const currentTeammate = (currentChannel && currentChannel.teammate_id) ? currentChannel : null;\n    const currentTeam = getCurrentTeam(state);\n\n    return {\n        currentChannel,\n        currentTeam,\n        currentTeammate,\n        siteName: config.SiteName,\n        unreadStatus: getUnreadStatus(state),\n        inGlobalThreads: matchPath(pathname, {path: '/:team/threads/:threadIdentifier?'}) != null,\n        inDrafts: matchPath(pathname, {path: '/:team/drafts'}) != null,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(UnreadsStatusHandler));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {lazy, useEffect} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {cleanUpStatusAndProfileFetchingPoll} from 'mattermost-redux/actions/status_profile_polling';\nimport {getIsUserStatusesConfigEnabled} from 'mattermost-redux/selectors/entities/common';\n\nimport {addVisibleUsersInCurrentChannelAndSelfToStatusPoll} from 'actions/status_actions';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport CenterChannel from 'components/channel_layout/center_channel';\nimport LoadingScreen from 'components/loading_screen';\nimport QueryParamActionController from 'components/query_param_actions/query_param_action_controller';\nimport Sidebar from 'components/sidebar';\nimport CRTPostsChannelResetWatcher from 'components/threading/channel_threads/posts_channel_reset_watcher';\nimport UnreadsStatusHandler from 'components/unreads_status_handler';\n\nimport Pluggable from 'plugins/pluggable';\nimport {Constants} from 'utils/constants';\nimport {isInternetExplorer, isEdge} from 'utils/user_agent';\n\nconst ProductNoticesModal = makeAsyncComponent('ProductNoticesModal', lazy(() => import('components/product_notices_modal')));\nconst ResetStatusModal = makeAsyncComponent('ResetStatusModal', lazy(() => import('components/reset_status_modal')));\n\nconst BODY_CLASS_FOR_CHANNEL = ['app__body', 'channel-view'];\n\ntype Props = {\n    shouldRenderCenterChannel: boolean;\n}\n\nexport default function ChannelController(props: Props) {\n    const enabledUserStatuses = useSelector(getIsUserStatusesConfigEnabled);\n    const dispatch = useDispatch();\n\n    useEffect(() => {\n        const isMsBrowser = isInternetExplorer() || isEdge();\n        const {navigator} = window;\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        const platform = navigator?.userAgentData?.platform || navigator?.platform || 'unknown';\n        document.body.classList.add(...getClassnamesForBody(platform, isMsBrowser));\n\n        return () => {\n            document.body.classList.remove(...BODY_CLASS_FOR_CHANNEL);\n\n            // This cleans up the status and profile setInterval of fetching poll we use to batch requests\n            // when fetching statuses and profiles for a list of users.\n            dispatch(cleanUpStatusAndProfileFetchingPoll());\n        };\n    }, []);\n\n    // Starts a regular interval to fetch statuses of users.\n    // see function \"addVisibleUsersInCurrentChannelAndSelfToStatusPoll\" for more details on which user's statuses are fetched.\n    useEffect(() => {\n        let loadStatusesIntervalId: NodeJS.Timeout;\n        if (enabledUserStatuses) {\n            loadStatusesIntervalId = setInterval(() => {\n                dispatch(addVisibleUsersInCurrentChannelAndSelfToStatusPoll());\n            }, Constants.STATUS_INTERVAL);\n        }\n\n        return () => {\n            clearInterval(loadStatusesIntervalId);\n        };\n    }, [enabledUserStatuses]);\n\n    return (\n        <>\n            <CRTPostsChannelResetWatcher/>\n            <QueryParamActionController/>\n            <Sidebar/>\n            <div\n                id='channel_view'\n                className='channel-view'\n                data-testid='channel_view'\n            >\n                <UnreadsStatusHandler/>\n                <ProductNoticesModal/>\n                <div className={classNames('container-fluid channel-view-inner')}>\n                    {props.shouldRenderCenterChannel ? <CenterChannel/> : <LoadingScreen centered={true}/>}\n                    <Pluggable pluggableName='Root'/>\n                    <ResetStatusModal/>\n                </div>\n            </div>\n        </>\n    );\n}\n\nexport function getClassnamesForBody(platform: Window['navigator']['platform'], isMsBrowser = false) {\n    const bodyClass = [...BODY_CLASS_FOR_CHANNEL];\n\n    // OS Detection\n    if (platform === 'Win32' || platform === 'Win64') {\n        bodyClass.push('os--windows');\n    } else if (platform === 'MacIntel' || platform === 'MacPPC') {\n        bodyClass.push('os--mac');\n    }\n\n    // IE Detection\n    if (isMsBrowser) {\n        bodyClass.push('browser--ie');\n    }\n\n    return bodyClass;\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport iNoBounce from 'inobounce';\nimport React, {lazy, memo, useEffect, useRef, useState} from 'react';\nimport {Route, Switch, useHistory, useParams} from 'react-router-dom';\n\nimport type {ServerError} from '@mattermost/types/errors';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport {reconnect} from 'actions/websocket_actions.jsx';\nimport LocalStorageStore from 'stores/local_storage_store';\n\nimport {makeAsyncComponent} from 'components/async_load';\nimport ChannelController from 'components/channel_layout/channel_controller';\nimport useTelemetryIdentitySync from 'components/common/hooks/useTelemetryIdentifySync';\nimport InitialLoadingScreen from 'components/initial_loading_screen';\n\nimport Constants from 'utils/constants';\nimport DesktopApp from 'utils/desktop_api';\nimport {cmdOrCtrlPressed, isKeyPressed} from 'utils/keyboard';\nimport {TEAM_NAME_PATH_PATTERN} from 'utils/path';\nimport {isIosSafari} from 'utils/user_agent';\n\nimport type {OwnProps, PropsFromRedux} from './index';\n\nconst BackstageController = makeAsyncComponent('BackstageController', lazy(() => import('components/backstage')));\nconst Pluggable = makeAsyncComponent('Pluggable', lazy(() => import('plugins/pluggable')));\n\nconst WAKEUP_CHECK_INTERVAL = 30000; // 30 seconds\nconst WAKEUP_THRESHOLD = 60000; // 60 seconds\nconst UNREAD_CHECK_TIME_MILLISECONDS = 120 * 1000;\n\ndeclare global {\n    interface Window {\n        isActive: boolean;\n    }\n}\n\ntype Props = PropsFromRedux & OwnProps;\n\nfunction TeamController(props: Props) {\n    const history = useHistory();\n    const {team: teamNameParam} = useParams<Props['match']['params']>();\n\n    const [initialChannelsLoaded, setInitialChannelsLoaded] = useState(false);\n\n    const [team, setTeam] = useState<Team | null>(getTeamFromTeamList(props.teamsList, teamNameParam));\n\n    const blurTime = useRef(Date.now());\n    const lastTime = useRef(Date.now());\n\n    useTelemetryIdentitySync();\n\n    useEffect(() => {\n        InitialLoadingScreen.stop('team_controller');\n        DesktopApp.reactAppInitialized();\n        async function fetchAllChannels() {\n            await props.fetchAllMyTeamsChannels();\n\n            setInitialChannelsLoaded(true);\n        }\n\n        props.fetchAllMyChannelMembers();\n        fetchAllChannels();\n    }, []);\n\n    useEffect(() => {\n        if (props.disableWakeUpReconnectHandler) {\n            return () => {};\n        }\n\n        const wakeUpIntervalId = setInterval(() => {\n            const currentTime = Date.now();\n            if ((currentTime - lastTime.current) > WAKEUP_THRESHOLD) {\n                console.log('computer woke up - reconnecting'); //eslint-disable-line no-console\n                reconnect();\n            }\n            lastTime.current = currentTime;\n        }, WAKEUP_CHECK_INTERVAL);\n\n        return () => {\n            clearInterval(wakeUpIntervalId);\n        };\n    }, [props.disableWakeUpReconnectHandler]);\n\n    // Effect runs on mount, add event listeners on windows object\n    useEffect(() => {\n        function handleFocus() {\n            window.isActive = true;\n            props.markAsReadOnFocus();\n\n            // Temporary flag to disable refetching of channel members on browser focus\n            if (!props.disableRefetchingOnBrowserFocus) {\n                const currentTime = Date.now();\n                if ((currentTime - blurTime.current) > UNREAD_CHECK_TIME_MILLISECONDS && props.currentTeamId) {\n                    props.fetchChannelsAndMembers(props.currentTeamId);\n                }\n            }\n        }\n\n        function handleBlur() {\n            window.isActive = false;\n            blurTime.current = Date.now();\n            props.unsetActiveChannelOnServer();\n        }\n\n        function handleKeydown(event: KeyboardEvent) {\n            if (event.shiftKey && cmdOrCtrlPressed(event) && isKeyPressed(event, Constants.KeyCodes.L)) {\n                const replyTextbox = document.querySelector<HTMLElement>('#sidebar-right.is-open.expanded #reply_textbox');\n                if (replyTextbox) {\n                    replyTextbox.focus();\n                } else {\n                    const postTextbox = document.getElementById('post_textbox');\n                    if (postTextbox) {\n                        postTextbox.focus();\n                    }\n                }\n            }\n        }\n\n        window.addEventListener('focus', handleFocus);\n        window.addEventListener('blur', handleBlur);\n        window.addEventListener('keydown', handleKeydown);\n\n        return () => {\n            window.removeEventListener('focus', handleFocus);\n            window.removeEventListener('blur', handleBlur);\n            window.removeEventListener('keydown', handleKeydown);\n        };\n    }, [props.currentTeamId]);\n\n    // Effect runs on mount, adds active state to window\n    useEffect(() => {\n        const browserIsIosSafari = isIosSafari();\n        if (browserIsIosSafari) {\n            // Use iNoBounce to prevent scrolling past the boundaries of the page\n            iNoBounce.enable();\n        }\n\n        // Set up tracking for whether the window is active\n        window.isActive = true;\n\n        LocalStorageStore.setTeamIdJoinedOnLoad(null);\n\n        return () => {\n            window.isActive = false;\n\n            if (browserIsIosSafari) {\n                iNoBounce.disable();\n            }\n        };\n    }, []);\n\n    async function initTeamOrRedirect(team: Team) {\n        const {data: joinedTeam, error} = await props.initializeTeam(team) as ActionResult<Team, ServerError>; // Fix in MM-46907;\n        if (error) {\n            history.push('/error?type=team_not_found');\n            return;\n        }\n        if (joinedTeam) {\n            setTeam(joinedTeam);\n        }\n    }\n\n    async function joinTeamOrRedirect(teamNameParam: string, joinedOnFirstLoad: boolean) {\n        setTeam(null);\n\n        const {data: joinedTeam, error} = await props.joinTeam(teamNameParam, joinedOnFirstLoad) as ActionResult<Team, ServerError>; // Fix in MM-46907;\n        if (error) {\n            history.push('/error?type=team_not_found');\n            return;\n        }\n        if (joinedTeam) {\n            setTeam(joinedTeam);\n        }\n    }\n\n    const teamsListDependency = props.teamsList.map((team) => team.id).sort().join('+');\n\n    // Effect to run when url for team or teamsList changes\n    useEffect(() => {\n        if (teamNameParam) {\n            // skip reserved team names\n            if (Constants.RESERVED_TEAM_NAMES.includes(teamNameParam)) {\n                return;\n            }\n\n            const teamFromTeamNameParam = getTeamFromTeamList(props.teamsList, teamNameParam);\n            if (teamFromTeamNameParam) {\n                // If the team is already in the teams list, initialize it when we switch teams\n                initTeamOrRedirect(teamFromTeamNameParam);\n            } else if (team && team.name !== teamNameParam) {\n                // When we are already in a team and the new team is not in the teams list, attempt to join it\n                joinTeamOrRedirect(teamNameParam, false);\n            } else if (!team) {\n                // When we are not in a team and the new team is not in the teams list, attempt to join it\n                joinTeamOrRedirect(teamNameParam, true);\n            }\n        }\n    }, [teamNameParam, teamsListDependency]);\n\n    if (props.mfaRequired) {\n        history.push('/mfa/setup');\n        return null;\n    }\n\n    if (team === null) {\n        return null;\n    }\n\n    const teamLoaded = team?.name.toLowerCase() === teamNameParam?.toLowerCase();\n\n    return (\n        <Switch>\n            <Route\n                path={`/:team(${TEAM_NAME_PATH_PATTERN})/integrations`}\n                component={BackstageController}\n            />\n            <Route\n                path={`/:team(${TEAM_NAME_PATH_PATTERN})/emoji`}\n                component={BackstageController}\n            />\n            {props.plugins?.map((plugin) => (\n                <Route\n                    key={plugin.id}\n                    path={`/:team(${TEAM_NAME_PATH_PATTERN})/` + (plugin as any).route}\n                    render={() => (\n                        <Pluggable\n                            pluggableName={'NeedsTeamComponent'}\n                            pluggableId={plugin.id}\n                            css={{gridArea: 'center'}}\n                        />\n                    )}\n                />\n            ))}\n            <ChannelController shouldRenderCenterChannel={initialChannelsLoaded && teamLoaded}/>\n        </Switch>\n    );\n}\n\nfunction getTeamFromTeamList(teamsList: Props['teamsList'], teamName?: string) {\n    if (!teamName) {\n        return null;\n    }\n\n    const team = teamsList.find((teamInList) => teamInList.name === teamName) ?? null;\n    if (!team) {\n        return null;\n    }\n\n    return team;\n}\n\nexport default memo(TeamController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useEffect} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {Client4} from 'mattermost-redux/client';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\n/**\n * The purpose of this hook is to sync the user's id and role with client4's user id and role,\n * which is essential to identify the user in telemetry.\n */\nfunction useTelemetryIdentitySync() {\n    const user = useSelector(getCurrentUser);\n    const userId = user?.id ?? '';\n    const userRoles = user?.roles ?? '';\n\n    useEffect(() => {\n        if (userId) {\n            Client4.setUserId(userId);\n        }\n        if (userRoles) {\n            Client4.setUserRoles(userRoles);\n        }\n    }, [userId, userRoles]);\n}\n\nexport default useTelemetryIdentitySync;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {ConnectedProps} from 'react-redux';\nimport type {RouteComponentProps} from 'react-router-dom';\n\nimport {fetchAllMyTeamsChannels, fetchAllMyChannelMembers, fetchChannelsAndMembers, unsetActiveChannelOnServer} from 'mattermost-redux/actions/channels';\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';\nimport {getLicense, getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentTeamId, getMyTeams} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {markAsReadOnFocus} from 'actions/views/channel';\nimport {getSelectedPostId} from 'selectors/rhs';\nimport {getSelectedThreadIdInCurrentTeam} from 'selectors/views/threads';\n\nimport {initializeTeam, joinTeam} from 'components/team_controller/actions';\n\nimport {checkIfMFARequired} from 'utils/route';\n\nimport type {GlobalState} from 'types/store';\n\nimport TeamController from './team_controller';\n\ntype Params = {\n    url: string;\n    team?: string;\n}\n\nexport type OwnProps = RouteComponentProps<Params>;\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const license = getLicense(state);\n    const config = getConfig(state);\n    const currentUser = getCurrentUser(state);\n    const plugins = state.plugins.components.NeedsTeamComponent;\n    const disableRefetchingOnBrowserFocus = config.DisableRefetchingOnBrowserFocus === 'true';\n    const disableWakeUpReconnectHandler = config.DisableWakeUpReconnectHandler === 'true';\n\n    return {\n        currentTeamId: getCurrentTeamId(state),\n        currentChannelId: getCurrentChannelId(state),\n        teamsList: getMyTeams(state),\n        plugins,\n        selectedThreadId: getSelectedThreadIdInCurrentTeam(state),\n        selectedPostId: getSelectedPostId(state),\n        mfaRequired: checkIfMFARequired(currentUser, license, config, ownProps.match.url),\n        disableRefetchingOnBrowserFocus,\n        disableWakeUpReconnectHandler,\n    };\n}\n\nconst mapDispatchToProps = {\n    fetchChannelsAndMembers,\n    fetchAllMyTeamsChannels,\n    fetchAllMyChannelMembers,\n    markAsReadOnFocus,\n    initializeTeam,\n    joinTeam,\n    unsetActiveChannelOnServer,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(TeamController);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nconst CheckboxCheckedIcon = () => (\n    <svg\n        width='18px'\n        height='18px'\n        viewBox='0 0 18 18'\n    >\n        <g\n            id='Developer-Export'\n            stroke='none'\n            strokeWidth='1'\n            fillRule='evenodd'\n        >\n            <g\n                transform='translate(-285.000000, -933.000000)'\n                id='All-Team-Members'\n            >\n                <g transform='translate(245.000000, 698.000000)'>\n                    <g\n                        id='Channel-Administrators'\n                        transform='translate(0.000000, 106.000000)'\n                    >\n                        <g\n                            id='data-table/column-1'\n                            transform='translate(11.000000, 86.000000)'\n                        >\n                            <g\n                                id='row-checkbox---Public-Channels'\n                                transform='translate(12.000000, 35.000000)'\n                            >\n                                <g\n                                    id='Stacked-Group'\n                                    transform='translate(0.000000, 5.000000)'\n                                >\n                                    <g id='data-table/1st/row-checkbox-label-base'>\n                                        <g\n                                            id='check-on-copy-11'\n                                            transform='translate(14.000000, 0.000000)'\n                                        >\n                                            <path\n                                                d='M19,3 L5,3 C3.9,3 3,3.9 3,5 L3,19 C3,20.1 3.9,21 5,21 L19,21 C20.1,21 21,20.1 21,19 L21,5 C21,3.9 20.1,3 19,3 L19,3 Z M10,17 L5,12.1923077 L6.4,10.8461538 L10,14.3076923 L17.6,7 L19,8.34615385 L10,17 L10,17 Z'\n                                                id='checkbox---checked'\n                                            />\n                                        </g>\n                                    </g>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n            </g>\n        </g>\n    </svg>\n);\n\nexport default memo(CheckboxCheckedIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChannelBookmarksState} from '@mattermost/types/channel_bookmarks';\nimport type {GlobalState} from '@mattermost/types/store';\n\nconst EMPTY_BOOKMARKS = {};\n\nexport const getChannelBookmarks = (state: GlobalState, channelId: string): ChannelBookmarksState['byChannelId'][string] => {\n    const bookmarks = state.entities.channelBookmarks.byChannelId[channelId];\n\n    if (!bookmarks) {\n        return EMPTY_BOOKMARKS;\n    }\n\n    return bookmarks;\n};\n\nexport const getChannelBookmark = (state: GlobalState, channelId: string, bookmarkId: string) => {\n    return getChannelBookmarks(state, channelId)[bookmarkId];\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {\n    isCollapsedThreadsEnabled,\n} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {makeGetDraftsCount} from 'selectors/drafts';\n\nimport type {SidebarSize} from 'components/resizable_sidebar/constants';\n\nimport type {GlobalState} from 'types/store';\nimport type {StaticPage} from 'types/store/lhs';\n\nexport function getIsLhsOpen(state: GlobalState): boolean {\n    return state.views.lhs.isOpen;\n}\n\nexport function getLhsSize(state: GlobalState): SidebarSize {\n    return state.views.lhs.size;\n}\n\nexport function getCurrentStaticPageId(state: GlobalState): string {\n    return state.views.lhs.currentStaticPageId;\n}\n\nexport const getDraftsCount = makeGetDraftsCount();\n\nexport const getVisibleStaticPages = createSelector(\n    'getVisibleSidebarStaticPages',\n    isCollapsedThreadsEnabled,\n    getDraftsCount,\n    (collapsedThreadsEnabled, draftsCount) => {\n        const staticPages: StaticPage[] = [];\n\n        if (collapsedThreadsEnabled) {\n            staticPages.push({\n                id: 'threads',\n                isVisible: true,\n            });\n        }\n\n        staticPages.push({\n            id: 'drafts',\n            isVisible: draftsCount > 0,\n        });\n\n        return staticPages.filter((item) => item.isVisible);\n    },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nexport type SuccessResult = {data: any}\n\nexport type ErrorResult = {error: any}\n\nexport function isSuccess(result: ActionResult): result is SuccessResult {\n    return 'data' in result && !isError(result);\n}\n\nexport function isError(result: ActionResult): result is ErrorResult {\n    return Boolean((result as ErrorResult).error);\n}\n\nexport type ModalData<ModalProps> = {\n    modalId: string;\n    dialogProps?: Omit<ModalProps, 'onHide' | 'onExited'> & {onHide?: () => void; onExited?: () => void};\n    dialogType: React.ElementType<ModalProps>;\n}\n"],"names":["deleteBookmark","channelId","id","dispatch","getState","state","connectionId","getConnectionId","async","bookmark","getChannelBookmark","Client4","deleteChannelBookmark","type","ChannelBookmarkTypes","BOOKMARK_DELETED","data","error","Actions","createBookmark","createdBookmark","createChannelBookmark","RECEIVED_BOOKMARK","editBookmark","patch","updated","deleted","updateChannelBookmark","reorderBookmark","newOrder","bookmarks","updateChannelBookmarkSortOrder","RECEIVED_BOOKMARKS","fetchChannelBookmarks","getChannelBookmarks","forceLogoutIfNecessary","logError","setUnreadFilterEnabled","enabled","ActionTypes","SET_UNREAD_FILTER_ENABLED","setDraggingState","SIDEBAR_DRAGGING_SET_STATE","stopDragging","SIDEBAR_DRAGGING_STOP","createCategory","teamId","displayName","channelIds","multiSelectedChannelIds","views","channelSidebar","forEach","indexOf","multiSelectChannelAdd","result","createCategoryRedux","ADD_NEW_CATEGORY_ID","addChannelsInSidebar","categoryId","moveChannelsInSidebar","targetIndex","draggableChannelId","setManualSorting","arguments","length","undefined","categories","getCategoriesForCurrentTeam","displayedChannels","getDisplayedChannels","channelsToMove","targetCategory","find","category","filter","selectedChannel","channel","isDMGM","General","DM_CHANNEL","GM_CHANNEL","CategoryTypes","CUSTOM","FAVORITES","DIRECT_MESSAGES","displayedChannelIds","map","sort","a","b","newIndex","getCategory","filteredChannelIds","makeGetChannelIdsForCategory","removedChannelsAboveInsert","index","shiftedIndex","channel_ids","updatedChannelIds","insertMultipleWithoutDuplicates","previousChannelId","sourceIndex","Math","max","adjustTargetIndexForMove","moveChannelsToCategory","clearChannelSelection","MULTISELECT_CHANNEL_CLEAR","currentChannel","getCurrentChannelId","MULTISELECT_CHANNEL","MULTISELECT_CHANNEL_ADD","multiSelectChannelTo","lastSelected","lastSelectedChannel","allChannelsIdsInOrder","getChannelsInCategoryOrder","indexOfNew","indexOfLast","start","min","end","inBetween","slice","MULTISELECT_CHANNEL_TO","AddGroupsToChannelModal","React","constructor","props","super","_defineProperty","this","actions","setModalSearchTerm","setState","show","err","addError","message","saving","groupIDs","values","v","skipCommit","onAddCallback","handleHide","Promise","all","linkGroupSyncable","groupID","currentChannelId","SyncableType","Channel","auto_add","handleResponse","value","Object","assign","userIds","push","loadingState","loadingGroups","page","prevPage","setGroupsLoadingState","getGroupsNotAssociatedToChannel","searchTerm","GROUPS_PER_PAGE","then","term","option","isSelected","onAdd","onMouseMove","rowSelected","key","ref","selectedItemRef","className","onClick","src","groupsAvatar","alt","width","height","display_name","FormattedMessage","defaultMessage","num","member_count","searchTimeoutId","search","componentDidMount","getTeam","teamID","getAllGroupsAssociatedToTeam","getAllGroupsAssociatedToChannel","componentDidUpdate","prevProps","clearTimeout","window","setTimeout","Constants","SEARCH_TIMEOUT_MILLISECONDS","renderValue","render","numRemainingText","buttonSubmitText","defineMessage","buttonSubmitLoadingText","groupsToShow","groups","excludeGroups","hasGroup","og","g","includeGroups","groupsToShowValues","group","_objectSpread","label","Modal","dialogClassName","onHide","onExited","Header","closeButton","Title","componentClass","channelName","currentChannelName","Body","MultiSelect","options","optionRenderer","renderOption","intl","valueRenderer","perPage","handlePageChange","handleInput","handleDelete","handleAdd","addValue","handleSubmit","maxValues","loading","placeholderText","_pt","isRequired","injectIntl","connect","ownProps","modalSearch","getCurrentChannel","selectGroupsNotAssociatedToChannel","team_id","regex","RegExp","test","name","bindActionCreators","fill","xmlns","opacity","d","fillOpacity","SearchableChannelList","getDerivedStateFromProps","isSearch","e","target","isEnterKeyPressed","isKeyPressed","KeyCodes","ENTER","shiftKey","ctrlKey","altKey","classList","contains","click","stopPropagation","joiningChannel","handleJoin","isMemberOfChannel","closeModal","ModalIdentifiers","MORE_CHANNELS","_this$props$channelsM","ariaLabel","concat","purpose","toLowerCase","channelTypeIcon","isArchivedChannel","ArchiveOutlineIcon","size","isPrivateChannel","LockOutlineIcon","GlobeIcon","memberCount","channelsMemberCount","membershipIndicator","formatMessage","CheckIcon","channelPurposeContainerAriaLabel","messages","channelPurpose","channelPurposeContainer","AccountOutlineIcon","joinViewChannelButtonClass","classNames","joinViewChannelButton","disabled","Boolean","tabIndex","LoadingWrapper","text","joiningButton","sharedChannelIcon","shared","SharedChannelIndicator","withTooltip","_this$channelListScro","preventDefault","nextDisabled","nextTimeoutId","nextPage","channelListScroll","current","scrollTo","top","_this$channelListScro2","channelSearchValue","currentTarget","doSearch","rememberHideJoinedChannelsChecked","hideJoinedChannelsPreference","tagName","Filter","Archived","Private","Public","UserAgent","focus","document","addEventListener","onKeyDown","componentWillUnmount","removeEventListener","myChannelMemberships","channels","listContent","nextButton","previousButton","LoadingScreen","noMore","MagnifyingGlassSVG","getEmptyStateMessage","noResultsText","pageStart","channelsPerPage","pageEnd","channelsToDisplay","createChannelRow","previousPage","input","QuickInput","placeholder","onInput","handleChange","clearable","onClear","handleClear","checkIcon","color","channelDropdownItems","Menu","changeFilter","All","leadingElement","GlobeCheckedIcon","labels","trailingElements","canShowArchivedChannels","menuButton","getFilterLabel","ChevronDownIcon","channelDropdown","children","menu","item","hideJoinedButtonClass","checked","hideJoinedPreferenceCheckbox","handleChecked","CheckboxCheckedIcon","channelCountLabel","channelCount","count","dropDownContainer","role","defineMessages","BrowseChannels","handleExit","closeEditRHS","openModal","modalId","NEW_CHANNEL_MODAL","dialogType","NewChannelModal","rhsOpen","rhsState","RHSStates","EDIT_HISTORY","closeRightHandSide","force","searchedChannels","serverError","getChannels","getChannelsMemberCount","done","_result","currentUserId","teamName","joinChannel","getHistory","getRelativeChannelURL","onChange","searching","searchAllChannels","team_ids","nonAdminSearch","include_deleted","channelIDsForMemberCount","setSearchResults","ignoredErr","c","PRIVATE_CHANNEL","OPEN_CHANNEL","delete_at","shouldHideJoinedChannels","getChannelsWithoutJoined","setGlobalItem","StoragePrefixes","HIDE_JOINED_CHANNELS","toString","channelList","archivedChannels","privateChannels","allChannels","localeCompare","allChannelsWithoutJoined","publicChannelsWithoutJoined","archivedChannelsWithoutJoined","privateChannelsWithoutJoined","filterOptions","loadComplete","promises","CHANNELS_CHUNK_SIZE","getArchivedChannels","results","flatMap","channelsRequestStarted","serverErrorState","activeChannels","getActiveChannels","createNewChannelButton","icon","buttonClassName","TeamPermissionGate","permissions","Permissions","CREATE_PUBLIC_CHANNEL","handleNewChannel","localizeMessage","body","handleShowJoinedChannelsPreference","title","GenericModal","compassDesign","modalHeaderText","headerButton","autoCloseOnConfirmButton","enforceFocus","bodyPadding","getChannelsWithoutArchived","createSelector","getChannelsInCurrentTeam","getArchivedOtherChannels","getPrivateChannelsSelector","team","getCurrentTeam","getGlobalItem","makeGetGlobalItem","getCurrentUserId","getCurrentTeamId","requests","status","RequestStatus","STARTED","getConfig","ExperimentalViewArchivedChannels","getMyChannelMemberships","getRhsState","getIsRhsOpen","getChannelsMemberCountSelector","MAX_BOOKMARKS_PER_CHANNEL","BOOKMARK_PERMISSION","ADD_BOOKMARK_PUBLIC_CHANNEL","EDIT_BOOKMARK_PUBLIC_CHANNEL","DELETE_BOOKMARK_PUBLIC_CHANNEL","ORDER_BOOKMARK_PUBLIC_CHANNEL","ADD_BOOKMARK_PRIVATE_CHANNEL","EDIT_BOOKMARK_PRIVATE_CHANNEL","DELETE_BOOKMARK_PRIVATE_CHANNEL","ORDER_BOOKMARK_PRIVATE_CHANNEL","useChannelBookmarkPermission","action","useSelector","getHaveIChannelBookmarkPermission","getChannel","myMembership","getMyChannelMember","channel_id","permission","haveIChannelPermission","useCanUploadFiles","canUploadFiles","useCanGetPublicLink","isPublicLinksEnabled","getIsChannelBookmarksEnabled","getFeatureFlagValue","license","getLicense","IsLicensed","useChannelBookmarks","useDispatch","order","useMemo","keys","sort_order","tempOrder","setTempOrder","useState","useEffect","emojis","reduce","_ref","emoji","trimmedEmojiName","loadCustomEmojisIfNeeded","reorder","prevOrder","nextOrder","insertWithoutDuplicates","withBackupValue","maybeLimit","limitsLoaded","Number","MAX_VALUE","useGetUsageDeltas","usage","useGetUsage","limits","useGetLimits","_limits$files","_limits$messages","_limits$teams","files","totalStorage","total_storage","totalStorageLoaded","history","historyLoaded","teams","active","cloudArchived","teamsLoaded","EditCategoryModal","categoryName","isProcessing","timeoutId","renameCategory","currentTeamId","channelIdsToAdd","trackEvent","initialCategoryName","editButtonText","helpText","getText","confirmButtonText","handleEnterKeyPress","handleConfirm","handleCancel","isConfirmDisabled","inputComponent","MaxLengthInput","autoFocus","maxLength","SearchShortcut","variant","controlKey","isMac","shortcutKeyVariant","ShortcutKeyVariant","Contrast","ShortcutKey","isDesktopApp","propTypes","CreateNewCategoryMenuItem","otherProps","_objectWithoutProperties","_excluded","handleCreateCategory","useCallback","EDIT_CATEGORY","FolderPlusOutlineIcon","MarkAsReadConfirmModal","numChannels","useIntl","header","confirm","MarkAsUnreadItem","handleViewCategory","DELETE_CATEGORY","dialogProps","MarkAsUnreadIcon","SidebarCategoryGenericMenu","isMenuOpen","setIsMenuOpen","menuOpen","class","DotsVerticalIcon","menuButtonTooltip","onToggle","isOpen","memo","SidebarCategoryHeaderStatic","wrapEmojis","SidebarCategoryHeader","dragHandleProps","Reflect","deleteProperty","muted","dragging","isDragging","isCollapsed","isCollapsible","isDraggingOver","defaultProps","ChannelMentionBadge","unreadMentions","hasUrgent","badge","urgent","ChannelPencilIcon","hasDraft","draft","trim","fileInfos","uploadsInProgress","getPostDraft","DRAFT","SidebarChannelIcon","isDeleted","ChannelMoveToSubMenu","getAllChannels","currentTeam","currentCategory","getCategoryInTeamWithChannel","handleMoveToCategory","event","handleMoveToNewCategory","createSubmenuItemsForCategoryArray","CHANNELS","selectedCategory","StarOutlineIcon","FolderOutlineIcon","FolderMoveOutlineIcon","filterCategoriesBasedOnChannelType","inHeaderDropdown","ChevronRightIcon","menuId","menuAriaLabel","isSubmenuOneOfSelectedChannels","includes","every","getMoveToCategorySubmenuItems","SidebarChannelMenu","channelLink","favoriteChannel","isFavorite","isMuted","isUnread","managePrivateChannelMembers","managePublicChannelMembers","readMultipleChannels","markMostRecentPostInChannelAsUnread","muteChannel","onMenuToggle","unfavoriteChannel","unmuteChannel","channelLeaveHandler","isLeaving","useRef","markAsReadUnreadMenuItem","handleMarkAsRead","handleMarkAsUnread","favoriteUnfavoriteMenuItem","handleUnfavoriteChannel","StarIcon","handleFavoriteChannel","muteUnmuteChannelMenuItem","muteChannelText","handleUnmuteChannel","BellOffOutlineIcon","handleMuteChannel","BellOutlineIcon","copyLinkMenuItem","handleCopyLink","copyToClipboard","LinkVariantIcon","addMembersMenuItem","handleAddMembers","CHANNEL_INVITE","ChannelInviteModal","AccountPlusOutlineIcon","leaveChannelMenuItem","DEFAULT_CHANNEL","leaveChannelText","handleLeaveChannel","ExitToAppIcon","isDestructive","ChannelMoveToSubmenu","mapDispatchToProps","member","MANAGE_PUBLIC_CHANNEL_MEMBERS","MANAGE_PRIVATE_CHANNEL_MEMBERS","isFavoriteChannel","isChannelMuted","getSiteURL","SidebarChannelLink","element","labelRef","showTooltip","offsetWidth","scrollWidth","ariaLabelPrefix","mark","Mark","ChannelLinkClicked","handleSelectChannel","defaultPrevented","button","cmdOrCtrlPressed","enableToolTipIfNeeded","isChannelSelected","link","firstChannelName","showChannelsTutorialStep","channelsTutorialTip","ChannelsAndDirectMessagesTour","labelElement","WithTooltip","customStatus","teammateId","CustomStatusEmoji","userID","spanStyle","emojiStyle","marginTop","marginBottom","isSharedChannel","content","Pluggable","pluggableName","handleMenuToggle","selected","Link","getAriaLabel","to","handleChannelClick","unsetEditingPost","getUnreadCount","makeGetChannelUnreadCount","unreadCount","config","enableTutorial","EnableTutorial","tutorialStep","getInt","TutorialTourName","ONBOARDING_TUTORIAL_STEP","channelTourTriggered","OnboardingTaskCategory","OnboardingTasksName","CHANNELS_TOUR","FINISHED","GenericTaskSteps","isOnboardingFlowEnabled","EnableOnboardingFlow","OnboardingTourSteps","CHANNELS_AND_DIRECT_MESSAGES","mentions","unreadMsgs","showUnread","getFirstChannelName","channelType","SidebarBaseChannel","currentTeamName","handleLeavePublicChannel","callback","leaveChannel","handleLeavePrivateChannel","LEAVE_PRIVATE_CHANNEL_MODAL","LeaveChannelModal","channelIcon","SidebarBaseChannelIcon","SidebarDirectChannel","teammate_id","Preferences","CATEGORY_DIRECT_CHANNEL_SHOW","savePreferences","user_id","leaveDirectChannel","redirectChannel","teammate","ProfilePicture","getProfilePictureUrl","last_picture_update","is_bot","wrapperClass","newStatusIcon","statusClass","displayname","username","getIcon","remote_id","getUser","currentUser","getCurrentUser","getRedirectChannelNameForTeam","SidebarGroupChannel","membersCount","CATEGORY_GROUP_CHANNEL_SHOW","getMemberCount","makeGetGmChannelMemberCount","connector","makeGetChannel","isCurrentChannel","draggingState","getDraggingState","autoSortedCategoryIds","getAutoSortedCategoryIds","isCategoryCollapsed","isCategoryDragged","setChannelRef","isDraggable","channelIndex","isAutoSortedCategory","setShow","setRef","refMethod","handleAnimationStart","animationName","handleAnimationEnd","component","selectedCount","Draggable","draggableId","provided","snapshot","draggable","innerRef","collapsed","expanded","unread","selectedDragging","fadeOnDrop","isDropAnimating","draggingOver","has","noFloat","draggableProps","onAnimationStart","onAnimationEnd","initializeTeam","selectTeam","LocalStorageStore","setPreviousTeamId","fetchChannelsAndMembers","getIsUserStatusesConfigEnabled","addVisibleUsersInCurrentChannelAndSelfToStatusPoll","customGroupEnabled","isCustomGroupsEnabled","LDAPGroups","groupsParams","filter_allow_reference","per_page","include_member_count","include_member_ids","include_archived","myGroupsParams","filter_has_member","getGroupsByUserIdPaginated","getAllGroupsAssociatedToChannelsInTeam","group_constrained","getGroups","USER_ID_PAIR_REGEXP","onChannelByIdentifierEnter","match","path","identifier","params","teamObj","getTeamByName","channelPath","channelsByName","getChannelByName","moreChannelsByName","getOtherChannels","chan","status_code","isDirectChannelIdentifier","getPathFromIdentifier","getChannelsNameMapInTeam","getChannelDispatchResult","getChannelByNameAndTeamName","entities","myMembers","membership","getChannelMember","_channel","_channel2","user","prompt","UserUtils","roles","teamMember","getMyTeamMember","scheme_admin","joinPromptResult","joinPrivateChannelPrompt","join","joinChannelDispatchResult","handleChannelJoinError","goToDirectChannelByUserIds","replace","doChannelChange","goToChannelByChannelName","dispatchResult","goToDirectChannelByUserId","Utils","goToChannelByChannelId","groupId","url","handleError","markGroupChannelOpen","goToGroupChannelByGroupId","selectUserByUsername","getUserByUsername","directChannelDispatchRes","openDirectChannelToUserId","goToDirectChannelByUsername","email","selectUserByEmail","getUserByEmail","goToDirectChannelByEmail","userId","selectUser","GlobalActions","defaultChannel","CenterMessageLock","_cloudLimits$messages","openPricingModal","useOpenPricingModal","isAdminUser","isAdmin","cloudLimits","oldestPostTime","getOldestPostTimeInChannel","timestamp","getNextDay","firstInaccessiblePostTime","notifyAdminBtnText","notifyAdmin","notifyRequestStatus","useNotifyAdmin","ctaText","required_feature","MattermostFeatures","UNLIMITED_MESSAGES","required_plan","LicenseSkus","Professional","trial_notification","dateFormat","month","day","Date","now","ONE_DAY_MS","year","titleValues","date","formatDate","limit","formatNumber","description","cta","NotifyStatus","AlreadyComplete","chunks","href","trackingLocation","EyeOffOutlineIcon","PrivateChannelIntroSvg","_props$width","_props$height","viewBox","xmlnsXlink","clipPath","stroke","strokeOpacity","strokeLinecap","cx","cy","r","transform","strokeLinejoin","x","y","rx","PublicChannelIntroSvg","SvgComponent","AddMembersButton","totalUsers","usersLimit","pluginButtons","LoadingSpinner","inviteUsers","ADD_USER_TO_TEAM","INVITE_GUEST","LessThanMaxFreeUsers","MoreThanMaxFreeUsers","_ref2","ToggleModalButton","INVITATION","InvitationModal","_ref3","ADD_GROUPS_TO_CHANNEL","modal","isPrivate","ChannelPermissionGate","PluggableIntroButtons","buttons","buttonProps","_buttonProps$action","call","channelMember","getMyChannelMembership","getChannelIntroPluginButtons","ChannelIntroMessage","_this$props$stats","stats","total_users_count","getTotalUsersStats","fullWidth","locale","channelProfiles","enableUserCreation","isReadOnly","teamIsGroupConstrained","creatorName","teammateName","isMobileView","centeredIntro","toggleFavorite","channelIntroId","pluggableButton","setHeaderButton","createSetHeaderButton","actionButtons","createFavoriteButton","UserProfile","createDMIntroMessage","profiles","channelMembership","currentUserProfile","pictures","profile","createNotificationPreferencesButton","getGMIntroMessageSpecificPart","createGMIntroMessage","teamInviteLink","MANAGE_PRIVATE_CHANNEL_PROPERTIES","MANAGE_PUBLIC_CHANNEL_PROPERTIES","INVITE_USER","ADD_GROUPS_TO_TEAM","AddGroupsToTeamModal","ChannelIntroTownSquareSvg","createDefaultIntroMessage","OFFTOPIC_CHANNEL","channelInviteButton","ChannelIntroPublicSvg","createOffTopicIntroMessage","uiName","memberMessage","channelIsArchived","FormattedDate","create_at","getMonthLong","createMessage","purposeMessage","creator","ChannelIntroPrivateSvg","createStandardIntroMessage","gmIntroMessages","NotificationLevel","ALL","DEFAULT","MENTION","NONE","userProfile","_membership$notify_pr","_userProfile$notify_p","channelNotifyProp","notify_props","desktop","userNotifyProp","notifyLevelToUse","EDIT_CHANNEL_HEADER","EditChannelHeaderModal","PencilOutlineIcon","classes","favoriteText","CHANNEL_NOTIFICATIONS","ChannelNotificationsModal","BellRingOutlineIcon","EnableUserCreation","getMyCurrentChannelMembership","getDirectTeammate","creator_id","getTotalUsersStatsSelector","get","CATEGORY_DISPLAY_SETTINGS","CHANNEL_DISPLAY_MODE","CHANNEL_DISPLAY_MODE_DEFAULT","CHANNEL_DISPLAY_MODE_FULL_SCREEN","getCurrentLocale","getProfilesInCurrentChannel","isCurrentChannelFavorite","getDisplayNameByUser","getIsMobileView","PostListRow","blockShortcutReactToLastPostForNonMessages","listId","emitShortcutReactToLastPostFrom","isIdNotPost","Locations","NO_WHERE","isLastPost","shortcutReactToLastPostEmittedFrom","shortcutReactToLastPostEmittedFromCenter","CENTER","previousListId","loadingOlderPosts","loadingNewerPosts","OLDER_MESSAGES_LOADER","NEWER_MESSAGES_LOADER","CHANNEL_INTRO_MESSAGE","LOAD_OLDER_MESSAGES_TRIGGER","LOAD_NEWER_MESSAGES_TRIGGER","PostListRowListIds","PostListUtils","DateSeparator","NewMessageSeparator","separatorId","newMessagesSeparatorActions","exceededLimitChannelId","loadOlderPosts","loadNewerPosts","shouldHideAnimation","hideAnimation","postProps","previousPostId","shouldHighlight","togglePostMenu","CombinedUserActivityPost","location","combinedId","PostComponent","post","getShortcutReactToLastPostEmittedFrom","getUsage","getCloudLimits","getCloudLimitsLoaded","getPost","plugins","components","NewMessagesSeparatorAction","getLimitedViews","ScrollToBottomIcon","enableBackground","ScrollToBottomArrows","isScrolling","atBottom","innerWidth","scrolling","HintToast","onDismiss","handleDismiss","CloseIcon","ScrollToBottomToast","jumpToRecentsMessage","UnreadBelowIcon","TOAST_REL_RANGES","RelativeRanges","ToastWrapperClass","_this","ESCAPE","showUnreadToast","hideUnreadToast","showNewMessagesToast","hideNewMessagesToast","showUnreadWithBottomStartToast","hideUnreadWithBottomStartToast","hideArchiveToast","showMessageHistoryToast","updateLastViewedBottomAt","onSearchHintDismiss","since","isToday","Timestamp","useTime","ranges","searchShortcut","focusedPostId","atLatestPost","scrollToNewMessage","changeUrlToRemountChannelView","_this$props$hideScrol","_this$props","scrollToLatestMessages","hideScrollToBottomToast","scrollToUnreadMessages","unreadCountInChannel","prevState","unreadScrollPosition","UNREAD_SCROLL_POSITION_START_FROM_NEWEST","newRecentMessagesCount","countNewMessages","rootPosts","isCollapsedThreadsEnabled","postListIds","channelMarkedAsUnread","initScrollOffsetFromBottom","lastViewedAt","latestPostTimeStamp","lastViewedBottom","isNewMessageLineReached","shouldStartFromBottomWhenUnread","mounted","toastPresent","handleShortcut","updateToastStatus","updateNewMessagesAtInChannel","prevPostsCount","presentPostsCount","getToastToRender","showSearchHintToast","showScrollToBottomToast","unreadToastProps","onClickMessage","showActions","Toast","newMessagesToastText","unreadWithBottomStartToastProps","jumpDirection","showNewMessagesToastOverrides","archiveToastProps","extraClasses","archiveToastText","toasts","onScrollToBottomToastDismiss","hideSearchHintToast","getSearchHintToastText","toastToRender","getNewMessagesIndex","newMessages","withRouter","countUnreadsBelow","getAllPosts","postIds","allPosts","Posts","POST_DELETED","root_id","getRootPosts","obj","preparePostIdsForPostList","makePreparePostIdsForPostList","isManuallyUnread","lastChannelViewTime","getUnreadScrollPositionPreference","getPostIdsInChannel","countCurrentChannelUnreadMessages","ToastWrapper","LatestPostReader","latestPostId","getLatestPostId","latestPost","usePostAriaLabel","postListStyle","padding","virtListStyles","position","bottom","maxHeight","PostList","showSearchHintThreshold","getShowSearchHintThreshold","opened","dynamicListStyle","willChange","postMenuOpened","itemId","style","basePaddingClass","previousItemId","nextItemId","isDateLine","isStartOfNewMessages","getPreviousPostId","changeUnreadChunkTimeStamp","scrollDirection","scrollOffset","scrollUpdateWasRequested","clientHeight","scrollHeight","didUserScrollBackwards","didUserScrollForwards","isOffsetWithInRange","offsetFromBottom","getOffsetFromBottom","shouldLoadNewPosts","atOldestPost","scrollStopAction","fireAfter","SCROLL_DELAY","checkBottom","_this$listRef$current","postsRenderedRange","listRef","_getRangeToRender","canLoadMorePosts","PostRequestTypes","AFTER_ID","showSearchHint","isSearchHintDismissed","updateScrollToBottomToastVisibility","screen","updateAtBottom","isAtBottom","isScrollToBottomDismissed","visibleTopItem","topPostId","visibleStartIndex","visibleStopIndex","updateFloatingTimestamp","newMessageLineIndex","onNewMessageLineReached","findIndex","newMessagesSeparatorIndex","offset","scrollToBottom","toggleShouldStartFromBottomWhenUnread","_this$listRef$current2","scrollToItem","_this$listRef$current3","handleSearchHintDismiss","handleScrollToBottomToastDismiss","channelIntroMessage","initScrollCompleted","postListRef","DelayedAction","handleScrollStop","initRangeToRender","postIndex","postId","maxPostsForSlicing","handleWindowResize","EventEmitter","addListener","EventTypes","POST_LIST_SCROLL_TO_BOTTOM","getSnapshotBeforeUpdate","postsAddedAtTop","channelHeaderAdded","_postListNode$parentE","postListNode","previousScrollTop","parentElement","scrollTop","previousScrollHeight","_prevState","postlistScrollHeight","scrollValue","_this$listRef$current4","removeListener","newPostListIds","autoRetryEnable","nextState","FloatingTimestamp","AutoSizer","_ref4","renderToasts","DynamicSizeList","itemData","overscanCountForward","overscanCountBackward","onScroll","initScrollToIndex","innerListStyle","loaderId","correctScrollToBottom","onItemsRendered","scrollToFailed","renderRow","markAndMeasureChannelSwitchEnd","fresh","PostListLoaded","channelSwitch","measureAndReport","Measure","ChannelSwitch","startMark","endMark","canFail","teamSwitch","TeamSwitch","TeamLinkClicked","shouldTrackPerformance","requestCount1","countRequestsBetween","duration","round","requestCount","requestCount2","clearMarks","isFirstLoad","isPrefetchingInProcess","loadPostsAround","loadUnreads","syncPostsInChannel","loadLatestPosts","markChannelAsRead","loadPosts","BEFORE_ID","autoRetriesCount","callLoadPosts","getOldestPostId","hasInaccessiblePosts","extraPagesLoaded","getPostsAfter","getPostsBefore","oldestPostId","getOldestVisiblePostId","getLatestVisiblePostId","actionsForPostList","postsOnLoad","VirtPostList","formattedPostIds","centered","posts","postsInChannel","memoizedGetLatestPostId","memoizeResult","getPostsChunkAroundPost","makeGetPostsChunkAroundPost","chunk","unreadChunkTimeStamp","channelViewState","channelPrefetchStatus","limitedViews","focusedPost","getUnreadPostsChunk","getRecentPostsChunkInChannel","recent","oldest","shouldHideNewMessageIndicator","isPostsChunkIncludingUnreadsPosts","indicateNewMessages","PostView","loaderForChangeOfPostsChunk","requestAnimationFrame","channelLoading","_ownProps$match","last_post_at","isChannelLoading","teamMemberships","_params$identifier","postid","getTeamMemberships","onClickRefresh","reload","InputLoading","updateWaitForLoader","showMessage","setShowMessage","timeout","ChannelHeader","makeAsyncComponent","lazy","FileUploadOverlay","ChannelBookmarks","AdvancedCreatePost","ChannelView","updatedState","deferredPostView","createDeferredPostView","goToLastViewedChannel","waitForLoader","channelViewRef","enableWebSocketEventScope","WebSocketClient","updateActiveChannel","viewArchivedChannels","createPost","deactivatedChannel","onClickCloseChannel","missingChannelRole","onUpdateInputShowLoader","DeferredPostView","overlayType","DropOverlayIdCenterChannel","isChannelBookmarksEnabled","deferComponentRender","enableOnboardingFlow","FeatureFlagWebSocketEventScope","_getMyChannelMembersh","split","some","getRoles","isMissingChannelRoles","isDeactivatedDirectChannel","isCloud","Cloud","teamUrl","getCurrentRelativeTeamUrl","isFirstAdmin","ChannelIdentifierRouter","replaceUrlTimeout","channelUrl","PERMALINK_FADEOUT","replaceUrlIfPermalink","ChannelHeaderMobile","GlobalThreads","Drafts","PermalinkView","PlaybookRunner","CenterChannel","returnTo","lastReturnTo","nextProps","pathname","getProfiles","lastChannelPath","lhsOpen","rhsMenuOpen","Switch","Route","ID_PATH_PATTERN","TEAM_NAME_PATH_PATTERN","IDENTIFIER_PATH_PATTERN","SCHEDULED_POST_URL_SUFFIX","Redirect","mapStateToProps","lastViewedType","getLastViewedTypeByTeamName","getLastViewedChannelNameByTeamName","previousTeamId","getPreviousTeamId","previousTeamLastViewedType","getPreviousTeamLastViewedType","PreviousViewedTypes","THREADS","getIsLhsOpen","getIsRhsMenuOpen","useLocation","useHistory","actionMap","open_invitation_modal","searchParams","URLSearchParams","delete","isFirstPreload","trackPreloadedChannels","prefetchQueueObj","_prefetchQueueObj$","_prefetchQueueObj$2","_prefetchQueueObj$3","channelIdsForTeam","getChannelIdsForCurrentTeam","numHigh","numMedium","numLow","numTotal","Priority","PrefetchLimits","prefetchQueue","unreadChannels","memberships","collapsedThreads","unreadChannelsCount","high","medium","low","unreadMax","mentionMax","mention_count_root","mention_count","mark_unread","queue","PQueue","concurrency","DataPrefetch","delay","unreadChannel","random","prefetchChannelPosts","prefetchRequestStatus","priority","hasOwn","priorityQueue","add","prefetchPosts","sidebarLoaded","loadProfilesForSidebar","prefetchTimeout","clear","prefetchData","isSidebarLoaded","lastUnreadChannel","getUnreadChannels","ResizableLhs","containerRef","ResizableDivider","globalCssVar","CssVarKeyForResizable","LHS","defaultWidth","DEFAULT_LHS_WIDTH","dir","ResizeDirection","LEFT","isAddChannelDropdownOpen","addChannelDropdown","isAddChannelCtaDropdownOpen","addChannelCtaDropdown","AddChannelDropdown","canCreateChannel","canJoinPublicChannel","showMoreChannelsModal","showCreateUserGroupModal","invitePeopleModal","showNewChannelModal","showCreateCategoryModal","handleOpenDirectMessagesModal","unreadFilterEnabled","showCreateTutorialTip","showInviteTutorialTip","isAddChannelOpen","openAddChannelOpen","canCreateCustomGroups","MenuWrapper","open","renderDropdownItems","invitePeople","Group","ItemAction","extraText","InvitePeopleTour","joinPublicChannel","createChannel","createDirectMessage","createUserGroup","CreateAndJoinChannelsTour","userGroupsEnabled","SidebarHeaderContainer","styled","Flex","attrs","row","justify","alignment","withConfig","SidebarHeader","useShowOnboardingTutorialStep","CREATE_AND_JOIN_CHANNELS","INVITE_PEOPLE","usageDeltas","theme","getTheme","setAddChannelDropdown","menuToggled","setMenuToggled","CompassThemeProvider","MainMenu","usageDeltaTeams","CHANNEL_MODE","QuickSwitchModal","switchBox","textbox","getTextbox","activeElement","focusTextbox","focusPostTextbox","querySelector","_this$props$onExited","modalButton","shouldShowLoadingSpinner","mode","joinChannelById","switchToChannel","MENTION_MORE_CHANNELS","hideOnSelect","suggestions","loadingPropPresent","items","pretext","matchedPretext","hasSuggestions","providers","channelProviders","help","hideOnCancel","restoreFocus","animation","SuggestionBox","setSwitchBoxRef","onItemSelected","listComponent","SuggestionList","listPosition","completeOnTab","spellCheck","delayInputUpdate","openWhenEmpty","onSuggestionsReceived","handleSuggestionsReceived","forceSuggestionsWhenBlur","renderDividers","MENTION_UNREAD","MENTION_RECENT_CHANNELS","shouldSearchCompleteText","NoResultsIndicator","NoResultsVariant","Search","SwitchChannelProvider","disableTooltip","enableTooltip","shortcut","default","ShortcutKeys","ctrl","shift","mac","cmd","ChannelFilter","toggleUnreadFilter","Keyboard","U","handleUnreadFilterKeyPress","unreadsAriaLabel","getMyTeams","hasMultipleTeams","isUnreadFilterEnabled","ChannelNavigator","QUICK_SWITCH","M","L","K","toggleQuickSwitchModal","isQuickSwitcherOpen","handleQuickSwitchKeyPress","showUnreadsCategory","openQuickSwitcher","shouldShowUnreadsCategory","isModalOpen","DeleteCategoryModal","deleteCategory","confirmButtonClassName","category_name","cancel","paginationCount","paginationNext","paginationPrev","SidebarCategoryMenu","getUnreadsIdsForCategory","makeGetUnreadIdsForCategory","unreadsIds","muteUnmuteCategoryMenuItem","toggleCategoryMute","setCategoryMuted","deleteCategoryMenuItem","renameCategoryMenuItem","handleDeleteCategory","handleRenameCategory","TrashCanOutlineIcon","handleSortChannels","sorting","setCategorySorting","sortChannelsSelectedValue","sortChannelsIcon","FormatListBulletedIcon","CategorySorting","Alphabetical","SortAlphabeticalAscendingIcon","Recency","ClockOutlineIcon","sortChannelsMenuItem","Manual","markAsReadMenuItem","MarkAsReadMenuItem","SidebarCategorySortingMenu","selectedDmNumber","getVisibleDmGmLimit","handleSortDirectMessages","sortDirectMessagesIcon","sortDirectMessagesSelectedValue","sortDirectMessagesMenuItem","showMessagesCountSelectedValue","showMessagesCountMenuItem","AccountMultipleOutlineIcon","DM_AND_GM_SHOW_COUNTS","dmGmShowCount","handlelimitVisibleDMsGMs","number","CATEGORY_SIDEBAR_SETTINGS","LIMIT_VISIBLE_DMS_GMS","openDirectMessageMenuItem","AddChannelsCtaButton","touchedAddChannelsCtaButton","getBool","TOUCHED","Touched","ADD_CHANNELS_CTA","canCreatePublicChannel","haveICurrentChannelPermission","CREATE_PRIVATE_CHANNEL","JOIN_PUBLIC_CHANNELS","isAddChannelCtaOpen","openAddChannelsCtaOpen","setAddChannelCtaDropdown","buttonClass","addChannelsButton","btnCallback","handleClick","storePreferencesAndTrackEvent","browseChannelsAction","InviteMembersButton","handleButtonClick","getAnalyticsCategory","SidebarCategory","_this$categoryTitleRe","categoryTitleRef","handleA11yKeyDown","a11yKeyDownRegistered","_this$categoryTitleRe2","handleCollapse","SidebarChannel","DraggingStateTypes","CATEGORY","setCategoryCollapsed","newDropBoxRef","remove","handleOpenMoreDirectChannelsModal","nativeEvent","CHANNEL","DM","isNewCategory","isDragDisabled","onTransitionEnd","removeAnimation","_this$categoryTitleRe3","_this$categoryTitleRe4","A11yCustomEventTypes","ACTIVATE","handleA11yActivateEvent","DEACTIVATE","handleA11yDeactivateEvent","_this$categoryTitleRe5","_this$categoryTitleRe6","categoryIndex","renderedChannels","renderChannel","categoryMenu","newLabel","addHelpLabel","KeyboardShortcutSequence","KEYBOARD_SHORTCUTS","navDMMenu","hideDescription","isInsideTooltip","categoryNames","disableInteractiveElementBlocking","inviteMembersButton","addChannelsCtaButton","dropDisabled","isDropDisabled","menuIsOpen","capture","DraggingStates","CAPTURE","Droppable","droppableId","droppableProvided","droppableSnapshot","droppableProps","directMessagesModalButton","renderNewDropBox","showPlaceholder","direct_messages","favorites","getChannelIdsForCategory","makeGetFilteredChannelIdsForCategory","DraftsLink","GlobalThreadsLink","UnreadChannelIndicator","UnreadChannels","renderView","renderThumbHorizontal","renderTrackVertical","renderThumbVertical","scrollbarStyles","SidebarList","staticPages","channelRefs","set","unreadChannelIds","spring","val","getCurrentValue","scrollbar","scrollToChannel","getFirstUnreadChannel","getLastUnreadChannel","scrollingToUnread","offsetTop","offsetHeight","getScrollTop","getClientHeight","margin","showTopUnread","scrollEnd","getDisplayedChannelIds","scrollToPosition","showBottomUnread","scrollAnimation","setCurrentValue","setAtRest","setEndValue","firstUnreadChannel","firstUnreadElement","lastUnreadElement","getFirstUnreadChannelFromChannelIdArray","reverse","i","switchToChannelById","switchToLhsStaticPage","metaKey","UP","DOWN","staticPageIds","getDisplayedStaticPageIds","allIds","curSelectedId","currentStaticPageId","curIndex","nextIndex","nextId","mod","navigateById","allChannelIds","unshift","hasUnreadThreads","direction","findNextUnreadChannelId","nextChannelId","newCategoryIds","debounce","updateUnreadIndicators","before","droppable","querySelectorAll","draggingChannels","MIXED_CHANNELS","BEFORE","initial","onDragStart","DURING","onDragEnd","reason","destination","moveCategory","channelsListScrollTimeout","autoHide","Map","animate","SpringSystem","createSpring","setOvershootClampingEnabled","onSpringUpdate","handleScrollAnimationUpdate","navigateChannelShortcut","navigateUnreadChannelShortcut","scrollToTop","close","unreadsCategory","renderedCategories","renderCategory","DragDropContext","onBeforeDragStart","onBeforeCapture","above","below","scrollToFirstUnreadChannel","extraClass","scrollToLastUnreadChannel","onPointerLeave","hideChannelListScrollbar","onPointerOver","showChannelListScrollbar","Scrollbars","_getThreadCountsInCur","getThreadCountsInCurrentTeam","total_unread_threads","getUnreadChannelIds","getCurrentStaticPageId","getVisibleStaticPages","MobileSidebarHeader","MoreDirectChannels","CreateUserGroupsModal","KeyboardShortcutsModal","UserSettingsModal","Sidebar","FORWARD_SLASH","isKeyBoardShortcutModalOpen","KEYBOARD_SHORTCUTS_MODAL","A","USER_SETTINGS","isContentProductSettings","showDirectChannelsModal","USER_GROUPS_CREATE","hideMoreDirectChannelsModal","showMoreDirectChannelsModal","moreDirectChannelsModal","onModalDismissed","isExistingChannel","fetchMyCategories","handleClickClearChannelSelection","handleKeyDownEvent","canCreatePrivateChannel","renderModals","haveISystemPermission","CREATE_CUSTOM_GROUP","PostsChannelResetWatcher","isCRTEnabled","loaded","resetReloadPostsInChannel","BadgeStatus","UnreadsStatusHandlerClass","unreadStatus","unreadMentionCount","basicUnreadMeta","DesktopApp","updateUnreadsAndMentions","siteName","currentTeammate","inGlobalThreads","inDrafts","currentSiteName","mentionTitle","unreadTitle","isDynamicFaviconSupported","prefix","badgeStatus","link16x16","link24x24","link32x32","link64x64","link96x96","getFavicon","ensureString","Mention","faviconMention16x16","faviconMention24x24","faviconMention32x32","faviconMention64x64","faviconMention96x96","Unread","faviconUnread16x16","faviconUnread24x24","faviconUnread32x32","faviconUnread64x64","faviconUnread96x96","faviconDefault16x16","faviconDefault24x24","faviconDefault32x32","faviconDefault64x64","faviconDefault96x96","updateTitle","oldBadgeStatus","getBadgeStatus","newBadgeStatus","updateFavicon","updateDesktopApp","None","SiteName","getUnreadStatus","matchPath","UnreadsStatusHandler","ProductNoticesModal","ResetStatusModal","BODY_CLASS_FOR_CHANNEL","ChannelController","enabledUserStatuses","_navigator$userAgentD","isMsBrowser","isInternetExplorer","isEdge","navigator","platform","userAgentData","bodyClass","getClassnamesForBody","cleanUpStatusAndProfileFetchingPoll","loadStatusesIntervalId","setInterval","STATUS_INTERVAL","clearInterval","CRTPostsChannelResetWatcher","QueryParamActionController","shouldRenderCenterChannel","BackstageController","_StyledPluggable","_styled","gridArea","TeamController","_props$plugins","teamNameParam","useParams","initialChannelsLoaded","setInitialChannelsLoaded","setTeam","getTeamFromTeamList","teamsList","blurTime","lastTime","joinTeamOrRedirect","joinedOnFirstLoad","joinedTeam","joinTeam","_user$id","_user$roles","userRoles","setUserId","setUserRoles","useTelemetryIdentitySync","InitialLoadingScreen","stop","reactAppInitialized","fetchAllMyChannelMembers","fetchAllMyTeamsChannels","fetchAllChannels","disableWakeUpReconnectHandler","wakeUpIntervalId","currentTime","console","log","reconnect","handleFocus","isActive","markAsReadOnFocus","disableRefetchingOnBrowserFocus","handleBlur","unsetActiveChannelOnServer","handleKeydown","replyTextbox","postTextbox","getElementById","browserIsIosSafari","isIosSafari","iNoBounce","setTeamIdJoinedOnLoad","teamsListDependency","RESERVED_TEAM_NAMES","teamFromTeamNameParam","initTeamOrRedirect","mfaRequired","teamLoaded","plugin","route","pluggableId","_teamsList$find","teamInList","teamname","teamByNameResult","isSuccess","addUserToTeamResult","addUserToTeam","Error","NeedsTeamComponent","DisableRefetchingOnBrowserFocus","DisableWakeUpReconnectHandler","selectedThreadId","getSelectedThreadIdInCurrentTeam","selectedPostId","getSelectedPostId","checkIfMFARequired","strokeWidth","fillRule","EMPTY_BOOKMARKS","channelBookmarks","byChannelId","bookmarkId","lhs","getDraftsCount","makeGetDraftsCount","collapsedThreadsEnabled","draftsCount","isVisible","isError"],"sourceRoot":""}

VaKeR 2022