49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { useNavigate } from 'react-router';
|
|
import { useAuth } from '../providers/AuthProvider';
|
|
import { useApi } from '../providers/ApiProvider';
|
|
import { useQuery } from '@tanstack/react-query';
|
|
import { useResponseErrorHandler } from './ResponseHelper';
|
|
|
|
export type EnsureLoggedInResult = {
|
|
checking: boolean;
|
|
loggedIn: boolean;
|
|
};
|
|
|
|
export function useEnsureLoggedIn(): EnsureLoggedInResult {
|
|
const { user, setUser } = useAuth();
|
|
const navigate = useNavigate();
|
|
const { tanstackApiClient } = useApi();
|
|
const { defaultResponseErrorHandler } = useResponseErrorHandler();
|
|
|
|
const { queryOptions: currentUserQuery } = tanstackApiClient.get('/api/user/me');
|
|
const { isFetched, isPending } = useQuery({
|
|
...currentUserQuery,
|
|
queryFn: async (...args) => {
|
|
try {
|
|
const data = await currentUserQuery.queryFn!(...args);
|
|
setUser({
|
|
id: data.id,
|
|
name: data.username,
|
|
});
|
|
return data;
|
|
} catch (error) {
|
|
if (defaultResponseErrorHandler(error)) return {} as never;
|
|
throw error;
|
|
}
|
|
},
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (user) {
|
|
navigate('/', { replace: true });
|
|
return;
|
|
}
|
|
}, [user, setUser, navigate]);
|
|
|
|
return {
|
|
checking: isPending,
|
|
loggedIn: isFetched && !!user,
|
|
};
|
|
}
|