import { FormEvent, useEffect, useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useApiKey } from "../context/ApiKeyContext"; import "./gate.css"; type Phase = "idle" | "handshake" | "cleared"; const REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)"; function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } function maskKey(key: string): string { const trimmed = key.trim(); if (trimmed.length <= 8) return "••••"; return `${trimmed.slice(0, 4)}••••${trimmed.slice(-4)}`; } function stampDate(): string { return new Date() .toLocaleDateString("en-GB", { day: "2-digit", month: "short", year: "numeric" }) .toUpperCase(); } export default function Gate() { const { apiKeys, activeKeyId, addApiKey, setActiveKeyId } = useApiKey(); const navigate = useNavigate(); const prefersReducedMotion = useMemo( () => window.matchMedia(REDUCED_MOTION_QUERY).matches, [] ); const hasStoredKeys = apiKeys.length > 0; const [enterMode, setEnterMode] = useState<"resume" | "fresh">( hasStoredKeys ? "resume" : "fresh" ); const [workspaceName, setWorkspaceName] = useState(""); const [apiKey, setApiKey] = useState(""); const [showKey, setShowKey] = useState(false); const [resumeKeyId, setResumeKeyId] = useState(activeKeyId ?? apiKeys[0]?.id ?? ""); const [error, setError] = useState(null); const [phase, setPhase] = useState("idle"); const resumeKey = apiKeys.find((k) => k.id === resumeKeyId); const aliveRef = useRef(true); const timersRef = useRef([]); useEffect(() => { aliveRef.current = true; return () => { aliveRef.current = false; timersRef.current.forEach((t) => clearTimeout(t)); }; }, []); function finish(opts: { name: string; key: string; resumeId?: string }) { if (!aliveRef.current) return; if (opts.resumeId) { setActiveKeyId(opts.resumeId); } else { addApiKey(opts.name, opts.key, true); } navigate("/", { replace: true }); } async function runHandshake(opts: { name: string; key: string; resumeId?: string }) { setPhase("handshake"); setError(null); if (prefersReducedMotion) { finish(opts); return; } await delay(620); if (!aliveRef.current) return; setPhase("cleared"); const t = window.setTimeout(() => { finish(opts); }, 900); timersRef.current.push(t); } function handleSubmit(event: FormEvent) { event.preventDefault(); if (phase !== "idle") return; if (enterMode === "resume" && resumeKey) { void runHandshake({ name: resumeKey.name, key: resumeKey.key, resumeId: resumeKey.id, }); return; } const name = workspaceName.trim(); const key = apiKey.trim(); if (!name) { setError("Name your workspace — anything you will recognize later."); return; } if (!key) { setError("Paste your Smartlead API key to open the module."); return; } void runHandshake({ name, key }); } function enterDemo() { if (phase !== "idle") return; setEnterMode("fresh"); setWorkspaceName("Demo Workspace"); setApiKey("demo_bridge_e"); setError(null); void runHandshake({ name: "Demo Workspace", key: "demo_bridge_e" }); } const busy = phase !== "idle"; const buttonLabel = phase === "idle" ? "OPEN MODULE" : phase === "handshake" ? "OPENING…" : "CLEARED"; return (

BRIDGE Modul E — connect a Smartlead workspace

); }