diff --git a/src/locales/en.ts b/src/locales/en.ts index 0af95fd..83331ec 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -123,8 +123,12 @@ export const en = { mobileClaimDescription: (mobile: string) => `A mobile-only account with ${mobile} already exists. Verify the code sent to that number to attach Google and keep that account.`, errorTitle: "Google sign in could not be completed", + cancelled: "Google sign in was cancelled before it could be completed.", missingFlow: "The Google sign-in flow is missing or has expired.", loadFailed: "We could not load your Google sign-in state.", + callbackFailed: "We could not complete Google sign in. Please try again.", + tokenExchangeFailed: "Google sign in is temporarily unavailable. Please try again in a few minutes.", + profileLookupFailed: "We could not load your Google profile. Please try again.", completeFailed: "We could not finish your Google account setup.", claimOtpSent: "Verification code sent successfully.", googleAccount: "Google account", diff --git a/src/locales/fa.ts b/src/locales/fa.ts index 224cd99..17dbee7 100644 --- a/src/locales/fa.ts +++ b/src/locales/fa.ts @@ -123,8 +123,12 @@ export const fa = { mobileClaimDescription: (mobile: string) => `حسابی بدون ایمیل با شماره ${mobile} از قبل وجود دارد. کد ارسال‌شده به این شماره را وارد کنید تا گوگل به همان حساب متصل شود.`, errorTitle: "ورود با گوگل کامل نشد", + cancelled: "فرآیند ورود با گوگل قبل از تکمیل لغو شد.", missingFlow: "جریان ورود با گوگل پیدا نشد یا منقضی شده است.", loadFailed: "بارگذاری وضعیت ورود با گوگل انجام نشد.", + callbackFailed: "تکمیل ورود با گوگل انجام نشد. لطفاً دوباره تلاش کنید.", + tokenExchangeFailed: "ورود با گوگل موقتاً در دسترس نیست. چند دقیقه دیگر دوباره تلاش کنید.", + profileLookupFailed: "دریافت اطلاعات حساب گوگل انجام نشد. لطفاً دوباره تلاش کنید.", completeFailed: "تکمیل ساخت حساب با گوگل انجام نشد.", claimOtpSent: "کد تایید با موفقیت ارسال شد.", googleAccount: "حساب گوگل", diff --git a/src/pages/GoogleAuthCallback.tsx b/src/pages/GoogleAuthCallback.tsx index 27d18b3..1f5db70 100644 --- a/src/pages/GoogleAuthCallback.tsx +++ b/src/pages/GoogleAuthCallback.tsx @@ -34,6 +34,8 @@ export default function GoogleAuthCallback() { const isRtl = lang === "fa"; const flow = searchParams.get("flow") ?? ""; + const callbackErrorCode = searchParams.get("error") ?? ""; + const callbackErrorDescription = searchParams.get("error_description") ?? ""; const [step, setStep] = useState("loading"); const [loading, setLoading] = useState(false); @@ -50,6 +52,22 @@ export default function GoogleAuthCallback() { otpVerify: 0, }); + const resolveCallbackErrorMessage = () => { + if (callbackErrorCode === "access_denied") { + return t.login.google.cancelled; + } + if (callbackErrorDescription) { + if (callbackErrorDescription === "Google token exchange failed.") { + return t.login.google.tokenExchangeFailed; + } + if (callbackErrorDescription === "Google user profile lookup failed.") { + return t.login.google.profileLookupFailed; + } + return callbackErrorDescription; + } + return t.login.google.callbackFailed; + }; + useEffect(() => { if (!Object.values(cooldowns).some((value) => value > 0)) { return; @@ -138,6 +156,12 @@ export default function GoogleAuthCallback() { }; useEffect(() => { + if (callbackErrorCode) { + setErrorMessage(resolveCallbackErrorMessage()); + setStep("error"); + return; + } + if (!flow) { setErrorMessage(t.login.google.missingFlow); setStep("error"); @@ -170,7 +194,7 @@ export default function GoogleAuthCallback() { return () => { cancelled = true; }; - }, [flow]); + }, [callbackErrorCode, callbackErrorDescription, flow, lang]); const handleCompleteSignup = async (event: React.FormEvent) => { event.preventDefault();