Files
astuto/app/javascript/components/TenantSignUp/TenantSignUpP.tsx

148 lines
3.6 KiB
TypeScript
Raw Normal View History

2022-07-18 10:47:54 +02:00
import * as React from 'react';
2022-07-22 16:50:36 +02:00
import { useState } from 'react';
import HttpStatus from '../../constants/http_status';
2022-07-18 10:47:54 +02:00
import ConfirmSignUpPage from './ConfirmSignUpPage';
import TenantSignUpForm from './TenantSignUpForm';
import UserSignUpForm from './UserSignUpForm';
2024-01-22 14:45:48 +01:00
import { IOAuth } from '../../interfaces/IOAuth';
2022-07-18 10:47:54 +02:00
interface Props {
2024-01-22 14:45:48 +01:00
oAuthLoginCompleted: boolean;
oauthUserEmail?: string;
oauthUserName?: string;
oAuths: Array<IOAuth>;
2022-07-18 10:47:54 +02:00
isSubmitting: boolean;
error: string;
handleSubmit(
userFullName: string,
userEmail: string,
userPassword: string,
siteName: string,
subdomain: string,
2024-01-22 14:45:48 +01:00
isOAuthLogin: boolean,
2022-07-18 10:47:54 +02:00
authenticityToken: string,
2022-07-22 16:50:36 +02:00
): Promise<any>;
2022-07-18 10:47:54 +02:00
2024-03-02 18:36:22 +01:00
astutoLogoImage: string;
pendingTenantImage: string;
2024-01-22 14:45:48 +01:00
baseUrl: string;
2024-05-03 18:11:07 +02:00
trialPeriodDays: number;
2022-07-22 16:50:36 +02:00
authenticityToken: string;
}
2022-07-18 10:47:54 +02:00
2022-07-22 16:50:36 +02:00
export interface ITenantSignUpUserForm {
fullName: string;
email: string;
password: string;
passwordConfirmation: string;
}
2022-07-18 10:47:54 +02:00
2022-07-22 16:50:36 +02:00
export interface ITenantSignUpTenantForm {
siteName: string;
subdomain: string;
}
2022-07-18 10:47:54 +02:00
export type AuthMethod = 'none' | 'email' | 'oauth';
2022-07-22 16:50:36 +02:00
const TenantSignUpP = ({
2024-01-22 14:45:48 +01:00
oAuths,
oAuthLoginCompleted,
oauthUserEmail,
oauthUserName,
2022-07-22 16:50:36 +02:00
isSubmitting,
error,
handleSubmit,
2024-03-02 18:36:22 +01:00
astutoLogoImage,
pendingTenantImage,
2024-01-22 14:45:48 +01:00
baseUrl,
2024-05-03 18:11:07 +02:00
trialPeriodDays,
2022-07-22 16:50:36 +02:00
authenticityToken
}: Props) => {
// authMethod is either 'none', 'email' or 'oauth'
const [authMethod, setAuthMethod] = useState<AuthMethod>(oAuthLoginCompleted ? 'oauth' : 'none');
2022-07-22 16:50:36 +02:00
const [userData, setUserData] = useState({
fullName: oAuthLoginCompleted ? oauthUserName : '',
email: oAuthLoginCompleted ? oauthUserEmail : '',
2022-07-22 16:50:36 +02:00
password: '',
passwordConfirmation: '',
});
const [tenantData, setTenantData] = useState({
siteName: '',
subdomain: '',
});
2024-01-22 14:45:48 +01:00
const [currentStep, setCurrentStep] = useState(oAuthLoginCompleted ? 2 : 1);
2022-07-22 16:50:36 +02:00
const handleSignUpSubmit = (siteName: string, subdomain: string) => {
2022-07-18 10:47:54 +02:00
handleSubmit(
userData.fullName,
userData.email,
2022-07-22 16:50:36 +02:00
userData.password,
siteName,
subdomain,
authMethod == 'oauth',
2022-07-22 16:50:36 +02:00
authenticityToken,
).then(res => {
if (res?.status !== HttpStatus.Created) return;
if (authMethod == 'oauth') {
2024-01-22 14:45:48 +01:00
let redirectUrl = new URL(baseUrl);
redirectUrl.hostname = `${subdomain}.${redirectUrl.hostname}`;
window.location.href = redirectUrl.toString();
2024-01-22 14:45:48 +01:00
return;
}
2022-07-22 16:50:36 +02:00
setTenantData({ siteName, subdomain });
setCurrentStep(currentStep + 1);
});
2022-07-18 10:47:54 +02:00
}
2022-07-22 16:50:36 +02:00
return (
2024-03-02 18:36:22 +01:00
<>
<img src={astutoLogoImage} width={64} height={64} className="astutoLogo" />
2022-07-22 16:50:36 +02:00
<div className="tenantSignUpContainer">
{
(currentStep === 1 || currentStep === 2) &&
<UserSignUpForm
currentStep={currentStep}
setCurrentStep={setCurrentStep}
authMethod={authMethod}
setAuthMethod={setAuthMethod}
2024-01-22 14:45:48 +01:00
oAuths={oAuths}
2022-07-22 16:50:36 +02:00
userData={userData}
setUserData={setUserData}
/>
}
{
(currentStep === 1 || currentStep === 2) &&
2022-07-22 16:50:36 +02:00
<TenantSignUpForm
isSubmitting={isSubmitting}
error={error}
handleSignUpSubmit={handleSignUpSubmit}
2024-05-03 18:11:07 +02:00
trialPeriodDays={trialPeriodDays}
currentStep={currentStep}
2022-07-22 16:50:36 +02:00
/>
}
{
currentStep === 3 &&
<ConfirmSignUpPage
subdomain={tenantData.subdomain}
userEmail={userData.email}
2024-03-02 18:36:22 +01:00
pendingTenantImage={pendingTenantImage}
2022-07-22 16:50:36 +02:00
/>
}
</div>
2024-03-02 18:36:22 +01:00
</>
2022-07-22 16:50:36 +02:00
);
2022-07-18 10:47:54 +02:00
}
export default TenantSignUpP;