// Copyright 2021 The casbin 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 {Form, Input, Checkbox, Button, Row, Col, Result} from 'antd'; import * as Setting from "../Setting"; import * as AuthBackend from "./AuthBackend"; import i18next from "i18next"; import * as Util from "./Util"; import {authConfig} from "./Auth"; import * as ApplicationBackend from "../backend/ApplicationBackend"; import * as UserBackend from "../backend/UserBackend"; import {CountDownInput} from "../component/CountDownInput"; const formItemLayout = { labelCol: { xs: { span: 24, }, sm: { span: 6, }, }, 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: "" }; this.form = React.createRef(); } UNSAFE_componentWillMount() { if (this.state.applicationName !== undefined) { this.getApplication(); } else { Util.showMessage("error", `Unknown application name: ${this.state.applicationName}`); } } getApplication() { if (this.state.applicationName === undefined) { return; } ApplicationBackend.getApplication("admin", this.state.applicationName) .then((application) => { this.setState({ application: application, }); }); } 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; } } onUpdateAccount(account) { this.props.onUpdateAccount(account); } onFinish(values) { const application = this.getApplicationObj(); values.phonePrefix = application.organizationObj.phonePrefix; AuthBackend.signup(values) .then((res) => { if (res.status === 'ok') { 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 { if (res.msg !== "Please sign in first") { Setting.showMessage("error", `Failed to sign in: ${res.msg}`); } } }); } else { Setting.showMessage("error", i18next.t(`signup:${res.msg}`)); } }); } onFinishFailed(values, errorFields, outOfDate) { this.form.current.scrollToField(errorFields[0].name); } renderFormItem(application, signupItem) { if (!signupItem.visible) { return null; } const required = signupItem.required; if (signupItem.name === "Username") { return ( ) } else if (signupItem.name === "Display name") { return ( ) } else if (signupItem.name === "Affiliation") { return ( ) } else if (signupItem.name === "Email") { return ( this.setState({email: 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 === "Phone") { return ( this.setState({phone: e.target.value})} /> ) } else if (signupItem.name === "Agreement") { return ( {i18next.t("signup:Accept")}  {i18next.t("signup:Terms of Use")} ) } } renderForm(application) { if (!application.enableSignUp) { return ( { Setting.goToLogin(this, application); }}> ]} > ) } return (
this.onFinish(values)} onFinishFailed={(errorInfo) => this.onFinishFailed(errorInfo.values, errorInfo.errorFields, errorInfo.outOfDate)} initialValues={{ application: application.name, organization: application.organization, }} style={{width: !Setting.isMobile() ? "400px" : "250px"}} size="large" > { application.signupItems.map(signupItem => this.renderFormItem(application, signupItem)) }   {i18next.t("signup:Have account?")}  { Setting.goToLogin(this, application); }}> {i18next.t("signup:sign in now")}
) } render() { const application = this.getApplicationObj(); if (application === null) { return null; } return (
 
{ Setting.renderHelmet(application) } { Setting.renderLogo(application) } { this.renderForm(application) }
) } } export default SignupPage;