From 5c11f1251a9bdbb60f49c105b1a3ebcbd477d8b8 Mon Sep 17 00:00:00 2001 From: Fringg Date: Sat, 7 Mar 2026 02:51:18 +0300 Subject: [PATCH] fix: address code review findings for TelegramLoginButton - Replace useCallback with ref pattern to prevent stale closures and unnecessary Telegram.Login.init() re-calls - Make isOIDC a proper boolean with Boolean() wrapper - Clear previous error on successful login attempt - Remove hardcoded fallback string from t() call --- src/components/TelegramLoginButton.tsx | 55 +++++++++++++------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/src/components/TelegramLoginButton.tsx b/src/components/TelegramLoginButton.tsx index 8077acb..70746bc 100644 --- a/src/components/TelegramLoginButton.tsx +++ b/src/components/TelegramLoginButton.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useCallback, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useQuery } from '@tanstack/react-query'; import { brandingApi, type TelegramWidgetConfig } from '../api/branding'; @@ -25,29 +25,30 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto const botUsername = widgetConfig?.bot_username || import.meta.env.VITE_TELEGRAM_BOT_USERNAME || ''; - const isOIDC = widgetConfig?.oidc_enabled && widgetConfig?.oidc_client_id; + const isOIDC = Boolean(widgetConfig?.oidc_enabled && widgetConfig?.oidc_client_id); - // OIDC callback handler - const handleOIDCCallback = useCallback( - async (data: { id_token?: string; error?: string }) => { - if (data.error || !data.id_token) { - setOidcError(data.error || t('auth.loginFailed')); - setOidcLoading(false); - return; - } - try { - setOidcLoading(true); - await loginWithTelegramOIDC(data.id_token); - navigate('/'); - } catch (err: unknown) { - const error = err as { response?: { data?: { detail?: string } } }; - setOidcError(error.response?.data?.detail || t('common.error')); - } finally { - setOidcLoading(false); - } - }, - [loginWithTelegramOIDC, navigate, t], - ); + // OIDC callback handler (ref pattern to avoid stale closures and unnecessary re-inits) + const handleOIDCCallbackRef = + useRef<(data: { id_token?: string; error?: string }) => void>(undefined); + + handleOIDCCallbackRef.current = async (data: { id_token?: string; error?: string }) => { + if (data.error || !data.id_token) { + setOidcError(data.error || t('auth.loginFailed')); + setOidcLoading(false); + return; + } + try { + setOidcLoading(true); + setOidcError(''); + await loginWithTelegramOIDC(data.id_token); + navigate('/'); + } catch (err: unknown) { + const error = err as { response?: { data?: { detail?: string } } }; + setOidcError(error.response?.data?.detail || t('common.error')); + } finally { + setOidcLoading(false); + } + }; // Load OIDC script and init useEffect(() => { @@ -64,7 +65,7 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto request_access: widgetConfig.request_access ? ['write'] : undefined, lang: document.documentElement.lang || 'en', }, - handleOIDCCallback, + (data) => handleOIDCCallbackRef.current?.(data), ); } }; @@ -80,7 +81,7 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto // Script already loaded, just re-init initTelegramLogin(); } - }, [isOIDC, widgetConfig?.oidc_client_id, widgetConfig?.request_access, handleOIDCCallback]); + }, [isOIDC, widgetConfig?.oidc_client_id, widgetConfig?.request_access]); // Legacy widget effect (only when NOT OIDC) useEffect(() => { @@ -141,9 +142,7 @@ export default function TelegramLoginButton({ referralCode }: TelegramLoginButto - {oidcLoading - ? t('common.loading') - : t('auth.loginWithTelegram', 'Sign in with Telegram')} + {oidcLoading ? t('common.loading') : t('auth.loginWithTelegram')} {oidcError &&

{oidcError}

}