Login:Components:CreateUserForm: refactoring

This commit is contained in:
Darya Umrikhina 2024-07-23 01:51:58 +04:00
parent 937ede570f
commit 0726dc379d

View File

@ -26,10 +26,18 @@
"use client";
import SsoReactSvgUrl from "PUBLIC_DIR/images/sso.react.svg?url";
import {
ChangeEvent,
KeyboardEvent,
MouseEvent,
useCallback,
useContext,
useEffect,
useRef,
useState,
} from "react";
import { useTranslation } from "react-i18next";
import { ConfirmRouteContext } from "@/app/(root)/confirm/confirmRoute";
import withLoader from "@/app/(root)/confirm/withLoader";
import { TPasswordHash } from "@docspace/shared/api/settings/types";
import { toastr } from "@docspace/shared/components/toast";
import {
@ -44,47 +52,30 @@ import {
getOAuthToken,
} from "@docspace/shared/utils/common";
import { setCookie } from "@docspace/shared/utils/cookie";
import {
ChangeEvent,
KeyboardEvent,
MouseEvent,
useCallback,
useContext,
useEffect,
useRef,
useState,
} from "react";
import { useTranslation } from "react-i18next";
import { DeviceType } from "@docspace/shared/enums";
import useDeviceType from "@/hooks/useDeviceType";
import { RegisterContainer } from "./CreateUserForm.styled";
import { FieldContainer } from "@docspace/shared/components/field-container";
import { EmailInput, TValidate } from "@docspace/shared/components/email-input";
import { Button, ButtonSize } from "@docspace/shared/components/button";
import {
InputSize,
InputType,
TextInput,
} from "@docspace/shared/components/text-input";
import { PasswordInput } from "@docspace/shared/components/password-input";
import { getPasswordErrorMessage } from "@docspace/shared/utils/getPasswordErrorMessage";
import { TError, WithLoaderProps } from "@/types";
import { TUser } from "@docspace/shared/api/people/types";
import { TValidate } from "@docspace/shared/components/email-input";
import { TCreateUserData, TError, WithLoaderProps } from "@/types";
import { SocialButtonsGroup } from "@docspace/shared/components/social-buttons-group";
import { Text } from "@docspace/shared/components/text";
import { login } from "@docspace/shared/api/user";
import {
createUser,
getUserByEmail,
getUserFromConfirm,
signupOAuth,
} from "@/utils/actions";
import SsoReactSvgUrl from "PUBLIC_DIR/images/sso.react.svg?url";
import { ConfirmRouteContext } from "@/app/(root)/confirm/confirmRoute";
import withLoader from "@/app/(root)/confirm/withLoader";
import useDeviceType from "@/hooks/useDeviceType";
import { createUser, getUserByEmail, signupOAuth } from "@/utils/actions";
import EmailInputForm from "./sub-components/EmailInputForm";
import RegistrationForm from "./sub-components/RegistrationForm";
export type CreateUserFormProps = {
userNameRegex: string;
passwordHash: TPasswordHash;
defaultPage?: string;
firstName?: string;
lastName?: string;
} & WithLoaderProps;
const CreateUserForm = (props: CreateUserFormProps) => {
@ -95,9 +86,11 @@ const CreateUserForm = (props: CreateUserFormProps) => {
passwordSettings,
capabilities,
thirdPartyProviders,
firstName,
lastName,
} = props;
const { linkData, roomData } = useContext(ConfirmRouteContext);
const { t, i18n } = useTranslation(["Confirm", "Common", "Wizard"]);
const { t, i18n } = useTranslation(["Confirm", "Common"]);
const { currentDeviceType } = useDeviceType();
const currentCultureName = i18n.language;
@ -121,11 +114,8 @@ const CreateUserForm = (props: CreateUserFormProps) => {
const [snameValid, setSnameValid] = useState(true);
const [isLoading, setIsLoading] = useState(false);
const [errorText, setErrorText] = useState("");
const [user, setUser] = useState<TUser>();
const [isEmailErrorShow, setIsEmailErrorShow] = useState(false);
const [isPasswordErrorShow, setIsPasswordErrorShow] = useState(false);
@ -149,7 +139,6 @@ const CreateUserForm = (props: CreateUserFormProps) => {
culture: currentCultureName,
};
// remove from component?
return signupOAuth(signupAccount)
.then(() => {
const url = roomData.roomId
@ -172,21 +161,9 @@ const CreateUserForm = (props: CreateUserFormProps) => {
);
useEffect(() => {
const fetchData = async () => {
if (linkData.type === "LinkInvite") {
const uid = linkData?.uid ?? "";
const confirmKey = linkData?.confirmHeader || null;
// remove from component?
const user = await getUserFromConfirm(uid, confirmKey);
setUser(user);
}
window.authCallback = authCallback;
focusInput();
};
fetchData();
}, [authCallback, linkData?.confirmHeader, linkData.type, linkData?.uid]);
}, [authCallback]);
const onContinue = async () => {
setIsLoading(true);
@ -208,10 +185,10 @@ const CreateUserForm = (props: CreateUserFormProps) => {
const headerKey = linkData?.confirmHeader ?? null;
try {
const toBinaryStr = (str: string) => {
const encoder = new TextEncoder();
const charCodes = encoder.encode(str);
// @ts-ignore
return String.fromCharCode(...charCodes);
};
@ -221,8 +198,8 @@ const CreateUserForm = (props: CreateUserFormProps) => {
type: "invitation",
email,
roomName,
firstName: user?.firstName,
lastName: user?.lastName,
firstName,
lastName,
}),
),
);
@ -249,25 +226,12 @@ const CreateUserForm = (props: CreateUserFormProps) => {
"/login",
`?loginData=${loginData}`,
);
} catch (error) {
/* const knownError = error as TError;
console.log("knownError", error.status);
const status =
typeof knownError === "object" ? knownError.response?.status : "";
const isNotExistUser = status === 404;
if (isNotExistUser) {
setRegistrationForm(true);
} */
}
setIsLoading(false);
};
const onSubmit = () => {
const type = parseInt(linkData?.emplType ?? "");
console.log("here");
setIsLoading(true);
setErrorText("");
@ -305,29 +269,37 @@ const CreateUserForm = (props: CreateUserFormProps) => {
const hash = createPasswordHash(password, passwordHash);
const loginData = {
const fromInviteLink =
linkData.type === "LinkInvite" || linkData.type === "EmpInvite"
? true
: false;
const confirmUser: TCreateUserData = {
fromInviteLink,
userName: email,
passwordHash: hash,
};
const personalData: { [key: string]: string | number } = {
firstname: fname.trim(),
lastname: sname.trim(),
firstName: fname.trim(),
lastName: sname.trim(),
email: email,
cultureName: currentCultureName,
};
confirmUser.fromInviteLink =
linkData.type === "LinkInvite" || linkData.type === "EmpInvite"
? true
: false;
if (!!type) {
personalData.type = type;
confirmUser.type = type;
}
if (!!linkData.key) {
personalData.key = linkData.key;
confirmUser.key = linkData.key;
}
const headerKey = linkData?.confirmHeader ?? "";
createConfirmUser(personalData, loginData, headerKey).catch((error) => {
createConfirmUser(confirmUser, headerKey).catch((error) => {
const knownError = error as TError;
let errorMessage: string;
@ -350,21 +322,12 @@ const CreateUserForm = (props: CreateUserFormProps) => {
};
const createConfirmUser = async (
registerData: { [key: string]: string | number },
loginData: { userName: string; passwordHash: string },
confirmUserData: TCreateUserData,
key: string,
) => {
const fromInviteLink =
linkData.type === "LinkInvite" || linkData.type === "EmpInvite"
? true
: false;
const data = Object.assign({ fromInviteLink }, registerData, loginData);
await createUser(data, key);
const { userName, passwordHash } = loginData;
await createUser(confirmUserData, key);
const { userName, passwordHash } = confirmUserData;
const res = await login(userName, passwordHash);
const finalUrl = roomData.roomId
@ -372,10 +335,8 @@ const CreateUserForm = (props: CreateUserFormProps) => {
: defaultPage;
const isConfirm = typeof res === "string" && res.includes("confirm");
if (isConfirm) {
sessionStorage.setItem("referenceUrl", finalUrl);
return window.location.replace(typeof res === "string" ? res : "/");
}
@ -386,6 +347,7 @@ const CreateUserForm = (props: CreateUserFormProps) => {
setEmail(e.target.value);
setIsEmailErrorShow(false);
};
const onChangeFname = (e: ChangeEvent<HTMLInputElement>) => {
setFname(e.target.value);
setFnameValid(nameRegex.test(e.target.value.trim()));
@ -409,6 +371,7 @@ const CreateUserForm = (props: CreateUserFormProps) => {
registrationForm ? onSubmit() : onContinue();
}
};
const onValidatePassword = (progressScore: boolean) => {
setPasswordValid(progressScore);
};
@ -488,6 +451,10 @@ const CreateUserForm = (props: CreateUserFormProps) => {
setEmailErrorText(result.errors?.[0]);
};
const onClickBack = () => {
setRegistrationForm(false);
};
const ssoProps = ssoExists()
? {
ssoUrl: capabilities?.ssoUrl,
@ -499,168 +466,43 @@ const CreateUserForm = (props: CreateUserFormProps) => {
return (
<RegisterContainer registrationForm={registrationForm}>
<div className="auth-form-fields">
<div className="email-container">
<FieldContainer
className="form-field"
isVertical={true}
labelVisible={false}
hasError={isEmailErrorShow && !emailValid}
errorMessage={
emailErrorText
? t(`Common:${emailErrorText}`)
: t("Common:RequiredField")
}
>
<EmailInput
id="login"
name="login"
type={InputType.email}
size={InputSize.large}
hasError={isEmailErrorShow && !emailValid}
value={email}
placeholder={t("Common:Email")}
scale={true}
isAutoFocussed={true}
tabIndex={1}
isDisabled={isLoading || !!emailFromLink}
autoComplete="username"
onChange={onChangeEmail}
onBlur={onBlurEmail}
onValidateInput={onValidateEmail}
forwardedRef={inputRef}
onKeyDown={onKeyPress}
/>
</FieldContainer>
<Button
className="login-button"
primary
size={ButtonSize.medium}
scale={true}
label={t("Common:ContinueButton")}
tabIndex={1}
isDisabled={isLoading}
<EmailInputForm
ref={inputRef}
isLoading={isLoading}
onClick={onContinue}
/>
</div>
{registrationForm && (
<div>
{/* <RegistrationFormGreeting
email={email}
setRegistrationForm={setRegistrationForm}
type={linkData.type ?? ""}
isEmailErrorShow={isEmailErrorShow}
emailValid={emailValid}
emailFromLink={emailFromLink}
/> */}
<FieldContainer
className="form-field"
isVertical={true}
labelVisible={false}
hasError={!fnameValid}
errorMessage={
errorText
? errorText
: fname.trim().length === 0
? t("Common:RequiredField")
: t("Common:IncorrectFirstName")
}
>
<TextInput
id="first-name"
name="first-name"
type={InputType.text}
size={InputSize.large}
hasError={!fnameValid}
value={fname}
placeholder={t("Common:FirstName")}
scale={true}
tabIndex={1}
isDisabled={isLoading}
onChange={onChangeFname}
onKeyDown={onKeyPress}
isAutoFocussed
emailErrorText={emailErrorText}
onContinue={onContinue}
onChange={onChangeEmail}
onValidate={onValidateEmail}
onBlur={onBlurEmail}
onKeyPress={onKeyPress}
/>
</FieldContainer>
<FieldContainer
className="form-field"
isVertical={true}
labelVisible={false}
hasError={!snameValid}
errorMessage={
errorText
? errorText
: sname.trim().length === 0
? t("Common:RequiredField")
: t("Common:IncorrectLastName")
}
>
<TextInput
id="last-name"
name="last-name"
type={InputType.text}
size={InputSize.large}
hasError={!snameValid}
value={sname}
placeholder={t("Common:LastName")}
scale={true}
tabIndex={1}
isDisabled={isLoading}
onChange={onChangeSname}
onKeyDown={onKeyPress}
/>
</FieldContainer>
<FieldContainer
className="form-field password-field"
isVertical={true}
labelVisible={false}
hasError={isPasswordErrorShow && !passwordValid}
errorMessage={`${t(
"Common:PasswordLimitMessage",
)}: ${getPasswordErrorMessage(t, passwordSettings)}`}
>
<PasswordInput
simpleView={false}
passwordSettings={passwordSettings}
id="password"
inputName="password"
placeholder={t("Common:Password")}
inputType={InputType.password}
size={InputSize.large}
hasError={isPasswordErrorShow && !passwordValid}
inputValue={password}
scale={true}
tabIndex={1}
isDisabled={isLoading}
autoComplete="current-password"
onChange={onChangePassword}
onBlur={onBlurPassword}
onKeyDown={onKeyPress}
onValidateInput={onValidatePassword}
tooltipPasswordTitle={`${t("Common:PasswordLimitMessage")}:`}
tooltipPasswordLength={`${t(
"Common:PasswordMinimumLength",
)}: ${passwordSettings ? passwordSettings.minLength : 8}`}
tooltipPasswordDigits={`${t("Common:PasswordLimitDigits")}`}
tooltipPasswordCapital={`${t("Common:PasswordLimitUpperCase")}`}
tooltipPasswordSpecial={`${t(
"Common:PasswordLimitSpecialSymbols",
)}`}
generatePasswordTitle={t("Wizard:GeneratePassword")}
/>
</FieldContainer>
<Button
className="login-button"
primary
size={ButtonSize.medium}
scale={true}
label={isLoading ? t("Common:LoadingProcessing") : t("SignUp")}
tabIndex={1}
isDisabled={isLoading}
{registrationForm && (
<RegistrationForm
isLoading={isLoading}
onClick={onSubmit}
email={email}
emailFromLink={emailFromLink}
errorText={errorText}
fnameValid={fnameValid}
fname={fname}
sname={sname}
snameValid={snameValid}
isPasswordErrorShow={isPasswordErrorShow}
passwordValid={passwordValid}
passwordSettings={passwordSettings}
password={password}
onChangeFname={onChangeFname}
onChangeSname={onChangeSname}
onChangePassword={onChangePassword}
onBlurPassword={onBlurPassword}
onKeyPress={onKeyPress}
onValidatePassword={onValidatePassword}
onClickBack={onClickBack}
onSubmit={onSubmit}
/>
</div>
)}
</div>