import { useState, useEffect, useRef } from "react"; import { Link, useNavigate } from "react-router-dom"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { AuthForm } from "@/components/auth-form"; import { apiClient, setAuthToken } from "@/lib/api-client"; import { useAuthStore } from "@/store/auth-store"; function getUrlParam(name: string): string | null { return new URLSearchParams(window.location.search).get(name); } export function LoginPage() { const navigate = useNavigate(); const queryClient = useQueryClient(); const setUser = useAuthStore((state) => state.setUser); const [error, setError] = useState(null); const oauthTokenConsumed = useRef(false); const [oauthProcessing, setOauthProcessing] = useState(false); // Handle OAuth callback: the API redirects to /login?token= useEffect(() => { const token = getUrlParam("token"); if (!token || oauthTokenConsumed.current) return; oauthTokenConsumed.current = true; setOauthProcessing(true); // Store token for future API calls and fetch user setAuthToken(token); apiClient .getMe() .then((data) => { setUser(data.user); queryClient.setQueryData(["auth", "me"], data); navigate("/dashboard", { replace: true }); }) .catch((err) => { setAuthToken(null); setOauthProcessing(false); setError(err instanceof Error ? err.message : "Google login gagal"); }); }, [setUser, queryClient, navigate]); // Show OAuth error from query param const oauthError = getUrlParam("error"); const meQuery = useQuery({ queryKey: ["auth", "me"], queryFn: () => apiClient.getMe(), }); const mutation = useMutation({ mutationFn: apiClient.login, onSuccess: (response) => { setUser(response.user); queryClient.setQueryData(["auth", "me"], response); navigate("/dashboard"); }, onError: (err) => setError(err instanceof Error ? err.message : "Login gagal"), }); // Show loading spinner while OAuth token is being processed if (oauthProcessing) { return (

Menyelesaikan login dengan Google...

); } return (
{ setError(null); return mutation.mutateAsync({ email, password }); }} onFieldChange={() => setError(null)} />

Belum punya akun?{" "} Daftar

); }