"use client"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { RiTelegram2Line } from "react-icons/ri"; import { TbLoader } from "react-icons/tb"; import { useState, Suspense } from "react"; import { useSearchParams } from "next/navigation"; import { motion, AnimatePresence } from "framer-motion"; export const dynamic = 'force-dynamic' type FormStep = "username" | "twofa"; type VerifyResponse = { success: boolean; message?: string; redirectTo?: string; sessionToken?: string; error?: string; }; const buttonVariants = { initial: { scale: 1 }, tap: { scale: 0.98 }, }; function LoginForm() { const [step, setStep] = useState("username"); const [username, setUsername] = useState(""); const [twoFaCode, setTwoFaCode] = useState(""); const [userId, setUserId] = useState(""); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(""); const searchParams = useSearchParams(); const returnTo = searchParams.get('returnTo') || '/account'; const handleUsernameSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!username.trim()) return; setIsLoading(true); setError(""); try { const response = await fetch("/api/auth/username", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ username: username.trim() }), }); const result = await response.json(); if (result.success) { setUserId(result.userId); setStep("twofa"); } else { setError(result.error || "Failed to find user"); } } catch (err) { console.error("Username submission error:", err); setError("Network error. Please try again."); } finally { setIsLoading(false); } }; const handleTwoFaSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!twoFaCode.trim() || twoFaCode.length !== 6) return; setIsLoading(true); setError(""); try { const response = await fetch("/api/auth/verify", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ userId, code: twoFaCode }), }); const result: VerifyResponse = await response.json(); if (result.success) { const redirectTo = result.redirectTo || returnTo; if (result.sessionToken) { try { localStorage.setItem('kowalski-session', result.sessionToken); } catch (storageError) { console.error('localStorage error:', storageError); } } window.location.href = redirectTo; } else { setError(result.error || "Invalid 2FA code"); } } catch (err) { console.error("2FA verification error:", err); console.log("Error details:", { message: err instanceof Error ? err.message : 'Unknown error', stack: err instanceof Error ? err.stack : 'No stack trace', name: err instanceof Error ? err.name : 'Unknown error type' }); const errorMessage = err instanceof Error ? `Error: ${err.message}` : "Network error. Please try again."; setError(errorMessage); } finally { setIsLoading(false); } }; const resetForm = () => { setStep("username"); setUsername(""); setTwoFaCode(""); setUserId(""); setError(""); }; const LoadingSpinner = ({ text }: { text: string }) => (
{text}
); return (
{step === "username" && (

Login to Kowalski

Please enter your Telegram username to continue.

setUsername(e.target.value)} disabled={isLoading} className="text-center text-lg py-6" autoFocus />
{error && ( {error} )}
)} {step === "twofa" && (

Enter 2FA Code

We've sent a 6-digit code to your Telegram. Please enter it below.

setTwoFaCode(e.target.value.replace(/\D/g, '').slice(0, 6))} disabled={isLoading} className="text-center text-2xl font-mono tracking-widest py-6" maxLength={6} autoFocus />
{error && ( {error} )}
)}
); } export default function LoginPage() { return (
}>
); }