Notification updates

This commit is contained in:
Eric Gullickson
2025-12-21 19:56:52 -06:00
parent 144f1d5bb0
commit 719c80ecd8
80 changed files with 7552 additions and 678 deletions

View File

@@ -0,0 +1,69 @@
/**
* @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');
},
});
};