// [nexus] Puter auth button — loads CDN script, triggers signIn popup, captures token import { useState } from "react"; import { Button } from "@/components/ui/button"; import { CheckCircle, LogIn } from "lucide-react"; interface PuterAuthButtonProps { onSuccess: (token: string) => void; onError: (msg: string) => void; } function loadScript(): Promise { return new Promise((resolve, reject) => { if ((window as any).puter) { resolve(); return; } const script = document.createElement("script"); script.src = "https://js.puter.com/v2/"; script.onload = () => resolve(); script.onerror = () => reject(new Error("Failed to load Puter SDK")); document.head.appendChild(script); }); } export function PuterAuthButton({ onSuccess, onError }: PuterAuthButtonProps) { const [loading, setLoading] = useState(false); const [connected, setConnected] = useState(false); async function handleClick() { setLoading(true); try { await loadScript(); // signIn must be called in the same async chain as the click event for popup to work await (window as any).puter.auth.signIn(); // Extract token — try multiple access patterns (Pitfall 1: token location varies) let token: string | undefined = (window as any).puter?.authToken ?? (window as any).puter?.auth?.token; if (!token) { const user = await (window as any).puter?.auth?.getUser?.(); token = user?.token; } if (!token) { console.warn("[nexus] Puter token is undefined after signIn — user may not be authenticated"); } onSuccess(token ?? ""); setConnected(true); } catch { onError("Puter sign-in failed. Check your Puter.com account and try again."); } finally { setLoading(false); } } return ( ); }