Files
zeavis-edu/apps/web/src/pages/login-page.tsx
T

55 lines
1.7 KiB
TypeScript
Raw Normal View History

import { useState } 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 } from "@/lib/api-client";
import { useAuthStore } from "@/store/auth-store";
2026-05-22 16:51:01 +00:00
export function LoginPage() {
const navigate = useNavigate();
const queryClient = useQueryClient();
const setUser = useAuthStore((state) => state.setUser);
const [error, setError] = useState<string | null>(null);
const meQuery = useQuery({
queryKey: ["auth", "me"],
queryFn: () => apiClient.getMe(),
});
2026-05-22 16:51:01 +00:00
const mutation = useMutation({
mutationFn: apiClient.login,
onSuccess: (response) => {
setUser(response.user);
queryClient.setQueryData(["auth", "me"], response);
navigate("/dashboard");
2026-05-22 16:51:01 +00:00
},
onError: (err) =>
setError(err instanceof Error ? err.message : "Login gagal"),
2026-05-22 16:51:01 +00:00
});
return (
<main className="flex min-h-screen items-center justify-center px-6 py-12">
<div className="w-full max-w-sm md:max-w-md space-y-4">
2026-05-22 16:51:01 +00:00
<AuthForm
mode="login"
isSubmitting={mutation.isPending}
error={error}
googleOAuthEnabled={Boolean(
meQuery.data?.features.googleOAuthEnabled,
)}
2026-05-22 16:55:47 +00:00
onSubmit={async ({ email, password }) => {
setError(null);
return mutation.mutateAsync({ email, password });
}}
onFieldChange={() => setError(null)}
2026-05-22 16:51:01 +00:00
/>
<p className="text-center text-sm text-muted-foreground">
Belum punya akun?{" "}
<Link className="text-primary" to="/register">
Daftar
</Link>
2026-05-22 16:51:01 +00:00
</p>
</div>
</main>
);
}