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

172 lines
4.4 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';
2022-07-18 10:47:54 +02:00
import TenantSignUpForm from './TenantSignUpForm';
import UserSignUpForm from './UserSignUpForm';
import ConfirmEmailSignUpPage from './ConfirmEmailSignUpPage';
import ConfirmOAuthSignUpPage from './ConfirmOAuthSignUpPage';
2024-01-22 14:45:48 +01:00
import { IOAuth } from '../../interfaces/IOAuth';
import HttpStatus from '../../constants/http_status';
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;
feedbackSpaceCreatedImage: string;
2024-03-02 18:36:22 +01:00
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,
feedbackSpaceCreatedImage,
2024-03-02 18:36:22 +01:00
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');
// goneBack is set to true if the user goes back from the tenant form to the user form
const [goneBack, setGoneBack] = useState(false);
2022-07-22 16:50:36 +02:00
const [userData, setUserData] = useState({
fullName: (oAuthLoginCompleted && oauthUserName) ? oauthUserName.slice(0, 64) : '',
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;
setTenantData({ siteName, subdomain });
setCurrentStep(currentStep + 1);
if (authMethod == 'oauth') {
2024-01-22 14:45:48 +01:00
let redirectUrl = new URL(baseUrl);
redirectUrl.hostname = `${subdomain}.${redirectUrl.hostname}`;
redirectUrl.pathname = '/users/sign_in';
// redirect after 3 seconds
setTimeout(() => {
window.location.href = redirectUrl.toString();
}, 3000);
2024-01-22 14:45:48 +01:00
return;
}
2022-07-22 16:50:36 +02:00
});
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}
setGoneBack={setGoneBack}
2022-07-22 16:50:36 +02:00
/>
}
{
(goneBack || 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}
setCurrentStep={setCurrentStep}
/>
}
{
currentStep === 3 && authMethod === 'oauth' &&
<ConfirmOAuthSignUpPage
baseUrl={baseUrl}
subdomain={tenantData.subdomain}
feedbackSpaceCreatedImage={feedbackSpaceCreatedImage}
2022-07-22 16:50:36 +02:00
/>
}
{
currentStep === 3 && authMethod === 'email' &&
<ConfirmEmailSignUpPage
2022-07-22 16:50:36 +02:00
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;