32 lines
890 B
TypeScript
32 lines
890 B
TypeScript
import { useQuery } from '@tanstack/react-query';
|
|
import { useEffect } from 'react';
|
|
|
|
import { fetchUserData } from '@/api';
|
|
import { useAuth } from '@/auth/AuthContext';
|
|
import { ApiError } from '@/errors';
|
|
import { queryKeys } from '@/queries/queryKeys';
|
|
|
|
/** The logged in user. */
|
|
export function useUser() {
|
|
const { token, signOut } = useAuth();
|
|
|
|
const query = useQuery({
|
|
queryKey: queryKeys.user,
|
|
queryFn: () => fetchUserData(token as string),
|
|
enabled: !!token,
|
|
// staleTime 0: the cached user renders immediately while a refetch runs
|
|
// in the background on mount
|
|
staleTime: 0,
|
|
});
|
|
|
|
// Revoked token (401) → sign out; network errors never do
|
|
const { error } = query;
|
|
useEffect(() => {
|
|
if (error instanceof ApiError && error.status === 401) {
|
|
signOut();
|
|
}
|
|
}, [error, signOut]);
|
|
|
|
return { ...query, user: query.data ?? null };
|
|
}
|