// Copyright 2021 The Casdoor Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import React from "react"; import {Button, Form, Input, Result} from "antd"; import * as Setting from "../Setting"; import * as AuthBackend from "./AuthBackend"; import * as ProviderButton from "./ProviderButton"; import i18next from "i18next"; import * as Util from "./Util"; import {authConfig} from "./Auth"; import * as ApplicationBackend from "../backend/ApplicationBackend"; import {CountDownInput} from "../common/CountDownInput"; import SelectRegionBox from "../SelectRegionBox"; import CustomGithubCorner from "../CustomGithubCorner"; import SelectLanguageBox from "../SelectLanguageBox"; import {withRouter} from "react-router-dom"; const formItemLayout = { labelCol: { xs: { span: 24, }, sm: { span: 8, }, }, wrapperCol: { xs: { span: 24, }, sm: { span: 16, }, }, }; const tailFormItemLayout = { wrapperCol: { xs: { span: 24, offset: 0, }, sm: { span: 16, offset: 8, }, }, }; class SignupPage extends React.Component { constructor(props) { super(props); this.state = { classes: props, applicationName: props.match.params?.applicationName ?? authConfig.appName, application: null, email: "", phone: "", emailCode: "", phoneCode: "", validEmail: false, validPhone: false, region: "", isTermsOfUseVisible: false, termsOfUseContent: "", }; this.form = React.createRef(); } UNSAFE_componentWillMount() { let applicationName = this.state.applicationName; const oAuthParams = Util.getOAuthGetParameters(); if (oAuthParams !== null) { applicationName = oAuthParams.state; this.setState({applicationName: oAuthParams.state}); const signinUrl = window.location.href.replace("/signup/oauth/authorize", "/login/oauth/authorize"); sessionStorage.setItem("signinUrl", signinUrl); } if (this.getApplicationObj() === null) { if (applicationName !== undefined) { this.getApplication(applicationName); } else { Setting.showMessage("error", `Unknown application name: ${applicationName}`); } } } getApplication(applicationName) { if (applicationName === undefined) { return; } ApplicationBackend.getApplication("admin", applicationName) .then((application) => { this.onUpdateApplication(application); this.setState({ application: application, }); if (application !== null && application !== undefined) { Setting.getTermsOfUseContent(application.termsOfUse, res => { this.setState({termsOfUseContent: res}); }); } }); } getResultPath(application) { if (authConfig.appName === application.name) { return "/result"; } else { if (Setting.hasPromptPage(application)) { return `/prompt/${application.name}`; } else { return `/result/${application.name}`; } } } getApplicationObj() { return this.props.application ?? this.state.application; } onUpdateAccount(account) { this.props.onUpdateAccount(account); } onUpdateApplication(application) { this.props.onUpdateApplication(application); } parseOffset(offset) { if (offset === 2 || offset === 4 || Setting.inIframe() || Setting.isMobile()) { return "0 auto"; } if (offset === 1) { return "0 10%"; } if (offset === 3) { return "0 60%"; } } onFinish(values) { const application = this.getApplicationObj(); values.phonePrefix = application.organizationObj.phonePrefix; AuthBackend.signup(values) .then((res) => { if (res.status === "ok") { if (Setting.hasPromptPage(application)) { AuthBackend.getAccount("") .then((res) => { let account = null; if (res.status === "ok") { account = res.data; account.organization = res.data2; this.onUpdateAccount(account); Setting.goToLinkSoft(this, this.getResultPath(application)); } else { Setting.showMessage("error", `Failed to sign in: ${res.msg}`); } }); } else { Setting.goToLinkSoft(this, this.getResultPath(application)); } } else { Setting.showMessage("error", i18next.t(`signup:${res.msg}`)); } }); } onFinishFailed(values, errorFields, outOfDate) { this.form.current.scrollToField(errorFields[0].name); } isProviderVisible(providerItem) { if (this.state.mode === "signup") { return Setting.isProviderVisibleForSignUp(providerItem); } else { return Setting.isProviderVisibleForSignIn(providerItem); } } renderFormItem(application, signupItem) { if (!signupItem.visible) { return null; } const required = signupItem.required; if (signupItem.name === "Username") { return ( ); } else if (signupItem.name === "Display name") { if (signupItem.rule === "First, last" && Setting.getLanguage() !== "zh") { return ( ); } return ( ); } else if (signupItem.name === "Affiliation") { return ( ); } else if (signupItem.name === "ID card") { return ( ); } else if (signupItem.name === "Country/Region") { return ( {this.setState({region: value});}} /> ); } else if (signupItem.name === "Email") { return ( { if (this.state.email !== "" && !Setting.isValidEmail(this.state.email)) { this.setState({validEmail: false}); return Promise.reject(i18next.t("signup:The input is not valid Email!")); } this.setState({validEmail: true}); return Promise.resolve(); }, }, ]} > this.setState({email: e.target.value})} /> { signupItem.rule !== "No verification" && } ); } else if (signupItem.name === "Phone") { return ( { if (this.state.phone !== "" && !Setting.isValidPhone(this.state.phone)) { this.setState({validPhone: false}); return Promise.reject(i18next.t("signup:The input is not valid Phone!")); } this.setState({validPhone: true}); return Promise.resolve(); }, }, ]} > this.setState({phone: e.target.value})} /> ); } else if (signupItem.name === "Password") { return ( ); } else if (signupItem.name === "Confirm password") { return ( ({ validator(rule, value) { if (!value || getFieldValue("password") === value) { return Promise.resolve(); } return Promise.reject(i18next.t("signup:Your confirmed password is inconsistent with the password!")); }, }), ]} > ); } else if (signupItem.name === "Agreement") { return ( Setting.renderAgreement(Setting.isAgreementRequired(application), () => { this.setState({ isTermsOfUseVisible: true, }); }, false, tailFormItemLayout, Setting.isDefaultTrue(application)) ); } } renderModal() { return ( Setting.renderModal(this.state.isTermsOfUseVisible, () => { this.form.current.setFieldsValue({agreement: true}); this.setState({ isTermsOfUseVisible: false, }); }, () => { this.form.current.setFieldsValue({agreement: false}); this.setState({ isTermsOfUseVisible: false, }); }, this.state.termsOfUseContent) ); } renderForm(application) { if (!application.enableSignUp) { return ( Setting.redirectToLoginPage(application, this.props.history)}> { i18next.t("login:Sign In") } , ]} > ); } return (
this.onFinish(values)} onFinishFailed={(errorInfo) => this.onFinishFailed(errorInfo.values, errorInfo.errorFields, errorInfo.outOfDate)} initialValues={{ application: application.name, organization: application.organization, }} size="large" layout={Setting.isMobile() ? "vertical" : "horizontal"} style={{width: Setting.isMobile() ? "300px" : "400px"}} > { application.signupItems?.map(signupItem => this.renderFormItem(application, signupItem)) }   {i18next.t("signup:Have account?")}  { const linkInStorage = sessionStorage.getItem("signinUrl"); if (linkInStorage !== null && linkInStorage !== "") { Setting.goToLink(linkInStorage); } else { Setting.redirectToLoginPage(application, this.props.history); } }}> {i18next.t("signup:sign in now")} { application.providers.filter(providerItem => this.isProviderVisible(providerItem)).map(providerItem => { return ProviderButton.renderProviderLogo(providerItem.provider, application, 30, 5, "small", this.props.location); }) }
); } render() { const application = this.getApplicationObj(); if (application === null) { return null; } if (application.signupHtml !== "") { return (
); } return (
{Setting.inIframe() || Setting.isMobile() ? null :
}
{ Setting.renderHelmet(application) } { Setting.renderLogo(application) } { this.renderForm(application) }
{ this.renderModal() } ); } } export default withRouter(SignupPage);