- remove flash on /verify - remove flash on signInUp - remove useless redirections and hooks - Remove DefaultHomePage component - Move redirections to /objects/companies in PageChangeEffect - add useShowAuthModal hooks and tests - add usePageChangeEffectNaviteLocation hooks and tests - fix refresh token expired produces blank screen
143 lines
3.9 KiB
TypeScript
143 lines
3.9 KiB
TypeScript
import { useCallback, useState } from 'react';
|
|
import { SubmitHandler, UseFormReturn } from 'react-hook-form';
|
|
import { useParams } from 'react-router-dom';
|
|
|
|
import { Form } from '@/auth/sign-in-up/hooks/useSignInUpForm';
|
|
import { useReadCaptchaToken } from '@/captcha/hooks/useReadCaptchaToken';
|
|
import { useRequestFreshCaptchaToken } from '@/captcha/hooks/useRequestFreshCaptchaToken';
|
|
import { AppPath } from '@/types/AppPath';
|
|
import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar';
|
|
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
|
|
import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation';
|
|
|
|
import { useAuth } from '../../hooks/useAuth';
|
|
|
|
export enum SignInUpMode {
|
|
SignIn = 'sign-in',
|
|
SignUp = 'sign-up',
|
|
}
|
|
|
|
export enum SignInUpStep {
|
|
Init = 'init',
|
|
Email = 'email',
|
|
Password = 'password',
|
|
}
|
|
|
|
export const useSignInUp = (form: UseFormReturn<Form>) => {
|
|
const { enqueueSnackBar } = useSnackBar();
|
|
|
|
const isMatchingLocation = useIsMatchingLocation();
|
|
|
|
const workspaceInviteHash = useParams().workspaceInviteHash;
|
|
|
|
const [isInviteMode] = useState(() => isMatchingLocation(AppPath.Invite));
|
|
|
|
const [signInUpStep, setSignInUpStep] = useState<SignInUpStep>(
|
|
SignInUpStep.Init,
|
|
);
|
|
|
|
const [signInUpMode, setSignInUpMode] = useState<SignInUpMode>(() => {
|
|
return isMatchingLocation(AppPath.SignInUp)
|
|
? SignInUpMode.SignIn
|
|
: SignInUpMode.SignUp;
|
|
});
|
|
|
|
const {
|
|
signInWithCredentials,
|
|
signUpWithCredentials,
|
|
checkUserExists: { checkUserExistsQuery },
|
|
} = useAuth();
|
|
|
|
const { requestFreshCaptchaToken } = useRequestFreshCaptchaToken();
|
|
const { readCaptchaToken } = useReadCaptchaToken();
|
|
|
|
const continueWithEmail = useCallback(() => {
|
|
requestFreshCaptchaToken();
|
|
setSignInUpStep(SignInUpStep.Email);
|
|
setSignInUpMode(
|
|
isMatchingLocation(AppPath.SignInUp)
|
|
? SignInUpMode.SignIn
|
|
: SignInUpMode.SignUp,
|
|
);
|
|
}, [isMatchingLocation, requestFreshCaptchaToken]);
|
|
|
|
const continueWithCredentials = useCallback(async () => {
|
|
const token = await readCaptchaToken();
|
|
if (!form.getValues('email')) {
|
|
return;
|
|
}
|
|
checkUserExistsQuery({
|
|
variables: {
|
|
email: form.getValues('email').toLowerCase().trim(),
|
|
captchaToken: token,
|
|
},
|
|
onError: (error) => {
|
|
enqueueSnackBar(`${error.message}`, {
|
|
variant: SnackBarVariant.Error,
|
|
});
|
|
},
|
|
onCompleted: (data) => {
|
|
requestFreshCaptchaToken();
|
|
if (data?.checkUserExists.exists) {
|
|
setSignInUpMode(SignInUpMode.SignIn);
|
|
} else {
|
|
setSignInUpMode(SignInUpMode.SignUp);
|
|
}
|
|
setSignInUpStep(SignInUpStep.Password);
|
|
},
|
|
});
|
|
}, [
|
|
readCaptchaToken,
|
|
form,
|
|
checkUserExistsQuery,
|
|
enqueueSnackBar,
|
|
requestFreshCaptchaToken,
|
|
]);
|
|
|
|
const submitCredentials: SubmitHandler<Form> = useCallback(
|
|
async (data) => {
|
|
const token = await readCaptchaToken();
|
|
try {
|
|
if (!data.email || !data.password) {
|
|
throw new Error('Email and password are required');
|
|
}
|
|
|
|
signInUpMode === SignInUpMode.SignIn && !isInviteMode
|
|
? await signInWithCredentials(
|
|
data.email.toLowerCase().trim(),
|
|
data.password,
|
|
token,
|
|
)
|
|
: await signUpWithCredentials(
|
|
data.email.toLowerCase().trim(),
|
|
data.password,
|
|
workspaceInviteHash,
|
|
token,
|
|
);
|
|
} catch (err: any) {
|
|
enqueueSnackBar(err?.message, {
|
|
variant: SnackBarVariant.Error,
|
|
});
|
|
}
|
|
},
|
|
[
|
|
readCaptchaToken,
|
|
signInUpMode,
|
|
isInviteMode,
|
|
signInWithCredentials,
|
|
signUpWithCredentials,
|
|
workspaceInviteHash,
|
|
enqueueSnackBar,
|
|
],
|
|
);
|
|
|
|
return {
|
|
isInviteMode,
|
|
signInUpStep,
|
|
signInUpMode,
|
|
continueWithCredentials,
|
|
continueWithEmail,
|
|
submitCredentials,
|
|
};
|
|
};
|