import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useAuthToken } from "./use-root-data"; import { getApiBaseUrl } from "~/utils/api-config"; // The API returns these as camelCase (DRF's global camel-case renderer converts // the snake_case source names). Match the wire shape here so reads aren't // silently undefined. export interface BadgeCounts { chat: number; sellerChat: Record; orderUpdates: number; sellerOrders: number; } const EMPTY: BadgeCounts = { chat: 0, sellerChat: {}, orderUpdates: 0, sellerOrders: 0, }; export const badgeKeys = { all: ["notif-badges"] as const, }; /** * Polls unread counts for the nav badges (chat / buyer order updates / seller * new orders). Lightweight: a single endpoint, refetched on an interval and * when the tab regains focus. */ export function useBadgeCounts() { const token = useAuthToken(); const apiBase = getApiBaseUrl(); return useQuery({ queryKey: badgeKeys.all, enabled: !!token, refetchInterval: 30000, refetchOnWindowFocus: true, queryFn: async (): Promise => { if (!token) return EMPTY; const res = await fetch(`${apiBase}/api/notif/v1/badges/`, { headers: { Authorization: `Bearer ${token}` }, }); if (!res.ok) return EMPTY; return (await res.json()) as BadgeCounts; }, }); } /** * Marks a badge category ("order_updates" | "seller_orders") as read, then * refreshes the counts. Chat clears via the existing per-thread read flow. */ export function useMarkBadgeRead() { const token = useAuthToken(); const apiBase = getApiBaseUrl(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async (category: "order_updates" | "seller_orders") => { if (!token) return; await fetch(`${apiBase}/api/notif/v1/badges/mark-read/`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify({ category }), }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: badgeKeys.all }); }, }); }