diff --git a/apps/dispatch-server/routes/aircraft.ts b/apps/dispatch-server/routes/aircraft.ts index ba5c8f7d..c3ff5d44 100644 --- a/apps/dispatch-server/routes/aircraft.ts +++ b/apps/dispatch-server/routes/aircraft.ts @@ -83,6 +83,7 @@ router.patch("/:id", async (req, res) => { data: { stationId: updatedConnectedAircraft.stationId, aircraftId: updatedConnectedAircraft.id, + userId: updatedConnectedAircraft.userId, }, } as NotificationPayload); } diff --git a/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx b/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx index 689cbbde..dbed6bb3 100644 --- a/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx +++ b/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx @@ -3,7 +3,9 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { BaseNotification } from "_components/customToasts/BaseNotification"; import { FMS_STATUS_COLORS } from "_helpers/fmsStatusColors"; import { editConnectedAircraftAPI, getConnectedAircraftsAPI } from "_querys/aircrafts"; +import { getLivekitRooms } from "_querys/livekit"; import { getStationsAPI } from "_querys/stations"; +import { useAudioStore } from "_store/audioStore"; import { useMapStore } from "_store/mapStore"; import { X } from "lucide-react"; import { useEffect, useRef, useState } from "react"; @@ -20,6 +22,23 @@ export const StatusToast = ({ event, t }: { event: StationStatus; t: Toast }) => const status5Sounds = useRef(null); const status9Sounds = useRef(null); + const { data: livekitRooms } = useQuery({ + queryKey: ["livekit-rooms"], + queryFn: () => getLivekitRooms(), + refetchInterval: 10000, + }); + const audioRoom = useAudioStore((s) => s.room?.name); + + const participants = + livekitRooms?.flatMap((room) => + room.participants.map((p) => ({ + ...p, + roomName: room.room.name, + })), + ) || []; + + const livekitUser = participants.find((p) => p.attributes.userId === event.data?.userId); + useEffect(() => { if (typeof window !== "undefined") { status0Sounds.current = new Audio("/sounds/status-0.mp3"); @@ -83,6 +102,11 @@ export const StatusToast = ({ event, t }: { event: StationStatus; t: Toast }) => default: soundRef = null; } + if (audioRoom !== livekitUser?.roomName) { + toast.remove(t.id); + return; + } + if (soundRef?.current) { soundRef.current.currentTime = 0; soundRef.current.volume = 0.7; @@ -94,15 +118,15 @@ export const StatusToast = ({ event, t }: { event: StationStatus; t: Toast }) => soundRef.current.currentTime = 0; } }; - }, [event.status]); + }, [event.status, livekitUser?.roomName, audioRoom, t.id]); if (!connectedAircraft || !station) return null; return ( -
+

{ if (!connectedAircraft.posLat || !connectedAircraft.posLng) return; mapStore.setOpenAircraftMarker({ @@ -119,12 +143,12 @@ export const StatusToast = ({ event, t }: { event: StationStatus; t: Toast }) => sendet Status {event.status}

-
+
{QUICK_RESPONSE[String(event.status)]?.map((status) => (