1{"version":3,"sources":["webpack://@mattermost/webapp/./components/terms_of_service/terms_of_service.tsx","webpack://@mattermost/webapp/./components/terms_of_service/index.ts","webpack://@mattermost/webapp/./components/widgets/icons/fa_logout_icon.tsx","webpack://@mattermost/webapp/./components/widgets/icons/fa_warning_icon.tsx"],"names":["TermsOfService","React","constructor","props","super","async","this","setState","customTermsOfServiceId","customTermsOfServiceText","loading","data","actions","getTermsOfService","id","text","GlobalActions","Constants","e","preventDefault","loadingAgree","serverError","registerUserAction","redirectTo","URLSearchParams","location","search","get","match","browserHistory","loadingDisagree","accepted","success","updateMyTermsOfServiceStatus","state","defaultMessage","formattedText","memoizeResult","formatText","emojiMap","componentDidMount","termsEnabled","render","termsMarkdownClasses","className","href","onClick","handleLogoutClick","data-testid","messageHtmlToComponent","mentions","ButtonGroup","Button","bsStyle","disabled","handleAcceptTerms","type","handleRejectTerms","Boolean","connect","getConfig","EnableCustomTermsOfService","getEmojiMap","dispatch","bindActionCreators","LogoutIcon","formatMessage","useIntl","title","WarningIcon","additionalClassName","t"],"mappings":"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","file":"626.628fae55898f5fb557ed.js","sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Button, ButtonGroup} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport {memoizeResult} from 'mattermost-redux/utils/helpers';\nimport {TermsOfService as ReduxTermsOfService} from 'mattermost-redux/types/terms_of_service';\n\nimport * as GlobalActions from 'actions/global_actions';\nimport AnnouncementBar from 'components/announcement_bar';\nimport LoadingScreen from 'components/loading_screen';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\nimport LogoutIcon from 'components/widgets/icons/fa_logout_icon';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nimport {browserHistory} from 'utils/browser_history';\nimport messageHtmlToComponent from 'utils/message_html_to_component';\nimport {formatText} from 'utils/text_formatting';\nimport {Constants} from 'utils/constants.jsx';\nimport EmojiMap from 'utils/emoji_map';\n\nexport interface UpdateMyTermsOfServiceStatusResponse {\n terms_of_service_create_at: number;\n terms_of_service_id: string;\n user_id: number;\n}\n\nexport interface TermsOfServiceProps {\n location: {search: string};\n termsEnabled: boolean;\n actions: {\n getTermsOfService: () => Promise<{ data: ReduxTermsOfService }>;\n updateMyTermsOfServiceStatus: (\n termsOfServiceId: string,\n accepted: boolean\n ) => {data: UpdateMyTermsOfServiceStatusResponse};\n };\n emojiMap: EmojiMap;\n}\n\ninterface TermsOfServiceState {\n customTermsOfServiceId: string;\n customTermsOfServiceText: string;\n loading: boolean;\n loadingAgree: boolean;\n loadingDisagree: boolean;\n serverError: React.ReactNode;\n}\n\nexport default class TermsOfService extends React.PureComponent<TermsOfServiceProps, TermsOfServiceState> {\n formattedText: (text: string) => string;\n\n constructor(props: TermsOfServiceProps) {\n super(props);\n\n this.state = {\n customTermsOfServiceId: '',\n customTermsOfServiceText: '',\n loading: true,\n loadingAgree: false,\n loadingDisagree: false,\n serverError: null,\n };\n\n this.formattedText = memoizeResult((text: string) => formatText(text, {}, props.emojiMap));\n }\n\n componentDidMount(): void {\n if (this.props.termsEnabled) {\n this.getTermsOfService();\n } else {\n GlobalActions.redirectUserToDefaultTeam();\n }\n }\n\n getTermsOfService = async (): Promise<void> => {\n this.setState({\n customTermsOfServiceId: '',\n customTermsOfServiceText: '',\n loading: true,\n });\n const {data} = await this.props.actions.getTermsOfService();\n if (data) {\n this.setState({\n customTermsOfServiceId: data.id,\n customTermsOfServiceText: data.text,\n loading: false,\n });\n } else {\n GlobalActions.emitUserLoggedOutEvent(`/login?extra=${Constants.GET_TERMS_ERROR}`);\n }\n };\n\n handleLogoutClick = (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>): void => {\n e.preventDefault();\n GlobalActions.emitUserLoggedOutEvent('/login');\n };\n\n handleAcceptTerms = (): void => {\n this.setState({\n loadingAgree: true,\n serverError: null,\n });\n this.registerUserAction(\n true,\n () => {\n const query = new URLSearchParams(this.props.location.search);\n const redirectTo = query.get('redirect_to');\n if (redirectTo && redirectTo.match(/^\\/([^/]|$)/)) {\n browserHistory.push(redirectTo);\n } else {\n GlobalActions.redirectUserToDefaultTeam();\n }\n },\n );\n };\n\n handleRejectTerms = (): void => {\n this.setState({\n loadingDisagree: true,\n serverError: null,\n });\n this.registerUserAction(\n false,\n () => {\n GlobalActions.emitUserLoggedOutEvent(`/login?extra=${Constants.TERMS_REJECTED}`);\n },\n );\n };\n\n registerUserAction = async (accepted: boolean, success: (data: UpdateMyTermsOfServiceStatusResponse) => void): Promise<void> => {\n const {data} = await this.props.actions.updateMyTermsOfServiceStatus(this.state.customTermsOfServiceId, accepted);\n if (data) {\n success(data);\n } else {\n this.setState({\n loadingAgree: false,\n loadingDisagree: false,\n serverError: (\n <FormattedMessage\n id='terms_of_service.api_error'\n defaultMessage='Unable to complete the request. If this issue persists, contact your System Administrator.'\n />\n ),\n });\n }\n };\n\n render(): JSX.Element {\n if (this.state.loading) {\n return <LoadingScreen/>;\n }\n\n let termsMarkdownClasses = 'terms-of-service__markdown';\n if (this.state.serverError) {\n termsMarkdownClasses += ' terms-of-service-error__height--fill';\n } else {\n termsMarkdownClasses += ' terms-of-service__height--fill';\n }\n return (\n <div>\n <AnnouncementBar/>\n <div className='signup-header'>\n <a\n href='#'\n onClick={this.handleLogoutClick}\n >\n <LogoutIcon/>\n <FormattedMessage\n id='web.header.logout'\n defaultMessage='Logout'\n />\n </a>\n </div>\n <div>\n <div className='signup-team__container terms-of-service__container'>\n <div className={termsMarkdownClasses}>\n <div\n className='medium-center'\n data-testid='termsOfService'\n >\n {messageHtmlToComponent(this.formattedText(this.state.customTermsOfServiceText), false, {mentions: false})}\n </div>\n </div>\n <div className='terms-of-service__footer medium-center'>\n <ButtonGroup className='terms-of-service__button-group'>\n <Button\n bsStyle={'primary'}\n disabled={this.state.loadingAgree || this.state.loadingDisagree}\n id='acceptTerms'\n onClick={this.handleAcceptTerms}\n type='submit'\n >\n {this.state.loadingAgree && <LoadingSpinner/>}\n <FormattedMessage\n id='terms_of_service.agreeButton'\n defaultMessage={'I Agree'}\n />\n </Button>\n <Button\n bsStyle={'link'}\n disabled={this.state.loadingAgree || this.state.loadingDisagree}\n id='rejectTerms'\n onClick={this.handleRejectTerms}\n type='reset'\n >\n {this.state.loadingDisagree && <LoadingSpinner/>}\n <FormattedMessage\n id='terms_of_service.disagreeButton'\n defaultMessage={'I Disagree'}\n />\n </Button>\n </ButtonGroup>\n {Boolean(this.state.serverError) && (\n <div className='terms-of-service__server-error alert alert-warning'>\n <WarningIcon/>\n {' '}\n {this.state.serverError}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators, Dispatch, ActionCreatorsMapObject} from 'redux';\n\nimport {getTermsOfService, updateMyTermsOfServiceStatus} from 'mattermost-redux/actions/users';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {GlobalState} from 'mattermost-redux/types/store';\nimport {ActionFunc, GenericAction} from 'mattermost-redux/types/actions';\nimport {TermsOfService as ReduxTermsOfService} from 'mattermost-redux/types/terms_of_service';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport TermsOfService, {UpdateMyTermsOfServiceStatusResponse} from './terms_of_service';\n\ntype Actions = {\n getTermsOfService: () => Promise<{data: ReduxTermsOfService}>;\n updateMyTermsOfServiceStatus: (\n termsOfServiceId: string,\n accepted: boolean\n ) => {data: UpdateMyTermsOfServiceStatusResponse};\n};\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n return {\n termsEnabled: config.EnableCustomTermsOfService === 'true',\n emojiMap: getEmojiMap(state),\n };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<GenericAction>) {\n return {\n actions: bindActionCreators<ActionCreatorsMapObject<ActionFunc>, Actions>({\n getTermsOfService,\n updateMyTermsOfServiceStatus,\n }, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(TermsOfService);\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 LogoutIcon() {\n const {formatMessage} = useIntl();\n return (\n <i\n className='fa fa-1x fa-angle-left'\n title={formatMessage({id: 'generic_icons.logout', defaultMessage: 'Logout Icon'})}\n />\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport LocalizedIcon from 'components/localized_icon';\n\nimport {t} from 'utils/i18n';\n\ntype Props = {\n additionalClassName: string | null;\n}\n\nexport default class WarningIcon extends React.PureComponent<Props> {\n public static defaultProps: Props = {\n additionalClassName: null,\n };\n\n public render(): JSX.Element {\n const className = 'fa fa-warning' + (this.props.additionalClassName ? ' ' + this.props.additionalClassName : '');\n return (\n <LocalizedIcon\n className={className}\n title={{id: t('generic_icons.warning'), defaultMessage: 'Warning Icon'}}\n />\n );\n }\n}\n"],"sourceRoot":""}