import React, { useState, useEffect } from "react"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; import axios from "axios"; function setCookie(name: string, value: string, days = 7) { const expires = new Date(Date.now() + days * 864e5).toUTCString(); document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/`; } function getCookie(name: string) { return document.cookie.split('; ').reduce((r, v) => { const parts = v.split('='); return parts[0] === name ? decodeURIComponent(parts[1]) : r; }, ""); } const apiBase = typeof window !== "undefined" && window.location.hostname === "localhost" ? "http://localhost:8081/users" : "/users"; const API = axios.create({ baseURL: apiBase, }); interface HomepageAuthProps extends React.ComponentProps<"div"> { setLoggedIn: (loggedIn: boolean) => void; setIsAdmin: (isAdmin: boolean) => void; setUsername: (username: string | null) => void; } export function HomepageAuth({ className, setLoggedIn, setIsAdmin, setUsername, ...props }: HomepageAuthProps) { const [tab, setTab] = useState<"login" | "signup">("login"); const [localUsername, setLocalUsername] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [internalLoggedIn, setInternalLoggedIn] = useState(false); const [firstUser, setFirstUser] = useState(false); const [dbError, setDbError] = useState(null); const [registrationAllowed, setRegistrationAllowed] = useState(true); useEffect(() => { API.get("/registration-allowed").then(res => { setRegistrationAllowed(res.data.allowed); }); }, []); useEffect(() => { API.get("/count").then(res => { if (res.data.count === 0) { setFirstUser(true); setTab("signup"); } else { setFirstUser(false); } setDbError(null); }).catch(() => { setDbError("Could not connect to the database. Please try again later."); }); }, []); useEffect(() => { const jwt = getCookie("jwt"); if (jwt) { setLoading(true); Promise.all([ API.get("/me", { headers: { Authorization: `Bearer ${jwt}` } }), API.get("/db-health") ]) .then(([meRes]) => { setInternalLoggedIn(true); setLoggedIn(true); setIsAdmin(!!meRes.data.is_admin); setUsername(meRes.data.username || null); setDbError(null); }) .catch((err) => { setInternalLoggedIn(false); setLoggedIn(false); setIsAdmin(false); setUsername(null); setCookie("jwt", "", -1); if (err?.response?.data?.error?.includes("Database")) { setDbError("Could not connect to the database. Please try again later."); } else { setDbError(null); } }) .finally(() => setLoading(false)); } else { setInternalLoggedIn(false); setLoggedIn(false); setIsAdmin(false); setUsername(null); } }, [setLoggedIn, setIsAdmin, setUsername]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); setLoading(true); try { let res, meRes; if (tab === "login") { res = await API.post("/get", { username: localUsername, password }); } else { await API.post("/create", { username: localUsername, password }); res = await API.post("/get", { username: localUsername, password }); } setCookie("jwt", res.data.token); [meRes] = await Promise.all([ API.get("/me", { headers: { Authorization: `Bearer ${res.data.token}` } }), API.get("/db-health") ]); setInternalLoggedIn(true); setLoggedIn(true); setIsAdmin(!!meRes.data.is_admin); setUsername(meRes.data.username || null); setDbError(null); } catch (err: any) { setError(err?.response?.data?.error || "Unknown error"); setInternalLoggedIn(false); setLoggedIn(false); setIsAdmin(false); setUsername(null); setCookie("jwt", "", -1); if (err?.response?.data?.error?.includes("Database")) { setDbError("Could not connect to the database. Please try again later."); } else { setDbError(null); } } finally { setLoading(false); } } const Spinner = ( ); return (
{dbError && ( Error {dbError} )} {firstUser && !dbError && !internalLoggedIn && ( First User You are the first user and will be made an admin. You can view admin settings in the sidebar user dropdown. )} {!registrationAllowed && !internalLoggedIn && ( Registration Disabled New account registration is currently disabled by an admin. Please log in or contact an administrator. )} {(internalLoggedIn || (loading && getCookie("jwt"))) && (
Logged in! You are logged in! Use the sidebar to access all available tools. To get started, create an SSH Host in the SSH Manager tab. Once created, you can connect to that host using the other apps in the sidebar.
)} {(!internalLoggedIn && (!loading || !getCookie("jwt"))) && ( <>

{tab === "login" ? "Login to your account" : "Create a new account"}

setLocalUsername(e.target.value)} disabled={loading || internalLoggedIn} />
setPassword(e.target.value)} disabled={loading || internalLoggedIn} />
)} {error && ( Error {error} )}
); }