diff --git a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts index 3e3b558cfb0..a6010194585 100644 --- a/packages/twenty-front/src/modules/auth/hooks/useAuth.ts +++ b/packages/twenty-front/src/modules/auth/hooks/useAuth.ts @@ -42,6 +42,7 @@ import { getFirstAvailableWorkspaces, } from '@/auth/utils/availableWorkspacesUtils'; import { useRequestFreshCaptchaToken } from '@/captcha/hooks/useRequestFreshCaptchaToken'; +import { isCaptchaScriptLoadedState } from '@/captcha/states/isCaptchaScriptLoadedState'; import { apiConfigState } from '@/client-config/states/apiConfigState'; import { captchaState } from '@/client-config/states/captchaState'; import { isEmailVerificationRequiredState } from '@/client-config/states/isEmailVerificationRequiredState'; @@ -65,7 +66,6 @@ import { type AuthToken } from '~/generated/graphql'; import { cookieStorage } from '~/utils/cookie-storage'; import { getWorkspaceUrl } from '~/utils/getWorkspaceUrl'; import { loginTokenState } from '../states/loginTokenState'; -import { isCaptchaScriptLoadedState } from '@/captcha/states/isCaptchaScriptLoadedState'; export const useAuth = () => { const setTokenPair = useSetRecoilState(tokenPairState); diff --git a/packages/twenty-front/src/modules/auth/sign-in-up/components/internal/SignInUpTwoFactorAuthenticationVerification.tsx b/packages/twenty-front/src/modules/auth/sign-in-up/components/internal/SignInUpTwoFactorAuthenticationVerification.tsx index 1823339e472..d3bd2e59fd9 100644 --- a/packages/twenty-front/src/modules/auth/sign-in-up/components/internal/SignInUpTwoFactorAuthenticationVerification.tsx +++ b/packages/twenty-front/src/modules/auth/sign-in-up/components/internal/SignInUpTwoFactorAuthenticationVerification.tsx @@ -12,6 +12,7 @@ import { signInUpStepState, } from '@/auth/states/signInUpStepState'; import { useReadCaptchaToken } from '@/captcha/hooks/useReadCaptchaToken'; +import { useCaptcha } from '@/client-config/hooks/useCaptcha'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { Trans, useLingui } from '@lingui/react/macro'; import { OTPInput, type SlotProps } from 'input-otp'; @@ -184,6 +185,7 @@ export const SignInUpTOTPVerification = () => { const navigate = useNavigateApp(); const { readCaptchaToken } = useReadCaptchaToken(); + const { isCaptchaReady } = useCaptcha(); const loginToken = useRecoilValue(loginTokenState); const setSignInUpStep = useSetRecoilState(signInUpStepState); const { t } = useLingui(); @@ -193,7 +195,15 @@ export const SignInUpTOTPVerification = () => { const submitOTP = async (values: OTPFormValues) => { setIsLoading(true); try { - const captchaToken = await readCaptchaToken(); + if (!isCaptchaReady) { + enqueueErrorSnackBar({ + message: t`Captcha (anti-bot check) is still loading, try again`, + }); + setIsLoading(false); + return; + } + + const captchaToken = readCaptchaToken(); if (!loginToken) { return navigate(AppPath.SignInUp); diff --git a/packages/twenty-front/src/modules/auth/sign-in-up/hooks/useSignInUp.ts b/packages/twenty-front/src/modules/auth/sign-in-up/hooks/useSignInUp.ts index 3fe4ee8fc36..a73a15b23c1 100644 --- a/packages/twenty-front/src/modules/auth/sign-in-up/hooks/useSignInUp.ts +++ b/packages/twenty-front/src/modules/auth/sign-in-up/hooks/useSignInUp.ts @@ -10,16 +10,18 @@ import { } from '@/auth/states/signInUpStepState'; import { SignInUpMode } from '@/auth/types/signInUpMode'; import { useReadCaptchaToken } from '@/captcha/hooks/useReadCaptchaToken'; +import { useCaptcha } from '@/client-config/hooks/useCaptcha'; import { useBuildSearchParamsFromUrlSyncedStates } from '@/domain-manager/hooks/useBuildSearchParamsFromUrlSyncedStates'; import { useIsCurrentLocationOnAWorkspace } from '@/domain-manager/hooks/useIsCurrentLocationOnAWorkspace'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { ApolloError } from '@apollo/client'; +import { useLingui } from '@lingui/react/macro'; import { useRecoilState } from 'recoil'; import { AppPath } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; import { buildAppPathWithQueryParams } from '~/utils/buildAppPathWithQueryParams'; import { isMatchingLocation } from '~/utils/isMatchingLocation'; import { useAuth } from '../../hooks/useAuth'; -import { useLingui } from '@lingui/react/macro'; export const useSignInUp = (form: UseFormReturn