Files
stream.graff.tech-new/client/src/hooks/useAuth.ts
T
2025-10-03 15:43:22 +05:00

86 lines
2.0 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { api } from "../lib/api";
import type {
LoginData,
RegisterData,
LoginResponse,
RegisterResponse,
MeResponse,
} from "../types/auth";
// Query keys
export const authKeys = {
me: ["auth", "me"] as const,
};
/**
* Хук для получения текущего пользователя
*/
export function useMe() {
return useQuery({
queryKey: authKeys.me,
queryFn: async () => {
const data = await api.get("auth/me").json<MeResponse>();
return data.user;
},
enabled: !!localStorage.getItem("authToken"), // Запрос только если есть токен
});
}
/**
* Хук для логина
*/
export function useLogin() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (data: LoginData) => {
const response = await api
.post("auth/login", { json: data })
.json<LoginResponse>();
return response;
},
onSuccess: (data) => {
// Сохраняем токен в localStorage
localStorage.setItem("authToken", data.session.token);
// Обновляем кэш текущего пользователя
queryClient.setQueryData(authKeys.me, data.user);
},
});
}
/**
* Хук для регистрации
*/
export function useRegister() {
return useMutation({
mutationFn: async (data: RegisterData) => {
const response = await api
.post("auth/register", { json: data })
.json<RegisterResponse>();
return response;
},
});
}
/**
* Хук для логаута
*/
export function useLogout() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async () => {
await api.post("auth/logout").json();
},
onSuccess: () => {
// Удаляем токен
localStorage.removeItem("authToken");
// Очищаем кэш
queryClient.clear();
},
});
}