![]() 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 : /proc/self/root/opt/mattermost/client/ |
Upload File : |
{"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":""}