mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
fix: add retry logic for Telegram Mini App auth failures
Auto-retry once on 401 with 1.5s delay, plus a manual retry button with a hint to reopen the app if auth keeps failing.
This commit is contained in:
@@ -161,6 +161,8 @@
|
|||||||
"or": "or",
|
"or": "or",
|
||||||
"registerHint": "To register with email, first log in via Telegram, then link your email in settings.",
|
"registerHint": "To register with email, first log in via Telegram, then link your email in settings.",
|
||||||
"telegramRequired": "Telegram authorization required",
|
"telegramRequired": "Telegram authorization required",
|
||||||
|
"telegramRetryFailed": "Authorization failed. Close the app and try again.",
|
||||||
|
"telegramReopenHint": "If the problem persists, close and reopen the app",
|
||||||
"telegramNotConfigured": "Telegram bot is not configured",
|
"telegramNotConfigured": "Telegram bot is not configured",
|
||||||
"authenticating": "Authenticating...",
|
"authenticating": "Authenticating...",
|
||||||
"orOpenInApp": "Or open the bot in the app",
|
"orOpenInApp": "Or open the bot in the app",
|
||||||
|
|||||||
@@ -153,6 +153,8 @@
|
|||||||
"or": "یا",
|
"or": "یا",
|
||||||
"registerHint": "برای ثبت نام با ایمیل، ابتدا با تلگرام وارد شوید، سپس ایمیل خود را در تنظیمات متصل کنید.",
|
"registerHint": "برای ثبت نام با ایمیل، ابتدا با تلگرام وارد شوید، سپس ایمیل خود را در تنظیمات متصل کنید.",
|
||||||
"telegramRequired": "نیاز به تایید تلگرام",
|
"telegramRequired": "نیاز به تایید تلگرام",
|
||||||
|
"telegramRetryFailed": "تایید هویت ناموفق بود. برنامه را ببندید و دوباره باز کنید.",
|
||||||
|
"telegramReopenHint": "اگر مشکل ادامه دارد، برنامه را ببندید و دوباره باز کنید",
|
||||||
"telegramNotConfigured": "ربات تلگرام پیکربندی نشده",
|
"telegramNotConfigured": "ربات تلگرام پیکربندی نشده",
|
||||||
"authenticating": "در حال تایید هویت...",
|
"authenticating": "در حال تایید هویت...",
|
||||||
"orOpenInApp": "یا ربات را در برنامه باز کنید",
|
"orOpenInApp": "یا ربات را در برنامه باز کنید",
|
||||||
|
|||||||
@@ -164,6 +164,8 @@
|
|||||||
"or": "или",
|
"or": "или",
|
||||||
"registerHint": "Для регистрации по email сначала авторизуйтесь через Telegram, затем привяжите email в настройках.",
|
"registerHint": "Для регистрации по email сначала авторизуйтесь через Telegram, затем привяжите email в настройках.",
|
||||||
"telegramRequired": "Требуется авторизация через Telegram",
|
"telegramRequired": "Требуется авторизация через Telegram",
|
||||||
|
"telegramRetryFailed": "Авторизация не удалась. Закройте приложение и откройте заново.",
|
||||||
|
"telegramReopenHint": "Если проблема повторяется — закройте и откройте приложение заново",
|
||||||
"telegramNotConfigured": "Telegram бот не настроен",
|
"telegramNotConfigured": "Telegram бот не настроен",
|
||||||
"authenticating": "Авторизация...",
|
"authenticating": "Авторизация...",
|
||||||
"orOpenInApp": "Или откройте бота в приложении",
|
"orOpenInApp": "Или откройте бота в приложении",
|
||||||
|
|||||||
@@ -153,6 +153,8 @@
|
|||||||
"or": "或",
|
"or": "或",
|
||||||
"registerHint": "要通过邮箱注册,请先通过Telegram登录,然后在设置中绑定邮箱。",
|
"registerHint": "要通过邮箱注册,请先通过Telegram登录,然后在设置中绑定邮箱。",
|
||||||
"telegramRequired": "需要Telegram授权",
|
"telegramRequired": "需要Telegram授权",
|
||||||
|
"telegramRetryFailed": "授权失败。请关闭应用后重新打开。",
|
||||||
|
"telegramReopenHint": "如果问题持续存在,请关闭并重新打开应用",
|
||||||
"telegramNotConfigured": "Telegram机器人未配置",
|
"telegramNotConfigured": "Telegram机器人未配置",
|
||||||
"authenticating": "正在验证...",
|
"authenticating": "正在验证...",
|
||||||
"orOpenInApp": "或在应用中打开机器人",
|
"orOpenInApp": "或在应用中打开机器人",
|
||||||
|
|||||||
@@ -110,31 +110,62 @@ export default function Login() {
|
|||||||
}
|
}
|
||||||
}, [isAuthenticated, navigate, getReturnUrl]);
|
}, [isAuthenticated, navigate, getReturnUrl]);
|
||||||
|
|
||||||
// Try Telegram WebApp authentication on mount
|
// Try Telegram WebApp authentication on mount (with auto-retry on 401)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const tryTelegramAuth = async () => {
|
const tryTelegramAuth = async () => {
|
||||||
const initData = getTelegramInitData();
|
const initData = getTelegramInitData();
|
||||||
if (isInTelegramWebApp() && initData) {
|
if (!isInTelegramWebApp() || !initData) return;
|
||||||
setIsTelegramWebApp(true);
|
|
||||||
// Note: ready() and expand() are already called by SDK init in main.tsx
|
setIsTelegramWebApp(true);
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
|
|
||||||
|
const MAX_RETRIES = 1;
|
||||||
|
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
||||||
try {
|
try {
|
||||||
await loginWithTelegram(initData);
|
await loginWithTelegram(initData);
|
||||||
navigate(getReturnUrl(), { replace: true });
|
navigate(getReturnUrl(), { replace: true });
|
||||||
|
return;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Log only status code to avoid leaking sensitive data
|
|
||||||
const status = (err as { response?: { status?: number } })?.response?.status;
|
const status = (err as { response?: { status?: number } })?.response?.status;
|
||||||
console.warn('Telegram auth failed with status:', status);
|
console.warn(`Telegram auth attempt ${attempt + 1} failed with status:`, status);
|
||||||
|
|
||||||
|
if (status === 401 && attempt < MAX_RETRIES) {
|
||||||
|
await new Promise((r) => setTimeout(r, 1500));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
setError(t('auth.telegramRequired'));
|
setError(t('auth.telegramRequired'));
|
||||||
} finally {
|
|
||||||
setIsLoading(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setIsLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
tryTelegramAuth();
|
tryTelegramAuth();
|
||||||
}, [loginWithTelegram, navigate, t, getReturnUrl]);
|
}, [loginWithTelegram, navigate, t, getReturnUrl]);
|
||||||
|
|
||||||
|
// Manual retry for Telegram Mini App auth
|
||||||
|
const handleRetryTelegramAuth = async () => {
|
||||||
|
const initData = getTelegramInitData();
|
||||||
|
if (!initData) {
|
||||||
|
setError(t('auth.telegramRequired'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setError('');
|
||||||
|
setIsLoading(true);
|
||||||
|
try {
|
||||||
|
await loginWithTelegram(initData);
|
||||||
|
navigate(getReturnUrl(), { replace: true });
|
||||||
|
} catch (err) {
|
||||||
|
const status = (err as { response?: { status?: number } })?.response?.status;
|
||||||
|
console.warn('Telegram auth retry failed with status:', status);
|
||||||
|
setError(t('auth.telegramRetryFailed', 'Authorization failed. Close the app and try again.'));
|
||||||
|
} finally {
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleEmailSubmit = async (e: React.FormEvent) => {
|
const handleEmailSubmit = async (e: React.FormEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setError('');
|
setError('');
|
||||||
@@ -341,6 +372,34 @@ export default function Login() {
|
|||||||
<div className="mx-auto mb-3 h-8 w-8 animate-spin rounded-full border-2 border-accent-500 border-t-transparent" />
|
<div className="mx-auto mb-3 h-8 w-8 animate-spin rounded-full border-2 border-accent-500 border-t-transparent" />
|
||||||
<p className="text-sm text-dark-400">{t('auth.authenticating')}</p>
|
<p className="text-sm text-dark-400">{t('auth.authenticating')}</p>
|
||||||
</div>
|
</div>
|
||||||
|
) : isTelegramWebApp && error ? (
|
||||||
|
<div className="space-y-4 text-center">
|
||||||
|
<button
|
||||||
|
onClick={handleRetryTelegramAuth}
|
||||||
|
className="btn-primary mx-auto flex items-center gap-2 px-6 py-3"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
className="h-5 w-5"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor"
|
||||||
|
strokeWidth={2}
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
strokeLinecap="round"
|
||||||
|
strokeLinejoin="round"
|
||||||
|
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
{t('auth.tryAgain')}
|
||||||
|
</button>
|
||||||
|
<p className="text-xs text-dark-500">
|
||||||
|
{t(
|
||||||
|
'auth.telegramReopenHint',
|
||||||
|
'If the problem persists, close and reopen the app',
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<TelegramLoginButton botUsername={botUsername} />
|
<TelegramLoginButton botUsername={botUsername} />
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user