/** * 认证相关 Hooks */ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useNavigate } from "react-router-dom"; import * as authApi from "@/api/auth"; import { useAuthStore } from "@/store/authStore"; // 登录 Hook export const useLogin = () => { const navigate = useNavigate(); const setAuth = useAuthStore((state) => state.setAuth); const mutation = useMutation({ mutationFn: authApi.login, }); // 手动处理成功后的逻辑 const login = async (credentials: Parameters[0]) => { const data = await mutation.mutateAsync(credentials); const refreshToken = data.refresh_token ?? null; // 先保存 token localStorage.setItem("access_token", data.access_token); if (refreshToken) { localStorage.setItem("refresh_token", refreshToken); } else { localStorage.removeItem("refresh_token"); } // 获取用户信息 const user = await authApi.getCurrentUser(); setAuth(user, data.access_token, refreshToken); navigate("/"); return data; }; return { ...mutation, mutateAsync: login }; }; // 注册 Hook export const useRegister = () => { const navigate = useNavigate(); const mutation = useMutation({ mutationFn: authApi.register, }); const register = async (data: Parameters[0]) => { const result = await mutation.mutateAsync(data); navigate("/login", { state: { message: "注册成功!请查收验证邮件。" }, }); return result; }; return { ...mutation, mutateAsync: register }; }; // 登出 Hook export const useLogout = () => { const navigate = useNavigate(); const clearAuth = useAuthStore((state) => state.clearAuth); const queryClient = useQueryClient(); const mutation = useMutation({ mutationFn: authApi.logout, }); const logout = async () => { try { await mutation.mutateAsync(); } catch (error) { // 即使登出失败也清除本地状态 } finally { clearAuth(); queryClient.clear(); navigate("/"); } }; return { ...mutation, mutateAsync: logout }; }; // 获取当前用户 Hook export const useCurrentUser = () => { const isAuthenticated = useAuthStore((state) => state.isAuthenticated); return useQuery({ queryKey: ["currentUser"], queryFn: authApi.getCurrentUser, enabled: isAuthenticated, }); };