diff --git a/web/src/pages/AuthCallback.tsx b/web/src/pages/AuthCallback.tsx index 61ade8071..e463ce48d 100644 --- a/web/src/pages/AuthCallback.tsx +++ b/web/src/pages/AuthCallback.tsx @@ -3,14 +3,17 @@ import { LoaderIcon } from "lucide-react"; import { ClientError } from "nice-grpc-web"; import { useEffect, useState } from "react"; import { useSearchParams } from "react-router-dom"; +import { Button } from "@usememos/mui"; import { authServiceClient } from "@/grpcweb"; import { absolutifyLink } from "@/helpers/utils"; import useNavigateTo from "@/hooks/useNavigateTo"; +import { workspaceStore } from "@/store/v2"; import { initialUserStore } from "@/store/v2/user"; interface State { loading: boolean; errorMessage: string; + redirectCountdown?: number; } const AuthCallback = () => { @@ -20,6 +23,7 @@ const AuthCallback = () => { loading: true, errorMessage: "", }); + const workspaceGeneralSetting = workspaceStore.state.generalSetting; useEffect(() => { const code = searchParams.get("code"); @@ -60,23 +64,77 @@ const AuthCallback = () => { navigateTo("/"); } catch (error: any) { console.error(error); - setState({ - loading: false, - errorMessage: (error as ClientError).details, - }); + const errorDetails = (error as ClientError).details; + + // If user registration is disallowed and the error indicates that sign up is not allowed + if (workspaceGeneralSetting.disallowUserRegistration && + (errorDetails.includes("registration is not allowed") || + errorDetails.includes("sign up is not allowed"))) { + const redirectSeconds = 2; + setState({ + loading: false, + errorMessage: errorDetails || "Sign up is not allowed.", + redirectCountdown: redirectSeconds, + }); + + // Set up countdown timer + const countdownInterval = setInterval(() => { + setState((prevState) => ({ + ...prevState, + redirectCountdown: prevState.redirectCountdown ? prevState.redirectCountdown - 1 : 0, + })); + }, 1000); + + // Add a timer to redirect to the login page after the countdown + const redirectTimer = setTimeout(() => { + navigateTo("/auth"); + }, redirectSeconds * 1000); + + return () => { + clearTimeout(redirectTimer); + clearInterval(countdownInterval); + }; + } else { + // Other errors + setState({ + loading: false, + errorMessage: errorDetails || "Authentication failed", + }); + } } })(); - }, [searchParams]); + }, [searchParams, workspaceGeneralSetting.disallowUserRegistration]); + + const handleReturnToLogin = () => { + navigateTo("/auth"); + }; return (
{state.loading ? ( ) : ( -
{state.errorMessage}
+
+
{state.errorMessage}
+ {state.redirectCountdown !== undefined && ( +
+
+ + Redirecting to login page in {state.redirectCountdown} {state.redirectCountdown === 1 ? 'second' : 'seconds'}... +
+ +
+ )} +
)}
); }; -export default AuthCallback; +export default AuthCallback; \ No newline at end of file