// 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 "(app)/dispatch/socket"; import { NotificationPayload } from "@repo/db"; import { HPGnotificationToast } from "_components/customToasts/HPGnotification"; import { useMapStore } from "_store/mapStore"; import { AdminMessageToast } from "_components/customToasts/AdminMessage"; import { pilotSocket } from "(app)/pilot/socket"; import { QUICK_RESPONSE, StatusToast } from "_components/customToasts/StationStatusToast"; 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 = () => { queryClient.invalidateQueries({ queryKey: ["missions"], }); }; const invalidateConnectedUsers = () => { queryClient.invalidateQueries({ queryKey: ["connected-users"], }); queryClient.invalidateQueries({ queryKey: ["aircrafts"], }); queryClient.invalidateQueries({ queryKey: ["dispatchers"], }); }; const invalidateConenctedAircrafts = () => { queryClient.invalidateQueries({ queryKey: ["aircrafts"], }); queryClient.invalidateQueries({ queryKey: ["missions"], }); }; const handleNotification = (notification: NotificationPayload) => { switch (notification.type) { case "hpg-validation": toast.custom( (t) => , { duration: 15000, }, ); break; case "admin-message": toast.custom((t) => , { duration: 999999, }); break; case "station-status": if (!QUICK_RESPONSE[notification.status]) return; toast.custom((e) => , { duration: 60000, }); break; default: toast("unbekanntes Notification-Event"); 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); pilotSocket.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); pilotSocket.off("notification", handleNotification); }; }, [queryClient, mapStore]); return {children}; }