91 lines
2.5 KiB
TypeScript
Raw Normal View History

/**
* Notification Hooks
*
* React Query hooks for managing notifications.
*/
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { notificationService } from "../api/notification.api";
const NOTIFICATION_QUERY_KEY = ["notifications"];
const UNREAD_COUNT_QUERY_KEY = ["notifications", "unread-count"];
/**
* Hook to fetch notifications
*/
export function useNotifications(options?: {
limit?: number;
includeRead?: boolean;
enabled?: boolean;
}) {
return useQuery({
queryKey: [...NOTIFICATION_QUERY_KEY, "list", options?.limit, options?.includeRead],
queryFn: () =>
notificationService.getNotifications({
limit: options?.limit ?? 10,
includeRead: options?.includeRead ?? true,
}),
staleTime: 30 * 1000, // 30 seconds
enabled: options?.enabled ?? true,
});
}
/**
* Hook to get unread notification count
*/
export function useUnreadNotificationCount(enabled = true) {
return useQuery({
queryKey: UNREAD_COUNT_QUERY_KEY,
queryFn: () => notificationService.getUnreadCount(),
staleTime: 30 * 1000, // 30 seconds
refetchInterval: 60 * 1000, // Refetch every minute
enabled,
});
}
/**
* Hook to mark a notification as read
*/
export function useMarkNotificationAsRead() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (notificationId: string) => notificationService.markAsRead(notificationId),
onSuccess: () => {
// Invalidate both queries
void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEY });
void queryClient.invalidateQueries({ queryKey: UNREAD_COUNT_QUERY_KEY });
},
});
}
/**
* Hook to mark all notifications as read
*/
export function useMarkAllNotificationsAsRead() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: () => notificationService.markAllAsRead(),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEY });
void queryClient.invalidateQueries({ queryKey: UNREAD_COUNT_QUERY_KEY });
},
});
}
/**
* Hook to dismiss a notification
*/
export function useDismissNotification() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (notificationId: string) => notificationService.dismiss(notificationId),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: NOTIFICATION_QUERY_KEY });
void queryClient.invalidateQueries({ queryKey: UNREAD_COUNT_QUERY_KEY });
},
});
}