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(); 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(); 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(); return response; }, }); } /** * Хук для логаута */ export function useLogout() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async () => { await api.post("auth/logout").json(); }, onSuccess: () => { // Удаляем токен localStorage.removeItem("authToken"); // Очищаем кэш queryClient.clear(); }, }); }