From 859b8519db0dbb3397e0f1700ef8b1c1ce04af45 Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Sat, 4 Oct 2025 19:53:56 +0200 Subject: [PATCH] closes #136 --- apps/dispatch-server/modules/mission.ts | 13 ++++-- apps/dispatch-server/routes/mission.ts | 17 ++++---- apps/dispatch/app/(app)/pilot/page.tsx | 46 ++++++++++++++++++++-- apps/dispatch/app/_querys/missions.ts | 3 ++ apps/dispatch/app/_store/pilot/dmeStore.ts | 4 +- 5 files changed, 68 insertions(+), 15 deletions(-) diff --git a/apps/dispatch-server/modules/mission.ts b/apps/dispatch-server/modules/mission.ts index 4f9fe07c..bebb8aee 100644 --- a/apps/dispatch-server/modules/mission.ts +++ b/apps/dispatch-server/modules/mission.ts @@ -6,8 +6,10 @@ export const sendAlert = async ( id: number, { stationId, + desktopOnly, }: { stationId?: number; + desktopOnly?: boolean; }, user: User | "HPG", ): Promise<{ @@ -46,10 +48,13 @@ export const sendAlert = async ( }); for (const aircraft of connectedAircrafts) { - io.to(`station:${aircraft.stationId}`).emit("mission-alert", { - ...mission, - Stations, - }); + if (!desktopOnly) { + io.to(`station:${aircraft.stationId}`).emit("mission-alert", { + ...mission, + Stations, + }); + } + io.to(`desktop:${aircraft.userId}`).emit("mission-alert", { missionId: mission.id, }); diff --git a/apps/dispatch-server/routes/mission.ts b/apps/dispatch-server/routes/mission.ts index e487e59f..3c6f906c 100644 --- a/apps/dispatch-server/routes/mission.ts +++ b/apps/dispatch-server/routes/mission.ts @@ -113,9 +113,10 @@ router.delete("/:id", async (req, res) => { router.post("/:id/send-alert", async (req, res) => { const { id } = req.params; - const { stationId, vehicleName } = req.body as { + const { stationId, vehicleName, desktopOnly } = req.body as { stationId?: number; vehicleName?: "RTW" | "POL" | "FW"; + desktopOnly?: boolean; }; if (!req.user) { @@ -180,7 +181,11 @@ router.post("/:id/send-alert", async (req, res) => { return; } - const { connectedAircrafts, mission } = await sendAlert(Number(id), { stationId }, req.user); + const { connectedAircrafts, mission } = await sendAlert( + Number(id), + { stationId, desktopOnly }, + req.user, + ); io.to("dispatchers").emit("update-mission", mission); res.status(200).json({ @@ -189,11 +194,9 @@ router.post("/:id/send-alert", async (req, res) => { return; } catch (error) { console.error(error); - res - .status(500) - .json({ - error: `Ein Fehler ist aufgetreten. Bitte melde den Fehler als Bug (${(error as Error).message})`, - }); + res.status(500).json({ + error: `Ein Fehler ist aufgetreten. Bitte melde den Fehler als Bug (${(error as Error).message})`, + }); return; } }); diff --git a/apps/dispatch/app/(app)/pilot/page.tsx b/apps/dispatch/app/(app)/pilot/page.tsx index ee521d3b..87322e21 100644 --- a/apps/dispatch/app/(app)/pilot/page.tsx +++ b/apps/dispatch/app/(app)/pilot/page.tsx @@ -6,14 +6,17 @@ import { Report } from "../../_components/left/Report"; import { Dme } from "(app)/pilot/_components/dme/Dme"; import dynamic from "next/dynamic"; import { ConnectedDispatcher } from "tracker/_components/ConnectedDispatcher"; -import { useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; import { usePilotConnectionStore } from "_store/pilot/connectionStore"; import { getConnectedAircraftsAPI } from "_querys/aircrafts"; -import { checkSimulatorConnected, useDebounce } from "@repo/shared-components"; +import { Button, checkSimulatorConnected, useDebounce } from "@repo/shared-components"; import { SimConnectionAlert } from "(app)/pilot/_components/SimConnectionAlert"; import { SettingsBoard } from "_components/left/SettingsBoard"; import { BugReport } from "_components/left/BugReport"; import { useEffect, useState } from "react"; +import { useDmeStore } from "_store/pilot/dmeStore"; +import { sendMissionAPI } from "_querys/missions"; +import toast from "react-hot-toast"; const Map = dynamic(() => import("_components/map/Map"), { ssr: false, @@ -21,12 +24,29 @@ const Map = dynamic(() => import("_components/map/Map"), { const PilotPage = () => { const { connectedAircraft, status } = usePilotConnectionStore((state) => state); + const { latestMission } = useDmeStore((state) => state); // Query will be cached anyway, due to this, displayed Markers are in sync with own Aircraft connection-warning const { data: aircrafts } = useQuery({ queryKey: ["aircrafts"], queryFn: () => getConnectedAircraftsAPI(), refetchInterval: 10_000, }); + const sendAlertMutation = useMutation({ + mutationKey: ["missions"], + mutationFn: (params: { + id: number; + stationId?: number | undefined; + vehicleName?: "RTW" | "POL" | "FW" | undefined; + desktopOnly?: boolean | undefined; + }) => sendMissionAPI(params.id, params), + onError: (error) => { + console.error(error); + toast.error("Fehler beim Alarmieren"); + }, + onSuccess: (data) => { + toast.success(data.message); + }, + }); const [shortlyConnected, setShortlyConnected] = useState(false); useDebounce( () => { @@ -76,7 +96,27 @@ const PilotPage = () => {