useAuth.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. "use client";
  2. import { useCallback, useEffect, useState } from "react";
  3. import { useRouter } from "next/navigation";
  4. import type { AgentUser } from "../../agent/types";
  5. import { logout } from "../../agent/services/authApi";
  6. import { clearAgentUser, getAgentUser, getAgentWSToken } from "@/utils/storage";
  7. export function useAuth() {
  8. const router = useRouter();
  9. const [agent, setAgent] = useState<AgentUser | null>(null);
  10. const [loading, setLoading] = useState(true);
  11. useEffect(() => {
  12. const current = getAgentUser();
  13. if (!current) {
  14. setLoading(false);
  15. router.push("/agent/login");
  16. return;
  17. }
  18. // 客服端实时链路依赖 ws_token;缺失/过期时强制重新登录,避免前端持续 401 重连且功能失效。
  19. if (!getAgentWSToken()) {
  20. clearAgentUser();
  21. setLoading(false);
  22. router.push("/agent/login");
  23. return;
  24. }
  25. setAgent(current);
  26. setLoading(false);
  27. }, [router]);
  28. const handleLogout = useCallback(async () => {
  29. try {
  30. await logout();
  31. } catch (error) {
  32. console.error("退出登录失败:", error);
  33. } finally {
  34. clearAgentUser();
  35. router.push("/");
  36. }
  37. }, [router]);
  38. return {
  39. agent,
  40. loading,
  41. isAuthenticated: Boolean(agent),
  42. logout: handleLogout,
  43. };
  44. }