shoc-frontend-new/src/domain/auth/use-cases/use-login.ts

66 lines
2.1 KiB
TypeScript

import {
useMutation,
useQuery,
useQueryClient,
type QueryClient,
type UseMutationResult,
type UseQueryResult,
} from "@tanstack/react-query";
import { useNavigate } from "react-router";
import { toast } from "react-toastify";
import * as authApi from "@/domain/auth/api/auth-api";
import type { AuthUser, LoginCredentials } from "@/domain/auth/types/auth-user";
import { queryKeys } from "@/infra/query-key/query-key";
import { startQueryBroadcast, stopQueryBroadcast } from "@/lib/query/setup-query-broadcast";
export function useSession(): UseQueryResult<AuthUser | null, Error> {
return useQuery({
queryKey: queryKeys.auth.session(),
queryFn: authApi.getSession,
retry: false,
staleTime: 5 * 60 * 1000,
});
}
/** Makes a freshly stored session the signed-in user, after login or invite registration. */
export function startSignedInSession(queryClient: QueryClient, user: AuthUser): void {
stopQueryBroadcast(queryClient);
queryClient.setQueryData(queryKeys.auth.session(), user);
startQueryBroadcast(queryClient, user.id);
}
export function useLogin(): UseMutationResult<AuthUser, Error, LoginCredentials> {
const navigate = useNavigate();
const queryClient = useQueryClient();
return useMutation({
mutationFn: (credentials: LoginCredentials) => authApi.login(credentials),
meta: { suppressErrorToast: true },
onSuccess: (user) => {
startSignedInSession(queryClient, user);
toast.success("Login successful!");
navigate("/");
},
});
}
export function useLogout(): UseMutationResult<void, Error, void> {
const navigate = useNavigate();
const queryClient = useQueryClient();
return useMutation({
mutationFn: authApi.logout,
onSuccess: () => {
stopQueryBroadcast(queryClient);
queryClient.setQueryData(queryKeys.auth.session(), null);
toast.info("You have been logged out");
navigate("/login");
},
onError: (error: Error) => {
stopQueryBroadcast(queryClient);
queryClient.setQueryData(queryKeys.auth.session(), null);
toast.error(error.message || "Logout failed");
navigate("/login");
},
});
}