70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
/**
|
|
* @ai-summary React hooks for user profile management
|
|
*/
|
|
|
|
import React from 'react';
|
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import { useAuth0 } from '@auth0/auth0-react';
|
|
import { profileApi } from '../api/profile.api';
|
|
import { UpdateProfileRequest } from '../types/profile.types';
|
|
import toast from 'react-hot-toast';
|
|
|
|
interface ApiError {
|
|
response?: {
|
|
data?: {
|
|
error?: string;
|
|
};
|
|
};
|
|
message?: string;
|
|
}
|
|
|
|
export const useProfile = () => {
|
|
const { isAuthenticated, isLoading } = useAuth0();
|
|
|
|
const query = useQuery({
|
|
queryKey: ['user-profile'],
|
|
queryFn: async () => {
|
|
const response = await profileApi.getProfile();
|
|
return response.data;
|
|
},
|
|
enabled: isAuthenticated && !isLoading,
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
gcTime: 10 * 60 * 1000, // 10 minutes cache time
|
|
retry: (failureCount, error: any) => {
|
|
if (error?.response?.status === 401 && failureCount < 3) {
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
refetchOnWindowFocus: false,
|
|
refetchOnMount: false,
|
|
});
|
|
|
|
React.useEffect(() => {
|
|
if (query.data) {
|
|
console.log('[useProfile] Profile loaded successfully');
|
|
}
|
|
if (query.error) {
|
|
console.error('[useProfile] Error loading profile:', query.error);
|
|
}
|
|
}, [query.data, query.error]);
|
|
|
|
return query;
|
|
};
|
|
|
|
export const useUpdateProfile = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: UpdateProfileRequest) => profileApi.updateProfile(data),
|
|
onSuccess: (response) => {
|
|
queryClient.setQueryData(['user-profile'], response.data);
|
|
toast.success('Profile updated successfully');
|
|
},
|
|
onError: (error: ApiError) => {
|
|
toast.error(error.response?.data?.error || 'Failed to update profile');
|
|
},
|
|
});
|
|
};
|