60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import { fetchUser, fetchConnectUrl, disconnectUser } from "@/api";
|
|
|
|
export function useUser() {
|
|
const queryClient = useQueryClient();
|
|
|
|
const userQuery = useQuery({
|
|
queryKey: ["user"],
|
|
queryFn: async () => {
|
|
const result = await fetchUser();
|
|
return result;
|
|
},
|
|
staleTime: 5 * 60 * 1000, // Consider data stale after 5 minutes
|
|
gcTime: 10 * 60 * 1000, // Keep in cache for 10 minutes
|
|
retry: 10,
|
|
retryDelay: (attemptIndex) => Math.min(500 * attemptIndex, 2000),
|
|
refetchOnMount: true, // Always fetch when component mounts
|
|
});
|
|
|
|
// Mutation to refresh user data
|
|
const refreshUser = useMutation({
|
|
mutationFn: () => fetchUser(),
|
|
onSuccess: (data) => {
|
|
queryClient.setQueryData(["user"], data);
|
|
},
|
|
});
|
|
|
|
// Query for connect URL (only fetched when needed)
|
|
const connectUrlQuery = useQuery({
|
|
queryKey: ["connectUrl"],
|
|
queryFn: fetchConnectUrl,
|
|
enabled: false, // Don't fetch automatically
|
|
staleTime: Infinity, // Connect URL doesn't change
|
|
});
|
|
|
|
const disconnectMutation = useMutation({
|
|
mutationFn: disconnectUser,
|
|
onSuccess: () => {
|
|
queryClient.setQueryData(["user"], null);
|
|
},
|
|
});
|
|
|
|
const isLoading = userQuery.isLoading || userQuery.isFetching;
|
|
const isAuthenticated = Boolean(userQuery.data?.name);
|
|
|
|
return {
|
|
user: userQuery.data,
|
|
isLoading,
|
|
isError: userQuery.isError,
|
|
error: userQuery.error,
|
|
isAuthenticated,
|
|
refreshUser: refreshUser.mutate,
|
|
isRefreshing: refreshUser.isPending,
|
|
refetchUser: userQuery.refetch,
|
|
fetchConnectUrl: connectUrlQuery.refetch,
|
|
connectUrl: connectUrlQuery.data,
|
|
disconnectUser: disconnectMutation.mutate,
|
|
};
|
|
}
|