MCPcopy Create free account
hub / github.com/CodeFox-Repo/codefox / AuthProvider

Function AuthProvider

frontend/src/providers/AuthProvider.tsx:43–210  ·  view source on GitHub ↗
({ children }: { children: React.ReactNode })

Source from the content-addressed store, hash-verified

41 user: null,
42 isAdmin: false,
43 login: () => {},
44 logout: async () => {},
45 refreshAccessToken: async () => {},
46 validateToken: async () => false,
47 refreshUserInfo: async () => false,
48});
49
50export function AuthProvider({ children }: { children: React.ReactNode }) {
51 const [token, setToken] = useState<string | null>(null);
52 const [isAuthorized, setIsAuthorized] = useState(false);
53 const [isLoading, setIsLoading] = useState(true);
54 const [user, setUser] = useState<User | null>(null);
55 const [roles, setRoles] = useState<string[]>([]);
56 const router = useRouter();
57
58 const [checkToken] = useLazyQuery<{ checkToken: boolean }>(CHECK_TOKEN_QUERY);
59 const [refreshTokenMutation] = useMutation(REFRESH_TOKEN_MUTATION);
60 const [getUserInfo] = useLazyQuery<{ me: User }>(GET_USER_INFO);
61 const [getMyRoles] = useLazyQuery<{ myRoles: string[] }>(GET_MY_ROLES);
62 // no-cache: a cached `true` would skip the network on the second logout of a
63 // session and leave that token live.
64 const [logoutQuery] = useLazyQuery<{ logout: boolean }>(LOGOUT, {
65 fetchPolicy: 'no-cache',
66 });
67
68 const validateToken = useCallback(async () => {
69 const storedToken = localStorage.getItem(LocalStore.accessToken);
70 if (!storedToken) {
71 setIsAuthorized(false);
72 setUser(null);
73 return false;
74 }
75 try {
76 const { data } = await checkToken({
77 variables: { input: { token: storedToken } },
78 });
79 if (data?.checkToken) {
80 setToken(storedToken);
81 return true;
82 }
83 return false;
84 } catch (error) {
85 logger.error('Token validation error:', error);
86 return false;
87 }
88 }, [checkToken]);
89
90 const fetchUserInfo = useCallback(async () => {
91 try {
92 const { data } = await getUserInfo();
93 if (data?.me) {
94 setUser(data.me);
95 // Alongside rather than inside `me`: roles are a separate guarded
96 // query now. A failure here only costs the Admin link.
97 getMyRoles()
98 .then(({ data: r }) => setRoles(r?.myRoles ?? []))
99 .catch(() => setRoles([]));
100 return true;

Callers

nothing calls this directly

Calls 1

initAuthFunction · 0.85

Tested by

no test coverage detected