import { useState, useEffect, ReactNode } from "react"; import { trpc } from "@/lib/trpc"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Lock, Loader2 } from "lucide-react"; const ACCESS_KEY_STORAGE = "access_key_verified"; export function AccessGate({ children }: { children: ReactNode }) { const [key, setKey] = useState(""); const [error, setError] = useState(""); const [verified, setVerified] = useState(null); const accessKeyEnabled = trpc.auth.accessKeyEnabled.useQuery(); const verifyMutation = trpc.auth.verifyAccessKey.useMutation(); // Check if already verified in session useEffect(() => { if (accessKeyEnabled.data?.enabled === false) { setVerified(true); return; } const stored = sessionStorage.getItem(ACCESS_KEY_STORAGE); if (stored === "true") { setVerified(true); } else if (accessKeyEnabled.data?.enabled) { setVerified(false); } }, [accessKeyEnabled.data]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); try { const result = await verifyMutation.mutateAsync({ key }); if (result.valid) { sessionStorage.setItem(ACCESS_KEY_STORAGE, "true"); setVerified(true); } else { setError("Invalid access key"); } } catch { setError("Failed to verify key"); } }; // Still loading if (accessKeyEnabled.isLoading || verified === null) { return (
); } // Already verified or access key disabled if (verified) { return <>{children}; } // Show access key prompt return (
Access Required Enter the access key to continue
setKey(e.target.value)} autoFocus /> {error && (

{error}

)}
); }