import type { UserRecord } from "@issue/shared"; import { useEffect, useRef, useState } from "react"; import { Link } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { getServerURL } from "@/lib/utils"; type AuthState = "unknown" | "authenticated" | "unauthenticated"; export default function Landing() { const [authState, setAuthState] = useState(() => { // if token exists, assume authenticated until verified return localStorage.getItem("token") ? "unknown" : "unauthenticated"; }); const verifiedRef = useRef(false); useEffect(() => { if (verifiedRef.current) return; verifiedRef.current = true; const token = localStorage.getItem("token"); if (!token) { setAuthState("unauthenticated"); return; } // verify token in background fetch(`${getServerURL()}/auth/me`, { headers: { Authorization: `Bearer ${token}` }, }) .then(async (res) => { if (res.ok) { const user = (await res.json()) as UserRecord; localStorage.setItem("user", JSON.stringify(user)); setAuthState("authenticated"); } else { localStorage.removeItem("token"); localStorage.removeItem("user"); setAuthState("unauthenticated"); } }) .catch(() => { localStorage.removeItem("token"); localStorage.removeItem("user"); setAuthState("unauthenticated"); }); }, []); return (
Issue

Need a snappy project management tool?

Build your next project with Issue.

Sick of Jira? Say hello to your new favorite project management tool.

{authState === "authenticated" ? ( ) : ( )}
); }