import { IconLanguage, IconMoon, IconSun } from "@tabler/icons-react" import { createFileRoute } from "@tanstack/react-router" import * as React from "react" import { useTranslation } from "react-i18next" import { getLauncherAuthStatus, postLauncherDashboardLogin, type LauncherAuthTokenHelp, } from "@/api/launcher-auth" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { useTheme } from "@/hooks/use-theme" function LauncherLoginPage() { const { t, i18n } = useTranslation() const { theme, toggleTheme } = useTheme() const [token, setToken] = React.useState("") const [submitting, setSubmitting] = React.useState(false) const [error, setError] = React.useState("") const [tokenHelp, setTokenHelp] = React.useState( null, ) React.useEffect(() => { let cancelled = false void getLauncherAuthStatus() .then((s) => { if (cancelled || s.authenticated || !s.token_help) { return } setTokenHelp(s.token_help) }) .catch(() => { /* ignore; login form still usable */ }) return () => { cancelled = true } }, []) const loginWithToken = React.useCallback( async (tokenValue: string) => { setError("") setSubmitting(true) try { const ok = await postLauncherDashboardLogin(tokenValue) if (ok) { globalThis.location.assign("/") return } setError(t("launcherLogin.errorInvalid")) } catch { setError(t("launcherLogin.errorNetwork")) } finally { setSubmitting(false) } }, [t], ) const onSubmit = async (e: React.FormEvent) => { e.preventDefault() await loginWithToken(token) } return (
i18n.changeLanguage("en")}> English i18n.changeLanguage("zh")}> 简体中文
{t("launcherLogin.title")} {t("launcherLogin.description")}
setToken(e.target.value)} placeholder={t("launcherLogin.tokenPlaceholder")} />
{error ? (

{error}

) : null}
{tokenHelp ? (

{t("launcherLogin.helpTitle")}

    {tokenHelp.console_stdout ? (
  • {t("launcherLogin.helpConsole")}
  • ) : null} {tokenHelp.tray_copy_menu ? (
  • {t("launcherLogin.helpTray")}
  • ) : null} {tokenHelp.log_file ? (
  • {t("launcherLogin.helpLogFile", { path: tokenHelp.log_file, })}
  • ) : null} {tokenHelp.env_var_name ? (
  • {t("launcherLogin.helpEnv", { env: tokenHelp.env_var_name, })}
  • ) : null}
) : null}
) } export const Route = createFileRoute("/launcher-login")({ component: LauncherLoginPage, })