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/1625.cd9d51d627adc56744fe.js.map
{"version":3,"file":"1625.cd9d51d627adc56744fe.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/components/app_bar/new_channel_with_board_tour_tip.tsx","webpack://mattermost-webapp/./src/components/channel_header/components/header_icon_wrapper.tsx","webpack://mattermost-webapp/./src/components/common/hooks/useCopyText.ts","webpack://mattermost-webapp/./src/components/common/svg_images_components/alert_svg.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/components/editable_area.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/components/linelimiter.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/about_area_channel.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/about_area_dm.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/about_area_gm.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/about_area.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/header.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/menu.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/top_buttons.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/channel_info_rhs.tsx","webpack://mattermost-webapp/./src/components/channel_info_rhs/index.ts","webpack://mattermost-webapp/./src/components/channel_members_rhs/action_bar.tsx","webpack://mattermost-webapp/./src/components/channel_members_rhs/header.tsx","webpack://mattermost-webapp/./src/components/channel_members_rhs/search.tsx","webpack://mattermost-webapp/./src/components/channel_members_rhs/channel_members_rhs.tsx","webpack://mattermost-webapp/./src/components/channel_members_rhs/index.ts","webpack://mattermost-webapp/./src/components/search_results_header/search_results_header.tsx","webpack://mattermost-webapp/./src/components/search_results_header/index.tsx","webpack://mattermost-webapp/./src/components/info_toast/info_toast.tsx","webpack://mattermost-webapp/./src/components/post_edit_history/restore_post_modal.tsx","webpack://mattermost-webapp/./src/components/post_edit_history/edited_post_item/edited_post_item.tsx","webpack://mattermost-webapp/./src/components/post_edit_history/edited_post_item/index.ts","webpack://mattermost-webapp/./src/components/post_edit_history/post_edit_history.tsx","webpack://mattermost-webapp/./src/components/post_edit_history/index.ts","webpack://mattermost-webapp/./src/components/resizable_sidebar/resizable_rhs/index.tsx","webpack://mattermost-webapp/./src/components/rhs_card_header/rhs_card_header.tsx","webpack://mattermost-webapp/./src/components/rhs_card_header/index.tsx","webpack://mattermost-webapp/./src/components/rhs_card/rhs_card.tsx","webpack://mattermost-webapp/./src/components/rhs_card/index.ts","webpack://mattermost-webapp/./src/components/tours/crt_tour/crt_threads_pane_tutorial_tip.tsx","webpack://mattermost-webapp/./src/components/rhs_header_post/rhs_header_post.tsx","webpack://mattermost-webapp/./src/components/rhs_header_post/index.ts","webpack://mattermost-webapp/./src/components/rhs_thread/rhs_thread.tsx","webpack://mattermost-webapp/./src/components/rhs_thread/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/user_guide_icon.tsx","webpack://mattermost-webapp/./src/components/search/user_guide_dropdown/user_guide_dropdown.tsx","webpack://mattermost-webapp/./src/components/search/user_guide_dropdown/index.ts","webpack://mattermost-webapp/./src/components/suggestion/search_suggestion_list.tsx","webpack://mattermost-webapp/./src/components/suggestion/suggestion_date.tsx","webpack://mattermost-webapp/./src/components/search_bar/search_bar.tsx","webpack://mattermost-webapp/./src/components/search_hint/search_hint.tsx","webpack://mattermost-webapp/./src/components/file_search_results/file_search_result_item.tsx","webpack://mattermost-webapp/./src/components/file_search_results/index.tsx","webpack://mattermost-webapp/./src/components/search_results/files_filter_menu.tsx","webpack://mattermost-webapp/./src/components/search_results/messages_or_files_selector.tsx","webpack://mattermost-webapp/./src/components/search_results/post_search_results_item.tsx","webpack://mattermost-webapp/./src/components/search_results/search_limits_banner.tsx","webpack://mattermost-webapp/./src/components/search_results/search_results.tsx","webpack://mattermost-webapp/./src/components/search_results/index.tsx","webpack://mattermost-webapp/./src/components/search/search.tsx","webpack://mattermost-webapp/./src/components/search/index.tsx","webpack://mattermost-webapp/./src/plugins/rhs_plugin/rhs_plugin.tsx","webpack://mattermost-webapp/./src/plugins/rhs_plugin/index.ts","webpack://mattermost-webapp/./src/components/sidebar_right/sidebar_right.tsx","webpack://mattermost-webapp/./src/components/sidebar_right/index.ts","webpack://mattermost-webapp/./src/components/widgets/icons/mentions_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/search_icon.tsx"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useState} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport type {Placement} from 'tippy.js';\n\nimport {TourTip, useMeasurePunchouts} from '@mattermost/components';\n\nimport {setNewChannelWithBoardPreference} from 'mattermost-redux/actions/boards';\nimport {Preferences} from 'mattermost-redux/constants';\n\nimport {showNewChannelWithBoardPulsatingDot} from 'selectors/plugins';\n\ntype Props = {\n    pulsatingDotPlacement?: Omit<Placement, 'auto'| 'auto-end'>;\n    pulsatingDotTranslate?: {x: number; y: number};\n}\n\nconst NewChannelWithBoardTourTip = ({\n    pulsatingDotPlacement = 'left',\n    pulsatingDotTranslate,\n}: Props): JSX.Element | null => {\n    const dispatch = useDispatch();\n    const showTip = useSelector(showNewChannelWithBoardPulsatingDot);\n\n    const title = (\n        <FormattedMessage\n            id='newChannelWithBoard.tutorialTip.title'\n            defaultMessage='Access linked boards from the App Bar'\n        />\n    );\n\n    const screen = (\n        <FormattedMessage\n            id='newChannelWithBoard.tutorialTip.description'\n            defaultMessage='The board you just created can be quickly accessed by clicking on the Boards icon in the App bar. You can view the boards that are linked to this channel in the right-hand sidebar and open one in full view.'\n        />\n    );\n\n    const [tipOpened, setTipOpened] = useState(showTip);\n\n    const handleDismiss = useCallback((e: React.MouseEvent) => {\n        e.stopPropagation();\n        setTipOpened(false);\n        dispatch(setNewChannelWithBoardPreference({[Preferences.NEW_CHANNEL_WITH_BOARD_TOUR_SHOWED]: true}));\n    }, []);\n\n    const handleOpen = useCallback((e: React.MouseEvent) => {\n        e.stopPropagation();\n        e.preventDefault();\n\n        if (tipOpened) {\n            dispatch(setNewChannelWithBoardPreference({[Preferences.NEW_CHANNEL_WITH_BOARD_TOUR_SHOWED]: true}));\n            setTipOpened(false);\n        } else {\n            setTipOpened(true);\n        }\n    }, []);\n\n    const overlayPunchOut = useMeasurePunchouts(['app-bar-icon-focalboard'], [], {y: -2, height: 4, x: 0, width: 0});\n\n    if (!showTip) {\n        return null;\n    }\n\n    return (\n        <TourTip\n            show={true}\n            screen={screen}\n            title={title}\n            overlayPunchOut={overlayPunchOut}\n            placement='right-start'\n            pulsatingDotPlacement={pulsatingDotPlacement}\n            step={1}\n            singleTip={true}\n            showOptOut={false}\n            interactivePunchOut={true}\n            handleDismiss={handleDismiss}\n            handleOpen={handleOpen}\n            handlePrevious={handleDismiss}\n            offset={[-30, 5]}\n            pulsatingDotTranslate={pulsatingDotTranslate}\n        />\n    );\n};\n\nexport default NewChannelWithBoardTourTip;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport NewChannelWithBoardTourTip from 'components/app_bar/new_channel_with_board_tour_tip';\nimport WithTooltip from 'components/with_tooltip';\nimport type {ShortcutDefinition} from 'components/with_tooltip/tooltip_shortcut';\n\nimport {suitePluginIds} from 'utils/constants';\n\ntype Props = {\n\n    /**\n     * ariaLabelOverride lets you override the aria-label which would otherwise use the tooltip text. This typically\n     * shouldn't be needed.\n     */\n    ariaLabelOverride?: string;\n\n    buttonClass?: string;\n    buttonId: string;\n    children: React.ReactNode;\n    onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n    tooltip: string;\n    tooltipShortcut?: ShortcutDefinition;\n    isRhsOpen?: boolean;\n    pluginId?: string;\n}\n\nconst HeaderIconWrapper = (props: Props) => {\n    const {\n        ariaLabelOverride,\n        buttonClass,\n        buttonId,\n        children,\n        onClick,\n        tooltip: tooltipText,\n        tooltipShortcut,\n        isRhsOpen,\n        pluginId,\n    } = props;\n\n    const boardsEnabled = pluginId === suitePluginIds.focalboard;\n\n    const ariaLabelText = ariaLabelOverride ?? tooltipText;\n\n    return (\n        <>\n            <WithTooltip\n                title={isRhsOpen ? '' : tooltipText}\n                shortcut={tooltipShortcut}\n            >\n                <button\n                    id={buttonId}\n                    aria-label={ariaLabelText}\n                    className={buttonClass || 'channel-header__icon'}\n                    onClick={onClick}\n                >\n                    {children}\n                </button>\n            </WithTooltip>\n            {boardsEnabled &&\n                <NewChannelWithBoardTourTip\n                    pulsatingDotPlacement={'start'}\n                    pulsatingDotTranslate={{x: 0, y: -22}}\n                />\n            }\n        </>\n    );\n};\n\nexport default HeaderIconWrapper;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {useRef, useCallback, useState} from 'react';\nimport {defineMessages} from 'react-intl';\n\ntype CopyOptions = {\n    successCopyTimeout?: number;\n    text: string;\n    trackCallback?: () => void;\n};\n\ntype CopyResponse = {\n    copiedRecently: boolean;\n    copyError: boolean;\n    onClick: () => void;\n};\n\nconst DEFAULT_COPY_TIMEOUT = 4000;\n\nexport default function useCopyText({\n    text,\n    successCopyTimeout: successCopyTimeoutReceived,\n    trackCallback,\n}: CopyOptions): CopyResponse {\n    const [copiedRecently, setCopiedRecently] = useState(false);\n    const [copyError, setCopyError] = useState(false);\n    const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n    let successCopyTimeout = DEFAULT_COPY_TIMEOUT;\n    if (successCopyTimeoutReceived || successCopyTimeoutReceived === 0) {\n        successCopyTimeout = successCopyTimeoutReceived;\n    }\n\n    const onClick = useCallback(() => {\n        trackCallback?.();\n\n        if (timerRef.current) {\n            clearTimeout(timerRef.current);\n            timerRef.current = null;\n        }\n        const clipboard = navigator.clipboard;\n        if (clipboard) {\n            clipboard.writeText(text).\n                then(() => {\n                    setCopiedRecently(true);\n                    setCopyError(false);\n                }).\n                catch(() => {\n                    setCopiedRecently(false);\n                    setCopyError(true);\n                });\n        } else {\n            const textField = document.createElement('textarea');\n            textField.innerText = text;\n            textField.style.position = 'fixed';\n            textField.style.opacity = '0';\n\n            document.body.appendChild(textField);\n            textField.select();\n\n            try {\n                const success = document.execCommand('copy');\n                setCopiedRecently(success);\n                setCopyError(!success);\n            } catch (err) {\n                setCopiedRecently(false);\n                setCopyError(true);\n            }\n            textField.remove();\n        }\n\n        timerRef.current = setTimeout(() => {\n            setCopiedRecently(false);\n            setCopyError(false);\n        }, successCopyTimeout);\n    }, [successCopyTimeout, text, trackCallback]);\n\n    return {\n        copiedRecently,\n        copyError,\n        onClick,\n    };\n}\n\nexport const messages = defineMessages({\n    copy: {id: 'copy_text.copy', defaultMessage: 'Copy'},\n    copied: {id: 'copy_text.copied', defaultMessage: 'Copied'},\n});\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 AlertSvg = (props: SvgProps) => (\n    <svg\n        width={props.width ? props.width.toString() : '87'}\n        height={props.height ? props.height.toString() : '70'}\n        viewBox='0 0 87 70'\n        fill='none'\n        xmlns='http://www.w3.org/2000/svg'\n    >\n        <rect\n            x='8.00098'\n            y='7'\n            width='72'\n            height='24'\n            rx='3.75'\n            fill='var(--button-bg)'\n            fillOpacity='0.12'\n        />\n        <rect\n            x='0.000976562'\n            y='34'\n            width='87'\n            height='25'\n            rx='3.75'\n            fill='var(--button-bg)'\n            fillOpacity='0.12'\n        />\n        <path\n            d='M38.3214 2.31098C39.4303 0.112261 42.5697 0.112256 43.6786 2.31098L71.7146 57.899C72.7209 59.8943 71.2707 62.25 69.0359 62.25H12.9641C10.7294 62.25 9.27912 59.8943 10.2854 57.899L38.3214 2.31098Z'\n            fill='var(--center-channel-bg)'\n        />\n        <path\n            d='M40.3214 4.31098C41.4303 2.11226 44.5697 2.11226 45.6786 4.31098L73.7146 59.899C74.7209 61.8943 73.2707 64.25 71.0359 64.25H14.9641C12.7294 64.25 11.2791 61.8943 12.2854 59.899L40.3214 4.31098Z'\n            fill='#FFBC1F'\n        />\n        <path\n            d='M43.2322 2.53614L71.2681 58.1242C72.1067 59.7869 70.8982 61.75 69.0359 61.75H12.9641C11.1018 61.75 9.89327 59.7869 10.7319 58.1242L38.7678 2.53614C39.6919 0.703873 42.3081 0.703871 43.2322 2.53614Z'\n            stroke='var(--center-channel-color)'\n        />\n        <path\n            d='M49.542 4.23999L52.8888 10.72M74.922 53.38L68.5073 40.96L66.8339 37.72L64.6027 33.4L61.5348 27.46M59.3036 23.14L55.12 15.04'\n            stroke='var(--center-channel-color)'\n            strokeOpacity='0.56'\n            strokeWidth='1.08'\n            strokeLinecap='round'\n        />\n        <path\n            d='M38.0164 25.2833L40.2971 39.9301C40.3191 40.2208 40.4554 40.4927 40.6786 40.6912C40.9018 40.8897 41.1954 41 41.5002 41C41.8051 41 42.0986 40.8897 42.3219 40.6912C42.5451 40.4927 42.6814 40.2208 42.7034 39.9301L44.984 25.2833C45.3987 19.5722 37.5955 19.5722 38.0164 25.2833Z'\n            fill='#3F4350'\n        />\n        <path\n            d='M41.0072 47C41.798 47.0014 42.5706 47.2372 43.2275 47.6776C43.8843 48.118 44.396 48.7432 44.6976 49.4742C44.9993 50.2053 45.0774 51.0093 44.9222 51.7848C44.7671 52.5602 44.3856 53.2723 43.8259 53.831C43.2662 54.3897 42.5535 54.7699 41.7777 54.9237C41.002 55.0774 40.1981 54.9978 39.4676 54.6948C38.7371 54.3919 38.1128 53.8792 37.6736 53.2215C37.2344 52.5639 37 51.7908 37 51C37 50.4741 37.1036 49.9534 37.3051 49.4676C37.5066 48.9818 37.8019 48.5406 38.1741 48.169C38.5463 47.7975 38.9881 47.503 39.4743 47.3024C39.9604 47.1018 40.4813 46.9991 41.0072 47Z'\n            fill='#3F4350'\n        />\n        <path\n            d='M48.4619 68.5H70.0619'\n            stroke='var(--center-channel-color)'\n            strokeOpacity='0.56'\n            strokeWidth='1.08'\n            strokeLinecap='round'\n        />\n        <path\n            d='M10.001 50L26.001 19'\n            stroke='var(--center-channel-color)'\n            strokeOpacity='0.56'\n            strokeWidth='1.08'\n            strokeLinecap='round'\n        />\n    </svg>\n\n);\n\nexport default AlertSvg;\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 styled from 'styled-components';\n\nconst EditButton = styled.button`\n    border: 0;\n    margin: 0px;\n    padding: 0px;\n    border-radius: 4px;\n    background: rgba(var(--center-channel-color-rgb), 0.04);\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n    &:hover {\n        background: rgba(var(--center-channel-color-rgb), 0.08);\n        color: rgba(var(--center-channel-color-rgb), 0.75);\n    }\n    width: 24px;\n    height: 24px;\n    i.icon {\n        font-size: 14.4px;\n    }\n`;\n\nconst EmptyPlace = styled.button`\n    padding: 0px;\n    background: transparent;\n    border: 0px;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n    i {\n        display: none;\n        font-size: 14px;\n        margin-left: 4px;\n    }\n    &:hover {\n        color: rgba(var(--center-channel-color-rgb), 0.75);\n        i {\n            display: inline-block;\n        }\n    }\n`;\n\ninterface EditableAreaProps {\n    editable: boolean;\n    content: React.ReactNode;\n    emptyLabel: string;\n    onEdit: () => void;\n    className?: string;\n}\n\nconst EditableAreaBase = ({editable, content, emptyLabel, onEdit, className}: EditableAreaProps) => {\n    const {formatMessage} = useIntl();\n\n    const allowEditArea = editable && content;\n\n    return (\n        <div className={className}>\n            <div className='EditableArea__content'>\n                {content}\n                {!content && editable && (\n                    <EmptyPlace\n                        onClick={onEdit}\n                        aria-label={formatMessage({id: 'channel_info_rhs.edit_link', defaultMessage: 'Edit'})}\n                    >\n                        {emptyLabel}\n                        <i className='icon icon-pencil-outline edit-icon'/>\n                    </EmptyPlace>\n                )}\n            </div>\n            <div className='EditableArea__edit'>\n                {allowEditArea ? (\n                    <EditButton\n                        onClick={onEdit}\n                        aria-label={formatMessage({id: 'channel_info_rhs.edit_link', defaultMessage: 'Edit'})}\n                    >\n                        <i className='icon icon-pencil-outline'/>\n                    </EditButton>\n                ) : ''}\n            </div>\n        </div>\n    );\n};\n\nconst EditableArea = styled(EditableAreaBase)`\n    display: flex;\n    &>.EditableArea__content {\n        flex: 1;\n        p:last-child {\n            margin-bottom:0;\n        }\n    }\n    &:hover {\n        &>.EditableArea__edit {\n            visibility: visible;\n        }\n    }\n\n    &>.EditableArea__edit {\n        visibility: hidden;\n        width: 24px;\n    }\n`;\n\nexport default EditableArea;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useRef, useState} from 'react';\nimport {CSSTransition} from 'react-transition-group';\nimport styled from 'styled-components';\n\ninterface LineLimiterProps {\n    children: React.ReactNode;\n    maxLines: number;\n    lineHeight: number;\n    moreText: string;\n    lessText: string;\n    className?: string;\n    errorMargin?: number;\n}\n\nconst LineLimiterBase = ({children, maxLines, lineHeight, moreText, lessText, errorMargin = 0.1, className}: LineLimiterProps) => {\n    const maxLineHeight = maxLines * lineHeight;\n\n    const [needLimiter, setNeedLimiter] = useState(false);\n    const [open, setOpen] = useState(false);\n    const [maxHeight, setMaxHeight] = useState('inherit');\n    const ref = useRef<HTMLDivElement>(null);\n\n    useEffect(() => {\n        if (ref === null || ref.current === null) {\n            return;\n        }\n\n        const contentHeight = ref.current.scrollHeight;\n        const margin = maxLineHeight * errorMargin;\n        if (contentHeight > (maxLineHeight + margin)) {\n            setNeedLimiter(true);\n\n            if (open) {\n                setMaxHeight(`${contentHeight}px`);\n            } else {\n                setMaxHeight(`${maxLineHeight}px`);\n            }\n        } else {\n            setNeedLimiter(false);\n            setMaxHeight('inherit');\n        }\n    }, [children, open]);\n\n    return (\n        <CSSTransition\n            in={open}\n            timeout={500}\n            classNames='LineLimiter--Transition-'\n        >\n            <>\n                <div\n                    className={className}\n                    style={{maxHeight}}\n                >\n                    <div>\n                        <div ref={ref}>{children}</div>\n                    </div>\n                </div>\n                {needLimiter && (\n                    <ToggleButton\n                        className='LineLimiter__toggler'\n                        onClick={() => setOpen(!open)}\n                    >\n                        {open ? lessText : moreText}\n                    </ToggleButton>\n                )}\n            </>\n        </CSSTransition>\n    );\n};\n\nconst ToggleButton = styled.button`\n    border: 0px;\n    background-color: var(--center-channel-bg);\n    color: var(--button-bg);\n    padding: 0;\n    margin: 0;\n`;\n\nconst LineLimiter = styled(LineLimiterBase)<LineLimiterProps>`\n    transition: max-height 0.5s ease;\n    line-height: ${(props) => props.lineHeight}px;\n    overflow: hidden;\n\n    p {\n        margin-bottom: ${(props) => props.lineHeight}px;\n    }\n\n    span[data-emoticon] {\n        max-height: ${(props) => props.lineHeight}px;\n        .emoticon {\n            max-height: ${(props) => props.lineHeight}px;\n            min-height: ${(props) => props.lineHeight}px;\n         }\n    }\n\n    .markdown-inline-img__container img.markdown-inline-img {\n        max-height: ${(props) => props.lineHeight}px !important;\n        margin-top: 0 !important;\n        margin-bottom: 0 !important;\n    }\n\n    & > * {\n       overflow: hidden;\n    }\n`;\n\nexport default LineLimiter;\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 styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport Markdown from 'components/markdown';\n\nimport EditableArea from './components/editable_area';\nimport LineLimiter from './components/linelimiter';\n\nconst ChannelId = styled.div`\n    margin-bottom: 12px;\n    font-size: 11px;\n    line-height: 16px;\n    letter-spacing: 0.02em;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst ChannelPurpose = styled.div`\n    margin-bottom: 12px;\n    &.ChannelPurpose--is-dm {\n        margin-bottom: 16px;\n    }\n`;\n\nconst ChannelDescriptionHeading = styled.div`\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n    font-size: 12px;\n    font-style: normal;\n    font-weight: 600;\n    line-height: 16px;\n    letter-spacing: 0.24px;\n    text-transform: uppercase;\n    padding: 6px 0px;\n`;\n\nconst ChannelHeader = styled.div`\n    margin-bottom: 12px;\n`;\n\ninterface Props {\n    channel: Channel;\n    canEditChannelProperties: boolean;\n    actions: {\n        editChannelPurpose: () => void;\n        editChannelHeader: () => void;\n    };\n}\n\nconst AboutAreaChannel = ({channel, canEditChannelProperties, actions}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <>\n            {(channel.purpose || canEditChannelProperties) && (\n                <ChannelPurpose>\n                    <ChannelDescriptionHeading>\n                        {formatMessage({id: 'channel_info_rhs.about_area.channel_purpose.heading', defaultMessage: 'Channel Purpose'})}\n                    </ChannelDescriptionHeading>\n                    <EditableArea\n                        editable={canEditChannelProperties}\n                        content={channel.purpose && (\n                            <LineLimiter\n                                maxLines={4}\n                                lineHeight={20}\n                                moreText={formatMessage({id: 'channel_info_rhs.about_area.channel_purpose.line_limiter.more', defaultMessage: 'more'})}\n                                lessText={formatMessage({id: 'channel_info_rhs.about_area.channel_purpose.line_limiter.less', defaultMessage: 'less'})}\n                            >\n                                <Markdown message={channel.purpose}/>\n                            </LineLimiter>\n                        )}\n                        onEdit={actions.editChannelPurpose}\n                        emptyLabel={formatMessage({id: 'channel_info_rhs.about_area.add_channel_purpose', defaultMessage: 'Add a channel purpose'})}\n                    />\n                </ChannelPurpose>\n            )}\n\n            {(channel.header || canEditChannelProperties) && (\n                <ChannelHeader>\n                    <ChannelDescriptionHeading>\n                        {formatMessage({id: 'channel_info_rhs.about_area.channel_header.heading', defaultMessage: 'Channel Header'})}\n                    </ChannelDescriptionHeading>\n                    <EditableArea\n                        content={channel.header && (\n                            <LineLimiter\n                                maxLines={4}\n                                lineHeight={20}\n                                moreText={formatMessage({id: 'channel_info_rhs.about_area.channel_header.line_limiter.more', defaultMessage: 'more'})}\n                                lessText={formatMessage({id: 'channel_info_rhs.about_area.channel_header.line_limiter.less', defaultMessage: 'less'})}\n                            >\n                                <Markdown message={channel.header}/>\n                            </LineLimiter>\n                        )}\n                        editable={canEditChannelProperties}\n                        onEdit={actions.editChannelHeader}\n                        emptyLabel={formatMessage({id: 'channel_info_rhs.about_area.add_channel_header', defaultMessage: 'Add a channel header'})}\n                    />\n                </ChannelHeader>\n            )}\n\n            <ChannelId>\n                {formatMessage({id: 'channel_info_rhs.about_area_id', defaultMessage: 'ID:'})} {channel.id}\n            </ChannelId>\n        </>\n    );\n};\n\nexport default AboutAreaChannel;\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 styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport Markdown from 'components/markdown';\nimport ProfilePicture from 'components/profile_picture';\nimport BotTag from 'components/widgets/tag/bot_tag';\nimport GuestTag from 'components/widgets/tag/guest_tag';\n\nimport type {DMUser} from './channel_info_rhs';\nimport EditableArea from './components/editable_area';\nimport LineLimiter from './components/linelimiter';\n\nconst Username = styled.p`\n    font-family: Metropolis, sans-serif;\n    font-size: 18px;\n    line-height: 24px;\n    color: rgb(var(--center-channel-color-rgb));\n    font-weight: 600;\n    margin: 0;\n`;\n\nconst ChannelHeader = styled.div`\n    margin-bottom: 12px;\n`;\n\nconst UserInfoContainer = styled.div`\n    display: flex;\n    align-items: center;\n    margin-bottom: 12px;\n`;\n\nconst UserAvatar = styled.div`\n    .status {\n        bottom: 0;\n        right: 0;\n        height: 18px;\n        width: 18px;\n        & svg {\n            min-height: 14.4px;\n        }\n    }\n`;\n\nconst UserInfo = styled.div`\n    margin-left: 12px;\n    display: flex;\n    flex-direction: column;\n`;\n\nconst UsernameContainer = styled.div`\n    display: flex;\n    gap: 8px\n`;\n\nconst UserPosition = styled.div`\n    line-height: 20px;\n\n    p {\n        margin-bottom: 0;\n    }\n`;\n\nconst ChannelId = styled.div`\n    margin-bottom: 12px;\n    font-size: 11px;\n    line-height: 16px;\n    letter-spacing: 0.02em;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\ninterface Props {\n    channel: Channel;\n    dmUser: DMUser;\n    actions: {\n        editChannelHeader: () => void;\n    };\n}\n\nconst AboutAreaDM = ({channel, dmUser, actions}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <>\n            <UserInfoContainer>\n                <UserAvatar>\n                    <ProfilePicture\n                        src={Client4.getProfilePictureUrl(dmUser.user.id, dmUser.user.last_picture_update)}\n                        isBot={dmUser.user.is_bot}\n                        status={dmUser.status ? dmUser.status : undefined}\n                        username={dmUser.display_name}\n                        userId={dmUser.user.id}\n                        channelId={channel.id}\n                        size='xl'\n                    />\n                </UserAvatar>\n                <UserInfo>\n                    <UsernameContainer>\n                        <Username>{dmUser.display_name}</Username>\n                        {dmUser.user.is_bot && <BotTag/>}\n                        {dmUser.is_guest && <GuestTag/>}\n                    </UsernameContainer>\n                    <UserPosition>\n                        <Markdown message={dmUser.user.is_bot ? dmUser.user.bot_description : dmUser.user.position}/>\n                    </UserPosition>\n                </UserInfo>\n            </UserInfoContainer>\n\n            {!dmUser.user.is_bot && (\n                <ChannelHeader>\n                    <EditableArea\n                        content={channel.header && (\n                            <LineLimiter\n                                maxLines={4}\n                                lineHeight={20}\n                                moreText={formatMessage({id: 'channel_info_rhs.about_area.channel_header.line_limiter.more', defaultMessage: 'more'})}\n                                lessText={formatMessage({id: 'channel_info_rhs.about_area.channel_header.line_limiter.less', defaultMessage: 'less'})}\n                            >\n                                <Markdown message={channel.header}/>\n                            </LineLimiter>\n                        )}\n                        editable={true}\n                        onEdit={actions.editChannelHeader}\n                        emptyLabel={formatMessage({id: 'channel_info_rhs.about_area.add_channel_header', defaultMessage: 'Add a channel header'})}\n                    />\n                </ChannelHeader>\n            )}\n\n            <ChannelId>\n                {formatMessage({id: 'channel_info_rhs.about_area_id', defaultMessage: 'ID:'})} {channel.id}\n            </ChannelId>\n        </>\n    );\n};\n\nexport default AboutAreaDM;\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 styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {Client4} from 'mattermost-redux/client';\n\nimport Markdown from 'components/markdown';\nimport ProfilePicture from 'components/profile_picture';\nimport UserProfileElement from 'components/user_profile';\n\nimport EditableArea from './components/editable_area';\nimport LineLimiter from './components/linelimiter';\n\nconst Usernames = styled.p`\n    font-family: Metropolis, sans-serif;\n    font-size: 18px;\n    line-height: 24px;\n    color: rgb(var(--center-channel-color-rgb));\n    font-weight: 600;\n    margin: 0;\n`;\n\nconst ProfilePictures = styled.div`\n    margin-bottom: 10px;\n`;\n\ninterface ProfilePictureContainerProps {\n    position: number;\n}\n\nconst ProfilePictureContainer = styled.div<ProfilePictureContainerProps>`\n    display: inline-block;\n    position: relative;\n    left: ${(props) => props.position * -15}px;\n\n    & img {\n        border: 2px solid white;\n    }\n`;\n\nconst UsersArea = styled.div`\n    margin-bottom: 12px;\n    &.ChannelPurpose--is-dm {\n        margin-bottom: 16px;\n    }\n`;\n\nconst ChannelHeader = styled.div`\n    margin-bottom: 12px;\n`;\n\nconst ChannelId = styled.div`\n    margin-bottom: 12px;\n    font-size: 11px;\n    line-height: 16px;\n    letter-spacing: 0.02em;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\ninterface Props {\n    channel: Channel;\n    gmUsers: UserProfile[];\n    actions: {\n        editChannelHeader: () => void;\n    };\n}\n\nconst AboutAreaGM = ({channel, gmUsers, actions}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <>\n            <UsersArea>\n                <ProfilePictures>\n                    {gmUsers.map((user, idx) => (\n                        <ProfilePictureContainer\n                            key={user.id}\n                            position={idx}\n                        >\n                            <ProfilePicture\n                                src={Client4.getProfilePictureUrl(user.id, user.last_picture_update)}\n                                size='xl'\n                                userId={user.id}\n                                username={user.username}\n                                channelId={channel.id}\n                            />\n                        </ProfilePictureContainer>\n                    ))}\n                </ProfilePictures>\n                <Usernames>\n                    {gmUsers.map((user, i, {length}) => (\n                        <React.Fragment key={user.id}>\n                            <UserProfileElement\n                                userId={user.id}\n                                channelId={channel.id}\n                            />\n                            {(i + 1 !== length) && (<span>{', '}</span>)}\n                        </React.Fragment>\n                    ))}\n                </Usernames>\n            </UsersArea>\n\n            <ChannelHeader>\n                <EditableArea\n                    content={channel.header && (\n                        <LineLimiter\n                            maxLines={4}\n                            lineHeight={20}\n                            moreText={formatMessage({id: 'channel_info_rhs.about_area.channel_header.line_limiter.more', defaultMessage: 'more'})}\n                            lessText={formatMessage({id: 'channel_info_rhs.about_area.channel_header.line_limiter.less', defaultMessage: 'less'})}\n                        >\n                            <Markdown message={channel.header}/>\n                        </LineLimiter>\n                    )}\n                    editable={true}\n                    onEdit={actions.editChannelHeader}\n                    emptyLabel={formatMessage({id: 'channel_info_rhs.about_area.add_channel_header', defaultMessage: 'Add a channel header'})}\n                />\n            </ChannelHeader>\n\n            <ChannelId>\n                {formatMessage({id: 'channel_info_rhs.about_area_id', defaultMessage: 'ID:'})} {channel.id}\n            </ChannelId>\n        </>\n    );\n};\n\nexport default AboutAreaGM;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport Constants from 'utils/constants';\n\nimport AboutAreaChannel from './about_area_channel';\nimport AboutAreaDM from './about_area_dm';\nimport AboutAreaGM from './about_area_gm';\nimport type {DMUser} from './channel_info_rhs';\n\nconst Container = styled.div`\n    overflow-wrap: anywhere;\n    padding: 24px;\n    padding-bottom: 12px;\n\n    font-size: 14px;\n    line-height: 20px;\n\n    & .status-wrapper {\n        height: 50px;\n    }\n\n    & .text-empty {\n        padding: 0px;\n        background: transparent;\n        border: 0px;\n        color: rgba(var(--center-channel-color-rgb), 0.75);\n    }\n`;\n\ninterface Props {\n    channel: Channel;\n    dmUser?: DMUser;\n    gmUsers?: UserProfile[];\n    canEditChannelProperties: boolean;\n    actions: {\n        editChannelPurpose: () => void;\n        editChannelHeader: () => void;\n    };\n}\n\nconst AboutArea = ({channel, dmUser, gmUsers, canEditChannelProperties, actions}: Props) => {\n    return (\n        <Container>\n            {channel.type === Constants.DM_CHANNEL && dmUser && (\n                <AboutAreaDM\n                    channel={channel}\n                    dmUser={dmUser}\n                    actions={{editChannelHeader: actions.editChannelHeader}}\n                />\n            )}\n            {channel.type === Constants.GM_CHANNEL && gmUsers && (\n                <AboutAreaGM\n                    channel={channel}\n                    gmUsers={gmUsers!}\n                    actions={{editChannelHeader: actions.editChannelHeader}}\n                />\n            )}\n            {[Constants.OPEN_CHANNEL, Constants.PRIVATE_CHANNEL].includes(channel.type) && (\n                <AboutAreaChannel\n                    channel={channel}\n                    canEditChannelProperties={canEditChannelProperties}\n                    actions={actions}\n                />\n            )}\n        </Container>\n    );\n};\n\nexport default AboutArea;\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 styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport WithTooltip from 'components/with_tooltip';\n\ninterface Props {\n    channel: Channel;\n    isArchived: boolean;\n    isMobile: boolean;\n    onClose: () => void;\n}\n\nconst Icon = styled.i`\n    font-size:12px;\n`;\n\nconst HeaderTitle = styled.span`\n    line-height: 2.4rem;\n`;\n\nconst Header = ({channel, isArchived, isMobile, onClose}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <div className='sidebar--right__header'>\n            <span className='sidebar--right__title'>\n                {isMobile && (\n                    <button\n                        className='sidebar--right__back btn btn-icon btn-sm'\n                        onClick={onClose}\n                        aria-label={formatMessage({id: 'rhs_header.back.icon', defaultMessage: 'Back Icon'})}\n                    >\n                        <i\n                            className='icon icon-arrow-back-ios'\n                        />\n                    </button>\n                )}\n                <HeaderTitle>\n                    <FormattedMessage\n                        id='channel_info_rhs.header.title'\n                        defaultMessage='Info'\n                    />\n                </HeaderTitle>\n\n                {channel.display_name &&\n                <span\n                    className='style--none sidebar--right__title__subtitle'\n                >\n                    {isArchived && (<Icon className='icon icon-archive-outline'/>)}\n                    {channel.display_name}\n                </span>\n                }\n            </span>\n\n            <WithTooltip\n                title={\n                    <FormattedMessage\n                        id='rhs_header.closeSidebarTooltip'\n                        defaultMessage='Close'\n                    />\n                }\n            >\n                <button\n                    id='rhsCloseButton'\n                    type='button'\n                    className='sidebar--right__close btn btn-icon btn-sm'\n                    aria-label={formatMessage({id: 'rhs_header.closeTooltip.icon', defaultMessage: 'Close Sidebar Icon'})}\n                    onClick={onClose}\n                >\n                    <i\n                        className='icon icon-close'\n                    />\n                </button>\n            </WithTooltip>\n        </div>\n    );\n};\n\nexport default Header;\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 {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {Channel, ChannelStats} from '@mattermost/types/channels';\n\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport {Constants} from 'utils/constants';\n\nconst MenuItemContainer = styled.div`\n    padding: 8px 16px;\n    flex: 1;\n    display: flex;\n`;\n\nconst Icon = styled.div`\n    color: rgba(var(--center-channel-color-rgb), var(--icon-opacity));\n`;\n\nconst MenuItemText = styled.div`\n    padding-left: 8px;\n    flex: 1;\n`;\n\nconst RightSide = styled.div`\n    display: flex;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n`;\n\nconst Badge = styled.div`\n    font-size: 12px;\n    line-height: 18px;\n    width: 20px;\n    display: flex;\n    place-content: center;\n`;\n\ninterface MenuItemProps {\n    className?: string;\n    icon: JSX.Element;\n    text: string;\n    opensSubpanel?: boolean;\n    badge?: string|number|JSX.Element;\n    onClick: () => void;\n}\n\nconst menuItem = ({icon, text, className, opensSubpanel, badge, onClick}: MenuItemProps) => {\n    const hasRightSide = (badge !== undefined) || opensSubpanel;\n\n    return (\n        <div className={className}>\n            <MenuItemContainer onClick={onClick}>\n                <Icon>{icon}</Icon>\n                <MenuItemText>\n                    {text}\n                </MenuItemText>\n\n                {hasRightSide && (\n                    <RightSide>\n                        {badge !== undefined && (\n                            <Badge>{badge}</Badge>\n                        )}\n                        {opensSubpanel && (\n                            <Icon><i className='icon icon-chevron-right'/></Icon>\n                        )}\n                    </RightSide>\n                )}\n            </MenuItemContainer>\n        </div>\n    );\n};\n\nconst MenuItem = styled(menuItem)`\n    display: flex;\n    width: 100%;\n    height: 40px;\n    flex-direction: row;\n    align-items: center;\n    cursor: pointer;\n\n    &:hover {\n        background: rgba(var(--center-channel-color-rgb), 0.08);\n\n        ${Icon} {\n            color: rgba(var(--center-channel-color-rgb), var(--icon-opacity-hover));\n        }\n    }\n`;\n\ninterface MenuProps {\n    channel: Channel;\n    channelStats: ChannelStats;\n    isArchived: boolean;\n\n    className?: string;\n\n    actions: {\n        openNotificationSettings: () => void;\n        showChannelFiles: (channelId: string) => void;\n        showPinnedPosts: (channelId: string | undefined) => void;\n        showChannelMembers: (channelId: string) => void;\n        getChannelStats: (channelId: string, includeFileCount: boolean) => Promise<{data: ChannelStats}>;\n    };\n}\n\nconst Menu = ({channel, channelStats, isArchived, className, actions}: MenuProps) => {\n    const {formatMessage} = useIntl();\n    const [loadingStats, setLoadingStats] = useState(true);\n\n    const showNotificationPreferences = channel.type !== Constants.DM_CHANNEL && !isArchived;\n    const showMembers = channel.type !== Constants.DM_CHANNEL;\n    const fileCount = channelStats?.files_count >= 0 ? channelStats?.files_count : 0;\n\n    useEffect(() => {\n        actions.getChannelStats(channel.id, true).then(() => {\n            setLoadingStats(false);\n        });\n        return () => {\n            setLoadingStats(true);\n        };\n    }, [channel.id]);\n\n    return (\n        <div\n            className={className}\n            data-testid='channel_info_rhs-menu'\n        >\n            {showNotificationPreferences && (\n                <MenuItem\n                    icon={<i className='icon icon-bell-outline'/>}\n                    text={formatMessage({id: 'channel_info_rhs.menu.notification_preferences', defaultMessage: 'Notification Preferences'})}\n                    onClick={actions.openNotificationSettings}\n                />\n            )}\n            {showMembers && (\n                <MenuItem\n                    icon={<i className='icon icon-account-outline'/>}\n                    text={formatMessage({id: 'channel_info_rhs.menu.members', defaultMessage: 'Members'})}\n                    opensSubpanel={true}\n                    badge={channelStats.member_count}\n                    onClick={() => actions.showChannelMembers(channel.id)}\n                />\n            )}\n            <MenuItem\n                icon={<i className='icon icon-pin-outline'/>}\n                text={formatMessage({id: 'channel_info_rhs.menu.pinned', defaultMessage: 'Pinned messages'})}\n                opensSubpanel={true}\n                badge={channelStats?.pinnedpost_count}\n                onClick={() => actions.showPinnedPosts(channel.id)}\n            />\n            <MenuItem\n                icon={<i className='icon icon-file-text-outline'/>}\n                text={formatMessage({id: 'channel_info_rhs.menu.files', defaultMessage: 'Files'})}\n                opensSubpanel={true}\n                badge={loadingStats ? <LoadingSpinner/> : fileCount}\n                onClick={() => actions.showChannelFiles(channel.id)}\n            />\n        </div>\n    );\n};\n\nconst StyledMenu = styled(Menu)`\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n    padding: 16px 0;\n\n    font-size: 14px;\n    line-height: 20px;\n    color: rgb(var(--center-channel-color-rgb));\n`;\n\nexport default StyledMenu;\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 styled from 'styled-components';\n\nimport useCopyText from 'components/common/hooks/useCopyText';\nimport WithTooltip from 'components/with_tooltip';\n\nimport Constants from 'utils/constants';\n\nconst ChannelInfoRhsTopButtons = styled.div`\n    display: flex;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n    margin-top: 24px;\n    padding: 0 18px;\n`;\n\nconst Button = styled.button`\n    flex: 1;\n    padding: 12px 0 10px 0;\n    border: 0;\n    margin: 0 6px;\n    background: rgba(var(--center-channel-color-rgb), 0.04);\n    border-radius: 4px;\n\n    &:hover {\n        background: rgba(var(--center-channel-color-rgb), 0.08);\n        color: rgba(var(--center-channel-color-rgb), 0.8);\n\n        & i {\n            color: rgba(var(--center-channel-color-rgb), var(--icon-opacity-hover));\n        }\n    }\n\n    &:active,\n    &.active {\n        background: rgba(var(--button-bg-rgb), 0.08);\n        color: var(--button-bg);\n\n        & i {\n            color: var(--button-bg-rgb);\n        }\n    }\n\n    & i {\n        color: rgba(var(--center-channel-color-rgb), var(--icon-opacity));\n        font-size: 24px;\n    }\n\n    & span {\n        font-size: 10px;\n        font-weight: 600;\n        line-height: 16px;\n    }\n`;\n\nconst CopyButton = styled(Button)`\n    transition: background-color 0.5s ease;\n\n    &:active,\n    &.active {\n        background: rgba(var(--center-channel-color-rgb), 0.08);\n        color: rgba(var(--center-channel-color-rgb), 0.75);\n        transition: none;\n    }\n\n    &.success {\n        background: var(--denim-status-online);\n        color: var(--button-color);\n    }\n`;\n\nexport interface Props {\n    channelType: string;\n    channelURL?: string;\n\n    isFavorite: boolean;\n    isMuted: boolean;\n    isInvitingPeople: boolean;\n\n    canAddPeople: boolean;\n\n    actions: {\n        toggleFavorite: () => void;\n        toggleMute: () => void;\n        addPeople: () => void;\n    };\n}\n\nexport default function TopButtons({\n    channelType,\n    channelURL,\n    isFavorite,\n    isMuted,\n    isInvitingPeople,\n    canAddPeople: propsCanAddPeople,\n    actions,\n}: Props) {\n    const {formatMessage} = useIntl();\n\n    const copyLink = useCopyText({\n        text: channelURL || '',\n        successCopyTimeout: 1000,\n    });\n\n    const canAddPeople = ([Constants.OPEN_CHANNEL, Constants.PRIVATE_CHANNEL].includes(channelType) && propsCanAddPeople) || channelType === Constants.GM_CHANNEL;\n\n    const canCopyLink = [Constants.OPEN_CHANNEL, Constants.PRIVATE_CHANNEL].includes(channelType);\n\n    // Favorite Button State\n    const favoriteIcon = isFavorite ? 'icon-star' : 'icon-star-outline';\n    const favoriteText = isFavorite ? formatMessage({id: 'channel_info_rhs.top_buttons.favorited', defaultMessage: 'Favorited'}) : formatMessage({id: 'channel_info_rhs.top_buttons.favorite', defaultMessage: 'Favorite'});\n\n    // Mute Button State\n    const mutedIcon = isMuted ? 'icon-bell-off-outline' : 'icon-bell-outline';\n    const mutedText = isMuted ? formatMessage({id: 'channel_info_rhs.top_buttons.muted', defaultMessage: 'Muted'}) : formatMessage({id: 'channel_info_rhs.top_buttons.mute', defaultMessage: 'Mute'});\n\n    // Copy Button State\n    const copyIcon = copyLink.copiedRecently ? 'icon-check' : 'icon-link-variant';\n    const copyText = copyLink.copiedRecently ? formatMessage({id: 'channel_info_rhs.top_buttons.copied', defaultMessage: 'Copied'}) : formatMessage({id: 'channel_info_rhs.top_buttons.copy', defaultMessage: 'Copy Link'});\n\n    return (\n        <ChannelInfoRhsTopButtons>\n            <WithTooltip\n                title={\n                    <FormattedMessage\n                        id='channel_info_rhs.top_buttons.favorite.tooltip'\n                        defaultMessage='Add this channel to favorites'\n                    />\n                }\n            >\n                <Button\n                    onClick={actions.toggleFavorite}\n                    className={isFavorite ? 'active' : ''}\n                >\n                    <div>\n                        <i className={'icon ' + favoriteIcon}/>\n                    </div>\n                    <span>{favoriteText}</span>\n                </Button>\n            </WithTooltip>\n            <WithTooltip\n                title={\n                    <FormattedMessage\n                        id='channel_info_rhs.top_buttons.mute.tooltip'\n                        defaultMessage='Mute notifications for this channel'\n                    />\n                }\n            >\n                <Button\n                    onClick={actions.toggleMute}\n                    className={isMuted ? 'active' : ''}\n                >\n                    <div>\n                        <i className={'icon ' + mutedIcon}/>\n                    </div>\n                    <span>{mutedText}</span>\n                </Button>\n            </WithTooltip>\n            {canAddPeople && (\n                <WithTooltip\n                    title={\n                        <FormattedMessage\n                            id='channel_info_rhs.top_buttons.add_people.tooltip'\n                            defaultMessage='Add team members to this channel'\n                        />\n                    }\n                >\n                    <Button\n                        onClick={actions.addPeople}\n                        className={isInvitingPeople ? 'active' : ''}\n                    >\n                        <div>\n                            <i className='icon icon-account-plus-outline'/>\n                        </div>\n                        <span>\n                            <FormattedMessage\n                                id='channel_info_rhs.top_buttons.add_people'\n                                defaultMessage='Add People'\n                            />\n                        </span>\n                    </Button>\n                </WithTooltip>\n            )}\n            {canCopyLink && (\n                <WithTooltip\n                    title={\n                        <FormattedMessage\n                            id='channel_info_rhs.top_buttons.copy_link.tooltip'\n                            defaultMessage='Copy link to this channel'\n                        />\n                    }\n                >\n                    <CopyButton\n                        onClick={copyLink.onClick}\n                        className={copyLink.copiedRecently ? 'success' : ''}\n                    >\n                        <div>\n                            <i className={'icon ' + copyIcon}/>\n                        </div>\n                        <span>{copyText}</span>\n                    </CopyButton>\n                </WithTooltip>\n            )}\n        </ChannelInfoRhsTopButtons>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport styled from 'styled-components';\n\nimport type {Channel, ChannelStats} from '@mattermost/types/channels';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ChannelNotificationsModal from 'components/channel_notifications_modal';\nimport EditChannelHeaderModal from 'components/edit_channel_header_modal';\nimport EditChannelPurposeModal from 'components/edit_channel_purpose_modal';\nimport MoreDirectChannels from 'components/more_direct_channels';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\nimport type {ModalData} from 'types/actions';\n\nimport AboutArea from './about_area';\nimport Header from './header';\nimport Menu from './menu';\nimport TopButtons from './top_buttons';\n\nconst Divider = styled.div`\n    width: 88%;\n    border: 1px solid rgba(var(--center-channel-color-rgb), 0.04);\n    margin: 0 auto;\n`;\n\nexport interface DMUser {\n    user: UserProfile;\n    display_name: string;\n    is_guest: boolean;\n    status: string;\n}\n\nexport interface Props {\n    channel: Channel;\n    channelStats: ChannelStats;\n    currentUser: UserProfile;\n    currentTeam: Team;\n\n    isArchived: boolean;\n    isFavorite: boolean;\n    isMuted: boolean;\n    isInvitingPeople: boolean;\n    isMobile: boolean;\n\n    canManageMembers: boolean;\n    canManageProperties: boolean;\n\n    dmUser?: DMUser;\n    channelMembers: UserProfile[];\n\n    actions: {\n        closeRightHandSide: () => void;\n        unfavoriteChannel: (channelId: string) => void;\n        favoriteChannel: (channelId: string) => void;\n        unmuteChannel: (userId: string, channelId: string) => void;\n        muteChannel: (userId: string, channelId: string) => void;\n        openModal: <P>(modalData: ModalData<P>) => void;\n        showChannelFiles: (channelId: string) => void;\n        showPinnedPosts: (channelId: string | undefined) => void;\n        showChannelMembers: (channelId: string) => void;\n        getChannelStats: (channelId: string) => Promise<{data: ChannelStats}>;\n    };\n}\n\nconst ChannelInfoRhs = ({\n    channel,\n    channelStats,\n    isArchived,\n    isFavorite,\n    isMuted,\n    isInvitingPeople,\n    isMobile,\n    currentTeam,\n    currentUser,\n    dmUser,\n    channelMembers,\n    canManageMembers,\n    canManageProperties,\n    actions,\n}: Props) => {\n    const currentUserId = currentUser.id;\n    const channelURL = getSiteURL() + '/' + currentTeam.name + '/channels/' + channel.name;\n\n    const toggleFavorite = () => {\n        if (isFavorite) {\n            actions.unfavoriteChannel(channel.id);\n            return;\n        }\n        actions.favoriteChannel(channel.id);\n    };\n\n    const toggleMute = () => {\n        if (isMuted) {\n            actions.unmuteChannel(currentUserId, channel.id);\n            return;\n        }\n        actions.muteChannel(currentUserId, channel.id);\n    };\n\n    const addPeople = () => {\n        if (channel.type === Constants.GM_CHANNEL) {\n            return actions.openModal({\n                modalId: ModalIdentifiers.CREATE_DM_CHANNEL,\n                dialogType: MoreDirectChannels,\n                dialogProps: {isExistingChannel: true},\n            });\n        }\n\n        return actions.openModal({\n            modalId: ModalIdentifiers.CHANNEL_INVITE,\n            dialogType: ChannelInviteModal,\n            dialogProps: {channel},\n        });\n    };\n\n    const editChannelPurpose = () => actions.openModal({\n        modalId: ModalIdentifiers.EDIT_CHANNEL_PURPOSE,\n        dialogType: EditChannelPurposeModal,\n        dialogProps: {channel},\n    });\n\n    const editChannelHeader = () => actions.openModal({\n        modalId: ModalIdentifiers.EDIT_CHANNEL_HEADER,\n        dialogType: EditChannelHeaderModal,\n        dialogProps: {channel},\n    });\n\n    const openNotificationSettings = () => actions.openModal({\n        modalId: ModalIdentifiers.CHANNEL_NOTIFICATIONS,\n        dialogType: ChannelNotificationsModal,\n        dialogProps: {channel, currentUser},\n    });\n\n    const gmUsers = channelMembers.filter((user) => {\n        return user.id !== currentUser.id;\n    });\n\n    const canEditChannelProperties = !isArchived && canManageProperties;\n\n    return (\n        <div\n            id='rhsContainer'\n            className='sidebar-right__body'\n        >\n            <Header\n                channel={channel}\n                isArchived={isArchived}\n                isMobile={isMobile}\n                onClose={actions.closeRightHandSide}\n            />\n\n            <TopButtons\n                channelType={channel.type}\n                channelURL={channelURL}\n\n                isFavorite={isFavorite}\n                isMuted={isMuted}\n                isInvitingPeople={isInvitingPeople}\n\n                canAddPeople={canManageMembers}\n\n                actions={{toggleFavorite, toggleMute, addPeople}}\n            />\n\n            <AboutArea\n                channel={channel}\n\n                dmUser={dmUser}\n                gmUsers={gmUsers}\n\n                canEditChannelProperties={canEditChannelProperties}\n\n                actions={{\n                    editChannelHeader,\n                    editChannelPurpose,\n                }}\n            />\n\n            <Divider/>\n\n            <Menu\n                channel={channel}\n                channelStats={channelStats}\n                isArchived={isArchived}\n                actions={{\n                    openNotificationSettings,\n                    showChannelFiles: actions.showChannelFiles,\n                    showPinnedPosts: actions.showPinnedPosts,\n                    showChannelMembers: actions.showChannelMembers,\n                    getChannelStats: actions.getChannelStats,\n                }}\n            />\n        </div>\n    );\n};\n\nexport default memo(ChannelInfoRhs);\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 {AnyAction, Dispatch} from 'redux';\n\nimport {unfavoriteChannel, favoriteChannel, getChannelStats} from 'mattermost-redux/actions/channels';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getCurrentChannel, isCurrentChannelFavorite, isCurrentChannelMuted, isCurrentChannelArchived, getCurrentChannelStats} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/common';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getProfilesInCurrentChannel, getStatusForUserId, getUser} from 'mattermost-redux/selectors/entities/users';\nimport {isGuest} from 'mattermost-redux/utils/user_utils';\n\nimport {muteChannel, unmuteChannel} from 'actions/channel_actions';\nimport {openModal} from 'actions/views/modals';\nimport {closeRightHandSide, showChannelFiles, showChannelMembers, showPinnedPosts} from 'actions/views/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\nimport {isModalOpen} from 'selectors/views/modals';\n\nimport {Constants, ModalIdentifiers} from 'utils/constants';\nimport {getDisplayNameByUser, getUserIdFromChannelId} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport RHS from './channel_info_rhs';\nimport type {Props} from './channel_info_rhs';\n\nconst EMPTY_CHANNEL_STATS = {\n    member_count: 0,\n    guest_count: 0,\n    pinnedpost_count: 0,\n    files_count: 0,\n};\n\nfunction mapStateToProps(state: GlobalState) {\n    const channel = getCurrentChannel(state);\n    const currentUser = getCurrentUser(state);\n    const currentTeam = getCurrentTeam(state);\n    const channelStats = getCurrentChannelStats(state) || EMPTY_CHANNEL_STATS;\n    const isArchived = isCurrentChannelArchived(state);\n    const isFavorite = isCurrentChannelFavorite(state);\n    const isMuted = isCurrentChannelMuted(state);\n    const isInvitingPeople = isModalOpen(state, ModalIdentifiers.CHANNEL_INVITE) || isModalOpen(state, ModalIdentifiers.CREATE_DM_CHANNEL);\n    const isMobile = getIsMobileView(state);\n\n    const isPrivate = channel?.type === Constants.PRIVATE_CHANNEL;\n    const canManageMembers = haveIChannelPermission(state, currentTeam?.id, channel?.id, isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS : Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS);\n    const canManageProperties = haveIChannelPermission(state, currentTeam?.id, channel?.id, isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES : Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES);\n\n    const channelMembers = getProfilesInCurrentChannel(state);\n\n    const props = {\n        channel,\n        currentUser,\n        currentTeam,\n        isArchived,\n        isFavorite,\n        isMuted,\n        isInvitingPeople,\n        isMobile,\n        canManageMembers,\n        canManageProperties,\n        channelStats,\n        channelMembers,\n    } as Props;\n\n    if (channel?.type === Constants.DM_CHANNEL) {\n        const user = getUser(state, getUserIdFromChannelId(channel.name, currentUser.id));\n        props.dmUser = {\n            user,\n            display_name: getDisplayNameByUser(state, user),\n            is_guest: isGuest(user.roles),\n            status: getStatusForUserId(state, user.id),\n        };\n    }\n\n    return props;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            closeRightHandSide,\n            unfavoriteChannel,\n            favoriteChannel,\n            unmuteChannel,\n            muteChannel,\n            openModal,\n            showChannelFiles,\n            showPinnedPosts,\n            showChannelMembers,\n            getChannelStats,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RHS);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useEffect} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport styled from 'styled-components';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nconst Title = styled.div`\n    flex:1;\n    font-family: 'Open Sans', sans-serif;\n    font-weight: 600;\n    font-size: 14px;\n    line-height: 20px;\n`;\n\nconst Actions = styled.div`\n    button + button {\n        margin-left: 8px;\n    }\n`;\n\nconst Button = styled.button`\n    border: none;\n    background: transparent;\n    width: fit-content;\n    padding: 8px 16px;\n    border-radius: 4px;\n    font-size: 12px;\n    font-weight: 600;\n    line-height: 16px;\n    &.add-members, &.manage-members-done {\n        background-color: var(--button-bg);\n        color: var(--button-color);\n        &:hover, &:active, &:focus {\n            background: linear-gradient(0deg, rgba(var(--center-channel-color-rgb), 0.16), rgba(var(--center-channel-color-rgb), 0.16)), var(--button-bg);\n            color: var(--button-color);\n        }\n    }\n    &.manage-members {\n        background: rgba(var(--button-bg-rgb),0.08);\n        color: var(--button-bg);\n        &:hover, &:focus {\n            background: rgba(var(--button-bg-rgb),0.12);\n        }\n        &:active {\n            background: rgba(var(--button-bg-rgb),0.16);\n        }\n    }\n`;\n\nconst ButtonIcon = styled.i`\n    font-size: 14.4px;\n`;\n\nexport interface Props {\n    className?: string;\n    channelType: string;\n    membersCount: number;\n    canManageMembers: boolean;\n    editing: boolean;\n    actions: {\n        startEditing: () => void;\n        stopEditing: () => void;\n        inviteMembers: () => void;\n    };\n}\n\nconst ActionBar = ({className, channelType, membersCount, canManageMembers, editing, actions}: Props) => {\n    const showManageButton = channelType !== Constants.GM_CHANNEL && membersCount > 1;\n\n    const handleShortcut = useCallback((e) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ESCAPE) && editing) {\n            actions.stopEditing();\n        }\n    }, [editing, actions]);\n\n    useEffect(() => {\n        document.addEventListener('keydown', handleShortcut);\n        return () => {\n            document.removeEventListener('keydown', handleShortcut);\n        };\n    }, [handleShortcut]);\n\n    return (\n        <div className={className}>\n            <Title>\n                {editing ? (\n                    <FormattedMessage\n                        id='channel_members_rhs.action_bar.managing_title'\n                        defaultMessage='Managing Members'\n                    />\n                ) : (\n                    <FormattedMessage\n                        id='channel_members_rhs.action_bar.members_count_title'\n                        defaultMessage='{members_count} members'\n                        values={{members_count: membersCount}}\n                    />\n                )}\n\n            </Title>\n\n            {canManageMembers && (\n                <Actions>\n                    {editing ? (\n                        <Button\n                            onClick={actions.stopEditing}\n                            className='manage-members-done'\n                        >\n                            <FormattedMessage\n                                id='channel_members_rhs.action_bar.done_button'\n                                defaultMessage='Done'\n                            />\n                        </Button>\n                    ) : (\n                        <>\n                            {showManageButton && (\n                                <Button\n                                    className='manage-members'\n                                    onClick={actions.startEditing}\n                                >\n                                    <FormattedMessage\n                                        id='channel_members_rhs.action_bar.manage_button'\n                                        defaultMessage='Manage'\n                                    />\n                                </Button>\n                            )}\n                            <Button\n                                onClick={actions.inviteMembers}\n                                className='add-members'\n                            >\n                                <ButtonIcon\n                                    className='icon-account-plus-outline'\n                                    title='Add Icon'\n                                />\n                                <FormattedMessage\n                                    id='channel_members_rhs.action_bar.add_button'\n                                    defaultMessage='Add'\n                                />\n                            </Button>\n                        </>\n                    )}\n\n                </Actions>\n            )}\n        </div>\n    );\n};\n\nexport default styled(ActionBar)`\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    padding: 16px 20px;\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, useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport WithTooltip from 'components/with_tooltip';\n\ninterface Props {\n    channel: Channel;\n    canGoBack: boolean;\n\n    onClose: () => void;\n    goBack: () => void;\n}\n\nconst HeaderTitle = styled.span`\n    line-height: 2.4rem;\n`;\n\nconst Header = ({channel, canGoBack, onClose, goBack}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <div className='sidebar--right__header'>\n            <span className='sidebar--right__title'>\n\n                {canGoBack && (\n                    <button\n                        className='sidebar--right__back btn btn-icon btn-sm'\n                        onClick={goBack}\n                        aria-label={formatMessage({id: 'rhs_header.back.icon', defaultMessage: 'Back Icon'})}\n                    >\n                        <i\n                            className='icon icon-arrow-back-ios'\n                        />\n                    </button>\n                )}\n\n                <HeaderTitle>\n                    <FormattedMessage\n                        id='channel_members_rhs.header.title'\n                        defaultMessage='Members'\n                    />\n                </HeaderTitle>\n\n                {channel.display_name &&\n                    <span\n                        className='style--none sidebar--right__title__subtitle'\n                    >\n                        {channel.display_name}\n                    </span>\n                }\n            </span>\n\n            <WithTooltip\n                title={\n                    <FormattedMessage\n                        id='rhs_header.closeSidebarTooltip'\n                        defaultMessage='Close'\n                    />\n                }\n            >\n                <button\n                    id='rhsCloseButton'\n                    type='button'\n                    className='sidebar--right__close btn btn-icon btn-sm'\n                    aria-label={formatMessage({id: 'rhs_header.closeTooltip.icon', defaultMessage: 'Close Sidebar Icon'})}\n                    onClick={onClose}\n                >\n                    <i\n                        className='icon icon-close'\n                    />\n                </button>\n            </WithTooltip>\n        </div>\n    );\n};\n\nexport default Header;\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 styled from 'styled-components';\n\nimport Input from 'components/widgets/inputs/input/input';\n\ninterface Props {\n    className?: string;\n    terms: string;\n    onInput: (terms: string) => void;\n}\n\nconst SearchBar = ({className, terms, onInput}: Props) => {\n    const {formatMessage} = useIntl();\n\n    let inputSuffix;\n    if (terms.length > 0) {\n        inputSuffix = (\n            <button\n                className='style--none'\n                onClick={() => onInput('')}\n                aria-label={formatMessage({\n                    id: 'channel_members_rhs.search_bar.aria.cancel_search_button',\n                    defaultMessage: 'cancel members search',\n                })}\n            >\n                <i className={'icon icon-close-circle'}/>\n            </button>\n        );\n    }\n\n    return (\n        <div className={className}>\n            <Input\n                data-testid='channel-member-rhs-search'\n                value={terms}\n                onInput={(e) => onInput(e.currentTarget.value)}\n                inputPrefix={<i className={'icon icon-magnify'}/>}\n                inputSuffix={inputSuffix}\n                placeholder={formatMessage({\n                    id: 'channel_members_rhs.search_bar.placeholder',\n                    defaultMessage: 'Search members',\n                })}\n                useLegend={false}\n            />\n        </div>\n    );\n};\n\nexport default styled(SearchBar)`\n    display: flex;\n    padding: 0px 20px 12px;\n\n    .Input_container .Input_wrapper {\n        padding: 0 8px;\n    }\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport React, {useCallback, useEffect, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {ProfilesInChannelSortBy} from 'mattermost-redux/actions/users';\n\nimport AlertBanner from 'components/alert_banner';\nimport ChannelInviteModal from 'components/channel_invite_modal';\nimport ExternalLink from 'components/external_link';\nimport MoreDirectChannels from 'components/more_direct_channels';\n\nimport Constants, {ModalIdentifiers} from 'utils/constants';\n\nimport type {ModalData} from 'types/actions';\n\nimport ActionBar from './action_bar';\nimport Header from './header';\nimport MemberList from './member_list';\nimport SearchBar from './search';\n\nconst USERS_PER_PAGE = 100;\nexport interface ChannelMember {\n    user: UserProfile;\n    membership?: ChannelMembership;\n    status?: string;\n    displayName: string;\n}\n\nconst MembersContainer = styled.div`\n    flex: 1 1 auto;\n    padding: 0 4px 16px;\n`;\n\nexport interface Props {\n    channel: Channel;\n    currentUserIsChannelAdmin: boolean;\n    membersCount: number;\n    searchTerms: string;\n    canGoBack: boolean;\n    teamUrl: string;\n    channelMembers: ChannelMember[];\n    canManageMembers: boolean;\n    editing: boolean;\n\n    actions: {\n        openModal: <P>(modalData: ModalData<P>) => void;\n        openDirectChannelToUserId: (userId: string) => Promise<{data: Channel}>;\n        closeRightHandSide: () => void;\n        goBack: () => void;\n        setChannelMembersRhsSearchTerm: (terms: string) => void;\n        loadProfilesAndReloadChannelMembers: (page: number, perParge: number, channelId: string, sort: string) => void;\n        loadMyChannelMemberAndRole: (channelId: string) => void;\n        setEditChannelMembers: (active: boolean) => void;\n        searchProfilesAndChannelMembers: (term: string, options: any) => Promise<{data: UserProfile[]}>;\n    };\n}\n\nexport enum ListItemType {\n    Member = 'member',\n    FirstSeparator = 'first-separator',\n    Separator = 'separator',\n}\n\nexport interface ListItem {\n    type: ListItemType;\n    data: ChannelMember | JSX.Element;\n}\n\nexport default function ChannelMembersRHS({\n    channel,\n    currentUserIsChannelAdmin,\n    searchTerms,\n    membersCount,\n    canGoBack,\n    teamUrl,\n    channelMembers,\n    canManageMembers,\n    editing = false,\n    actions,\n}: Props) {\n    const history = useHistory();\n\n    const [list, setList] = useState<ListItem[]>([]);\n\n    const [page, setPage] = useState(0);\n    const [isNextPageLoading, setIsNextPageLoading] = useState(false);\n    const {formatMessage} = useIntl();\n\n    const searching = searchTerms !== '';\n\n    const isDefaultChannel = channel.name === Constants.DEFAULT_CHANNEL;\n\n    // show search if there's more than 20 or if the user have an active search.\n    const showSearch = searching || membersCount >= 20;\n\n    useEffect(() => {\n        return () => {\n            actions.setChannelMembersRhsSearchTerm('');\n        };\n    }, []);\n\n    useEffect(() => {\n        const listcp: ListItem[] = [];\n        let memberDone = false;\n\n        for (let i = 0; i < channelMembers.length; i++) {\n            const member = channelMembers[i];\n            if (listcp.length === 0) {\n                let text = null;\n                if (member.membership?.scheme_admin === true) {\n                    text = (\n                        <FormattedMessage\n                            id='channel_members_rhs.list.channel_admin_title'\n                            defaultMessage='CHANNEL ADMINS'\n                        />\n                    );\n                } else {\n                    text = (\n                        <FormattedMessage\n                            id='channel_members_rhs.list.channel_members_title'\n                            defaultMessage='MEMBERS'\n                        />\n                    );\n                    memberDone = true;\n                }\n\n                listcp.push({\n                    type: ListItemType.FirstSeparator,\n                    data: <FirstMemberListSeparator>{text}</FirstMemberListSeparator>,\n                });\n            } else if (!memberDone && member.membership?.scheme_admin === false) {\n                listcp.push({\n                    type: ListItemType.Separator,\n                    data: <MemberListSeparator>\n                        <FormattedMessage\n                            id='channel_members_rhs.list.channel_members_title'\n                            defaultMessage='MEMBERS'\n                        />\n                    </MemberListSeparator>,\n                });\n                memberDone = true;\n            }\n\n            listcp.push({type: ListItemType.Member, data: member});\n        }\n        if (JSON.stringify(list) !== JSON.stringify(listcp)) {\n            setList(listcp);\n        }\n    }, [channelMembers]);\n\n    useEffect(() => {\n        if (channel.type === Constants.DM_CHANNEL) {\n            let rhsAction = actions.closeRightHandSide;\n            if (canGoBack) {\n                rhsAction = actions.goBack;\n            }\n            rhsAction();\n            return;\n        }\n\n        setPage(0);\n        setIsNextPageLoading(false);\n        actions.setChannelMembersRhsSearchTerm('');\n        actions.loadProfilesAndReloadChannelMembers(0, USERS_PER_PAGE, channel.id, ProfilesInChannelSortBy.Admin);\n        actions.loadMyChannelMemberAndRole(channel.id);\n    }, [channel.id, channel.type]);\n\n    const setSearchTerms = async (terms: string) => {\n        actions.setChannelMembersRhsSearchTerm(terms);\n    };\n\n    const doSearch = useCallback(debounce(async (terms: string) => {\n        await actions.searchProfilesAndChannelMembers(terms, {in_team_id: channel.team_id, in_channel_id: channel.id});\n    }, Constants.SEARCH_TIMEOUT_MILLISECONDS), [actions.searchProfilesAndChannelMembers]);\n\n    useEffect(() => {\n        if (searchTerms) {\n            doSearch(searchTerms);\n        }\n    }, [searchTerms]);\n\n    const inviteMembers = () => {\n        if (channel.type === Constants.GM_CHANNEL) {\n            return actions.openModal({\n                modalId: ModalIdentifiers.CREATE_DM_CHANNEL,\n                dialogType: MoreDirectChannels,\n                dialogProps: {isExistingChannel: true},\n            });\n        }\n\n        return actions.openModal({\n            modalId: ModalIdentifiers.CHANNEL_INVITE,\n            dialogType: ChannelInviteModal,\n            dialogProps: {channel},\n        });\n    };\n\n    const openDirectMessage = useCallback(async (user: UserProfile) => {\n        // we first prepare the DM channel...\n        await actions.openDirectChannelToUserId(user.id);\n\n        // ... and then redirect to it\n        history.push(teamUrl + '/messages/@' + user.username);\n\n        await actions.closeRightHandSide();\n    }, [actions.openDirectChannelToUserId, history, teamUrl, actions.closeRightHandSide]);\n\n    const loadMore = useCallback(async () => {\n        setIsNextPageLoading(true);\n\n        await actions.loadProfilesAndReloadChannelMembers(page + 1, USERS_PER_PAGE, channel.id, ProfilesInChannelSortBy.Admin);\n        setPage(page + 1);\n\n        setIsNextPageLoading(false);\n    }, [actions.loadProfilesAndReloadChannelMembers, page, channel.id],\n    );\n\n    return (\n        <div\n            id='rhsContainer'\n            className='sidebar-right__body'\n        >\n\n            <Header\n                channel={channel}\n                canGoBack={canGoBack}\n                onClose={actions.closeRightHandSide}\n                goBack={actions.goBack}\n            />\n\n            <ActionBar\n                channelType={channel.type}\n                membersCount={membersCount}\n                canManageMembers={canManageMembers}\n                editing={editing}\n                actions={{\n                    startEditing: () => actions.setEditChannelMembers(true),\n                    stopEditing: () => actions.setEditChannelMembers(false),\n                    inviteMembers,\n                }}\n            />\n\n            {/* Users with user management permissions have special restrictions in the default channel */}\n            {(editing && isDefaultChannel && !currentUserIsChannelAdmin) && (\n                <AlertContainer>\n                    <AlertBanner\n                        mode='info'\n                        variant='app'\n                        message={formatMessage({\n                            id: 'channel_members_rhs.default_channel_moderation_restrictions',\n                            defaultMessage: 'In this channel, you can only remove guests. Only <link>channel admins</link> can manage other members.',\n                        }, {\n                            link: (msg: React.ReactNode) => (\n                                <ExternalLink\n                                    href='https://docs.mattermost.com/welcome/about-user-roles.html#channel-admin'\n                                    location='channel_members_rhs'\n                                >\n                                    {msg}\n                                </ExternalLink>\n                            ),\n                        })}\n                    />\n                </AlertContainer>\n            )}\n\n            {showSearch && (\n                <SearchBar\n                    terms={searchTerms}\n                    onInput={setSearchTerms}\n                />\n            )}\n\n            <MembersContainer>\n                {channelMembers.length > 0 && (\n                    <MemberList\n                        searchTerms={searchTerms}\n                        members={list}\n                        editing={editing}\n                        channel={channel}\n                        openDirectMessage={openDirectMessage}\n                        loadMore={loadMore}\n                        hasNextPage={channelMembers.length < membersCount}\n                        isNextPageLoading={isNextPageLoading}\n                    />\n                )}\n            </MembersContainer>\n        </div>\n    );\n}\n\nconst MemberListSeparator = styled.div`\n    font-weight: 600;\n    font-size: 12px;\n    line-height: 28px;\n    letter-spacing: 0.02em;\n    text-transform: uppercase;\n    padding: 0px 12px;\n    color: rgba(var(--center-channel-color-rgb), 0.75);\n    margin-top: 16px;\n`;\n\nconst FirstMemberListSeparator = styled(MemberListSeparator)`\n    margin-top: 0px;\n`;\n\nconst AlertContainer = styled.div`\n    padding: 0 20px 15px;\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 {AnyAction, Dispatch} from 'redux';\n\nimport type {Channel, ChannelMembership} from '@mattermost/types/channels';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport {loadMyChannelMemberAndRole} from 'mattermost-redux/actions/channels';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {\n    getCurrentChannel,\n    getCurrentChannelStats,\n    getMembersInCurrentChannel,\n    getMyCurrentChannelMembership,\n    isCurrentChannelArchived,\n} from 'mattermost-redux/selectors/entities/channels';\nimport {getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';\nimport {haveIChannelPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentRelativeTeamUrl, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {\n    getActiveProfilesInCurrentChannelWithoutSorting,\n    getUserStatuses, searchActiveProfilesInCurrentChannel,\n} from 'mattermost-redux/selectors/entities/users';\nimport {displayUsername} from 'mattermost-redux/utils/user_utils';\n\nimport {openDirectChannelToUserId} from 'actions/channel_actions';\nimport {loadProfilesAndReloadChannelMembers, searchProfilesAndChannelMembers} from 'actions/user_actions';\nimport {openModal} from 'actions/views/modals';\nimport {closeRightHandSide, goBack, setEditChannelMembers} from 'actions/views/rhs';\nimport {setChannelMembersRhsSearchTerm} from 'actions/views/search';\nimport {getIsEditingMembers, getPreviousRhsState} from 'selectors/rhs';\n\nimport {Constants, RHSStates} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport RHS from './channel_members_rhs';\nimport type {Props, ChannelMember} from './channel_members_rhs';\n\nconst buildProfileList = (\n    profilesInCurrentChannel: UserProfile[],\n    userStatuses: RelationOneToOne<UserProfile, string>,\n    teammateNameDisplaySetting: string,\n    membersInCurrentChannel: Record<string, ChannelMembership>,\n) => {\n    const channelMembers: ChannelMember[] = [];\n    profilesInCurrentChannel.forEach((profile) => {\n        if (!membersInCurrentChannel[profile.id]) {\n            return;\n        }\n\n        channelMembers.push({\n            user: profile,\n            membership: membersInCurrentChannel[profile.id],\n            status: userStatuses[profile.id],\n            displayName: displayUsername(profile, teammateNameDisplaySetting),\n        });\n    });\n\n    channelMembers.sort((a, b) => {\n        if (a.membership?.scheme_admin === b.membership?.scheme_admin) {\n            return a.displayName.localeCompare(b.displayName);\n        }\n\n        if (a.membership?.scheme_admin === true) {\n            return -1;\n        }\n        return 1;\n    });\n\n    return channelMembers;\n};\n\nconst getProfiles = createSelector(\n    'getProfiles',\n    getActiveProfilesInCurrentChannelWithoutSorting,\n    getUserStatuses,\n    getTeammateNameDisplaySetting,\n    getMembersInCurrentChannel,\n    buildProfileList,\n);\n\nconst searchProfiles = createSelector(\n    'searchProfiles',\n    (state: GlobalState, search: string) => searchActiveProfilesInCurrentChannel(state, search, false),\n    getUserStatuses,\n    getTeammateNameDisplaySetting,\n    getMembersInCurrentChannel,\n    buildProfileList,\n);\n\nfunction mapStateToProps(state: GlobalState) {\n    const channel = getCurrentChannel(state);\n    const currentTeam = getCurrentTeam(state);\n    const currentUser = getMyCurrentChannelMembership(state);\n    const {member_count: membersCount} = getCurrentChannelStats(state) || {member_count: 0};\n\n    if (!channel) {\n        return {\n            channel: {} as Channel,\n            currentUserIsChannelAdmin: false,\n            channelMembers: [],\n            channelAdmins: [],\n            searchTerms: '',\n            membersCount,\n            canManageMembers: false,\n            canGoBack: false,\n            teamUrl: '',\n        } as unknown as Props;\n    }\n\n    const isArchived = isCurrentChannelArchived(state);\n    const isPrivate = channel.type === Constants.PRIVATE_CHANNEL;\n    const canManageMembers = haveIChannelPermission(\n        state,\n        currentTeam?.id,\n        channel.id,\n        isPrivate ? Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS : Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS,\n    ) && !isArchived;\n\n    const searchTerms = state.views.search.channelMembersRhsSearch || '';\n\n    let channelMembers: ChannelMember[] = [];\n    if (searchTerms === '') {\n        channelMembers = getProfiles(state);\n    } else {\n        channelMembers = searchProfiles(state, searchTerms.trim());\n    }\n\n    const teamUrl = getCurrentRelativeTeamUrl(state);\n    const prevRhsState = getPreviousRhsState(state);\n    const hasInfoPrevState = prevRhsState === RHSStates.CHANNEL_INFO ||\n        prevRhsState === RHSStates.CHANNEL_FILES ||\n        prevRhsState === RHSStates.PIN;\n\n    const canGoBack = Boolean(hasInfoPrevState);\n    const editing = getIsEditingMembers(state);\n\n    const currentUserIsChannelAdmin = currentUser && currentUser.scheme_admin;\n\n    return {\n        channel,\n        currentUserIsChannelAdmin,\n        membersCount,\n        searchTerms,\n        teamUrl,\n        canGoBack,\n        canManageMembers,\n        channelMembers,\n        editing,\n    } as Props;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n            openDirectChannelToUserId,\n            closeRightHandSide,\n            goBack,\n            setChannelMembersRhsSearchTerm,\n            loadProfilesAndReloadChannelMembers,\n            loadMyChannelMemberAndRole,\n            setEditChannelMembers,\n            searchProfilesAndChannelMembers,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RHS);\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';\n\nimport KeyboardShortcutSequence, {KEYBOARD_SHORTCUTS} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {PropsFromRedux} from './index';\n\nexport interface Props extends PropsFromRedux {\n    children: React.ReactNode;\n}\n\nfunction SearchResultsHeader(props: Props) {\n    const {formatMessage} = useIntl();\n\n    const showExpand = props.previousRhsState !== RHSStates.CHANNEL_INFO;\n\n    // sidebarTooltipContent contains tooltips content for expand or shrink sidebarTooltip.\n    // if props.isExpanded is true, defaultMessage would feed from 'shrinkTooltip', else 'expandTooltip'\n    const sidebarTooltipContent = props.isExpanded ? (\n        <>\n            <FormattedMessage\n                id='rhs_header.collapseSidebarTooltip'\n                defaultMessage='Collapse the right sidebar'\n            />\n            <KeyboardShortcutSequence\n                shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}\n                hideDescription={true}\n                isInsideTooltip={true}\n            />\n        </>\n    ) : (\n        <>\n            <FormattedMessage\n                id='rhs_header.expandSidebarTooltip'\n                defaultMessage='Expand the right sidebar'\n            />\n            <KeyboardShortcutSequence\n                shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}\n                hideDescription={true}\n                isInsideTooltip={true}\n            />\n        </>\n    );\n\n    return (\n        <div className='sidebar--right__header'>\n            <span className='sidebar--right__title'>\n                {props.canGoBack && (\n                    <button\n                        className='sidebar--right__back btn btn-icon btn-sm'\n                        onClick={props.actions.goBack}\n                        aria-label={formatMessage({id: 'rhs_header.back.icon', defaultMessage: 'Back Icon'})}\n                    >\n                        <i className='icon icon-arrow-back-ios'/>\n                    </button>\n                )}\n                {props.children}\n            </span>\n            <div className='pull-right'>\n                {showExpand && (\n                    <WithTooltip\n                        title={sidebarTooltipContent}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__expand btn btn-icon btn-sm'\n                            onClick={props.actions.toggleRhsExpanded}\n                        >\n                            <i\n                                className='icon icon-arrow-expand'\n                                aria-label={formatMessage({id: 'rhs_header.expandSidebarTooltip.icon', defaultMessage: 'Expand Sidebar Icon'})}\n                            />\n                            <i\n                                className='icon icon-arrow-collapse'\n                                aria-label={formatMessage({id: 'rhs_header.collapseSidebarTooltip.icon', defaultMessage: 'Collapse Sidebar Icon'})}\n                            />\n                        </button>\n                    </WithTooltip>\n                )}\n                <WithTooltip\n                    title={\n                        <FormattedMessage\n                            id='rhs_header.closeSidebarTooltip'\n                            defaultMessage='Close'\n                        />\n                    }\n                >\n                    <button\n                        id='searchResultsCloseButton'\n                        type='button'\n                        className='sidebar--right__close btn btn-icon btn-sm'\n                        aria-label='Close'\n                        onClick={props.actions.closeRightHandSide}\n                    >\n                        <i\n                            className='icon icon-close'\n                            aria-label={formatMessage({id: 'rhs_header.closeTooltip.icon', defaultMessage: 'Close Sidebar Icon'})}\n                        />\n                    </button>\n                </WithTooltip>\n            </div>\n        </div>\n    );\n}\n\nexport default SearchResultsHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ConnectedProps} from 'react-redux';\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {AnyAction, Dispatch} from 'redux';\n\nimport {getCurrentChannelId} from 'mattermost-redux/selectors/entities/common';\n\nimport {\n    closeRightHandSide,\n    toggleRhsExpanded,\n    goBack,\n} from 'actions/views/rhs';\nimport {getIsRhsExpanded, getPreviousRhsState} from 'selectors/rhs';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store/index.js';\n\nimport SearchResultsHeader from './search_results_header';\n\nfunction mapStateToProps(state: GlobalState) {\n    const previousRhsState = getPreviousRhsState(state);\n    const canGoBack = previousRhsState === RHSStates.CHANNEL_INFO ||\n        previousRhsState === RHSStates.CHANNEL_MEMBERS ||\n        previousRhsState === RHSStates.CHANNEL_FILES ||\n        previousRhsState === RHSStates.PIN;\n\n    return {\n        isExpanded: getIsRhsExpanded(state),\n        channelId: getCurrentChannelId(state),\n        previousRhsState,\n        canGoBack,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            closeRightHandSide,\n            toggleRhsExpanded,\n            goBack,\n        }, dispatch),\n    };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(SearchResultsHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useCallback} from 'react';\nimport {useIntl} from 'react-intl';\nimport {CSSTransition} from 'react-transition-group';\n\nimport './info_toast.scss';\n\ntype Props = {\n    content: {\n        icon?: JSX.Element;\n        message: string;\n        undo?: () => void;\n    };\n    className?: string;\n    onExited: () => void;\n}\n\nfunction InfoToast({content, onExited, className}: Props): JSX.Element {\n    const {formatMessage} = useIntl();\n    const closeToast = useCallback(() => {\n        onExited();\n    }, [onExited]);\n\n    const undoTodo = useCallback(() => {\n        content.undo?.();\n        onExited();\n    }, [content.undo, onExited]);\n\n    const toastContainerClassname = classNames('info-toast', className);\n\n    useEffect(() => {\n        const timer = setTimeout(() => {\n            onExited();\n        }, 5000);\n\n        return () => clearTimeout(timer);\n    }, [onExited]);\n\n    return (\n        <CSSTransition\n            in={Boolean(content)}\n            classNames='toast'\n            mountOnEnter={true}\n            unmountOnExit={true}\n            timeout={300}\n            appear={true}\n        >\n            <div className={toastContainerClassname}>\n                {content.icon}\n                <span>{content.message}</span>\n                {content.undo && (\n                    <button\n                        onClick={undoTodo}\n                        className='info-toast__undo'\n                    >\n                        {formatMessage({\n                            id: 'post_info.edit.undo',\n                            defaultMessage: 'Undo',\n                        })}\n                    </button>\n                )}\n                <button\n                    className='info-toast__icon_button'\n                    onClick={closeToast}\n                    aria-label={formatMessage({id: 'general_button.close', defaultMessage: 'Close'})}\n                >\n                    <i className='icon icon-close'/>\n                </button>\n            </div>\n        </CSSTransition>\n    );\n}\n\nexport default React.memo(InfoToast);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {defineMessages, useIntl} from 'react-intl';\n\nimport {GenericModal} from '@mattermost/components';\nimport type {Post} from '@mattermost/types/posts';\n\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport PostMessageView from 'components/post_view/post_message_view';\n\nimport './restore_post_history.scss';\n\nconst modalMessages = defineMessages({\n    title: {\n        id: 'post_info.edit.restore',\n        defaultMessage: 'Restore this version',\n    },\n    titleQuestion: {\n        id: 'post_info.edit.restore_question',\n        defaultMessage: 'Restore this version?',\n    },\n});\n\ntype Props = {\n    post: Post;\n    postHeader: JSX.Element;\n    actions: {\n        handleRestore: (post: Post) => void;\n    };\n    onExited: () => void;\n}\n\nconst RestorePostModal = ({post, postHeader, actions, onExited}: Props) => {\n    const {formatMessage} = useIntl();\n    const onHide = () => onExited();\n\n    const handleRestore = async () => {\n        await actions.handleRestore(post);\n        onHide();\n    };\n\n    const modalHeaderText = (\n        <div className='edit-post-history__restore__modal__header'>\n            {formatMessage(modalMessages.titleQuestion)}\n        </div>\n    );\n\n    return (\n        <GenericModal\n            compassDesign={true}\n            onExited={onHide}\n            enforceFocus={false}\n            id='restorePostModal'\n            aria-labelledby='restorePostModalLabel'\n            modalHeaderText={modalHeaderText}\n            handleCancel={onHide}\n            cancelButtonClassName='cancel-button'\n            handleConfirm={handleRestore}\n        >\n            <div className='edit-post-history__restore__modal__content'>\n                {postHeader}\n                <PostMessageView\n                    post={post}\n                    overflowType='ellipsis'\n                    maxHeight={100}\n                    showPostEditedIndicator={false}\n                />\n                <FileAttachmentListContainer\n                    post={post}\n                    isEditHistory={true}\n                    disableDownload={true}\n                    disableActions={true}\n                />\n            </div>\n        </GenericModal>\n    );\n};\n\nexport default memo(RestorePostModal);\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, useCallback, useState} from 'react';\nimport {defineMessages, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {CheckIcon} from '@mattermost/compass-icons/components';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getPostEditHistory, restorePostVersion} from 'mattermost-redux/actions/posts';\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport {removeDraft} from 'actions/views/drafts';\nimport {getConnectionId} from 'selectors/general';\n\nimport CompassThemeProvider from 'components/compass_theme_provider/compass_theme_provider';\nimport FileAttachmentListContainer from 'components/file_attachment_list';\nimport InfoToast from 'components/info_toast/info_toast';\nimport PostAriaLabelDiv from 'components/post_view/post_aria_label_div';\nimport PostMessageContainer from 'components/post_view/post_message_view';\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport UserProfileComponent from 'components/user_profile';\nimport Avatar from 'components/widgets/users/avatar';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers, StoragePrefixes} from 'utils/constants';\nimport {imageURLForUser} from 'utils/utils';\n\nimport RestorePostModal from '../restore_post_modal';\n\nimport './edited_post_items.scss';\n\nimport type {PropsFromRedux} from './index';\n\nconst DATE_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.YESTERDAY_TITLE_CASE,\n];\n\nconst itemMessages = defineMessages({\n    helpText: {\n        id: 'post_info.edit.restore',\n        defaultMessage: 'Restore this version',\n    },\n    currentVersionText: {\n        id: 'post_info.edit.current_version',\n        defaultMessage: 'Current Version',\n    },\n    ariaLabelMessage: {\n        id: 'post_info.edit.aria_label',\n        defaultMessage: 'Select to restore an old message.',\n    },\n});\n\nexport type Props = PropsFromRedux & {\n    post: Post;\n    isCurrent?: boolean;\n    theme: Theme;\n}\n\nconst EditedPostItem = ({post, isCurrent = false, postCurrentVersion, theme, actions}: Props) => {\n    const {formatMessage} = useIntl();\n    const [open, setOpen] = useState(isCurrent);\n\n    const dispatch = useDispatch();\n\n    const connectionId = useSelector(getConnectionId);\n\n    const openRestorePostModal = useCallback((e) => {\n        // this prevents history item from\n        // collapsing and closing when clicking on restore button\n        e.stopPropagation();\n\n        const restorePostModalData = {\n            modalId: ModalIdentifiers.RESTORE_POST_MODAL,\n            dialogType: RestorePostModal,\n            dialogProps: {\n                post,\n                postHeader,\n                actions: {\n                    handleRestore,\n                },\n            },\n        };\n\n        actions.openModal(restorePostModalData);\n    }, [actions, post]);\n\n    const togglePost = () => {\n        setOpen((prevState) => !prevState);\n    };\n\n    if (!post) {\n        return null;\n    }\n\n    const showInfoTooltip = () => {\n        const infoToastModalData = {\n            modalId: ModalIdentifiers.INFO_TOAST,\n            dialogType: InfoToast,\n            dialogProps: {\n                content: {\n                    icon: <CheckIcon size={18}/>,\n                    message: 'Restored Message',\n                    undo: handleUndo,\n                },\n            },\n        };\n\n        actions.openModal(infoToastModalData);\n    };\n\n    const handleRestore = async () => {\n        if (!postCurrentVersion || !post) {\n            actions.closeRightHandSide();\n            return;\n        }\n\n        const result = await dispatch(restorePostVersion(post.original_id, post.id, connectionId));\n        if (result.data) {\n            actions.closeRightHandSide();\n            showInfoTooltip();\n        }\n\n        const key = StoragePrefixes.EDIT_DRAFT + post.original_id;\n        dispatch(removeDraft(key, post.channel_id, post.root_id));\n    };\n\n    const handleUndo = async () => {\n        if (!postCurrentVersion) {\n            actions.closeRightHandSide();\n            return;\n        }\n\n        // To undo a recent restore, you need to restore the previous version of the post right before this restore.\n        // That would be the first history item in post's edit history as it is the most recent edit\n        // and edit history is sorted from most recent first to oldest.\n        const result = await dispatch(getPostEditHistory(post.original_id));\n        if (!result.data || result.data.length === 0) {\n            return;\n        }\n\n        const previousPostVersion = result.data[0];\n        await dispatch(restorePostVersion(previousPostVersion.original_id, previousPostVersion.id, connectionId));\n    };\n\n    const currentVersionIndicator = isCurrent ? (\n        <div className='edit-post-history__current__indicator'>\n            {formatMessage(itemMessages.currentVersionText)}\n        </div>\n    ) : null;\n\n    const profileSrc = imageURLForUser(post.user_id);\n\n    const overwriteName = ensureString(post.props?.override_username);\n    const postHeader = (\n        <div className='edit-post-history__header'>\n            <span className='profile-icon'>\n                <Avatar\n                    size={'sm'}\n                    url={profileSrc}\n                    className={'avatar-post-preview'}\n                />\n            </span>\n            <div className={'edit-post-history__header__username'}>\n                <UserProfileComponent\n                    userId={post.user_id}\n                    disablePopover={true}\n                    overwriteName={overwriteName}\n                />\n            </div>\n        </div>\n    );\n\n    const message = (\n        <PostMessageContainer\n            post={post}\n            isRHS={true}\n            showPostEditedIndicator={false}\n        />\n    );\n\n    const isFileDeleted = post.delete_at > 0;\n\n    const messageContainer = (\n        <div className='edit-post-history__content_container'>\n            {postHeader}\n            <div className='post__content'>\n                <div className='search-item-snippet post__body'>\n                    {message}\n                </div>\n            </div>\n            <FileAttachmentListContainer\n                post={post}\n                isEditHistory={isFileDeleted}\n                disableDownload={isFileDeleted}\n                disableActions={isFileDeleted}\n            />\n        </div>\n    );\n\n    const restoreButton = isCurrent ? null : (\n        <WithTooltip\n            title={formatMessage(itemMessages.helpText)}\n        >\n            <button\n                className='edit-post-history__icon__button restore-icon'\n                onClick={openRestorePostModal}\n                aria-label={formatMessage(itemMessages.ariaLabelMessage)}\n            >\n                <i className={'icon icon-restore'}/>\n            </button>\n        </WithTooltip>\n    );\n\n    const postContainerClass = classNames('edit-post-history__container', {'edit-post-history__container__background': open});\n    const timeStampValue = post.edit_at === 0 ? post.create_at : post.edit_at;\n\n    return (\n        <CompassThemeProvider theme={theme}>\n            <div\n                className={postContainerClass}\n                onClick={togglePost}\n            >\n                <PostAriaLabelDiv\n                    className={'a11y__section post'}\n                    id={'searchResult_' + post.id}\n                    post={post}\n                >\n                    <div\n                        className='edit-post-history__title__container'\n                    >\n                        <div className='edit-post-history__date__badge__container'>\n                            <button\n                                aria-label='Toggle to see an old message.'\n                                className='edit-post-history__icon__button toggleCollapseButton'\n                            >\n                                <i className={`icon ${open ? 'icon-chevron-down' : 'icon-chevron-right'}`}/>\n                            </button>\n                            <span className='edit-post-history__date'>\n                                <Timestamp\n                                    value={timeStampValue}\n                                    ranges={DATE_RANGES}\n                                />\n                            </span>\n                            {currentVersionIndicator}\n                        </div>\n                        {restoreButton}\n                    </div>\n                    {open && messageContainer}\n                </PostAriaLabelDiv>\n            </div>\n        </CompassThemeProvider>\n    );\n};\n\nexport default memo(EditedPostItem);\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 {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport {openModal} from 'actions/views/modals';\nimport {editPost} from 'actions/views/posts';\nimport {closeRightHandSide} from 'actions/views/rhs';\nimport {getSelectedPostId} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport EditedPostItem from './edited_post_item';\n\nfunction mapStateToProps(state: GlobalState) {\n    const selectedPostId = getSelectedPostId(state) || '';\n    const theme = getTheme(state);\n\n    return {\n        theme,\n        postCurrentVersion: getPost(state, selectedPostId),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            editPost,\n            closeRightHandSide,\n            openModal,\n        }, dispatch),\n    };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(EditedPostItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useEffect, useRef, useState} from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getPostEditHistory} from 'mattermost-redux/actions/posts';\n\nimport AlertIcon from 'components/common/svg_images_components/alert_svg';\nimport LoadingScreen from 'components/loading_screen';\nimport SearchResultsHeader from 'components/search_results_header';\n\nimport EditedPostItem from './edited_post_item';\n\nimport type {PropsFromRedux} from './index';\nimport './post_edit_history.scss';\n\nconst renderView = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--view'\n    />\n);\n\nconst renderThumbHorizontal = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--horizontal'\n    />\n);\n\nconst renderThumbVertical = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--vertical'\n    />\n);\n\nconst PostEditHistory = ({\n    channelDisplayName,\n    originalPost,\n}: PropsFromRedux) => {\n    const [postEditHistory, setPostEditHistory] = useState<Post[]>([]);\n    const [hasError, setHasError] = useState<boolean>(false);\n    const [isLoading, setIsLoading] = useState<boolean>(false);\n    const dispatch = useDispatch();\n    const scrollbars = useRef<Scrollbars | null>(null);\n    const {formatMessage} = useIntl();\n    const retrieveErrorHeading = formatMessage({\n        id: 'post_info.edit.history.retrieveError',\n        defaultMessage: 'Unable to load edit history',\n    });\n    const retrieveErrorSubheading = formatMessage({\n        id: 'post_info.edit.history.retrieveErrorVerbose',\n        defaultMessage: 'There was an error loading the history for this message. Check your network connection or try again later.',\n    });\n\n    useEffect(() => {\n        const fetchPostEditHistory = async () => {\n            setIsLoading(true);\n            const result = await dispatch(getPostEditHistory(originalPost.id));\n            if (result.data) {\n                setPostEditHistory(result.data);\n                setHasError(false);\n            } else {\n                setHasError(true);\n                setPostEditHistory([]);\n            }\n            setIsLoading(false);\n        };\n        fetchPostEditHistory();\n        scrollbars.current?.scrollToTop();\n    }, [originalPost, dispatch]);\n\n    useEffect(() => {\n        setPostEditHistory([]);\n        setHasError(false);\n    }, [originalPost.id]);\n\n    const title = formatMessage({\n        id: 'search_header.title_edit.history',\n        defaultMessage: 'Edit History',\n    });\n\n    const errorContainer: JSX.Element = (\n        <div className='edit-post-history__error_container'>\n            <div className='edit-post-history__error_item'>\n                <AlertIcon\n                    width={127}\n                    height={127}\n                />\n                <p className='edit-post-history__error_heading'>\n                    {retrieveErrorHeading}\n                </p>\n                <p className='edit-post-history__error_subheading'>\n                    {retrieveErrorSubheading}\n                </p>\n            </div>\n        </div>\n    );\n\n    if (isLoading && postEditHistory.length === 0) {\n        return (\n            <div\n                id='rhsContainer'\n                className='sidebar-right__body sidebar-right__edit-post-history'\n            >\n                <LoadingScreen\n                    style={{\n                        display: 'grid',\n                        placeContent: 'center',\n                        flex: '1',\n                    }}\n                />\n            </div>\n        );\n    }\n\n    const currentItem = (\n        <EditedPostItem\n            post={originalPost}\n            key={originalPost.id}\n            isCurrent={true}\n        />\n    );\n\n    const postEditItems = [currentItem, ...postEditHistory.map((postEdited) => (\n        <EditedPostItem\n            key={postEdited.id}\n            post={postEdited}\n        />\n    ))];\n\n    return (\n        <div\n            id='rhsContainer'\n            className='sidebar-right__body sidebar-right__edit-post-history'\n        >\n            <Scrollbars\n                ref={scrollbars}\n                autoHide={true}\n                autoHideTimeout={500}\n                autoHideDuration={500}\n                renderThumbHorizontal={renderThumbHorizontal}\n                renderThumbVertical={renderThumbVertical}\n                renderView={renderView}\n            >\n                <SearchResultsHeader>\n                    {title}\n                    <div className='sidebar--right__title__channel'>{channelDisplayName}</div>\n                </SearchResultsHeader>\n                {hasError ? errorContainer : postEditItems}\n            </Scrollbars>\n        </div>\n    );\n};\n\nexport default memo(PostEditHistory);\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 {getChannel, getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\n\nimport {getSelectedPostId} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport PostEditHistory from './post_edit_history';\n\nfunction mapStateToProps(state: GlobalState) {\n    const selectedPostId = getSelectedPostId(state) || '';\n    const originalPost = getPost(state, selectedPostId);\n    const channel = getCurrentChannel(state) ?? getChannel(state, originalPost.channel_id);\n    const channelDisplayName = channel?.display_name || '';\n\n    return {\n        channelDisplayName,\n        originalPost,\n    };\n}\n\nconst connector = connect(mapStateToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(PostEditHistory);\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, {useEffect, useRef, useState} from 'react';\nimport {useSelector} from 'react-redux';\n\nimport {getIsRhsExpanded, getRhsSize} from 'selectors/rhs';\n\nimport {CssVarKeyForResizable, RHS_MIN_MAX_WIDTH, ResizeDirection} from '../constants';\nimport ResizableDivider from '../resizable_divider';\nimport {shouldRhsOverlapChannelView} from '../utils';\n\ninterface Props extends HTMLAttributes<'div'> {\n    children: React.ReactNode;\n    rightWidthHolderRef: React.RefObject<HTMLDivElement>;\n}\n\nfunction ResizableRhs({\n    role,\n    children,\n    id,\n    className,\n    rightWidthHolderRef,\n}: Props) {\n    const containerRef = useRef<HTMLDivElement>(null);\n\n    const rhsSize = useSelector(getRhsSize);\n    const isRhsExpanded = useSelector(getIsRhsExpanded);\n\n    const [previousRhsExpanded, setPreviousRhsExpanded] = useState(false);\n\n    const defaultWidth = RHS_MIN_MAX_WIDTH[rhsSize].default;\n\n    const shouldRhsOverlap = shouldRhsOverlapChannelView(rhsSize);\n\n    const handleResize = (_: number, cssVarProp: string, cssVarValue: string) => {\n        const rightWidthHolderRefElement = rightWidthHolderRef.current;\n\n        if (!rightWidthHolderRefElement) {\n            return;\n        }\n\n        if (!shouldRhsOverlap) {\n            rightWidthHolderRefElement.style.setProperty(cssVarProp, cssVarValue);\n        }\n    };\n\n    const handleResizeEnd = (_: number, cssVarProp: string) => {\n        const rightWidthHolderRefElement = rightWidthHolderRef.current;\n\n        if (!rightWidthHolderRefElement) {\n            return;\n        }\n\n        rightWidthHolderRefElement.style.removeProperty(cssVarProp);\n    };\n\n    const handleDividerDoubleClick = (_: number, cssVarProp: string) => {\n        handleResizeEnd(_, cssVarProp);\n\n        document.body.classList.add('layout-changing');\n\n        setTimeout(() => {\n            document.body.classList.remove('layout-changing');\n        }, 1000);\n    };\n\n    // If max-width is applied immediately when expanded is collapsed, the transition will not work correctly.\n    useEffect(() => {\n        const containerRefElement = containerRef.current;\n\n        if (!containerRefElement) {\n            return;\n        }\n\n        setPreviousRhsExpanded(isRhsExpanded);\n\n        if (previousRhsExpanded && !isRhsExpanded) {\n            containerRefElement.classList.add('resize-disabled');\n\n            setTimeout(() => {\n                containerRefElement.classList.remove('resize-disabled');\n            }, 1000);\n        }\n    }, [isRhsExpanded]);\n\n    return (\n        <div\n            id={id}\n            className={className}\n            role={role}\n            ref={containerRef}\n        >\n            {children}\n            <ResizableDivider\n                name='rhsResizeHandle'\n                globalCssVar={CssVarKeyForResizable.RHS}\n                defaultWidth={defaultWidth}\n                dir={ResizeDirection.RIGHT}\n                disabled={isRhsExpanded}\n                containerRef={containerRef}\n                onResize={handleResize}\n                onResizeEnd={handleResizeEnd}\n                onDividerDoubleClick={handleDividerDoubleClick}\n            />\n        </div>\n    );\n}\n\nexport default ResizableRhs;\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, type IntlShape} from 'react-intl';\n\nimport KeyboardShortcutSequence, {\n    KEYBOARD_SHORTCUTS,\n} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {RhsState} from 'types/store/rhs';\n\ntype Props = {\n    intl: IntlShape;\n    previousRhsState?: RhsState;\n    isExpanded: boolean;\n    actions: {\n        showMentions: () => void;\n        showSearchResults: () => void;\n        showFlaggedPosts: () => void;\n        showPinnedPosts: () => void;\n        closeRightHandSide: () => void;\n        toggleRhsExpanded: () => void;\n    };\n};\n\nclass RhsCardHeader extends React.PureComponent<Props> {\n    handleBack = (e: React.MouseEvent<HTMLButtonElement>): void => {\n        e.preventDefault();\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.CHANNEL_FILES:\n            this.props.actions.showSearchResults();\n            break;\n        case RHSStates.SEARCH:\n            this.props.actions.showSearchResults();\n            break;\n        case RHSStates.MENTION:\n            this.props.actions.showMentions();\n            break;\n        case RHSStates.FLAG:\n            this.props.actions.showFlaggedPosts();\n            break;\n        case RHSStates.PIN:\n            this.props.actions.showPinnedPosts();\n            break;\n        default:\n            break;\n        }\n    };\n\n    render(): React.ReactNode {\n        let back;\n        let title;\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.SEARCH:\n        case RHSStates.MENTION:\n            title = (\n                <FormattedMessage\n                    id='rhs_header.backToResultsTooltip'\n                    defaultMessage='Back to search results'\n                />\n            );\n            break;\n        case RHSStates.FLAG:\n            title = (\n                <FormattedMessage\n                    id='rhs_header.backToFlaggedTooltip'\n                    defaultMessage='Back to saved messages'\n                />\n            );\n            break;\n        case RHSStates.PIN:\n            title = (\n                <FormattedMessage\n                    id='rhs_header.backToPinnedTooltip'\n                    defaultMessage='Back to pinned messages'\n                />\n            );\n            break;\n        }\n\n        const expandSidebarTooltip = (\n            <>\n                <FormattedMessage\n                    id='rhs_header.expandSidebarTooltip'\n                    defaultMessage='Expand the right sidebar'\n                />\n                <KeyboardShortcutSequence\n                    shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}\n                    hideDescription={true}\n                    isInsideTooltip={true}\n                />\n            </>\n        );\n\n        const shrinkSidebarTooltip = (\n            <>\n                <FormattedMessage\n                    id='rhs_header.collapseSidebarTooltip'\n                    defaultMessage='Collapse the right sidebar'\n                />\n                <KeyboardShortcutSequence\n                    shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}\n                    hideDescription={true}\n                    isInsideTooltip={true}\n                />\n            </>\n        );\n\n        if (title) {\n            back = (\n                <WithTooltip\n                    title={title}\n                >\n                    <button\n                        className='sidebar--right__back btn btn-icon btn-sm'\n                        onClick={this.handleBack}\n                        aria-label={this.props.intl.formatMessage({id: 'rhs_header.back.icon', defaultMessage: 'Back Icon'})}\n                    >\n                        <i\n                            className='icon icon-arrow-back-ios'\n                        />\n                    </button>\n                </WithTooltip>\n            );\n        }\n\n        return (\n            <div className='sidebar--right__header'>\n                <span className='sidebar--right__title'>\n                    {back}\n                    <FormattedMessage\n                        id='search_header.title5'\n                        defaultMessage='Extra information'\n                    />\n                </span>\n                <div className='pull-right'>\n                    <WithTooltip\n                        title={this.props.isExpanded ? shrinkSidebarTooltip : expandSidebarTooltip}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__expand btn btn-icon btn-sm'\n                            aria-label='Expand'\n                            onClick={this.props.actions.toggleRhsExpanded}\n                        >\n                            <i\n                                className='icon icon-arrow-expand'\n                                aria-label={this.props.intl.formatMessage({id: 'rhs_header.expandSidebarTooltip.icon', defaultMessage: 'Expand Sidebar Icon'})}\n                            />\n                            <i\n                                className='icon icon-arrow-collapse'\n                                aria-label={this.props.intl.formatMessage({id: 'rhs_header.collapseSidebarTooltip.icon', defaultMessage: 'Collapse Sidebar Icon'})}\n                            />\n                        </button>\n                    </WithTooltip>\n                    <WithTooltip\n                        title={\n                            <FormattedMessage\n                                id='rhs_header.closeSidebarTooltip'\n                                defaultMessage='Close'\n                            />\n                        }\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__close btn btn-icon btn-sm'\n                            aria-label='Close'\n                            onClick={this.props.actions.closeRightHandSide}\n                        >\n                            <i\n                                className='icon icon-close'\n                                aria-label={this.props.intl.formatMessage({id: 'rhs_header.closeTooltip.icon', defaultMessage: 'Close Sidebar Icon'})}\n                            />\n                        </button>\n                    </WithTooltip>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(RhsCardHeader);\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 {AnyAction, Dispatch} from 'redux';\n\nimport {\n    showMentions,\n    showSearchResults,\n    showFlaggedPosts,\n    showPinnedPosts,\n    closeRightHandSide,\n    toggleRhsExpanded,\n} from 'actions/views/rhs';\nimport {getIsRhsExpanded} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport RhsCardHeader from './rhs_card_header';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        isExpanded: getIsRhsExpanded(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            showMentions,\n            showSearchResults,\n            showFlaggedPosts,\n            showPinnedPosts,\n            closeRightHandSide,\n            toggleRhsExpanded,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(RhsCardHeader);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport deepEqual from 'fast-deep-equal';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport {ensureString} from 'mattermost-redux/utils/post_utils';\n\nimport {emitCloseRightHandSide} from 'actions/global_actions';\n\nimport Markdown from 'components/markdown';\nimport PostProfilePicture from 'components/post_profile_picture';\nimport RhsCardHeader from 'components/rhs_card_header';\nimport UserProfile from 'components/user_profile';\n\nimport Constants from 'utils/constants';\nimport DelayedAction from 'utils/delayed_action';\n\nimport type {PostPluginComponent} from 'types/store/plugins';\nimport type {RhsState} from 'types/store/rhs';\n\ntype Props = {\n    isMobileView: boolean;\n    selected?: Post;\n    pluginPostCardTypes?: Record<string, PostPluginComponent>;\n    previousRhsState?: RhsState;\n    enablePostUsernameOverride?: boolean;\n    teamUrl?: string;\n};\n\ntype State = {\n    isScrolling: boolean;\n};\n\nexport function renderView(props: Props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--view'\n        />\n    );\n}\n\nexport function renderThumbHorizontal(props: Props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--horizontal'\n        />\n    );\n}\n\nexport function renderThumbVertical(props: Props) {\n    return (\n        <div\n            {...props}\n            className='scrollbar--vertical'\n        />\n    );\n}\n\nexport default class RhsCard extends React.Component<Props, State> {\n    scrollStopAction: DelayedAction;\n\n    static defaultProps = {\n        pluginPostCardTypes: {},\n    };\n\n    constructor(props: Props) {\n        super(props);\n\n        this.scrollStopAction = new DelayedAction(this.handleScrollStop);\n\n        this.state = {\n            isScrolling: false,\n        };\n    }\n\n    shouldComponentUpdate(nextProps: Props, nextState: State) {\n        if (!deepEqual(nextProps.selected?.props?.card, this.props.selected?.props?.card)) {\n            return true;\n        }\n        if (nextState.isScrolling !== this.state.isScrolling) {\n            return true;\n        }\n        return false;\n    }\n\n    handleScroll = () => {\n        if (!this.state.isScrolling) {\n            this.setState({\n                isScrolling: true,\n            });\n        }\n\n        this.scrollStopAction.fireAfter(Constants.SCROLL_DELAY);\n    };\n\n    handleScrollStop = () => {\n        this.setState({\n            isScrolling: false,\n        });\n    };\n\n    handleClick = () => {\n        if (this.props.isMobileView) {\n            emitCloseRightHandSide();\n        }\n    };\n\n    render() {\n        if (this.props.selected == null) {\n            return (<div/>);\n        }\n\n        const {selected, pluginPostCardTypes, teamUrl} = this.props;\n        const postType = selected.type;\n        let content: ReactNode = null;\n        if (pluginPostCardTypes && Object.hasOwn(pluginPostCardTypes, postType)) {\n            const PluginComponent = pluginPostCardTypes[postType].component;\n            content = <PluginComponent post={selected}/>;\n        }\n\n        if (!content) {\n            const message = ensureString(selected.props?.card);\n            content = (\n                <div className='info-card'>\n                    <Markdown message={message}/>\n                </div>\n            );\n        }\n\n        let user = (\n            <UserProfile\n                userId={selected.user_id}\n                hideStatus={true}\n                disablePopover={true}\n            />\n        );\n        const overrideUsername = ensureString(selected.props.override_username);\n        if (overrideUsername && this.props.enablePostUsernameOverride) {\n            user = (\n                <UserProfile\n                    userId={selected.user_id}\n                    hideStatus={true}\n                    disablePopover={true}\n                    overwriteName={overrideUsername}\n                />\n            );\n        }\n        const avatar = (\n            <PostProfilePicture\n                compactDisplay={false}\n                post={selected}\n                userId={selected.user_id}\n            />\n        );\n\n        return (\n            <div className='sidebar-right__body sidebar-right__card'>\n                <RhsCardHeader previousRhsState={this.props.previousRhsState}/>\n                <Scrollbars\n                    autoHide={true}\n                    autoHideTimeout={500}\n                    autoHideDuration={500}\n                    renderThumbHorizontal={renderThumbHorizontal}\n                    renderThumbVertical={renderThumbVertical}\n                    renderView={renderView}\n                    onScroll={this.handleScroll}\n                >\n                    <div className='post-right__scroll'>\n                        {content}\n                        <div className='d-flex post-card--info'>\n                            <div className='post-card--post-by overflow--ellipsis'>\n                                <FormattedMessage\n                                    id='rhs_card.message_by'\n                                    defaultMessage='Message by {avatar} {user}'\n                                    values={{user, avatar}}\n                                />\n                            </div>\n                            <div className='post-card--view-post'>\n                                <Link\n                                    to={`${teamUrl}/pl/${selected.id}`}\n                                    className='post__permalink'\n                                    onClick={this.handleClick}\n                                >\n                                    <FormattedMessage\n                                        id='rhs_card.jump'\n                                        defaultMessage='Jump'\n                                    />\n                                </Link>\n                            </div>\n                        </div>\n                    </div>\n                </Scrollbars>\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';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getSelectedPostCard} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport RhsCard from './rhs_card';\n\nfunction mapStateToProps(state: GlobalState) {\n    const selected = getSelectedPostCard(state);\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n\n    return {\n        enablePostUsernameOverride,\n        isMobileView: getIsMobileView(state),\n        selected,\n        pluginPostCardTypes: state.plugins.postCardTypes,\n        teamUrl: getCurrentRelativeTeamUrl(state),\n    };\n}\n\nexport default connect(mapStateToProps)(RhsCard);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {TourTip, useFollowElementDimensions, useMeasurePunchouts} from '@mattermost/components';\n\nimport {savePreferences} from 'mattermost-redux/actions/preferences';\nimport {getCurrentUserId} from 'mattermost-redux/selectors/entities/common';\n\nimport {Constants, Preferences} from 'utils/constants';\n\nconst translate = {x: 2, y: 25};\n\nconst CRTThreadsPaneTutorialTip = () => {\n    const dispatch = useDispatch();\n    const {formatMessage} = useIntl();\n    const currentUserId = useSelector(getCurrentUserId);\n\n    const dimensions = useFollowElementDimensions('sidebar-right');\n\n    const title = (\n        <FormattedMessage\n            id='tutorial_threads.threads_pane.title'\n            defaultMessage={'Viewing a thread in the sidebar'}\n        />\n    );\n\n    const screen = (\n        <p>\n            {formatMessage<ReactNode>(\n                {\n                    id: 'tutorial_threads.threads_pane.description',\n                    defaultMessage: 'Click the <b>Follow</b> button to be notified about replies and see it in your <b>Threads</b> view. Within a thread, the <b>New Messages</b> line shows you where you left off.',\n                },\n                {\n                    b: (value: string) => <b>{value}</b>,\n                },\n            )}\n        </p>\n    );\n\n    const nextBtn = (): JSX.Element => {\n        return (\n            <FormattedMessage\n                id={'tutorial_tip.got_it'}\n                defaultMessage={'Got it'}\n            />\n        );\n    };\n\n    const onDismiss = (e: React.MouseEvent) => {\n        e.preventDefault();\n        const preferences = [\n            {\n                user_id: currentUserId,\n                category: Preferences.CRT_THREAD_PANE_STEP,\n                name: currentUserId,\n                value: Constants.CrtThreadPaneSteps.FINISHED.toString(),\n            },\n        ];\n        dispatch(savePreferences(currentUserId, preferences));\n    };\n\n    const overlayPunchOut = useMeasurePunchouts(['rhsContainer'], [dimensions?.width]);\n\n    return (\n        <TourTip\n            show={true}\n            screen={screen}\n            title={title}\n            overlayPunchOut={overlayPunchOut}\n            placement='left'\n            pulsatingDotPlacement='top-start'\n            pulsatingDotTranslate={translate}\n            step={1}\n            singleTip={true}\n            showOptOut={false}\n            handleDismiss={onDismiss}\n            handleNext={onDismiss}\n            interactivePunchOut={true}\n            nextBtn={nextBtn()}\n        />\n    );\n};\n\nexport default CRTThreadsPaneTutorialTip;\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, type WrappedComponentProps} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport KeyboardShortcutSequence, {\n    KEYBOARD_SHORTCUTS,\n} from 'components/keyboard_shortcuts/keyboard_shortcuts_sequence';\nimport FollowButton from 'components/threading/common/follow_button';\nimport CRTThreadsPaneTutorialTip\n    from 'components/tours/crt_tour/crt_threads_pane_tutorial_tip';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {getHistory} from 'utils/browser_history';\nimport {RHSStates} from 'utils/constants';\n\nimport type {RhsState} from 'types/store/rhs';\n\ntype Props = WrappedComponentProps & {\n    isExpanded: boolean;\n    isMobileView: boolean;\n    rootPostId: string;\n    previousRhsState?: RhsState;\n    relativeTeamUrl: string;\n    channel: Channel;\n    isCollapsedThreadsEnabled: boolean;\n    isFollowingThread?: boolean;\n    currentTeamId: string;\n    showThreadsTutorialTip: boolean;\n    currentUserId: string;\n    setRhsExpanded: (b: boolean) => void;\n    showMentions: () => void;\n    showSearchResults: () => void;\n    showFlaggedPosts: () => void;\n    showPinnedPosts: () => void;\n    goBack: () => void;\n    closeRightHandSide: (e?: React.MouseEvent) => void;\n    toggleRhsExpanded: (e: React.MouseEvent) => void;\n    setThreadFollow: (userId: string, teamId: string, threadId: string, newState: boolean) => void;\n};\n\nclass RhsHeaderPost extends React.PureComponent<Props> {\n    handleBack = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.SEARCH:\n        case RHSStates.MENTION:\n        case RHSStates.FLAG:\n        case RHSStates.PIN:\n            this.props.goBack();\n            break;\n        default:\n            break;\n        }\n    };\n\n    handleJumpClick = () => {\n        if (this.props.isMobileView) {\n            this.props.closeRightHandSide();\n        }\n\n        this.props.setRhsExpanded(false);\n        const teamUrl = this.props.relativeTeamUrl;\n        getHistory().push(`${teamUrl}/pl/${this.props.rootPostId}`);\n    };\n\n    handleFollowChange = () => {\n        const {currentTeamId, currentUserId, rootPostId, isFollowingThread} = this.props;\n        this.props.setThreadFollow(currentUserId, currentTeamId, rootPostId, !isFollowingThread);\n    };\n\n    render() {\n        let back;\n        const {isFollowingThread} = this.props;\n        const {formatMessage} = this.props.intl;\n        const closeSidebarTooltip = (\n            <FormattedMessage\n                id='rhs_header.closeSidebarTooltip'\n                defaultMessage='Close'\n            />\n        );\n\n        let backToResultsTooltip;\n\n        switch (this.props.previousRhsState) {\n        case RHSStates.SEARCH:\n        case RHSStates.MENTION:\n            backToResultsTooltip = (\n                <FormattedMessage\n                    id='rhs_header.backToResultsTooltip'\n                    defaultMessage='Back to search results'\n                />\n            );\n            break;\n        case RHSStates.FLAG:\n            backToResultsTooltip = (\n                <FormattedMessage\n                    id='rhs_header.backToFlaggedTooltip'\n                    defaultMessage='Back to saved messages'\n                />\n            );\n            break;\n        case RHSStates.PIN:\n            backToResultsTooltip = (\n                <FormattedMessage\n                    id='rhs_header.backToPinnedTooltip'\n                    defaultMessage='Back to pinned messages'\n                />\n            );\n            break;\n        }\n\n        //rhsHeaderTooltipContent contains tooltips content for expand or shrink sidebarTooltip.\n        // if props.isExpanded is true, defaultMessage would feed from 'shrinkTooltip', else 'expandTooltip'\n        const rhsHeaderTooltipContent = this.props.isExpanded ? (\n            <>\n                <FormattedMessage\n                    id='rhs_header.collapseSidebarTooltip'\n                    defaultMessage='Collapse the right sidebar'\n                />\n                <KeyboardShortcutSequence\n                    shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}\n                    hideDescription={true}\n                    isInsideTooltip={true}\n                />\n            </>\n        ) : (\n            <>\n                <FormattedMessage\n                    id='rhs_header.expandSidebarTooltip'\n                    defaultMessage='Expand the right sidebar'\n                />\n                <KeyboardShortcutSequence\n                    shortcut={KEYBOARD_SHORTCUTS.navExpandSidebar}\n                    hideDescription={true}\n                    isInsideTooltip={true}\n                />\n            </>\n        );\n\n        const channelName = this.props.channel.display_name;\n\n        if (backToResultsTooltip) {\n            back = (\n                <WithTooltip\n                    title={backToResultsTooltip}\n                >\n                    <button\n                        className='sidebar--right__back btn btn-icon btn-sm'\n                        onClick={this.handleBack}\n                        aria-label={formatMessage({id: 'rhs_header.back.icon', defaultMessage: 'Back Icon'})}\n                    >\n                        <i\n                            className='icon icon-arrow-back-ios'\n                        />\n                    </button>\n                </WithTooltip>\n            );\n        }\n\n        return (\n            <div className='sidebar--right__header'>\n                <span className='sidebar--right__title'>\n                    {back}\n                    <FormattedMessage\n                        id='rhs_header.details'\n                        defaultMessage='Thread'\n                    />\n                    {channelName &&\n                        <button\n                            onClick={this.handleJumpClick}\n                            className='style--none sidebar--right__title__channel'\n                        >\n                            {channelName}\n                        </button>\n                    }\n                </span>\n                <div className='controls'>\n                    {this.props.isCollapsedThreadsEnabled ? (\n                        <FollowButton\n                            className='sidebar--right__follow__thread'\n                            isFollowing={isFollowingThread}\n                            onClick={this.handleFollowChange}\n                        />\n                    ) : null}\n\n                    <WithTooltip\n                        title={rhsHeaderTooltipContent}\n                    >\n                        <button\n                            type='button'\n                            className='sidebar--right__expand btn btn-icon btn-sm'\n                            aria-label='Expand'\n                            onClick={this.props.toggleRhsExpanded}\n                        >\n                            <i\n                                className='icon icon-arrow-expand'\n                                aria-label={formatMessage({id: 'rhs_header.expandSidebarTooltip.icon', defaultMessage: 'Expand Sidebar Icon'})}\n                            />\n                            <i\n                                className='icon icon-arrow-collapse'\n                                aria-label={formatMessage({id: 'rhs_header.collapseSidebarTooltip.icon', defaultMessage: 'Collapse Sidebar Icon'})}\n                            />\n                        </button>\n                    </WithTooltip>\n\n                    <WithTooltip\n                        title={closeSidebarTooltip}\n                    >\n                        <button\n                            id='rhsCloseButton'\n                            type='button'\n                            className='sidebar--right__close btn btn-icon btn-sm'\n                            aria-label='Close'\n                            onClick={this.props.closeRightHandSide}\n                        >\n                            <i\n                                className='icon icon-close'\n                                aria-label={formatMessage({id: 'rhs_header.closeTooltip.icon', defaultMessage: 'Close Sidebar Icon'})}\n                            />\n                        </button>\n                    </WithTooltip>\n                </div>\n                {this.props.showThreadsTutorialTip && <CRTThreadsPaneTutorialTip/>}\n            </div>\n        );\n    }\n}\n\nexport default injectIntl(RhsHeaderPost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport {connect} from 'react-redux';\n\nimport {setThreadFollow} from 'mattermost-redux/actions/threads';\nimport {getPost} from 'mattermost-redux/selectors/entities/posts';\nimport {getInt, isCollapsedThreadsEnabled, onboardingTourTipsEnabled} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeamId, getCurrentRelativeTeamUrl} from 'mattermost-redux/selectors/entities/teams';\nimport {makeGetThreadOrSynthetic} from 'mattermost-redux/selectors/entities/threads';\nimport {getCurrentUserId, getCurrentUserMentionKeys} from 'mattermost-redux/selectors/entities/users';\n\nimport {\n    setRhsExpanded,\n    showMentions,\n    showSearchResults,\n    showFlaggedPosts,\n    showPinnedPosts,\n    showChannelFiles,\n    closeRightHandSide,\n    toggleRhsExpanded,\n    goBack,\n} from 'actions/views/rhs';\nimport {getIsRhsExpanded} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {CrtThreadPaneSteps, Preferences} from 'utils/constants';\nimport {matchUserMentionTriggersWithMessageMentions} from 'utils/post_utils';\nimport {allAtMentions} from 'utils/text_formatting';\n\nimport type {GlobalState} from 'types/store';\n\nimport RhsHeaderPost from './rhs_header_post';\n\ntype OwnProps = Pick<ComponentProps<typeof RhsHeaderPost>, 'rootPostId'>\n\nfunction makeMapStateToProps() {\n    const getThreadOrSynthetic = makeGetThreadOrSynthetic();\n\n    return function mapStateToProps(state: GlobalState, {rootPostId}: OwnProps) {\n        let isFollowingThread = false;\n\n        const collapsedThreads = isCollapsedThreadsEnabled(state);\n        const root = getPost(state, rootPostId);\n        const currentUserId = getCurrentUserId(state);\n        const tipStep = getInt(state, Preferences.CRT_THREAD_PANE_STEP, currentUserId);\n\n        if (root && collapsedThreads) {\n            const thread = getThreadOrSynthetic(state, root);\n            isFollowingThread = thread.is_following;\n\n            if (isFollowingThread === null && thread.reply_count === 0) {\n                const currentUserMentionKeys = getCurrentUserMentionKeys(state);\n                const rootMessageMentionKeys = allAtMentions(root.message);\n\n                isFollowingThread = matchUserMentionTriggersWithMessageMentions(currentUserMentionKeys, rootMessageMentionKeys);\n            }\n        }\n\n        const showThreadsTutorialTip = tipStep === CrtThreadPaneSteps.THREADS_PANE_POPOVER && isCollapsedThreadsEnabled(state) && onboardingTourTipsEnabled(state);\n\n        return {\n            isExpanded: getIsRhsExpanded(state),\n            isMobileView: getIsMobileView(state),\n            relativeTeamUrl: getCurrentRelativeTeamUrl(state),\n            currentTeamId: getCurrentTeamId(state),\n            currentUserId,\n            isCollapsedThreadsEnabled: collapsedThreads,\n            isFollowingThread,\n            showThreadsTutorialTip,\n        };\n    };\n}\n\nconst actions = {\n    setRhsExpanded,\n    showSearchResults,\n    showMentions,\n    showFlaggedPosts,\n    showPinnedPosts,\n    showChannelFiles,\n    closeRightHandSide,\n    toggleRhsExpanded,\n    setThreadFollow,\n    goBack,\n};\n\nexport default connect(makeMapStateToProps, actions)(RhsHeaderPost);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useEffect} from 'react';\nimport {useDispatch} from 'react-redux';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {Post} from '@mattermost/types/posts';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {closeRightHandSide} from 'actions/views/rhs';\n\nimport RhsHeaderPost from 'components/rhs_header_post';\nimport ThreadViewer from 'components/threading/thread_viewer';\n\nimport type {FakePost, RhsState} from 'types/store/rhs';\n\ntype Props = {\n    currentTeam?: Team;\n    channel?: Channel;\n    selected: Post | FakePost;\n    previousRhsState?: RhsState;\n}\n\nconst RhsThread = ({\n    currentTeam,\n    channel,\n    selected,\n    previousRhsState,\n}: Props) => {\n    const dispatch = useDispatch();\n\n    useEffect(() => {\n        if (channel?.team_id && channel.team_id !== currentTeam?.id) {\n            // if team-scoped and mismatched team, close rhs\n            dispatch(closeRightHandSide());\n        }\n    }, [currentTeam, channel, dispatch]);\n\n    if (selected == null || !channel) {\n        return (\n            <div/>\n        );\n    }\n\n    return (\n        <div\n            id='rhsContainer'\n            className='sidebar-right__body'\n        >\n            <RhsHeaderPost\n                rootPostId={selected.id}\n                channel={channel}\n                previousRhsState={previousRhsState}\n            />\n            <ThreadViewer\n                rootPostId={selected.id}\n                useRelativeTimestamp={true}\n                isThreadView={false}\n            />\n        </div>\n    );\n};\n\nexport default memo(RhsThread);\n\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 {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getSelectedChannel, getSelectedPost} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport RhsThread from './rhs_thread';\n\nfunction mapStateToProps(state: GlobalState) {\n    const selected = getSelectedPost(state);\n    const channel = getSelectedChannel(state);\n    const currentTeam = getCurrentTeam(state);\n\n    return {\n        selected,\n        channel,\n        currentTeam,\n    };\n}\nexport default connect(mapStateToProps)(RhsThread);\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\ntype Props = React.HTMLAttributes<HTMLSpanElement>;\n\nexport default function UserGuideIcon(props: Props): JSX.Element {\n    const {formatMessage} = useIntl();\n\n    return (\n        <span {...props}>\n            <svg\n                width='18px'\n                height='18px'\n                viewBox='1 1 22 22'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.userGuide', defaultMessage: 'Help'})}\n                style={{width: '18px', height: '18px'}}\n            >\n                <path d='M11,18H13V16H11V18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,6A4,4 0 0,0 8,10H10A2,2 0 0,1 12,8A2,2 0 0,1 14,10C14,12 11,11.75 11,15H13C13,12.75 16,12.5 16,10A4,4 0 0,0 12,6Z'/>\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';\nimport {FormattedMessage, injectIntl} from 'react-intl';\nimport type {WrappedComponentProps} from 'react-intl';\n\nimport {trackEvent} from 'actions/telemetry_actions';\n\nimport KeyboardShortcutsModal from 'components/keyboard_shortcuts/keyboard_shortcuts_modal/keyboard_shortcuts_modal';\nimport UserGuideIcon from 'components/widgets/icons/user_guide_icon';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport type {PropsFromRedux} from './index';\n\nconst askTheCommunityUrl = 'https://mattermost.com/pl/default-ask-mattermost-community/';\n\ntype Props = PropsFromRedux & WrappedComponentProps\n\ntype State = {\n    buttonActive: boolean;\n};\n\nclass UserGuideDropdown extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            buttonActive: false,\n        };\n    }\n\n    openKeyboardShortcutsModal = (e: MouseEvent) => {\n        e.preventDefault();\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.KEYBOARD_SHORTCUTS_MODAL,\n            dialogType: KeyboardShortcutsModal,\n        });\n    };\n\n    buttonToggleState = (menuActive: boolean) => {\n        this.setState({\n            buttonActive: menuActive,\n        });\n    };\n\n    askTheCommunityClick = () => {\n        trackEvent('ui', 'help_ask_the_community');\n    };\n\n    renderDropdownItems = (): React.ReactNode => {\n        const {intl} = this.props;\n\n        return (\n            <Menu.Group>\n                {this.props.enableAskCommunityLink === 'true' && (\n                    <Menu.ItemExternalLink\n                        id='askTheCommunityLink'\n                        url={askTheCommunityUrl}\n                        text={intl.formatMessage({id: 'userGuideHelp.askTheCommunity', defaultMessage: 'Ask the community'})}\n                        onClick={this.askTheCommunityClick}\n                    />\n                )}\n                <Menu.ItemExternalLink\n                    id='helpResourcesLink'\n                    url={this.props.helpLink}\n                    text={intl.formatMessage({id: 'userGuideHelp.helpResources', defaultMessage: 'Help resources'})}\n                />\n                <Menu.ItemExternalLink\n                    id='reportAProblemLink'\n                    url={this.props.reportAProblemLink}\n                    text={intl.formatMessage({id: 'userGuideHelp.reportAProblem', defaultMessage: 'Report a problem'})}\n                />\n                <Menu.ItemAction\n                    id='keyboardShortcuts'\n                    onClick={this.openKeyboardShortcutsModal}\n                    text={intl.formatMessage({id: 'userGuideHelp.keyboardShortcuts', defaultMessage: 'Keyboard shortcuts'})}\n                />\n            </Menu.Group>\n        );\n    };\n\n    render() {\n        const {intl} = this.props;\n        const tooltipText = (\n            <FormattedMessage\n                id={'channel_header.userHelpGuide'}\n                defaultMessage='Help'\n            />\n        );\n\n        return (\n            <MenuWrapper\n                className='userGuideHelp'\n                onToggle={this.buttonToggleState}\n            >\n                <WithTooltip\n                    title={this.state.buttonActive ? '' : tooltipText}\n                >\n                    <button\n                        id='channelHeaderUserGuideButton'\n                        className={classNames('channel-header__icon', {'channel-header__icon--active': this.state.buttonActive})}\n                        type='button'\n                        aria-expanded='true'\n                    >\n                        <UserGuideIcon className='icon'/>\n                    </button>\n                </WithTooltip>\n                <Menu\n                    openLeft={true}\n                    openUp={false}\n                    id='AddChannelDropdown'\n                    ariaLabel={intl.formatMessage({id: 'sidebar_left.add_channel_dropdown.dropdownAriaLabel', defaultMessage: 'Add Channel Dropdown'})}\n                >\n                    {this.renderDropdownItems()}\n                </Menu>\n            </MenuWrapper>\n        );\n    }\n}\n\nexport default injectIntl(UserGuideDropdown);\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 {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\n\nimport UserGuideDropdown from './user_guide_dropdown';\n\nfunction mapStateToProps(state: GlobalState) {\n    const {HelpLink, ReportAProblemLink, EnableAskCommunityLink} = getConfig(state);\n    return {\n        helpLink: HelpLink!,\n        reportAProblemLink: ReportAProblemLink!,\n        enableAskCommunityLink: EnableAskCommunityLink!,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(UserGuideDropdown);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {Popover as BSPopover} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport Popover from 'components/widgets/popover';\n\nimport Constants from 'utils/constants';\n\nimport type {UserProfile} from './command_provider/app_command_parser/app_command_parser_dependencies';\nimport type {Props} from './suggestion_list';\nimport SuggestionList from './suggestion_list';\n\ninterface Item extends UserProfile {\n    type: string;\n    display_name: string;\n    name: string;\n}\n\nexport default class SearchSuggestionList extends SuggestionList {\n    popoverRef: React.RefObject<BSPopover>;\n    itemsContainerRef: React.RefObject<HTMLDivElement>;\n    suggestionReadOut: React.RefObject<HTMLDivElement>;\n    currentLabel: string;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.popoverRef = React.createRef();\n        this.itemsContainerRef = React.createRef();\n        this.suggestionReadOut = React.createRef();\n        this.currentLabel = '';\n    }\n\n    generateLabel(item: Item) {\n        if (item.username) {\n            this.currentLabel = item.username;\n            if ((item.first_name || item.last_name) && item.nickname) {\n                this.currentLabel += ` ${item.first_name} ${item.last_name} ${item.nickname}`;\n            } else if (item.nickname) {\n                this.currentLabel += ` ${item.nickname}`;\n            } else if (item.first_name || item.last_name) {\n                this.currentLabel += ` ${item.first_name} ${item.last_name}`;\n            }\n        } else if (item.type === Constants.DM_CHANNEL || item.type === Constants.GM_CHANNEL) {\n            this.currentLabel = item.display_name;\n        } else {\n            this.currentLabel = item.name;\n        }\n\n        if (this.currentLabel) {\n            this.currentLabel = this.currentLabel.toLowerCase();\n        }\n\n        this.announceLabel();\n    }\n\n    getContent = () => {\n        return this.itemsContainerRef?.current?.parentNode as HTMLDivElement | null;\n    };\n\n    renderChannelDivider(type: string) {\n        let text;\n        if (type === Constants.OPEN_CHANNEL) {\n            text = (\n                <FormattedMessage\n                    id='suggestion.search.public'\n                    defaultMessage='Public Channels'\n                />\n            );\n        } else if (type === Constants.PRIVATE_CHANNEL) {\n            text = (\n                <FormattedMessage\n                    id='suggestion.search.private'\n                    defaultMessage='Private Channels'\n                />\n            );\n        } else {\n            text = (\n                <FormattedMessage\n                    id='suggestion.search.direct'\n                    defaultMessage='Direct Messages'\n                />\n            );\n        }\n\n        return (\n            <div\n                key={type + '-divider'}\n                className='search-autocomplete__divider'\n            >\n                <span>{text}</span>\n            </div>\n        );\n    }\n\n    render() {\n        if (this.props.items.length === 0) {\n            return null;\n        }\n\n        const items: JSX.Element[] = [];\n        let haveDMDivider = false;\n        for (let i = 0; i < this.props.items.length; i++) {\n            const item: any = this.props.items[i];\n            const term = this.props.terms[i];\n            const isSelection = term === this.props.selection;\n\n            // ReactComponent names need to be upper case when used in JSX\n            const Component = this.props.components[i];\n\n            // temporary hack to add dividers between public and private channels in the search suggestion list\n            if (this.props.renderDividers) {\n                if (i === 0 || item.type !== this.props.items[i - 1].type) {\n                    if (item.type === Constants.DM_CHANNEL || item.type === Constants.GM_CHANNEL) {\n                        if (!haveDMDivider) {\n                            items.push(this.renderChannelDivider(Constants.DM_CHANNEL));\n                        }\n                        haveDMDivider = true;\n                    } else if (item.type === Constants.PRIVATE_CHANNEL) {\n                        items.push(this.renderChannelDivider(Constants.PRIVATE_CHANNEL));\n                    } else if (item.type === Constants.OPEN_CHANNEL) {\n                        items.push(this.renderChannelDivider(Constants.OPEN_CHANNEL));\n                    }\n                }\n            }\n\n            if (isSelection) {\n                this.currentItem = item;\n            }\n\n            items.push(\n                <Component\n                    key={term}\n                    ref={(ref: React.RefObject<HTMLDivElement>) => this.itemRefs.set(term, ref)}\n                    item={item}\n                    term={term}\n                    matchedPretext={this.props.matchedPretext[i]}\n                    isSelection={isSelection}\n                    onClick={this.props.onCompleteWord}\n                    onMouseMove={this.props.onItemHover}\n                />,\n            );\n        }\n\n        return (\n            <Popover\n                ref={this.popoverRef}\n                id='search-autocomplete__popover'\n                className='search-help-popover autocomplete visible'\n                placement='bottom'\n            >\n                <div\n                    ref={this.suggestionReadOut}\n                    aria-live='polite'\n                    className='hidden-label'\n                />\n                <div ref={this.itemsContainerRef}>\n                    {items}\n                </div>\n            </Popover>\n        );\n    }\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 Popover from 'components/widgets/popover';\n\ntype SuggestionItem = {\n    date: string;\n    label: string;\n}\n\ntype SuggestionItemProps = {\n    key: string;\n    item: SuggestionItem;\n    term: string;\n    matchedPretext: string;\n    preventClose: () => void;\n    handleEscape: () => void;\n    isSelection: boolean;\n    onClick: (term: string, matchedPretext: string[], e?: React.MouseEvent<HTMLDivElement>) => boolean;\n}\n\ntype Props = {\n    onCompleteWord: (term: string, matchedPretext: string[], e?: React.MouseEvent<HTMLDivElement>) => boolean;\n    matchedPretext: string[];\n    items: SuggestionItem[];\n    terms: string[];\n    preventClose: () => void;\n    handleEscape: () => void;\n    components: Array<React.ComponentType<SuggestionItemProps>>;\n}\n\nconst SuggestionDate = ({\n    items,\n    terms,\n    components,\n    matchedPretext,\n    onCompleteWord,\n    preventClose,\n    handleEscape,\n}: Props) => {\n    if (items.length === 0) {\n        return null;\n    }\n\n    const item = items[0];\n    const term = terms[0];\n\n    // ReactComponent names need to be upper case when used in JSX\n    const Component = components[0];\n\n    return (\n        <Popover\n            id='search-autocomplete__popover'\n            className='search-help-popover autocomplete visible'\n            placement='bottom'\n        >\n            <Component\n                key={term}\n                item={item}\n                term={term}\n                matchedPretext={matchedPretext[0]}\n                isSelection={false}\n                onClick={onCompleteWord}\n                preventClose={preventClose}\n                handleEscape={handleEscape}\n            />\n        </Popover>\n    );\n};\n\nexport default memo(SuggestionDate);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useRef} from 'react';\nimport type {ChangeEvent, CSSProperties, FormEvent} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\n\nimport type Provider from 'components/suggestion/provider';\nimport SearchSuggestionList from 'components/suggestion/search_suggestion_list';\nimport SuggestionBox from 'components/suggestion/suggestion_box';\nimport type SuggestionBoxComponent from 'components/suggestion/suggestion_box/suggestion_box';\nimport SuggestionDate from 'components/suggestion/suggestion_date';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\n\nconst {KeyCodes} = Constants;\n\nconst style: Record<string, CSSProperties> = {\n    searchForm: {overflow: 'visible'},\n};\n\ntype Props = {\n    searchTerms: string;\n    updateHighlightedSearchHint: (indexDelta: number, changedViaKeyPress?: boolean) => void;\n    handleChange: (e: ChangeEvent<HTMLInputElement>) => void;\n    handleSubmit: (e: FormEvent<HTMLFormElement>) => void;\n    handleEnterKey: (e: ChangeEvent<HTMLInputElement>) => void;\n    handleClear: () => void;\n    handleFocus: () => void;\n    handleBlur: () => void;\n    keepFocused: boolean;\n    setKeepFocused: (value: boolean) => void;\n    isFocused: boolean;\n    suggestionProviders: Provider[];\n    isSearchingTerm: boolean;\n    isSideBarRight?: boolean;\n    searchType: string;\n    clearSearchType?: () => void;\n    getFocus?: (searchBarFocus: () => void) => void;\n    children?: React.ReactNode;\n}\n\nconst defaultProps: Partial<Props> = {\n    isSideBarRight: false,\n    getFocus: (): void => {},\n    children: null,\n};\n\nconst SearchBar: React.FunctionComponent<Props> = (props: Props): JSX.Element => {\n    const {isFocused, keepFocused, searchTerms, suggestionProviders} = props;\n\n    const searchRef = useRef<SuggestionBoxComponent>();\n    const intl = useIntl();\n\n    useEffect((): void => {\n        const shouldFocus = isFocused || keepFocused;\n        if (shouldFocus) {\n            // let redux handle changes before focussing the input\n            setTimeout(() => searchRef.current?.focus(), 0);\n        } else {\n            setTimeout(() => searchRef.current?.blur(), 0);\n        }\n    }, [isFocused, keepFocused]);\n\n    useEffect((): void => {\n        if (isFocused && !keepFocused && searchTerms.endsWith('\"\"')) {\n            setTimeout(() => searchRef.current?.focus(), 0);\n        }\n    }, [searchTerms]);\n\n    const handleKeyDown = (e: ChangeEvent<HTMLInputElement>): void => {\n        if (Keyboard.isKeyPressed(e as any, KeyCodes.ESCAPE)) {\n            searchRef.current?.blur();\n            e.stopPropagation();\n            e.preventDefault();\n        }\n\n        if (Keyboard.isKeyPressed(e as any, KeyCodes.DOWN)) {\n            e.preventDefault();\n            props.updateHighlightedSearchHint(1, true);\n        }\n\n        if (Keyboard.isKeyPressed(e as any, KeyCodes.UP)) {\n            e.preventDefault();\n            props.updateHighlightedSearchHint(-1, true);\n        }\n\n        if (Keyboard.isKeyPressed(e as any, KeyCodes.ENTER)) {\n            props.handleEnterKey(e);\n        }\n\n        if (Keyboard.isKeyPressed(e as any, KeyCodes.BACKSPACE) && !searchTerms) {\n            if (props.clearSearchType) {\n                props.clearSearchType();\n            }\n        }\n    };\n\n    const getSearch = (node: SuggestionBoxComponent): void => {\n        searchRef.current = node;\n        if (props.getFocus) {\n            props.getFocus(props.handleFocus);\n        }\n    };\n\n    return (\n        <div\n            id={props.isSideBarRight ? 'sbrSearchFormContainer' : 'searchFormContainer'}\n            className='search-form__container'\n        >\n            <form\n                role='search'\n                className={classNames(['search__form', {'search__form--focused': isFocused}])}\n                onSubmit={props.handleSubmit}\n                style={style.searchForm}\n                autoComplete='off'\n                aria-labelledby='searchBox'\n            >\n                <div className='search__font-icon'>\n                    <i className='icon icon-magnify icon-16'/>\n                </div>\n\n                {props.searchType !== '' && (\n                    <div\n                        className='searchTypeBadge'\n                        onMouseDown={props.handleFocus}\n                    >\n                        {props.searchType === 'messages' && (\n                            <FormattedMessage\n                                id='search_bar.search_types.messages'\n                                defaultMessage='MESSAGES'\n                            />\n                        )}\n                        {props.searchType === 'files' && (\n                            <FormattedMessage\n                                id='search_bar.search_types.files'\n                                defaultMessage='FILES'\n                            />\n                        )}\n                        <i\n                            className='icon icon-close icon-12'\n                            onMouseDown={() => {\n                                props.setKeepFocused(true);\n                            }}\n                            onClick={() => props.clearSearchType && props.clearSearchType()}\n                        />\n                    </div>\n                )}\n                <SuggestionBox\n                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n                    // @ts-ignore\n                    ref={getSearch}\n                    id={props.isSideBarRight ? 'sbrSearchBox' : 'searchBox'}\n                    tabIndex='0'\n                    className={'search-bar form-control a11y__region'}\n                    containerClass='w-full'\n                    data-a11y-sort-order='9'\n                    aria-describedby={props.isSideBarRight ? 'sbr-searchbar-help-popup' : 'searchbar-help-popup'}\n                    aria-label={intl.formatMessage({id: 'search_bar.search', defaultMessage: 'Search'})}\n                    placeholder={intl.formatMessage({id: 'search_bar.search', defaultMessage: 'Search'})}\n                    value={props.searchTerms}\n                    onFocus={props.handleFocus}\n                    onBlur={props.handleBlur}\n                    onChange={props.handleChange}\n                    onKeyDown={handleKeyDown}\n                    listComponent={SearchSuggestionList}\n                    dateComponent={SuggestionDate}\n                    providers={suggestionProviders}\n                    type='search'\n                    delayInputUpdate={true}\n                    renderDividers={['all']}\n                    clearable={true}\n                    onClear={props.handleClear}\n                />\n                {props.isSearchingTerm && <LoadingSpinner/>}\n                {props.children}\n            </form>\n        </div>\n    );\n};\n\nSearchBar.defaultProps = defaultProps;\n\nexport default SearchBar;\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';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport ExternalLink from 'components/external_link';\n\nimport {isFileAttachmentsEnabled} from 'utils/file_utils';\n\ninterface SearchTerm {\n    searchTerm: string;\n    message: MessageDescriptor;\n    additionalDisplay?: string;\n}\n\ntype Props = {\n    withTitle?: boolean;\n    onOptionSelected: (term: string) => void;\n    onMouseDown?: () => void | undefined;\n    options: SearchTerm[];\n    highlightedIndex?: number;\n    onOptionHover?: (index: number) => void;\n    onSearchTypeSelected?: (searchType: 'files' | 'messages') => void;\n    onElementBlur?: () => void;\n    onElementFocus?: () => void;\n    searchType?: 'files' | 'messages' | '';\n}\n\nconst SearchHint = (props: Props): JSX.Element => {\n    const handleOnOptionHover = (optionIndex: number) => {\n        if (props.onOptionHover) {\n            props.onOptionHover(optionIndex);\n        }\n    };\n    const config = useSelector(getConfig);\n    const isFileAttachmentEnabled = isFileAttachmentsEnabled(config);\n\n    if (props.onSearchTypeSelected) {\n        if (!props.searchType) {\n            return (\n                <div\n                    className='search-hint__search-type-selector'\n                    onMouseDown={props.onMouseDown}\n                >\n                    <div className='search-hint_text-container'>\n                        <FormattedMessage\n                            id='search_bar.usage.search_type_question'\n                            defaultMessage='What are you searching for?'\n                        />\n                        <FormattedMessage\n                            id='search_bar.usage.searchLearn'\n                            defaultMessage='<a>Learn about search</a>'\n                            values={{\n                                a: (chunks) => (\n                                    <ExternalLink\n                                        location='search_hint'\n                                        className='search-hint_learn-search'\n                                        href='https://mattermost.com/pl/mattermost-academy-search-training'\n                                    >\n                                        <span>{chunks}</span>\n                                        <i className='icon icon-lightbulb-outline'/>\n                                    </ExternalLink>\n                                ),\n                            }}\n                        />\n\n                    </div>\n                    <div className='button-container'>\n                        <button\n                            className={classNames({highlighted: props.highlightedIndex === 0})}\n                            onClick={() => props.onSearchTypeSelected && props.onSearchTypeSelected('messages')}\n                            onBlur={() => props.onElementBlur && props.onElementBlur()}\n                            onFocus={() => props.onElementFocus && props.onElementFocus()}\n                        >\n                            <i className='icon icon-message-text-outline'/>\n                            <FormattedMessage\n                                id='search_bar.usage.search_type_messages'\n                                defaultMessage='Messages'\n                            />\n                        </button>\n                        {isFileAttachmentEnabled &&\n                            <button\n                                className={classNames({highlighted: props.highlightedIndex === 1})}\n                                onClick={() => props.onSearchTypeSelected && props.onSearchTypeSelected('files')}\n                                onBlur={() => props.onElementBlur && props.onElementBlur()}\n                                onFocus={() => props.onElementFocus && props.onElementFocus()}\n                            >\n                                <i className='icon icon-file-text-outline'/>\n                                <FormattedMessage\n                                    id='search_bar.usage.search_type_files'\n                                    defaultMessage='Files'\n                                />\n                            </button>}\n                    </div>\n                </div>\n            );\n        }\n    }\n\n    return (\n        <>\n            {props.withTitle && (!props.searchType) &&\n                <h4 className='search-hint__title'>\n                    <FormattedMessage\n                        id='search_bar.usage.title'\n                        defaultMessage='Search options'\n                    />\n                </h4>\n            }\n            {props.withTitle && props.searchType === 'files' &&\n                <h4 className='search-hint__title'>\n                    <FormattedMessage\n                        id='search_bar.usage.title_files'\n                        defaultMessage='File search options'\n                    />\n                </h4>\n            }\n            {props.withTitle && props.searchType === 'messages' &&\n                <h4 className='search-hint__title'>\n                    <FormattedMessage\n                        id='search_bar.usage.title_messages'\n                        defaultMessage='Message search options'\n                    />\n                </h4>\n            }\n            <ul\n                role='list'\n                className='search-hint__suggestions-list'\n                onMouseDown={props.onMouseDown}\n                onTouchEnd={props.onMouseDown}\n            >\n                {props.options.map((option, optionIndex) => (\n                    <li\n                        className={classNames('search-hint__suggestions-list__option', {highlighted: optionIndex === props.highlightedIndex})}\n                        key={option.searchTerm}\n                        onMouseDown={() => props.onOptionSelected(option.searchTerm)}\n                        onTouchEnd={() => props.onOptionSelected(option.searchTerm)}\n                        onMouseOver={() => handleOnOptionHover(optionIndex)}\n                    >\n                        <div className='search-hint__suggestion-list__flex-wrap'>\n                            <span className='search-hint__suggestion-list__label'>{option.additionalDisplay ? option.additionalDisplay : option.searchTerm}</span>\n                        </div>\n                        <div className='search-hint__suggestion-list__value'>\n                            <FormattedMessage\n                                id={option.message.id}\n                                defaultMessage={option.message.defaultMessage}\n                            />\n                        </div>\n                    </li>))}\n            </ul>\n        </>\n    );\n};\n\nexport default SearchHint;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport {getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport FileThumbnail from 'components/file_attachment/file_thumbnail';\nimport FilePreviewModal from 'components/file_preview_modal';\nimport Timestamp, {RelativeRanges} from 'components/timestamp';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport Tag from 'components/widgets/tag/tag';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {getHistory} from 'utils/browser_history';\nimport Constants, {ModalIdentifiers} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\nimport {fileSizeToString, copyToClipboard, localizeMessage} from 'utils/utils';\n\nimport type {PropsFromRedux, OwnProps} from './index';\n\nimport './file_search_result_item.scss';\n\ntype Props = OwnProps & PropsFromRedux;\n\ntype State = {\n    keepOpen: boolean;\n}\n\nconst FILE_TOOLTIP_RANGES = [\n    RelativeRanges.TODAY_TITLE_CASE,\n    RelativeRanges.YESTERDAY_TITLE_CASE,\n];\n\nexport default class FileSearchResultItem extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n        this.state = {keepOpen: false};\n    }\n\n    private jumpToConv = (e: MouseEvent) => {\n        e.stopPropagation();\n        getHistory().push(`/${this.props.teamName}/pl/${this.props.fileInfo.post_id}`);\n    };\n\n    private copyLink = () => {\n        copyToClipboard(`${getSiteURL()}/${this.props.teamName}/pl/${this.props.fileInfo.post_id}`);\n    };\n\n    private stopPropagation = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n        e.stopPropagation();\n    };\n\n    private keepOpen = (open: boolean) => {\n        this.setState({keepOpen: open});\n    };\n\n    private renderPluginItems = () => {\n        const {fileInfo} = this.props;\n        const pluginItems = this.props.pluginMenuItems?.filter((item) => item?.match(fileInfo)).map((item) => {\n            return (\n                <Menu.ItemAction\n                    id={item.id + '_pluginmenuitem'}\n                    key={item.id + '_pluginmenuitem'}\n                    onClick={() => item.action?.(fileInfo)}\n                    text={item.text}\n                />\n            );\n        });\n\n        if (!pluginItems?.length) {\n            return null;\n        }\n\n        return (\n            <>\n                <li\n                    id={`divider_file_${this.props.fileInfo.id}_plugins`}\n                    className='MenuItem__divider'\n                    role='menuitem'\n                />\n                {pluginItems}\n            </>\n        );\n    };\n\n    private showPreview = () => {\n        this.props.actions.openModal({\n            modalId: ModalIdentifiers.FILE_PREVIEW_MODAL,\n            dialogType: FilePreviewModal,\n            dialogProps: {\n                fileInfos: [this.props.fileInfo],\n                postId: this.props.fileInfo.post_id,\n                startIndex: 0,\n            },\n        });\n    };\n\n    public render(): React.ReactNode {\n        const {fileInfo, channelDisplayName, channelType} = this.props;\n        let channelName: React.ReactNode = channelDisplayName;\n        if (channelType === Constants.DM_CHANNEL) {\n            channelName = (\n                <FormattedMessage\n                    id='search_item.file_tag.direct_message'\n                    defaultMessage='Direct Message'\n                />\n            );\n        } else if (channelType === Constants.GM_CHANNEL) {\n            channelName = (\n                <FormattedMessage\n                    id='search_item.file_tag.group_message'\n                    defaultMessage='Group Message'\n                />\n            );\n        }\n\n        return (\n            <div\n                data-testid='search-item-container'\n                className='search-item__container'\n            >\n                <button\n                    className={'FileSearchResultItem' + (this.state.keepOpen ? ' keep-open' : '')}\n                    onClick={this.showPreview}\n                >\n                    <FileThumbnail fileInfo={fileInfo}/>\n                    <div className='fileData'>\n                        <div className='fileDataName'>{fileInfo.name}</div>\n                        <div className='fileMetadata'>\n                            {channelName && (\n                                <Tag\n                                    className='file-search-channel-name'\n                                    text={channelName}\n                                />\n                            )}\n                            <span>{fileSizeToString(fileInfo.size)}</span>\n                            <span>{' • '}</span>\n                            <Timestamp\n                                value={fileInfo.create_at}\n                                ranges={FILE_TOOLTIP_RANGES}\n                            />\n                        </div>\n                    </div>\n                    {this.props.fileInfo.post_id && (\n                        <WithTooltip\n                            title={defineMessage({id: 'file_search_result_item.more_actions', defaultMessage: 'More Actions'})}\n                        >\n                            <MenuWrapper\n                                onToggle={this.keepOpen}\n                                stopPropagationOnToggle={true}\n                            >\n                                <a\n                                    href='#'\n                                    className='action-icon dots-icon'\n                                >\n                                    <i className='icon icon-dots-vertical'/>\n                                </a>\n                                <Menu\n                                    ariaLabel={'file menu'}\n                                    openLeft={true}\n                                >\n                                    <Menu.ItemAction\n                                        onClick={this.jumpToConv}\n                                        ariaLabel={localizeMessage({id: 'file_search_result_item.open_in_channel', defaultMessage: 'Open in channel'})}\n                                        text={localizeMessage({id: 'file_search_result_item.open_in_channel', defaultMessage: 'Open in channel'})}\n                                    />\n                                    <Menu.ItemAction\n                                        onClick={this.copyLink}\n                                        ariaLabel={localizeMessage({id: 'file_search_result_item.copy_link', defaultMessage: 'Copy link'})}\n                                        text={localizeMessage({id: 'file_search_result_item.copy_link', defaultMessage: 'Copy link'})}\n                                    />\n                                    {this.renderPluginItems()}\n                                </Menu>\n                            </MenuWrapper>\n                        </WithTooltip>\n                    )}\n                    <WithTooltip\n                        title={defineMessage({id: 'file_search_result_item.download', defaultMessage: 'Download'})}\n                    >\n                        <a\n                            className='action-icon download-icon'\n                            href={getFileDownloadUrl(fileInfo.id)}\n                            onClick={this.stopPropagation}\n                        >\n                            <i className='icon icon-download-outline'/>\n                        </a>\n                    </WithTooltip>\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 type {ConnectedProps} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\n\nimport {openModal} from 'actions/views/modals';\n\nimport type {GlobalState} from 'types/store';\nimport type {FileDropdownPluginComponent} from 'types/store/plugins';\n\nimport FileSearchResultItem from './file_search_result_item';\n\nexport type OwnProps = {\n    channelId: string;\n    fileInfo: FileInfo;\n    teamName: string;\n    pluginMenuItems?: FileDropdownPluginComponent[];\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const channel = getChannel(state, ownProps.channelId);\n\n    return {\n        channelDisplayName: '',\n        channelType: channel?.type,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            openModal,\n        }, dispatch),\n    };\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type PropsFromRedux = ConnectedProps<typeof connector>;\n\nexport default connector(FileSearchResultItem);\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';\n\nimport {FilterVariantIcon} from '@mattermost/compass-icons/components';\n\nimport {IconContainer} from 'components/advanced_text_editor/formatting_bar/formatting_icon';\nimport type {SearchFilterType} from 'components/search/types';\nimport Menu from 'components/widgets/menu/menu';\nimport MenuWrapper from 'components/widgets/menu/menu_wrapper';\nimport WithTooltip from 'components/with_tooltip';\n\nimport './files_filter_menu.scss';\n\ntype Props = {\n    selectedFilter: string;\n    onFilter: (filter: SearchFilterType) => void;\n};\n\nexport default function FilesFilterMenu(props: Props): JSX.Element {\n    const intl = useIntl();\n    return (\n        <div className='FilesFilterMenu'>\n            <MenuWrapper>\n                <WithTooltip\n                    title={\n                        <FormattedMessage\n                            id='channel_info_rhs.menu.files.filter'\n                            defaultMessage='Filter'\n                        />}\n                >\n                    <IconContainer\n                        id='filesFilterButton'\n                        className='action-icon dots-icon'\n                        type='button'\n                    >\n                        {props.selectedFilter !== 'all' && <i className='icon-dot'/>}\n                        <FilterVariantIcon\n                            size={18}\n                            color='currentColor'\n                        />\n                    </IconContainer>\n                </WithTooltip>\n\n                <Menu\n                    ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.file_menu', defaultMessage: 'file menu'})}\n                    openLeft={true}\n                >\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.all_file_types', defaultMessage: 'All file types'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.all_file_types', defaultMessage: 'All file types'})}\n                        onClick={() => props.onFilter('all')}\n                        icon={props.selectedFilter === 'all' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.documents', defaultMessage: 'Documents'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.documents', defaultMessage: 'Documents'})}\n                        onClick={() => props.onFilter('documents')}\n                        icon={props.selectedFilter === 'documents' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.spreadsheets', defaultMessage: 'Spreadsheets'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.spreadsheets', defaultMessage: 'Spreadsheets'})}\n                        onClick={() => props.onFilter('spreadsheets')}\n                        icon={props.selectedFilter === 'spreadsheets' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.presentations', defaultMessage: 'Presentations'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.presentations', defaultMessage: 'Presentations'})}\n                        onClick={() => props.onFilter('presentations')}\n                        icon={props.selectedFilter === 'presentations' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.code', defaultMessage: 'Code'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.code', defaultMessage: 'Code'})}\n                        onClick={() => props.onFilter('code')}\n                        icon={props.selectedFilter === 'code' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.images', defaultMessage: 'Images'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.images', defaultMessage: 'Images'})}\n                        onClick={() => props.onFilter('images')}\n                        icon={props.selectedFilter === 'images' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.audio', defaultMessage: 'Audio'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.audio', defaultMessage: 'Audio'})}\n                        onClick={() => props.onFilter('audio')}\n                        icon={props.selectedFilter === 'audio' ? <i className='icon icon-check'/> : null}\n                    />\n                    <Menu.ItemAction\n                        ariaLabel={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.videos', defaultMessage: 'Videos'})}\n                        text={intl.formatMessage({id: 'channel_info_rhs.menu.files.filter.videos', defaultMessage: 'Videos'})}\n                        onClick={() => props.onFilter('video')}\n                        icon={props.selectedFilter === 'video' ? <i className='icon icon-check'/> : null}\n                    />\n                </Menu>\n            </MenuWrapper>\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 {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getMyTeams} from 'mattermost-redux/selectors/entities/teams';\n\nimport {getSearchTeam} from 'selectors/rhs';\n\nimport type {SearchFilterType} from 'components/search/types';\n\nimport Constants from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\n\nimport type {GlobalState} from 'types/store';\nimport type {SearchType} from 'types/store/rhs';\n\nimport FilesFilterMenu from './files_filter_menu';\n\nconst {KeyCodes} = Constants;\n\nimport './messages_or_files_selector.scss';\n\ntype Props = {\n    selected: string;\n    selectedFilter: SearchFilterType;\n    messagesCounter: string;\n    filesCounter: string;\n    isFileAttachmentsEnabled: boolean;\n    crossTeamSearchEnabled: boolean;\n    onChange: (value: SearchType) => void;\n    onFilter: (filter: SearchFilterType) => void;\n    onTeamChange: (teamId: string) => void;\n};\n\nexport default function MessagesOrFilesSelector(props: Props): JSX.Element {\n    const teams = useSelector((state: GlobalState) => getMyTeams(state));\n    const searchTeam = useSelector((state: GlobalState) => getSearchTeam(state));\n\n    const options = [{value: '', label: 'All teams', selected: searchTeam === ''}];\n    for (const team of teams) {\n        options.push({value: team.id, label: team.display_name, selected: searchTeam === team.id});\n    }\n\n    const onTeamChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n        props.onTeamChange(e.target.value);\n    };\n\n    return (\n        <div className='MessagesOrFilesSelector'>\n            <div className='buttons-container'>\n                <button\n                    onClick={() => props.onChange('messages')}\n                    onKeyDown={(e: React.KeyboardEvent<HTMLSpanElement>) => Keyboard.isKeyPressed(e, KeyCodes.ENTER) && props.onChange('messages')}\n                    className={props.selected === 'messages' ? 'active tab messages-tab' : 'tab messages-tab'}\n                >\n                    <FormattedMessage\n                        id='search_bar.messages_tab'\n                        defaultMessage='Messages'\n                    />\n                    <span className='counter'>{props.messagesCounter}</span>\n                </button>\n                {props.isFileAttachmentsEnabled &&\n                    <button\n                        onClick={() => props.onChange('files')}\n                        onKeyDown={(e: React.KeyboardEvent<HTMLSpanElement>) => Keyboard.isKeyPressed(e, KeyCodes.ENTER) && props.onChange('files')}\n                        className={props.selected === 'files' ? 'active tab files-tab' : 'tab files-tab'}\n                    >\n                        <FormattedMessage\n                            id='search_bar.files_tab'\n                            defaultMessage='Files'\n                        />\n                        <span className='counter'>{props.filesCounter}</span>\n                    </button>\n                }\n            </div>\n            {props.crossTeamSearchEnabled && (\n                <div className='team-selector-container'>\n                    <select\n                        value={searchTeam}\n                        onChange={onTeamChange}\n                    >\n                        {options.map((option) => (\n                            <option\n                                key={option.value}\n                                value={option.value}\n                            >\n                                {option.label}\n                            </option>\n                        ))}\n                    </select>\n                </div>\n            )}\n            {props.selected === 'files' &&\n                <FilesFilterMenu\n                    selectedFilter={props.selectedFilter}\n                    onFilter={props.onFilter}\n                />}\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';\n\nimport type {Post} from '@mattermost/types/posts';\n\nimport PostComponent from 'components/post';\n\nimport {Locations} from 'utils/constants';\n\ntype Props = {\n    a11yIndex: number;\n    isFlaggedPosts: boolean;\n    isMentionSearch: boolean;\n    isPinnedPosts: boolean;\n    matches: string[];\n    post: Post;\n    searchTerm: string;\n}\n\nexport default function PostSearchResultsItem(props: Props) {\n    return (\n        <div\n            className='search-item__container'\n            data-testid='search-item-container'\n        >\n            <PostComponent\n                post={props.post}\n                matches={props.matches}\n                term={(!props.isFlaggedPosts && !props.isPinnedPosts && !props.isMentionSearch) ? props.searchTerm : ''}\n                isMentionSearch={props.isMentionSearch}\n                a11yIndex={props.a11yIndex}\n                location={Locations.SEARCH}\n            />\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';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {isCurrentLicenseCloud} from 'mattermost-redux/selectors/entities/cloud';\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 useGetUsage from 'components/common/hooks/useGetUsage';\nimport useOpenPricingModal from 'components/common/hooks/useOpenPricingModal';\n\nimport {DataSearchTypes} from 'utils/constants';\nimport {asGBString} from 'utils/limits';\n\nconst StyledDiv = styled.div`\nwidth: 100%;\n`;\n\nconst StyledA = styled.a`\ncolor: var(--denim-button-bg) !important;\n`;\n\nconst InnerDiv = styled.div`\ndisplay: flex;\ngap: 8px;\nborder: 1px solid rgba(var(--center-channel-color-rgb), 0.08);\nborder-radius: 4px;\nbackground-color: rgba(var(--center-channel-color-rgb), 0.04);\npadding: 10px;\nmargin: 10px;\ncolor: rgba(var(--center-channel-color-rgb), 0.75);\nfont-weight: 400;\nfont-size: 11px;\nline-height: 16px;\nletter-spacing: 0.02em;\n`;\n\ntype Props = {\n    searchType: string;\n}\n\nfunction SearchLimitsBanner(props: Props) {\n    const {formatMessage, formatNumber} = useIntl();\n    const openPricingModal = useOpenPricingModal();\n    const usage = useGetUsage();\n    const [cloudLimits] = useGetLimits();\n    const isAdminUser = isAdmin(useSelector(getCurrentUser).roles);\n    const isCloud = useSelector(isCurrentLicenseCloud);\n\n    if (!isCloud) {\n        return null;\n    }\n\n    const currentFileStorageUsage = usage.files.totalStorage;\n    const fileStorageLimit = cloudLimits?.files?.total_storage;\n    const currentMessagesUsage = usage.messages.history;\n    const messagesLimit = cloudLimits?.messages?.history;\n\n    let ctaAction = formatMessage({\n        id: 'workspace_limits.search_limit.view_plans',\n        defaultMessage: 'View plans',\n    });\n\n    if (isAdminUser) {\n        ctaAction = formatMessage({\n            id: 'workspace_limits.search_limit.upgrade_now',\n            defaultMessage: 'Upgrade now',\n        });\n    }\n\n    const renderBanner = (bannerText: React.ReactNode, id: string) => {\n        return (<StyledDiv id={id}>\n            <InnerDiv>\n                <i className='icon-eye-off-outline'/>\n                <span>{bannerText}</span>\n            </InnerDiv>\n        </StyledDiv>);\n    };\n\n    switch (props.searchType) {\n    case DataSearchTypes.FILES_SEARCH_TYPE:\n        if ((fileStorageLimit === undefined) || !(currentFileStorageUsage > fileStorageLimit)) {\n            return null;\n        }\n        return renderBanner(formatMessage({\n            id: 'workspace_limits.search_files_limit.banner_text',\n            defaultMessage: 'Some older files may not be shown because your workspace has met its file storage limit of {storage}. <a>{ctaAction}</a>',\n        }, {\n            ctaAction,\n            storage: asGBString(fileStorageLimit, formatNumber),\n            a: (chunks: React.ReactNode | React.ReactNodeArray) => (\n                <StyledA\n                    onClick={() => openPricingModal({trackingLocation: 'file_search_limits_banner'})}\n                >\n                    {chunks}\n                </StyledA>\n            ),\n        }), `${DataSearchTypes.FILES_SEARCH_TYPE}_search_limits_banner`);\n\n    case DataSearchTypes.MESSAGES_SEARCH_TYPE:\n        if ((messagesLimit === undefined) || !(currentMessagesUsage > messagesLimit)) {\n            return null;\n        }\n        return renderBanner(formatMessage({\n            id: 'workspace_limits.search_message_limit.banner_text',\n            defaultMessage: 'Some older messages may not be shown because your workspace has over {messages} messages. <a>{ctaAction}</a>',\n        }, {\n            ctaAction,\n            messages: formatNumber(messagesLimit),\n            a: (chunks: React.ReactNode | React.ReactNodeArray) => (\n                <StyledA\n                    onClick={() => openPricingModal({trackingLocation: 'messages_search_limits_banner'})}\n                >\n                    {chunks}\n                </StyledA>\n            ),\n        }), `${DataSearchTypes.MESSAGES_SEARCH_TYPE}_search_limits_banner`);\n    default:\n        return null;\n    }\n}\n\nexport default SearchLimitsBanner;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useRef, useState} from 'react';\nimport Scrollbars from 'react-custom-scrollbars';\nimport {useIntl, FormattedMessage, defineMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {FileSearchResultItem as FileSearchResultItemType} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {debounce} from 'mattermost-redux/actions/helpers';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {getFilesDropdownPluginMenuItems} from 'selectors/plugins';\n\nimport FileSearchResultItem from 'components/file_search_results';\nimport NoResultsIndicator from 'components/no_results_indicator/no_results_indicator';\nimport {NoResultsVariant} from 'components/no_results_indicator/types';\nimport SearchHint from 'components/search_hint/search_hint';\nimport SearchResultsHeader from 'components/search_results_header';\nimport LoadingWrapper from 'components/widgets/loading/loading_wrapper';\n\nimport {searchHintOptions, DataSearchTypes} from 'utils/constants';\nimport {isFileAttachmentsEnabled} from 'utils/file_utils';\n\nimport FilesFilterMenu from './files_filter_menu';\nimport MessageOrFileSelector from './messages_or_files_selector';\nimport PostSearchResultsItem from './post_search_results_item';\nimport SearchLimitsBanner from './search_limits_banner';\nimport type {Props} from './types';\n\nimport './search_results.scss';\n\nconst GET_MORE_BUFFER = 30;\n\nconst renderView = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--view'\n    />\n);\n\nconst renderThumbHorizontal = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--horizontal scrollbar--thumb--RHS'\n    />\n);\n\nconst renderThumbVertical = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--vertical scrollbar--thumb--RHS'\n    />\n);\n\nconst renderTrackVertical = (props: Record<string, unknown>): JSX.Element => (\n    <div\n        {...props}\n        className='scrollbar--vertical--RHS'\n    />\n);\n\ninterface NoResultsProps {\n    variant: NoResultsVariant;\n    titleValues?: Record<string, React.ReactNode>;\n    subtitleValues?: Record<string, React.ReactNode>;\n}\n\nconst defaultProps: Partial<Props> = {\n    isCard: false,\n    isOpened: false,\n    channelDisplayName: '',\n    children: null,\n};\n\nconst SearchResults: React.FC<Props> = (props: Props): JSX.Element => {\n    const scrollbars = useRef<Scrollbars|null>(null);\n    const [searchType, setSearchType] = useState<string>(props.searchType);\n    const filesDropdownPluginMenuItems = useSelector(getFilesDropdownPluginMenuItems);\n    const config = useSelector(getConfig);\n    const intl = useIntl();\n\n    useEffect(() => {\n        if (props.searchFilterType !== 'all') {\n            props.setSearchFilterType('all');\n        }\n        setSearchType(props.searchType);\n        scrollbars.current?.scrollToTop();\n    }, [props.searchTerms]);\n\n    useEffect(() => {\n        setSearchType(props.searchSelectedType);\n    }, [props.searchSelectedType]);\n\n    useEffect(() => {\n        // reset search type when switching views\n        setSearchType(props.searchType);\n    }, [props.isFlaggedPosts, props.isPinnedPosts, props.isMentionSearch]);\n\n    useEffect(() => {\n        // after the first page of search results, there is no way to\n        // know if the search has more results to return, so we search\n        // for the second page and stop if it yields no results\n        if (props.searchPage === 0 && !props.isChannelFiles && !props.isSearchingTerm) {\n            setTimeout(() => {\n                props.getMorePostsForSearch();\n                props.getMoreFilesForSearch();\n            }, 100);\n        }\n    }, [props.searchPage, props.searchTerms, props.isSearchingTerm]);\n\n    const handleScroll = (): void => {\n        if (!props.isFlaggedPosts && !props.isPinnedPosts && !props.isSearchingTerm && !props.isSearchGettingMore && !props.isChannelFiles) {\n            const scrollHeight = scrollbars.current?.getScrollHeight() || 0;\n            const scrollTop = scrollbars.current?.getScrollTop() || 0;\n            const clientHeight = scrollbars.current?.getClientHeight() || 0;\n            if ((scrollTop + clientHeight + GET_MORE_BUFFER) >= scrollHeight) {\n                if (searchType === DataSearchTypes.FILES_SEARCH_TYPE) {\n                    loadMoreFiles();\n                } else {\n                    loadMorePosts();\n                }\n            }\n        }\n    };\n\n    const setSearchTeam = (teamId: string): void => {\n        props.updateSearchTeam(teamId);\n    };\n\n    const loadMorePosts = debounce(\n        () => {\n            props.getMorePostsForSearch();\n        },\n        100,\n        false,\n        (): void => {},\n    );\n\n    const loadMoreFiles = debounce(\n        () => {\n            props.getMoreFilesForSearch();\n        },\n        100,\n        false,\n        (): void => {},\n    );\n\n    const {\n        results,\n        fileResults,\n        searchTerms,\n        isCard,\n        isSearchAtEnd,\n        isSearchFilesAtEnd,\n        isSearchingTerm,\n        isFlaggedPosts,\n        isSearchingFlaggedPost,\n        isPinnedPosts,\n        isChannelFiles,\n        isSearchingPinnedPost,\n        isSideBarExpanded,\n        isMentionSearch,\n        isOpened,\n        updateSearchTerms,\n        handleSearchHintSelection,\n        searchFilterType,\n        setSearchFilterType,\n    } = props;\n\n    const noResults = (!results || !Array.isArray(results) || results.length === 0);\n    const noFileResults = (!fileResults || !Array.isArray(fileResults) || fileResults.length === 0);\n    const isLoading = isSearchingTerm || isSearchingFlaggedPost || isSearchingPinnedPost || !isOpened;\n    const isAtEnd = (searchType === DataSearchTypes.MESSAGES_SEARCH_TYPE && isSearchAtEnd) || (searchType === DataSearchTypes.FILES_SEARCH_TYPE && isSearchFilesAtEnd);\n    const showLoadMore = !isAtEnd && !isChannelFiles && !isFlaggedPosts && !isPinnedPosts;\n    const isMessagesSearch = (!isFlaggedPosts && !isMentionSearch && !isCard && !isPinnedPosts && !isChannelFiles);\n\n    let contentItems;\n    let loadingMorePostsComponent;\n\n    let sortedResults: any = results;\n\n    let titleDescriptor;\n    const noResultsProps: NoResultsProps = {\n        variant: NoResultsVariant.ChannelSearch,\n    };\n\n    if (isMentionSearch) {\n        noResultsProps.variant = NoResultsVariant.Mentions;\n\n        titleDescriptor = defineMessage({\n            id: 'search_header.title2',\n            defaultMessage: 'Recent Mentions',\n        });\n    } else if (isFlaggedPosts) {\n        noResultsProps.variant = NoResultsVariant.FlaggedPosts;\n        noResultsProps.subtitleValues = {buttonText: <strong>{\n            intl.formatMessage({\n                id: 'flag_post.flag',\n                defaultMessage: 'Save Message'},\n            )}</strong>};\n        titleDescriptor = defineMessage({\n            id: 'search_header.title3',\n            defaultMessage: 'Saved messages',\n        });\n    } else if (isPinnedPosts) {\n        noResultsProps.variant = NoResultsVariant.PinnedPosts;\n        noResultsProps.subtitleValues = {text: <strong>{\n            intl.formatMessage({\n                id: 'post_info.pin',\n                defaultMessage: 'Pin to Channel',\n            })}</strong>};\n\n        sortedResults = [...results];\n        sortedResults.sort((postA: Post|FileSearchResultItemType, postB: Post|FileSearchResultItemType) => postB.create_at - postA.create_at);\n\n        titleDescriptor = defineMessage({\n            id: 'search_header.pinnedMessages',\n            defaultMessage: 'Pinned messages',\n        });\n    } else if (isChannelFiles) {\n        if (searchFilterType === 'all') {\n            noResultsProps.variant = NoResultsVariant.ChannelFiles;\n        } else {\n            noResultsProps.variant = NoResultsVariant.ChannelFilesFiltered;\n        }\n\n        titleDescriptor = defineMessage({\n            id: 'search_header.channelFiles',\n            defaultMessage: 'Files',\n        });\n    } else if (isCard) {\n        titleDescriptor = defineMessage({\n            id: 'search_header.title5',\n            defaultMessage: 'Extra information',\n        });\n    } else if (!searchTerms && noResults && noFileResults) {\n        titleDescriptor = defineMessage({\n            id: 'search_header.search',\n            defaultMessage: 'Search',\n        });\n    } else if (searchType === DataSearchTypes.FILES_SEARCH_TYPE && !isChannelFiles) {\n        noResultsProps.variant = NoResultsVariant.Files;\n        noResultsProps.titleValues = {searchTerm: `${searchTerms}`};\n        titleDescriptor = defineMessage({\n            id: 'search_header.results',\n            defaultMessage: 'Search Results',\n        });\n    } else {\n        noResultsProps.titleValues = {channelName: `${searchTerms}`};\n\n        titleDescriptor = defineMessage({\n            id: 'search_header.results',\n            defaultMessage: 'Search Results',\n        });\n    }\n\n    const formattedTitle = intl.formatMessage(titleDescriptor);\n\n    const handleOptionSelection = (term: string): void => {\n        handleSearchHintSelection();\n        updateSearchTerms(term);\n    };\n\n    switch (true) {\n    case isLoading:\n        contentItems = (\n            <div className='sidebar--right__subheader a11y__section'>\n                <div className='sidebar--right__loading'>\n                    <LoadingWrapper text={defineMessage({id: 'search_header.loading', defaultMessage: 'Searching'})}/>\n                </div>\n            </div>\n        );\n        break;\n    case (noResults && !searchTerms && !isMentionSearch && !isPinnedPosts && !isFlaggedPosts && !isChannelFiles):\n        contentItems = (\n            <div className='sidebar--right__subheader search__hints a11y__section'>\n                <SearchHint\n                    onOptionSelected={handleOptionSelection}\n                    options={searchHintOptions}\n                />\n            </div>\n        );\n        break;\n    case noResults && (searchType === DataSearchTypes.MESSAGES_SEARCH_TYPE && !isChannelFiles):\n        contentItems = (\n            <div\n                className={classNames([\n                    'sidebar--right__subheader a11y__section',\n                    {'sidebar-expanded': isSideBarExpanded},\n                ])}\n            >\n                <NoResultsIndicator\n                    style={{padding: '48px'}}\n                    {...noResultsProps}\n                />\n            </div>\n        );\n        break;\n    case noFileResults && (searchType === DataSearchTypes.FILES_SEARCH_TYPE || isChannelFiles):\n        contentItems = (\n            <div\n                className={classNames([\n                    'sidebar--right__subheader a11y__section',\n                    {'sidebar-expanded': isSideBarExpanded},\n                ])}\n            >\n                <NoResultsIndicator\n                    style={{padding: '48px'}}\n                    {...noResultsProps}\n                />\n            </div>\n        );\n        break;\n    default:\n        if (searchType === DataSearchTypes.FILES_SEARCH_TYPE || isChannelFiles) {\n            sortedResults = fileResults;\n        }\n\n        contentItems = sortedResults.map((item: Post|FileSearchResultItemType, index: number) => {\n            if (searchType === DataSearchTypes.MESSAGES_SEARCH_TYPE && !props.isChannelFiles) {\n                return (\n                    <PostSearchResultsItem\n                        key={item.id}\n                        post={item as Post}\n                        matches={props.matches[item.id]}\n                        searchTerm={searchTerms}\n                        isFlaggedPosts={props.isFlaggedPosts}\n                        isMentionSearch={props.isMentionSearch}\n                        isPinnedPosts={props.isPinnedPosts}\n                        a11yIndex={index}\n                    />\n                );\n            }\n            return (\n                <FileSearchResultItem\n                    key={item.id}\n                    channelId={item.channel_id}\n                    fileInfo={item as FileSearchResultItemType}\n                    teamName={props.currentTeamName}\n                    pluginMenuItems={filesDropdownPluginMenuItems}\n                />\n            );\n        });\n\n        loadingMorePostsComponent = (showLoadMore) ? (\n            <div className='loading-screen'>\n                <div className='loading__content'>\n                    <div className='round round-1'/>\n                    <div className='round round-2'/>\n                    <div className='round round-3'/>\n                </div>\n            </div>\n        ) : null;\n    }\n\n    return (\n        <div\n            id='searchContainer'\n            className='SearchResults sidebar-right__body'\n        >\n            <SearchResultsHeader>\n                <span>\n                    {formattedTitle}\n                </span>\n                {props.channelDisplayName && <div className='sidebar--right__title__channel'>{props.channelDisplayName}</div>}\n            </SearchResultsHeader>\n            {isMessagesSearch &&\n                <MessageOrFileSelector\n                    selected={searchType}\n                    selectedFilter={searchFilterType}\n                    isFileAttachmentsEnabled={isFileAttachmentsEnabled(config)}\n                    messagesCounter={isSearchAtEnd || props.searchPage === 0 ? `${results.length}` : `${results.length}+`}\n                    filesCounter={isSearchFilesAtEnd || props.searchPage === 0 ? `${fileResults.length}` : `${fileResults.length}+`}\n                    onChange={setSearchType}\n                    onFilter={setSearchFilterType}\n                    onTeamChange={setSearchTeam}\n                    crossTeamSearchEnabled={props.crossTeamSearchEnabled}\n                />}\n            {isChannelFiles &&\n                <div className='channel-files__header'>\n                    <div className='channel-files__title'>\n                        <FormattedMessage\n                            id='search_results.channel-files-header'\n                            defaultMessage='Recent files'\n                        />\n                    </div>\n                    <FilesFilterMenu\n                        selectedFilter={searchFilterType}\n                        onFilter={setSearchFilterType}\n                    />\n                </div>\n            }\n            <SearchLimitsBanner searchType={searchType}/>\n            <Scrollbars\n                ref={scrollbars}\n                autoHide={true}\n                autoHideTimeout={500}\n                autoHideDuration={500}\n                renderTrackVertical={renderTrackVertical}\n                renderThumbHorizontal={renderThumbHorizontal}\n                renderThumbVertical={renderThumbVertical}\n                renderView={renderView}\n                onScroll={handleScroll}\n            >\n                <div\n                    id='search-items-container'\n                    role='application'\n                    className={classNames([\n                        'search-items-container post-list__table a11y__region',\n                        {\n                            'no-results': (noResults && searchType === DataSearchTypes.MESSAGES_SEARCH_TYPE) || (noFileResults && (searchType === DataSearchTypes.FILES_SEARCH_TYPE || isChannelFiles)),\n                            'channel-files-container': isChannelFiles,\n                        },\n                    ])}\n                    data-a11y-sort-order='3'\n                    data-a11y-focus-child={true}\n                    data-a11y-loop-navigation={false}\n                    aria-label={intl.formatMessage({\n                        id: 'accessibility.sections.rhs',\n                        defaultMessage: '{regionTitle} complimentary region',\n                    }, {\n                        regionTitle: formattedTitle,\n                    })}\n                >\n                    {contentItems}\n                    {loadingMorePostsComponent}\n                </div>\n            </Scrollbars>\n        </div>\n    );\n};\n\nSearchResults.defaultProps = defaultProps;\n\nexport const arePropsEqual = (props: Props, nextProps: Props): boolean => {\n    // Shallow compare for all props except 'results' and 'fileResults'\n    for (const key in nextProps) {\n        if (!Object.hasOwn(nextProps, key) || key === 'results') {\n            continue;\n        }\n\n        if (!Object.hasOwn(nextProps, key) || key === 'fileResults') {\n            continue;\n        }\n\n        if (nextProps[key] !== props[key]) {\n            return false;\n        }\n    }\n\n    // Here we do a slightly deeper compare on 'results' because it is frequently a new\n    // array but without any actual changes\n    const {results} = props;\n    const {results: nextResults} = nextProps;\n\n    if (results.length !== nextResults.length) {\n        return false;\n    }\n\n    for (let i = 0; i < results.length; i++) {\n        // Only need a shallow compare on each post\n        if (results[i] !== nextResults[i]) {\n            return false;\n        }\n    }\n\n    // Here we do a slightly deeper compare on 'fileResults' because it is frequently a new\n    // array but without any actual changes\n    const {fileResults} = props;\n    const {fileResults: nextFileResults} = nextProps;\n\n    if (fileResults.length !== nextFileResults.length) {\n        return false;\n    }\n\n    for (let i = 0; i < fileResults.length; i++) {\n        // Only need a shallow compare on each file\n        if (fileResults[i] !== nextFileResults[i]) {\n            return false;\n        }\n    }\n\n    return true;\n};\n\nexport default React.memo(SearchResults, arePropsEqual);\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 {FileSearchResultItem} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getSearchFilesResults} from 'mattermost-redux/selectors/entities/files';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getSearchMatches, getSearchResults} from 'mattermost-redux/selectors/entities/posts';\nimport {getCurrentSearchForCurrentTeam} from 'mattermost-redux/selectors/entities/search';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {\n    getSearchResultsTerms,\n    getSearchResultsType,\n    getIsSearchingTerm,\n    getIsSearchingFlaggedPost,\n    getIsSearchingPinnedPost,\n    getIsSearchGettingMore,\n} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\n\nimport SearchResults from './search_results';\nimport type {StateProps, OwnProps} from './types';\n\nfunction makeMapStateToProps() {\n    let results: Post[];\n    let fileResults: FileSearchResultItem[];\n    let files: FileSearchResultItem[] = [];\n    let posts: Post[];\n\n    return function mapStateToProps(state: GlobalState) {\n        const config = getConfig(state);\n\n        const viewArchivedChannels = config.ExperimentalViewArchivedChannels === 'true';\n\n        const newResults = getSearchResults(state);\n\n        // Cache posts and channels\n        if (newResults && newResults !== results) {\n            results = newResults;\n\n            posts = [];\n            results.forEach((post) => {\n                if (!post) {\n                    return;\n                }\n\n                posts.push(post);\n            });\n        }\n\n        const newFilesResults = getSearchFilesResults(state);\n\n        // Cache files and channels\n        if (newFilesResults && newFilesResults !== fileResults) {\n            fileResults = newFilesResults;\n\n            files = [];\n            fileResults.forEach((file) => {\n                if (!file) {\n                    return;\n                }\n\n                const channel = getChannel(state, file.channel_id);\n                if (channel && channel.delete_at !== 0 && !viewArchivedChannels) {\n                    return;\n                }\n\n                files.push(file);\n            });\n        }\n\n        // this is basically a hack to make ts compiler happy\n        // add correct type when it is known what exactly is returned from the function\n        const currentSearch = (getCurrentSearchForCurrentTeam(state) as unknown as Record<string, any>) || {};\n        const currentTeamName = getCurrentTeam(state)?.name ?? '';\n\n        return {\n            results: posts,\n            fileResults: files,\n            matches: getSearchMatches(state),\n            searchTerms: getSearchResultsTerms(state),\n            searchSelectedType: getSearchResultsType(state),\n            isSearchingTerm: getIsSearchingTerm(state),\n            isSearchingFlaggedPost: getIsSearchingFlaggedPost(state),\n            isSearchingPinnedPost: getIsSearchingPinnedPost(state),\n            isSearchGettingMore: getIsSearchGettingMore(state),\n            isSearchAtEnd: currentSearch.isEnd,\n            isSearchFilesAtEnd: currentSearch.isFilesEnd,\n            searchPage: currentSearch.params?.page,\n            currentTeamName,\n        };\n    };\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport default connect<StateProps, {}, OwnProps, GlobalState>(makeMapStateToProps)(SearchResults);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {useEffect, useState, useRef} from 'react';\nimport type {ChangeEvent, MouseEvent, FormEvent} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport {getCurrentChannelNameForSearchShortcut} from 'mattermost-redux/selectors/entities/channels';\n\nimport HeaderIconWrapper from 'components/channel_header/components/header_icon_wrapper';\nimport UserGuideDropdown from 'components/search/user_guide_dropdown';\nimport SearchBar from 'components/search_bar/search_bar';\nimport SearchHint from 'components/search_hint/search_hint';\nimport SearchResults from 'components/search_results';\nimport type Provider from 'components/suggestion/provider';\nimport SearchChannelProvider from 'components/suggestion/search_channel_provider';\nimport SearchDateProvider from 'components/suggestion/search_date_provider';\nimport SearchUserProvider from 'components/suggestion/search_user_provider';\nimport FlagIcon from 'components/widgets/icons/flag_icon';\nimport MentionsIcon from 'components/widgets/icons/mentions_icon';\nimport SearchIcon from 'components/widgets/icons/search_icon';\nimport Popover from 'components/widgets/popover';\nimport {ShortcutKeys} from 'components/with_tooltip/tooltip_shortcut';\n\nimport Constants, {searchHintOptions, RHSStates, searchFilesHintOptions} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport {isServerVersionGreaterThanOrEqualTo} from 'utils/server_version';\nimport {isDesktopApp, getDesktopVersion, isMacApp} from 'utils/user_agent';\n\nimport type {SearchType} from 'types/store/rhs';\n\nimport type {Props, SearchFilterType} from './types';\n\nconst mentionsShortcut = {\n    default: [ShortcutKeys.ctrl, ShortcutKeys.shift, 'M'],\n    mac: [ShortcutKeys.cmd, ShortcutKeys.shift, 'M'],\n};\n\ninterface SearchHintOption {\n    searchTerm: string;\n    message: {\n        id: string;\n        defaultMessage: string;\n    };\n}\n\nconst determineVisibleSearchHintOptions = (searchTerms: string, searchType: SearchType): SearchHintOption[] => {\n    let newVisibleSearchHintOptions: SearchHintOption[] = [];\n    let options = searchHintOptions;\n    if (searchType === 'files') {\n        options = searchFilesHintOptions;\n    }\n\n    if (searchTerms.trim() === '') {\n        return options;\n    }\n\n    const pretextArray = searchTerms.split(/\\s+/g);\n    const pretext = pretextArray[pretextArray.length - 1];\n    const penultimatePretext = pretextArray[pretextArray.length - 2];\n\n    let shouldShowHintOptions: boolean;\n\n    if (penultimatePretext) {\n        shouldShowHintOptions = !(options.some(({searchTerm}) => penultimatePretext.toLowerCase().endsWith(searchTerm.toLowerCase())) && penultimatePretext !== '@');\n    } else {\n        shouldShowHintOptions = !options.some(({searchTerm}) => searchTerms.toLowerCase().endsWith(searchTerm.toLowerCase())) || searchTerms === '@';\n    }\n\n    if (shouldShowHintOptions) {\n        try {\n            newVisibleSearchHintOptions = options.filter((option) => {\n                if (pretext === '@' && option.searchTerm === 'From:') {\n                    return true;\n                }\n\n                return new RegExp(pretext, 'ig').\n                    test(option.searchTerm) && option.searchTerm.toLowerCase() !== pretext.toLowerCase();\n            });\n        } catch {\n            newVisibleSearchHintOptions = [];\n        }\n    }\n\n    return newVisibleSearchHintOptions;\n};\n\nconst Search: React.FC<Props> = (props: Props): JSX.Element => {\n    const {\n        actions,\n        currentChannel,\n        enableFindShortcut,\n        hideSearchBar,\n        isMobileView,\n        searchTerms,\n        searchType,\n        hideMobileSearchBarInRHS,\n    } = props;\n\n    const intl = useIntl();\n    const currentChannelName = useSelector(getCurrentChannelNameForSearchShortcut);\n\n    // generate intial component state and setters\n    const [focused, setFocused] = useState<boolean>(false);\n    const [dropdownFocused, setDropdownFocused] = useState<boolean>(false);\n    const [keepInputFocused, setKeepInputFocused] = useState<boolean>(false);\n    const [indexChangedViaKeyPress, setIndexChangedViaKeyPress] = useState<boolean>(false);\n    const [highlightedSearchHintIndex, setHighlightedSearchHintIndex] = useState<number>(-1);\n    const [visibleSearchHintOptions, setVisibleSearchHintOptions] = useState<SearchHintOption[]>(\n        determineVisibleSearchHintOptions(searchTerms, searchType),\n    );\n    const [searchFilterType, setSearchFilterType] = useState<SearchFilterType>('all');\n\n    const suggestionProviders = useRef<Provider[]>([\n        new SearchDateProvider(),\n        new SearchChannelProvider(actions.autocompleteChannelsForSearch),\n        new SearchUserProvider(actions.autocompleteUsersInTeam),\n    ]);\n\n    const isDesktop = isDesktopApp() && isServerVersionGreaterThanOrEqualTo(getDesktopVersion(), '4.7.0');\n    useEffect(() => {\n        if (!enableFindShortcut) {\n            return undefined;\n        }\n\n        const handleKeyDown = (e: KeyboardEvent) => {\n            if (Keyboard.cmdOrCtrlPressed(e) && Keyboard.isKeyPressed(e, Constants.KeyCodes.F)) {\n                if (!isDesktop && !e.shiftKey) {\n                    return;\n                }\n\n                // Special case for Mac Desktop xApp where Ctrl+Cmd+F triggers full screen view\n                if (isMacApp() && e.ctrlKey) {\n                    return;\n                }\n\n                e.preventDefault();\n                if (hideSearchBar) {\n                    actions.openRHSSearch();\n                    setKeepInputFocused(true);\n                }\n                if (currentChannelName) {\n                    actions.updateSearchTermsForShortcut();\n                }\n                handleFocus();\n            }\n        };\n\n        document.addEventListener('keydown', handleKeyDown);\n        return () => {\n            document.removeEventListener('keydown', handleKeyDown);\n        };\n    }, [hideSearchBar, currentChannelName]);\n\n    useEffect((): void => {\n        if (isMobileView && props.isSideBarRight) {\n            handleFocus();\n        }\n    }, [isMobileView, props.isSideBarRight]);\n\n    useEffect((): void => {\n        if (!isMobileView) {\n            setVisibleSearchHintOptions(determineVisibleSearchHintOptions(searchTerms, searchType));\n        }\n    }, [isMobileView, searchTerms, searchType]);\n\n    useEffect((): void => {\n        if (!isMobileView && focused && keepInputFocused) {\n            handleBlur();\n        }\n    }, [isMobileView, searchTerms]);\n\n    // handle cloding of rhs-flyout\n    const handleClose = (): void => actions.closeRightHandSide();\n\n    // focus the search input\n    const handleFocus = (): void => setFocused(true);\n\n    // release focus from the search input or unset `keepInputFocused` value\n    // `keepInputFocused` is used to keep the search input focused when a\n    // user selects a suggestion from `SearchHint` with a click\n    const handleBlur = (): void => {\n        // add time out so that the pinned and member buttons are clickable\n        // when focus is released from the search box.\n        setTimeout((): void => {\n            if (keepInputFocused) {\n                setKeepInputFocused(false);\n            } else {\n                setFocused(false);\n            }\n        }, 0);\n        updateHighlightedSearchHint();\n    };\n\n    const handleDropdownBlur = () => setDropdownFocused(false);\n\n    const handleDropdownFocus = () => setDropdownFocused(true);\n\n    const handleSearchHintSelection = (): void => {\n        if (focused) {\n            setKeepInputFocused(true);\n        } else {\n            setFocused(true);\n        }\n    };\n\n    const handleAddSearchTerm = (term: string): void => {\n        const pretextArray = searchTerms?.split(' ') || [];\n        pretextArray.pop();\n        pretextArray.push(term.toLowerCase());\n        handleUpdateSearchTerms(pretextArray.join(' '));\n    };\n\n    const handleUpdateSearchTeam = async (teamId: string) => {\n        actions.updateSearchTeam(teamId);\n        handleSearch().then(() => {\n            setKeepInputFocused(false);\n            setFocused(false);\n        });\n    };\n\n    const handleUpdateSearchTerms = (terms: string): void => {\n        actions.updateSearchTerms(terms);\n        updateHighlightedSearchHint();\n    };\n\n    const handleOnSearchTypeSelected = (searchType || searchTerms) ? undefined : (value: SearchType) => {\n        actions.updateSearchType(value);\n        if (!searchType) {\n            setDropdownFocused(false);\n        }\n        setFocused(true);\n    };\n\n    const handleChange = (e: ChangeEvent<HTMLInputElement>): void => {\n        const term = e.target.value;\n        actions.updateSearchTerms(term);\n    };\n\n    // call this function without parameters to reset `SearchHint`\n    const updateHighlightedSearchHint = (indexDelta = 0, changedViaKeyPress = false): void => {\n        if (Math.abs(indexDelta) > 1) {\n            return;\n        }\n\n        let newIndex = highlightedSearchHintIndex + indexDelta;\n\n        switch (indexDelta) {\n        case 1:\n            // KEY.DOWN\n            // is it at the end of the list?\n            newIndex = newIndex === visibleSearchHintOptions.length ? 0 : newIndex;\n            break;\n        case -1:\n            // KEY.UP\n            // is it at the start of the list (or initial value)?\n            newIndex = newIndex < 0 ? visibleSearchHintOptions.length - 1 : newIndex;\n            break;\n        case 0:\n        default:\n            // reset the index (e.g. on blur)\n            newIndex = -1;\n        }\n\n        setHighlightedSearchHintIndex(newIndex);\n        setIndexChangedViaKeyPress(changedViaKeyPress);\n    };\n\n    const handleEnterKey = (e: ChangeEvent<HTMLInputElement>): void => {\n        e.preventDefault();\n\n        if (indexChangedViaKeyPress) {\n            setKeepInputFocused(true);\n            if (!searchType && !searchTerms) {\n                actions.updateSearchType(highlightedSearchHintIndex === 0 ? 'messages' : 'files');\n                setHighlightedSearchHintIndex(-1);\n            } else {\n                handleAddSearchTerm(visibleSearchHintOptions[highlightedSearchHintIndex].searchTerm);\n            }\n            return;\n        }\n\n        if (props.isMentionSearch) {\n            actions.updateRhsState(RHSStates.SEARCH);\n        }\n\n        handleSearch().then(() => {\n            setKeepInputFocused(false);\n            setFocused(false);\n        });\n    };\n\n    const handleSubmit = (e: FormEvent<HTMLFormElement>): void => {\n        e.preventDefault();\n\n        handleSearch().then(() => {\n            setKeepInputFocused(false);\n            setFocused(false);\n        });\n    };\n\n    const handleSearch = async (): Promise<void> => {\n        const terms = searchTerms.trim();\n\n        if (terms.length === 0) {\n            return;\n        }\n\n        const {error} = await actions.showSearchResults(Boolean(props.isMentionSearch)) as any;\n\n        if (!error) {\n            handleSearchOnSuccess();\n        }\n    };\n\n    const handleSearchOnSuccess = (): void => {\n        if (isMobileView) {\n            handleClear();\n        }\n    };\n\n    const handleClear = (): void => {\n        if (props.isMentionSearch) {\n            setFocused(false);\n            actions.updateRhsState(RHSStates.SEARCH);\n        }\n        actions.updateSearchTerms('');\n        actions.updateSearchTeam(null);\n        actions.updateSearchType('');\n    };\n\n    const handleShrink = (): void => {\n        props.actions.setRhsExpanded(false);\n    };\n\n    const handleSetSearchFilter = (filterType: SearchFilterType): void => {\n        switch (filterType) {\n        case 'documents':\n            props.actions.filterFilesSearchByExt(['doc', 'pdf', 'docx', 'odt', 'rtf', 'txt']);\n            break;\n        case 'spreadsheets':\n            props.actions.filterFilesSearchByExt(['xls', 'xlsx', 'ods']);\n            break;\n        case 'presentations':\n            props.actions.filterFilesSearchByExt(['ppt', 'pptx', 'odp']);\n            break;\n        case 'code':\n            props.actions.filterFilesSearchByExt(['py', 'go', 'java', 'kt', 'c', 'cpp', 'h', 'html', 'js', 'ts', 'cs', 'vb', 'php', 'pl', 'r', 'rb', 'sql', 'swift', 'json']);\n            break;\n        case 'images':\n            props.actions.filterFilesSearchByExt(['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'svg', 'psd', 'xcf']);\n            break;\n        case 'audio':\n            props.actions.filterFilesSearchByExt(['ogg', 'mp3', 'wav', 'flac']);\n            break;\n        case 'video':\n            props.actions.filterFilesSearchByExt(['ogm', 'mp4', 'avi', 'webm', 'mov', 'mkv', 'mpeg', 'mpg']);\n            break;\n        default:\n            props.actions.filterFilesSearchByExt([]);\n        }\n        setSearchFilterType(filterType);\n        if (props.isChannelFiles && currentChannel) {\n            props.actions.showChannelFiles(currentChannel.id);\n        } else {\n            props.actions.showSearchResults(false);\n        }\n    };\n\n    const setHoverHintIndex = (_highlightedSearchHintIndex: number): void => {\n        setHighlightedSearchHintIndex(_highlightedSearchHintIndex);\n        setIndexChangedViaKeyPress(false);\n    };\n\n    const searchMentions = (e: MouseEvent<HTMLButtonElement>): void => {\n        e.preventDefault();\n        if (props.isMentionSearch) {\n            actions.closeRightHandSide();\n            return;\n        }\n        actions.showMentions();\n    };\n\n    const getFlagged = (e: MouseEvent<HTMLButtonElement>): void => {\n        e.preventDefault();\n        if (props.isFlaggedPosts) {\n            actions.closeRightHandSide();\n            return;\n        }\n        actions.showFlaggedPosts();\n    };\n\n    const searchButtonClick = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        actions.openRHSSearch();\n    };\n\n    const renderMentionButton = (): JSX.Element => (\n        <HeaderIconWrapper\n            buttonClass={classNames(\n                'channel-header__icon',\n                {'channel-header__icon--active': props.isMentionSearch},\n            )}\n            buttonId={props.isSideBarRight ? 'sbrChannelHeaderMentionButton' : 'channelHeaderMentionButton'}\n            onClick={searchMentions}\n            tooltip={intl.formatMessage({id: 'channel_header.recentMentions', defaultMessage: 'Recent mentions'})}\n            tooltipShortcut={mentionsShortcut}\n            isRhsOpen={props.isRhsOpen}\n        >\n            <MentionsIcon\n                className='icon icon--standard'\n                aria-hidden='true'\n            />\n        </HeaderIconWrapper>\n    );\n\n    const renderFlagBtn = (): JSX.Element => (\n        <HeaderIconWrapper\n            buttonClass={classNames(\n                'channel-header__icon ',\n                {'channel-header__icon--active': props.isFlaggedPosts},\n            )}\n            buttonId={props.isSideBarRight ? 'sbrChannelHeaderFlagButton' : 'channelHeaderFlagButton'}\n            onClick={getFlagged}\n            tooltip={intl.formatMessage({id: 'channel_header.flagged', defaultMessage: 'Saved messages'})}\n            isRhsOpen={props.isRhsOpen}\n        >\n            <FlagIcon className='icon icon--standard'/>\n        </HeaderIconWrapper>\n    );\n\n    const renderHintPopover = (): JSX.Element => {\n        let termsUsed = 0;\n\n        searchTerms?.split(/[: ]/g).forEach((word: string): void => {\n            let options = searchHintOptions;\n            if (searchType === 'files') {\n                options = searchFilesHintOptions;\n            }\n            if (options.some(({searchTerm}) => searchTerm.toLowerCase() === word.toLowerCase())) {\n                termsUsed++;\n            }\n        });\n\n        if (visibleSearchHintOptions.length === 0 || props.isMentionSearch) {\n            return <></>;\n        }\n\n        const helpClass = `search-help-popover${((dropdownFocused || focused) && termsUsed <= 2) ? ' visible' : ''}`;\n\n        return (\n            <Popover\n                id={`${props.isSideBarRight ? 'sbr-' : ''}searchbar-help-popup`}\n                placement='bottom'\n                className={helpClass}\n            >\n                <SearchHint\n                    options={visibleSearchHintOptions}\n                    withTitle={true}\n                    onOptionSelected={handleAddSearchTerm}\n                    onMouseDown={handleSearchHintSelection}\n                    highlightedIndex={highlightedSearchHintIndex}\n                    onOptionHover={setHoverHintIndex}\n                    onSearchTypeSelected={handleOnSearchTypeSelected}\n                    onElementBlur={handleDropdownBlur}\n                    onElementFocus={handleDropdownFocus}\n                    searchType={searchType}\n                />\n            </Popover>\n        );\n    };\n\n    const renderSearchBar = (): JSX.Element => (\n        <>\n            <div className='sidebar-collapse__container'>\n                <div\n                    id={props.isSideBarRight ? 'sbrSidebarCollapse' : 'sidebarCollapse'}\n                    className='sidebar-collapse'\n                    onClick={handleClose}\n                >\n                    <span\n                        className='fa fa-2x fa-angle-left'\n                        title={intl.formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n                    />\n                </div>\n            </div>\n            <SearchBar\n                updateHighlightedSearchHint={updateHighlightedSearchHint}\n                handleEnterKey={handleEnterKey}\n                handleClear={handleClear}\n                handleChange={handleChange}\n                handleSubmit={handleSubmit}\n                handleFocus={handleFocus}\n                handleBlur={handleBlur}\n                keepFocused={keepInputFocused}\n                setKeepFocused={setKeepInputFocused}\n                isFocused={focused}\n                suggestionProviders={suggestionProviders.current}\n                isSideBarRight={props.isSideBarRight}\n                isSearchingTerm={props.isSearchingTerm}\n                getFocus={props.getFocus}\n                searchTerms={searchTerms}\n                searchType={searchType}\n                clearSearchType={() => actions.updateSearchType('')}\n            >\n                {!props.isMobileView && renderHintPopover()}\n            </SearchBar>\n        </>\n    );\n\n    // when inserted in RHSSearchNav component, just return SearchBar\n    if (!props.isSideBarRight) {\n        if (hideSearchBar) {\n            return (\n                <HeaderIconWrapper\n                    buttonId={'channelHeaderSearchButton'}\n                    onClick={searchButtonClick}\n                    tooltip={intl.formatMessage({id: 'channel_header.search', defaultMessage: 'Search'})}\n                >\n                    <SearchIcon\n                        className='icon icon--standard'\n                        aria-hidden='true'\n                    />\n                </HeaderIconWrapper>\n            );\n        }\n\n        return (\n            <div\n                id='searchbarContainer'\n                className={'search-bar-container--global'}\n            >\n                <div className='sidebar-right__table'>\n                    {renderSearchBar()}\n                </div>\n            </div>\n        );\n    }\n\n    return (\n        <div className='sidebar--right__content'>\n            {!hideMobileSearchBarInRHS && (\n                <div className='search-bar__container channel-header alt'>\n                    <div className='sidebar-right__table'>\n                        {renderSearchBar()}\n                        {renderMentionButton()}\n                        {renderFlagBtn()}\n                        <UserGuideDropdown/>\n                    </div>\n                </div>\n            )}\n            {props.searchVisible ? (\n                <SearchResults\n                    isMentionSearch={props.isMentionSearch}\n                    isFlaggedPosts={props.isFlaggedPosts}\n                    isPinnedPosts={props.isPinnedPosts}\n                    isChannelFiles={props.isChannelFiles}\n                    shrink={handleShrink}\n                    channelDisplayName={props.channelDisplayName}\n                    isOpened={props.isSideBarRightOpen}\n                    updateSearchTerms={handleAddSearchTerm}\n                    updateSearchTeam={handleUpdateSearchTeam}\n                    handleSearchHintSelection={handleSearchHintSelection}\n                    isSideBarExpanded={props.isRhsExpanded}\n                    getMorePostsForSearch={props.actions.getMorePostsForSearch}\n                    getMoreFilesForSearch={props.actions.getMoreFilesForSearch}\n                    setSearchFilterType={handleSetSearchFilter}\n                    searchFilterType={searchFilterType}\n                    setSearchType={(value: SearchType) => actions.updateSearchType(value)}\n                    searchType={searchType || 'messages'}\n                    crossTeamSearchEnabled={props.crossTeamSearchEnabled}\n                />\n            ) : props.children}\n        </div>\n    );\n};\n\nconst defaultProps: Partial<Props> = {\n    searchTerms: '',\n    channelDisplayName: '',\n    isSideBarRight: false,\n    hideMobileSearchBarInRHS: false,\n    getFocus: () => {},\n};\n\nSearch.defaultProps = defaultProps;\n\nexport default React.memo(Search);\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 {getMorePostsForSearch, getMoreFilesForSearch} from 'mattermost-redux/actions/search';\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getFeatureFlagValue} from 'mattermost-redux/selectors/entities/general';\n\nimport {autocompleteChannelsForSearch} from 'actions/channel_actions';\nimport {autocompleteUsersInTeam} from 'actions/user_actions';\nimport {\n    updateSearchTerms,\n    updateSearchTeam,\n    updateSearchTermsForShortcut,\n    showSearchResults,\n    showChannelFiles,\n    showMentions,\n    showFlaggedPosts,\n    closeRightHandSide,\n    updateRhsState,\n    setRhsExpanded,\n    openRHSSearch,\n    filterFilesSearchByExt,\n    updateSearchType,\n} from 'actions/views/rhs';\nimport {getRhsState, getSearchTeam, getSearchTerms, getSearchType, getIsSearchingTerm, getIsRhsOpen, getIsRhsExpanded} from 'selectors/rhs';\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport Search from './search';\n\nfunction mapStateToProps(state: GlobalState) {\n    const rhsState = getRhsState(state);\n    const currentChannel = getCurrentChannel(state);\n    const isMobileView = getIsMobileView(state);\n    const isRhsOpen = getIsRhsOpen(state);\n\n    let searchTeam = getSearchTeam(state);\n    if (!searchTeam) {\n        searchTeam = currentChannel?.team_id || '';\n    }\n\n    return {\n        currentChannel,\n        isRhsExpanded: getIsRhsExpanded(state),\n        isRhsOpen,\n        isSearchingTerm: getIsSearchingTerm(state),\n        searchTerms: getSearchTerms(state),\n        searchTeam,\n        searchType: getSearchType(state),\n        searchVisible: rhsState !== null && (![\n            RHSStates.PLUGIN,\n            RHSStates.CHANNEL_INFO,\n            RHSStates.CHANNEL_MEMBERS,\n            RHSStates.EDIT_HISTORY,\n        ].includes(rhsState)),\n        hideMobileSearchBarInRHS: isMobileView && isRhsOpen && rhsState === RHSStates.CHANNEL_INFO,\n        isMentionSearch: rhsState === RHSStates.MENTION,\n        isFlaggedPosts: rhsState === RHSStates.FLAG,\n        isPinnedPosts: rhsState === RHSStates.PIN,\n        isChannelFiles: rhsState === RHSStates.CHANNEL_FILES,\n        isMobileView,\n        crossTeamSearchEnabled: getFeatureFlagValue(state, 'ExperimentalCrossTeamSearch') === 'true',\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateSearchTerms,\n            updateSearchTeam,\n            updateSearchTermsForShortcut,\n            updateSearchType,\n            showSearchResults,\n            showChannelFiles,\n            showMentions,\n            showFlaggedPosts,\n            setRhsExpanded,\n            closeRightHandSide,\n            autocompleteChannelsForSearch,\n            autocompleteUsersInTeam,\n            updateRhsState,\n            getMorePostsForSearch,\n            openRHSSearch,\n            getMoreFilesForSearch,\n            filterFilesSearchByExt,\n        }, dispatch),\n    };\n}\nexport default connect(mapStateToProps, mapDispatchToProps)(Search);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport SearchResultsHeader from 'components/search_results_header';\n\nimport Pluggable from 'plugins/pluggable';\n\nexport type Props = {\n    showPluggable: boolean;\n    pluggableId: string;\n    title: React.ReactNode;\n}\n\nconst RhsPlugin = ({showPluggable, pluggableId, title}: Props) => {\n    return (\n        <div\n            id='rhsContainer'\n            className='sidebar-right__body'\n        >\n            <SearchResultsHeader>\n                {title}\n            </SearchResultsHeader>\n            {\n                showPluggable &&\n                <Pluggable\n                    pluggableName='RightHandSidebarComponent'\n                    pluggableId={pluggableId}\n                />\n            }\n        </div>\n    );\n};\n\nexport default React.memo(RhsPlugin);\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 {getPluggableId} from 'selectors/rhs';\n\nimport type {GlobalState} from 'types/store';\nimport type {PluginComponent} from 'types/store/plugins';\n\nimport RHSPlugin from './rhs_plugin';\n\nfunction mapStateToProps(state: GlobalState) {\n    const rhsPlugins: PluginComponent[] = state.plugins.components.RightHandSidebarComponent;\n    const pluggableId = getPluggableId(state);\n    const pluginComponent = rhsPlugins.find((element: PluginComponent) => element.id === pluggableId);\n    const pluginTitle = pluginComponent ? pluginComponent.title : '';\n\n    return {\n        showPluggable: Boolean(pluginComponent),\n        pluggableId,\n        title: pluginTitle,\n    };\n}\n\nexport default connect(mapStateToProps)(RHSPlugin);\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 type {Channel} from '@mattermost/types/channels';\nimport type {ProductIdentifier} from '@mattermost/types/products';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {trackEvent} from 'actions/telemetry_actions.jsx';\n\nimport ChannelInfoRhs from 'components/channel_info_rhs';\nimport ChannelMembersRhs from 'components/channel_members_rhs';\nimport FileUploadOverlay from 'components/file_upload_overlay';\nimport {DropOverlayIdRHS} from 'components/file_upload_overlay/file_upload_overlay';\nimport LoadingScreen from 'components/loading_screen';\nimport PostEditHistory from 'components/post_edit_history';\nimport ResizableRhs from 'components/resizable_sidebar/resizable_rhs';\nimport RhsCard from 'components/rhs_card';\nimport RhsThread from 'components/rhs_thread';\nimport Search from 'components/search/index';\n\nimport RhsPlugin from 'plugins/rhs_plugin';\nimport a11yController from 'utils/a11y_controller_instance';\nimport type {A11yFocusEventDetail} from 'utils/constants';\nimport Constants, {A11yCustomEventTypes} from 'utils/constants';\nimport {cmdOrCtrlPressed, isKeyPressed} from 'utils/keyboard';\nimport {isMac} from 'utils/user_agent';\n\nimport type {RhsState} from 'types/store/rhs';\n\nexport type Props = {\n    isExpanded: boolean;\n    isOpen: boolean;\n    channel?: Channel;\n    team?: Team;\n    teamId: Team['id'];\n    productId: ProductIdentifier;\n    postRightVisible: boolean;\n    postCardVisible: boolean;\n    searchVisible: boolean;\n    isPinnedPosts: boolean;\n    isChannelFiles: boolean;\n    isChannelInfo: boolean;\n    isChannelMembers: boolean;\n    isPluginView: boolean;\n    isPostEditHistory: boolean;\n    previousRhsState: RhsState;\n    rhsChannel?: Channel;\n    selectedPostId: string;\n    selectedPostCardId: string;\n    isSavedPosts?: boolean;\n    isRecentMentions?: boolean;\n    actions: {\n        setRhsExpanded: (expanded: boolean) => void;\n        showPinnedPosts: (channelId: string) => void;\n        openRHSSearch: () => void;\n        closeRightHandSide: () => void;\n        openAtPrevious: (previous: Partial<Props> | undefined) => void;\n        updateSearchTerms: (terms: string) => void;\n        showChannelFiles: (channelId: string) => void;\n        showChannelInfo: (channelId: string) => void;\n    };\n}\n\ntype State = {\n    isOpened: boolean;\n}\n\nexport default class SidebarRight extends React.PureComponent<Props, State> {\n    sidebarRight: React.RefObject<HTMLDivElement>;\n    sidebarRightWidthHolder: React.RefObject<HTMLDivElement>;\n    previous: Partial<Props> | undefined = undefined;\n    focusSearchBar?: () => void;\n    private previousActiveElement: HTMLElement | null = null;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.sidebarRightWidthHolder = React.createRef<HTMLDivElement>();\n        this.sidebarRight = React.createRef<HTMLDivElement>();\n        this.state = {\n            isOpened: false,\n        };\n    }\n\n    setPrevious = () => {\n        if (!this.props.isOpen) {\n            return;\n        }\n\n        this.previous = {\n            searchVisible: this.props.searchVisible,\n            isPinnedPosts: this.props.isPinnedPosts,\n            isRecentMentions: this.props.isRecentMentions,\n            isSavedPosts: this.props.isSavedPosts,\n            isChannelFiles: this.props.isChannelFiles,\n            isChannelInfo: this.props.isChannelInfo,\n            isChannelMembers: this.props.isChannelMembers,\n            isPostEditHistory: this.props.isPostEditHistory,\n            selectedPostId: this.props.selectedPostId,\n            selectedPostCardId: this.props.selectedPostCardId,\n            previousRhsState: this.props.previousRhsState,\n        };\n    };\n\n    handleShortcut = (e: KeyboardEvent) => {\n        const channelInfoShortcutMac = isMac() && e.shiftKey;\n        const channelInfoShortcut = !isMac() && e.altKey;\n\n        if (cmdOrCtrlPressed(e, true)) {\n            if (e.shiftKey && isKeyPressed(e, Constants.KeyCodes.PERIOD)) {\n                e.preventDefault();\n                if (this.props.isOpen) {\n                    if (this.props.isExpanded) {\n                        this.props.actions.setRhsExpanded(false);\n                    } else {\n                        this.props.actions.setRhsExpanded(true);\n                    }\n                } else {\n                    this.props.actions.openAtPrevious(this.previous);\n                }\n            } else if (isKeyPressed(e, Constants.KeyCodes.PERIOD)) {\n                e.preventDefault();\n                if (this.props.isOpen) {\n                    this.props.actions.closeRightHandSide();\n                } else {\n                    this.props.actions.openAtPrevious(this.previous);\n                }\n            } else if (isKeyPressed(e, Constants.KeyCodes.I) && (channelInfoShortcutMac || channelInfoShortcut)) {\n                e.preventDefault();\n                if (this.props.isOpen && this.props.isChannelInfo) {\n                    this.props.actions.closeRightHandSide();\n                } else if (this.props.channel) {\n                    this.props.actions.showChannelInfo(this.props.channel.id);\n                }\n            }\n        }\n    };\n\n    handleRHSFocus(prevProps: Props) {\n        const wasOpen = prevProps.isOpen;\n        const isOpen = this.props.isOpen;\n\n        const contentChanged = (\n            (this.props.isPinnedPosts !== prevProps.isPinnedPosts) ||\n            (this.props.isRecentMentions !== prevProps.isRecentMentions) ||\n            (this.props.isSavedPosts !== prevProps.isSavedPosts) ||\n            (this.props.isChannelFiles !== prevProps.isChannelFiles) ||\n            (this.props.isChannelInfo !== prevProps.isChannelInfo) ||\n            (this.props.isChannelMembers !== prevProps.isChannelMembers) ||\n            (this.props.isPostEditHistory !== prevProps.isPostEditHistory) ||\n            (this.props.rhsChannel?.id !== prevProps.rhsChannel?.id) ||\n            (this.props.teamId !== prevProps.teamId)\n        );\n\n        if (this.props.isOpen && (contentChanged || (!wasOpen && isOpen))) {\n            this.previousActiveElement = document.activeElement as HTMLElement;\n            requestAnimationFrame(() => {\n                if (this.sidebarRight.current) {\n                    document.dispatchEvent(\n                        new CustomEvent<A11yFocusEventDetail>(A11yCustomEventTypes.FOCUS, {\n                            detail: {\n                                target: this.sidebarRight.current,\n                                keyboardOnly: false,\n                            },\n                        }),\n                    );\n                }\n            });\n        } else if (!this.props.isOpen && wasOpen) {\n            // RHS just was closed, restore focus to the previous element had it\n            // this will have to change for upcoming work specially for search and probalby plugins\n            if (a11yController.originElement) {\n                a11yController.restoreOriginFocus();\n            } else {\n                requestAnimationFrame(() => {\n                    if (this.previousActiveElement) {\n                        document.dispatchEvent(\n                            new CustomEvent<A11yFocusEventDetail>(A11yCustomEventTypes.FOCUS, {\n                                detail: {\n                                    target: this.previousActiveElement,\n                                    keyboardOnly: false,\n                                },\n                            }),\n                        );\n                        this.previousActiveElement = null;\n                    }\n                });\n            }\n        }\n    }\n\n    componentDidMount() {\n        document.addEventListener('keydown', this.handleShortcut);\n        document.addEventListener('mousedown', this.handleClickOutside);\n    }\n\n    componentWillUnmount() {\n        document.removeEventListener('keydown', this.handleShortcut);\n        document.removeEventListener('mousedown', this.handleClickOutside);\n    }\n\n    componentDidUpdate(prevProps: Props) {\n        const wasOpen = prevProps.searchVisible || prevProps.postRightVisible;\n        const isOpen = this.props.searchVisible || this.props.postRightVisible;\n\n        if (!wasOpen && isOpen) {\n            trackEvent('ui', 'ui_rhs_opened');\n        }\n\n        this.handleRHSFocus(prevProps);\n\n        const {actions, isChannelFiles, isPinnedPosts, rhsChannel, channel} = this.props;\n        if (isPinnedPosts && prevProps.isPinnedPosts === isPinnedPosts && rhsChannel && rhsChannel.id !== prevProps.rhsChannel?.id) {\n            actions.showPinnedPosts(rhsChannel.id);\n        }\n\n        if (isChannelFiles && prevProps.isChannelFiles === isChannelFiles && rhsChannel && rhsChannel.id !== prevProps.rhsChannel?.id) {\n            actions.showChannelFiles(rhsChannel.id);\n        }\n\n        // in the case of navigating to another channel\n        // or from global threads to a channel\n        // we shrink the sidebar\n        if (\n            (channel && prevProps.channel && (channel.id !== prevProps.channel.id)) ||\n            (channel && !prevProps.channel)\n        ) {\n            this.props.actions.setRhsExpanded(false);\n        }\n\n        // close when changing products or teams\n        if (\n            (prevProps.teamId && this.props.teamId !== prevProps.teamId) ||\n            this.props.productId !== prevProps.productId\n        ) {\n            this.props.actions.closeRightHandSide();\n        }\n\n        this.setPrevious();\n    }\n\n    handleClickOutside = (e: MouseEvent) => {\n        if (\n            (this.props.isOpen && this.props.isExpanded) && // can be collapsed\n            e.target && // has target\n            document.getElementById('root')?.contains(e.target as Element) &&//  within Root\n            !this.sidebarRight.current?.contains(e.target as Element) && // not within RHS\n            !document.getElementById('global-header')?.contains(e.target as Element) && // not within Global Header\n            !document.querySelector('.app-bar')?.contains(e.target as Element) // not within App Bar\n        ) {\n            this.props.actions.setRhsExpanded(false);\n        }\n    };\n\n    handleUpdateSearchTerms = (term: string) => {\n        this.props.actions.updateSearchTerms(term);\n        this.focusSearchBar?.();\n    };\n\n    getSearchBarFocus = (focusSearchBar: () => void) => {\n        this.focusSearchBar = focusSearchBar;\n    };\n\n    render() {\n        const {\n            team,\n            channel,\n            rhsChannel,\n            postRightVisible,\n            postCardVisible,\n            previousRhsState,\n            searchVisible,\n            isPluginView,\n            isOpen,\n            isChannelInfo,\n            isChannelMembers,\n            isExpanded,\n            isPostEditHistory,\n        } = this.props;\n\n        if (!isOpen) {\n            return null;\n        }\n\n        const teamNeeded = true;\n        let selectedChannelNeeded;\n        let currentChannelNeeded;\n        let content = null;\n\n        if (postRightVisible) {\n            selectedChannelNeeded = true;\n            content = (\n                <div className='post-right__container'>\n                    <FileUploadOverlay\n                        overlayType='right'\n                        id={DropOverlayIdRHS}\n                    />\n                    <RhsThread previousRhsState={previousRhsState}/>\n                </div>\n            );\n        } else if (postCardVisible) {\n            content = <RhsCard previousRhsState={previousRhsState}/>;\n        } else if (isPluginView) {\n            content = <RhsPlugin/>;\n        } else if (isChannelInfo) {\n            currentChannelNeeded = true;\n            content = <ChannelInfoRhs/>;\n        } else if (isChannelMembers) {\n            currentChannelNeeded = true;\n            content = <ChannelMembersRhs/>;\n        } else if (isPostEditHistory) {\n            content = <PostEditHistory/>;\n        }\n\n        const isRHSLoading = Boolean(\n            (teamNeeded && !team) ||\n            (selectedChannelNeeded && !rhsChannel) ||\n            (currentChannelNeeded && !channel),\n        );\n\n        const channelDisplayName = rhsChannel ? rhsChannel.display_name : '';\n\n        const isSidebarRightExpanded = (postRightVisible || postCardVisible || isPluginView || searchVisible || isPostEditHistory) && isExpanded;\n        const containerClassName = classNames('sidebar--right', 'move--left is-open', {\n            'sidebar--right--expanded expanded': isSidebarRightExpanded,\n        });\n\n        return (\n            <>\n                <div\n                    className={'sidebar--right sidebar--right--width-holder'}\n                    ref={this.sidebarRightWidthHolder}\n                />\n                <ResizableRhs\n                    className={containerClassName}\n                    id='sidebar-right'\n                    role='complementary'\n                    rightWidthHolderRef={this.sidebarRightWidthHolder}\n                >\n                    <div\n                        tabIndex={-1}\n                        className='sidebar-right-container'\n                        ref={this.sidebarRight}\n                    >\n                        {isRHSLoading ? (\n                            <div className='sidebar-right__body'>\n                                {/* Sometimes the channel/team is not loaded yet, so we need to wait for it */}\n                                <LoadingScreen centered={true}/>\n                            </div>\n                        ) : (\n                            <Search\n                                isSideBarRight={true}\n                                isSideBarRightOpen={true}\n                                getFocus={this.getSearchBarFocus}\n                                channelDisplayName={channelDisplayName}\n                            >\n                                {content}\n                            </Search>\n                        )}\n                    </div>\n                </ResizableRhs>\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 {withRouter} from 'react-router-dom';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {getCurrentChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {setRhsExpanded, showChannelInfo, showPinnedPosts, showChannelFiles, openRHSSearch, closeRightHandSide, openAtPrevious, updateSearchTerms} from 'actions/views/rhs';\nimport {selectCurrentProductId} from 'selectors/products';\nimport {\n    getIsRhsExpanded,\n    getIsRhsOpen,\n    getRhsState,\n    getSelectedChannel,\n    getSelectedPostId,\n    getSelectedPostCardId,\n    getPreviousRhsState,\n} from 'selectors/rhs';\n\nimport {RHSStates} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport SidebarRight from './sidebar_right';\n\nfunction mapStateToProps(state: GlobalState, props: RouteComponentProps) {\n    const rhsState = getRhsState(state);\n    const channel = getCurrentChannel(state);\n    const team = getCurrentTeam(state);\n    const teamId = team?.id ?? '';\n    const productId = selectCurrentProductId(state, props.location.pathname);\n\n    const selectedPostId = getSelectedPostId(state);\n    const selectedPostCardId = getSelectedPostCardId(state);\n\n    return {\n        isExpanded: getIsRhsExpanded(state),\n        isOpen: getIsRhsOpen(state),\n        channel,\n        postRightVisible: Boolean(selectedPostId) && rhsState !== RHSStates.EDIT_HISTORY,\n        postCardVisible: Boolean(selectedPostCardId),\n        searchVisible: Boolean(rhsState) && rhsState !== RHSStates.PLUGIN,\n        previousRhsState: getPreviousRhsState(state),\n        isPinnedPosts: rhsState === RHSStates.PIN,\n        isChannelFiles: rhsState === RHSStates.CHANNEL_FILES,\n        isChannelInfo: rhsState === RHSStates.CHANNEL_INFO,\n        isChannelMembers: rhsState === RHSStates.CHANNEL_MEMBERS,\n        isPluginView: rhsState === RHSStates.PLUGIN,\n        isPostEditHistory: rhsState === RHSStates.EDIT_HISTORY,\n        isRecentMention: rhsState === RHSStates.MENTION,\n        isSavedPosts: rhsState === RHSStates.FLAG,\n        rhsChannel: getSelectedChannel(state),\n        selectedPostId,\n        selectedPostCardId,\n        team,\n        teamId,\n        productId,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            setRhsExpanded,\n            showPinnedPosts,\n            openRHSSearch,\n            closeRightHandSide,\n            openAtPrevious,\n            updateSearchTerms,\n            showChannelFiles,\n            showChannelInfo,\n        }, dispatch),\n    };\n}\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SidebarRight));\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 MentionsIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='12px'\n                height='12px'\n                viewBox='0 0 18 18'\n                version='1.1'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.mention', defaultMessage: 'Mention Icon'})}\n                fill='inherit'\n            >\n                <path d='M9 11.7C9.72 11.7 10.35 11.43 10.89 10.89C11.43 10.35 11.7 9.71999 11.7 8.99999C11.7 8.27999 11.43 7.64999 10.89 7.10999C10.35 6.56999 9.72 6.29999 9 6.29999C8.28 6.29999 7.65 6.56999 7.11 7.10999C6.57 7.64999 6.3 8.27999 6.3 8.99999C6.3 9.71999 6.57 10.35 7.11 10.89C7.65 11.43 8.28 11.7 9 11.7ZM9 -1.26362e-05C11.46 -1.26362e-05 13.56 0.869987 15.3 2.60999C16.176 3.48599 16.842 4.45199 17.298 5.50799C17.766 6.59999 18 7.76399 18 8.99999V10.26C18 10.692 17.916 11.118 17.748 11.538C17.592 11.922 17.376 12.276 17.1 12.6C16.788 12.912 16.446 13.14 16.074 13.284C15.714 13.428 15.306 13.5 14.85 13.5C13.746 13.5 12.876 13.05 12.24 12.15C11.34 13.05 10.26 13.5 9 13.5C7.716 13.5 6.666 13.05 5.85 12.15C4.95 11.25 4.5 10.2 4.5 8.99999C4.5 7.70399 4.95 6.65399 5.85 5.84999C6.666 4.94999 7.716 4.49999 9 4.49999C10.296 4.49999 11.346 4.94999 12.15 5.84999C13.05 6.74999 13.5 7.79999 13.5 8.99999V10.26C13.5 10.44 13.536 10.614 13.608 10.782C13.692 10.95 13.8 11.106 13.932 11.25C14.076 11.382 14.232 11.49 14.4 11.574C14.568 11.658 14.718 11.7 14.85 11.7C15.03 11.7 15.204 11.664 15.372 11.592C15.54 11.508 15.696 11.394 15.84 11.25C16.08 11.01 16.2 10.68 16.2 10.26V8.99999C16.2 7.01999 15.48 5.30999 14.04 3.86999C13.332 3.16199 12.564 2.63999 11.736 2.30399C10.908 1.96799 9.996 1.79999 9 1.79999C7.056 1.79999 5.346 2.48999 3.87 3.86999C3.174 4.52999 2.652 5.30399 2.304 6.19199C1.968 7.04399 1.8 7.97999 1.8 8.99999C1.8 9.98399 1.974 10.902 2.322 11.754C2.67 12.594 3.186 13.356 3.87 14.04C4.554 14.724 5.328 15.252 6.192 15.624C7.092 16.008 8.028 16.2 9 16.2H13.5V18H9C7.752 18 6.6 17.772 5.544 17.316C4.488 16.872 3.51 16.2 2.61 15.3C1.71 14.4 1.05 13.44 0.63 12.42C0.21 11.4 0 10.266 0 9.01799C0 7.75799 0.222 6.59399 0.666 5.52599C1.098 4.49399 1.746 3.52199 2.61 2.60999C4.266 0.869987 6.396 -1.26362e-05 9 -1.26362e-05Z'/>\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 React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function SearchIcon(props: React.HTMLAttributes<HTMLSpanElement>) {\n    const {formatMessage} = useIntl();\n    return (\n        <span {...props}>\n            <svg\n                width='16px'\n                height='16px'\n                viewBox='0 0 17 17'\n                role='img'\n                aria-label={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n            >\n                <path d='M16.398 15.138L13.014 11.754C13.458 11.178 13.8 10.548 14.04 9.86399C14.28 9.14399 14.4 8.40599 14.4 7.64999C14.4 6.42599 14.094 5.29199 13.482 4.24799C12.882 3.22799 12.072 2.41799 11.052 1.81799C10.008 1.20599 8.874 0.899988 7.65 0.899988C6.426 0.899988 5.292 1.20599 4.248 1.81799C3.228 2.41799 2.418 3.22799 1.818 4.24799C1.206 5.29199 0.9 6.42599 0.9 7.64999C0.9 8.87399 1.206 10.008 1.818 11.052C2.418 12.072 3.228 12.882 4.248 13.482C5.292 14.094 6.426 14.4 7.65 14.4C8.406 14.4 9.138 14.274 9.846 14.022C10.53 13.794 11.16 13.458 11.736 13.014L15.138 16.398C15.306 16.566 15.516 16.65 15.768 16.65C16.02 16.65 16.23 16.56 16.398 16.38C16.566 16.212 16.65 16.008 16.65 15.768C16.65 15.528 16.566 15.318 16.398 15.138ZM2.7 7.64999C2.7 6.74999 2.922 5.92199 3.366 5.16599C3.81 4.40999 4.41 3.80999 5.166 3.36599C5.922 2.92199 6.75 2.69999 7.65 2.69999C8.55 2.69999 9.378 2.92199 10.134 3.36599C10.89 3.80999 11.49 4.40999 11.934 5.16599C12.378 5.92199 12.6 6.74999 12.6 7.64999C12.6 8.54999 12.378 9.37799 11.934 10.134C11.49 10.89 10.89 11.49 10.134 11.934C9.378 12.378 8.55 12.6 7.65 12.6C6.75 12.6 5.922 12.378 5.166 11.934C4.41 11.49 3.81 10.89 3.366 10.134C2.922 9.37799 2.7 8.54999 2.7 7.64999Z'/>\n            </svg>\n        </span>\n    );\n}\n"],"names":["NewChannelWithBoardTourTip","_ref","pulsatingDotPlacement","pulsatingDotTranslate","dispatch","useDispatch","showTip","useSelector","showNewChannelWithBoardPulsatingDot","title","React","FormattedMessage","id","defaultMessage","screen","tipOpened","setTipOpened","useState","handleDismiss","useCallback","e","stopPropagation","setNewChannelWithBoardPreference","Preferences","NEW_CHANNEL_WITH_BOARD_TOUR_SHOWED","handleOpen","preventDefault","overlayPunchOut","useMeasurePunchouts","y","height","x","width","TourTip","show","placement","step","singleTip","showOptOut","interactivePunchOut","handlePrevious","offset","propTypes","_pt","isRequired","HeaderIconWrapper","props","ariaLabelOverride","buttonClass","buttonId","children","onClick","tooltip","tooltipText","tooltipShortcut","isRhsOpen","pluginId","boardsEnabled","suitePluginIds","focalboard","ariaLabelText","WithTooltip","shortcut","className","DEFAULT_COPY_TIMEOUT","useCopyText","text","successCopyTimeout","successCopyTimeoutReceived","trackCallback","copiedRecently","setCopiedRecently","copyError","setCopyError","timerRef","useRef","current","clearTimeout","clipboard","navigator","writeText","then","catch","textField","document","createElement","innerText","style","position","opacity","body","appendChild","select","success","execCommand","err","remove","setTimeout","messages","defineMessages","copy","copied","AlertSvg","toString","viewBox","fill","xmlns","rx","fillOpacity","d","stroke","strokeOpacity","strokeWidth","strokeLinecap","EditButton","styled","withConfig","displayName","EmptyPlace","EditableAreaBase","editable","content","emptyLabel","onEdit","formatMessage","useIntl","allowEditArea","LineLimiterBase","maxLines","lineHeight","moreText","lessText","errorMargin","maxLineHeight","needLimiter","setNeedLimiter","open","setOpen","maxHeight","setMaxHeight","ref","useEffect","contentHeight","scrollHeight","concat","CSSTransition","in","timeout","classNames","ToggleButton","ChannelId","ChannelPurpose","ChannelDescriptionHeading","ChannelHeader","AboutAreaChannel","channel","canEditChannelProperties","actions","purpose","EditableArea","LineLimiter","Markdown","message","editChannelPurpose","header","editChannelHeader","Username","UserInfoContainer","UserAvatar","UserInfo","UsernameContainer","UserPosition","AboutAreaDM","dmUser","ProfilePicture","src","Client4","getProfilePictureUrl","user","last_picture_update","isBot","is_bot","status","undefined","username","display_name","userId","channelId","size","BotTag","is_guest","GuestTag","bot_description","Usernames","ProfilePictures","ProfilePictureContainer","UsersArea","AboutAreaGM","gmUsers","map","idx","key","i","_ref2","length","UserProfileElement","Container","AboutArea","type","Constants","DM_CHANNEL","GM_CHANNEL","OPEN_CHANNEL","PRIVATE_CHANNEL","includes","Icon","HeaderTitle","Header","isArchived","isMobile","onClose","MenuItemContainer","MenuItemText","RightSide","Badge","MenuItem","icon","opensSubpanel","badge","hasRightSide","Menu","channelStats","loadingStats","setLoadingStats","showNotificationPreferences","showMembers","fileCount","files_count","getChannelStats","openNotificationSettings","member_count","showChannelMembers","pinnedpost_count","showPinnedPosts","LoadingSpinner","showChannelFiles","ChannelInfoRhsTopButtons","Button","CopyButton","TopButtons","channelType","channelURL","isFavorite","isMuted","isInvitingPeople","canAddPeople","propsCanAddPeople","copyLink","canCopyLink","favoriteIcon","favoriteText","mutedIcon","mutedText","copyIcon","copyText","toggleFavorite","toggleMute","addPeople","Divider","ChannelInfoRhs","currentTeam","currentUser","channelMembers","canManageMembers","canManageProperties","currentUserId","getSiteURL","name","filter","closeRightHandSide","unfavoriteChannel","favoriteChannel","unmuteChannel","muteChannel","openModal","modalId","ModalIdentifiers","CREATE_DM_CHANNEL","dialogType","MoreDirectChannels","dialogProps","isExistingChannel","CHANNEL_INVITE","ChannelInviteModal","EDIT_CHANNEL_HEADER","EditChannelHeaderModal","EDIT_CHANNEL_PURPOSE","EditChannelPurposeModal","CHANNEL_NOTIFICATIONS","ChannelNotificationsModal","memo","EMPTY_CHANNEL_STATS","guest_count","connect","state","getCurrentChannel","getCurrentUser","getCurrentTeam","getCurrentChannelStats","isCurrentChannelArchived","isCurrentChannelFavorite","isCurrentChannelMuted","isModalOpen","getIsMobileView","isPrivate","haveIChannelPermission","Permissions","MANAGE_PRIVATE_CHANNEL_MEMBERS","MANAGE_PUBLIC_CHANNEL_MEMBERS","MANAGE_PRIVATE_CHANNEL_PROPERTIES","MANAGE_PUBLIC_CHANNEL_PROPERTIES","getProfilesInCurrentChannel","getUser","getUserIdFromChannelId","getDisplayNameByUser","isGuest","roles","getStatusForUserId","bindActionCreators","RHS","Title","Actions","ButtonIcon","ActionBar","membersCount","editing","showManageButton","handleShortcut","isKeyPressed","KeyCodes","ESCAPE","stopEditing","addEventListener","removeEventListener","values","members_count","startEditing","inviteMembers","canGoBack","goBack","SearchBar","terms","onInput","inputSuffix","Input","value","currentTarget","inputPrefix","placeholder","useLegend","MembersContainer","ListItemType","ChannelMembersRHS","currentUserIsChannelAdmin","searchTerms","teamUrl","history","useHistory","list","setList","page","setPage","isNextPageLoading","setIsNextPageLoading","searching","isDefaultChannel","DEFAULT_CHANNEL","showSearch","setChannelMembersRhsSearchTerm","listcp","memberDone","_member$membership2","member","_member$membership","membership","scheme_admin","push","FirstSeparator","data","FirstMemberListSeparator","Separator","MemberListSeparator","Member","JSON","stringify","rhsAction","loadProfilesAndReloadChannelMembers","ProfilesInChannelSortBy","Admin","loadMyChannelMemberAndRole","doSearch","debounce","async","searchProfilesAndChannelMembers","in_team_id","team_id","in_channel_id","SEARCH_TIMEOUT_MILLISECONDS","openDirectMessage","openDirectChannelToUserId","loadMore","setEditChannelMembers","AlertContainer","AlertBanner","mode","variant","link","msg","ExternalLink","href","location","MemberList","members","hasNextPage","buildProfileList","profilesInCurrentChannel","userStatuses","teammateNameDisplaySetting","membersInCurrentChannel","forEach","profile","displayUsername","sort","a","b","_a$membership","_b$membership","_a$membership2","localeCompare","getProfiles","createSelector","getActiveProfilesInCurrentChannelWithoutSorting","getUserStatuses","getTeammateNameDisplaySetting","getMembersInCurrentChannel","searchProfiles","search","searchActiveProfilesInCurrentChannel","getMyCurrentChannelMembership","channelAdmins","views","channelMembersRhsSearch","trim","getCurrentRelativeTeamUrl","prevRhsState","getPreviousRhsState","hasInfoPrevState","RHSStates","CHANNEL_INFO","CHANNEL_FILES","PIN","Boolean","getIsEditingMembers","SearchResultsHeader","showExpand","previousRhsState","sidebarTooltipContent","isExpanded","KeyboardShortcutSequence","KEYBOARD_SHORTCUTS","navExpandSidebar","hideDescription","isInsideTooltip","toggleRhsExpanded","CHANNEL_MEMBERS","getIsRhsExpanded","getCurrentChannelId","InfoToast","onExited","closeToast","undoTodo","_content$undo","undo","call","toastContainerClassname","timer","mountOnEnter","unmountOnExit","appear","modalMessages","titleQuestion","RestorePostModal","post","postHeader","onHide","modalHeaderText","GenericModal","compassDesign","enforceFocus","handleCancel","cancelButtonClassName","handleConfirm","handleRestore","PostMessageView","overflowType","showPostEditedIndicator","FileAttachmentListContainer","isEditHistory","disableDownload","disableActions","DATE_RANGES","RelativeRanges","itemMessages","helpText","currentVersionText","ariaLabelMessage","EditedPostItem","_post$props","isCurrent","postCurrentVersion","theme","connectionId","getConnectionId","openRestorePostModal","restorePostModalData","RESTORE_POST_MODAL","restorePostVersion","original_id","showInfoTooltip","infoToastModalData","INFO_TOAST","CheckIcon","handleUndo","StoragePrefixes","EDIT_DRAFT","removeDraft","channel_id","root_id","result","getPostEditHistory","previousPostVersion","currentVersionIndicator","profileSrc","imageURLForUser","user_id","overwriteName","ensureString","override_username","Avatar","url","UserProfileComponent","disablePopover","PostMessageContainer","isRHS","isFileDeleted","delete_at","messageContainer","restoreButton","postContainerClass","timeStampValue","edit_at","create_at","CompassThemeProvider","togglePost","prevState","PostAriaLabelDiv","Timestamp","ranges","selectedPostId","getSelectedPostId","getTheme","getPost","editPost","renderView","Object","assign","renderThumbHorizontal","renderThumbVertical","PostEditHistory","channelDisplayName","originalPost","postEditHistory","setPostEditHistory","hasError","setHasError","isLoading","setIsLoading","scrollbars","retrieveErrorHeading","retrieveErrorSubheading","_scrollbars$current","fetchPostEditHistory","scrollToTop","errorContainer","AlertIcon","LoadingScreen","display","placeContent","flex","postEditItems","postEdited","Scrollbars","autoHide","autoHideTimeout","autoHideDuration","_getCurrentChannel","getChannel","ResizableRhs","role","rightWidthHolderRef","containerRef","rhsSize","getRhsSize","isRhsExpanded","previousRhsExpanded","setPreviousRhsExpanded","defaultWidth","RHS_MIN_MAX_WIDTH","default","shouldRhsOverlap","shouldRhsOverlapChannelView","handleResizeEnd","_","cssVarProp","rightWidthHolderRefElement","removeProperty","containerRefElement","classList","add","ResizableDivider","globalCssVar","CssVarKeyForResizable","dir","ResizeDirection","RIGHT","disabled","onResize","handleResize","cssVarValue","setProperty","onResizeEnd","onDividerDoubleClick","handleDividerDoubleClick","RhsCardHeader","constructor","arguments","_defineProperty","this","SEARCH","showSearchResults","MENTION","showMentions","FLAG","showFlaggedPosts","render","back","expandSidebarTooltip","shrinkSidebarTooltip","handleBack","intl","injectIntl","RhsCard","super","isScrolling","setState","scrollStopAction","fireAfter","SCROLL_DELAY","isMobileView","emitCloseRightHandSide","DelayedAction","handleScrollStop","shouldComponentUpdate","nextProps","nextState","_nextProps$selected","_nextProps$selected$p","_this$props$selected","_this$props$selected$","deepEqual","selected","card","pluginPostCardTypes","postType","hasOwn","PluginComponent","component","_selected$props","UserProfile","hideStatus","overrideUsername","enablePostUsernameOverride","avatar","PostProfilePicture","compactDisplay","onScroll","handleScroll","Link","to","handleClick","getSelectedPostCard","getConfig","EnablePostUsernameOverride","plugins","postCardTypes","translate","CRTThreadsPaneTutorialTip","getCurrentUserId","dimensions","useFollowElementDimensions","onDismiss","preferences","category","CRT_THREAD_PANE_STEP","CrtThreadPaneSteps","FINISHED","savePreferences","handleNext","nextBtn","RhsHeaderPost","setRhsExpanded","relativeTeamUrl","getHistory","rootPostId","currentTeamId","isFollowingThread","setThreadFollow","closeSidebarTooltip","backToResultsTooltip","rhsHeaderTooltipContent","channelName","handleJumpClick","isCollapsedThreadsEnabled","FollowButton","isFollowing","handleFollowChange","showThreadsTutorialTip","getThreadOrSynthetic","makeGetThreadOrSynthetic","collapsedThreads","root","tipStep","getInt","thread","is_following","reply_count","currentUserMentionKeys","getCurrentUserMentionKeys","rootMessageMentionKeys","allAtMentions","matchUserMentionTriggersWithMessageMentions","THREADS_PANE_POPOVER","onboardingTourTipsEnabled","getCurrentTeamId","RhsThread","ThreadViewer","useRelativeTimestamp","isThreadView","getSelectedPost","getSelectedChannel","UserGuideIcon","UserGuideDropdown","KEYBOARD_SHORTCUTS_MODAL","KeyboardShortcutsModal","menuActive","buttonActive","trackEvent","Group","enableAskCommunityLink","ItemExternalLink","askTheCommunityClick","helpLink","reportAProblemLink","ItemAction","openKeyboardShortcutsModal","MenuWrapper","onToggle","buttonToggleState","openLeft","openUp","ariaLabel","renderDropdownItems","HelpLink","ReportAProblemLink","EnableAskCommunityLink","SearchSuggestionList","SuggestionList","_this$itemsContainerR","_this$itemsContainerR2","itemsContainerRef","parentNode","popoverRef","suggestionReadOut","currentLabel","generateLabel","item","first_name","last_name","nickname","toLowerCase","announceLabel","renderChannelDivider","items","haveDMDivider","term","isSelection","selection","Component","components","renderDividers","currentItem","itemRefs","set","matchedPretext","onCompleteWord","onMouseMove","onItemHover","Popover","SuggestionDate","preventClose","handleEscape","date","label","searchForm","overflow","isFocused","keepFocused","suggestionProviders","searchRef","_searchRef$current","focus","_searchRef$current2","blur","endsWith","_searchRef$current3","isSideBarRight","onSubmit","handleSubmit","autoComplete","searchType","onMouseDown","handleFocus","setKeepFocused","clearSearchType","SuggestionBox","node","getFocus","tabIndex","containerClass","onFocus","onBlur","handleBlur","onChange","handleChange","onKeyDown","_searchRef$current4","Keyboard","DOWN","updateHighlightedSearchHint","UP","ENTER","handleEnterKey","BACKSPACE","listComponent","dateComponent","providers","delayInputUpdate","clearable","onClear","handleClear","isSearchingTerm","defaultProps","SearchHint","config","isFileAttachmentEnabled","isFileAttachmentsEnabled","onSearchTypeSelected","chunks","highlighted","highlightedIndex","onElementBlur","onElementFocus","withTitle","onTouchEnd","options","option","optionIndex","searchTerm","onOptionSelected","onMouseOver","onOptionHover","handleOnOptionHover","additionalDisplay","FILE_TOOLTIP_RANGES","FileSearchResultItem","teamName","fileInfo","post_id","copyToClipboard","keepOpen","_this$props$pluginMen","pluginItems","pluginMenuItems","match","_item$action","action","FILE_PREVIEW_MODAL","FilePreviewModal","fileInfos","postId","startIndex","showPreview","FileThumbnail","Tag","fileSizeToString","defineMessage","stopPropagationOnToggle","jumpToConv","localizeMessage","renderPluginItems","getFileDownloadUrl","ownProps","FilesFilterMenu","IconContainer","selectedFilter","FilterVariantIcon","color","onFilter","MessagesOrFilesSelector","teams","getMyTeams","searchTeam","getSearchTeam","team","messagesCounter","filesCounter","crossTeamSearchEnabled","onTeamChange","target","PostSearchResultsItem","PostComponent","matches","isFlaggedPosts","isPinnedPosts","isMentionSearch","a11yIndex","Locations","StyledDiv","StyledA","InnerDiv","SearchLimitsBanner","_cloudLimits$files","_cloudLimits$messages","formatNumber","openPricingModal","useOpenPricingModal","usage","useGetUsage","cloudLimits","useGetLimits","isAdminUser","isAdmin","isCurrentLicenseCloud","currentFileStorageUsage","files","totalStorage","fileStorageLimit","total_storage","currentMessagesUsage","messagesLimit","ctaAction","renderBanner","bannerText","DataSearchTypes","FILES_SEARCH_TYPE","storage","asGBString","trackingLocation","MESSAGES_SEARCH_TYPE","renderTrackVertical","SearchResults","setSearchType","filesDropdownPluginMenuItems","getFilesDropdownPluginMenuItems","searchFilterType","setSearchFilterType","searchSelectedType","searchPage","isChannelFiles","getMorePostsForSearch","getMoreFilesForSearch","loadMorePosts","loadMoreFiles","results","fileResults","isCard","isSearchAtEnd","isSearchFilesAtEnd","isSearchingFlaggedPost","isSearchingPinnedPost","isSideBarExpanded","isOpened","updateSearchTerms","handleSearchHintSelection","noResults","Array","isArray","noFileResults","showLoadMore","isMessagesSearch","contentItems","loadingMorePostsComponent","titleDescriptor","sortedResults","noResultsProps","NoResultsVariant","ChannelSearch","Mentions","FlaggedPosts","subtitleValues","buttonText","PinnedPosts","postA","postB","ChannelFiles","ChannelFilesFiltered","titleValues","Files","formattedTitle","handleOptionSelection","LoadingWrapper","searchHintOptions","NoResultsIndicator","padding","index","currentTeamName","MessageOrFileSelector","teamId","updateSearchTeam","isSearchGettingMore","_scrollbars$current2","_scrollbars$current3","_scrollbars$current4","getScrollHeight","getScrollTop","getClientHeight","regionTitle","arePropsEqual","nextResults","nextFileResults","posts","_getCurrentTeam$name","_getCurrentTeam","_currentSearch$params","viewArchivedChannels","ExperimentalViewArchivedChannels","newResults","getSearchResults","newFilesResults","getSearchFilesResults","file","currentSearch","getCurrentSearchForCurrentTeam","getSearchMatches","getSearchResultsTerms","getSearchResultsType","getIsSearchingTerm","getIsSearchingFlaggedPost","getIsSearchingPinnedPost","getIsSearchGettingMore","isEnd","isFilesEnd","params","mentionsShortcut","ShortcutKeys","ctrl","shift","mac","cmd","determineVisibleSearchHintOptions","newVisibleSearchHintOptions","searchFilesHintOptions","pretextArray","split","pretext","penultimatePretext","shouldShowHintOptions","some","RegExp","test","_unused","Search","currentChannel","enableFindShortcut","hideSearchBar","hideMobileSearchBarInRHS","currentChannelName","getCurrentChannelNameForSearchShortcut","focused","setFocused","dropdownFocused","setDropdownFocused","keepInputFocused","setKeepInputFocused","indexChangedViaKeyPress","setIndexChangedViaKeyPress","highlightedSearchHintIndex","setHighlightedSearchHintIndex","visibleSearchHintOptions","setVisibleSearchHintOptions","SearchDateProvider","SearchChannelProvider","autocompleteChannelsForSearch","SearchUserProvider","autocompleteUsersInTeam","isDesktop","isDesktopApp","isServerVersionGreaterThanOrEqualTo","getDesktopVersion","handleKeyDown","F","shiftKey","isMacApp","ctrlKey","openRHSSearch","updateSearchTermsForShortcut","handleClose","handleDropdownBlur","handleDropdownFocus","handleAddSearchTerm","pop","handleUpdateSearchTerms","join","handleOnSearchTypeSelected","updateSearchType","indexDelta","changedViaKeyPress","Math","abs","newIndex","updateRhsState","handleSearch","error","handleSearchOnSuccess","setHoverHintIndex","_highlightedSearchHintIndex","renderSearchBar","renderHintPopover","termsUsed","word","_ref3","helpClass","MentionsIcon","FlagIcon","searchVisible","shrink","handleShrink","isSideBarRightOpen","filterType","filterFilesSearchByExt","SearchIcon","rhsState","getRhsState","getIsRhsOpen","getSearchTerms","getSearchType","PLUGIN","EDIT_HISTORY","getFeatureFlagValue","RhsPlugin","showPluggable","pluggableId","Pluggable","pluggableName","rhsPlugins","RightHandSidebarComponent","getPluggableId","pluginComponent","find","element","pluginTitle","RHSPlugin","SidebarRight","isOpen","previous","isRecentMentions","isSavedPosts","isChannelInfo","isChannelMembers","isPostEditHistory","selectedPostCardId","channelInfoShortcutMac","isMac","channelInfoShortcut","altKey","cmdOrCtrlPressed","PERIOD","openAtPrevious","I","showChannelInfo","_document$getElementB","_this$sidebarRight$cu","_document$getElementB2","_document$querySelect","getElementById","contains","sidebarRight","querySelector","_this$focusSearchBar","focusSearchBar","sidebarRightWidthHolder","handleRHSFocus","prevProps","_this$props$rhsChanne","_prevProps$rhsChannel","wasOpen","contentChanged","rhsChannel","previousActiveElement","activeElement","requestAnimationFrame","dispatchEvent","CustomEvent","A11yCustomEventTypes","FOCUS","detail","keyboardOnly","a11yController","originElement","restoreOriginFocus","componentDidMount","handleClickOutside","componentWillUnmount","componentDidUpdate","_prevProps$rhsChannel2","_prevProps$rhsChannel3","postRightVisible","productId","setPrevious","postCardVisible","isPluginView","selectedChannelNeeded","currentChannelNeeded","FileUploadOverlay","overlayType","DropOverlayIdRHS","ChannelMembersRhs","isRHSLoading","isSidebarRightExpanded","containerClassName","centered","getSearchBarFocus","withRouter","_team$id","selectCurrentProductId","pathname","getSelectedPostCardId","isRecentMention","version"],"sourceRoot":""}

VaKeR 2022