import { useEffect, useState } from 'react' import { useMutation, useQuery } from '@tanstack/react-query' import { useNavigate } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' import { QRCodeSVG } from 'qrcode.react' import { Send } from 'lucide-react' import { toast } from '@/shared/ui/toast-store' import { Button } from '@/shared/ui/button' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/shared/ui/dialog' import { applyAuthResponse } from '@/features/auth/api' import { createLoginRequest, getLoginRequestStatus } from './api' import type { TelegramLoginStatus } from '@/shared/api/types' const TERMINAL: TelegramLoginStatus[] = ['Rejected', 'Expired', 'Consumed'] export function TelegramLoginButton() { const { t } = useTranslation() const navigate = useNavigate() const [open, setOpen] = useState(false) const [requestId, setRequestId] = useState(null) const [deepLink, setDeepLink] = useState(null) const startMutation = useMutation({ mutationFn: createLoginRequest, onSuccess: (data) => { setRequestId(data.requestId) setDeepLink(data.deepLink) setOpen(true) }, onError: () => toast.error(t('auth.genericError')), }) const statusQuery = useQuery({ queryKey: ['telegram-login-status', requestId], queryFn: () => getLoginRequestStatus(requestId!), enabled: open && !!requestId, refetchInterval: (query) => { const status = query.state.data?.status return status && (status === 'Approved' || TERMINAL.includes(status)) ? false : 2000 }, }) const status = statusQuery.data?.status useEffect(() => { if (status !== 'Approved' || !statusQuery.data?.accessToken || !statusQuery.data.user) return applyAuthResponse({ accessToken: statusQuery.data.accessToken, expiresAt: statusQuery.data.expiresAt!, user: statusQuery.data.user, }) setOpen(false) void navigate({ to: '/dashboard' }) }, [status, statusQuery.data, navigate]) return ( <> {t('auth.loginViaTelegram')}
{deepLink && ( <> {deepLink}

{t('auth.telegramQrHint')}

)} {!deepLink &&

{t('auth.telegramBotNotConfigured')}

} {status === 'Pending' &&

{t('auth.waitingForConfirmation')}

} {status === 'Rejected' &&

{t('auth.telegramLoginRejected')}

} {status === 'Expired' &&

{t('auth.telegramLoginExpired')}

}
) }