diff --git a/src/client/components/UserMenu.tsx b/src/client/components/UserMenu.tsx index 4704650..a27edc4 100644 --- a/src/client/components/UserMenu.tsx +++ b/src/client/components/UserMenu.tsx @@ -43,7 +43,7 @@ export function UserMenu() { type="button" onClick={() => { setOpen(false); - logout.mutate(); + logout(); }} className="flex items-center gap-2 w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-50 transition-colors" > diff --git a/src/client/hooks/useAuth.ts b/src/client/hooks/useAuth.ts index 88e6e40..25e6754 100644 --- a/src/client/hooks/useAuth.ts +++ b/src/client/hooks/useAuth.ts @@ -1,9 +1,9 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { apiDelete, apiGet, apiPost, apiPut } from "../lib/api"; +import { apiDelete, apiGet, apiPost } from "../lib/api"; interface AuthState { - user: { id: number } | null; - setupRequired: boolean; + user: { id: string; email?: string } | null; + authenticated: boolean; } export function useAuth() { @@ -14,43 +14,11 @@ export function useAuth() { }); } -export function useLogin() { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: (data: { username: string; password: string }) => - apiPost<{ username: string }>("/api/auth/login", data), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["auth"] }); - }, - }); -} - export function useLogout() { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: () => apiPost<{ success: boolean }>("/api/auth/logout", {}), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["auth"] }); - }, - }); -} - -export function useSetup() { - const queryClient = useQueryClient(); - return useMutation({ - mutationFn: (data: { username: string; password: string }) => - apiPost<{ username: string }>("/api/auth/setup", data), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["auth"] }); - }, - }); -} - -export function useChangePassword() { - return useMutation({ - mutationFn: (data: { currentPassword: string; newPassword: string }) => - apiPut<{ success: boolean }>("/api/auth/password", data), - }); + const logout = () => { + window.location.href = "/logout"; + }; + return { logout }; } interface ApiKeyListItem { diff --git a/src/client/routes/login.tsx b/src/client/routes/login.tsx index 888f3ca..f5a62e3 100644 --- a/src/client/routes/login.tsx +++ b/src/client/routes/login.tsx @@ -1,6 +1,6 @@ import { createFileRoute, useNavigate } from "@tanstack/react-router"; -import { useState } from "react"; -import { useAuth, useLogin, useSetup } from "../hooks/useAuth"; +import { useEffect } from "react"; +import { useAuth } from "../hooks/useAuth"; export const Route = createFileRoute("/login")({ component: LoginPage, @@ -8,96 +8,42 @@ export const Route = createFileRoute("/login")({ function LoginPage() { const navigate = useNavigate(); - const { data: auth } = useAuth(); - const login = useLogin(); - const setup = useSetup(); + const { data: auth, isLoading } = useAuth(); - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState(""); - - const isSetup = auth?.setupRequired ?? false; - - async function handleSubmit(e: React.FormEvent) { - e.preventDefault(); - setError(""); - - try { - if (isSetup) { - await setup.mutateAsync({ username, password }); - } else { - await login.mutateAsync({ username, password }); - } + useEffect(() => { + if (auth?.authenticated) { navigate({ to: "/" }); - } catch (err) { - setError((err as Error).message); } - } + }, [auth, navigate]); - const isPending = login.isPending || setup.isPending; + if (isLoading) { + return ( +
Loading...
+