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

164 lines
5.1 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 { SubmitHandler, useForm } from 'react-hook-form';
2022-07-18 10:47:54 +02:00
import I18n from 'i18n-js';
import Box from '../common/Box';
import Button from '../common/Button';
2024-01-22 14:45:48 +01:00
import OAuthProviderLink from '../common/OAuthProviderLink';
2022-07-22 16:50:36 +02:00
import { ITenantSignUpUserForm } from './TenantSignUpP';
import { DangerText } from '../common/CustomTexts';
import { getLabel, getValidationMessage } from '../../helpers/formUtils';
import { EMAIL_REGEX } from '../../constants/regex';
2024-01-22 14:45:48 +01:00
import { IOAuth } from '../../interfaces/IOAuth';
import ActionLink from '../common/ActionLink';
2024-03-02 18:36:22 +01:00
import { BackIcon, EditIcon } from '../common/Icons';
2022-07-18 10:47:54 +02:00
interface Props {
currentStep: number;
2022-07-22 16:50:36 +02:00
setCurrentStep(step: number): void;
2022-07-18 10:47:54 +02:00
emailAuth: boolean;
2022-07-22 16:50:36 +02:00
setEmailAuth(enabled: boolean): void;
2024-01-22 14:45:48 +01:00
oAuths: Array<IOAuth>;
oAuthLoginCompleted: boolean;
oauthUserEmail?: string;
oauthUserName?: string;
2022-07-22 16:50:36 +02:00
userData: ITenantSignUpUserForm;
setUserData({}: ITenantSignUpUserForm): void;
2022-07-18 10:47:54 +02:00
}
2022-07-22 16:50:36 +02:00
const UserSignUpForm = ({
currentStep,
setCurrentStep,
emailAuth,
setEmailAuth,
2024-01-22 14:45:48 +01:00
oAuths,
oAuthLoginCompleted,
oauthUserEmail,
oauthUserName,
2022-07-22 16:50:36 +02:00
userData,
setUserData,
}: Props) => {
const {
register,
handleSubmit,
setError,
getValues,
formState: { errors }
} = useForm<ITenantSignUpUserForm>();
2022-07-22 16:50:36 +02:00
const onSubmit: SubmitHandler<ITenantSignUpUserForm> = data => {
if (data.password !== data.passwordConfirmation) {
2024-03-02 18:36:22 +01:00
setError('passwordConfirmation', I18n.t('common.validations.password_mismatch'));
2022-07-22 16:50:36 +02:00
return;
}
setUserData({...data});
setCurrentStep(currentStep + 1);
2022-07-18 10:47:54 +02:00
}
2022-07-22 16:50:36 +02:00
return (
<Box customClass="tenantSignUpStep1">
2024-03-02 18:36:22 +01:00
<h3>Create user account</h3>
2022-07-22 16:50:36 +02:00
{
currentStep === 1 && !emailAuth &&
2024-01-22 14:45:48 +01:00
<>
2022-07-22 16:50:36 +02:00
<Button className="emailAuth" onClick={() => setEmailAuth(true)}>
2024-03-02 18:36:22 +01:00
Sign up with email
2022-07-22 16:50:36 +02:00
</Button>
2024-01-22 14:45:48 +01:00
{
oAuths.filter(oAuth => oAuth.isEnabled).map((oAuth, i) =>
<OAuthProviderLink
oAuthId={oAuth.id}
oAuthName={oAuth.name}
oAuthLogo={oAuth.logo}
oAuthReason='tenantsignup'
isSignUp
key={i}
/>
)
}
</>
2022-07-22 16:50:36 +02:00
}
{
currentStep === 1 && emailAuth &&
<form onSubmit={handleSubmit(onSubmit)}>
2024-01-22 14:45:48 +01:00
<ActionLink
onClick={() => setEmailAuth(false)}
icon={<BackIcon />}
customClass="backButton"
>
{I18n.t('common.buttons.back')}
</ActionLink>
2022-07-22 16:50:36 +02:00
<div className="formRow">
<input
{...register('fullName', { required: true, minLength: 2 })}
autoFocus
placeholder={getLabel('user', 'full_name')}
2022-07-22 16:50:36 +02:00
id="userFullName"
className="formControl"
/>
<DangerText>{errors.fullName && getValidationMessage('required', 'user', 'full_name')}</DangerText>
2022-07-22 16:50:36 +02:00
</div>
<div className="formRow">
<input
{...register('email', { required: true, pattern: EMAIL_REGEX })}
2022-07-22 16:50:36 +02:00
type="email"
placeholder={getLabel('user', 'email')}
2022-07-22 16:50:36 +02:00
id="userEmail"
className="formControl"
/>
<DangerText>{errors.email?.type === 'required' && getValidationMessage('required', 'user', 'email')}</DangerText>
<DangerText>
{errors.email?.type === 'pattern' && I18n.t('common.validations.email')}
</DangerText>
2022-07-22 16:50:36 +02:00
</div>
<div className="formRow">
2024-03-02 18:36:22 +01:00
<div className="userPasswordDiv">
2022-07-18 10:47:54 +02:00
<input
2022-07-22 16:50:36 +02:00
{...register('password', { required: true, minLength: 6, maxLength: 128 })}
type="password"
placeholder={getLabel('user', 'password')}
2022-07-22 16:50:36 +02:00
id="userPassword"
2022-07-18 10:47:54 +02:00
className="formControl"
/>
<DangerText>{ errors.password && I18n.t('common.validations.password', { n: 6 }) }</DangerText>
2022-07-18 10:47:54 +02:00
</div>
2024-03-02 18:36:22 +01:00
<div className="userPasswordConfirmationDiv">
2022-07-18 10:47:54 +02:00
<input
2022-07-22 16:50:36 +02:00
{...register('passwordConfirmation')}
type="password"
placeholder={getLabel('user', 'password_confirmation')}
2022-07-22 16:50:36 +02:00
id="userPasswordConfirmation"
2022-07-18 10:47:54 +02:00
className="formControl"
/>
<DangerText>{ errors.passwordConfirmation && I18n.t('common.validations.password_mismatch') }</DangerText>
2022-07-18 10:47:54 +02:00
</div>
2022-07-22 16:50:36 +02:00
</div>
2022-07-18 10:47:54 +02:00
2022-07-22 16:50:36 +02:00
<Button
onClick={() => null}
className="userConfirm"
>
{ I18n.t('common.buttons.confirm') }
</Button>
</form>
}
{
2024-01-22 14:45:48 +01:00
currentStep === 2 && !oAuthLoginCompleted &&
2024-03-02 18:36:22 +01:00
<p className="userRecap">
<b>{oAuthLoginCompleted ? oauthUserName : userData.fullName}</b> ({oAuthLoginCompleted ? oauthUserEmail : userData.email})
<ActionLink onClick={() => setCurrentStep(currentStep-1)} icon={<EditIcon />} customClass="editUser">Edit</ActionLink>
</p>
2024-01-22 14:45:48 +01:00
}
2022-07-22 16:50:36 +02:00
</Box>
);
2022-07-18 10:47:54 +02:00
}
export default UserSignUpForm;