86 lines
2.0 KiB
TypeScript
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();
|
|
},
|
|
});
|
|
}
|