// 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 {Link} from "react-router-dom"; import {Button, Checkbox, Form, Input, Modal, 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"; const formItemLayout = { labelCol: { xs: { span: 24, }, sm: { span: 8, }, }, wrapperCol: { xs: { span: 24, }, sm: { span: 18, }, }, }; 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 !== undefined ? 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 (applicationName !== undefined) { this.getApplication(applicationName); } else { Util.showMessage("error", `Unknown application name: ${applicationName}`); } } getApplication(applicationName) { if (applicationName === undefined) { return; } ApplicationBackend.getApplication("admin", applicationName) .then((application) => { this.setState({ application: application, }); if (application !== null && application !== undefined) { this.getTermsofuseContent(application.termsOfUse); } }); } getResultPath(application) { if (authConfig.appName === application.name) { return "/result"; } else { if (Setting.hasPromptPage(application)) { return `/prompt/${application.name}`; } else { return `/result/${application.name}`; } } } getApplicationObj() { if (this.props.application !== undefined) { return this.props.application; } else { return this.state.application; } } getTermsofuseContent(url) { fetch(url, { method: "GET", }).then(r => { r.text().then(res => { this.setState({termsOfUseContent: res}); }); }); } onUpdateAccount(account) { this.props.onUpdateAccount(account); } 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 ( {i18next.t("signup:Accept")}  { this.setState({ isTermsOfUseVisible: true, }); }}> {i18next.t("signup:Terms of Use")} ); } } renderModal() { return ( { this.form.current.setFieldsValue({agreement: true}); this.setState({ isTermsOfUseVisible: false, }); }} onCancel={() => { this.form.current.setFieldsValue({agreement: false}); this.setState({ isTermsOfUseVisible: false, }); this.props.history.goBack(); }} >