From e57166745c24875ffd50b78e31bbd1e20480720f Mon Sep 17 00:00:00 2001 From: Fringg Date: Sun, 22 Mar 2026 05:21:01 +0300 Subject: [PATCH] fix: prevent polling race condition and add missing zh/fa translations --- src/components/TelegramLoginButton.tsx | 13 +++++++++++-- src/locales/fa.json | 3 +++ src/locales/zh.json | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/TelegramLoginButton.tsx b/src/components/TelegramLoginButton.tsx index 3601c16..cdd6d45 100644 --- a/src/components/TelegramLoginButton.tsx +++ b/src/components/TelegramLoginButton.tsx @@ -36,6 +36,7 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto const pollTimeoutRef = useRef>(null); const expireTimeoutRef = useRef>(null); const copiedTimeoutRef = useRef>(null); + const pollInFlightRef = useRef(false); const loginWithDeepLink = useAuthStore((s) => s.loginWithDeepLink); @@ -264,7 +265,8 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto // Recursive setTimeout prevents overlapping async calls const poll = async () => { - if (!mountedRef.current) return; + if (!mountedRef.current || pollInFlightRef.current) return; + pollInFlightRef.current = true; try { // Deep link auth is for existing bot users — only campaign_slug applies await loginWithDeepLink(token, capturedCampaign); @@ -296,6 +298,8 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto // Other error — stop polling setDeepLinkPolling(false); setDeepLinkError(t('common.error')); + } finally { + pollInFlightRef.current = false; } }; @@ -348,9 +352,12 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto clearTimeout(pollTimeoutRef.current); pollTimeoutRef.current = null; } + // Skip if another poll is already in-flight to prevent race conditions + if (pollInFlightRef.current) return; const capturedCampaign = capturedCampaignRef.current; const immediatePoll = async () => { - if (!mountedRef.current) return; + if (!mountedRef.current || pollInFlightRef.current) return; + pollInFlightRef.current = true; try { await loginWithDeepLink(deepLinkToken, capturedCampaign); if (expireTimeoutRef.current) { @@ -377,6 +384,8 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto } setDeepLinkPolling(false); setDeepLinkError(t('common.error')); + } finally { + pollInFlightRef.current = false; } }; immediatePoll(); diff --git a/src/locales/fa.json b/src/locales/fa.json index 9f08085..467e54d 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -172,6 +172,9 @@ "waitingForConfirmation": "در انتظار تایید...", "deepLinkExpired": "لینک منقضی شده است. لطفا دوباره تلاش کنید.", "tryAgain": "تلاش مجدد", + "scanQrToLogin": "کد QR را با دوربین گوشی اسکن کنید", + "orSendCommand": "یا این دستور را به ربات ارسال کنید:", + "commandCopied": "دستور کپی شد", "welcomeBack": "خوش آمدید!", "loginTitle": "ورود به کابین", "loginSubtitle": "با تلگرام یا ایمیل وارد شوید", diff --git a/src/locales/zh.json b/src/locales/zh.json index 4cc4801..b6c525c 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -172,6 +172,9 @@ "waitingForConfirmation": "等待确认...", "deepLinkExpired": "链接已过期,请重试。", "tryAgain": "重试", + "scanQrToLogin": "用手机相机扫描二维码", + "orSendCommand": "或向机器人发送命令:", + "commandCopied": "命令已复制", "welcomeBack": "欢迎回来!", "loginTitle": "登录个人中心", "loginSubtitle": "通过Telegram或邮箱登录",