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":""}