// components/TanstackProvider.tsx "use client"; import { toast } from "react-hot-toast"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactNode, useEffect, useState } from "react"; import { dispatchSocket } from "dispatch/socket"; import { Mission, NotificationPayload } from "@repo/db"; import { HPGnotificationToast } from "_components/customToasts/HPGnotification"; import { useMapStore } from "_store/mapStore"; export function QueryProvider({ children }: { children: ReactNode }) { const mapStore = useMapStore((s) => s); const [queryClient] = useState( () => new QueryClient({ defaultOptions: { mutations: { onError: (error) => { toast.error("An error occurred: " + (error as Error).message, { position: "top-right", }); }, }, }, }), ); useEffect(() => { const invalidateMission = (mission: Mission) => { queryClient.invalidateQueries({ queryKey: ["missions"], }); }; const invalidateConnectedUsers = () => { queryClient.invalidateQueries({ queryKey: ["connected-users"], }); queryClient.invalidateQueries({ queryKey: ["aircrafts"], }); }; const invalidateConenctedAircrafts = () => { console.log("invalidateConenctedAircrafts"); queryClient.invalidateQueries({ queryKey: ["aircrafts"], }); queryClient.invalidateQueries({ queryKey: ["missions"], }); }; const handleNotification = (notification: NotificationPayload) => { console.log("notification", notification); switch (notification.type) { case "hpg-validation": toast.custom( (t) => , { duration: 9999, }, ); break; default: toast(notification.message); break; } }; dispatchSocket.on("update-mission", invalidateMission); dispatchSocket.on("delete-mission", invalidateMission); dispatchSocket.on("new-mission", invalidateMission); dispatchSocket.on("dispatchers-update", invalidateConnectedUsers); dispatchSocket.on("pilots-update", invalidateConnectedUsers); dispatchSocket.on("update-connectedAircraft", invalidateConenctedAircrafts); dispatchSocket.on("notification", handleNotification); return () => { dispatchSocket.off("update-mission", invalidateMission); dispatchSocket.off("delete-mission", invalidateMission); dispatchSocket.off("new-mission", invalidateMission); dispatchSocket.off("dispatchers-update", invalidateConnectedUsers); dispatchSocket.off("pilots-update", invalidateConnectedUsers); dispatchSocket.off("update-connectedAircraft", invalidateConenctedAircrafts); dispatchSocket.off("notification", handleNotification); }; }, [queryClient, mapStore]); return {children}; }