![]() 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":"595.f7c88065f129463c3e17.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/components/widgets/icons/fa_back_icon.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_navbar.tsx","webpack://mattermost-webapp/./src/components/integrations/delete_integration_link/delete_integration_link.tsx","webpack://mattermost-webapp/./src/components/integrations/delete_integration_link/index.ts","webpack://mattermost-webapp/./src/components/emoji/emoji_list_item/delete_emoji_button.tsx","webpack://mattermost-webapp/./src/components/emoji/emoji_list_item/emoji_list_item.tsx","webpack://mattermost-webapp/./src/components/emoji/emoji_list_item/index.ts","webpack://mattermost-webapp/./src/components/emoji/emoji_list/emoji_list.tsx","webpack://mattermost-webapp/./src/components/emoji/emoji_list/index.ts","webpack://mattermost-webapp/./src/components/emoji/emoji_page.tsx","webpack://mattermost-webapp/./src/components/emoji/index.ts","webpack://mattermost-webapp/./src/components/backstage/components/backstage_header.tsx","webpack://mattermost-webapp/./src/components/emoji/add_emoji/add_emoji.tsx","webpack://mattermost-webapp/./src/components/emoji/add_emoji/index.ts","webpack://mattermost-webapp/./src/components/integrations/integration_option.tsx","webpack://mattermost-webapp/./src/components/integrations/integrations.tsx","webpack://mattermost-webapp/./src/components/integrations/index.ts","webpack://mattermost-webapp/./src/components/channel_select/channel_select.tsx","webpack://mattermost-webapp/./src/components/channel_select/index.ts","webpack://mattermost-webapp/./src/components/integrations/abstract_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_incoming_webhook/add_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_incoming_webhook/index.ts","webpack://mattermost-webapp/./src/components/integrations/abstract_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/add_oauth_app/add_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/add_oauth_app/index.ts","webpack://mattermost-webapp/./src/components/integrations/abstract_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_outgoing_webhook/add_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_outgoing_webhook/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/bots.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/integrations.ts","webpack://mattermost-webapp/./src/components/backstage/components/backstage_list.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/bot.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/bots.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/index.ts","webpack://mattermost-webapp/./src/components/integrations/bots/add_bot/add_bot.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/add_bot/index.ts","webpack://mattermost-webapp/./src/actions/integration_actions.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/oauth_connection_audience_input.tsx","webpack://mattermost-webapp/./src/components/integrations/abstract_command.tsx","webpack://mattermost-webapp/./src/components/integrations/add_command/add_command.tsx","webpack://mattermost-webapp/./src/components/integrations/add_command/index.ts","webpack://mattermost-webapp/./src/components/copy_text.tsx","webpack://mattermost-webapp/./src/components/integrations/confirm_integration/confirm_integration.tsx","webpack://mattermost-webapp/./src/components/integrations/confirm_integration/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_command/edit_command.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_command/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_command.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_commands/installed_commands.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_commands/index.ts","webpack://mattermost-webapp/./src/components/integrations/commands_container/commands_container.tsx","webpack://mattermost-webapp/./src/components/integrations/commands_container/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_incoming_webhook/edit_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_incoming_webhook/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_oauth_app/edit_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_oauth_app/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_outgoing_webhook/edit_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_outgoing_webhook/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_incoming_webhooks/installed_incoming_webhooks.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_incoming_webhooks/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_app/installed_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_app/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_apps/installed_oauth_apps.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_apps/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_outgoing_webhooks/installed_outgoing_webhooks.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_outgoing_webhooks/index.ts","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/abstract_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/add_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/edit_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/installed_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/installed_outgoing_oauth_connections.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_category.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_section.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_sidebar.tsx","webpack://mattermost-webapp/./src/components/backstage/backstage_controller.tsx","webpack://mattermost-webapp/./src/components/backstage/index.ts","webpack://mattermost-webapp/./src/components/form_error.tsx","webpack://mattermost-webapp/./src/components/localized_placeholder_input.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_next_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_previous_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_search_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_warning_icon.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/bots.ts"],"sourcesContent":["// 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 BackIcon() {\n const {formatMessage} = useIntl();\n return (\n <i\n className='fa fa-angle-left'\n title={formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n />\n );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackIcon from 'components/widgets/icons/fa_back_icon';\n\ntype Props = {\n team?: Team;\n siteName?: string;\n}\n\nconst BackstageNavbar = ({team, siteName}: Props) => {\n const teamExists = team?.delete_at === 0;\n\n return (\n <div className='backstage-navbar'>\n <Link\n className='backstage-navbar__back'\n to={`/${teamExists ? team?.name : ''}`}\n >\n <BackIcon/>\n <span>\n {teamExists ? (\n <FormattedMessage\n id='backstage_navbar.backToMattermost'\n defaultMessage='Back to {siteName}'\n values={{siteName: siteName ?? team?.name}}\n />\n ) : (\n <FormattedMessage\n id='backstage_navbar.back'\n defaultMessage='Back'\n />\n )}\n </span>\n </Link>\n </div>\n );\n};\n\nexport default BackstageNavbar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {openModal as openModalAction} from 'actions/views/modals';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nconst ModalId = 'delete_integration_confirm';\n\ntype Props = {\n confirmButtonText?: React.ReactNode;\n linkText?: React.ReactNode;\n subtitleText?: React.ReactNode;\n modalMessage?: React.ReactNode;\n modalTitle?: React.ReactNode;\n onDelete: () => void;\n openModal: typeof openModalAction;\n};\n\nexport default function DeleteIntegrationLink(props: Props) {\n const {\n confirmButtonText = (\n <FormattedMessage\n id='integrations.delete.confirm.button'\n defaultMessage='Yes, delete it'\n />\n ),\n linkText = (\n <FormattedMessage\n id='installed_integrations.delete'\n defaultMessage='Delete'\n />\n ),\n modalMessage,\n modalTitle = (\n <FormattedMessage\n id='integrations.delete.confirm.title'\n defaultMessage='Delete Integration'\n />\n ),\n onDelete,\n openModal,\n } = props;\n\n const onClick = useCallback(() => {\n openModal({\n modalId: ModalId,\n dialogProps: {\n confirmButtonText,\n confirmButtonClass: 'btn btn-danger',\n modalClass: 'integrations-backstage-modal',\n message: (\n <>\n {props.subtitleText && (\n <p>\n {props.subtitleText}\n </p>\n )}\n <div className='alert alert-danger'>\n <WarningIcon additionalClassName='mr-1'/>\n <strong>\n {props.modalMessage}\n </strong>\n </div>\n </>\n ),\n onConfirm: onDelete,\n title: modalTitle,\n },\n dialogType: ConfirmModalRedux,\n });\n }, [confirmButtonText, modalMessage, modalTitle, onDelete, openModal]);\n\n return (\n <button\n className='color--link style--none'\n onClick={onClick}\n >\n {linkText}\n </button>\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 {openModal} from 'actions/views/modals';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\nconst mapDispatchToProps = {\n openModal,\n};\n\nexport default connect(null, mapDispatchToProps)(DeleteIntegrationLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport DeleteIntegrationLink from 'components/integrations/delete_integration_link';\n\ntype Props = {\n onDelete: () => void;\n}\n\nexport default function DeleteEmojiButton(props: Props) {\n return (\n <DeleteIntegrationLink\n confirmButtonText={\n <FormattedMessage\n id='emoji_list.delete.confirm.button'\n defaultMessage='Delete'\n />\n }\n linkText={\n <FormattedMessage\n id='emoji_list.delete'\n defaultMessage='Delete'\n />\n }\n modalMessage={\n <FormattedMessage\n id='emoji_list.delete.confirm.msg'\n defaultMessage='This action permanently deletes the custom emoji. Are you sure you want to delete it?'\n />\n }\n modalTitle={\n <FormattedMessage\n id='emoji_list.delete.confirm.title'\n defaultMessage='Delete Custom Emoji'\n />\n }\n onDelete={props.onDelete}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\n\nimport {Client4} from 'mattermost-redux/client';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate';\n\nimport DeleteEmojiButton from './delete_emoji_button';\n\nexport type Props = {\n emoji?: CustomEmoji;\n emojiId?: string;\n currentUserId?: string;\n creatorDisplayName?: string;\n creatorUsername?: string;\n onDelete?: (emojiId: string) => void;\n actions: {\n deleteCustomEmoji: (emojiId: string) => void;\n };\n};\n\nconst DELETE_PERMISSION = [Permissions.DELETE_EMOJIS];\nconst DELETE_OTHER_PERMISSION = [Permissions.DELETE_OTHERS_EMOJIS];\n\nconst EmojiListItem = ({\n actions: {\n deleteCustomEmoji,\n },\n onDelete,\n emoji = {} as CustomEmoji,\n creatorUsername,\n currentUserId = '',\n creatorDisplayName = '',\n}: Props) => {\n const emoticonStyle = useMemo(() => {\n return {backgroundImage: `url(${Client4.getCustomEmojiImageUrl(emoji.id)})`};\n }, [emoji.id]);\n\n const handleDelete = useCallback((): void => {\n if (!emoji) {\n return;\n }\n if (onDelete) {\n onDelete(emoji.id);\n }\n deleteCustomEmoji(emoji.id);\n }, [deleteCustomEmoji, emoji, onDelete]);\n\n let displayName = creatorDisplayName;\n if (creatorUsername && creatorUsername !== displayName) {\n displayName += ' (@' + creatorUsername + ')';\n }\n\n let deleteButton = <DeleteEmojiButton onDelete={handleDelete}/>;\n\n if (emoji.creator_id === currentUserId) {\n deleteButton = (\n <AnyTeamPermissionGate permissions={DELETE_PERMISSION}>\n {deleteButton}\n </AnyTeamPermissionGate>\n );\n } else {\n deleteButton = (\n <AnyTeamPermissionGate permissions={DELETE_PERMISSION}>\n <AnyTeamPermissionGate permissions={DELETE_OTHER_PERMISSION}>\n {deleteButton}\n </AnyTeamPermissionGate>\n </AnyTeamPermissionGate>\n );\n }\n\n return (\n <tr className='backstage-list__item'>\n <td className='emoji-list__name'>{':' + emoji.name + ':'}</td>\n <td className='emoji-list__image'>\n <span\n className='emoticon'\n style={emoticonStyle}\n />\n </td>\n <td className='emoji-list__creator'>{displayName}</td>\n <td className='emoji-list-item_actions'>{deleteButton}</td>\n </tr>\n );\n};\n\nexport default React.memo(EmojiListItem);\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 {deleteCustomEmoji} from 'mattermost-redux/actions/emojis';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {getDisplayNameByUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport EmojiListItem from './emoji_list_item';\nimport type {Props} from './emoji_list_item';\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const emoji = state.entities.emojis.customEmoji[ownProps.emojiId!];\n const creator = getUser(state, emoji.creator_id);\n\n return {\n emoji,\n creatorDisplayName: getDisplayNameByUser(state, creator),\n creatorUsername: creator ? creator.username : '',\n currentUserId: getCurrentUserId(state),\n currentTeam: getCurrentTeam(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n deleteCustomEmoji,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiListItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, ChangeEventHandler} from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\n\nimport {deleteCustomEmoji} from 'mattermost-redux/actions/emojis';\nimport {Emoji} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport EmojiListItem from 'components/emoji/emoji_list_item';\nimport LoadingScreen from 'components/loading_screen';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport SaveButton from 'components/save_button';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport SearchIcon from 'components/widgets/icons/fa_search_icon';\n\nconst EMOJI_PER_PAGE = 50;\nconst EMOJI_SEARCH_DELAY_MILLISECONDS = 200;\n\nexport interface Props {\n\n /**\n * Custom emojis on the system.\n */\n emojiIds: string[];\n\n /**\n * Function to scroll list to top.\n */\n scrollToTop: () => void;\n actions: {\n\n /**\n * Get pages of custom emojis.\n */\n getCustomEmojis: (page?: number, perPage?: number, sort?: string, loadUsers?: boolean) => Promise<ActionResult<CustomEmoji[]>>;\n\n /**\n * Search custom emojis.\n */\n searchCustomEmojis: (term: string, options: any, loadUsers: boolean) => Promise<ActionResult<CustomEmoji[]>>;\n };\n\n}\n\ninterface State {\n loading: boolean;\n page: number;\n nextLoading: boolean;\n searchEmojis: string[] | null;\n missingPages: boolean;\n}\n\nexport default class EmojiList extends React.PureComponent<Props, State> {\n private searchTimeout: NodeJS.Timeout | null;\n\n constructor(props: Props) {\n super(props);\n this.searchTimeout = null;\n this.state = {\n loading: true,\n page: 0,\n nextLoading: false,\n searchEmojis: null,\n missingPages: true,\n };\n }\n\n async componentDidMount(): Promise<void> {\n this.props.actions.getCustomEmojis(0, EMOJI_PER_PAGE + 1, Emoji.SORT_BY_NAME, true).\n then(({data}: ActionResult<CustomEmoji[]>) => {\n this.setState({loading: false});\n if (data && data.length < EMOJI_PER_PAGE) {\n this.setState({missingPages: false});\n }\n });\n }\n\n nextPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n if (e) {\n e.preventDefault();\n }\n\n const next = this.state.page + 1;\n this.setState({nextLoading: true});\n this.props.actions.getCustomEmojis(next, EMOJI_PER_PAGE, Emoji.SORT_BY_NAME, true).\n then(({data}: ActionResult<CustomEmoji[]>) => {\n this.setState({page: next, nextLoading: false});\n if (data && data.length < EMOJI_PER_PAGE) {\n this.setState({missingPages: false});\n }\n\n this.props.scrollToTop();\n });\n };\n previousPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n if (e) {\n e.preventDefault();\n }\n\n this.setState({\n page: this.state.page - 1,\n nextLoading: false,\n missingPages: true,\n });\n\n this.props.scrollToTop();\n };\n\n onSearchChange: ChangeEventHandler = (e: ChangeEvent): void => {\n if (!e || !e.target) {\n return;\n }\n\n const term = (e.target as HTMLInputElement).value || '';\n\n clearTimeout(this.searchTimeout!);\n\n this.searchTimeout = setTimeout(async () => {\n if (term.trim() === '') {\n this.setState({searchEmojis: null, page: 0});\n return;\n }\n\n this.setState({loading: true});\n\n const {data} = await this.props.actions.searchCustomEmojis(\n term,\n {},\n true,\n );\n\n if (data) {\n this.setState({\n searchEmojis: data.map((em: CustomEmoji) => em.id),\n loading: false,\n });\n } else {\n this.setState({searchEmojis: [], loading: false});\n }\n }, EMOJI_SEARCH_DELAY_MILLISECONDS);\n };\n\n deleteFromSearch = (emojiId: string): void => {\n if (!this.state.searchEmojis) {\n return;\n }\n\n const index = this.state.searchEmojis.indexOf(emojiId);\n\n if (index < 0) {\n return;\n }\n\n const newSearchEmojis = [...this.state.searchEmojis];\n newSearchEmojis.splice(index, 1);\n this.setState({searchEmojis: newSearchEmojis});\n };\n\n render(): JSX.Element {\n const searchEmojis = this.state.searchEmojis;\n const emojis = [];\n let nextButton;\n let previousButton;\n\n if (this.state.loading) {\n emojis.push(\n <tr\n key='loading'\n className='backstage-list__item backstage-list__empty'\n >\n <td colSpan={4}>\n <LoadingScreen key='loading'/>\n </td>\n </tr>,\n );\n } else if (\n this.props.emojiIds.length === 0 ||\n (searchEmojis && searchEmojis.length === 0)\n ) {\n emojis.push(\n <tr\n key='empty'\n className='backstage-list__item backstage-list__empty'\n >\n <td colSpan={4}>\n <FormattedMessage\n id='emoji_list.empty'\n defaultMessage='No custom emoji found'\n />\n </td>\n </tr>,\n );\n } else if (searchEmojis) {\n searchEmojis.forEach((emojiId: string) => {\n emojis.push(\n <EmojiListItem\n key={'emoji_search_item' + emojiId}\n emojiId={emojiId}\n onDelete={this.deleteFromSearch}\n actions={{deleteCustomEmoji}}\n />,\n );\n });\n } else {\n const pageStart = this.state.page * EMOJI_PER_PAGE;\n const pageEnd = pageStart + EMOJI_PER_PAGE;\n const emojisToDisplay = this.props.emojiIds.slice(pageStart, pageEnd);\n\n emojisToDisplay.forEach((emojiId: string) => {\n emojis.push(\n <EmojiListItem\n key={'emoji_list_item' + emojiId}\n emojiId={emojiId}\n actions={{deleteCustomEmoji}}\n />,\n );\n });\n\n if (this.state.missingPages) {\n const buttonContents = (\n <span>\n <FormattedMessage\n id='filtered_user_list.next'\n defaultMessage='Next'\n />\n <NextIcon additionalClassName='ml-2'/>\n </span>\n );\n\n nextButton = (\n <SaveButton\n btnClass='btn-tertiary'\n extraClasses='pull-right'\n onClick={this.nextPage}\n saving={this.state.nextLoading}\n disabled={this.state.nextLoading}\n defaultMessage={buttonContents}\n savingMessage={buttonContents}\n />\n );\n }\n\n if (this.state.page > 0) {\n previousButton = (\n <button\n className='btn btn-tertiary'\n onClick={this.previousPage}\n >\n <PreviousIcon additionalClassName='mr-2'/>\n <FormattedMessage\n id='filtered_user_list.prev'\n defaultMessage='Previous'\n />\n </button>\n );\n }\n }\n\n return (\n <div>\n <div className='backstage-filters'>\n <div className='backstage-filter__search'>\n <SearchIcon/>\n <LocalizedPlaceholderInput\n type='search'\n className='form-control'\n placeholder={defineMessage({id: 'emoji_list.search', defaultMessage: 'Search Custom Emoji'})}\n onChange={this.onSearchChange}\n style={style.search}\n />\n </div>\n </div>\n <span className='backstage-list__help'>\n <p>\n <FormattedMessage\n id='emoji_list.help'\n defaultMessage=\"Custom emoji are available to everyone on your server. Type ':' followed by two characters in a message box to bring up the emoji selection menu.\"\n />\n </p>\n <p>\n <FormattedMessage\n id='emoji_list.help2'\n defaultMessage=\"Tip: If you add #, ##, or ### as the first character on a new line containing emoji, you can use larger sized emoji. To try it out, send a message such as: '# :smile:'.\"\n />\n </p>\n </span>\n <div className='backstage-list'>\n <table className='emoji-list__table'>\n <thead>\n <tr className='backstage-list__item emoji-list__table-header'>\n <th className='emoji-list__name'>\n <FormattedMessage\n id='emoji_list.name'\n defaultMessage='Name'\n />\n </th>\n <th className='emoji-list__image'>\n <FormattedMessage\n id='emoji_list.image'\n defaultMessage='Image'\n />\n </th>\n <th className='emoji-list__creator'>\n <FormattedMessage\n id='emoji_list.creator'\n defaultMessage='Creator'\n />\n </th>\n <th className='emoji-list_actions'>\n <FormattedMessage\n id='emoji_list.actions'\n defaultMessage='Actions'\n />\n </th>\n </tr>\n </thead>\n <tbody>{emojis}</tbody>\n </table>\n </div>\n <div className='filter-controls pt-3'>\n {previousButton}\n {nextButton}\n </div>\n </div>\n );\n }\n}\n\nconst style = {\n search: {flexGrow: 0, flexShrink: 0},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCustomEmojis, searchCustomEmojis} from 'mattermost-redux/actions/emojis';\nimport {getCustomEmojiIdsSortedByName} from 'mattermost-redux/selectors/entities/emojis';\n\nimport EmojiList from './emoji_list';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n emojiIds: getCustomEmojiIdsSortedByName(state) || [],\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getCustomEmojis,\n searchCustomEmojis,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate';\n\nimport * as Utils from 'utils/utils';\n\nimport EmojiList from './emoji_list';\n\ntype Props = {\n teamName?: string;\n teamDisplayName?: string;\n siteName?: string;\n scrollToTop(): void;\n currentTheme: Theme;\n actions: {\n loadRolesIfNeeded(roles: Iterable<string>): void;\n };\n}\n\nconst CREATE_EMOJIS_PERMISSIONS = [Permissions.CREATE_EMOJIS];\nconst ROLES = ['system_admin', 'team_admin', 'system_user', 'team_user'];\n\nexport default function EmojiPage({\n teamDisplayName = '',\n teamName = '',\n siteName = '',\n scrollToTop,\n currentTheme,\n actions,\n}: Props) {\n const intl = useIntl();\n\n useEffect(() => {\n updateTitle();\n actions.loadRolesIfNeeded(ROLES);\n Utils.resetTheme();\n\n return () => {\n Utils.applyTheme(currentTheme);\n };\n }, []);\n\n useEffect(() => {\n updateTitle();\n }, [siteName]);\n\n const updateTitle = () => {\n document.title = intl.formatMessage({id: 'custom_emoji.header', defaultMessage: 'Custom Emoji'}) + ' - ' + teamDisplayName + ' ' + siteName;\n };\n\n return (\n <div className='backstage-content emoji-list'>\n <div className='backstage-header'>\n <h1>\n <FormattedMessage\n id='emoji_list.header'\n defaultMessage='Custom Emoji'\n />\n </h1>\n <AnyTeamPermissionGate permissions={CREATE_EMOJIS_PERMISSIONS}>\n <Link\n className='add-link'\n to={'/' + teamName + '/emoji/add'}\n >\n <button\n type='button'\n className='btn btn-primary'\n >\n <FormattedMessage\n id='emoji_list.add'\n defaultMessage='Add Custom Emoji'\n />\n </button>\n </Link>\n </AnyTeamPermissionGate>\n </div>\n <EmojiList scrollToTop={scrollToTop}/>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {loadRolesIfNeeded} from 'mattermost-redux/actions/roles';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport EmojiPage from 'components/emoji/emoji_page';\n\nimport type {GlobalState} from 'types/store';\n\nfunction mapStateToProps(state: GlobalState) {\n const team = getCurrentTeam(state);\n\n return {\n teamName: team?.name,\n teamDisplayName: team?.display_name,\n siteName: state.entities.general.config.SiteName,\n currentTheme: getTheme(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadRolesIfNeeded,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiPage);\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 {useIntl} from 'react-intl';\n\ntype Props = {\n children?: ReactNode;\n}\n\nconst BackstageHeader = ({children}: Props) => {\n const {formatMessage} = useIntl();\n const childrenElements: ReactNode[] = [];\n\n React.Children.forEach(children, (child, index) => {\n if (index !== 0) {\n childrenElements.push(\n <span\n key={'divider' + index}\n className='backstage-header__divider'\n >\n <i\n className='fa fa-angle-right'\n title={formatMessage({id: 'generic_icons.breadcrumb', defaultMessage: 'Breadcrumb Icon'})}\n />\n </span>,\n );\n }\n\n childrenElements.push(child);\n });\n\n return (\n <div className='backstage-header'>\n <h1>\n {childrenElements}\n </h1>\n </div>\n );\n};\n\nexport default BackstageHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, FormEvent, SyntheticEvent} from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\n\nimport {getHistory} from 'utils/browser_history';\nimport {Constants} from 'utils/constants';\nimport type EmojiMap from 'utils/emoji_map';\n\nexport interface AddEmojiProps {\n actions: {\n createCustomEmoji: (term: CustomEmoji, imageData: File) => Promise<ActionResult>;\n };\n emojiMap: EmojiMap;\n user: UserProfile;\n team: Team;\n}\n\ntype EmojiCreateArgs = {\n creator_id: string;\n name: string;\n};\n\ntype AddEmojiState = {\n name: string;\n image: File | null;\n imageUrl: string | ArrayBuffer | null;\n saving: boolean;\n error: React.ReactNode;\n};\n\ninterface AddErrorResponse {\n error: Error;\n}\n\ninterface AddEmojiResponse {\n data: CustomEmoji;\n}\n\nexport default class AddEmoji extends React.PureComponent<AddEmojiProps, AddEmojiState> {\n constructor(props: AddEmojiProps) {\n super(props);\n\n this.state = {\n name: '',\n image: null,\n imageUrl: '',\n saving: false,\n error: null,\n };\n }\n\n handleFormSubmit = async (e: FormEvent<HTMLFormElement>): Promise<void> => {\n return this.handleSubmit(e);\n };\n\n handleSaveButtonClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): Promise<void> => {\n return this.handleSubmit(e);\n };\n\n handleSubmit = async (e: SyntheticEvent<unknown>): Promise<void> => {\n const {actions, emojiMap, user, team} = this.props;\n const {image, name, saving} = this.state;\n\n e.preventDefault();\n\n if (saving) {\n return;\n }\n\n this.setState({\n saving: true,\n error: null,\n });\n\n const emoji: EmojiCreateArgs = {\n creator_id: user.id,\n name: name.trim().toLowerCase(),\n };\n\n // trim surrounding colons if the user accidentally included them in the name\n if (emoji.name.startsWith(':') && emoji.name.endsWith(':')) {\n emoji.name = emoji.name.substring(1, emoji.name.length - 1);\n }\n\n if (!emoji.name) {\n this.setState({\n saving: false,\n error: (\n <FormattedMessage\n id='add_emoji.nameRequired'\n defaultMessage='A name is required for the emoji'\n />\n ),\n });\n\n return;\n }\n\n if ((/[^a-z0-9+_-]/).test(emoji.name)) {\n this.setState({\n saving: false,\n error: (\n <FormattedMessage\n id='add_emoji.nameInvalid'\n defaultMessage=\"An emoji's name can only contain lowercase letters, numbers, and the symbols '-', '+' and '_'.\"\n />\n ),\n });\n\n return;\n }\n\n if (emojiMap.hasSystemEmoji(emoji.name)) {\n this.setState({\n saving: false,\n error: (\n <FormattedMessage\n id='add_emoji.nameTaken'\n defaultMessage='This name is already in use by a system emoji. Please choose another name.'\n />\n ),\n });\n\n return;\n }\n\n if (emojiMap.has(emoji.name)) {\n this.setState({\n saving: false,\n error: (\n <FormattedMessage\n id='add_emoji.customNameTaken'\n defaultMessage='This name is already in use by a custom emoji. Please choose another name.'\n />\n ),\n });\n\n return;\n }\n\n if (!image) {\n this.setState({\n saving: false,\n error: (\n <FormattedMessage\n id='add_emoji.imageRequired'\n defaultMessage='An image is required for the emoji'\n />\n ),\n });\n\n return;\n }\n\n const maxFileSizeBytes = 1024 * 1024;\n if (image.size > maxFileSizeBytes) {\n this.setState({\n saving: false,\n error: (\n <FormattedMessage\n id='add_emoji.imageTooLarge'\n defaultMessage='Unable to create emoji. Image must be less than 1 MB in size.'\n />\n ),\n });\n\n return;\n }\n\n const response = await actions.createCustomEmoji(emoji as CustomEmoji, image);\n\n if ('data' in response) {\n const savedEmoji = response as AddEmojiResponse;\n if (savedEmoji && savedEmoji.data.name === emoji.name) {\n getHistory().push('/' + team.name + '/emoji');\n return;\n }\n }\n\n if ('error' in response) {\n const responseError = response as AddErrorResponse;\n if (responseError) {\n this.setState({\n saving: false,\n error: responseError.error.message,\n });\n\n return;\n }\n }\n\n const genericError = (\n <FormattedMessage\n id='add_emoji.failedToAdd'\n defaultMessage='Something went wrong when adding the custom emoji.'\n />\n );\n\n this.setState({\n saving: false,\n error: (genericError),\n });\n };\n\n updateName = (e: ChangeEvent<HTMLInputElement>): void => {\n this.setState({\n name: e.target.value,\n });\n };\n\n updateImage = (e: ChangeEvent<HTMLInputElement>): void => {\n if (e.target.files == null || e.target.files.length === 0) {\n this.setState({\n image: null,\n imageUrl: '',\n });\n\n return;\n }\n\n const image = e.target.files![0];\n\n const reader = new FileReader();\n reader.onload = () => {\n this.setState({\n image,\n imageUrl: reader.result,\n });\n };\n reader.readAsDataURL(image);\n };\n\n render(): JSX.Element {\n let filename = null;\n if (this.state.image) {\n filename = (\n <span className='add-emoji__filename'>\n {this.state.image.name}\n </span>\n );\n }\n\n let preview = null;\n if (this.state.imageUrl) {\n preview = (\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='preview'\n >\n <FormattedMessage\n id='add_emoji.preview'\n defaultMessage='Preview'\n />\n </label>\n <div className='col-md-5 col-sm-8 add-emoji__preview'>\n <FormattedMessage\n id='add_emoji.preview.sentence'\n defaultMessage='This is a sentence with {image} in it.'\n values={{\n image: (\n <span\n className='emoticon'\n style={{backgroundImage: 'url(' + this.state.imageUrl + ')'}}\n />\n ),\n }}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div className='backstage-content row'>\n <BackstageHeader>\n <Link to={'/' + this.props.team.name + '/emoji'}>\n <FormattedMessage\n id='emoji_list.header'\n defaultMessage='Custom Emoji'\n />\n </Link>\n <FormattedMessage\n id='add_emoji.header'\n defaultMessage='Add'\n />\n </BackstageHeader>\n <div className='backstage-form'>\n <form\n className='form-horizontal'\n onSubmit={this.handleFormSubmit}\n >\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='name'\n >\n <FormattedMessage\n id='add_emoji.name'\n defaultMessage='Name'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='name'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.name}\n onChange={this.updateName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_emoji.name.help'\n defaultMessage=\"Name your emoji. The name can be up to 64 characters, and can contain lowercase letters, numbers, and the symbols '-' and '_'.\"\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='image'\n >\n <FormattedMessage\n id='add_emoji.image'\n defaultMessage='Image'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <div>\n <div className='add-emoji__upload'>\n <button className='btn btn-primary'>\n <FormattedMessage\n id='add_emoji.image.button'\n defaultMessage='Select'\n />\n </button>\n <input\n id='select-emoji'\n type='file'\n accept={Constants.ACCEPT_EMOJI_IMAGE}\n multiple={false}\n onChange={this.updateImage}\n />\n </div>\n {filename}\n <div className='form__help'>\n <FormattedMessage\n id='add_emoji.image.help'\n defaultMessage='Specify a .gif, .png, or .jpg file of up to 64 KB for your emoji. The dimensions can be up to 128 pixels by 128 pixels.'\n />\n </div>\n </div>\n </div>\n </div>\n {preview}\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n error={this.state.error}\n />\n <Link\n className='btn btn-tertiary'\n to={'/' + this.props.team.name + '/emoji'}\n >\n <FormattedMessage\n id='add_emoji.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n data-testid='save-button'\n className='btn btn-primary'\n type='submit'\n spinning={this.state.saving}\n spinningText={defineMessage({id: 'add_emoji.saving', defaultMessage: 'Saving...'})}\n onClick={this.handleSaveButtonClick}\n >\n <FormattedMessage\n id='add_emoji.save'\n defaultMessage='Save'\n />\n </SpinnerButton>\n </div>\n </form>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {createCustomEmoji} from 'mattermost-redux/actions/emojis';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddEmoji from './add_emoji';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n emojiMap: getEmojiMap(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n createCustomEmoji,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Link} from 'react-router-dom';\n\ntype Props = {\n image: string;\n title: JSX.Element;\n description: JSX.Element;\n link: string;\n}\n\nconst IntegrationOption = ({image, title, description, link}: Props) => {\n return (\n <Link\n to={link}\n className='integration-option'\n >\n <img\n alt={'integration image'}\n className='integration-option__image'\n src={image}\n />\n <div className='integration-option__title'>\n {title}\n </div>\n <div className='integration-option__description'>\n {description}\n </div>\n </Link>\n );\n};\n\nexport default React.memo(IntegrationOption);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport ExternalLink from 'components/external_link';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport BotAccountsIcon from 'images/bot_default_icon.png';\nimport IncomingWebhookIcon from 'images/incoming_webhook.jpg';\nimport OAuthIcon from 'images/oauth_icon.png';\nimport OutgoingOAuthConnectionsIcon from 'images/outgoing_oauth_connection.png';\nimport OutgoingWebhookIcon from 'images/outgoing_webhook.jpg';\nimport SlashCommandIcon from 'images/slash_command_icon.jpg';\nimport * as Utils from 'utils/utils';\n\nimport IntegrationOption from './integration_option';\n\ntype Props = {\n siteName: string | undefined;\n enableIncomingWebhooks: boolean;\n enableOutgoingWebhooks: boolean;\n enableCommands: boolean;\n enableOAuthServiceProvider: boolean;\n enableOutgoingOAuthConnections: boolean;\n team: Team;\n}\n\nexport default class Integrations extends React.PureComponent <Props> {\n componentDidMount() {\n this.updateTitle();\n }\n\n updateTitle = () => {\n const currentSiteName = this.props.siteName || '';\n document.title = Utils.localizeMessage({id: 'admin.sidebar.integrations', defaultMessage: 'Integrations'}) + ' - ' + this.props.team.display_name + ' ' + currentSiteName;\n };\n\n render() {\n const options = [];\n\n if (this.props.enableIncomingWebhooks) {\n options.push(\n <TeamPermissionGate\n teamId={this.props.team.id}\n permissions={[Permissions.MANAGE_INCOMING_WEBHOOKS]}\n key='incomingWebhookPermission'\n >\n <IntegrationOption\n key='incomingWebhook'\n image={IncomingWebhookIcon}\n title={\n <FormattedMessage\n id='integrations.incomingWebhook.title'\n defaultMessage='Incoming Webhooks'\n />\n }\n description={\n <FormattedMessage\n id='integrations.incomingWebhook.description'\n defaultMessage='Incoming webhooks allow external integrations to send messages'\n />\n }\n link={'/' + this.props.team.name + '/integrations/incoming_webhooks'}\n />\n </TeamPermissionGate>,\n );\n }\n\n if (this.props.enableOutgoingWebhooks) {\n options.push(\n <TeamPermissionGate\n teamId={this.props.team.id}\n permissions={[Permissions.MANAGE_OUTGOING_WEBHOOKS]}\n key='outgoingWebhookPermission'\n >\n <IntegrationOption\n key='outgoingWebhook'\n image={OutgoingWebhookIcon}\n title={\n <FormattedMessage\n id='integrations.outgoingWebhook.title'\n defaultMessage='Outgoing Webhooks'\n />\n }\n description={\n <FormattedMessage\n id='integrations.outgoingWebhook.description'\n defaultMessage='Outgoing webhooks allow external integrations to receive and respond to messages'\n />\n }\n link={'/' + this.props.team.name + '/integrations/outgoing_webhooks'}\n />\n </TeamPermissionGate>,\n );\n }\n\n if (this.props.enableCommands) {\n options.push(\n <TeamPermissionGate\n teamId={this.props.team.id}\n permissions={[Permissions.MANAGE_SLASH_COMMANDS]}\n key='commandPermission'\n >\n <IntegrationOption\n key='command'\n image={SlashCommandIcon}\n title={\n <FormattedMessage\n id='integrations.command.title'\n defaultMessage='Slash Commands'\n />\n }\n description={\n <FormattedMessage\n id='integrations.command.description'\n defaultMessage='Slash commands send events to an external integration'\n />\n }\n link={'/' + this.props.team.name + '/integrations/commands'}\n />\n </TeamPermissionGate>,\n );\n }\n\n if (this.props.enableOAuthServiceProvider) {\n options.push(\n <SystemPermissionGate\n permissions={[Permissions.MANAGE_OAUTH]}\n key='oauth2AppsPermission'\n >\n <IntegrationOption\n key='oauth2Apps'\n image={OAuthIcon}\n title={\n <FormattedMessage\n id='integrations.oauthApps.title'\n defaultMessage='OAuth 2.0 Applications'\n />\n }\n description={\n <FormattedMessage\n id='integrations.oauthApps.description'\n defaultMessage='Auth 2.0 allows external applications to make authorized requests to the Mattermost API'\n />\n }\n link={'/' + this.props.team.name + '/integrations/oauth2-apps'}\n />\n </SystemPermissionGate>,\n );\n }\n\n if (this.props.enableOutgoingOAuthConnections) {\n options.push(\n <TeamPermissionGate\n teamId={this.props.team.id}\n permissions={[Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS]}\n key='outgoingOAuthConnectionsPermission'\n >\n <IntegrationOption\n key='outgoingOAuthConnections'\n image={OutgoingOAuthConnectionsIcon}\n title={\n <FormattedMessage\n id='integrations.outgoingOAuthConnections.title'\n defaultMessage='Outgoing OAuth Connections'\n />\n }\n description={\n <FormattedMessage\n id='integrations.outgoingOAuthConnections.description'\n defaultMessage='Outgoing OAuth Connections allow custom integrations to communicate to external systems'\n />\n }\n link={'/' + this.props.team.name + '/integrations/outgoing-oauth2-connections'}\n />\n </TeamPermissionGate>,\n );\n }\n\n options.push(\n <SystemPermissionGate\n permissions={['manage_bots']}\n key='botsPermissions'\n >\n <IntegrationOption\n image={BotAccountsIcon}\n title={\n <FormattedMessage\n id='bots.manage.header'\n defaultMessage='Bot Accounts'\n />\n }\n description={\n <FormattedMessage\n id='bots.manage.description'\n defaultMessage='Use bot accounts to integrate with Mattermost through plugins or the API'\n />\n }\n link={'/' + this.props.team.name + '/integrations/bots'}\n />\n </SystemPermissionGate>,\n );\n\n return (\n <div className='backstage-content row'>\n <div className='backstage-header'>\n <h1>\n <FormattedMessage\n id='integrations.header'\n defaultMessage='Integrations'\n />\n </h1>\n </div>\n <div className='backstage-list__help'>\n <FormattedMessage\n id='integrations.help'\n defaultMessage='Visit the {appDirectory} to find self-hosted, third-party apps and integrations for Mattermost.'\n values={{\n appDirectory: (\n <ExternalLink\n href='https://mattermost.com/marketplace'\n location='integrations'\n >\n <FormattedMessage\n id='integrations.help.appDirectory'\n defaultMessage='App Directory'\n />\n </ExternalLink>\n ),\n }}\n />\n </div>\n <div className='integrations-list d-flex flex-wrap'>\n {options}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport Integrations from './integrations';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const siteName = config.SiteName;\n const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n const enableCommands = config.EnableCommands === 'true';\n const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n const enableOutgoingOAuthConnections = config.EnableOutgoingOAuthConnections === 'true';\n\n return {\n siteName,\n enableIncomingWebhooks,\n enableOutgoingWebhooks,\n enableCommands,\n enableOAuthServiceProvider,\n enableOutgoingOAuthConnections,\n };\n}\n\nexport default connect(mapStateToProps)(Integrations);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {ChangeEventHandler} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n channels: Channel[];\n onChange?: ChangeEventHandler<HTMLSelectElement>;\n value?: string;\n selectOpen: boolean;\n selectPrivate: boolean;\n selectDm: boolean;\n};\n\nconst ChannelSelect = ({\n channels,\n selectOpen,\n selectPrivate,\n selectDm,\n value,\n onChange,\n}: Props) => {\n const intl = useIntl();\n\n const options = [\n <option\n key=''\n value=''\n >\n {intl.formatMessage({\n id: 'channel_select.placeholder',\n defaultMessage: '--- Select a channel ---',\n })}\n </option>,\n ];\n\n channels.forEach((channel: Channel) => {\n const channelName = channel.display_name || channel.name;\n if (channel.type === Constants.OPEN_CHANNEL && selectOpen) {\n options.push(\n <option\n key={channel.id}\n value={channel.id}\n >\n {channelName}\n </option>,\n );\n } else if (channel.type === Constants.PRIVATE_CHANNEL && selectPrivate) {\n options.push(\n <option\n key={channel.id}\n value={channel.id}\n >\n {channelName}\n </option>,\n );\n } else if (channel.type === Constants.DM_CHANNEL && selectDm) {\n options.push(\n <option\n key={channel.id}\n value={channel.id}\n >\n {channelName}\n </option>,\n );\n }\n });\n\n return (\n <select\n className='form-control'\n value={value}\n onChange={onChange}\n id='channelSelect'\n >\n {options}\n </select>\n );\n};\n\nexport default memo(ChannelSelect);\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 {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getMyChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserLocale} from 'mattermost-redux/selectors/entities/i18n';\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport ChannelSelect from './channel_select';\n\nconst getMyChannelsSorted = createSelector(\n 'getMyChannelsSorted',\n getMyChannels,\n getCurrentUserLocale,\n (channels, locale) => {\n const activeChannels = channels.filter((channel) => channel.delete_at === 0);\n return [...activeChannels].sort(sortChannelsByTypeAndDisplayName.bind(null, locale));\n },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n channels: getMyChannelsSorted(state),\n };\n}\n\nexport default connect(mapStateToProps)(ChannelSelect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport type {ChangeEventHandler, FormEvent, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ChannelSelect from 'components/channel_select';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\n\ninterface State {\n displayName: string;\n description: string;\n channelId: string;\n channelLocked: boolean;\n username: string;\n iconURL: string;\n saving: boolean;\n serverError: string;\n clientError: JSX.Element | null;\n}\n\ninterface Props {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The header text to render, has id and defaultMessage\n */\n header: MessageDescriptor;\n\n /**\n * The footer text to render, has id and defaultMessage\n */\n footer: MessageDescriptor;\n\n /**\n * The spinner loading text to render, has id and defaultMessage\n */\n loading: MessageDescriptor;\n\n /**\n * The server error text after a failed action\n */\n serverError: string;\n\n /**\n * The hook used to set the initial state\n */\n initialHook?: IncomingWebhook;\n\n /**\n * Whether to allow configuration of the default post username.\n */\n enablePostUsernameOverride: boolean;\n\n /**\n * Whether to allow configuration of the default post icon.\n */\n enablePostIconOverride: boolean;\n\n /**\n * The async function to run when the action button is pressed\n */\n action: (hook: IncomingWebhook) => Promise<void>;\n}\n\nexport default class AbstractIncomingWebhook extends PureComponent<Props, State> {\n constructor(props: Props | Readonly<Props>) {\n super(props);\n\n this.state = this.getStateFromHook(this.props.initialHook);\n }\n\n getStateFromHook = (hook?: IncomingWebhook) => {\n return {\n displayName: hook?.display_name || '',\n description: hook?.description || '',\n channelId: hook?.channel_id || '',\n channelLocked: hook?.channel_locked || false,\n username: hook?.username || '',\n iconURL: hook?.icon_url || '',\n saving: false,\n serverError: '',\n clientError: null,\n };\n };\n\n handleSubmit = (e: MouseEvent<HTMLElement> | FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (this.state.saving) {\n return;\n }\n\n this.setState({\n saving: true,\n serverError: '',\n clientError: null,\n });\n\n if (!this.state.channelId) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_incoming_webhook.channelRequired'\n defaultMessage='A valid channel is required'\n />\n ),\n });\n\n return;\n }\n\n const hook = {\n channel_id: this.state.channelId,\n channel_locked: this.state.channelLocked,\n display_name: this.state.displayName,\n description: this.state.description,\n username: this.state.username,\n icon_url: this.state.iconURL,\n id: this.props.initialHook?.id || '',\n create_at: this.props.initialHook?.create_at || 0,\n update_at: this.props.initialHook?.update_at || 0,\n delete_at: this.props.initialHook?.delete_at || 0,\n team_id: this.props.initialHook?.team_id || '',\n user_id: this.props.initialHook?.user_id || '',\n };\n\n this.props.action(hook).then(() => this.setState({saving: false}));\n };\n\n updateDisplayName: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n displayName: e.target.value,\n });\n };\n\n updateDescription: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n description: e.target.value,\n });\n };\n\n updateChannelId: ChangeEventHandler<HTMLSelectElement> = (e) => {\n this.setState({\n channelId: e.target.value,\n });\n };\n\n updateChannelLocked: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n channelLocked: e.target.checked,\n });\n };\n\n updateUsername: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n username: e.target.value,\n });\n };\n\n updateIconURL: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n iconURL: e.target.value,\n });\n };\n\n render() {\n const headerToRender = this.props.header;\n const footerToRender = this.props.footer;\n\n return (\n <div className='backstage-content'>\n <BackstageHeader>\n <Link to={`/${this.props.team.name}/integrations/incoming_webhooks`}>\n <FormattedMessage\n id='incoming_webhooks.header'\n defaultMessage='Incoming Webhooks'\n />\n </Link>\n <FormattedMessage\n id={headerToRender.id}\n defaultMessage={headerToRender.defaultMessage}\n />\n </BackstageHeader>\n <div className='backstage-form'>\n <form\n className='form-horizontal'\n onSubmit={(e) => this.handleSubmit(e)}\n >\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='displayName'\n >\n <FormattedMessage\n id='add_incoming_webhook.displayName'\n defaultMessage='Title'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='displayName'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.displayName}\n onChange={this.updateDisplayName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_incoming_webhook.displayName.help'\n defaultMessage='Specify a title, of up to 64 characters, for the webhook settings page.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='description'\n >\n <FormattedMessage\n id='add_incoming_webhook.description'\n defaultMessage='Description'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='description'\n type='text'\n maxLength={500}\n className='form-control'\n value={this.state.description}\n onChange={this.updateDescription}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_incoming_webhook.description.help'\n defaultMessage='Describe your incoming webhook.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='channelId'\n >\n <FormattedMessage\n id='add_incoming_webhook.channel'\n defaultMessage='Channel'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <ChannelSelect\n value={this.state.channelId}\n onChange={this.updateChannelId}\n selectOpen={true}\n selectPrivate={true}\n selectDm={false}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_incoming_webhook.channel.help'\n defaultMessage='This is the default public or private channel that receives the webhook payloads. When setting up the webhook, you must belong to the private channel.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='channelLocked'\n >\n <FormattedMessage\n id='add_incoming_webhook.channelLocked'\n defaultMessage='Lock to this channel'\n />\n </label>\n <div className='col-md-5 col-sm-8 checkbox'>\n <input\n id='channelLocked'\n type='checkbox'\n checked={this.state.channelLocked}\n onChange={this.updateChannelLocked}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_incoming_webhook.channelLocked.help'\n defaultMessage='If set, the incoming webhook can post only to the selected channel.'\n />\n </div>\n </div>\n </div>\n { this.props.enablePostUsernameOverride &&\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='username'\n >\n <FormattedMessage\n id='add_incoming_webhook.username'\n defaultMessage='Username'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='username'\n type='text'\n maxLength={22}\n className='form-control'\n value={this.state.username}\n onChange={this.updateUsername}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_incoming_webhook.username.help'\n defaultMessage='Specify the username this integration will post as. Usernames can be up to 22 characters, and can contain lowercase letters, numbers and the symbols \\\"-\\\", \\\"_\\\", and \\\".\\\". If left blank, the name specified by the webhook creator is used.'\n />\n </div>\n </div>\n </div>\n }\n { this.props.enablePostIconOverride &&\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='iconURL'\n >\n <FormattedMessage\n id='add_incoming_webhook.icon_url'\n defaultMessage='Profile Picture'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='iconURL'\n type='text'\n maxLength={1024}\n className='form-control'\n value={this.state.iconURL}\n onChange={this.updateIconURL}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_incoming_webhook.icon_url.help'\n defaultMessage='Enter the URL of a .png or .jpg file for the profile picture of this integration when posting. The file should be at least 128 pixels by 128 pixels. If left blank, the profile picture specified by the webhook creator is used.'\n />\n </div>\n </div>\n </div>\n }\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n errors={[this.props.serverError, this.state.clientError]}\n />\n <Link\n className='btn btn-tertiary'\n to={`/${this.props.team.name}/integrations/incoming_webhooks`}\n >\n <FormattedMessage\n id='add_incoming_webhook.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n className='btn btn-primary'\n type='submit'\n spinning={this.state.saving}\n spinningText={this.props.loading}\n onClick={(e) => this.handleSubmit(e)}\n id='saveWebhook'\n >\n <FormattedMessage\n id={footerToRender.id}\n defaultMessage={footerToRender.defaultMessage}\n />\n </SpinnerButton>\n </div>\n </form>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useState} from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AbstractIncomingWebhook from 'components/integrations/abstract_incoming_webhook';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst messages = defineMessages({\n footer: {\n id: 'add_incoming_webhook.save',\n defaultMessage: 'Save',\n },\n header: {\n id: 'integrations.add',\n defaultMessage: 'Add',\n },\n loading: {\n id: 'add_incoming_webhook.saving',\n defaultMessage: 'Saving...',\n },\n});\n\ntype Props = {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * Whether to allow configuration of the default post username.\n */\n enablePostUsernameOverride: boolean;\n\n /**\n * Whether to allow configuration of the default post icon.\n */\n enablePostIconOverride: boolean;\n\n actions: {\n\n /**\n * The function to call to add a new incoming webhook\n */\n createIncomingHook: (hook: IncomingWebhook) => Promise<ActionResult<IncomingWebhook>>;\n };\n};\n\nconst AddIncomingWebhook = ({\n team,\n enablePostUsernameOverride,\n enablePostIconOverride,\n actions,\n}: Props) => {\n const [serverError, setServerError] = useState('');\n\n const addIncomingHook = useCallback(async (hook: IncomingWebhook) => {\n setServerError('');\n\n const {data, error} = await actions.createIncomingHook(hook);\n if (data) {\n getHistory().push(`/${team.name}/integrations/confirm?type=incoming_webhooks&id=${data.id}`);\n return;\n }\n if (error) {\n setServerError(error.message);\n }\n }, [actions, team.name]);\n\n return (\n <AbstractIncomingWebhook\n team={team}\n header={messages.header}\n footer={messages.footer}\n loading={messages.loading}\n enablePostUsernameOverride={enablePostUsernameOverride}\n enablePostIconOverride={enablePostIconOverride}\n action={addIncomingHook}\n serverError={serverError}\n />\n );\n};\nexport default memo(AddIncomingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createIncomingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport AddIncomingWebhook from './add_incoming_webhook';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n\n return {\n enablePostUsernameOverride,\n enablePostIconOverride,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n createIncomingHook,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddIncomingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, FormEvent} from 'react';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport FormError from 'components/form_error';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport SpinnerButton from 'components/spinner_button';\n\ntype Props = {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The header text to render, has id and defaultMessage\n */\n header: MessageDescriptor;\n\n /**\n * The footer text to render, has id and defaultMessage\n */\n footer: MessageDescriptor;\n\n /**\n * The spinner loading text to render, has id and defaultMessage\n */\n loading: MessageDescriptor;\n\n /**\n * Any extra component/node to render\n */\n renderExtra?: JSX.Element;\n\n /**\n * The server error text after a failed action\n */\n serverError: string;\n\n /**\n * The OAuthApp used to set the initial state\n */\n initialApp?: OAuthApp;\n\n /**\n * The async function to run when the action button is pressed\n */\n action: (app: OAuthApp) => Promise<void>;\n\n}\n\ntype State = {\n name: string;\n description: string;\n homepage: string;\n icon_url: string;\n callbackUrls: string;\n is_trusted: boolean;\n has_icon: boolean;\n saving: boolean;\n clientError: JSX.Element | null | string;\n};\n\nexport default class AbstractOAuthApp extends React.PureComponent<Props, State> {\n private image: HTMLImageElement;\n private icon_url: React.RefObject<HTMLInputElement>;\n\n constructor(props: Props) {\n super(props);\n\n this.image = new Image();\n this.image.onload = this.imageLoaded;\n this.icon_url = React.createRef();\n this.state = this.getStateFromApp(this.props.initialApp || {} as OAuthApp);\n }\n\n getStateFromApp = (app: OAuthApp) => {\n return {\n name: app.name || '',\n description: app.description || '',\n homepage: app.homepage || '',\n icon_url: app.icon_url || '',\n callbackUrls: app.callback_urls ? app.callback_urls.join('\\n') : '',\n is_trusted: app.is_trusted || false,\n has_icon: Boolean(app.icon_url),\n saving: false,\n clientError: null,\n };\n };\n\n imageLoaded = () => {\n if (this.icon_url.current?.value) {\n this.setState({\n has_icon: true,\n icon_url: this.icon_url.current.value,\n });\n }\n };\n\n handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n\n if (this.state.saving) {\n return;\n }\n\n this.setState({\n saving: true,\n clientError: '',\n });\n\n if (!this.state.name) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_oauth_app.nameRequired'\n defaultMessage='Name for the OAuth 2.0 application is required.'\n />\n ),\n });\n\n return;\n }\n\n if (!this.state.description) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_oauth_app.descriptionRequired'\n defaultMessage='Description for the OAuth 2.0 application is required.'\n />\n ),\n });\n\n return;\n }\n\n if (!this.state.homepage) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_oauth_app.homepageRequired'\n defaultMessage='Homepage for the OAuth 2.0 application is required.'\n />\n ),\n });\n\n return;\n }\n\n const callbackUrls = [];\n for (let callbackUrl of this.state.callbackUrls.split('\\n')) {\n callbackUrl = callbackUrl.trim();\n\n if (callbackUrl.length > 0) {\n callbackUrls.push(callbackUrl);\n }\n }\n\n if (callbackUrls.length === 0) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_oauth_app.callbackUrlsRequired'\n defaultMessage='One or more callback URLs are required.'\n />\n ),\n });\n\n return;\n }\n\n const app = {\n name: this.state.name,\n callback_urls: callbackUrls,\n homepage: this.state.homepage,\n description: this.state.description,\n is_trusted: this.state.is_trusted,\n icon_url: this.state.icon_url,\n } as OAuthApp;\n\n this.props.action(app).then(() => this.setState({saving: false}));\n };\n\n updateName = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n name: e.target.value,\n });\n };\n\n updateTrusted = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n is_trusted: e.target.value === 'true',\n });\n };\n\n updateDescription = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n description: e.target.value,\n });\n };\n\n updateHomepage = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n homepage: e.target.value,\n });\n };\n\n updateIconUrl = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n has_icon: false,\n icon_url: e.target.value,\n });\n this.image.src = e.target.value;\n };\n\n updateCallbackUrls = (e: ChangeEvent<HTMLTextAreaElement>) => {\n this.setState({\n callbackUrls: e.target.value,\n });\n };\n\n render() {\n const headerToRender = this.props.header;\n const footerToRender = this.props.footer;\n const renderExtra = this.props.renderExtra;\n\n let icon;\n if (this.state.has_icon) {\n icon = (\n <div className='integration__icon'>\n <img\n alt={'integration icon'}\n src={this.state.icon_url}\n />\n </div>\n );\n }\n\n const trusted = (\n <SystemPermissionGate permissions={[Permissions.MANAGE_SYSTEM]}>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='is_trusted'\n >\n <FormattedMessage\n id='installed_oauth_apps.trusted'\n defaultMessage='Is Trusted'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <label className='radio-inline'>\n <input\n type='radio'\n value='true'\n name='is_trusted'\n checked={this.state.is_trusted}\n onChange={this.updateTrusted}\n />\n <FormattedMessage\n id='installed_oauth_apps.trusted.yes'\n defaultMessage='Yes'\n />\n </label>\n <label className='radio-inline'>\n <input\n type='radio'\n value='false'\n name='is_trusted'\n checked={!this.state.is_trusted}\n onChange={this.updateTrusted}\n />\n <FormattedMessage\n id='installed_oauth_apps.trusted.no'\n defaultMessage='No'\n />\n </label>\n <div className='form__help'>\n <FormattedMessage\n id='add_oauth_app.trusted.help'\n defaultMessage='If true, the OAuth 2.0 application is considered trusted by the Mattermost server and does not require the user to accept authorization. If false, a window opens to ask the user to accept or deny the authorization.'\n />\n </div>\n </div>\n </div>\n </SystemPermissionGate>\n );\n\n return (\n <div className='backstage-content'>\n <BackstageHeader>\n <Link to={`/${this.props.team.name}/integrations/oauth2-apps`}>\n <FormattedMessage\n id='installed_oauth_apps.header'\n defaultMessage='Installed OAuth2 Apps'\n />\n </Link>\n <FormattedMessage\n id={headerToRender.id}\n defaultMessage={headerToRender.defaultMessage}\n />\n </BackstageHeader>\n <div className='backstage-form'>\n {icon}\n <form className='form-horizontal'>\n {trusted}\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='name'\n >\n <FormattedMessage\n id='installed_oauth_apps.name'\n defaultMessage='Display Name'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='name'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.name}\n onChange={this.updateName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_oauth_app.name.help'\n defaultMessage='Specify the display name, of up to 64 characters, for your OAuth 2.0 application.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='description'\n >\n <FormattedMessage\n id='installed_oauth_apps.description'\n defaultMessage='Description'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='description'\n type='text'\n maxLength={512}\n className='form-control'\n value={this.state.description}\n onChange={this.updateDescription}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_oauth_app.description.help'\n defaultMessage='Describe your OAuth 2.0 application.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='homepage'\n >\n <FormattedMessage\n id='installed_oauth_apps.homepage'\n defaultMessage='Homepage'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='homepage'\n type='url'\n maxLength={256}\n className='form-control'\n value={this.state.homepage}\n onChange={this.updateHomepage}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_oauth_app.homepage.help'\n defaultMessage='This is the URL for the homepage of the OAuth 2.0 application. Depending on your server configuration, use HTTP or HTTPS in the URL.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='icon_url'\n >\n <FormattedMessage\n id='installed_oauth_apps.iconUrl'\n defaultMessage='Icon URL'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='icon_url'\n ref={this.icon_url}\n type='url'\n maxLength={512}\n className='form-control'\n value={this.state.icon_url}\n onChange={this.updateIconUrl}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_oauth_app.icon.help'\n defaultMessage='(Optional) The URL of the image used for your OAuth 2.0 application. Make sure you use HTTP or HTTPS in your URL.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='callbackUrls'\n >\n <FormattedMessage\n id='installed_oauth_apps.callbackUrls'\n defaultMessage='Callback URLs (One Per Line)'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <textarea\n id='callbackUrls'\n rows={3}\n maxLength={1024}\n className='form-control'\n value={this.state.callbackUrls}\n onChange={this.updateCallbackUrls}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_oauth_app.callbackUrls.help'\n defaultMessage='The redirect URIs to which the service will redirect users after accepting or denying authorization of your application, and which will handle authorization codes or access tokens. Must be a valid URL and start with http:// or https://.'\n />\n </div>\n </div>\n </div>\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n errors={[this.props.serverError, this.state.clientError]}\n />\n <Link\n className='btn btn-tertiary'\n to={`/${this.props.team.name}/integrations/oauth2-apps`}\n >\n <FormattedMessage\n id='installed_oauth_apps.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n className='btn btn-primary'\n type='submit'\n spinning={this.state.saving}\n spinningText={this.props.loading}\n onClick={this.handleSubmit}\n id='saveOauthApp'\n >\n <FormattedMessage\n id={footerToRender.id}\n defaultMessage={footerToRender.defaultMessage}\n />\n </SpinnerButton>\n {renderExtra}\n </div>\n </form>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {defineMessages} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions.js';\n\nimport AbstractOAuthApp from '../abstract_oauth_app';\n\nconst messages = defineMessages({\n footer: {\n id: 'installed_oauth_apps.save',\n defaultMessage: 'Save',\n },\n header: {\n id: 'add_oauth_app.header',\n defaultMessage: 'Add',\n },\n loading: {\n id: 'installed_oauth_apps.saving',\n defaultMessage: 'Saving...',\n },\n});\n\nexport type Props = {\n\n /**\n * The team data\n */\n team: Team;\n\n actions: {\n\n /**\n * The function to call to add new OAuthApp\n */\n addOAuthApp: (app: OAuthApp) => Promise<ActionResult<OAuthApp>>;\n };\n};\n\nconst AddOAuthApp = ({team, actions}: Props): JSX.Element => {\n const history = useHistory();\n\n const [serverError, setServerError] = useState('');\n\n const addOAuthApp = async (app: OAuthApp) => {\n setServerError('');\n\n const {data, error} = await actions.addOAuthApp(app);\n if (data) {\n history.push(`/${team.name}/integrations/confirm?type=oauth2-apps&id=${data.id}`);\n return;\n }\n\n if (error) {\n setServerError(error.message);\n }\n };\n\n return (\n <AbstractOAuthApp\n team={team}\n header={messages.header}\n footer={messages.footer}\n loading={messages.loading}\n action={addOAuthApp}\n serverError={serverError}\n />\n );\n};\n\nexport default AddOAuthApp;\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 {addOAuthApp} from 'mattermost-redux/actions/integrations';\n\nimport AddOAuthApp from './add_oauth_app';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addOAuthApp,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(AddOAuthApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEventHandler, FormEvent, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ChannelSelect from 'components/channel_select';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\n\nimport {DocLinks} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\ninterface State {\n callbackUrls: string;\n channelId: string;\n clientError: JSX.Element | null;\n contentType: string;\n description: string;\n displayName: string;\n iconURL: string;\n saving: boolean;\n triggerWhen: number;\n triggerWords: string;\n username: string;\n}\n\ninterface Props {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The header text to render, has id and defaultMessage\n */\n header: MessageDescriptor;\n\n /**\n * The footer text to render, has id and defaultMessage\n */\n footer: MessageDescriptor;\n\n /**\n * The spinner loading text to render, has id and defaultMessage\n */\n loading: MessageDescriptor;\n\n /**\n * Any extra component/node to render\n */\n renderExtra: React.ReactNode;\n\n /**\n * The server error text after a failed action\n */\n serverError: string;\n\n /**\n * The hook used to set the initial state\n */\n initialHook?: OutgoingWebhook;\n\n /**\n * The async function to run when the action button is pressed\n */\n action: (hook: OutgoingWebhook) => Promise<void>;\n\n /**\n * Whether to allow configuration of the default post username.\n */\n enablePostUsernameOverride: boolean;\n\n /**\n * Whether to allow configuration of the default post icon.\n */\n enablePostIconOverride: boolean;\n}\n\nexport default class AbstractOutgoingWebhook extends React.PureComponent<Props, State> {\n constructor(props: Props | Readonly<Props>) {\n super(props);\n\n this.state = this.getStateFromHook(this.props.initialHook);\n }\n\n getStateFromHook = (hook?: OutgoingWebhook) => {\n let triggerWords = '';\n if (hook?.trigger_words) {\n let i = 0;\n for (i = 0; i < hook.trigger_words.length; i++) {\n triggerWords += hook.trigger_words[i] + '\\n';\n }\n }\n\n let callbackUrls = '';\n if (hook?.callback_urls) {\n let i = 0;\n for (i = 0; i < hook.callback_urls.length; i++) {\n callbackUrls += hook.callback_urls[i] + '\\n';\n }\n }\n\n return {\n displayName: hook?.display_name || '',\n description: hook?.description || '',\n contentType: hook?.content_type || 'application/x-www-form-urlencoded',\n channelId: hook?.channel_id || '',\n triggerWords,\n triggerWhen: hook?.trigger_when || 0,\n callbackUrls,\n saving: false,\n clientError: null,\n username: hook?.username || '',\n iconURL: hook?.icon_url || '',\n };\n };\n\n handleSubmit = (e: MouseEvent<HTMLElement> | FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (this.state.saving) {\n return;\n }\n\n this.setState({\n saving: true,\n clientError: null,\n });\n\n const triggerWords = [];\n if (this.state.triggerWords) {\n for (let triggerWord of this.state.triggerWords.split('\\n')) {\n triggerWord = triggerWord.trim();\n\n if (triggerWord.length > 0) {\n triggerWords.push(triggerWord);\n }\n }\n }\n\n if (!this.state.channelId && triggerWords.length === 0) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_outgoing_webhook.triggerWordsOrChannelRequired'\n defaultMessage='A valid channel or a list of trigger words is required'\n />\n ),\n });\n\n return;\n }\n\n const callbackUrls = [];\n for (let callbackUrl of this.state.callbackUrls.split('\\n')) {\n callbackUrl = callbackUrl.trim();\n\n if (callbackUrl.length > 0) {\n callbackUrls.push(callbackUrl);\n }\n }\n\n if (callbackUrls.length === 0) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_outgoing_webhook.callbackUrlsRequired'\n defaultMessage='One or more callback URLs are required'\n />\n ),\n });\n\n return;\n }\n\n const hook = {\n team_id: this.props.team.id,\n channel_id: this.state.channelId,\n trigger_words: triggerWords,\n trigger_when: this.state.triggerWhen,\n callback_urls: callbackUrls,\n display_name: this.state.displayName,\n content_type: this.state.contentType,\n description: this.state.description,\n username: this.state.username,\n icon_url: this.state.iconURL,\n id: this.props.initialHook?.id || '',\n create_at: this.props.initialHook?.create_at || 0,\n update_at: this.props.initialHook?.update_at || 0,\n delete_at: this.props.initialHook?.delete_at || 0,\n creator_id: this.props.initialHook?.creator_id || '',\n token: this.props.initialHook?.token || '',\n };\n\n this.props.action(hook).then(() => this.setState({saving: false}));\n };\n\n updateDisplayName: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n displayName: e.target.value,\n });\n };\n\n updateDescription: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n description: e.target.value,\n });\n };\n\n updateContentType: ChangeEventHandler<HTMLSelectElement> = (e) => {\n this.setState({\n contentType: e.target.value,\n });\n };\n\n updateChannelId: ChangeEventHandler<HTMLSelectElement> = (e) => {\n this.setState({\n channelId: e.target.value,\n });\n };\n\n updateTriggerWords: ChangeEventHandler<HTMLTextAreaElement> = (e) => {\n this.setState({\n triggerWords: e.target.value,\n });\n };\n\n updateTriggerWhen: ChangeEventHandler<HTMLSelectElement> = (e) => {\n this.setState({\n triggerWhen: parseInt(e.target.value, 10),\n });\n };\n\n updateCallbackUrls: ChangeEventHandler<HTMLTextAreaElement> = (e) => {\n this.setState({\n callbackUrls: e.target.value,\n });\n };\n\n updateUsername: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n username: e.target.value,\n });\n };\n\n updateIconURL: ChangeEventHandler<HTMLInputElement> = (e) => {\n this.setState({\n iconURL: e.target.value,\n });\n };\n\n render() {\n const contentTypeOption1 = 'application/x-www-form-urlencoded';\n const contentTypeOption2 = 'application/json';\n\n const headerToRender = this.props.header;\n const footerToRender = this.props.footer;\n const renderExtra = this.props.renderExtra;\n\n return (\n <div className='backstage-content'>\n <BackstageHeader>\n <Link to={`/${this.props.team.name}/integrations/outgoing_webhooks`}>\n <FormattedMessage\n id='add_outgoing_webhook.header'\n defaultMessage='Outgoing Webhooks'\n />\n </Link>\n <FormattedMessage\n id={headerToRender.id}\n defaultMessage={headerToRender.defaultMessage}\n />\n </BackstageHeader>\n <div className='backstage-form'>\n <form\n className='form-horizontal'\n onSubmit={this.handleSubmit}\n >\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='displayName'\n >\n <FormattedMessage\n id='add_outgoing_webhook.displayName'\n defaultMessage='Title'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='displayName'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.displayName}\n onChange={this.updateDisplayName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.displayName.help'\n defaultMessage='Specify a title, of up to 64 characters, for the webhook settings page.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='description'\n >\n <FormattedMessage\n id='add_outgoing_webhook.description'\n defaultMessage='Description'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='description'\n type='text'\n maxLength={500}\n className='form-control'\n value={this.state.description}\n onChange={this.updateDescription}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.description.help'\n defaultMessage='Describe your outgoing webhook.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='contentType'\n >\n <FormattedMessage\n id='add_outgoing_webhook.content_Type'\n defaultMessage='Content Type'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <select\n className='form-control'\n value={this.state.contentType}\n onChange={this.updateContentType}\n >\n <option\n value={contentTypeOption1}\n >\n {contentTypeOption1}\n </option>\n <option\n value={contentTypeOption2}\n >\n {contentTypeOption2}\n </option>\n </select>\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.contentType.help1'\n defaultMessage='Specify the content type by which to send the request.'\n />\n </div>\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.contentType.help2'\n defaultMessage='For the server to encode the parameters in a URL format in the request body, select application/x-www-form-urlencoded.'\n />\n </div>\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.contentType.help3'\n defaultMessage='For the server to format the request body as JSON, select application/json.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='channelId'\n >\n <FormattedMessage\n id='add_outgoing_webhook.channel'\n defaultMessage='Channel'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <ChannelSelect\n value={this.state.channelId}\n onChange={this.updateChannelId}\n selectOpen={true}\n selectPrivate={false}\n selectDm={false}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.channel.help'\n defaultMessage='This field is optional if you specify at least one trigger word. Specify the public channel that delivers the payload to the webhook.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='triggerWords'\n >\n <FormattedMessage\n id='add_outgoing_webhook.triggerWords'\n defaultMessage='Trigger Words (One Per Line)'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <textarea\n id='triggerWords'\n rows={3}\n maxLength={1000}\n className='form-control'\n value={this.state.triggerWords}\n onChange={this.updateTriggerWords}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.triggerWords.help'\n defaultMessage='Specify the trigger words that send an HTTP POST request to your application. The trigger can be for the channel, the outgoing webhook, or both. If you select only Channel, trigger words are optional. If you select both, the message must match both values.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='triggerWords'\n >\n <FormattedMessage\n id='add_outgoing_webhook.triggerWordsTriggerWhen'\n defaultMessage='Trigger When'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <select\n id='triggerWhen'\n className='form-control'\n value={this.state.triggerWhen}\n onChange={this.updateTriggerWhen}\n >\n <option\n value='0'\n >\n {localizeMessage({id: 'add_outgoing_webhook.triggerWordsTriggerWhenFullWord', defaultMessage: 'First word matches a trigger word exactly'})}\n </option>\n <option\n value='1'\n >\n {localizeMessage({id: 'add_outgoing_webhook.triggerWordsTriggerWhenStartsWith', defaultMessage: 'First word starts with a trigger word'})}\n </option>\n </select>\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.triggerWordsTriggerWhen.help'\n defaultMessage='Specify when to trigger the outgoing webhook.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='callbackUrls'\n >\n <FormattedMessage\n id='add_outgoing_webhook.callbackUrls'\n defaultMessage='Callback URLs (One Per Line)'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <textarea\n id='callbackUrls'\n rows={3}\n maxLength={1000}\n className='form-control'\n value={this.state.callbackUrls}\n onChange={this.updateCallbackUrls}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.callbackUrls.help'\n defaultMessage='Specify the URL that the messages will be sent to. If the URL is private, add it as a {link}.'\n values={{\n link: (\n <ExternalLink\n href={DocLinks.TRUSTED_CONNECTION}\n location='abstract_outgoing_webhook'\n >\n <FormattedMessage\n id='add_outgoing_webhook.callbackUrls.helpLinkText'\n defaultMessage='trusted internal connection'\n />\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n </div>\n {this.props.enablePostUsernameOverride &&\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='username'\n >\n <FormattedMessage\n id='add_outgoing_webhook.username'\n defaultMessage='Username'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='username'\n type='text'\n maxLength={22}\n className='form-control'\n value={this.state.username}\n onChange={this.updateUsername}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.username.help'\n defaultMessage='Specify the username this integration will post as. Usernames can be up to 22 characters, and contain lowercase letters, numbers and the symbols \\\"-\\\", \\\"_\\\", and \\\".\\\". If left blank, the name specified by the webhook creator is used.'\n />\n </div>\n </div>\n </div>\n }\n {this.props.enablePostIconOverride &&\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='iconURL'\n >\n <FormattedMessage\n id='add_outgoing_webhook.icon_url'\n defaultMessage='Profile Picture'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='iconURL'\n type='text'\n maxLength={1024}\n className='form-control'\n value={this.state.iconURL}\n onChange={this.updateIconURL}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_webhook.icon_url.help'\n defaultMessage='Enter the URL of a .png or .jpg file for this integration to use as the profile picture when posting. The file should be at least 128 pixels by 128 pixels. If left blank, the profile picture specified by the webhook creator is used.'\n />\n </div>\n </div>\n </div>\n }\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n errors={[this.props.serverError, this.state.clientError]}\n />\n <Link\n className='btn btn-tertiary'\n to={`/${this.props.team.name}/integrations/outgoing_webhooks`}\n >\n <FormattedMessage\n id='add_outgoing_webhook.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n className='btn btn-primary'\n type='submit'\n spinning={this.state.saving}\n spinningText={this.props.loading}\n onClick={this.handleSubmit}\n id='saveWebhook'\n >\n <FormattedMessage\n id={footerToRender.id}\n defaultMessage={footerToRender.defaultMessage}\n />\n </SpinnerButton>\n {renderExtra}\n </div>\n </form>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {defineMessages} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AbstractOutgoingWebhook from 'components/integrations/abstract_outgoing_webhook';\n\nconst messages = defineMessages({\n footer: {\n id: 'add_outgoing_webhook.save',\n defaultMessage: 'Save',\n },\n header: {\n id: 'integrations.add',\n defaultMessage: 'Add',\n },\n loading: {\n id: 'add_outgoing_webhook.saving',\n defaultMessage: 'Saving...',\n },\n});\n\nexport type Props = {\n\n /**\n * The current team\n */\n team: Team;\n\n actions: {\n\n /**\n * The function to call to add a new outgoing webhook\n */\n createOutgoingHook: (hook: OutgoingWebhook) => Promise<ActionResult<OutgoingWebhook>>;\n };\n\n /**\n * Whether to allow configuration of the default post username.\n */\n enablePostUsernameOverride: boolean;\n\n /**\n * Whether to allow configuration of the default post icon.\n */\n enablePostIconOverride: boolean;\n};\n\nconst AddOutgoingWebhook = ({team, actions, enablePostUsernameOverride, enablePostIconOverride}: Props): JSX.Element => {\n const history = useHistory();\n\n const [serverError, setServerError] = useState('');\n\n const addOutgoingHook = async (hook: OutgoingWebhook) => {\n setServerError('');\n\n const {data, error} = await actions.createOutgoingHook(hook);\n if (data) {\n history.push(`/${team.name}/integrations/confirm?type=outgoing_webhooks&id=${data.id}`);\n return;\n }\n\n if (error) {\n setServerError(error.message);\n }\n };\n\n return (\n <AbstractOutgoingWebhook\n team={team}\n header={messages.header}\n footer={messages.footer}\n loading={messages.loading}\n renderExtra={''}\n action={addOutgoingHook}\n serverError={serverError}\n enablePostUsernameOverride={enablePostUsernameOverride}\n enablePostIconOverride={enablePostIconOverride}\n />\n );\n};\n\nexport default AddOutgoingWebhook;\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 {createOutgoingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddOutgoingWebhook from './add_outgoing_webhook';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n return {\n enablePostUsernameOverride,\n enablePostIconOverride,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n createOutgoingHook,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddOutgoingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Bot, BotPatch} from '@mattermost/types/bots';\n\nimport {BotTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {bindClientFunc} from './helpers';\n\nconst BOTS_PER_PAGE_DEFAULT = 20;\n\nexport function createBot(bot: Partial<Bot>) {\n return bindClientFunc({\n clientFunc: Client4.createBot,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n params: [\n bot,\n ],\n });\n}\n\nexport function patchBot(botUserId: string, botPatch: Partial<BotPatch>) {\n return bindClientFunc({\n clientFunc: Client4.patchBot,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n params: [\n botUserId,\n botPatch,\n ],\n });\n}\n\nexport function loadBot(botUserId: string) {\n return bindClientFunc({\n clientFunc: Client4.getBot,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n params: [\n botUserId,\n ],\n });\n}\n\nexport function loadBots(page = 0, perPage = BOTS_PER_PAGE_DEFAULT) {\n return bindClientFunc({\n clientFunc: Client4.getBotsIncludeDeleted,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNTS,\n params: [\n page,\n perPage,\n ],\n });\n}\n\nexport function disableBot(botUserId: string) {\n return bindClientFunc({\n clientFunc: Client4.disableBot,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n params: [\n botUserId,\n ],\n });\n}\n\nexport function enableBot(botUserId: string) {\n return bindClientFunc({\n clientFunc: Client4.enableBot,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n params: [\n botUserId,\n ],\n });\n}\n\nexport function assignBot(botUserId: string, newOwnerId: string) {\n return bindClientFunc({\n clientFunc: Client4.assignBot,\n onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n params: [\n botUserId,\n newOwnerId,\n ],\n });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {IncomingWebhook, OutgoingWebhook, Command} from '@mattermost/types/integrations';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {appsEnabled} from './apps';\n\nexport function getIncomingHooks(state: GlobalState) {\n return state.entities.integrations.incomingHooks;\n}\n\nexport function getIncomingHooksTotalCount(state: GlobalState) {\n return state.entities.integrations.incomingHooksTotalCount;\n}\n\nexport function getOutgoingHooks(state: GlobalState) {\n return state.entities.integrations.outgoingHooks;\n}\n\nexport function getCommands(state: GlobalState) {\n return state.entities.integrations.commands;\n}\n\nexport function getOAuthApps(state: GlobalState) {\n return state.entities.integrations.oauthApps;\n}\n\nexport function getOutgoingOAuthConnections(state: GlobalState) {\n return state.entities.integrations.outgoingOAuthConnections;\n}\n\nexport const getFilteredIncomingHooks: (state: GlobalState) => IncomingWebhook[] = createSelector(\n 'getFilteredIncomingHooks',\n getCurrentTeamId,\n getIncomingHooks,\n (teamId, hooks) => {\n return Object.keys(hooks).\n map((key) => hooks[key]).\n filter((incomingHook) => incomingHook.team_id === teamId);\n },\n);\n\nexport const getAppsOAuthAppIDs: (state: GlobalState) => string[] = createSelector(\n 'getAppsOAuthAppIDs',\n appsEnabled,\n (state: GlobalState) => state.entities.integrations.appsOAuthAppIDs,\n (apps, ids) => {\n return apps ? ids : [];\n },\n);\n\nexport const getAppsBotIDs: (state: GlobalState) => string[] = createSelector(\n 'getAppsBotIDs',\n appsEnabled,\n (state: GlobalState) => state.entities.integrations.appsBotIDs,\n (apps, ids) => {\n return apps ? ids : [];\n },\n);\n\nexport function getSystemCommands(state: GlobalState) {\n return state.entities.integrations.systemCommands;\n}\n\n/**\n * get outgoing hooks in current team\n */\nexport const getOutgoingHooksInCurrentTeam: (state: GlobalState) => OutgoingWebhook[] = createSelector(\n 'getOutgoingHooksInCurrentTeam',\n getCurrentTeamId,\n getOutgoingHooks,\n (teamId, hooks) => {\n return Object.values(hooks).filter((o) => o.team_id === teamId);\n },\n);\n\nexport const getAllCommands: (state: GlobalState) => IDMappedObjects<Command> = createSelector(\n 'getAllCommands',\n getCommands,\n getSystemCommands,\n (commands, systemCommands) => {\n return {\n ...commands,\n ...systemCommands,\n };\n },\n);\n\nexport const getAutocompleteCommandsList: (state: GlobalState) => Command[] = createSelector(\n 'getAutocompleteCommandsList',\n getAllCommands,\n getCurrentTeamId,\n (commands, currentTeamId) => {\n return Object.values(commands).filter((command) => {\n return command && (!command.team_id || command.team_id === currentTeamId) && command.auto_complete;\n }).sort((a, b) => a.display_name.localeCompare(b.display_name));\n },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport type {ChangeEvent, ReactNode} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport LoadingScreen from 'components/loading_screen';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport SearchIcon from 'components/widgets/icons/fa_search_icon';\n\nimport './backstage_list.scss';\n\ntype Props = {\n children?: JSX.Element[] | ((filter: string) => [JSX.Element[], boolean]);\n header: ReactNode;\n addLink?: string;\n addText?: ReactNode;\n addButtonId?: string;\n emptyText?: ReactNode;\n emptyTextSearch?: JSX.Element;\n helpText?: ReactNode;\n loading: boolean;\n searchPlaceholder?: string;\n nextPage?: () => void;\n previousPage?: () => void;\n page?: number;\n pageSize?: number;\n total?: number;\n};\n\nconst getPaging = (remainingProps: Props, childCount: number, hasFilter: boolean) => {\n const page = (hasFilter || !remainingProps.page) ? 0 : remainingProps.page;\n const pageSize = (hasFilter || !remainingProps.pageSize) ? childCount : remainingProps.pageSize;\n const total = (hasFilter || !remainingProps.total) ? childCount : remainingProps.total;\n\n let startCount = (page * pageSize) + 1;\n let endCount = (page + 1) * pageSize;\n endCount = endCount > total ? total : endCount;\n if (endCount === 0) {\n startCount = 0;\n }\n\n const isFirstPage = startCount <= 1;\n const isLastPage = endCount >= total;\n\n return {startCount, endCount, total, isFirstPage, isLastPage};\n};\n\nconst BackstageList = (remainingProps: Props) => {\n const {formatMessage} = useIntl();\n\n const [filter, setFilter] = useState('');\n const updateFilter = (e: ChangeEvent<HTMLInputElement>) => setFilter(e.target.value);\n const filterLowered = filter.toLowerCase();\n\n let searchPlaceholder;\n if (remainingProps.searchPlaceholder) {\n searchPlaceholder = remainingProps.searchPlaceholder;\n } else {\n searchPlaceholder = formatMessage({id: 'backstage_list.search', defaultMessage: 'Search'});\n }\n\n let children = [];\n let childCount = 0;\n if (remainingProps.loading) {\n children = [\n <LoadingScreen\n key='loading'\n />,\n ];\n } else {\n let hasChildren = true;\n if (typeof remainingProps.children === 'function') {\n [children, hasChildren] = remainingProps.children(filterLowered);\n } else {\n children = remainingProps.children as JSX.Element[];\n }\n children = React.Children.map(children, (child) => {\n return React.cloneElement(child, {filterLowered});\n });\n if (children.length === 0 || !hasChildren) {\n if (!filterLowered) {\n if (remainingProps.emptyText) {\n children = [(\n <div\n className='backstage-list__item backstage-list__empty'\n key='emptyText'\n >\n {remainingProps.emptyText}\n </div>\n )];\n }\n } else if (remainingProps.emptyTextSearch) {\n children = [(\n <div\n className='backstage-list__item backstage-list__empty'\n id='emptySearchResultsMessage'\n key='emptyTextSearch'\n >\n {React.cloneElement(remainingProps.emptyTextSearch, {values: {...remainingProps.emptyTextSearch.props.values, searchTerm: filterLowered}})}\n </div>\n )];\n }\n } else {\n childCount = children.length;\n }\n }\n\n let addLink = null;\n\n if (remainingProps.addLink && remainingProps.addText) {\n addLink = (\n <Link\n className='add-link'\n to={remainingProps.addLink}\n >\n <button\n type='button'\n className='btn btn-primary'\n id={remainingProps.addButtonId}\n >\n <span>\n {remainingProps.addText}\n </span>\n </button>\n </Link>\n );\n }\n\n const hasFilter = filter.length > 0;\n const {startCount, endCount, total, isFirstPage, isLastPage} = getPaging(remainingProps, childCount, hasFilter);\n const childrenToDisplay = childCount > 0 ? children.slice(startCount - 1, endCount) : children;\n\n let previousPageFn = remainingProps.previousPage;\n let nextPageFn = remainingProps.nextPage;\n if (isFirstPage) {\n previousPageFn = () => {};\n }\n if (isLastPage) {\n nextPageFn = () => {};\n }\n\n return (\n <div className='backstage-content'>\n <div className='backstage-header'>\n <h1>\n {remainingProps.header}\n </h1>\n {addLink}\n </div>\n <div className='backstage-filters'>\n <div className='backstage-filter__search'>\n <SearchIcon/>\n <input\n type='search'\n className='form-control'\n placeholder={searchPlaceholder}\n value={filter}\n onChange={updateFilter}\n id='searchInput'\n />\n </div>\n </div>\n <span className='backstage-list__help'>\n {remainingProps.helpText}\n </span>\n <div className='backstage-list'>\n {childrenToDisplay}\n </div>\n <div className='backstage-footer'>\n <div className='backstage-footer__cell'>\n <FormattedMessage\n id='backstage_list.paginatorCount'\n defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n values={{\n startCount,\n endCount,\n total,\n }}\n />\n <button\n type='button'\n className={'btn btn-quaternary btn-icon btn-sm ml-2 prev ' + (isFirstPage ? 'disabled' : '')}\n onClick={previousPageFn}\n aria-label={formatMessage({id: 'backstage_list.previousButton.ariaLabel', defaultMessage: 'Previous'})}\n >\n <PreviousIcon/>\n </button>\n <button\n type='button'\n className={'btn btn-quaternary btn-icon btn-sm next ' + (isLastPage ? 'disabled' : '')}\n onClick={nextPageFn}\n aria-label={formatMessage({id: 'backstage_list.nextButton.ariaLabel', defaultMessage: 'Next'})}\n >\n <NextIcon/>\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default BackstageList;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, SyntheticEvent, ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Bot as BotType} from '@mattermost/types/bots';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile, UserAccessToken} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport Markdown from 'components/markdown';\nimport SaveButton from 'components/save_button';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nimport * as Utils from 'utils/utils';\n\nexport function matchesFilter(bot: BotType, filter?: string, owner?: UserProfile): boolean {\n if (!filter) {\n return true;\n }\n const username = bot.username || '';\n const description = bot.description || '';\n const displayName = bot.display_name || '';\n\n let ownerUsername = 'plugin';\n if (owner && owner.username) {\n ownerUsername = owner.username;\n }\n return !(username.toLowerCase().indexOf(filter) === -1 &&\n displayName.toLowerCase().indexOf(filter) === -1 &&\n description.toLowerCase().indexOf(filter) === -1 &&\n ownerUsername.toLowerCase().indexOf(filter) === -1);\n}\n\ntype Props = {\n\n /**\n * Bot that we are displaying\n */\n bot: BotType;\n\n /**\n * Owner of the bot we are displaying\n */\n owner?: UserProfile;\n\n /**\n * User of the bot we are displaying\n */\n user: UserProfile;\n\n /**\n * The access tokens of the bot user\n */\n accessTokens: Record<string, UserAccessToken>;\n\n /**\n * String used for filtering bot items\n */\n filter?: string;\n\n /**\n * Determine whether this bot is managed by the app framework\n */\n fromApp: boolean;\n\n actions: {\n\n /**\n * Disable a bot\n */\n disableBot: (userId: string) => Promise<ActionResult>;\n\n /**\n * Enable a bot\n */\n enableBot: (userId: string) => Promise<ActionResult>;\n\n /**\n * Access token managment\n */\n createUserAccessToken: (userId: string, description: string) => Promise<ActionResult<UserAccessToken>>;\n\n revokeUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n enableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n disableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n };\n\n /**\n * Only used for routing since backstage is team based.\n */\n team: Team;\n}\n\ntype State = {\n confirmingId: string;\n creatingTokenState: string;\n token: UserAccessToken | Record<string, any>;\n error: ReactNode;\n}\n\nexport default class Bot extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n confirmingId: '',\n creatingTokenState: 'CLOSED',\n token: {},\n error: '',\n };\n }\n\n enableBot = (): void => {\n this.props.actions.enableBot(this.props.bot.user_id);\n };\n\n disableBot = (): void => {\n this.props.actions.disableBot(this.props.bot.user_id);\n };\n\n enableUserAccessToken = (id: string): void => {\n this.props.actions.enableUserAccessToken(id);\n };\n\n disableUserAccessToken = (id: string): void => {\n this.props.actions.disableUserAccessToken(id);\n };\n\n confirmRevokeToken = (id: string): void => {\n this.setState({confirmingId: id});\n };\n\n revokeTokenConfirmed = (): void => {\n this.props.actions.revokeUserAccessToken(this.state.confirmingId);\n this.closeConfirm();\n };\n\n closeConfirm = (): void => {\n this.setState({confirmingId: ''});\n };\n\n openCreateToken = (): void => {\n this.setState({\n creatingTokenState: 'OPEN',\n token: {\n description: '',\n },\n });\n };\n\n closeCreateToken = (): void => {\n this.setState({\n creatingTokenState: 'CLOSED',\n token: {\n description: '',\n },\n });\n };\n\n handleUpdateDescription = (e: ChangeEvent<HTMLInputElement>): void => {\n const target = e.target as HTMLInputElement;\n this.setState({\n token: Object.assign({}, this.state.token, {description: target.value}),\n });\n };\n\n handleCreateToken = async (e: SyntheticEvent): Promise<void> => {\n e.preventDefault();\n\n if (this.state.token.description === '') {\n this.setState({error: (\n <FormattedMessage\n id='bot.token.error.description'\n defaultMessage='Please enter a description.'\n />\n )});\n return;\n }\n\n const {data, error} = await this.props.actions.createUserAccessToken(this.props.bot.user_id, this.state.token.description);\n if (data) {\n this.setState({creatingTokenState: 'CREATED', token: data});\n } else if (error) {\n this.setState({error: error.message});\n }\n };\n\n public render(): JSX.Element | null {\n const username = this.props.bot.username || '';\n const description = this.props.bot.description || '';\n const displayName = this.props.bot.display_name || '';\n\n let ownerUsername = 'plugin';\n if (this.props.fromApp) {\n ownerUsername = 'Apps Framework';\n } else if (this.props.owner && this.props.owner.username) {\n ownerUsername = this.props.owner.username;\n }\n const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n if (!matchesFilter(this.props.bot, filter, this.props.owner)) {\n return null;\n }\n\n const tokenList = [];\n Object.values(this.props.accessTokens).forEach((token) => {\n let activeLink;\n let disableClass = '';\n let disabledText;\n\n if (token.is_active) {\n activeLink = (\n <a\n id={token.id + '_deactivate'}\n href='#'\n onClick={(e) => {\n e.preventDefault();\n this.disableUserAccessToken(token.id);\n }}\n >\n <FormattedMessage\n id='user.settings.tokens.deactivate'\n defaultMessage='Disable'\n />\n </a>);\n } else {\n disableClass = 'light';\n disabledText = (\n <span className='mr-2 light'>\n <FormattedMessage\n id='user.settings.tokens.deactivatedWarning'\n defaultMessage='(Disabled)'\n />\n </span>\n );\n activeLink = (\n <a\n id={token.id + '_activate'}\n href='#'\n onClick={(e) => {\n e.preventDefault();\n this.enableUserAccessToken(token.id);\n }}\n >\n <FormattedMessage\n id='user.settings.tokens.activate'\n defaultMessage='Enable'\n />\n </a>\n );\n }\n\n tokenList.push(\n <div\n key={token.id}\n className='bot-list__item'\n >\n <div className='item-details__row d-flex justify-content-between'>\n <div className={disableClass}>\n <div className='whitespace--nowrap overflow--ellipsis'>\n <b>\n <FormattedMessage\n id='user.settings.tokens.tokenDesc'\n defaultMessage='Token Description: '\n />\n </b>\n {token.description}\n </div>\n <div className='setting-box__token-id whitespace--nowrap overflow--ellipsis'>\n <b>\n <FormattedMessage\n id='user.settings.tokens.tokenId'\n defaultMessage='Token ID: '\n />\n </b>\n {token.id}\n </div>\n </div>\n <div>\n {disabledText}\n {activeLink}\n {' - '}\n <a\n id={token.id + '_delete'}\n href='#'\n onClick={(e) => {\n e.preventDefault();\n this.confirmRevokeToken(token.id);\n }}\n >\n <FormattedMessage\n id='user.settings.tokens.delete'\n defaultMessage='Delete'\n />\n </a>\n </div>\n </div>\n </div>,\n );\n });\n\n let options;\n if (ownerUsername !== 'plugin') {\n options = (\n <div className='item-actions'>\n <button\n id='createToken'\n className='style--none color--link'\n onClick={this.openCreateToken}\n >\n <FormattedMessage\n id='bot.manage.create_token'\n defaultMessage='Create New Token'\n />\n </button>\n {' - '}\n <Link to={`/${this.props.team.name}/integrations/bots/edit?id=${this.props.bot.user_id}`}>\n <FormattedMessage\n id='bots.manage.edit'\n defaultMessage='Edit'\n />\n </Link>\n {' - '}\n <button\n className='style--none color--link'\n onClick={this.disableBot}\n >\n <FormattedMessage\n id='bot.manage.disable'\n defaultMessage='Disable'\n />\n </button>\n </div>\n );\n }\n if (this.props.bot.delete_at !== 0) {\n options = (\n <div className='item-actions'>\n <button\n className='style--none color--link'\n onClick={this.enableBot}\n >\n <FormattedMessage\n id='bot.manage.enable'\n defaultMessage='Enable'\n />\n </button>\n </div>\n );\n }\n\n if (this.state.creatingTokenState === 'OPEN') {\n tokenList.push(\n <div\n key={'create'}\n className='bot-list__item'\n >\n <div key={'create'}>\n <form\n className='form-horizontal'\n onSubmit={this.handleCreateToken}\n >\n <div className='row'>\n <label\n className='col-sm-auto control-label'\n htmlFor='botToken'\n >\n <FormattedMessage\n id='user.settings.tokens.name'\n defaultMessage='Token Description: '\n />\n </label>\n <div className='col-sm-4'>\n <input\n id='botToken'\n autoFocus={true}\n className='form-control form-sm'\n type='text'\n maxLength={64}\n value={this.state.token.description}\n onChange={this.handleUpdateDescription}\n />\n </div>\n </div>\n <div>\n <div className='pt-2 pb-2'>\n <FormattedMessage\n id='user.settings.tokens.nameHelp'\n defaultMessage='Enter a description for your token to remember what it does.'\n />\n </div>\n <label\n id='clientError'\n className='has-error is-empty'\n >\n {this.state.error}\n </label>\n <div className='mt-2'>\n <SaveButton\n btnClass='btn-sm btn-primary'\n savingMessage={\n <FormattedMessage\n id='user.settings.tokens.save'\n defaultMessage='Save'\n />\n }\n saving={false}\n />\n <button\n className='btn btn-sm btn-tertiary'\n onClick={this.closeCreateToken}\n >\n <FormattedMessage\n id='user.settings.tokens.cancel'\n defaultMessage='Cancel'\n />\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>,\n );\n } else if (this.state.creatingTokenState === 'CREATED') {\n tokenList.push(\n <div\n key={'created'}\n className='bot-list__item alert alert-warning'\n >\n <div className='mb-2'>\n <WarningIcon additionalClassName='mr-2'/>\n <FormattedMessage\n id='user.settings.tokens.copy'\n defaultMessage=\"Please copy the access token below. You won't be able to see it again!\"\n />\n </div>\n <div className='whitespace--nowrap overflow--ellipsis'>\n <FormattedMessage\n id='user.settings.tokens.name'\n defaultMessage='Token Description: '\n />\n {this.state.token.description}\n </div>\n <div className='whitespace--nowrap overflow--ellipsis'>\n <FormattedMessage\n id='user.settings.tokens.id'\n defaultMessage='Token ID: '\n />\n {this.state.token.id}\n </div>\n <strong className='word-break--all'>\n <FormattedMessage\n id='user.settings.tokens.token'\n defaultMessage='Access Token: '\n />\n {this.state.token.token}\n </strong>\n <div className='mt-2'>\n <button\n className='btn btn-sm btn-primary'\n onClick={this.closeCreateToken}\n >\n <FormattedMessage\n id='bot.create_token.close'\n defaultMessage='Close'\n />\n </button>\n </div>\n </div>,\n );\n }\n\n const imageURL = Utils.imageURLForUser(this.props.user.id, this.props.user.last_picture_update);\n\n return (\n <div className='backstage-list__item'>\n <div className={'bot-list-img-container'}>\n <img\n className={'bot-list-img'}\n alt={'bot image'}\n src={imageURL}\n />\n </div>\n <div className='item-details'>\n <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n <strong className='item-details__name'>\n {displayName + ' (@' + username + ')'}\n </strong>\n {options}\n </div>\n <div className='bot-details__description'>\n <Markdown message={description}/>\n </div>\n <div className='light small'>\n <FormattedMessage\n id='bots.managed_by'\n defaultMessage='Managed by '\n />\n {ownerUsername}\n </div>\n <div className='bot-list is-empty'>\n {tokenList}\n </div>\n </div>\n <ConfirmModal\n title={\n <FormattedMessage\n id='bots.token.delete'\n defaultMessage='Delete Token'\n />\n }\n message={\n <FormattedMessage\n id='bots.token.confirm_text'\n defaultMessage='Are you sure you want to delete the token?'\n />\n }\n confirmButtonText={\n <FormattedMessage\n id='bots.token.confirm'\n defaultMessage='Delete'\n />\n }\n modalClass='integrations-backstage-modal'\n show={this.state.confirmingId !== ''}\n onConfirm={this.revokeTokenConfirmed}\n onCancel={this.closeConfirm}\n />\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Bot as BotType} from '@mattermost/types/bots';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile, UserAccessToken} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport Bot, {matchesFilter} from './bot';\n\ntype Props = {\n\n /**\n * Map from botUserId to bot.\n */\n bots: Record<string, BotType>;\n\n /**\n * List of bot IDs managed by the app framework\n */\n appsBotIDs: string[];\n\n /**\n * Whether apps framework is enabled\n */\n appsEnabled: boolean;\n\n /**\n * Map from botUserId to accessTokens.\n */\n accessTokens?: RelationOneToOne<UserProfile, Record<string, UserAccessToken>>;\n\n /**\n * Map from botUserId to owner.\n */\n owners: Record<string, UserProfile>;\n\n /**\n * Map from botUserId to user.\n */\n users: Record<string, UserProfile>;\n createBots?: boolean;\n\n actions: {\n\n /**\n * Ensure we have bot accounts\n */\n loadBots: (page?: number, perPage?: number) => Promise<ActionResult<BotType[]>>;\n\n /**\n * Load access tokens for bot accounts\n */\n getUserAccessTokensForUser: (userId: string, page?: number, perPage?: number) => void;\n\n /**\n * Access token managment\n */\n createUserAccessToken: (userId: string, description: string) => Promise<ActionResult<UserAccessToken>>;\n\n revokeUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n enableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n disableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n\n /**\n * Load owner of bot account\n */\n getUser: (userId: string) => void;\n\n /**\n * Disable a bot\n */\n disableBot: (userId: string) => Promise<ActionResult>;\n\n /**\n * Enable a bot\n */\n enableBot: (userId: string) => Promise<ActionResult>;\n\n /**\n * Load bot IDs managed by the apps\n */\n fetchAppsBotIDs: () => Promise<ActionResult>;\n };\n\n /**\n * Only used for routing since backstage is team based.\n */\n team: Team;\n}\n\ntype State = {\n loading: boolean;\n}\n\nexport default class Bots extends React.PureComponent<Props, State> {\n public constructor(props: Props) {\n super(props);\n\n this.state = {\n loading: true,\n };\n }\n\n public componentDidMount(): void {\n this.props.actions.loadBots(\n Constants.Integrations.START_PAGE_NUM,\n Constants.Integrations.PAGE_SIZE,\n ).then(\n (result) => {\n if (result.data) {\n const promises = [];\n\n for (const bot of result.data) {\n // We don't need to wait for this and we need to accept failure in the case where bot.owner_id is a plugin id\n this.props.actions.getUser(bot.owner_id);\n\n // We want to wait for these.\n promises.push(this.props.actions.getUser(bot.user_id));\n promises.push(this.props.actions.getUserAccessTokensForUser(bot.user_id));\n }\n\n Promise.all(promises).then(() => {\n this.setState({loading: false});\n });\n }\n },\n );\n if (this.props.appsEnabled) {\n this.props.actions.fetchAppsBotIDs();\n }\n }\n\n DisabledSection(props: {hasDisabled: boolean; disabledBots: JSX.Element[]; filter?: string}): JSX.Element | null {\n if (!props.hasDisabled) {\n return null;\n }\n const botsToDisplay = React.Children.map(props.disabledBots, (child) => {\n return React.cloneElement(child, {filter: props.filter});\n });\n return (\n <>\n <div className='bot-disabled'>\n <FormattedMessage\n id='bots.disabled'\n defaultMessage='Disabled'\n />\n </div>\n <div className='bot-list__disabled'>\n {botsToDisplay}\n </div>\n </>\n );\n }\n\n EnabledSection(props: {enabledBots: JSX.Element[]; filter?: string}): JSX.Element {\n const botsToDisplay = React.Children.map(props.enabledBots, (child) => {\n return React.cloneElement(child, {filter: props.filter});\n });\n return (\n <div>\n {botsToDisplay}\n </div>\n );\n }\n\n botToJSX = (bot: BotType): JSX.Element => {\n return (\n <Bot\n key={bot.user_id}\n bot={bot}\n owner={this.props.owners[bot.user_id]}\n user={this.props.users[bot.user_id]}\n accessTokens={(this.props.accessTokens && this.props.accessTokens[bot.user_id]) || {}}\n actions={this.props.actions}\n team={this.props.team}\n fromApp={this.props.appsBotIDs.includes(bot.user_id)}\n />\n );\n };\n\n bots = (filter?: string): [JSX.Element[], boolean] => {\n const bots = Object.values(this.props.bots).sort((a, b) => a.username.localeCompare(b.username));\n const match = (bot: BotType) => matchesFilter(bot, filter, this.props.owners[bot.user_id]);\n const enabledBots = bots.filter((bot) => bot.delete_at === 0).filter(match).map(this.botToJSX);\n const disabledBots = bots.filter((bot) => bot.delete_at > 0).filter(match).map(this.botToJSX);\n const sections = [(\n <div key='sections'>\n <this.EnabledSection\n enabledBots={enabledBots}\n />\n <this.DisabledSection\n hasDisabled={disabledBots.length > 0}\n disabledBots={disabledBots}\n />\n </div>\n )];\n\n return [sections, enabledBots.length > 0 || disabledBots.length > 0];\n };\n\n public render(): JSX.Element {\n return (\n <BackstageList\n header={\n <FormattedMessage\n id='bots.manage.header'\n defaultMessage='Bot Accounts'\n />\n }\n addText={this.props.createBots &&\n <FormattedMessage\n id='bots.manage.add'\n defaultMessage='Add Bot Account'\n />\n }\n addLink={'/' + this.props.team.name + '/integrations/bots/add'}\n addButtonId='addBotAccount'\n emptyText={\n <FormattedMessage\n id='bots.manage.empty'\n defaultMessage='No bot accounts found'\n />\n }\n emptyTextSearch={\n <FormattedMessage\n id='bots.emptySearch'\n defaultMessage='No bot accounts match <b>{searchTerm}</b>'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n }\n helpText={\n <>\n <FormattedMessage\n id='bots.manage.help1'\n defaultMessage='Use {botAccounts} to integrate with Mattermost through plugins or the API. Bot accounts are available to everyone on your server. '\n values={{\n botAccounts: (\n <ExternalLink\n href='https://mattermost.com/pl/default-bot-accounts'\n location='bots'\n >\n <FormattedMessage\n id='bots.manage.bot_accounts'\n defaultMessage='Bot Accounts'\n />\n </ExternalLink>\n ),\n }}\n />\n <FormattedMessage\n id='bots.help2'\n defaultMessage={'Enable bot account creation in the <a>System Console</a>.'}\n values={{\n a: (chunks: string) => <Link to='/admin_console/integrations/bot_accounts'>{chunks}</Link>,\n }}\n />\n </>\n }\n searchPlaceholder={Utils.localizeMessage({id: 'bots.manage.search', defaultMessage: 'Search Bot Accounts'})}\n loading={this.state.loading}\n >\n {this.bots}\n </BackstageList>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Bot as BotType} from '@mattermost/types/bots';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {loadBots, disableBot, enableBot} from 'mattermost-redux/actions/bots';\nimport {getAppsBotIDs as fetchAppsBotIDs} from 'mattermost-redux/actions/integrations';\nimport {createUserAccessToken, revokeUserAccessToken, enableUserAccessToken, disableUserAccessToken, getUserAccessTokensForUser, getUser} from 'mattermost-redux/actions/users';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getExternalBotAccounts} from 'mattermost-redux/selectors/entities/bots';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getAppsBotIDs} from 'mattermost-redux/selectors/entities/integrations';\nimport * as UserSelectors from 'mattermost-redux/selectors/entities/users';\n\nimport Bots from './bots';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const createBots = config.EnableBotAccountCreation === 'true';\n const bots = getExternalBotAccounts(state);\n const botValues = Object.values(bots);\n const owners = botValues.\n reduce((result: Record<string, UserProfile>, bot: BotType) => {\n result[bot.user_id] = UserSelectors.getUser(state, bot.owner_id);\n return result;\n }, {});\n const users = botValues.\n reduce((result: Record<string, UserProfile>, bot: BotType) => {\n result[bot.user_id] = UserSelectors.getUser(state, bot.user_id);\n return result;\n }, {});\n\n return {\n createBots,\n bots,\n accessTokens: state.entities.admin.userAccessTokensByUser,\n owners,\n users,\n appsBotIDs: getAppsBotIDs(state),\n appsEnabled: appsEnabled(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n fetchAppsBotIDs,\n loadBots,\n getUserAccessTokensForUser,\n createUserAccessToken,\n revokeUserAccessToken,\n enableUserAccessToken,\n disableUserAccessToken,\n getUser,\n disableBot,\n enableBot,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Bots);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, FormEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Bot, BotPatch} from '@mattermost/types/bots';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserAccessToken, UserProfile} from '@mattermost/types/users';\n\nimport {General} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\nimport WithTooltip from 'components/with_tooltip';\n\nimport BotDefaultIcon from 'images/bot_default_icon.png';\nimport {getHistory} from 'utils/browser_history';\nimport {AcceptedProfileImageTypes, Constants, DeveloperLinks, ValidationErrors} from 'utils/constants';\nimport * as FileUtils from 'utils/file_utils';\nimport * as Utils from 'utils/utils';\n\nconst roleOptionSystemAdmin = 'System Admin';\nconst roleOptionMember = 'Member';\n\nexport type Props = {\n\n /**\n * Only used for routing since backstage is team based.\n */\n team: Team;\n\n /**\n * Bot to edit (if editing)\n */\n bot?: Bot;\n\n /**\n * Bot user\n */\n user?: UserProfile;\n\n /**\n * Roles of the bot to edit (if editing)\n */\n roles?: string;\n\n /**\n * Maximum upload file size (for bot account profile picture)\n */\n maxFileSize: number;\n\n /**\n * Editing user has the MANAGE_SYSTEM permission\n */\n editingUserHasManageSystem: boolean;\n\n /**\n * Bot to edit\n */\n actions: {\n\n /**\n * Creates a new bot account.\n */\n createBot: (bot: Partial<Bot>) => Promise<ActionResult<Bot>>;\n\n /**\n * Patches an existing bot account.\n */\n patchBot: (botUserId: string, botPatch: Partial<BotPatch>) => Promise<ActionResult<Bot>>;\n\n /**\n * Uploads a user profile image\n */\n uploadProfileImage: (userId: string, image: File | string) => Promise<ActionResult>;\n\n /**\n * Set profile image to default\n */\n setDefaultProfileImage: (userId: string) => Promise<ActionResult>;\n\n /**\n * For creating default access token\n */\n createUserAccessToken: (userId: string, description: string) => Promise<ActionResult<UserAccessToken>>;\n\n /**\n * For creating setting bot to system admin or special posting permissions\n */\n updateUserRoles: (userId: string, roles: string) => Promise<ActionResult>;\n };\n};\n\nexport type State = {\n username: string;\n displayName: string | undefined;\n description: string | undefined;\n role: string;\n postAll: boolean;\n postChannels: boolean;\n error: JSX.Element | string;\n adding: boolean;\n image: string;\n orientationStyles: { transform: string; transformOrigin: string };\n pictureFile: File | null | string;\n};\n\nexport default class AddBot extends React.PureComponent<Props, State> {\n previewBlob: string | null = null;\n constructor(props: Props) {\n super(props);\n\n this.state = {\n error: '',\n username: this.props.bot ? this.props.bot.username : '',\n displayName: this.props.bot ? this.props.bot.display_name : '',\n description: this.props.bot ? this.props.bot.description : '',\n adding: false,\n image: BotDefaultIcon,\n role: UserUtils.isSystemAdmin(this.props.roles || '') ? roleOptionSystemAdmin : roleOptionMember,\n postAll: this.props.bot ? UserUtils.hasPostAllRole(this.props.roles || '') : false,\n postChannels: this.props.bot ? UserUtils.hasPostAllPublicRole(this.props.roles || '') : false,\n orientationStyles: {transform: '', transformOrigin: ''},\n pictureFile: null,\n };\n }\n\n updateUsername = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n username: e.target.value,\n });\n };\n\n updateDisplayName = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n displayName: e.target.value,\n });\n };\n\n updateDescription = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n description: e.target.value,\n });\n };\n\n updateRole = (e: ChangeEvent<HTMLSelectElement>) => {\n this.setState({\n role: e.target.value,\n });\n };\n\n updatePostAll = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n postAll: e.target.checked,\n });\n };\n\n updatePostChannels = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n postChannels: e.target.checked,\n });\n };\n\n updatePicture = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files[0]) {\n const pictureFile = e.target.files[0];\n this.previewBlob = URL.createObjectURL(pictureFile);\n\n const reader = new FileReader();\n reader.onload = (e2) => {\n const orientation = FileUtils.getExifOrientation(e2.target?.result as ArrayBuffer);\n const orientationStyles = FileUtils.getOrientationStyles(orientation);\n\n this.setState({\n image: this.previewBlob || '',\n orientationStyles,\n });\n };\n reader.readAsArrayBuffer(pictureFile);\n e.target.value = '';\n this.setState({pictureFile});\n } else {\n this.setState({pictureFile: null, image: ''});\n }\n };\n\n setDefault = () => {\n this.setState({pictureFile: 'default', image: BotDefaultIcon});\n };\n\n isFile(file: File | string): file is File {\n return (file as File).size !== undefined;\n }\n\n updateRoles = async (data: Bot) => {\n let roles = General.SYSTEM_USER_ROLE;\n\n if (this.state.role === roleOptionSystemAdmin) {\n roles += ' ' + General.SYSTEM_ADMIN_ROLE;\n } else if (this.state.postAll) {\n roles += ' ' + General.SYSTEM_POST_ALL_ROLE;\n } else if (this.state.postChannels) {\n roles += ' ' + General.SYSTEM_POST_ALL_PUBLIC_ROLE;\n }\n\n const rolesResult = await this.props.actions.updateUserRoles(data.user_id, roles);\n if (rolesResult) {\n return rolesResult.error;\n }\n\n return null;\n };\n\n handleSubmit = async (e: FormEvent<HTMLButtonElement | HTMLFormElement>) => {\n e.preventDefault();\n\n if (this.state.adding) {\n return;\n }\n\n if (!this.state.username || this.state.username.length < 3) {\n this.setState({\n error: (\n <FormattedMessage\n id='bots.manage.add.invalid_username'\n defaultMessage='Usernames have to begin with a lowercase letter and be 3-22 characters long. You can use lowercase letters, numbers, periods, dashes, and underscores.'\n />\n ),\n });\n return;\n }\n\n if (this.state.pictureFile && this.isFile(this.state.pictureFile)) {\n if (!AcceptedProfileImageTypes.includes(this.state.pictureFile.type)) {\n this.setState({\n error: (\n <FormattedMessage\n id='user.settings.general.validImage'\n defaultMessage='Only BMP, JPG or PNG images may be used for profile pictures'\n />\n ),\n });\n return;\n } else if (this.state.pictureFile.size > this.props.maxFileSize) {\n this.setState({\n error: (\n <FormattedMessage\n id='user.settings.general.imageTooLarge'\n defaultMessage='Unable to upload profile image. File is too large.'\n />\n ),\n });\n return;\n }\n }\n\n this.setState({\n adding: true,\n error: '',\n });\n\n const bot = {\n username: this.state.username.toLowerCase().trim(),\n display_name: this.state.displayName,\n description: this.state.description,\n };\n\n let data: Bot | undefined;\n let error;\n if (this.props.bot) {\n const result = await this.props.actions.patchBot(this.props.bot.user_id, bot);\n if (result) {\n data = result.data;\n error = result.error;\n } else {\n error = Utils.localizeMessage({id: 'bot.edit_failed', defaultMessage: 'Failed to edit bot'});\n }\n\n if (!error && data) {\n if (this.state.pictureFile && this.state.pictureFile !== 'default') {\n const imageResult = await this.props.actions.uploadProfileImage(data.user_id, this.state.pictureFile);\n error = imageResult.error;\n } else if (this.state.pictureFile && this.state.pictureFile === 'default') {\n await this.props.actions.setDefaultProfileImage(data.user_id);\n }\n }\n\n if (!error && data) {\n error = this.updateRoles(data);\n }\n\n if (data) {\n getHistory().push(`/${this.props.team.name}/integrations/bots`);\n return;\n }\n } else {\n const usernameError = Utils.isValidBotUsername(bot.username);\n if (usernameError) {\n let errObj;\n if (usernameError.id === ValidationErrors.INVALID_LAST_CHARACTER) {\n errObj = {\n adding: false,\n error: (\n <FormattedMessage\n id='bots.manage.add.invalid_last_char'\n defaultMessage='Bot usernames cannot have a period as the last character'\n />\n ),\n };\n } else {\n errObj = {\n adding: false,\n error: (\n <FormattedMessage\n id='bots.manage.add.invalid_username'\n defaultMessage='Usernames have to begin with a lowercase letter and be 3-22 characters long. You can use lowercase letters, numbers, periods, dashes, and underscores.'\n />\n ),\n };\n }\n this.setState(errObj);\n return;\n }\n\n const result = await this.props.actions.createBot(bot);\n if (result) {\n data = result.data;\n error = result.error;\n } else {\n error = Utils.localizeMessage({id: 'bot.create_failed', defaultMessage: 'Failed to create bot'});\n }\n\n let token = '';\n if (!error && data) {\n if (this.state.pictureFile && this.state.pictureFile !== 'default') {\n await this.props.actions.uploadProfileImage(data.user_id, this.state.pictureFile);\n } else {\n await this.props.actions.setDefaultProfileImage(data.user_id);\n }\n const tokenResult = await this.props.actions.createUserAccessToken(data.user_id,\n Utils.localizeMessage({id: 'bot.token.default.description', defaultMessage: 'Default Token'}),\n );\n\n // On error just skip the confirmation because we have a bot without a token.\n if (!tokenResult || tokenResult.error) {\n getHistory().push(`/${this.props.team.name}/integrations/bots`);\n return;\n }\n\n token = tokenResult.data!.token!;\n }\n\n if (!error && data) {\n error = this.updateRoles(data);\n }\n\n if (data) {\n getHistory().push(`/${this.props.team.name}/integrations/confirm?type=bots&id=${data.user_id}&token=${token}`);\n return;\n }\n }\n\n this.setState({\n adding: false,\n });\n\n if (error) {\n this.setState({\n error: error.message,\n });\n }\n };\n\n render() {\n let subtitle = (\n <FormattedMessage\n id='bots.manage.add.add'\n defaultMessage='Add'\n />\n );\n let buttonText = (\n <FormattedMessage\n id='bots.manage.add.create'\n defaultMessage='Create Bot Account'\n />\n );\n let buttonActiveText = (\n <FormattedMessage\n id='bots.manage.add.creating'\n defaultMessage='Creating...'\n />\n );\n\n // If we are editing\n if (this.props.bot) {\n subtitle = (\n <FormattedMessage\n id='bots.manage.edit'\n defaultMessage='Edit'\n />\n );\n buttonText = (\n <FormattedMessage\n id='bots.manage.edit.title'\n defaultMessage='Update'\n />\n );\n buttonActiveText = (\n <FormattedMessage\n id='bots.manage.edit.editing'\n defaultMessage='Updating...'\n />\n );\n }\n\n let imageURL = '';\n let removeImageIcon: JSX.Element | null = (\n <WithTooltip\n title={\n <FormattedMessage\n id='bot.remove_profile_picture'\n defaultMessage='Remove Bot Icon'\n />\n }\n >\n <a\n className={'bot-profile__remove'}\n onClick={this.setDefault}\n >\n <span>{'×'}</span>\n </a>\n </WithTooltip>\n );\n let imageStyles;\n if (this.props.bot && !this.state.pictureFile) {\n if (this.props.user) {\n imageURL = Utils.imageURLForUser(this.props.user.id, this.props.user.last_picture_update);\n } else {\n imageURL = Utils.imageURLForUser(this.props.bot.user_id);\n }\n } else {\n imageURL = this.state.image;\n imageStyles = this.state.orientationStyles;\n if (this.state.image === BotDefaultIcon) {\n removeImageIcon = null;\n }\n }\n\n return (\n <div className='backstage-content'>\n <BackstageHeader>\n <Link to={`/${this.props.team.name}/integrations/bots`}>\n <FormattedMessage\n id='bots.manage.header'\n defaultMessage='Bot Accounts'\n />\n </Link>\n {subtitle}\n </BackstageHeader>\n <div className='backstage-form'>\n <form\n className='form-horizontal'\n onSubmit={this.handleSubmit}\n >\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='username'\n >\n <FormattedMessage\n id='bots.add.username'\n defaultMessage='Username'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='username'\n type='text'\n maxLength={22}\n className='form-control'\n value={this.state.username}\n onChange={this.updateUsername}\n />\n <div className='form__help'>\n <FormattedMessage\n id='bot.add.username.help'\n defaultMessage='You can use lowercase letters, numbers, periods, dashes, and underscores.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='boticon'\n >\n <FormattedMessage\n id='bots.add.icon'\n defaultMessage='Bot Icon'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <div className={'bot-img-container'}>\n <img\n className={'bot-img'}\n alt={'bot image'}\n src={imageURL}\n style={imageStyles}\n />\n {removeImageIcon}\n </div>\n <div\n className='btn btn-primary btn-file'\n >\n <FormattedMessage\n id='bots.image.upload'\n defaultMessage='Upload Image'\n />\n <input\n className='btn-file__input'\n accept={Constants.ACCEPT_STATIC_IMAGE}\n type='file'\n onChange={this.updatePicture}\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='displayName'\n >\n <FormattedMessage\n id='bots.add.displayName'\n defaultMessage='Display Name'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='displayName'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.displayName}\n onChange={this.updateDisplayName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='bot.add.display_name.help'\n defaultMessage={'(Optional) You can choose to display your bot\\'s full name rather than its username.'}\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='description'\n >\n <FormattedMessage\n id='bot.add.description'\n defaultMessage='Description'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='description'\n type='text'\n maxLength={1024}\n className='form-control'\n value={this.state.description}\n onChange={this.updateDescription}\n />\n <div className='form__help'>\n <FormattedMessage\n id='bot.add.description.help'\n defaultMessage='(Optional) Let others know what this bot does.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='role'\n >\n <FormattedMessage\n id='bot.add.role'\n defaultMessage='Role'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <select\n className='form-control'\n value={this.state.role}\n disabled={!this.props.editingUserHasManageSystem}\n onChange={this.updateRole}\n >\n <option\n value={roleOptionMember}\n >\n {Utils.localizeMessage({id: 'bot.add.role.member', defaultMessage: 'Member'})}\n </option>\n <option\n value={roleOptionSystemAdmin}\n >\n {Utils.localizeMessage({id: 'bot.add.role.admin', defaultMessage: 'System Admin'})}\n </option>\n </select>\n <div className='form__help'>\n <FormattedMessage\n id='bot.add.role.help'\n defaultMessage='Choose what role the bot should have.'\n />\n </div>\n </div>\n </div>\n <div className='row bot-profile__section'>\n <div className='col-md-5 col-sm-8 col-sm-offset-4'>\n <FormattedMessage\n id='admin.manage_roles.botAdditionalRoles'\n defaultMessage='Select additional permissions for the account. <link>Read more about roles and permissions</link>.'\n values={{\n link: (msg: React.ReactNode) => (\n <ExternalLink\n href={DeveloperLinks.PERSONAL_ACCESS_TOKENS}\n location='add_bot'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='postAll'\n >\n <FormattedMessage\n id='bot.add.post_all'\n defaultMessage='post:all'\n />\n </label>\n <div className='col-md-5 col-sm-8 checkbox'>\n <div className='checkbox no-padding'>\n <label htmlFor='postAll'>\n <input\n id='postAll'\n type='checkbox'\n checked={this.state.postAll || this.state.role === roleOptionSystemAdmin}\n onChange={this.updatePostAll}\n disabled={!this.props.editingUserHasManageSystem || this.state.role === roleOptionSystemAdmin}\n />\n <FormattedMessage\n id='bot.add.post_all.enabled'\n defaultMessage='Enabled'\n />\n </label>\n </div>\n <div className='form__help'>\n <FormattedMessage\n id='bot.add.post_all.help'\n defaultMessage='Bot will have access to post to all Mattermost channels including direct messages.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='postChannels'\n >\n <FormattedMessage\n id='bot.add.post_channels'\n defaultMessage='post:channels'\n />\n </label>\n <div className='col-md-5 col-sm-8 checkbox'>\n <div className='checkbox no-padding'>\n <label htmlFor='postChannels'>\n <input\n id='postChannels'\n type='checkbox'\n checked={this.state.postChannels || this.state.role === roleOptionSystemAdmin || this.state.postAll}\n onChange={this.updatePostChannels}\n disabled={!this.props.editingUserHasManageSystem || this.state.role === roleOptionSystemAdmin || this.state.postAll}\n />\n <FormattedMessage\n id='bot.add.post_channels.enabled'\n defaultMessage='Enabled'\n />\n </label>\n </div>\n <div className='form__help'>\n <FormattedMessage\n id='bot.add.post_channels.help'\n defaultMessage='Bot will have access to post to all Mattermost public channels.'\n />\n </div>\n </div>\n </div>\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n errors={[this.state.error]}\n />\n <Link\n className='btn btn-tertiary'\n to={`/${this.props.team.name}/integrations/bots`}\n >\n <FormattedMessage\n id='bots.manage.add.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n className='btn btn-primary'\n type='submit'\n spinning={this.state.adding}\n spinningText={buttonActiveText}\n onClick={this.handleSubmit}\n id='saveBot'\n >\n {buttonText}\n </SpinnerButton>\n </div>\n </form>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {createBot, patchBot} from 'mattermost-redux/actions/bots';\nimport {updateUserRoles, uploadProfileImage, setDefaultProfileImage, createUserAccessToken} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getBotAccounts} from 'mattermost-redux/selectors/entities/bots';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddBot from './add_bot';\n\ntype OwnProps = {\n\n /**\n * Search query for the bot\n */\n location: RouteComponentProps['location'];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n const botId = (new URLSearchParams(ownProps.location.search)).get('id');\n const bots = getBotAccounts(state);\n const bot = (bots && botId) ? bots[botId] : undefined;\n const user = bot ? getUser(state, bot.user_id) : undefined;\n const roles = user ? user.roles : undefined;\n return {\n maxFileSize: parseInt(config.MaxFileSize!, 10),\n bot,\n roles,\n editingUserHasManageSystem: haveISystemPermission(state, {permission: Permissions.MANAGE_SYSTEM}),\n user,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n createBot,\n patchBot,\n uploadProfileImage,\n setDefaultProfileImage,\n createUserAccessToken,\n updateUserRoles,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddBot);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {IncomingWebhook, IncomingWebhooksWithCount, OutgoingWebhook, Command, OAuthApp, OutgoingOAuthConnection} from '@mattermost/types/integrations';\n\nimport * as IntegrationActions from 'mattermost-redux/actions/integrations';\nimport {getProfilesByIds} from 'mattermost-redux/actions/users';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nconst DEFAULT_PAGE_SIZE = 100;\n\nexport function loadIncomingHooksAndProfilesForTeam(teamId: string, page = 0, perPage = DEFAULT_PAGE_SIZE, includeTotalCount = false): ActionFuncAsync<IncomingWebhook[] | IncomingWebhooksWithCount> {\n return async (dispatch) => {\n const {data} = await dispatch(IntegrationActions.getIncomingHooks(teamId, page, perPage, includeTotalCount));\n if (data) {\n const isWebhooksWithCount = IntegrationActions.isIncomingWebhooksWithCount(data);\n const hooks = isWebhooksWithCount ? (data as IncomingWebhooksWithCount).incoming_webhooks : data;\n dispatch(loadProfilesForIncomingHooks(hooks as IncomingWebhook[]));\n }\n return {data};\n };\n}\n\nexport function loadProfilesForIncomingHooks(hooks: IncomingWebhook[]): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const profilesToLoad: {[key: string]: boolean} = {};\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i];\n if (!getUser(state, hook.user_id)) {\n profilesToLoad[hook.user_id] = true;\n }\n }\n\n const list = Object.keys(profilesToLoad);\n if (list.length === 0) {\n return {data: null};\n }\n\n dispatch(getProfilesByIds(list));\n return {data: null};\n };\n}\n\nexport function loadOutgoingHooksAndProfilesForTeam(teamId: string, page = 0, perPage = DEFAULT_PAGE_SIZE): ActionFuncAsync<OutgoingWebhook[]> {\n return async (dispatch) => {\n const {data} = await dispatch(IntegrationActions.getOutgoingHooks('', teamId, page, perPage));\n if (data) {\n dispatch(loadProfilesForOutgoingHooks(data));\n }\n return {data};\n };\n}\n\nexport function loadProfilesForOutgoingHooks(hooks: OutgoingWebhook[]): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const profilesToLoad: {[key: string]: boolean} = {};\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i];\n if (!getUser(state, hook.creator_id)) {\n profilesToLoad[hook.creator_id] = true;\n }\n }\n\n const list = Object.keys(profilesToLoad);\n if (list.length === 0) {\n return {data: null};\n }\n\n dispatch(getProfilesByIds(list));\n return {data: null};\n };\n}\n\nexport function loadCommandsAndProfilesForTeam(teamId: string): ActionFuncAsync {\n return async (dispatch) => {\n const {data} = await dispatch(IntegrationActions.getCustomTeamCommands(teamId));\n if (data) {\n dispatch(loadProfilesForCommands(data));\n }\n return {data};\n };\n}\n\nexport function loadProfilesForCommands(commands: Command[]): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const profilesToLoad: {[key: string]: boolean} = {};\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i];\n if (!getUser(state, command.creator_id)) {\n profilesToLoad[command.creator_id] = true;\n }\n }\n\n const list = Object.keys(profilesToLoad);\n if (list.length === 0) {\n return {data: null};\n }\n\n dispatch(getProfilesByIds(list));\n return {data: null};\n };\n}\n\nexport function loadOAuthAppsAndProfiles(page = 0, perPage = DEFAULT_PAGE_SIZE): ActionFuncAsync {\n return async (dispatch, getState) => {\n if (appsEnabled(getState())) {\n dispatch(IntegrationActions.getAppsOAuthAppIDs());\n }\n const {data} = await dispatch(IntegrationActions.getOAuthApps(page, perPage));\n if (data) {\n dispatch(loadProfilesForOAuthApps(data));\n }\n return {data: null};\n };\n}\n\nexport function loadProfilesForOAuthApps(apps: OAuthApp[]): ActionFuncAsync {\n return async (dispatch, getState) => {\n const state = getState();\n const profilesToLoad: {[key: string]: boolean} = {};\n for (let i = 0; i < apps.length; i++) {\n const app = apps[i];\n if (!getUser(state, app.creator_id)) {\n profilesToLoad[app.creator_id] = true;\n }\n }\n\n const list = Object.keys(profilesToLoad);\n if (list.length === 0) {\n return {data: null};\n }\n\n dispatch(getProfilesByIds(list));\n return {data: null};\n };\n}\n\nexport function loadOutgoingOAuthConnectionsAndProfiles(teamId: string, page = 0, perPage = DEFAULT_PAGE_SIZE): ActionFuncAsync<null> {\n return async (dispatch) => {\n const {data} = await dispatch(IntegrationActions.getOutgoingOAuthConnections(teamId, page, perPage));\n if (data) {\n dispatch(loadProfilesForOutgoingOAuthConnections(data));\n }\n return {data: null};\n };\n}\n\nexport function loadProfilesForOutgoingOAuthConnections(connections: OutgoingOAuthConnection[]): ActionFuncAsync<null> {\n return async (dispatch, getState) => {\n const state = getState();\n const profilesToLoad: {[key: string]: boolean} = {};\n for (let i = 0; i < connections.length; i++) {\n const app = connections[i];\n if (!getUser(state, app.creator_id)) {\n profilesToLoad[app.creator_id] = true;\n }\n }\n\n const list = Object.keys(profilesToLoad);\n if (list.length === 0) {\n return {data: null};\n }\n\n dispatch(getProfilesByIds(list));\n return {data: null};\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, useMemo, useRef, useState} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {OauthIcon, InformationOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\n\nimport {\n getOutgoingOAuthConnectionsForAudience as fetchOutgoingOAuthConnectionsForAudience,\n getOutgoingOAuthConnections as fetchOutgoingOAuthConnections,\n} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n placeholder: MessageDescriptor;\n}\n\nconst OAuthConnectionAudienceInput = (props: Props) => {\n const mounted = useRef(false);\n const [matchedConnection, setMatchingOAuthConnection] = useState<OutgoingOAuthConnection | null>(null);\n const [loadingAudienceMatch, setLoadingAudienceMatch] = useState(false);\n\n const oauthConnections = useSelector(getOutgoingOAuthConnections);\n const oauthConnectionsEnabled = useSelector(getConfig).EnableOutgoingOAuthConnections === 'true';\n const teamId = useSelector(getCurrentTeamId);\n\n const dispatch = useDispatch();\n\n const matchConnectionsOnInput = useCallback(async (inputValue: string) => {\n const res = await dispatch(fetchOutgoingOAuthConnectionsForAudience(teamId, inputValue));\n setLoadingAudienceMatch(false);\n\n if (res.data && res.data.length) {\n setMatchingOAuthConnection(res.data[0]);\n } else {\n setMatchingOAuthConnection(null);\n }\n }, [dispatch, teamId]);\n\n const debouncedMatchConnections = useMemo(() => {\n return debounce((inputValue: string) => matchConnectionsOnInput(inputValue), 1000);\n }, [matchConnectionsOnInput]);\n\n useEffect(() => {\n if (mounted.current) {\n return;\n }\n mounted.current = true;\n\n if (oauthConnectionsEnabled) {\n dispatch(fetchOutgoingOAuthConnections(teamId));\n if (props.value) {\n setLoadingAudienceMatch(true);\n matchConnectionsOnInput(props.value);\n }\n }\n }, [oauthConnectionsEnabled, props.value, teamId, matchConnectionsOnInput, dispatch, mounted]);\n\n const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n props.onChange(e);\n\n if (oauthConnectionsEnabled) {\n setLoadingAudienceMatch(true);\n debouncedMatchConnections(e.target.value);\n }\n };\n\n const connections = Object.values(oauthConnections);\n\n const input = (\n <LocalizedPlaceholderInput\n autoComplete='off'\n id='url'\n maxLength={1024}\n className='form-control'\n value={props.value}\n onChange={onChange}\n placeholder={props.placeholder}\n />\n );\n\n if (!connections.length) {\n return input;\n }\n\n let oauthMessage: React.ReactNode;\n\n if (loadingAudienceMatch) {\n oauthMessage = (\n <span>\n <LoadingSpinner/>\n </span>\n );\n } else if (matchedConnection) {\n oauthMessage = (\n <>\n <span>\n <OauthIcon\n size={20}\n />\n </span>\n <span className='outgoing-oauth-audience-match-message'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.connected'\n defaultMessage='Connected to \"{connectionName}\"'\n values={{\n connectionName: matchedConnection.name,\n }}\n />\n </span>\n </>\n );\n } else {\n oauthMessage = (\n <>\n <span>\n <InformationOutlineIcon\n size={20}\n />\n </span>\n <span className='outgoing-oauth-audience-match-message'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.not_connected'\n defaultMessage='Not linked to an OAuth connection'\n />\n </span>\n </>\n );\n }\n\n return (\n <>\n {input}\n <div className='outgoing-oauth-audience-match-message-container'>\n {oauthMessage}\n </div>\n </>\n );\n};\n\nexport default OAuthConnectionAudienceInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent} from 'react';\nimport {defineMessage, FormattedMessage, type MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport SpinnerButton from 'components/spinner_button';\n\nimport {Constants, DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport OAuthConnectionAudienceInput from './outgoing_oauth_connections/oauth_connection_audience_input';\n\nconst REQUEST_POST = 'P';\nconst REQUEST_GET = 'G';\n\ntype Props = {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The header text to render, has id and defaultMessage\n */\n header: MessageDescriptor | string;\n\n /**\n * The footer text to render, has id and defaultMessage\n */\n footer: MessageDescriptor | string;\n\n /**\n * The spinner loading text to render, has id and defaultMessage\n */\n loading: MessageDescriptor | string;\n\n /**\n * Any extra component/node to render\n */\n renderExtra?: JSX.Element;\n\n /**\n * The server error text after a failed action\n */\n serverError: string;\n\n /**\n * The Command used to set the initial state\n */\n initialCommand?: Partial<Command>;\n\n /**\n * The async function to run when the action button is pressed\n */\n action: (command: Command) => Promise<void>;\n}\n\ntype State = {\n saving: boolean;\n clientError: null | JSX.Element | string;\n trigger: string;\n displayName: string;\n description: string;\n url: string;\n method: 'P' | 'G' | '';\n username: string;\n iconUrl: string;\n autocomplete: boolean;\n autocompleteHint: string;\n autocompleteDescription: string;\n}\n\nexport default class AbstractCommand extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = this.getStateFromCommand(this.props.initialCommand || {});\n }\n\n getStateFromCommand = (command: Props['initialCommand']): State => {\n return {\n displayName: command?.display_name ?? '',\n description: command?.description ?? '',\n trigger: command?.trigger ?? '',\n url: command?.url ?? '',\n method: command?.method ?? REQUEST_POST,\n username: command?.username ?? '',\n iconUrl: command?.icon_url ?? '',\n autocomplete: command?.auto_complete ?? false,\n autocompleteHint: command?.auto_complete_hint ?? '',\n autocompleteDescription: command?.auto_complete_desc ?? '',\n saving: false,\n clientError: null,\n };\n };\n\n getBackstageHeader = () => {\n if (typeof this.props.header === 'string') {\n return <span>{this.props.header}</span>;\n }\n\n return (\n <FormattedMessage\n id={this.props.header.id}\n defaultMessage={this.props.header.defaultMessage}\n />\n );\n };\n\n getBackstageFooter = () => {\n if (typeof this.props.footer === 'string') {\n return <span>{this.props.footer}</span>;\n }\n\n return (\n <FormattedMessage\n id={this.props.footer.id}\n defaultMessage={this.props.footer.defaultMessage}\n />\n );\n };\n\n handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (this.state.saving) {\n return;\n }\n\n this.setState({\n saving: true,\n clientError: '',\n });\n\n let triggerWord = this.state.trigger.trim().toLowerCase();\n if (triggerWord.indexOf('/') === 0) {\n triggerWord = triggerWord.substr(1);\n }\n\n const command = {\n display_name: this.state.displayName,\n description: this.state.description,\n trigger: triggerWord,\n url: this.state.url.trim(),\n method: this.state.method,\n username: this.state.username,\n icon_url: this.state.iconUrl,\n auto_complete: this.state.autocomplete,\n team_id: this.props.team.id,\n auto_complete_desc: '',\n auto_complete_hint: '',\n token: '',\n create_at: 0,\n update_at: 0,\n delete_at: 0,\n id: '',\n creator_id: '',\n };\n\n if (command.auto_complete) {\n command.auto_complete_desc = this.state.autocompleteDescription ?? '';\n command.auto_complete_hint = this.state.autocompleteHint ?? '';\n }\n\n if (!command.trigger) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_command.triggerRequired'\n defaultMessage='A trigger word is required'\n />\n ),\n });\n\n return;\n }\n\n if (command.trigger.indexOf('/') === 0) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_command.triggerInvalidSlash'\n defaultMessage='A trigger word cannot begin with a /'\n />\n ),\n });\n\n return;\n }\n\n if (command.trigger.indexOf(' ') !== -1) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_command.triggerInvalidSpace'\n defaultMessage='A trigger word must not contain spaces'\n />\n ),\n });\n return;\n }\n\n if (command.trigger.length < Constants.MIN_TRIGGER_LENGTH ||\n command.trigger.length > Constants.MAX_TRIGGER_LENGTH) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_command.triggerInvalidLength'\n defaultMessage='A trigger word must contain between {min} and {max} characters'\n values={{\n min: Constants.MIN_TRIGGER_LENGTH,\n max: Constants.MAX_TRIGGER_LENGTH,\n }}\n />\n ),\n });\n\n return;\n }\n\n if (!command.url) {\n this.setState({\n saving: false,\n clientError: (\n <FormattedMessage\n id='add_command.urlRequired'\n defaultMessage='A request URL is required'\n />\n ),\n });\n\n return;\n }\n\n this.props.action(command).then(() => this.setState({saving: false}));\n };\n\n updateDisplayName = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n displayName: e.target.value,\n });\n };\n\n updateDescription = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n description: e.target.value,\n });\n };\n\n updateTrigger = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n trigger: e.target.value,\n });\n };\n\n updateUrl = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n url: e.target.value,\n });\n };\n\n updateMethod = (e: ChangeEvent<HTMLSelectElement>) => {\n const methodValue = e.target.value;\n if (methodValue === 'P' || methodValue === 'G' || methodValue === '') {\n this.setState({\n method: methodValue,\n });\n }\n };\n\n updateUsername = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n username: e.target.value,\n });\n };\n\n updateIconUrl = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n iconUrl: e.target.value,\n });\n };\n\n updateAutocomplete = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n autocomplete: e.target.checked,\n });\n };\n\n updateAutocompleteHint = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n autocompleteHint: e.target.value,\n });\n };\n\n updateAutocompleteDescription = (e: ChangeEvent<HTMLInputElement>) => {\n this.setState({\n autocompleteDescription: e.target.value,\n });\n };\n\n render() {\n let autocompleteHint = null;\n let autocompleteDescription = null;\n\n if (this.state.autocomplete) {\n autocompleteHint = (\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='autocompleteHint'\n >\n <FormattedMessage\n id='add_command.autocompleteHint'\n defaultMessage='Autocomplete Hint'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <LocalizedPlaceholderInput\n id='autocompleteHint'\n type='text'\n maxLength={1024}\n className='form-control'\n value={this.state.autocompleteHint}\n onChange={this.updateAutocompleteHint}\n placeholder={defineMessage({\n id: 'add_command.autocompleteHint.placeholder',\n defaultMessage: 'Example: [Patient Name]',\n })}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.autocompleteHint.help'\n defaultMessage='(Optional) Specify the arguments associated with your slash command. These are displayed as help on the autocomplete list.'\n />\n </div>\n </div>\n </div>\n );\n\n autocompleteDescription = (\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='autocompleteDescription'\n >\n <FormattedMessage\n id='add_command.autocompleteDescription'\n defaultMessage='Autocomplete Description'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <LocalizedPlaceholderInput\n id='description'\n type='text'\n maxLength={128}\n className='form-control'\n value={this.state.autocompleteDescription}\n onChange={this.updateAutocompleteDescription}\n placeholder={defineMessage({\n id: 'add_command.autocompleteDescription.placeholder',\n defaultMessage: 'Example: \"Returns search results for patient records\"',\n })}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.autocompleteDescription.help'\n defaultMessage='(Optional) Describe your slash command for the autocomplete list.'\n />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className='backstage-content row'>\n <BackstageHeader>\n <Link to={'/' + this.props.team.name + '/integrations/commands'}>\n <FormattedMessage\n id='installed_command.header'\n defaultMessage='Slash Commands'\n />\n </Link>\n {this.getBackstageHeader()}\n </BackstageHeader>\n <div className='backstage-form'>\n <form\n className='form-horizontal'\n onSubmit={this.handleSubmit}\n >\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='displayName'\n >\n <FormattedMessage\n id='add_command.displayName'\n defaultMessage='Title'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='displayName'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.displayName}\n onChange={this.updateDisplayName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.displayName.help'\n defaultMessage='Specify a title, of up to 64 characters, for the slash command settings page.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='description'\n >\n <FormattedMessage\n id='add_command.description'\n defaultMessage='Description'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='description'\n type='text'\n maxLength={128}\n className='form-control'\n value={this.state.description}\n onChange={this.updateDescription}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.description.help'\n defaultMessage='Describe your slash command.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='trigger'\n >\n <FormattedMessage\n id='add_command.trigger'\n defaultMessage='Command Trigger Word'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <LocalizedPlaceholderInput\n id='trigger'\n type='text'\n maxLength={Constants.MAX_TRIGGER_LENGTH}\n className='form-control'\n value={this.state.trigger}\n onChange={this.updateTrigger}\n placeholder={defineMessage({\n id: 'add_command.trigger.placeholder',\n defaultMessage: 'Command trigger e.g. \"hello\" not including the slash',\n })}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.trigger.help'\n defaultMessage='Specify a trigger word that is not a built-in command, does not contain spaces, and does not begin with the slash character.'\n />\n </div>\n <div className='form__help'>\n <FormattedMessage\n id='add_command.trigger.helpExamples'\n defaultMessage='Examples: client, employee, patient, weather'\n />\n </div>\n <div className='form__help'>\n <FormattedMessage\n id='add_command.trigger.helpReserved'\n defaultMessage='Reserved: {link}'\n values={{\n link: (\n <ExternalLink\n href={DeveloperLinks.CUSTOM_SLASH_COMMANDS}\n location='abstract_command'\n >\n <FormattedMessage\n id='add_command.trigger.helpReservedLinkText'\n defaultMessage='See built-in slash commands'\n />\n </ExternalLink>\n ),\n }}\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='url'\n >\n <FormattedMessage\n id='add_command.url'\n defaultMessage='Request URL'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <OAuthConnectionAudienceInput\n value={this.state.url}\n onChange={this.updateUrl}\n placeholder={defineMessage({\n id: 'add_command.url.placeholder',\n defaultMessage: 'Must start with http:// or https://',\n })}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.url.help'\n defaultMessage='Specify the callback URL to receive the HTTP POST or GET event request when the slash command is run.'\n />\n </div>\n <div className='form__help'>\n <FormattedMessage\n id={'add_command.outgoing_oauth_connections.help_text'}\n defaultMessage={'You can connect commands to <link>outgoing OAuth connections</link>.'}\n values={{\n link: (text: string) => (\n <a href='https://mattermost.com/pl/outgoing-oauth-connections'>{text}</a>\n ),\n }}\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='method'\n >\n <FormattedMessage\n id='add_command.method'\n defaultMessage='Request Method'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <select\n id='method'\n className='form-control'\n value={this.state.method}\n onChange={this.updateMethod}\n >\n <option value={REQUEST_POST}>\n {Utils.localizeMessage({id: 'add_command.method.post', defaultMessage: 'POST'})}\n </option>\n <option value={REQUEST_GET}>\n {Utils.localizeMessage({id: 'add_command.method.get', defaultMessage: 'GET'})}\n </option>\n </select>\n <div className='form__help'>\n <FormattedMessage\n id='add_command.method.help'\n defaultMessage='Specify the type of request, either POST or GET, sent to the endpoint that Mattermost hits to reach your application.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='username'\n >\n <FormattedMessage\n id='add_command.username'\n defaultMessage='Response Username'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <LocalizedPlaceholderInput\n id='username'\n type='text'\n maxLength={64}\n className='form-control'\n value={this.state.username}\n onChange={this.updateUsername}\n placeholder={defineMessage({\n id: 'add_command.username.placeholder',\n defaultMessage: 'Username',\n })}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.username.help'\n defaultMessage='(Optional) Specify the name to use when posting responses for this slash command. Usernames can be up to 22 characters, and contain lowercase letters, numbers, and the symbols \\\"-\\\", \\\"_\\\", and \\\".\\\". If left blank, your Mattermost username is used.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='iconUrl'\n >\n <FormattedMessage\n id='add_command.iconUrl'\n defaultMessage='Response Icon'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <LocalizedPlaceholderInput\n id='iconUrl'\n type='text'\n maxLength={1024}\n className='form-control'\n value={this.state.iconUrl}\n onChange={this.updateIconUrl}\n placeholder={defineMessage({\n id: 'add_command.iconUrl.placeholder',\n defaultMessage: 'https://www.example.com/myicon.png',\n })}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.iconUrl.help'\n defaultMessage='(Optional) Enter the URL of a .png or .jpg file to use as the icon when posting responses to this slash command. The file must be at least 128 pixels by 128 pixels. If left blank, your profile picture is used.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='autocomplete'\n >\n <FormattedMessage\n id='add_command.autocomplete'\n defaultMessage='Autocomplete'\n />\n </label>\n <div className='col-md-5 col-sm-8 checkbox'>\n <input\n id='autocomplete'\n type='checkbox'\n checked={this.state.autocomplete}\n onChange={this.updateAutocomplete}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_command.autocomplete.help'\n defaultMessage='(Optional) Show your slash command on the autocomplete list when someone types \"/\" in the input box.'\n />\n </div>\n </div>\n </div>\n {autocompleteHint}\n {autocompleteDescription}\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n errors={[this.props.serverError, this.state.clientError]}\n />\n <Link\n className='btn btn-tertiary'\n to={'/' + this.props.team.name + '/integrations/commands'}\n >\n <FormattedMessage\n id='add_command.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n className='btn btn-primary'\n type='submit'\n spinning={this.state.saving}\n spinningText={this.props.loading}\n onClick={this.handleSubmit}\n id='saveCommand'\n >\n {this.getBackstageFooter()}\n </SpinnerButton>\n {this.props.renderExtra}\n </div>\n </form>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions.js';\n\nimport AbstractCommand from '../abstract_command';\n\nexport type Props = {\n\n /**\n * The team data\n */\n team: Team;\n\n actions: {\n\n /**\n * The function to call to add new command\n */\n addCommand: (command: Command) => Promise<ActionResult<Command>>;\n };\n};\n\nconst AddCommand = ({team, actions}: Props) => {\n const history = useHistory();\n const {formatMessage} = useIntl();\n const headerMessage = formatMessage({id: ('integrations.add'), defaultMessage: 'Add'}) as MessageDescriptor;\n const footerMessage = formatMessage({id: ('add_command.save'), defaultMessage: 'Save'}) as MessageDescriptor;\n const loadingMessage = formatMessage({id: ('add_command.saving'), defaultMessage: 'Saving...'}) as MessageDescriptor;\n const [serverError, setServerError] = useState('');\n\n const addCommand = async (command: Command) => {\n setServerError('');\n\n const {data, error} = await actions.addCommand(command);\n if (data) {\n history.push(`/${team.name}/integrations/commands/confirm?type=commands&id=${data.id}`);\n return;\n }\n\n if (error) {\n setServerError(error.message);\n }\n };\n\n return (\n <AbstractCommand\n team={team}\n header={headerMessage}\n footer={footerMessage}\n loading={loadingMessage}\n action={addCommand}\n serverError={serverError}\n />\n );\n};\n\nexport default AddCommand;\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 {addCommand} from 'mattermost-redux/actions/integrations';\n\nimport AddCommand from './add_command';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n addCommand,\n }, dispatch),\n };\n}\n\nexport default connect(null, mapDispatchToProps)(AddCommand);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {copyToClipboard} from 'utils/utils';\n\ntype Props = {\n label: MessageDescriptor;\n value: string;\n};\n\nconst CopyText = ({\n label,\n value,\n}: Props) => {\n const intl = useIntl();\n\n const copyText = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n copyToClipboard(value);\n }, [value]);\n\n if (!document.queryCommandSupported('copy')) {\n return null;\n }\n\n return (\n <WithTooltip title={label}>\n <button\n data-testid='copyText'\n className='btn btn-link fa fa-copy ml-2'\n aria-label={intl.formatMessage(label)}\n onClick={copyText}\n />\n </WithTooltip>\n );\n};\n\nexport default React.memo(CopyText);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {defineMessages, FormattedMessage} from 'react-intl';\nimport {Link, useHistory} from 'react-router-dom';\n\nimport type {Bot} from '@mattermost/types/bots';\nimport type {Command, IncomingWebhook, OAuthApp, OutgoingOAuthConnection, OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport CopyText from 'components/copy_text';\nimport ExternalLink from 'components/external_link';\n\nimport {Constants, DeveloperLinks, ErrorPageTypes} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\ntype Props = {\n team: Team;\n location: {search: string};\n commands: IDMappedObjects<Command>;\n oauthApps: IDMappedObjects<OAuthApp>;\n incomingHooks: IDMappedObjects<IncomingWebhook>;\n outgoingHooks: IDMappedObjects<OutgoingWebhook>;\n bots: Record<string, Bot>;\n outgoingOAuthConnections: Record<string, OutgoingOAuthConnection>;\n}\n\nconst ConfirmIntegration = ({team, location, commands, oauthApps, incomingHooks, outgoingHooks, bots, outgoingOAuthConnections}: Props): JSX.Element | null => {\n const history = useHistory();\n\n const type = (new URLSearchParams(location.search)).get('type') || '';\n const id = (new URLSearchParams(location.search)).get('id') || '';\n\n useEffect(() => {\n window.addEventListener('keypress', handleKeyPress);\n\n return () => {\n window.removeEventListener('keypress', handleKeyPress);\n };\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n history.push('/' + team.name + '/integrations/' + type);\n }\n };\n\n let headerText: JSX.Element;\n let helpText: JSX.Element | JSX.Element[];\n let tokenText: JSX.Element;\n\n const command = commands[id];\n const incomingHook = incomingHooks[id];\n const outgoingHook = outgoingHooks[id];\n const oauthApp = oauthApps[id];\n const outgoingOAuthConnection = outgoingOAuthConnections[id];\n const bot = bots[id];\n\n if (type === Constants.Integrations.COMMAND && command) {\n const commandToken = command.token;\n\n headerText = (\n <FormattedMessage\n id='slash_commands.header'\n defaultMessage='Slash Commands'\n />\n );\n helpText = (\n <p>\n <FormattedMessage\n id='add_command.doneHelp'\n defaultMessage='Your slash command is set up. The following token will be sent in the outgoing payload. Please use it to verify the request came from your Mattermost team (details at <link>Slash Commands</link>).'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href={DeveloperLinks.SETUP_CUSTOM_SLASH_COMMANDS}\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n );\n tokenText = (\n <p className='word-break--all'>\n <FormattedMessage\n id='add_command.token'\n defaultMessage='<b>Token</b>: {token}'\n values={{\n token: commandToken,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyToken}\n value={commandToken}\n />\n </p>\n );\n } else if (type === Constants.Integrations.INCOMING_WEBHOOK && incomingHook) {\n const incomingHookToken = getSiteURL() + '/hooks/' + incomingHook.id;\n\n headerText = (\n <FormattedMessage\n id={'incoming_webhooks.header'}\n defaultMessage='Incoming Webhooks'\n />\n );\n helpText = (\n <p>\n <FormattedMessage\n id='add_incoming_webhook.doneHelp'\n defaultMessage='Your incoming webhook is set up. Please send data to the following URL (details at <link>Incoming Webhooks</link>).'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href={DeveloperLinks.SETUP_INCOMING_WEBHOOKS}\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n );\n tokenText = (\n <p className='word-break--all'>\n <FormattedMessage\n id='add_incoming_webhook.url'\n defaultMessage='<b>URL</b>: {url}'\n values={{\n url: '`' + incomingHookToken + '`',\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyToken}\n value={incomingHookToken}\n />\n </p>\n );\n } else if (type === Constants.Integrations.OUTGOING_WEBHOOK && outgoingHook) {\n const outgoingHookToken = outgoingHook.token;\n\n headerText = (\n <FormattedMessage\n id={'add_outgoing_webhook.header'}\n defaultMessage='Outgoing Webhooks'\n />\n );\n helpText = (\n <p>\n <FormattedMessage\n id='add_outgoing_webhook.doneHelp'\n defaultMessage='Your outgoing webhook is set up. The following token will be sent in the outgoing payload. Please use it to verify that the request came from your Mattermost team (details at <link>Outgoing Webhooks</link>).'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href={DeveloperLinks.SETUP_OUTGOING_WEBHOOKS}\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n );\n tokenText = (\n <p className='word-break--all'>\n <FormattedMessage\n id='add_outgoing_webhook.token'\n defaultMessage='<b>Token</b>: {token}'\n values={{\n token: outgoingHookToken,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyToken}\n value={outgoingHookToken}\n />\n </p>\n );\n } else if (type === Constants.Integrations.OAUTH_APP && oauthApp) {\n const oauthAppToken = oauthApp.id;\n const oauthAppSecret = oauthApp.client_secret;\n\n headerText = (\n <FormattedMessage\n id={'installed_oauth2_apps.header'}\n defaultMessage='OAuth 2.0 Applications'\n />\n );\n\n helpText = [];\n helpText.push(\n <p key='add_oauth_app.doneHelp'>\n <FormattedMessage\n id='add_oauth_app.doneHelp'\n defaultMessage='Your OAuth 2.0 application is set up. Please use the following Client ID and Client Secret when requesting authorization for your application (details at <link>oAuth 2 Applications</link>).'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href={DeveloperLinks.SETUP_OAUTH2}\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>,\n );\n helpText.push(\n <p key='add_oauth_app.clientId'>\n <FormattedMessage\n id='add_oauth_app.clientId'\n defaultMessage='<b>Client ID</b>: {id}'\n values={{\n id: oauthAppToken,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyClientId}\n value={oauthAppToken}\n />\n <br/>\n <FormattedMessage\n id='add_oauth_app.clientSecret'\n defaultMessage='<b>Client Secret</b>: {secret}'\n values={{\n secret: oauthAppSecret,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyClientSecret}\n value={oauthAppSecret}\n />\n </p>,\n );\n\n helpText.push(\n <p key='add_oauth_app.doneUrlHelp'>\n <FormattedMessage\n id='add_oauth_app.doneUrlHelp'\n defaultMessage='Here are your authorized redirect URLs.'\n />\n </p>,\n );\n\n tokenText = (\n <p className='word-break--all'>\n <FormattedMessage\n id='add_oauth_app.url'\n defaultMessage='<b>URL(s)</b>: {url}'\n values={{\n url: oauthApp.callback_urls.join(', '),\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </p>\n );\n } else if (type === Constants.Integrations.OUTGOING_OAUTH_CONNECTIONS && outgoingOAuthConnection) {\n const clientId = outgoingOAuthConnection.client_id;\n const clientSecret = outgoingOAuthConnection.client_secret;\n const username = outgoingOAuthConnection.credentials_username;\n const password = outgoingOAuthConnection.credentials_password;\n\n headerText = (\n <FormattedMessage\n id='installed_outgoing_oauth_connections.header'\n defaultMessage='Outgoing OAuth 2.0 Connections'\n />\n );\n\n helpText = [];\n helpText.push(\n <p key='add_outgoing_oauth_connection.doneHelp'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.doneHelp'\n defaultMessage='Your Outgoing OAuth 2.0 Connection is set up. When a request is sent to one of the following Audience URLs, the Client ID and Client Secret will now be used to retrieve a token from the Token URL, before sending the integration request (details at <link>Outgoing OAuth 2.0 Connections</link>).'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href={DeveloperLinks.SETUP_OAUTH2} // TODO: dev docs for outgoing oauth connections feature\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>,\n );\n helpText.push(\n <p key='add_outgoing_oauth_connection.clientId'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.clientId'\n defaultMessage='<b>Client ID</b>: {id}'\n values={{\n id: clientId,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <br/>\n <FormattedMessage\n id='add_outgoing_oauth_connection.clientSecret'\n defaultMessage='<b>Client Secret</b>: \\*\\*\\*\\*\\*\\*\\*\\*'\n values={{\n secret: clientSecret,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </p>,\n );\n\n if (outgoingOAuthConnection.grant_type === 'password') {\n helpText.push(\n <p key='add_outgoing_oauth_connection.username'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.username'\n defaultMessage='<b>Username</b>: {username}'\n values={{\n username,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyUsername}\n value={username || ''}\n />\n <br/>\n <FormattedMessage\n id='add_outgoing_oauth_connection.password'\n defaultMessage='<b>Password</b>: {password}'\n values={{\n password,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </p>,\n );\n }\n\n tokenText = (\n <>\n <p className='word-break--all'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.token_url'\n defaultMessage='<b>Token URL</b>: `{url}`'\n values={{\n url: outgoingOAuthConnection.oauth_token_url,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </p>\n <p className='word-break--all'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.audience_urls'\n defaultMessage='<b>Audience URL(s)</b>: `{url}`'\n values={{\n url: outgoingOAuthConnection.audiences.join(', '),\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n </p>\n </>\n );\n } else if (type === Constants.Integrations.BOT && bot) {\n const botToken = (new URLSearchParams(location.search)).get('token') || '';\n\n headerText = (\n <FormattedMessage\n id='bots.manage.header'\n defaultMessage='Bot Accounts'\n />\n );\n helpText = (\n <p>\n <FormattedMessage\n id='bots.manage.created.text'\n defaultMessage='Your bot account **{botname}** has been created successfully. Please use the following access token to connect to the bot (see [documentation](https://mattermost.com/pl/default-bot-accounts) for further details).'\n values={{\n botname: bot.display_name || bot.username,\n b: (msg: string) => <b>{msg}</b>,\n link: (msg: string) => (\n <ExternalLink\n href='https://mattermost.com/pl/default-bot-accounts'\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n );\n tokenText = (\n <p className='word-break--all'>\n <FormattedMessage\n id='add_outgoing_webhook.token'\n defaultMessage='<b>Token</b>: {token}'\n values={{\n token: botToken,\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n <CopyText\n label={messages.copyToken}\n value={botToken}\n />\n <br/>\n <br/>\n <FormattedMessage\n id='add_outgoing_webhook.token.message'\n defaultMessage='Make sure to add this bot account to teams and channels you want it to interact in. See <link>documentation</link> to learn more.'\n values={{\n link: (msg: string) => (\n <ExternalLink\n href='https://mattermost.com/pl/default-bot-accounts'\n location='confirm_integration'\n >\n {msg}\n </ExternalLink>\n ),\n }}\n />\n </p>\n );\n } else {\n history.replace(`/error?type=${ErrorPageTypes.PAGE_NOT_FOUND}`);\n return null;\n }\n\n return (\n <div className='backstage-content row'>\n <BackstageHeader>\n <Link to={'/' + team.name + '/integrations/' + type}>\n {headerText}\n </Link>\n <FormattedMessage\n id='integrations.add'\n defaultMessage='Add'\n />\n </BackstageHeader>\n <div className='backstage-form backstage-form__confirmation'>\n <h4\n className='backstage-form__title'\n id='formTitle'\n >\n <FormattedMessage\n id='integrations.successful'\n defaultMessage='Setup Successful'\n />\n </h4>\n {helpText}\n {tokenText}\n <div className='backstage-form__footer'>\n <Link\n className='btn btn-primary'\n type='submit'\n to={'/' + team.name + '/integrations/' + type}\n id='doneButton'\n >\n <FormattedMessage\n id='integrations.done'\n defaultMessage='Done'\n />\n </Link>\n </div>\n </div>\n </div>\n );\n};\n\nconst messages = defineMessages({\n copyClientId: {\n id: 'integrations.copy_client_id',\n defaultMessage: 'Copy Client Id',\n },\n copyClientSecret: {\n id: 'integrations.copy_client_secret',\n defaultMessage: 'Copy Client Secret',\n },\n copyToken: {\n id: 'integrations.copy_token',\n defaultMessage: 'Copy Token',\n },\n copyUsername: {\n id: 'integrations.copy_username',\n defaultMessage: 'Copy Username',\n },\n});\n\nexport default ConfirmIntegration;\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 {getBotAccounts} from 'mattermost-redux/selectors/entities/bots';\nimport {getCommands, getOAuthApps, getIncomingHooks, getOutgoingHooks, getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\n\nimport type {GlobalState} from 'types/store';\n\nimport ConfirmIntegration from './confirm_integration';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n commands: getCommands(state),\n oauthApps: getOAuthApps(state),\n incomingHooks: getIncomingHooks(state),\n outgoingHooks: getOutgoingHooks(state),\n bots: getBotAccounts(state),\n outgoingOAuthConnections: getOutgoingOAuthConnections(state),\n };\n}\n\nexport default connect(mapStateToProps)(ConfirmIntegration);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport AbstractCommand from '../abstract_command';\n\nconst messages = defineMessages({\n footer: {\n id: 'edit_command.update',\n defaultMessage: 'Update',\n },\n header: {\n id: 'integrations.edit',\n defaultMessage: 'Edit',\n },\n loading: {\n id: 'edit_command.updating',\n defaultMessage: 'Updating...',\n },\n});\n\ntype Props = {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The id of the command to edit\n */\n commandId: string | null;\n\n /**\n * Installed slash commands to display\n */\n commands: RelationOneToOne<Command, Command>;\n actions: {\n\n /**\n * The function to call to fetch team commands\n */\n getCustomTeamCommands: (teamId: string) => Promise<ActionResult>;\n\n /**\n * The function to call to edit command\n */\n editCommand: (command: Command) => Promise<ActionResult>;\n };\n\n /**\n * Whether or not commands are enabled.\n */\n enableCommands: boolean;\n}\n\ntype State = {\n originalCommand: Command | null;\n showConfirmModal: boolean;\n serverError: string;\n}\n\nexport default class EditCommand extends React.PureComponent<Props, State> {\n private newCommand?: Command;\n\n public constructor(props: Props) {\n super(props);\n this.newCommand = undefined;\n\n this.state = {\n originalCommand: null,\n showConfirmModal: false,\n serverError: '',\n };\n }\n\n public componentDidMount(): void {\n if (this.props.enableCommands) {\n this.props.actions.getCustomTeamCommands(this.props.team.id).then(\n () => {\n this.setState({\n originalCommand: Object.values(this.props.commands).filter((command) => command.id === this.props.commandId)[0],\n });\n },\n );\n }\n }\n\n public editCommand = async (command: Command): Promise<void> => {\n this.newCommand = command;\n\n if (this.state.originalCommand?.id) {\n command.id = this.state.originalCommand.id;\n }\n\n if (this.state.originalCommand?.url !== this.newCommand.url ||\n this.state.originalCommand?.trigger !== this.newCommand.trigger ||\n this.state.originalCommand?.method !== this.newCommand.method) {\n this.handleConfirmModal();\n } else {\n await this.submitCommand();\n }\n };\n\n public handleConfirmModal = (): void => {\n this.setState({showConfirmModal: true});\n };\n\n public confirmModalDismissed = (): void => {\n this.setState({showConfirmModal: false});\n };\n\n public submitCommand = async (): Promise<void> => {\n this.setState({serverError: ''});\n\n const {data, error} = await this.props.actions.editCommand(this.newCommand!);\n\n if (data) {\n getHistory().push(`/${this.props.team.name}/integrations/commands`);\n return;\n }\n\n this.setState({showConfirmModal: false});\n\n if (error) {\n this.setState({serverError: error.message});\n }\n };\n\n public renderExtra = (): JSX.Element => {\n const confirmButton = (\n <FormattedMessage\n id='update_command.update'\n defaultMessage='Update'\n />\n );\n\n const confirmTitle = (\n <FormattedMessage\n id='update_command.confirm'\n defaultMessage='Edit Slash Command'\n />\n );\n\n const confirmMessage = (\n <FormattedMessage\n id='update_command.question'\n defaultMessage='Your changes may break the existing slash command. Are you sure you would like to update it?'\n />\n );\n\n return (\n <ConfirmModal\n title={confirmTitle}\n message={confirmMessage}\n confirmButtonText={confirmButton}\n modalClass='integrations-backstage-modal'\n show={this.state.showConfirmModal}\n onConfirm={this.submitCommand}\n onCancel={this.confirmModalDismissed}\n />\n );\n };\n\n public render(): JSX.Element {\n if (!this.state.originalCommand) {\n return <LoadingScreen/>;\n }\n\n return (\n <AbstractCommand\n team={this.props.team}\n header={messages.header}\n footer={messages.footer}\n loading={messages.loading}\n renderExtra={this.renderExtra()}\n action={this.editCommand}\n serverError={this.state.serverError}\n initialCommand={this.state.originalCommand}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {editCommand, getCustomTeamCommands} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCommands} from 'mattermost-redux/selectors/entities/integrations';\n\nimport EditCommand from './edit_command';\n\ntype Props = {\n location: Location;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const config = getConfig(state);\n const commandId = (new URLSearchParams(ownProps.location.search)).get('id');\n const enableCommands = config.EnableCommands === 'true';\n\n return {\n commandId,\n commands: getCommands(state),\n enableCommands,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getCustomTeamCommands,\n editCommand,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditCommand);\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';\nimport {Link} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport CopyText from 'components/copy_text';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\ntype Props = {\n\n /**\n * The team data\n */\n team: Team;\n\n /**\n * Installed slash command to display\n */\n command: Command;\n\n /**\n * The function to call when Regenerate Token link is clicked\n */\n onRegenToken: (command: Command) => void ;\n\n /**\n * The function to call when Delete link is clicked\n */\n onDelete: (command: Command) => void ;\n\n /**\n * Set to filter command, comes from BackstageList\n */\n filter?: string;\n\n /**\n * The creator user data\n */\n creator: UserProfile;\n\n /**\n * Set to show edit link\n */\n canChange: boolean;\n}\n\nexport function matchesFilter(command: Command, filter?: string) {\n if (!filter) {\n return true;\n }\n\n return command.display_name.toLowerCase().indexOf(filter) !== -1 ||\n command.description.toLowerCase().indexOf(filter) !== -1 ||\n command.trigger.toLowerCase().indexOf(filter) !== -1;\n}\n\nexport default class InstalledCommand extends React.PureComponent<Props> {\n handleRegenToken = (e: React.MouseEvent) => {\n e.preventDefault();\n\n this.props.onRegenToken(this.props.command);\n };\n\n handleDelete = () => {\n this.props.onDelete(this.props.command);\n };\n\n render() {\n const command = this.props.command;\n const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n\n if (!matchesFilter(command, filter)) {\n return null;\n }\n\n let name;\n\n if (command.display_name) {\n name = command.display_name;\n } else {\n name = (\n <FormattedMessage\n id='installed_commands.unnamed_command'\n defaultMessage='Unnamed Slash Command'\n />\n );\n }\n\n let description = null;\n if (command.description) {\n description = (\n <div className='item-details__row'>\n <span className='item-details__description'>\n {command.description}\n </span>\n </div>\n );\n }\n\n let trigger = '- /' + command.trigger;\n if (command.auto_complete && command.auto_complete_hint) {\n trigger += ' ' + command.auto_complete_hint;\n }\n\n let actions = null;\n if (this.props.canChange) {\n actions = (\n <div className='item-actions'>\n <button\n className='style--none color--link'\n onClick={this.handleRegenToken}\n >\n <FormattedMessage\n id='installed_integrations.regenToken'\n defaultMessage='Regenerate Token'\n />\n </button>\n {' - '}\n <Link to={`/${this.props.team.name}/integrations/commands/edit?id=${command.id}`}>\n <FormattedMessage\n id='installed_integrations.edit'\n defaultMessage='Edit'\n />\n </Link>\n {' - '}\n <DeleteIntegrationLink\n modalMessage={\n <FormattedMessage\n id='installed_commands.delete.confirm'\n defaultMessage='This action permanently deletes the slash command and breaks any integrations using it. Are you sure you want to delete it?'\n />\n }\n onDelete={this.handleDelete}\n />\n </div>\n );\n }\n\n const commandToken = command.token;\n\n return (\n <div className='backstage-list__item'>\n <div className='item-details'>\n <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n <div className='item-details__name'>\n <strong>\n {name}\n </strong>\n </div>\n <span className='item-details__trigger'>\n {trigger}\n </span>\n {actions}\n </div>\n {description}\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_integrations.token'\n defaultMessage='Token: {token}'\n values={{\n token: commandToken,\n }}\n />\n <CopyText\n label={defineMessage({\n id: 'integrations.copy_token',\n defaultMessage: 'Copy Token',\n })}\n value={commandToken}\n />\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__creation'>\n <FormattedMessage\n id='installed_integrations.creation'\n defaultMessage='Created by {creator} on {createAt, date, full}'\n values={{\n creator: this.props.creator.username,\n createAt: command.create_at,\n }}\n />\n </span>\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport {DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport InstalledCommand, {matchesFilter} from '../installed_command';\n\ntype Props = {\n team: Team;\n user: UserProfile;\n users: RelationOneToOne<UserProfile, UserProfile>;\n\n // Installed slash commands to display\n commands: Command[];\n loading: boolean;\n\n // Set to allow changes to installed slash commands\n canManageOthersSlashCommands: boolean;\n actions: {\n\n // The function to call when Regenerate Token link is clicked\n regenCommandToken: (id: string) => Promise<ActionResult>;\n\n // The function to call when Delete link is clicked\n deleteCommand: (id: string) => Promise<ActionResult>;\n };\n}\n\nexport default class InstalledCommands extends React.PureComponent<Props> {\n public regenCommandToken = (command: Command): void => {\n this.props.actions.regenCommandToken(command.id);\n };\n\n public deleteCommand = (command: Command): void => {\n this.props.actions.deleteCommand(command.id);\n };\n\n private commandCompare(a: Command, b: Command) {\n let nameA = a.display_name;\n if (!nameA) {\n nameA = Utils.localizeMessage({id: 'installed_commands.unnamed_command', defaultMessage: 'Unnamed Slash Command'});\n }\n\n let nameB = b.display_name;\n if (!nameB) {\n nameB = Utils.localizeMessage({id: 'installed_commands.unnamed_command', defaultMessage: 'Unnamed Slash Command'});\n }\n\n return nameA.localeCompare(nameB);\n }\n\n public render(): JSX.Element {\n const commands = (filter: string) => this.props.commands.\n filter((command) => command.team_id === this.props.team.id).\n filter((command) => matchesFilter(command, filter)).\n sort(this.commandCompare).map((command) => {\n const canChange = this.props.canManageOthersSlashCommands || this.props.user.id === command.creator_id;\n\n return (\n <InstalledCommand\n key={command.id}\n team={this.props.team}\n command={command}\n onRegenToken={this.regenCommandToken}\n onDelete={this.deleteCommand}\n creator={this.props.users[command.creator_id] || {}}\n canChange={canChange}\n />\n );\n });\n\n return (\n <BackstageList\n header={\n <FormattedMessage\n id='installed_commands.header'\n defaultMessage='Installed Slash Commands'\n />\n }\n addText={\n <FormattedMessage\n id='installed_commands.add'\n defaultMessage='Add Slash Command'\n />\n }\n addLink={'/' + this.props.team.name + '/integrations/commands/add'}\n addButtonId='addSlashCommand'\n emptyText={\n <FormattedMessage\n id='installed_commands.empty'\n defaultMessage='No slash commands found'\n />\n }\n emptyTextSearch={\n <FormattedMessage\n id='installed_commands.search.empty'\n defaultMessage='No slash commands match <b>{searchTerm}</b>'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n }\n helpText={\n <FormattedMessage\n id='installed_commands.help'\n defaultMessage='Use slash commands to connect external tools to Mattermost. {buildYourOwn} or visit the {appDirectory} to find self-hosted, third-party apps and integrations.'\n values={{\n buildYourOwn: (\n <ExternalLink\n href={DeveloperLinks.SETUP_CUSTOM_SLASH_COMMANDS}\n location='installed_commands'\n >\n <FormattedMessage\n id='installed_commands.help.buildYourOwn'\n defaultMessage='Build Your Own'\n />\n </ExternalLink>\n ),\n appDirectory: (\n <ExternalLink\n href='https://mattermost.com/marketplace'\n location='installed_commands'\n >\n <FormattedMessage\n id='installed_commands.help.appDirectory'\n defaultMessage='App Directory'\n />\n </ExternalLink>\n ),\n }}\n />\n }\n searchPlaceholder={Utils.localizeMessage({id: 'installed_commands.search', defaultMessage: 'Search Slash Commands'})}\n loading={this.props.loading}\n >\n {(filter: string) => {\n const children = commands(filter);\n return [children, children.length > 0];\n }}\n </BackstageList>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {deleteCommand, regenCommandToken} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport InstalledCommands from './installed_commands';\n\ntype Props = {\n team: {\n id: string;\n };\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const canManageOthersSlashCommands = haveITeamPermission(state, ownProps.team.id, Permissions.MANAGE_OTHERS_SLASH_COMMANDS);\n\n return {\n canManageOthersSlashCommands,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n regenCommandToken,\n deleteCommand,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledCommands);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Route, Switch, Redirect} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AddCommand from 'components/integrations/add_command';\nimport ConfirmIntegration from 'components/integrations/confirm_integration';\nimport EditCommand from 'components/integrations/edit_command';\nimport InstalledCommands from 'components/integrations/installed_commands';\n\ninterface IProps {\n component: any;\n extraProps: {\n loading: boolean;\n commands: Command[];\n users?: RelationOneToOne<UserProfile, UserProfile>;\n team?: Team;\n user?: UserProfile;\n };\n path: string;\n}\n\nconst CommandRoute = ({component: Component, extraProps, ...rest}: IProps) => (\n <Route\n {...rest}\n render={(props) => (\n <Component\n {...extraProps}\n {...props}\n />\n )}\n />\n);\n\ntype Props = {\n\n /**\n * The team data needed to pass into child components\n */\n team?: Team;\n\n /**\n * The user data needed to pass into child components\n */\n user?: UserProfile;\n\n /**\n * The users collection\n */\n users?: RelationOneToOne<UserProfile, UserProfile>;\n\n /**\n * Installed slash commands to display\n */\n commands: Command[];\n\n /**\n * Object from react-router\n */\n match: {\n url: string;\n };\n\n actions: {\n\n /**\n * The function to call to fetch team commands\n */\n loadCommandsAndProfilesForTeam: (teamId: string) => Promise<ActionResult>;\n };\n\n /**\n * Whether or not commands are enabled.\n */\n enableCommands?: boolean;\n};\n\ntype State = {\n loading: boolean;\n};\n\nexport default class CommandsContainer extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n loading: true,\n };\n }\n\n componentDidMount() {\n if (this.props.enableCommands) {\n this.props.actions.loadCommandsAndProfilesForTeam(this.props.team?.id || '').then(\n () => this.setState({loading: false}),\n );\n }\n }\n\n render() {\n const extraProps = {\n loading: this.state.loading,\n commands: this.props.commands || [],\n users: this.props.users,\n team: this.props.team,\n user: this.props.user,\n };\n return (\n <div>\n <Switch>\n <Route\n exact={true}\n path={`${this.props.match.url}/`}\n render={() => (<Redirect to={`${this.props.match.url}/installed`}/>)}\n />\n <CommandRoute\n extraProps={extraProps}\n path={`${this.props.match.url}/installed`}\n component={InstalledCommands}\n />\n <CommandRoute\n extraProps={extraProps}\n path={`${this.props.match.url}/add`}\n component={AddCommand}\n />\n <CommandRoute\n extraProps={extraProps}\n path={`${this.props.match.url}/edit`}\n component={EditCommand}\n />\n <CommandRoute\n extraProps={extraProps}\n path={`${this.props.match.url}/confirm`}\n component={ConfirmIntegration}\n />\n </Switch>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {AnyAction, Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCommands} from 'mattermost-redux/selectors/entities/integrations';\nimport {getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadCommandsAndProfilesForTeam} from 'actions/integration_actions';\n\nimport CommandsContainer from './commands_container';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const enableCommands = config.EnableCommands === 'true';\n\n return {\n commands: Object.values(getCommands(state)),\n users: getUsers(state),\n enableCommands,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n return {\n actions: bindActionCreators({\n loadCommandsAndProfilesForTeam,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CommandsContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AbstractIncomingWebhook from 'components/integrations/abstract_incoming_webhook';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst messages = defineMessages({\n footer: {\n id: 'update_incoming_webhook.update',\n defaultMessage: 'Update',\n },\n header: {\n id: 'integrations.edit',\n defaultMessage: 'Edit',\n },\n loading: {\n id: 'update_incoming_webhook.updating',\n defaultMessage: 'Updating...',\n },\n});\n\ntype Props = {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The incoming webhook to edit\n */\n hook?: IncomingWebhook;\n\n /**\n * The id of the incoming webhook to edit\n */\n hookId: string;\n\n /**\n * Whether or not incoming webhooks are enabled.\n */\n enableIncomingWebhooks: boolean;\n\n /**\n * Whether to allow configuration of the default post username.\n */\n enablePostUsernameOverride: boolean;\n\n /**\n * Whether to allow configuration of the default post icon.\n */\n enablePostIconOverride: boolean;\n\n actions: {\n\n /**\n * The function to call to update an incoming webhook\n */\n updateIncomingHook: (hook: IncomingWebhook) => Promise<ActionResult>;\n\n /**\n * The function to call to get an incoming webhook\n */\n getIncomingHook: (hookId: string) => Promise<ActionResult>;\n };\n};\n\ntype State = {\n serverError: string;\n};\n\nexport default class EditIncomingWebhook extends React.PureComponent<Props, State> {\n private newHook?: IncomingWebhook;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n serverError: '',\n };\n }\n\n componentDidMount() {\n if (this.props.enableIncomingWebhooks) {\n this.props.actions.getIncomingHook(this.props.hookId);\n }\n }\n\n editIncomingHook = async (hook: IncomingWebhook) => {\n this.newHook = hook;\n\n if (this.props.hook?.id) {\n hook.id = this.props.hook.id;\n }\n\n await this.submitHook();\n };\n\n submitHook = async () => {\n this.setState({serverError: ''});\n\n if (!this.newHook) {\n return;\n }\n\n const result = await this.props.actions.updateIncomingHook(this.newHook);\n\n if ('data' in result) {\n getHistory().push(`/${this.props.team.name}/integrations/incoming_webhooks`);\n return;\n }\n\n if ('error' in result) {\n const {error} = result;\n this.setState({serverError: error.message});\n }\n };\n\n render() {\n if (!this.props.hook) {\n return <LoadingScreen/>;\n }\n\n return (\n <AbstractIncomingWebhook\n team={this.props.team}\n header={messages.header}\n footer={messages.footer}\n loading={messages.loading}\n enablePostUsernameOverride={this.props.enablePostUsernameOverride}\n enablePostIconOverride={this.props.enablePostIconOverride}\n action={this.editIncomingHook}\n serverError={this.state.serverError}\n initialHook={this.props.hook}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getIncomingHook, updateIncomingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport EditIncomingWebhook from './edit_incoming_webhook';\n\ntype Props = {\n location: Location;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const config = getConfig(state);\n const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n const hookId = (new URLSearchParams(ownProps.location.search)).get('id') || '';\n\n return {\n hookId,\n hook: state.entities.integrations.incomingHooks[hookId],\n enableIncomingWebhooks,\n enablePostUsernameOverride,\n enablePostIconOverride,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n updateIncomingHook,\n getIncomingHook,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditIncomingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport AbstractOAuthApp from '../abstract_oauth_app';\n\nconst HEADER = {id: 'integrations.edit', defaultMessage: 'Edit'};\nconst FOOTER = {id: 'update_incoming_webhook.update', defaultMessage: 'Update'};\nconst LOADING = {id: 'update_incoming_webhook.updating', defaultMessage: 'Updating...'};\n\ntype Actions = {\n getOAuthApp: (id: string) => void;\n editOAuthApp: (app: OAuthApp) => Promise<ActionResult>;\n};\n\ntype Props = {\n team: Team;\n oauthAppId: string;\n oauthApp: OAuthApp;\n actions: Actions;\n enableOAuthServiceProvider: boolean;\n};\n\ntype State = {\n showConfirmModal: boolean;\n serverError: string;\n};\n\nexport default class EditOAuthApp extends React.PureComponent<Props, State> {\n newApp: OAuthApp;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n showConfirmModal: false,\n serverError: '',\n };\n this.newApp = this.props.oauthApp;\n }\n\n componentDidMount() {\n if (this.props.enableOAuthServiceProvider) {\n this.props.actions.getOAuthApp(this.props.oauthAppId);\n }\n }\n\n editOAuthApp = async (app: OAuthApp) => {\n this.newApp = app;\n\n if (this.props.oauthApp.id) {\n app.id = this.props.oauthApp.id;\n }\n\n const callbackUrlsSame = (this.props.oauthApp.callback_urls.length === app.callback_urls.length) &&\n this.props.oauthApp.callback_urls.every((v, i) => v === app.callback_urls[i]);\n\n if (callbackUrlsSame === false) {\n this.handleConfirmModal();\n } else {\n await this.submitOAuthApp();\n }\n };\n\n handleConfirmModal = () => {\n this.setState({showConfirmModal: true});\n };\n\n confirmModalDismissed = () => {\n this.setState({showConfirmModal: false});\n };\n\n submitOAuthApp = async () => {\n this.setState({serverError: ''});\n\n const res = await this.props.actions.editOAuthApp(this.newApp);\n\n if ('data' in res && res.data) {\n getHistory().push(`/${this.props.team.name}/integrations/oauth2-apps`);\n return;\n }\n\n this.setState({showConfirmModal: false});\n\n if ('error' in res) {\n const {error: err} = res;\n this.setState({serverError: err.message});\n }\n };\n\n renderExtra = () => {\n const confirmButton = (\n <FormattedMessage\n id='update_command.update'\n defaultMessage='Update'\n />\n );\n\n const confirmTitle = (\n <FormattedMessage\n id='update_oauth_app.confirm'\n defaultMessage='Edit OAuth 2.0 application'\n />\n );\n\n const confirmMessage = (\n <FormattedMessage\n id='update_oauth_app.question'\n defaultMessage='Your changes may break the existing OAuth 2.0 application. Are you sure you would like to update it?'\n />\n );\n\n return (\n <ConfirmModal\n title={confirmTitle}\n message={confirmMessage}\n confirmButtonText={confirmButton}\n modalClass='integrations-backstage-modal'\n show={this.state.showConfirmModal}\n onConfirm={this.submitOAuthApp}\n onCancel={this.confirmModalDismissed}\n />\n );\n };\n\n render() {\n if (!this.props.oauthApp) {\n return <LoadingScreen/>;\n }\n\n return (\n <AbstractOAuthApp\n team={this.props.team}\n header={HEADER}\n footer={FOOTER}\n loading={LOADING}\n renderExtra={this.renderExtra()}\n action={this.editOAuthApp}\n serverError={this.state.serverError}\n initialApp={this.props.oauthApp}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getOAuthApp, editOAuthApp} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport EditOAuthApp from './edit_oauth_app';\n\ntype Props = {\n location: Location;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n const config = getConfig(state);\n const oauthAppId: string = (new URLSearchParams(ownProps.location.search)).get('id') || '';\n const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n\n return {\n oauthAppId,\n oauthApp: state.entities.integrations.oauthApps[oauthAppId],\n enableOAuthServiceProvider,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n getOAuthApp,\n editOAuthApp,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditOAuthApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport AbstractOutgoingWebhook from 'components/integrations/abstract_outgoing_webhook';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst HEADER = {id: 'integrations.edit', defaultMessage: 'Edit'};\nconst FOOTER = {id: 'update_outgoing_webhook.update', defaultMessage: 'Update'};\nconst LOADING = {id: 'update_outgoing_webhook.updating', defaultMessage: 'Updating...'};\n\nexport interface Props {\n\n /**\n * The current team\n */\n team: Team;\n\n /**\n * The outgoing webhook to edit\n */\n hook?: OutgoingWebhook;\n\n /**\n * The id of the outgoing webhook to edit\n */\n hookId: string;\n actions: {\n\n /**\n * The function to call to update an outgoing webhook\n */\n updateOutgoingHook: (hook: OutgoingWebhook) => Promise<ActionResult<OutgoingWebhook>>;\n\n /**\n * The function to call to get an outgoing webhook\n */\n getOutgoingHook: (hookId: string) => Promise<ActionResult<OutgoingWebhook>>;\n };\n\n /**\n * Whether or not outgoing webhooks are enabled.\n */\n enableOutgoingWebhooks?: boolean;\n\n /**\n * Whether to allow configuration of the default post username.\n */\n enablePostUsernameOverride: boolean;\n\n /**\n * Whether to allow configuration of the default post icon.\n */\n enablePostIconOverride: boolean;\n}\n\ninterface State {\n showConfirmModal: boolean;\n serverError: string;\n}\n\nexport default class EditOutgoingWebhook extends React.PureComponent<Props, State> {\n private newHook: OutgoingWebhook | undefined;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n showConfirmModal: false,\n serverError: '',\n };\n }\n\n componentDidMount(): void {\n if (this.props.enableOutgoingWebhooks) {\n this.props.actions.getOutgoingHook(this.props.hookId);\n }\n }\n\n editOutgoingHook = async (hook: OutgoingWebhook): Promise<void> => {\n this.newHook = hook;\n\n if (this.props.hook!.id) {\n hook.id = this.props.hook!.id;\n }\n\n if (this.props.hook!.token) {\n hook.token = this.props.hook!.token;\n }\n\n const triggerWordsSame = (this.props.hook!.trigger_words.length === hook!.trigger_words.length) &&\n this.props.hook!.trigger_words.every((v, i) => v === hook.trigger_words[i]);\n\n const callbackUrlsSame = (this.props.hook!.callback_urls.length === hook!.callback_urls.length) &&\n this.props.hook!.callback_urls.every((v, i) => v === hook.callback_urls[i]);\n\n if (this.props.hook!.content_type !== hook.content_type ||\n !triggerWordsSame || !callbackUrlsSame) {\n this.handleConfirmModal();\n } else {\n await this.submitHook();\n }\n };\n\n handleConfirmModal = (): void => {\n this.setState({showConfirmModal: true});\n };\n\n confirmModalDismissed = (): void => {\n this.setState({showConfirmModal: false});\n };\n\n submitHook = async (): Promise<void> => {\n this.setState({serverError: ''});\n\n const {data, error} = await this.props.actions.updateOutgoingHook(this.newHook!);\n\n if (data) {\n getHistory().push(`/${this.props.team.name}/integrations/outgoing_webhooks`);\n return;\n }\n\n this.setState({showConfirmModal: false});\n\n if (error) {\n this.setState({serverError: error.message});\n }\n };\n\n renderExtra = (): JSX.Element => {\n const confirmButton = (\n <FormattedMessage\n id='update_outgoing_webhook.update'\n defaultMessage='Update'\n />\n );\n\n const confirmTitle = (\n <FormattedMessage\n id='update_outgoing_webhook.confirm'\n defaultMessage='Edit Outgoing Webhook'\n />\n );\n\n const confirmMessage = (\n <FormattedMessage\n id='update_outgoing_webhook.question'\n defaultMessage='Your changes may break the existing outgoing webhook. Are you sure you would like to update it?'\n />\n );\n\n return (\n <ConfirmModal\n title={confirmTitle}\n message={confirmMessage}\n confirmButtonText={confirmButton}\n modalClass='integrations-backstage-modal'\n show={this.state.showConfirmModal}\n onConfirm={this.submitHook}\n onCancel={this.confirmModalDismissed}\n />\n );\n };\n\n render(): JSX.Element {\n if (!this.props.hook) {\n return <LoadingScreen/>;\n }\n\n return (\n <AbstractOutgoingWebhook\n team={this.props.team}\n header={HEADER}\n footer={FOOTER}\n loading={LOADING}\n renderExtra={this.renderExtra()}\n action={this.editOutgoingHook}\n serverError={this.state.serverError}\n initialHook={this.props.hook}\n enablePostUsernameOverride={this.props.enablePostUsernameOverride}\n enablePostIconOverride={this.props.enablePostIconOverride}\n />\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getOutgoingHook, updateOutgoingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport EditOutgoingWebhook from './edit_outgoing_webhook';\n\ntype OwnProps = {\n location: {\n search: string | string[][] | Record<string, string> | URLSearchParams | undefined;\n };\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n const config = getConfig(state);\n const hookId = (new URLSearchParams(ownProps.location.search)).get('id');\n const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n\n return {\n hookId: hookId!,\n hook: state.entities.integrations.outgoingHooks[hookId!],\n enableOutgoingWebhooks,\n enablePostUsernameOverride,\n enablePostIconOverride,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n updateOutgoingHook,\n getOutgoingHook,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditOutgoingWebhook);\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';\nimport {Link} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport CopyText from 'components/copy_text';\n\nimport {getSiteURL} from 'utils/url';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\nexport function matchesFilter(incomingWebhook: IncomingWebhook, channel: Channel, filter: string) {\n if (!filter) {\n return true;\n }\n\n if (incomingWebhook.display_name.toLowerCase().indexOf(filter) !== -1 ||\n incomingWebhook.description.toLowerCase().indexOf(filter) !== -1) {\n return true;\n }\n\n if (incomingWebhook.channel_id) {\n if (channel && channel.name.toLowerCase().indexOf(filter) !== -1) {\n return true;\n }\n }\n\n return false;\n}\n\ntype Props = {\n\n /**\n * Data used for showing webhook details\n */\n incomingWebhook: IncomingWebhook;\n\n /**\n * Function to call when webhook delete button is pressed\n */\n onDelete: (incomingWebhook: IncomingWebhook) => void;\n\n /**\n * String used for filtering webhook item\n */\n filter?: string;\n\n /**\n * Data used for showing created by details\n */\n creator: {\n username: string;\n };\n\n /**\n * Set to show available actions on webhook\n */\n canChange: boolean;\n\n /**\n * Data used in routing of webhook for modifications\n */\n team: Team;\n\n /**\n * Data used for filtering of webhook based on filter prop\n */\n channel: Channel;\n}\n\nexport default class InstalledIncomingWebhook extends React.PureComponent<Props> {\n handleDelete = () => {\n this.props.onDelete(this.props.incomingWebhook);\n };\n\n render() {\n const incomingWebhook = this.props.incomingWebhook;\n const channel = this.props.channel;\n const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n\n if (!matchesFilter(incomingWebhook, channel, filter)) {\n return null;\n }\n\n let displayName;\n if (incomingWebhook.display_name) {\n displayName = incomingWebhook.display_name;\n } else if (channel) {\n displayName = channel.display_name;\n } else {\n displayName = (\n <FormattedMessage\n id='installed_incoming_webhooks.unknown_channel'\n defaultMessage='A Private Webhook'\n />\n );\n }\n\n let description = null;\n if (incomingWebhook.description) {\n description = (\n <div className='item-details__row'>\n <span className='item-details__description'>\n {incomingWebhook.description}\n </span>\n </div>\n );\n }\n\n let actions = null;\n if (this.props.canChange) {\n actions = (\n <div className='item-actions'>\n <Link to={`/${this.props.team.name}/integrations/incoming_webhooks/edit?id=${incomingWebhook.id}`}>\n <FormattedMessage\n id='installed_integrations.edit'\n defaultMessage='Edit'\n />\n </Link>\n {' - '}\n <DeleteIntegrationLink\n modalMessage={\n <FormattedMessage\n id='installed_incoming_webhooks.delete.confirm'\n defaultMessage='This action permanently deletes the incoming webhook and breaks any integrations using it. Are you sure you want to delete it?'\n />\n }\n onDelete={this.handleDelete}\n />\n </div>\n );\n }\n\n const incomingWebhookId = getSiteURL() + '/hooks/' + incomingWebhook.id;\n\n return (\n <div className='backstage-list__item'>\n <div className='item-details'>\n <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n <strong className='item-details__name'>\n {displayName}\n </strong>\n {actions}\n </div>\n {description}\n <div className='item-details__row'>\n <span className='item-details__url word-break--all'>\n <FormattedMessage\n id='installed_integrations.url'\n defaultMessage='URL: {url}'\n values={{\n url: incomingWebhookId,\n }}\n />\n <span>\n <CopyText\n label={defineMessage({\n id: 'integrations.copy_url',\n defaultMessage: 'Copy URL',\n })}\n value={incomingWebhookId}\n />\n </span>\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__creation'>\n <FormattedMessage\n id='installed_integrations.creation'\n defaultMessage='Created by {creator} on {createAt, date, full}'\n values={{\n creator: this.props.creator.username,\n createAt: incomingWebhook.create_at,\n }}\n />\n </span>\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {IncomingWebhook, IncomingWebhooksWithCount} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\nimport InstalledIncomingWebhook, {matchesFilter} from 'components/integrations/installed_incoming_webhook';\n\nimport {DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nconst PAGE_SIZE = 200;\n\ntype Props = {\n team: Team;\n user: UserProfile;\n incomingHooks: IncomingWebhook[];\n incomingHooksTotalCount: number;\n channels: IDMappedObjects<Channel>;\n users: IDMappedObjects<UserProfile>;\n canManageOthersWebhooks: boolean;\n enableIncomingWebhooks: boolean;\n actions: {\n removeIncomingHook: (hookId: string) => Promise<ActionResult>;\n loadIncomingHooksAndProfilesForTeam: (teamId: string, startPageNumber: number,\n pageSize: number, includeTotalCount: boolean) => Promise<ActionResult<IncomingWebhook[] | IncomingWebhooksWithCount>>;\n };\n}\n\ntype State = {\n page: number;\n loading: boolean;\n}\n\nexport default class InstalledIncomingWebhooks extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n page: 0,\n loading: true,\n };\n }\n\n componentDidMount() {\n this.loadPage(0);\n }\n\n deleteIncomingWebhook = (incomingWebhook: IncomingWebhook) => {\n this.props.actions.removeIncomingHook(incomingWebhook.id);\n };\n\n loadPage = async (pageToLoad: number) => {\n if (this.props.enableIncomingWebhooks) {\n this.setState({loading: true},\n async () => {\n await this.props.actions.loadIncomingHooksAndProfilesForTeam(\n this.props.team.id,\n pageToLoad,\n PAGE_SIZE,\n true,\n );\n this.setState({page: pageToLoad, loading: false});\n },\n );\n }\n };\n\n nextPage = () => {\n this.loadPage(this.state.page + 1);\n };\n\n previousPage = () => {\n this.loadPage(this.state.page - 1);\n };\n\n incomingWebhookCompare = (a: IncomingWebhook, b: IncomingWebhook) => {\n let displayNameA = a.display_name;\n if (!displayNameA) {\n const channelA = this.props.channels[a.channel_id];\n if (channelA) {\n displayNameA = channelA.display_name;\n } else {\n displayNameA = Utils.localizeMessage({id: 'installed_incoming_webhooks.unknown_channel', defaultMessage: 'A Private Webhook'});\n }\n }\n\n const displayNameB = b.display_name;\n return displayNameA.localeCompare(displayNameB);\n };\n\n incomingWebhooks = (filter: string) => this.props.incomingHooks.\n sort(this.incomingWebhookCompare).\n filter((incomingWebhook: IncomingWebhook) => matchesFilter(incomingWebhook, this.props.channels[incomingWebhook.channel_id], filter)).\n map((incomingWebhook: IncomingWebhook) => {\n const canChange = this.props.canManageOthersWebhooks || this.props.user.id === incomingWebhook.user_id;\n const channel = this.props.channels[incomingWebhook.channel_id];\n return (\n <InstalledIncomingWebhook\n key={incomingWebhook.id}\n incomingWebhook={incomingWebhook}\n onDelete={this.deleteIncomingWebhook}\n creator={this.props.users[incomingWebhook.user_id] || {}}\n canChange={canChange}\n team={this.props.team}\n channel={channel}\n />\n );\n });\n\n render() {\n return (\n <BackstageList\n header={\n <FormattedMessage\n id='installed_incoming_webhooks.header'\n defaultMessage='Installed Incoming Webhooks'\n />\n }\n addText={\n <FormattedMessage\n id='installed_incoming_webhooks.add'\n defaultMessage='Add Incoming Webhook'\n />\n }\n addLink={'/' + this.props.team.name + '/integrations/incoming_webhooks/add'}\n addButtonId='addIncomingWebhook'\n emptyText={\n <FormattedMessage\n id='installed_incoming_webhooks.empty'\n defaultMessage='No incoming webhooks found'\n />\n }\n emptyTextSearch={\n <FormattedMessage\n id='installed_incoming_webhooks.emptySearch'\n defaultMessage='No incoming webhooks match {searchTerm}'\n />\n }\n helpText={\n <FormattedMessage\n id='installed_incoming_webhooks.help'\n defaultMessage='Use incoming webhooks to connect external tools to Mattermost. {buildYourOwn} or visit the {appDirectory} to find self-hosted, third-party apps and integrations.'\n values={{\n buildYourOwn: (\n <ExternalLink\n location='installed_incoming_webhooks'\n href={DeveloperLinks.SETUP_INCOMING_WEBHOOKS}\n >\n <FormattedMessage\n id='installed_incoming_webhooks.help.buildYourOwn'\n defaultMessage='Build Your Own'\n />\n </ExternalLink>\n ),\n appDirectory: (\n <ExternalLink\n href='https://mattermost.com/marketplace'\n location='installed_incoming_webhooks'\n >\n <FormattedMessage\n id='installed_incoming_webhooks.help.appDirectory'\n defaultMessage='App Directory'\n />\n </ExternalLink>\n ),\n }}\n />\n }\n searchPlaceholder={Utils.localizeMessage({id: 'installed_incoming_webhooks.search', defaultMessage: 'Search Incoming Webhooks'})}\n loading={this.state.loading}\n nextPage={this.nextPage}\n previousPage={this.previousPage}\n page={this.state.page}\n pageSize={PAGE_SIZE}\n total={this.props.incomingHooksTotalCount}\n >\n {(filter: string) => {\n const children = this.incomingWebhooks(filter);\n return [children, children.length > 0];\n }}\n </BackstageList>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {removeIncomingHook} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getFilteredIncomingHooks, getIncomingHooksTotalCount} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadIncomingHooksAndProfilesForTeam} from 'actions/integration_actions';\n\nimport InstalledIncomingWebhooks from './installed_incoming_webhooks';\n\nfunction mapStateToProps(state: GlobalState) {\n const teamId = getCurrentTeamId(state);\n const incomingHooks = getFilteredIncomingHooks(state);\n const incomingHooksTotalCount = getIncomingHooksTotalCount(state);\n const config = getConfig(state);\n const canManageOthersWebhooks = haveITeamPermission(state, teamId, Permissions.MANAGE_OTHERS_INCOMING_WEBHOOKS);\n const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n\n return {\n incomingHooks,\n incomingHooksTotalCount,\n channels: getAllChannels(state),\n users: getUsers(state),\n canManageOthersWebhooks,\n enableIncomingWebhooks,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadIncomingHooksAndProfilesForTeam,\n removeIncomingHook,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledIncomingWebhooks);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport CopyText from 'components/copy_text';\nimport FormError from 'components/form_error';\n\nimport DeleteIntegrationLink from '../delete_integration_link';\n\nconst FAKE_SECRET = '***************';\n\nexport function matchesFilter(oauthApp: OAuthApp, filter?: string | null): boolean {\n if (!filter) {\n return true;\n }\n\n return oauthApp.name.toLowerCase().includes(filter);\n}\n\nexport type InstalledOAuthAppProps = {\n\n /**\n * The team data\n */\n team?: Team;\n\n /**\n * The oauthApp data\n */\n oauthApp: OAuthApp;\n\n /**\n * Whether the oauth app is created by an App\n */\n fromApp: boolean;\n\n creatorName: string;\n\n /**\n * The function to call when Regenerate Secret link is clicked\n */\n onRegenerateSecret: (oauthAppId: string) => Promise<{ error?: { message: string } }>;\n\n /**\n * The function to call when Delete link is clicked\n */\n onDelete: (oauthApp: OAuthApp) => void;\n\n /**\n * Set to filter OAuthApp\n */\n filter?: string | null;\n}\n\nexport type InstalleOAuthAppState = {\n clientSecret: string;\n error?: string | null;\n}\n\nexport default class InstalledOAuthApp extends React.PureComponent<InstalledOAuthAppProps, InstalleOAuthAppState> {\n constructor(props: InstalledOAuthAppProps) {\n super(props);\n\n this.state = {\n clientSecret: FAKE_SECRET,\n };\n }\n\n handleShowClientSecret = (e?: React.MouseEvent): void => {\n if (e && e.preventDefault) {\n e.preventDefault();\n }\n this.setState({clientSecret: this.props.oauthApp.client_secret});\n };\n\n handleHideClientSecret = (e: React.MouseEvent): void => {\n e.preventDefault();\n this.setState({clientSecret: FAKE_SECRET});\n };\n\n handleRegenerate = (e: React.MouseEvent): void => {\n e.preventDefault();\n this.props.onRegenerateSecret(this.props.oauthApp.id).then(\n ({error}) => {\n if (error) {\n this.setState({error: error.message});\n } else {\n this.setState({error: null});\n this.handleShowClientSecret();\n }\n },\n );\n };\n\n handleDelete = (): void => {\n this.props.onDelete(this.props.oauthApp);\n };\n\n render(): React.ReactNode {\n const {oauthApp, creatorName} = this.props;\n let error;\n\n if (this.state.error) {\n error = (\n <FormError\n error={this.state.error}\n />\n );\n }\n\n if (!matchesFilter(oauthApp, this.props.filter)) {\n return null;\n }\n\n let name;\n if (oauthApp.name) {\n name = oauthApp.name;\n } else {\n name = (\n <FormattedMessage\n id='installed_integrations.unnamed_oauth_app'\n defaultMessage='Unnamed OAuth 2.0 Application'\n />\n );\n }\n\n let description;\n if (oauthApp.description) {\n description = (\n <div className='item-details__row'>\n <span className='item-details__description'>\n {oauthApp.description}\n </span>\n </div>\n );\n }\n\n const urls = (\n <div className='item-details__row'>\n <span className='item-details__url word-break--all'>\n <FormattedMessage\n id='installed_integrations.callback_urls'\n defaultMessage='Callback URLs: {urls}'\n values={{\n urls: oauthApp.callback_urls.join(', '),\n }}\n />\n </span>\n </div>\n );\n\n let isTrusted;\n if (oauthApp.is_trusted) {\n isTrusted = (\n <FormattedMessage\n id='installed_oauth_apps.trusted.yes'\n defaultMessage='Yes'\n />\n );\n } else {\n isTrusted = (\n <FormattedMessage\n id='installed_oauth_apps.trusted.no'\n defaultMessage='No'\n />\n );\n }\n\n let showHide;\n let clientSecret;\n if (this.state.clientSecret === FAKE_SECRET) {\n showHide = (\n <button\n id='showSecretButton'\n className='style--none color--link'\n onClick={this.handleShowClientSecret}\n >\n <FormattedMessage\n id='installed_integrations.showSecret'\n defaultMessage='Show Secret'\n />\n </button>\n );\n clientSecret = (\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_integrations.client_secret'\n defaultMessage='Client Secret: '\n />\n <strong>{this.state.clientSecret}</strong>\n </span>\n );\n } else {\n showHide = (\n <button\n id='hideSecretButton'\n className='style--none color--link'\n onClick={this.handleHideClientSecret}\n >\n <FormattedMessage\n id='installed_integrations.hideSecret'\n defaultMessage='Hide Secret'\n />\n </button>\n );\n clientSecret = (\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_integrations.client_secret'\n defaultMessage='Client Secret: '\n />\n <strong>{this.state.clientSecret}</strong>\n <CopyText\n label={messages.copyClientSecret}\n value={this.state.clientSecret}\n />\n </span>\n );\n }\n\n const regen = (\n <button\n id='regenerateSecretButton'\n className='style--none color--link'\n onClick={this.handleRegenerate}\n >\n <FormattedMessage\n id='installed_integrations.regenSecret'\n defaultMessage='Regenerate Secret'\n />\n </button>\n );\n\n let icon;\n if (oauthApp.icon_url) {\n icon = (\n <div className='integration__icon integration-list__icon'>\n <img\n alt={'get app screenshot'}\n src={oauthApp.icon_url}\n />\n </div>\n );\n }\n\n let actions;\n if (!this.props.fromApp) {\n actions = (\n <div className='item-actions'>\n {showHide}\n {' - '}\n {regen}\n {' - '}\n <Link to={`/${this.props.team?.name}/integrations/oauth2-apps/edit?id=${oauthApp.id}`}>\n <FormattedMessage\n id='installed_integrations.edit'\n defaultMessage='Edit'\n />\n </Link>\n {' - '}\n <DeleteIntegrationLink\n modalMessage={\n <FormattedMessage\n id='installed_oauth_apps.delete.confirm'\n defaultMessage='This action permanently deletes the OAuth 2.0 application and breaks any integrations using it. Are you sure you want to delete it?'\n />\n }\n onDelete={this.handleDelete}\n />\n </div>\n );\n }\n\n let appInfo = (\n <div className='item-details__row'>\n <span className='item-details__creation'>\n <FormattedMessage\n id='installed_integrations.fromApp'\n defaultMessage='Managed by Apps Framework'\n />\n </span>\n </div>\n );\n if (!this.props.fromApp) {\n appInfo = (\n <>\n <div className='item-details__row'>\n <span className='item-details__url word-break--all'>\n <FormattedMessage\n id='installed_oauth_apps.is_trusted'\n defaultMessage='Is Trusted: '\n />\n <strong>{isTrusted}</strong>\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_integrations.client_id'\n defaultMessage='Client ID: '\n />\n <strong>{oauthApp.id}</strong>\n <CopyText\n label={messages.copyClientId}\n value={oauthApp.id}\n />\n </span>\n </div>\n <div className='item-details__row'>\n {clientSecret}\n </div>\n {urls}\n <div className='item-details__row'>\n <span className='item-details__creation'>\n <FormattedMessage\n id='installed_integrations.creation'\n defaultMessage='Created by {creator} on {createAt, date, full}'\n values={{\n creator: creatorName,\n createAt: oauthApp.create_at,\n }}\n />\n </span>\n </div>\n </>\n );\n }\n\n return (\n <div className='backstage-list__item'>\n {icon}\n <div className='item-details'>\n <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n <strong className='item-details__name'>\n {name}\n </strong>\n {actions}\n </div>\n {error}\n {description}\n {appInfo}\n </div>\n </div>\n );\n }\n}\n\nconst messages = defineMessages({\n copyClientId: {\n id: 'integrations.copy_client_id',\n defaultMessage: 'Copy Client Id',\n },\n copyClientSecret: {\n id: 'integrations.copy_client_secret',\n defaultMessage: 'Copy Client Secret',\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 {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {getDisplayNameByUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport InstalledOAuthApp from './installed_oauth_app';\nimport type {InstalledOAuthAppProps} from './installed_oauth_app';\n\nfunction mapStateToProps(state: GlobalState, ownProps: InstalledOAuthAppProps) {\n const oauthApp = ownProps.oauthApp || {};\n return {\n creatorName: getDisplayNameByUser(state, getUser(state, oauthApp.creator_id)),\n };\n}\n\nexport default connect(mapStateToProps)(InstalledOAuthApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport {DeveloperLinks} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nimport InstalledOAuthApp from '../installed_oauth_app';\nimport {matchesFilter} from '../installed_oauth_app/installed_oauth_app';\n\ntype Props = {\n\n /**\n * The team data\n */\n team?: Team;\n\n /**\n * The oauthApps data\n */\n oauthApps: {\n [key: string]: OAuthApp;\n };\n\n /**\n * List of IDs for apps managed by the App Framwork\n */\n appsOAuthAppIDs: string[];\n\n /**\n * Set if user can manage oath\n */\n canManageOauth: boolean;\n\n /**\n * Whether or not OAuth applications are enabled.\n */\n enableOAuthServiceProvider: boolean;\n\n actions: ({\n\n /**\n * The function to call to fetch OAuth apps\n */\n loadOAuthAppsAndProfiles: (page?: number, perPage?: number) => Promise<ActionResult>;\n\n /**\n * The function to call when Regenerate Secret link is clicked\n */\n regenOAuthAppSecret: (appId: string) => Promise<ActionResult>;\n\n /**\n * The function to call when Delete link is clicked\n */\n deleteOAuthApp: (appId: string) => Promise<ActionResult>;\n });\n};\n\ntype State = {\n loading: boolean;\n};\n\nexport default class InstalledOAuthApps extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n loading: true,\n };\n }\n\n componentDidMount(): void {\n if (this.props.enableOAuthServiceProvider) {\n this.props.actions.loadOAuthAppsAndProfiles().then(\n () => this.setState({loading: false}),\n );\n }\n }\n\n deleteOAuthApp = (app: OAuthApp): void => {\n if (app && app.id) {\n this.props.actions.deleteOAuthApp(app.id);\n }\n };\n\n oauthAppCompare(a: OAuthApp, b: OAuthApp): number {\n let nameA = a.name.toString();\n if (!nameA) {\n nameA = localizeMessage({id: 'installed_integrations.unnamed_oauth_app', defaultMessage: 'Unnamed OAuth 2.0 Application'});\n }\n\n let nameB = b.name.toString();\n if (!nameB) {\n nameB = localizeMessage({id: 'installed_integrations.unnamed_oauth_app', defaultMessage: 'Unnamed OAuth 2.0 Application'});\n }\n\n return nameA.localeCompare(nameB);\n }\n\n oauthApps = (filter?: string) => Object.values(this.props.oauthApps).\n filter((app) => matchesFilter(app, filter)).\n sort(this.oauthAppCompare).\n map((app) => {\n return (\n <InstalledOAuthApp\n key={app.id}\n oauthApp={app}\n onRegenerateSecret={this.props.actions.regenOAuthAppSecret}\n onDelete={this.deleteOAuthApp}\n team={this.props.team}\n creatorName=''\n fromApp={this.props.appsOAuthAppIDs.includes(app.id)}\n />\n );\n });\n\n render() {\n if (!this.props.team) {\n return null;\n }\n const integrationsEnabled = this.props.enableOAuthServiceProvider && this.props.canManageOauth;\n let props;\n if (integrationsEnabled) {\n props = {\n addLink: '/' + this.props.team.name + '/integrations/oauth2-apps/add',\n addText: localizeMessage({id: 'installed_oauth_apps.add', defaultMessage: 'Add OAuth 2.0 Application'}),\n addButtonId: 'addOauthApp',\n };\n }\n\n return (\n <BackstageList\n header={\n <FormattedMessage\n id='installed_oauth2_apps.header'\n defaultMessage='OAuth 2.0 Applications'\n />\n }\n helpText={\n <FormattedMessage\n id='installed_oauth_apps.help'\n defaultMessage='Create {oauthApplications} to securely integrate bots and third-party apps with Mattermost. Visit the {appDirectory} to find available self-hosted apps.'\n values={{\n oauthApplications: (\n <ExternalLink\n href={DeveloperLinks.SETUP_OAUTH2}\n location='installed_oauth_apps'\n >\n <FormattedMessage\n id='installed_oauth_apps.help.oauthApplications'\n defaultMessage='OAuth 2.0 applications'\n />\n </ExternalLink>\n ),\n appDirectory: (\n <ExternalLink\n href='https://mattermost.com/marketplace/'\n location='installed_oauth_apps'\n >\n <FormattedMessage\n id='installed_oauth_apps.help.appDirectory'\n defaultMessage='App Directory'\n />\n </ExternalLink>\n ),\n }}\n />\n }\n emptyText={\n <FormattedMessage\n id='installed_oauth_apps.empty'\n defaultMessage='No OAuth 2.0 Applications found'\n />\n }\n emptyTextSearch={\n <FormattedMessage\n id='installed_oauth_apps.emptySearch'\n defaultMessage='No OAuth 2.0 Applications match {searchTerm}'\n />\n }\n searchPlaceholder={localizeMessage({id: 'installed_oauth_apps.search', defaultMessage: 'Search OAuth 2.0 Applications'})}\n loading={this.state.loading}\n {...props}\n >\n {(filter: string) => {\n const children = this.oauthApps(filter);\n return [children, children.length > 0];\n }}\n </BackstageList>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {regenOAuthAppSecret, deleteOAuthApp} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getAppsOAuthAppIDs, getOAuthApps} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {loadOAuthAppsAndProfiles} from 'actions/integration_actions';\n\nimport InstalledOAuthApps from './installed_oauth_apps';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n\n return {\n canManageOauth: haveISystemPermission(state, {permission: Permissions.MANAGE_OAUTH}),\n oauthApps: getOAuthApps(state),\n appsOAuthAppIDs: getAppsOAuthAppIDs(state),\n enableOAuthServiceProvider,\n team: getCurrentTeam(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadOAuthAppsAndProfiles,\n regenOAuthAppSecret,\n deleteOAuthApp,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledOAuthApps);\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';\nimport {Link} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport CopyText from 'components/copy_text';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\nexport function matchesFilter(outgoingWebhook: OutgoingWebhook, channel: Channel, filter: string) {\n if (!filter) {\n return true;\n }\n\n const {\n display_name: displayName,\n description,\n trigger_words: triggerWords,\n } = outgoingWebhook;\n\n if (\n (displayName && displayName.toLowerCase().indexOf(filter) !== -1) ||\n (description && description.toLowerCase().indexOf(filter) !== -1)\n ) {\n return true;\n }\n\n if (triggerWords) {\n for (const triggerWord of triggerWords) {\n if (triggerWord.toLowerCase().indexOf(filter) !== -1) {\n return true;\n }\n }\n }\n\n if (channel && channel.name) {\n if (channel.name.toLowerCase().indexOf(filter) !== -1) {\n return true;\n }\n }\n\n return false;\n}\n\ntype Props = {\n outgoingWebhook: OutgoingWebhook;\n onRegenToken: (outgoingWebhook: OutgoingWebhook) => void;\n onDelete: (outgoingWebhook: OutgoingWebhook) => void;\n team: Team;\n creator: UserProfile;\n channel: Channel;\n canChange: boolean;\n filter?: string;\n}\n\nexport default class InstalledOutgoingWebhook extends React.PureComponent<Props> {\n handleRegenToken = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n e.preventDefault();\n\n this.props.onRegenToken(this.props.outgoingWebhook);\n };\n\n handleDelete = () => {\n this.props.onDelete(this.props.outgoingWebhook);\n };\n\n makeDisplayName(outgoingWebhook: OutgoingWebhook, channel: Channel) {\n if (outgoingWebhook.display_name) {\n return outgoingWebhook.display_name;\n } else if (channel) {\n return channel.display_name;\n }\n return (\n <FormattedMessage\n id='installed_outgoing_webhooks.unknown_channel'\n defaultMessage='A Private Webhook'\n />\n );\n }\n\n render() {\n const outgoingWebhook = this.props.outgoingWebhook;\n const channel = this.props.channel;\n const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n const triggerWordsFull = 0;\n const triggerWordsStartsWith = 1;\n\n if (outgoingWebhook && !matchesFilter(outgoingWebhook, channel, filter)) {\n return null;\n }\n\n const displayName = this.makeDisplayName(outgoingWebhook, channel);\n\n let description = null;\n if (outgoingWebhook.description) {\n description = (\n <div className='item-details__row'>\n <span className='item-details__description'>\n {outgoingWebhook.description}\n </span>\n </div>\n );\n }\n\n let triggerWords = null;\n if (outgoingWebhook.trigger_words && outgoingWebhook.trigger_words.length > 0) {\n triggerWords = (\n <div className='item-details__row'>\n <span className='item-details__trigger-words'>\n <FormattedMessage\n id='installed_integrations.triggerWords'\n defaultMessage='Trigger Words: {triggerWords}'\n values={{\n triggerWords: outgoingWebhook.trigger_words.join(', '),\n }}\n />\n </span>\n </div>\n );\n }\n\n const urls = (\n <div className='item-details__row'>\n <span className='item-details__url word-break--all'>\n <FormattedMessage\n id='installed_integrations.callback_urls'\n defaultMessage='Callback URLs: {urls}'\n values={{\n urls: outgoingWebhook.callback_urls.join(', '),\n }}\n />\n </span>\n </div>\n );\n\n let triggerWhen;\n if (outgoingWebhook.trigger_when === triggerWordsFull) {\n triggerWhen = (\n <FormattedMessage\n id='add_outgoing_webhook.triggerWordsTriggerWhenFullWord'\n defaultMessage='First word matches a trigger word exactly'\n />\n );\n } else if (outgoingWebhook.trigger_when === triggerWordsStartsWith) {\n triggerWhen = (\n <FormattedMessage\n id='add_outgoing_webhook.triggerWordsTriggerWhenStartsWith'\n defaultMessage='First word starts with a trigger word'\n />\n );\n }\n\n let actions = null;\n if (this.props.canChange) {\n actions = (\n <div className='item-actions'>\n <button\n className='style--none color--link'\n onClick={this.handleRegenToken}\n >\n <FormattedMessage\n id='installed_integrations.regenToken'\n defaultMessage='Regenerate Token'\n />\n </button>\n {' - '}\n <Link to={`/${this.props.team.name}/integrations/outgoing_webhooks/edit?id=${outgoingWebhook.id}`}>\n <FormattedMessage\n id='installed_integrations.edit'\n defaultMessage='Edit'\n />\n </Link>\n {' - '}\n <DeleteIntegrationLink\n modalMessage={\n <FormattedMessage\n id='installed_outgoing_webhooks.delete.confirm'\n defaultMessage='This action permanently deletes the outgoing webhook and breaks any integrations using it. Are you sure you want to delete it?'\n />\n }\n onDelete={this.handleDelete}\n />\n </div>\n );\n }\n\n return (\n <div className='backstage-list__item'>\n <div className='item-details'>\n <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n <strong className='item-details__name'>\n {displayName}\n </strong>\n {actions}\n </div>\n {description}\n <div className='item-details__row'>\n <span className='item-details__content_type'>\n <FormattedMessage\n id='installed_integrations.content_type'\n defaultMessage='Content-Type: {contentType}'\n values={{\n contentType: outgoingWebhook.content_type || 'application/x-www-form-urlencoded',\n }}\n />\n </span>\n </div>\n {triggerWords}\n <div className='item-details__row'>\n <span className='item-details__trigger-when'>\n <FormattedMessage\n id='installed_integrations.triggerWhen'\n defaultMessage='Trigger When: {triggerWhen}'\n values={{\n triggerWhen,\n }}\n />\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_integrations.token'\n defaultMessage='Token: {token}'\n values={{\n token: outgoingWebhook.token,\n }}\n />\n <CopyText\n label={defineMessage({\n id: 'integrations.copy_token',\n defaultMessage: 'Copy Token',\n })}\n value={outgoingWebhook.token}\n />\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__creation'>\n <FormattedMessage\n id='installed_integrations.creation'\n defaultMessage='Created by {creator} on {createAt, date, full}'\n values={{\n creator: this.props.creator.username,\n createAt: outgoingWebhook.create_at,\n }}\n />\n </span>\n </div>\n {urls}\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\nimport InstalledOutgoingWebhook, {matchesFilter} from 'components/integrations/installed_outgoing_webhook';\n\nimport {Constants, DeveloperLinks} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nexport type Props = {\n\n /**\n * Data used in passing down as props for webhook modifications\n */\n team: Team;\n\n /**\n * Data used for checking if webhook is created by current user\n */\n user: UserProfile;\n\n /**\n * Data used for checking modification privileges\n */\n canManageOthersWebhooks: boolean;\n\n /**\n * Data used in passing down as props for showing webhook details\n */\n outgoingWebhooks: OutgoingWebhook[];\n\n /**\n * Data used in sorting for displaying list and as props channel details\n */\n channels: IDMappedObjects<Channel>;\n\n /**\n * Data used in passing down as props for webhook -created by label\n */\n users: IDMappedObjects<UserProfile>;\n\n /**\n * Data used in passing as argument for loading webhooks\n */\n teamId: string;\n\n actions: {\n\n /**\n * The function to call for removing outgoingWebhook\n */\n removeOutgoingHook: (hookId: string) => Promise<ActionResult>;\n\n /**\n * The function to call for outgoingWebhook List and for the status of api\n */\n loadOutgoingHooksAndProfilesForTeam: (teamId: string, page: number, perPage: number) => Promise<ActionResult>;\n\n /**\n * The function to call for regeneration of webhook token\n */\n regenOutgoingHookToken: (hookId: string) => Promise<ActionResult>;\n };\n\n /**\n * Whether or not outgoing webhooks are enabled.\n */\n enableOutgoingWebhooks: boolean;\n}\n\ntype State = {\n loading: boolean;\n};\n\nexport default class InstalledOutgoingWebhooks extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loading: true,\n };\n }\n\n componentDidMount() {\n if (this.props.enableOutgoingWebhooks) {\n this.props.actions.loadOutgoingHooksAndProfilesForTeam(\n this.props.teamId,\n Constants.Integrations.START_PAGE_NUM,\n Constants.Integrations.PAGE_SIZE,\n ).then(\n () => this.setState({loading: false}),\n );\n }\n }\n\n regenOutgoingWebhookToken = (outgoingWebhook: OutgoingWebhook) => {\n this.props.actions.regenOutgoingHookToken(outgoingWebhook.id);\n };\n\n removeOutgoingHook = (outgoingWebhook: OutgoingWebhook) => {\n this.props.actions.removeOutgoingHook(outgoingWebhook.id);\n };\n\n outgoingWebhookCompare = (a: OutgoingWebhook, b: OutgoingWebhook) => {\n let displayNameA = a.display_name;\n if (!displayNameA) {\n const channelA = this.props.channels[a.channel_id];\n if (channelA) {\n displayNameA = channelA.display_name;\n } else {\n displayNameA = localizeMessage({id: 'installed_outgoing_webhooks.unknown_channel', defaultMessage: 'A Private Webhook'});\n }\n }\n\n let displayNameB = b.display_name;\n if (!displayNameB) {\n const channelB = this.props.channels[b.channel_id];\n if (channelB) {\n displayNameB = channelB.display_name;\n } else {\n displayNameB = localizeMessage({id: 'installed_outgoing_webhooks.unknown_channel', defaultMessage: 'A Private Webhook'});\n }\n }\n return displayNameA.localeCompare(displayNameB);\n };\n\n outgoingWebhooks = (filter: string) => this.props.outgoingWebhooks.\n sort(this.outgoingWebhookCompare).\n filter((outgoingWebhook) => matchesFilter(outgoingWebhook, this.props.channels[outgoingWebhook.channel_id], filter)).\n map((outgoingWebhook) => {\n const canChange = this.props.canManageOthersWebhooks || this.props.user.id === outgoingWebhook.creator_id;\n const channel = this.props.channels[outgoingWebhook.channel_id];\n return (\n <InstalledOutgoingWebhook\n key={outgoingWebhook.id}\n outgoingWebhook={outgoingWebhook}\n onRegenToken={this.regenOutgoingWebhookToken}\n onDelete={this.removeOutgoingHook}\n creator={this.props.users[outgoingWebhook.creator_id] || {}}\n canChange={canChange}\n team={this.props.team}\n channel={channel}\n />\n );\n });\n\n render() {\n return (\n <BackstageList\n header={\n <FormattedMessage\n id='installed_outgoing_webhooks.header'\n defaultMessage='Installed Outgoing Webhooks'\n />\n }\n addText={\n <FormattedMessage\n id='installed_outgoing_webhooks.add'\n defaultMessage='Add Outgoing Webhook'\n />\n }\n addLink={\n '/' +\n this.props.team.name +\n '/integrations/outgoing_webhooks/add'\n }\n addButtonId='addOutgoingWebhook'\n emptyText={\n <FormattedMessage\n id='installed_outgoing_webhooks.empty'\n defaultMessage='No outgoing webhooks found'\n />\n }\n emptyTextSearch={\n <FormattedMessage\n id='installed_outgoing_webhooks.search.empty'\n defaultMessage='No outgoing webhooks match <b>{searchTerm}</b>'\n values={{\n b: (chunks: string) => <b>{chunks}</b>,\n }}\n />\n }\n helpText={\n <FormattedMessage\n id='installed_outgoing_webhooks.help'\n defaultMessage='Use outgoing webhooks to connect external tools to Mattermost. {buildYourOwn} or visit the {appDirectory} to find self-hosted, third-party apps and integrations.'\n values={{\n buildYourOwn: (\n <ExternalLink\n href={DeveloperLinks.SETUP_OUTGOING_WEBHOOKS}\n location='installed_outgoing_webhooks'\n >\n <FormattedMessage\n id='installed_outgoing_webhooks.help.buildYourOwn'\n defaultMessage='Build your own'\n />\n </ExternalLink>\n ),\n appDirectory: (\n <ExternalLink\n href='https://mattermost.com/marketplace'\n location='installed_outgoing_webhooks'\n >\n <FormattedMessage\n id='installed_outgoing_webhooks.help.appDirectory'\n defaultMessage='App Directory'\n />\n </ExternalLink>\n ),\n }}\n />\n }\n searchPlaceholder={localizeMessage({\n id: 'installed_outgoing_webhooks.search',\n defaultMessage: 'Search Outgoing Webhooks',\n })}\n loading={this.state.loading}\n >\n {(filter: string) => {\n const children = this.outgoingWebhooks(filter);\n return [children, children.length > 0];\n }}\n </BackstageList>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport * as Actions from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingHooks} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadOutgoingHooksAndProfilesForTeam} from 'actions/integration_actions';\n\nimport type {GlobalState} from 'types/store';\n\nimport InstalledOutgoingWebhook from './installed_outgoing_webhooks';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n const teamId = getCurrentTeamId(state);\n const canManageOthersWebhooks = haveITeamPermission(state, teamId, Permissions.MANAGE_OTHERS_OUTGOING_WEBHOOKS);\n const outgoingHooks = getOutgoingHooks(state);\n const outgoingWebhooks = Object.keys(outgoingHooks).\n map((key) => outgoingHooks[key]).\n filter((outgoingWebhook) => outgoingWebhook.team_id === teamId);\n const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n\n return {\n outgoingWebhooks,\n channels: getAllChannels(state),\n users: getUsers(state),\n teamId,\n canManageOthersWebhooks,\n enableOutgoingWebhooks,\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators({\n loadOutgoingHooksAndProfilesForTeam,\n removeOutgoingHook: Actions.removeOutgoingHook,\n regenOutgoingHookToken: Actions.regenOutgoingHookToken,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledOutgoingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, FormEvent} from 'react';\nimport React, {useMemo, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport {Link} from 'react-router-dom';\n\nimport {AlertOutlineIcon, CheckCircleOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {validateOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ConfirmModal from 'components/confirm_modal';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n team: Team;\n header: MessageDescriptor;\n footer: MessageDescriptor;\n loading: MessageDescriptor;\n renderExtra?: JSX.Element;\n serverError: string;\n\n initialConnection?: OutgoingOAuthConnection;\n\n submitAction: (connection: OutgoingOAuthConnection) => Promise<void>;\n}\n\ntype State = {\n name: string;\n oauthTokenUrl: string;\n grantType: OutgoingOAuthConnection['grant_type'];\n clientId: string;\n clientSecret: string;\n audienceUrls: string;\n};\n\nenum ValidationStatus {\n INITIAL = 'initial',\n DIRTY = 'dirty',\n VALIDATING = 'validating',\n VALIDATED = 'validated',\n ERROR = 'error',\n}\n\nconst useOutgoingOAuthForm = (connection: OutgoingOAuthConnection): [State, (state: Partial<State>) => void] => {\n const initialState: State = {\n name: connection.name || '',\n audienceUrls: connection.audiences ? connection.audiences.join('\\n') : '',\n oauthTokenUrl: connection.oauth_token_url || '',\n clientId: connection.client_id || '',\n clientSecret: connection.client_secret || '',\n grantType: 'client_credentials',\n };\n\n const [state, setState] = useState(initialState);\n\n return useMemo(() => [state, (newState: Partial<State>) => {\n setState((oldState) => ({...oldState, ...newState}));\n }], [state]);\n};\n\nconst initialState: OutgoingOAuthConnection = {\n id: '',\n name: '',\n creator_id: '',\n create_at: 0,\n update_at: 0,\n client_id: '',\n client_secret: '',\n oauth_token_url: '',\n grant_type: 'client_credentials',\n audiences: [],\n};\n\nexport default function AbstractOutgoingOAuthConnection(props: Props) {\n const [formState, setFormState] = useOutgoingOAuthForm(props.initialConnection || initialState);\n\n const [storedError, setError] = useState<React.ReactNode>('');\n const [validationError, setValidationError] = useState<string>('');\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [validationStatus, setValidationStatus] = useState<ValidationStatus>(ValidationStatus.INITIAL);\n const [isEditingSecret, setIsEditingSecret] = useState(false);\n\n const [isValidationModalOpen, setIsValidationModalOpen] = useState(false);\n\n const intl = useIntl();\n const dispatch = useDispatch();\n\n const isNewConnection = !props.initialConnection;\n\n const parseForm = (requireAudienceUrl: boolean): OutgoingOAuthConnection | undefined => {\n if (!formState.name) {\n setIsSubmitting(false);\n setError(\n <FormattedMessage\n id='add_outgoing_oauth_connection.name.required'\n defaultMessage='Name for the OAuth connection is required.'\n />,\n );\n\n return undefined;\n }\n\n if (!formState.clientId) {\n setIsSubmitting(false);\n setError(\n <FormattedMessage\n id='add_outgoing_oauth_connection.client_id.required'\n defaultMessage='Client Id for the OAuth connection is required.'\n />,\n );\n\n return undefined;\n }\n\n if ((isNewConnection || isEditingSecret) && !formState.clientSecret) {\n setIsSubmitting(false);\n setError(\n <FormattedMessage\n id='add_outgoing_oauth_connection.client_secret.required'\n defaultMessage='Client Secret for the OAuth connection is required.'\n />,\n );\n\n return undefined;\n }\n\n if (!formState.grantType) {\n setIsSubmitting(false);\n setError(\n <FormattedMessage\n id='add_outgoing_oauth_connection.grant_type.required'\n defaultMessage='Grant Type for the OAuth connection is required.'\n />,\n );\n\n return undefined;\n }\n\n if (!formState.oauthTokenUrl) {\n setIsSubmitting(false);\n setError(\n <FormattedMessage\n id='add_outgoing_oauth_connection.oauth_token_url.required'\n defaultMessage='OAuth Token URL for the OAuth connection is required.'\n />,\n );\n\n return undefined;\n }\n\n const audienceUrls = [];\n for (let audienceUrl of formState.audienceUrls.split('\\n')) {\n audienceUrl = audienceUrl.trim();\n\n if (audienceUrl.length > 0) {\n audienceUrls.push(audienceUrl);\n }\n }\n\n if (requireAudienceUrl && audienceUrls.length === 0) {\n setIsSubmitting(false);\n setError(\n <FormattedMessage\n id='add_outgoing_oauth_connection.audienceUrls.required'\n defaultMessage='One or more audience URLs are required.'\n />,\n );\n\n return undefined;\n }\n\n const connection = {\n name: formState.name,\n audiences: audienceUrls,\n client_id: formState.clientId,\n client_secret: formState.clientSecret,\n grant_type: formState.grantType,\n oauth_token_url: formState.oauthTokenUrl,\n } as OutgoingOAuthConnection;\n\n return connection;\n };\n\n const showSkipValidateModal = () => {\n setIsValidationModalOpen(true);\n };\n\n const hideSkipValidateModal = () => {\n setIsValidationModalOpen(false);\n };\n\n const handleSubmitFromButton = (e: FormEvent) => {\n e.preventDefault();\n handleSubmit();\n };\n\n const handleSubmit = () => {\n if (isSubmitting) {\n return;\n }\n\n const connection = parseForm(true);\n if (!connection) {\n return;\n }\n\n setError('');\n\n if (validationStatus !== ValidationStatus.VALIDATED && !(!isNewConnection && validationStatus === ValidationStatus.INITIAL)) {\n if (!isValidationModalOpen) {\n showSkipValidateModal();\n return;\n }\n }\n\n setIsSubmitting(true);\n\n const res = props.submitAction(connection);\n res.then(() => setIsSubmitting(false));\n };\n\n const handleValidate = async (e: FormEvent) => {\n e.preventDefault();\n\n if (validationStatus === ValidationStatus.VALIDATING) {\n return;\n }\n\n setError('');\n setValidationStatus(ValidationStatus.VALIDATING);\n\n const connection = parseForm(false);\n if (!connection) {\n // Defer to the form validation error\n setValidationStatus(ValidationStatus.INITIAL);\n return;\n }\n\n if (props.initialConnection?.id) {\n connection.id = props.initialConnection.id;\n }\n\n const {error} = await dispatch(validateOutgoingOAuthConnection(props.team.id, connection));\n\n if (error) {\n setValidationStatus(ValidationStatus.ERROR);\n setValidationError(error.message);\n } else {\n setValidationStatus(ValidationStatus.VALIDATED);\n }\n };\n\n const setUnvalidated = (e?: React.FormEvent) => {\n e?.preventDefault();\n\n if (validationStatus !== ValidationStatus.DIRTY) {\n setValidationStatus(ValidationStatus.DIRTY);\n }\n\n if (validationError) {\n setValidationError('');\n }\n };\n\n const updateName = (e: ChangeEvent<HTMLInputElement>) => {\n setFormState({\n name: e.target.value,\n });\n };\n\n const updateClientId = (e: ChangeEvent<HTMLInputElement>) => {\n setUnvalidated();\n\n setFormState({\n clientId: e.target.value,\n });\n };\n\n const updateClientSecret = (e: ChangeEvent<HTMLInputElement>) => {\n setUnvalidated();\n\n setFormState({\n clientSecret: e.target.value,\n });\n };\n\n const updateOAuthTokenURL = (e: ChangeEvent<HTMLInputElement>) => {\n setUnvalidated();\n\n setFormState({\n oauthTokenUrl: e.target.value,\n });\n };\n\n const updateAudienceUrls = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setFormState({\n audienceUrls: e.target.value,\n });\n };\n\n const startEditingClientSecret = () => {\n setIsEditingSecret(true);\n };\n\n const headerToRender = props.header;\n const footerToRender = props.footer;\n\n let clientSecretSection = (\n <input\n id='client_secret'\n type='text'\n autoComplete='off'\n className='form-control'\n value={formState.clientSecret}\n onChange={updateClientSecret}\n />\n );\n\n if (!isNewConnection && !isEditingSecret) {\n clientSecretSection = (\n <>\n <input\n id='client_secret'\n disabled={true}\n autoComplete='off'\n type='text'\n className='form-control disabled'\n value={'•'.repeat(40)}\n />\n <span\n onClick={startEditingClientSecret}\n className='outgoing-oauth-connections-edit-secret'\n >\n <i className='icon icon-pencil-outline'/>\n </span>\n </>\n );\n }\n\n return (\n <div className='backstage-content'>\n <BackstageHeader>\n <Link to={`/${props.team.name}/integrations/outgoing-oauth2-connections`}>\n <FormattedMessage\n id='add_outgoing_oauth_connection.header'\n defaultMessage='Outgoing OAuth Connections'\n />\n </Link>\n <FormattedMessage\n id={headerToRender.id}\n defaultMessage={headerToRender.defaultMessage}\n />\n </BackstageHeader>\n <div className='backstage-form'>\n <form className='form-horizontal'>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='name'\n >\n <FormattedMessage\n id='add_outgoing_oauth_connection.name.label'\n defaultMessage='Name'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='name'\n type='text'\n className='form-control'\n value={formState.name}\n onChange={updateName}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.name.help'\n defaultMessage='Specify the name for your OAuth connection.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='client_id'\n >\n <FormattedMessage\n id='add_outgoing_oauth_connection.client_id.label'\n defaultMessage='Client ID'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='client_id'\n type='text'\n autoComplete='off'\n className='form-control'\n value={formState.clientId}\n onChange={updateClientId}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.client_id.help'\n defaultMessage='Specify the Client ID for your OAuth connection.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='client_secret'\n >\n <FormattedMessage\n id='add_outgoing_oauth_connection.client_secret.label'\n defaultMessage='Client Secret'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n {clientSecretSection}\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.client_secret.help'\n defaultMessage='Specify the Client Secret for your OAuth connection.'\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='oauth_token_url'\n >\n <FormattedMessage\n id='add_outgoing_oauth_connection.oauth_token_url.label'\n defaultMessage='OAuth Token URL'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <input\n id='token_url'\n type='text'\n className='form-control'\n value={formState.oauthTokenUrl}\n onChange={updateOAuthTokenURL}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.oauth_token_url.help'\n defaultMessage='Specify the OAuth Token URL for your OAuth connection.'\n />\n </div>\n <div className='outgoing-oauth-connection-validate-button-container'>\n <ValidateButton\n onClick={handleValidate}\n setUnvalidated={setUnvalidated}\n status={validationStatus}\n />\n </div>\n </div>\n </div>\n <div className='form-group'>\n <label\n className='control-label col-sm-4'\n htmlFor='audienceUrls'\n >\n <FormattedMessage\n id='add_outgoing_oauth_connection.audienceUrls.label'\n defaultMessage='Audience URLs (One Per Line)'\n />\n </label>\n <div className='col-md-5 col-sm-8'>\n <textarea\n id='audienceUrls'\n rows={3}\n className='form-control'\n value={formState.audienceUrls}\n onChange={updateAudienceUrls}\n />\n <div className='form__help'>\n <FormattedMessage\n id='add_outgoing_oauth_connection.audienceUrls.help'\n defaultMessage='The URLs which will receive requests with the OAuth token, e.g. your custom slash command handler endpoint. Must be a valid URL and start with http:// or https://.'\n />\n </div>\n </div>\n </div>\n <div className='backstage-form__footer'>\n <FormError\n type='backstage'\n errors={[props.serverError, storedError]}\n />\n <Link\n className='btn btn-tertiary'\n to={`/${props.team.name}/integrations/outgoing-oauth2-connections`}\n >\n <FormattedMessage\n id='add_outgoing_oauth_connection.cancel'\n defaultMessage='Cancel'\n />\n </Link>\n <SpinnerButton\n className='btn btn-primary'\n type='submit'\n spinning={isSubmitting}\n spinningText={intl.formatMessage(props.loading)}\n onClick={handleSubmitFromButton}\n id='saveConnection'\n >\n <FormattedMessage\n id={footerToRender.id}\n defaultMessage={footerToRender.defaultMessage}\n />\n </SpinnerButton>\n {props.renderExtra}\n </div>\n </form>\n </div>\n <div className='outgoing-oauth-connections-docs-link'>\n <FormattedMessage\n id={'add_outgoing_oauth_connection.documentation_link'}\n defaultMessage={'Get help with <link>configuring outgoing OAuth connections</link>.'}\n values={{\n link: (text: string) => (\n <a href='https://mattermost.com/pl/outgoing-oauth-connections'>{text}</a>\n ),\n }}\n />\n </div>\n <ConfirmModal\n show={isValidationModalOpen}\n message={intl.formatMessage({\n id: 'add_outgoing_oauth_connection.save_without_validation_warning',\n defaultMessage: 'This connection has not been validated, Do you want to save anyway?',\n })}\n title={intl.formatMessage({\n id: 'add_outgoing_oauth_connection.confirm_save',\n defaultMessage: 'Save Outgoing OAuth Connection',\n })}\n confirmButtonText={intl.formatMessage({\n id: 'add_outgoing_oauth_connection.save_anyway',\n defaultMessage: 'Save anyway',\n })}\n onExited={hideSkipValidateModal}\n onCancel={hideSkipValidateModal}\n onConfirm={handleSubmit}\n />\n </div>\n );\n}\n\ntype ValidateButtonProps = {\n status: ValidationStatus;\n onClick: (e: FormEvent) => void;\n setUnvalidated: (e: FormEvent) => void;\n}\n\nconst ValidateButton = ({status, onClick, setUnvalidated}: ValidateButtonProps) => {\n if (status === ValidationStatus.ERROR) {\n return (\n <span\n className='outgoing-oauth-connection-validation-message validation-error'\n >\n <AlertOutlineIcon size={20}/>\n <FormattedMessage\n id={'add_outgoing_oauth_connection.validation_error'}\n defaultMessage={'Connection not validated. Please check the server logs for details or <link>try again</link>.'}\n values={{\n link: (text: string) => <a onClick={setUnvalidated}>{text}</a>,\n }}\n />\n </span>\n );\n }\n\n if (status === ValidationStatus.VALIDATED) {\n return (\n <span\n className='outgoing-oauth-connection-validation-message validation-success'\n >\n <CheckCircleOutlineIcon size={20}/>\n <FormattedMessage\n id={'add_outgoing_oauth_connection.validated_connection'}\n defaultMessage={'Validated connection'}\n />\n </span>\n );\n }\n\n if (status === ValidationStatus.VALIDATING) {\n return (\n <span\n className='outgoing-oauth-connection-validation-message'\n >\n <LoadingSpinner\n text={(\n <FormattedMessage\n id={'add_outgoing_oauth_connection.validating'}\n defaultMessage={'Validating...'}\n />\n )}\n />\n </span>\n );\n }\n\n const validateButton = (\n <button\n className='btn btn-tertiary btn-sm'\n type='button'\n onClick={onClick}\n id='validateConnection'\n >\n <FormattedMessage\n id={'add_outgoing_oauth_connection.validate'}\n defaultMessage={'Validate Connection'}\n />\n </button>\n );\n\n return validateButton;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {defineMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport {useHistory} from 'react-router-dom';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {addOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\n\nimport AbstractOutgoingOAuthConnection from './abstract_outgoing_oauth_connection';\n\nconst HEADER = defineMessage({id: 'add_outgoing_oauth_connection.add', defaultMessage: 'Add'});\nconst FOOTER = defineMessage({id: 'add_outgoing_oauth_connection.save', defaultMessage: 'Save'});\nconst LOADING = defineMessage({id: 'add_outgoing_oauth_connection.saving', defaultMessage: 'Saving...'});\n\nexport type Props = {\n team: Team;\n};\n\nconst AddOutgoingOAuthConnection = ({team}: Props): JSX.Element => {\n const dispatch = useDispatch();\n\n const history = useHistory();\n\n const [serverError, setServerError] = useState('');\n\n const submit = async (connection: OutgoingOAuthConnection) => {\n setServerError('');\n\n const {data, error} = (await dispatch(addOutgoingOAuthConnection(team.id, connection))) as unknown as {data: OutgoingOAuthConnection; error: Error};\n if (data) {\n history.push(`/${team.name}/integrations/confirm?type=outgoing-oauth2-connections&id=${data.id}`);\n return;\n }\n\n if (error) {\n setServerError(error.message);\n }\n };\n\n return (\n <AbstractOutgoingOAuthConnection\n team={team}\n header={HEADER}\n footer={FOOTER}\n loading={LOADING}\n submitAction={submit}\n serverError={serverError}\n />\n );\n};\n\nexport default AddOutgoingOAuthConnection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {editOutgoingOAuthConnection, getOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport AbstractOutgoingOAuthConnection from './abstract_outgoing_oauth_connection';\n\nconst HEADER = defineMessage({id: 'integrations.edit', defaultMessage: 'Edit'});\nconst FOOTER = defineMessage({id: 'edit_outgoing_oauth_connection.update', defaultMessage: 'Update'});\nconst LOADING = defineMessage({id: 'edit_outgoing_oauth_connection.updating', defaultMessage: 'Updating...'});\n\ntype Props = {\n team: Team;\n location: Location;\n};\n\nconst getConnectionIdFromSearch = (search: string): string => {\n return (new URLSearchParams(search)).get('id') || '';\n};\n\nconst EditOutgoingOAuthConnection = (props: Props) => {\n const connectionId = getConnectionIdFromSearch(props.location.search);\n const connections = useSelector(getOutgoingOAuthConnections);\n const existingConnection = connections[connectionId];\n\n const [newConnection, setNewConnection] = useState(existingConnection);\n const [showConfirmModal, setShowConfirmModal] = useState(false);\n const [serverError, setServerError] = useState('');\n\n const enableOAuthServiceProvider = useSelector(getConfig).EnableOAuthServiceProvider;\n\n const dispatch = useDispatch();\n\n useEffect(() => {\n if (enableOAuthServiceProvider) {\n dispatch(getOutgoingOAuthConnection(props.team.id, connectionId));\n }\n }, [connectionId, enableOAuthServiceProvider, props.team, dispatch]);\n\n const handleInitialSubmit = async (connection: OutgoingOAuthConnection) => {\n setNewConnection(connection);\n\n if (existingConnection.id) {\n connection.id = existingConnection.id;\n }\n\n const audienceUrlsSame = (existingConnection.audiences.length === connection.audiences.length) &&\n existingConnection.audiences.every((v, i) => v === connection.audiences[i]);\n\n if (audienceUrlsSame) {\n await createOutgoingOAuthConnection(connection);\n } else {\n handleConfirmModal();\n }\n };\n\n const handleConfirmModal = () => {\n setShowConfirmModal(true);\n };\n\n const confirmModalDismissed = () => {\n setShowConfirmModal(false);\n };\n\n const createOutgoingOAuthConnection = async (connection: OutgoingOAuthConnection) => {\n setServerError('');\n\n const res = await dispatch(editOutgoingOAuthConnection(props.team.id, connection));\n\n if ('data' in res && res.data) {\n getHistory().push(`/${props.team.name}/integrations/outgoing-oauth2-connections`);\n return;\n }\n\n confirmModalDismissed();\n\n if ('error' in res) {\n const {error: err} = res as {error: Error};\n setServerError(err.message);\n }\n };\n\n const renderExtra = () => {\n const confirmButton = (\n <FormattedMessage\n id='update_command.update'\n defaultMessage='Update'\n />\n );\n\n const confirmTitle = (\n <FormattedMessage\n id='update_outgoing_oauth_connection.confirm'\n defaultMessage='Edit Outgoing OAuth Connection'\n />\n );\n\n const confirmMessage = (\n <FormattedMessage\n id='update_outgoing_oauth_connection.question'\n defaultMessage='Your changes may break any existing integrations using this connection. Are you sure you would like to update it?'\n />\n );\n\n return (\n <ConfirmModal\n title={confirmTitle}\n message={confirmMessage}\n confirmButtonText={confirmButton}\n modalClass='integrations-backstage-modal'\n show={showConfirmModal}\n onConfirm={() => createOutgoingOAuthConnection(newConnection)}\n onCancel={confirmModalDismissed}\n />\n );\n };\n\n if (!existingConnection) {\n return <LoadingScreen/>;\n }\n\n return (\n <AbstractOutgoingOAuthConnection\n team={props.team}\n header={HEADER}\n footer={FOOTER}\n loading={LOADING}\n renderExtra={renderExtra()}\n submitAction={handleInitialSubmit}\n serverError={serverError}\n initialConnection={existingConnection}\n />\n );\n};\n\nexport default EditOutgoingOAuthConnection;\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 {Link} from 'react-router-dom';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport DeleteIntegrationLink from '../delete_integration_link';\n\nexport function matchesFilter(outgoingOAuthConnection: OutgoingOAuthConnection, filter?: string | null): boolean {\n if (!filter) {\n return true;\n }\n\n return outgoingOAuthConnection.name.toLowerCase().includes(filter);\n}\n\nexport type InstalledOutgoingOAuthConnectionProps = {\n team: Partial<Team>;\n outgoingOAuthConnection: OutgoingOAuthConnection;\n creatorName: string;\n filter?: string | null;\n\n onDelete: (outgoingOAuthConnection: OutgoingOAuthConnection) => void;\n}\n\nexport type InstalledOutgoingOAuthConnectionState = {\n clientSecret: string;\n error?: string | null;\n}\n\nconst InstalledOutgoingOAuthConnection = (props: InstalledOutgoingOAuthConnectionProps) => {\n const handleDelete = (): void => {\n props.onDelete(props.outgoingOAuthConnection);\n };\n\n const {outgoingOAuthConnection, creatorName} = props;\n\n if (!matchesFilter(outgoingOAuthConnection, props.filter)) {\n return null;\n }\n\n let name;\n if (outgoingOAuthConnection.name) {\n name = outgoingOAuthConnection.name;\n } else {\n name = (\n <FormattedMessage\n id='installed_integrations.unnamed_outgoing_oauth_connection'\n defaultMessage='Unnamed Outgoing OAuth Connection'\n />\n );\n }\n\n const urls = (\n <>\n <div className='item-details__row'>\n <span className='item-details__url word-break--all'>\n <FormattedMessage\n id='installed_integrations.audience_urls'\n defaultMessage='Audience URLs: {urls}'\n values={{\n urls: outgoingOAuthConnection.audiences.join(', '),\n }}\n />\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__url word-break--all'>\n <FormattedMessage\n id='installed_integrations.token_url'\n defaultMessage='Token URL: {url}'\n values={{\n url: outgoingOAuthConnection.oauth_token_url,\n }}\n />\n </span>\n </div>\n </>\n );\n\n const actions = (\n <div className='item-actions'>\n <Link to={`/${props.team.name}/integrations/outgoing-oauth2-connections/edit?id=${outgoingOAuthConnection.id}`}>\n <FormattedMessage\n id='installed_integrations.edit'\n defaultMessage='Edit'\n />\n </Link>\n {' - '}\n <DeleteIntegrationLink\n subtitleText={\n <FormattedMessage\n id='installed_outgoing_oauth_connections.delete.confirm'\n defaultMessage='Are you sure you want to delete {connectionName}?'\n values={{\n connectionName: (\n <strong>\n {props.outgoingOAuthConnection.name}\n </strong>\n ),\n }}\n />\n }\n modalMessage={\n <FormattedMessage\n id='installed_outgoing_oauth_connections.delete.wanring'\n defaultMessage='Deleting this connection will break any integrations using it'\n />\n }\n onDelete={handleDelete}\n />\n </div>\n );\n\n const connectionInfo = (\n <>\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_integrations.client_id'\n defaultMessage='Client ID: '\n />\n <strong>{outgoingOAuthConnection.client_id}</strong>\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_outgoing_oauth_connections.client_secret'\n defaultMessage='Client Secret: ********'\n />\n </span>\n </div>\n {outgoingOAuthConnection.grant_type === 'password' && (\n <>\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_outgoing_oauth_connections.username'\n defaultMessage='Username: '\n />\n <strong>{outgoingOAuthConnection.credentials_username}</strong>\n </span>\n </div>\n <div className='item-details__row'>\n <span className='item-details__token'>\n <FormattedMessage\n id='installed_outgoing_oauth_connections.password'\n defaultMessage='Password: ********'\n />\n </span>\n </div>\n </>\n )}\n\n {urls}\n <div className='item-details__row'>\n <span className='item-details__creation'>\n <FormattedMessage\n id='installed_integrations.creation'\n defaultMessage='Created by {creator} on {createAt, date, full}'\n values={{\n creator: creatorName,\n createAt: outgoingOAuthConnection.create_at,\n }}\n />\n </span>\n </div>\n </>\n );\n\n return (\n <div className='backstage-list__item' >\n <div className='item-details' >\n <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n <strong className='item-details__name'>\n {name}\n </strong>\n {actions}\n </div>\n {connectionInfo}\n </div>\n </div >\n );\n};\n\nexport default InstalledOutgoingOAuthConnection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {deleteOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {loadOutgoingOAuthConnectionsAndProfiles} from 'actions/integration_actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport {DeveloperLinks} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport InstalledOutgoingOAuthConnection, {matchesFilter} from './installed_outgoing_oauth_connection';\n\ntype Props = {\n team: Team;\n};\n\nconst InstalledOutgoingOAuthConnections = (props: Props) => {\n const [loading, setLoading] = useState(true);\n const canManageOutgoingOAuthConnections = useSelector((state: GlobalState) => haveITeamPermission(state, props.team.id, Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS));\n const enableOutgoingOAuthConnections = (useSelector(getConfig).EnableOutgoingOAuthConnections === 'true');\n const connections = useSelector(getOutgoingOAuthConnections);\n\n const dispatch = useDispatch();\n const intl = useIntl();\n\n useEffect(() => {\n if (canManageOutgoingOAuthConnections) {\n (dispatch(loadOutgoingOAuthConnectionsAndProfiles(props.team.id)) as unknown as Promise<void>).then(\n () => setLoading(false),\n );\n }\n }, [canManageOutgoingOAuthConnections, props.team, dispatch]);\n\n const deleteOutgoingOAuthConnectionLocal = (connection: OutgoingOAuthConnection): void => {\n if (connection && connection.id) {\n dispatch(deleteOutgoingOAuthConnection(connection.id));\n }\n };\n\n const outgoingOauthConnectionCompare = (a: OutgoingOAuthConnection, b: OutgoingOAuthConnection): number => {\n let nameA = a.name.toString();\n if (!nameA) {\n nameA = intl.formatMessage({id: 'installed_integrations.unnamed_outgoing_oauth_connection', defaultMessage: 'Unnamed Outgoing OAuth Connection'});\n }\n\n let nameB = b.name.toString();\n if (!nameB) {\n nameB = intl.formatMessage({id: 'installed_integrations.unnamed_outgoing_oauth_connection', defaultMessage: 'Unnamed Outgoing OAuth Connection'});\n }\n\n return nameA.localeCompare(nameB);\n };\n\n const outgoingOauthConnections = (filter?: string) => {\n const values = Object.values(connections);\n const filtered = values.filter((connection) => matchesFilter(connection, filter));\n const sorted = filtered.sort(outgoingOauthConnectionCompare);\n const mapped = sorted.map((connection) => {\n return (\n <InstalledOutgoingOAuthConnection\n key={connection.id}\n outgoingOAuthConnection={connection}\n onDelete={deleteOutgoingOAuthConnectionLocal}\n team={props.team}\n creatorName=''\n />\n );\n });\n\n return mapped;\n };\n\n const integrationsEnabled = enableOutgoingOAuthConnections && canManageOutgoingOAuthConnections;\n let childProps;\n if (integrationsEnabled) {\n childProps = {\n addLink: '/' + props.team.name + '/integrations/outgoing-oauth2-connections/add',\n addText: intl.formatMessage({id: 'installed_outgoing_oauth_connections.add', defaultMessage: 'Add Outgoing OAuth Connection'}),\n addButtonId: 'addOutgoingOauthConnection',\n };\n }\n\n return (\n <BackstageList\n header={\n <FormattedMessage\n id='installed_outgoing_oauth_connections.header'\n defaultMessage='Outgoing OAuth Connections'\n />\n }\n helpText={\n <FormattedMessage\n id='installed_outgoing_oauth_connections.help'\n defaultMessage='Create {outgoingOauthConnections} to securely integrate bots and third-party apps with Mattermost.'\n values={{\n outgoingOauthConnections: (\n <ExternalLink\n href={DeveloperLinks.SETUP_OAUTH2}\n location='installed_outgoing_oauth_connections'\n >\n <FormattedMessage\n id='installed_outgoing_oauth_connections.help.outgoingOauthConnections'\n defaultMessage='Outgoing OAuth Connections'\n />\n </ExternalLink>\n ),\n }}\n />\n }\n emptyText={\n <FormattedMessage\n id='installed_outgoing_oauth_connections.empty'\n defaultMessage='No Outgoing OAuth Connections found'\n />\n }\n emptyTextSearch={\n <FormattedMessage\n id='installed_outgoing_oauth_connections.emptySearch'\n defaultMessage='No Outgoing OAuth Connections match {searchTerm}'\n />\n }\n searchPlaceholder={intl.formatMessage({id: 'installed_outgoing_oauth_connections.search', defaultMessage: 'Search Outgoing OAuth Connections'})}\n loading={loading}\n {...childProps}\n >\n {(filter: string) => {\n const children = outgoingOauthConnections(filter);\n return [children, children.length > 0];\n }}\n </BackstageList>\n );\n};\n\nexport default InstalledOutgoingOAuthConnections;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {Route, NavLink} from 'react-router-dom';\n\ntype Props = {\n name: string;\n title: ReactNode;\n icon: string;\n parentLink?: string;\n children?: ReactNode[];\n}\n\nconst BackstageCategory = ({name, title, icon, parentLink, children = []}: Props) => {\n const link = parentLink + '/' + name;\n\n return (\n <li className='backstage-sidebar__category'>\n <NavLink\n to={link}\n className='category-title'\n activeClassName='category-title--active'\n >\n <i className={classNames('fa ', icon)}/>\n <span className='category-title__text'>\n {title}\n </span>\n </NavLink>\n {\n children && children.length > 0 &&\n <Route\n path={link}\n render={() => (\n <ul className='sections'>\n {\n React.Children.map(children, (child) => {\n if (!child) {\n return child;\n }\n\n return React.cloneElement(child as JSX.Element, {\n parentLink: link,\n });\n })\n }\n </ul>\n )}\n />\n }\n </li>\n );\n};\n\nexport default BackstageCategory;\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 {NavLink} from 'react-router-dom';\n\ntype Props = {\n name: string;\n title: ReactNode;\n subsection?: boolean;\n parentLink?: string;\n children?: JSX.Element[];\n id?: string;\n}\n\nconst BackstageSection = ({name, title, subsection = false, parentLink = '', children = [], id}: Props) => {\n const link = parentLink + '/' + name;\n\n let clonedChildren = null;\n if (children.length > 0) {\n clonedChildren = (\n <ul className='subsections'>\n {\n React.Children.map(children, (child) => {\n return React.cloneElement(child, {\n parentLink: link,\n subsection: true,\n });\n })\n }\n </ul>\n );\n }\n\n const className = subsection ? 'subsection' : 'section';\n\n return (\n <li\n className={className}\n id={id}\n >\n <NavLink\n className={`${className}-title`}\n activeClassName={`${className}-title--active`}\n to={link}\n >\n <span className={`${className}-title__text`}>\n {title}\n </span>\n </NavLink>\n {clonedChildren}\n </li>\n );\n};\n\nexport default BackstageSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport BackstageCategory from './backstage_category';\nimport BackstageSection from './backstage_section';\n\ntype Props = {\n team: Team;\n enableCustomEmoji: boolean;\n enableIncomingWebhooks: boolean;\n enableOutgoingWebhooks: boolean;\n enableCommands: boolean;\n enableOAuthServiceProvider: boolean;\n enableOutgoingOAuthConnections: boolean;\n canCreateOrDeleteCustomEmoji: boolean;\n canManageIntegrations: boolean;\n}\n\nexport default class BackstageSidebar extends React.PureComponent<Props> {\n renderCustomEmoji() {\n if (!this.props.enableCustomEmoji || !this.props.canCreateOrDeleteCustomEmoji) {\n return null;\n }\n\n return (\n <BackstageCategory\n name='emoji'\n parentLink={'/' + this.props.team.name}\n icon='fa-smile-o'\n title={\n <FormattedMessage\n id='backstage_sidebar.emoji'\n defaultMessage='Custom Emoji'\n />\n }\n />\n );\n }\n\n renderIntegrations() {\n if (!this.props.canManageIntegrations) {\n return null;\n }\n\n let incomingWebhooks;\n if (this.props.enableIncomingWebhooks) {\n incomingWebhooks = (\n <TeamPermissionGate\n permissions={[Permissions.MANAGE_INCOMING_WEBHOOKS]}\n teamId={this.props.team.id}\n >\n <BackstageSection\n name='incoming_webhooks'\n parentLink={'/' + this.props.team.name + '/integrations'}\n title={(\n <FormattedMessage\n id='backstage_sidebar.integrations.incoming_webhooks'\n defaultMessage='Incoming Webhooks'\n />\n )}\n id='incomingWebhooks'\n />\n </TeamPermissionGate>\n );\n }\n\n let outgoingWebhooks: JSX.Element | null = null;\n if (this.props.enableOutgoingWebhooks) {\n outgoingWebhooks = (\n <TeamPermissionGate\n permissions={[Permissions.MANAGE_OUTGOING_WEBHOOKS]}\n teamId={this.props.team.id}\n >\n <BackstageSection\n name='outgoing_webhooks'\n parentLink={'/' + this.props.team.name + '/integrations'}\n title={(\n <FormattedMessage\n id='backstage_sidebar.integrations.outgoing_webhooks'\n defaultMessage='Outgoing Webhooks'\n />\n )}\n id='outgoingWebhooks'\n />\n </TeamPermissionGate>\n );\n }\n\n let commands: JSX.Element | null = null;\n if (this.props.enableCommands) {\n commands = (\n <TeamPermissionGate\n permissions={[Permissions.MANAGE_SLASH_COMMANDS]}\n teamId={this.props.team.id}\n >\n <BackstageSection\n name='commands'\n parentLink={'/' + this.props.team.name + '/integrations'}\n title={(\n <FormattedMessage\n id='backstage_sidebar.integrations.commands'\n defaultMessage='Slash Commands'\n />\n )}\n id='slashCommands'\n />\n </TeamPermissionGate>\n );\n }\n\n let oauthApps: JSX.Element | null = null;\n if (this.props.enableOAuthServiceProvider) {\n oauthApps = (\n <SystemPermissionGate permissions={[Permissions.MANAGE_OAUTH]}>\n <BackstageSection\n name='oauth2-apps'\n parentLink={'/' + this.props.team.name + '/integrations'}\n title={\n <FormattedMessage\n id='backstage_sidebar.integrations.oauthApps'\n defaultMessage='OAuth 2.0 Applications'\n />\n }\n id='oauthApps'\n />\n </SystemPermissionGate>\n );\n }\n\n // Note that we allow managing bot accounts even if bot account creation is disabled: only\n // a permissions check is required.\n const botAccounts = (\n <SystemPermissionGate permissions={['manage_bots', 'manage_others_bots']}>\n <BackstageSection\n name='bots'\n parentLink={'/' + this.props.team.name + '/integrations'}\n title={\n <FormattedMessage\n id='backstage_sidebar.bots'\n defaultMessage='Bot Accounts'\n />\n }\n id='botAccounts'\n />\n </SystemPermissionGate>\n );\n\n let outgoingOAuthConnections: JSX.Element | null = null;\n if (this.props.enableOutgoingOAuthConnections) {\n outgoingOAuthConnections = (\n <TeamPermissionGate\n permissions={[Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS]}\n teamId={this.props.team.id}\n >\n <BackstageSection\n name='outgoing-oauth2-connections'\n parentLink={'/' + this.props.team.name + '/integrations'}\n title={\n <FormattedMessage\n id='backstage_sidebar.integrations.outgoingOauthConnections'\n defaultMessage='Outgoing OAuth 2.0 Connections'\n />\n }\n id='outgoingOauthConnections'\n />\n </TeamPermissionGate>\n );\n }\n\n return (\n <BackstageCategory\n name='integrations'\n icon='fa-link'\n parentLink={'/' + this.props.team.name}\n title={\n <FormattedMessage\n id='backstage_sidebar.integrations'\n defaultMessage='Integrations'\n />\n }\n >\n {incomingWebhooks}\n {outgoingWebhooks}\n {commands}\n {oauthApps}\n {botAccounts}\n {outgoingOAuthConnections}\n </BackstageCategory>\n );\n }\n\n render() {\n return (\n <div className='backstage-sidebar'>\n <ul>\n {this.renderCustomEmoji()}\n {this.renderIntegrations()}\n </ul>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useRef} from 'react';\nimport type {ComponentType} from 'react';\nimport {Route, Switch} from 'react-router-dom';\nimport type {match} from 'react-router-dom';\nimport {createGlobalStyle} from 'styled-components';\n\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport Emoji from 'components/emoji';\nimport AddEmoji from 'components/emoji/add_emoji';\nimport Integrations from 'components/integrations';\nimport AddIncomingWehook from 'components/integrations/add_incoming_webhook';\nimport AddOauthApp from 'components/integrations/add_oauth_app';\nimport AddOutgoingWebhook from 'components/integrations/add_outgoing_webhook';\nimport Bots from 'components/integrations/bots';\nimport AddBot from 'components/integrations/bots/add_bot';\nimport CommandsContainer from 'components/integrations/commands_container';\nimport ConfirmIntegration from 'components/integrations/confirm_integration';\nimport EditIncomingWebhook from 'components/integrations/edit_incoming_webhook';\nimport EditOauthApp from 'components/integrations/edit_oauth_app';\nimport EditOutgoingWebhook from 'components/integrations/edit_outgoing_webhook';\nimport InstalledIncomingWebhooks from 'components/integrations/installed_incoming_webhooks';\nimport InstalledOauthApps from 'components/integrations/installed_oauth_apps';\nimport InstalledOutgoingWebhooks from 'components/integrations/installed_outgoing_webhooks';\nimport AddOutgoingOAuthConnection from 'components/integrations/outgoing_oauth_connections/add_outgoing_oauth_connection';\nimport EditOutgoingOAuthConnection from 'components/integrations/outgoing_oauth_connections/edit_outgoing_oauth_connection';\nimport InstalledOutgoingOAuthConnections from 'components/integrations/outgoing_oauth_connections/installed_outgoing_oauth_connections';\n\nimport Pluggable from 'plugins/pluggable';\n\nimport BackstageNavbar from './components/backstage_navbar';\nimport BackstageSidebar from './components/backstage_sidebar';\n\ntype ExtraProps = Pick<Props, 'user' | 'team'> & {scrollToTop: () => void}\n\ntype BackstageRouteProps = {\n component: ComponentType<any>;\n extraProps: ExtraProps;\n path: string;\n exact?: boolean;\n}\n\nconst BackstageRoute = ({component: Component, extraProps, ...rest}: BackstageRouteProps) => (\n <Route\n {...rest}\n render={(props) => (\n <Component\n {...extraProps}\n {...props}\n />\n )}\n />\n);\n\ntype Props = {\n\n /**\n * Current user.\n */\n user: UserProfile;\n\n /**\n * Current team.\n */\n team?: Team;\n\n /**\n * Object from react-router\n */\n match: match<{url: string}>;\n\n siteName?: string;\n enableCustomEmoji: boolean;\n enableIncomingWebhooks: boolean;\n enableOutgoingWebhooks: boolean;\n enableCommands: boolean;\n enableOAuthServiceProvider: boolean;\n enableOutgoingOAuthConnections: boolean;\n canCreateOrDeleteCustomEmoji: boolean;\n canManageIntegrations: boolean;\n}\n\nconst BackstageController = (props: Props) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n const scrollToTop = () => {\n if (listRef.current) {\n listRef.current.scrollTop = 0;\n }\n };\n\n if (!props.team || !props.user) {\n return null;\n }\n const extraProps = {\n team: props.team,\n user: props.user,\n scrollToTop,\n };\n return (\n <>\n <BackstageNavbar\n team={props.team}\n siteName={props.siteName}\n />\n <div\n className='backstage-body'\n ref={listRef}\n >\n <Pluggable pluggableName='Root'/>\n <BackstageSidebar\n team={props.team}\n enableCustomEmoji={props.enableCustomEmoji}\n enableIncomingWebhooks={props.enableIncomingWebhooks}\n enableOutgoingWebhooks={props.enableOutgoingWebhooks}\n enableCommands={props.enableCommands}\n enableOAuthServiceProvider={props.enableOAuthServiceProvider}\n enableOutgoingOAuthConnections={props.enableOutgoingOAuthConnections}\n canCreateOrDeleteCustomEmoji={props.canCreateOrDeleteCustomEmoji}\n canManageIntegrations={props.canManageIntegrations}\n />\n <Switch>\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={'/:team/integrations'}\n component={Integrations}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={`${props.match.url}/incoming_webhooks`}\n component={InstalledIncomingWebhooks}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/incoming_webhooks/add`}\n component={AddIncomingWehook}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/incoming_webhooks/edit`}\n component={EditIncomingWebhook}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={`${props.match.url}/outgoing_webhooks`}\n component={InstalledOutgoingWebhooks}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/outgoing_webhooks/add`}\n component={AddOutgoingWebhook}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/outgoing_webhooks/edit`}\n component={EditOutgoingWebhook}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/commands`}\n component={CommandsContainer}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={`${props.match.url}/oauth2-apps`}\n component={InstalledOauthApps}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/oauth2-apps/add`}\n component={AddOauthApp}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/oauth2-apps/edit`}\n component={EditOauthApp}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={`${props.match.url}/outgoing-oauth2-connections`}\n component={InstalledOutgoingOAuthConnections}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={`${props.match.url}/outgoing-oauth2-connections/add`}\n component={AddOutgoingOAuthConnection}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={`${props.match.url}/outgoing-oauth2-connections/edit`}\n component={EditOutgoingOAuthConnection}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/confirm`}\n component={ConfirmIntegration}\n />\n <BackstageRoute\n extraProps={extraProps}\n exact={true}\n path={'/:team/emoji'}\n component={Emoji}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/add`}\n component={AddEmoji}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/bots/add`}\n component={AddBot}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/bots/edit`}\n component={AddBot}\n />\n <BackstageRoute\n extraProps={extraProps}\n path={`${props.match.url}/bots`}\n component={Bots}\n />\n </Switch>\n </div>\n <BackstageGlobalStyle/>\n </>\n );\n};\n\nexport default BackstageController;\n\nconst BackstageGlobalStyle = createGlobalStyle`\n #root {\n > #global-header,\n > .team-sidebar,\n > .main-wrapper .sidebar--right,\n > .app-bar {\n display: none;\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';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {haveITeamPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getMyTeams, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport BackstageController from './backstage_controller';\n\nfunction mapStateToProps(state: GlobalState) {\n const user = getCurrentUser(state);\n const team = getCurrentTeam(state);\n\n const config = getConfig(state);\n\n const siteName = config.SiteName;\n const enableCustomEmoji = config.EnableCustomEmoji === 'true';\n const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n const enableCommands = config.EnableCommands === 'true';\n const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n const enableOutgoingOAuthConnections = config.EnableOutgoingOAuthConnections === 'true';\n\n let canCreateOrDeleteCustomEmoji = (haveISystemPermission(state, {permission: Permissions.CREATE_EMOJIS}) || haveISystemPermission(state, {permission: Permissions.DELETE_EMOJIS}));\n if (!canCreateOrDeleteCustomEmoji) {\n for (const t of getMyTeams(state)) {\n if (haveITeamPermission(state, t.id, Permissions.CREATE_EMOJIS) || haveITeamPermission(state, t.id, Permissions.DELETE_EMOJIS)) {\n canCreateOrDeleteCustomEmoji = true;\n break;\n }\n }\n }\n\n const canManageTeamIntegrations = (haveITeamPermission(state, team?.id, Permissions.MANAGE_SLASH_COMMANDS) || haveITeamPermission(state, team?.id, Permissions.MANAGE_OAUTH) || haveITeamPermission(state, team?.id, Permissions.MANAGE_INCOMING_WEBHOOKS) || haveITeamPermission(state, team?.id, Permissions.MANAGE_OUTGOING_WEBHOOKS));\n const canManageSystemBots = (haveISystemPermission(state, {permission: Permissions.MANAGE_BOTS}) || haveISystemPermission(state, {permission: Permissions.MANAGE_OTHERS_BOTS}));\n const canManageIntegrations = canManageTeamIntegrations || canManageSystemBots;\n\n return {\n user,\n team,\n siteName,\n enableCustomEmoji,\n enableIncomingWebhooks,\n enableOutgoingWebhooks,\n enableCommands,\n enableOAuthServiceProvider,\n enableOutgoingOAuthConnections,\n canCreateOrDeleteCustomEmoji,\n canManageIntegrations,\n };\n}\n\nexport default withRouter(connect(mapStateToProps)(BackstageController));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst TYPE_MODAL = 'modal';\nconst TYPE_BACKSTAGE = 'backstage';\n\n// accepts either a single error or an array of errors\ntype Props = {\n type?: React.ReactNode;\n error?: React.ReactNode;\n textClassName?: string;\n iconClassName?: string;\n margin?: boolean;\n errors?: React.ReactNode[];\n};\n\nconst EMPTY_ERROR_LIST: React.ReactNode[] = [];\n\nconst FormError: React.FC<Props> = ({\n error = null,\n errors = EMPTY_ERROR_LIST,\n iconClassName,\n margin,\n textClassName,\n type,\n}) => {\n if (!error && errors.length === 0) {\n return null;\n }\n\n // look for the first truthy error to display\n let message = error;\n\n if (!message) {\n for (const err of errors) {\n if (err) {\n message = err;\n }\n }\n }\n\n if (!message) {\n return null;\n }\n\n if (type === TYPE_MODAL) {\n return (\n <div className='form-group'>\n <label className='col-sm-12 has-error'>{message}</label>\n </div>\n );\n }\n\n if (type === TYPE_BACKSTAGE) {\n return (\n <div className='pull-left has-error'>\n <label className='control-label'>{message}</label>\n </div>\n );\n }\n\n if (margin) {\n return (\n <div className='form-group has-error'>\n <label className='control-label'>{message}</label>\n </div>\n );\n }\n\n return (\n <div className={`col-sm-12 ${textClassName || 'has-error'}`}>\n <label className='control-label'>\n <i\n className={`fa ${iconClassName || 'fa-exclamation-circle'}`}\n />{' '}\n {message}\n </label>\n </div>\n );\n};\n\nexport default React.memo(FormError);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl, type MessageDescriptor} from 'react-intl';\n\ntype Props = {\n placeholder: MessageDescriptor;\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'placeholder'>;\n\nconst LocalizedPlaceholderInput = React.forwardRef<HTMLInputElement, Props>(({placeholder, ...otherProps}, ref) => {\n const intl = useIntl();\n\n return (\n <input\n ref={ref}\n placeholder={intl.formatMessage(placeholder)}\n {...otherProps}\n />\n );\n});\n\nLocalizedPlaceholderInput.displayName = 'LocalizedPlaceholderInput';\n\nexport default LocalizedPlaceholderInput;\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 {useIntl} from 'react-intl';\n\ntype Props = {\n additionalClassName?: string;\n}\n\nconst NextIcon = ({additionalClassName}: Props) => {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className={classNames('icon icon-chevron-right', additionalClassName)}\n title={formatMessage({\n id: 'generic_icons.next',\n defaultMessage: 'Next Icon',\n })}\n />\n );\n};\n\nexport default React.memo(NextIcon);\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 {useIntl} from 'react-intl';\n\ntype Props = {\n additionalClassName?: string;\n}\n\nconst PreviousIcon = ({additionalClassName}: Props) => {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className={classNames('icon icon-chevron-left', additionalClassName)}\n title={formatMessage({id: 'generic_icons.previous', defaultMessage: 'Previous Icon'})}\n />\n );\n};\n\nexport default React.memo(PreviousIcon);\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() {\n const {formatMessage} = useIntl();\n\n return (\n <i\n className='fa fa-search'\n title={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n />\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 {useIntl} from 'react-intl';\n\ntype Props = {\n additionalClassName?: string;\n}\n\nconst WarningIcon = ({additionalClassName}: Props) => {\n const {formatMessage} = useIntl();\n return (\n <i\n className={classNames('fa fa-warning', additionalClassName)}\n title={formatMessage({id: 'generic_icons.warning', defaultMessage: 'Warning Icon'})}\n />\n );\n};\n\nexport default React.memo(WarningIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Bot} from '@mattermost/types/bots';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getUsers} from 'mattermost-redux/selectors/entities/common';\n\nexport const ExternalBotAccountNames: string[] = ['mattermost-advisor'];\n\nexport function getBotAccounts(state: GlobalState) {\n return state.entities.bots.accounts;\n}\n\nexport const getExternalBotAccounts: (state: GlobalState) => Record<string, Bot> = createSelector(\n 'getExternalBotAccounts',\n getBotAccounts,\n getUsers,\n (botAccounts, userProfiles) => {\n const nextState: Record<string, Bot> = {};\n Object.values(botAccounts).forEach((botAccount) => {\n const botUser = userProfiles[botAccount.user_id];\n if (botUser && !ExternalBotAccountNames.includes(botUser.username)) {\n nextState[botAccount.user_id] = botAccount;\n }\n });\n\n return nextState;\n },\n);\n"],"names":["BackIcon","formatMessage","useIntl","React","className","title","id","defaultMessage","BackstageNavbar","_ref","team","siteName","teamExists","delete_at","Link","to","concat","name","FormattedMessage","values","propTypes","_pt","DeleteIntegrationLink","props","confirmButtonText","linkText","modalMessage","modalTitle","onDelete","openModal","onClick","useCallback","modalId","dialogProps","confirmButtonClass","modalClass","message","subtitleText","WarningIcon","additionalClassName","onConfirm","dialogType","ConfirmModalRedux","isRequired","mapDispatchToProps","connect","DeleteEmojiButton","DELETE_PERMISSION","Permissions","DELETE_EMOJIS","DELETE_OTHER_PERMISSION","DELETE_OTHERS_EMOJIS","EmojiListItem","actions","deleteCustomEmoji","emoji","creatorUsername","currentUserId","creatorDisplayName","emoticonStyle","useMemo","backgroundImage","Client4","getCustomEmojiImageUrl","handleDelete","displayName","deleteButton","creator_id","AnyTeamPermissionGate","permissions","style","emojiId","state","ownProps","entities","emojis","customEmoji","creator","getUser","getDisplayNameByUser","username","getCurrentUserId","currentTeam","getCurrentTeam","dispatch","bindActionCreators","EmojiList","constructor","super","_defineProperty","e","preventDefault","next","this","page","setState","nextLoading","getCustomEmojis","Emoji","SORT_BY_NAME","then","data","length","missingPages","scrollToTop","target","term","value","clearTimeout","searchTimeout","setTimeout","async","trim","searchEmojis","loading","searchCustomEmojis","map","em","index","indexOf","newSearchEmojis","splice","componentDidMount","EMOJI_PER_PAGE","_ref2","render","nextButton","previousButton","push","key","colSpan","LoadingScreen","emojiIds","forEach","deleteFromSearch","pageStart","pageEnd","slice","buttonContents","NextIcon","SaveButton","btnClass","extraClasses","nextPage","saving","disabled","savingMessage","previousPage","PreviousIcon","SearchIcon","LocalizedPlaceholderInput","type","placeholder","defineMessage","onChange","onSearchChange","search","flexGrow","flexShrink","getCustomEmojiIdsSortedByName","CREATE_EMOJIS_PERMISSIONS","CREATE_EMOJIS","ROLES","EmojiPage","teamDisplayName","teamName","currentTheme","intl","useEffect","updateTitle","loadRolesIfNeeded","Utils","document","display_name","general","config","SiteName","getTheme","children","childrenElements","child","AddEmoji","handleSubmit","emojiMap","user","image","error","toLowerCase","startsWith","endsWith","substring","test","hasSystemEmoji","has","size","response","createCustomEmoji","getHistory","responseError","genericError","files","imageUrl","reader","FileReader","onload","result","readAsDataURL","filename","preview","htmlFor","BackstageHeader","onSubmit","handleFormSubmit","maxLength","updateName","accept","Constants","ACCEPT_EMOJI_IMAGE","multiple","updateImage","FormError","SpinnerButton","spinning","spinningText","handleSaveButtonClick","getEmojiMap","IntegrationOption","description","link","alt","src","Integrations","arguments","currentSiteName","options","enableIncomingWebhooks","TeamPermissionGate","teamId","MANAGE_INCOMING_WEBHOOKS","IncomingWebhookIcon","enableOutgoingWebhooks","MANAGE_OUTGOING_WEBHOOKS","OutgoingWebhookIcon","enableCommands","MANAGE_SLASH_COMMANDS","SlashCommandIcon","enableOAuthServiceProvider","SystemPermissionGate","MANAGE_OAUTH","OAuthIcon","enableOutgoingOAuthConnections","MANAGE_OUTGOING_OAUTH_CONNECTIONS","OutgoingOAuthConnectionsIcon","BotAccountsIcon","appDirectory","ExternalLink","href","location","getConfig","EnableIncomingWebhooks","EnableOutgoingWebhooks","EnableCommands","EnableOAuthServiceProvider","EnableOutgoingOAuthConnections","ChannelSelect","channels","selectOpen","selectPrivate","selectDm","channel","channelName","OPEN_CHANNEL","PRIVATE_CHANNEL","DM_CHANNEL","memo","getMyChannelsSorted","createSelector","getMyChannels","getCurrentUserLocale","locale","filter","sort","sortChannelsByTypeAndDisplayName","bind","AbstractIncomingWebhook","PureComponent","hook","channelId","channel_id","channelLocked","channel_locked","iconURL","icon_url","serverError","clientError","_this$props$initialHo","_this$props$initialHo2","_this$props$initialHo3","_this$props$initialHo4","_this$props$initialHo5","_this$props$initialHo6","initialHook","create_at","update_at","team_id","user_id","action","checked","getStateFromHook","headerToRender","header","footerToRender","footer","updateDisplayName","updateDescription","updateChannelId","updateChannelLocked","enablePostUsernameOverride","updateUsername","enablePostIconOverride","updateIconURL","errors","messages","defineMessages","AddIncomingWebhook","setServerError","useState","addIncomingHook","createIncomingHook","EnablePostUsernameOverride","EnablePostIconOverride","r","t","i","Symbol","toPrimitive","call","TypeError","String","_toPrimitive","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","AbstractOAuthApp","app","homepage","callbackUrls","callback_urls","join","is_trusted","has_icon","Boolean","_this$icon_url$curren","current","callbackUrl","split","Image","imageLoaded","getStateFromApp","initialApp","renderExtra","icon","trusted","MANAGE_SYSTEM","updateTrusted","updateHomepage","ref","updateIconUrl","rows","updateCallbackUrls","AddOAuthApp","history","useHistory","addOAuthApp","AbstractOutgoingWebhook","triggerWords","trigger_words","contentType","content_type","triggerWhen","trigger_when","triggerWord","token","parseInt","contentTypeOption1","contentTypeOption2","updateContentType","updateTriggerWords","updateTriggerWhen","localizeMessage","DocLinks","TRUSTED_CONNECTION","AddOutgoingWebhook","createOutgoingHook","createBot","bot","bindClientFunc","clientFunc","onSuccess","BotTypes","RECEIVED_BOT_ACCOUNT","params","patchBot","botUserId","botPatch","loadBots","undefined","perPage","getBotsIncludeDeleted","RECEIVED_BOT_ACCOUNTS","disableBot","enableBot","getIncomingHooks","integrations","incomingHooks","getOutgoingHooks","outgoingHooks","getCommands","commands","getOAuthApps","oauthApps","getOutgoingOAuthConnections","outgoingOAuthConnections","getFilteredIncomingHooks","getCurrentTeamId","hooks","keys","incomingHook","getAppsOAuthAppIDs","appsEnabled","appsOAuthAppIDs","apps","ids","getAppsBotIDs","appsBotIDs","o","getAllCommands","systemCommands","_objectSpread","currentTeamId","command","auto_complete","a","b","localeCompare","remainingProps","setFilter","filterLowered","searchPlaceholder","childCount","hasChildren","emptyTextSearch","searchTerm","emptyText","addLink","addText","addButtonId","hasFilter","startCount","endCount","total","isFirstPage","isLastPage","getPaging","pageSize","childrenToDisplay","previousPageFn","nextPageFn","helpText","matchesFilter","owner","ownerUsername","Bot","enableUserAccessToken","disableUserAccessToken","confirmingId","revokeUserAccessToken","closeConfirm","creatingTokenState","assign","createUserAccessToken","fromApp","tokenList","accessTokens","activeLink","disabledText","disableClass","is_active","confirmRevokeToken","openCreateToken","handleCreateToken","autoFocus","handleUpdateDescription","closeCreateToken","imageURL","last_picture_update","Markdown","ConfirmModal","show","revokeTokenConfirmed","onCancel","Bots","owners","users","includes","bots","match","enabledBots","botToJSX","disabledBots","EnabledSection","DisabledSection","hasDisabled","START_PAGE_NUM","PAGE_SIZE","promises","owner_id","getUserAccessTokensForUser","Promise","all","fetchAppsBotIDs","botsToDisplay","BackstageList","createBots","chunks","botAccounts","EnableBotAccountCreation","getExternalBotAccounts","botValues","reduce","UserSelectors","admin","userAccessTokensByUser","roleOptionSystemAdmin","roleOptionMember","AddBot","role","postAll","postChannels","pictureFile","previewBlob","URL","createObjectURL","e2","_e2$target","orientation","FileUtils","orientationStyles","readAsArrayBuffer","BotDefaultIcon","roles","General","SYSTEM_USER_ROLE","SYSTEM_ADMIN_ROLE","SYSTEM_POST_ALL_ROLE","SYSTEM_POST_ALL_PUBLIC_ROLE","rolesResult","updateUserRoles","adding","isFile","AcceptedProfileImageTypes","maxFileSize","uploadProfileImage","setDefaultProfileImage","updateRoles","usernameError","errObj","ValidationErrors","INVALID_LAST_CHARACTER","tokenResult","UserUtils","transform","transformOrigin","file","subtitle","buttonText","buttonActiveText","imageStyles","removeImageIcon","WithTooltip","setDefault","ACCEPT_STATIC_IMAGE","updatePicture","editingUserHasManageSystem","updateRole","msg","DeveloperLinks","PERSONAL_ACCESS_TOKENS","updatePostAll","updatePostChannels","botId","URLSearchParams","get","getBotAccounts","MaxFileSize","haveISystemPermission","permission","DEFAULT_PAGE_SIZE","loadIncomingHooksAndProfilesForTeam","includeTotalCount","IntegrationActions","incoming_webhooks","getState","profilesToLoad","list","getProfilesByIds","loadOutgoingHooksAndProfilesForTeam","loadCommandsAndProfilesForTeam","loadOAuthAppsAndProfiles","loadProfilesForOAuthApps","OAuthConnectionAudienceInput","mounted","useRef","matchedConnection","setMatchingOAuthConnection","loadingAudienceMatch","setLoadingAudienceMatch","oauthConnections","useSelector","oauthConnectionsEnabled","useDispatch","matchConnectionsOnInput","res","fetchOutgoingOAuthConnectionsForAudience","inputValue","debouncedMatchConnections","debounce","fetchOutgoingOAuthConnections","connections","input","autoComplete","oauthMessage","LoadingSpinner","OauthIcon","connectionName","InformationOutlineIcon","AbstractCommand","_command$display_name","_command$description","_command$trigger","_command$url","_command$method","_command$username","_command$icon_url","_command$auto_complet","_command$auto_complet2","_command$auto_complet3","trigger","url","method","iconUrl","autocomplete","autocompleteHint","auto_complete_hint","autocompleteDescription","auto_complete_desc","substr","_this$state$autocompl","_this$state$autocompl2","MIN_TRIGGER_LENGTH","MAX_TRIGGER_LENGTH","min","max","methodValue","getStateFromCommand","initialCommand","updateAutocompleteHint","updateAutocompleteDescription","getBackstageHeader","updateTrigger","CUSTOM_SLASH_COMMANDS","updateUrl","text","updateMethod","updateAutocomplete","getBackstageFooter","AddCommand","headerMessage","footerMessage","loadingMessage","addCommand","CopyText","label","copyText","copyToClipboard","queryCommandSupported","ConfirmIntegration","window","addEventListener","handleKeyPress","removeEventListener","headerText","tokenText","outgoingHook","oauthApp","outgoingOAuthConnection","COMMAND","commandToken","SETUP_CUSTOM_SLASH_COMMANDS","copyToken","INCOMING_WEBHOOK","incomingHookToken","getSiteURL","SETUP_INCOMING_WEBHOOKS","OUTGOING_WEBHOOK","outgoingHookToken","SETUP_OUTGOING_WEBHOOKS","OAUTH_APP","oauthAppToken","oauthAppSecret","client_secret","SETUP_OAUTH2","copyClientId","secret","copyClientSecret","OUTGOING_OAUTH_CONNECTIONS","clientId","client_id","clientSecret","credentials_username","password","credentials_password","grant_type","copyUsername","oauth_token_url","audiences","BOT","replace","ErrorPageTypes","PAGE_NOT_FOUND","botToken","botname","EditCommand","_this$state$originalC","_this$state$originalC2","_this$state$originalC3","_this$state$originalC4","newCommand","originalCommand","handleConfirmModal","submitCommand","showConfirmModal","editCommand","confirmButton","confirmTitle","confirmMessage","confirmModalDismissed","getCustomTeamCommands","commandId","InstalledCommand","onRegenToken","canChange","handleRegenToken","createAt","InstalledCommands","regenCommandToken","deleteCommand","commandCompare","nameA","nameB","canManageOthersSlashCommands","buildYourOwn","haveITeamPermission","MANAGE_OTHERS_SLASH_COMMANDS","CommandRoute","component","Component","extraProps","rest","_objectWithoutProperties","_excluded","Route","path","CommandsContainer","_this$props$team","Switch","exact","Redirect","getUsers","EditIncomingWebhook","_this$props$hook","newHook","submitHook","updateIncomingHook","getIncomingHook","hookId","editIncomingHook","HEADER","FOOTER","LOADING","EditOAuthApp","newApp","every","v","submitOAuthApp","editOAuthApp","err","getOAuthApp","oauthAppId","EditOutgoingWebhook","triggerWordsSame","callbackUrlsSame","updateOutgoingHook","getOutgoingHook","editOutgoingHook","incomingWebhook","InstalledIncomingWebhook","incomingWebhookId","InstalledIncomingWebhooks","removeIncomingHook","pageToLoad","loadPage","displayNameA","channelA","displayNameB","incomingWebhookCompare","canManageOthersWebhooks","deleteIncomingWebhook","incomingHooksTotalCount","incomingWebhooks","getIncomingHooksTotalCount","MANAGE_OTHERS_INCOMING_WEBHOOKS","getAllChannels","FAKE_SECRET","InstalledOAuthApp","onRegenerateSecret","handleShowClientSecret","creatorName","urls","isTrusted","showHide","handleHideClientSecret","regen","handleRegenerate","appInfo","InstalledOAuthApps","deleteOAuthApp","oauthAppCompare","regenOAuthAppSecret","toString","canManageOauth","oauthApplications","outgoingWebhook","InstalledOutgoingWebhook","makeDisplayName","InstalledOutgoingWebhooks","regenOutgoingHookToken","removeOutgoingHook","channelB","outgoingWebhooks","outgoingWebhookCompare","regenOutgoingWebhookToken","MANAGE_OTHERS_OUTGOING_WEBHOOKS","Actions","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","apply","getOwnPropertyDescriptors","defineProperties","ValidationStatus","initialState","AbstractOutgoingOAuthConnection","formState","setFormState","connection","audienceUrls","oauthTokenUrl","grantType","newState","oldState","useOutgoingOAuthForm","initialConnection","storedError","setError","validationError","setValidationError","isSubmitting","setIsSubmitting","validationStatus","setValidationStatus","INITIAL","isEditingSecret","setIsEditingSecret","isValidationModalOpen","setIsValidationModalOpen","isNewConnection","parseForm","requireAudienceUrl","audienceUrl","hideSkipValidateModal","VALIDATED","submitAction","setUnvalidated","DIRTY","clientSecretSection","repeat","startEditingClientSecret","ValidateButton","_props$initialConnect","VALIDATING","validateOutgoingOAuthConnection","ERROR","status","onExited","AlertOutlineIcon","CheckCircleOutlineIcon","addOutgoingOAuthConnection","connectionId","existingConnection","newConnection","setNewConnection","setShowConfirmModal","getOutgoingOAuthConnection","createOutgoingOAuthConnection","editOutgoingOAuthConnection","InstalledOutgoingOAuthConnection","connectionInfo","setLoading","canManageOutgoingOAuthConnections","loadOutgoingOAuthConnectionsAndProfiles","deleteOutgoingOAuthConnectionLocal","deleteOutgoingOAuthConnection","outgoingOauthConnectionCompare","childProps","outgoingOauthConnections","parentLink","NavLink","activeClassName","classNames","subsection","clonedChildren","BackstageSidebar","renderCustomEmoji","enableCustomEmoji","canCreateOrDeleteCustomEmoji","BackstageCategory","renderIntegrations","canManageIntegrations","BackstageSection","BackstageRoute","BackstageGlobalStyle","createGlobalStyle","withRouter","getCurrentUser","EnableCustomEmoji","getMyTeams","canManageTeamIntegrations","canManageSystemBots","MANAGE_BOTS","MANAGE_OTHERS_BOTS","listRef","scrollTop","Pluggable","pluggableName","AddIncomingWehook","InstalledOauthApps","AddOauthApp","EditOauthApp","InstalledOutgoingOAuthConnections","AddOutgoingOAuthConnection","EditOutgoingOAuthConnection","EMPTY_ERROR_LIST","iconClassName","margin","textClassName","otherProps","ExternalBotAccountNames","accounts","userProfiles","nextState","botAccount","botUser"],"sourceRoot":""}