/** * 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 }); }, }); }