From bbc423d9c7e5cf6df9e0db94de6b4cd042000d1a Mon Sep 17 00:00:00 2001 From: houseassassin Date: Wed, 20 May 2026 12:39:24 +0300 Subject: [PATCH] feat: Telegram Login Widget on /login page --- src/pages/Login.tsx | 47 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 11fabb6..c00b8e8 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useState, useEffect, useRef } from "react"; import { useNavigate, Link } from "react-router-dom"; import { Shield } from "lucide-react"; import { api } from "../api/client"; @@ -7,6 +7,12 @@ import { Button } from "../components/ui/Button"; import { Input } from "../components/ui/Input"; import { GlassCard } from "../components/ui/GlassCard"; +declare global { + interface Window { + onTelegramAuth: (user: Record) => void; + } +} + export default function Login() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -14,6 +20,31 @@ export default function Login() { const [loading, setLoading] = useState(false); const { setAuth } = useAuthStore(); const navigate = useNavigate(); + const tgRef = useRef(null); + + useEffect(() => { + window.onTelegramAuth = async (tgUser) => { + setError(""); + setLoading(true); + const res = await api.tgAuth(tgUser); + setLoading(false); + if (!res.ok) { setError(res.error || "Ошибка входа через Telegram"); return; } + setAuth(res.access_token, res.refresh_token, res.user); + navigate("/dashboard"); + }; + + if (!tgRef.current) return; + const script = document.createElement("script"); + script.src = "https://telegram.org/js/telegram-widget.js?22"; + script.setAttribute("data-telegram-login", "cricket_vpn_bot"); + script.setAttribute("data-size", "large"); + script.setAttribute("data-onauth", "onTelegramAuth(user)"); + script.setAttribute("data-request-access", "write"); + script.async = true; + tgRef.current.appendChild(script); + + return () => { delete (window as any).onTelegramAuth; }; + }, []); async function handleLogin(e: React.FormEvent) { e.preventDefault(); @@ -40,15 +71,23 @@ export default function Login() {

Доступ к личному кабинету

-
+ {/* Telegram Login Widget */} +
+
+
+ + {loading &&

Вход...

} + {error &&

{error}

} + +
- email + или email
setEmail(e.target.value)} placeholder="you@example.com" required /> - setPassword(e.target.value)} placeholder="••••••••" required error={error} /> + setPassword(e.target.value)} placeholder="••••••••" required />