From aded6d14926584b77eb18d5cd62456347cd5b229 Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Sun, 8 Feb 2026 13:03:11 +0100 Subject: [PATCH] HPG Warnung in Dispatch Settings, Status Notification --- apps/core-server/routes/member.ts | 4 +-- apps/dispatch-server/modules/discord.ts | 22 +++++++++++---- apps/dispatch-server/routes/aircraft.ts | 10 +++++++ .../dispatch/_components/navbar/Settings.tsx | 28 ++++++++++++++----- .../customToasts/StationStatusToast.tsx | 2 +- apps/dispatch/app/_store/audioStore.ts | 22 +++++++++++---- apps/hub-server/modules/mail.ts | 4 ++- .../app/(app)/settings/_components/forms.tsx | 7 +++-- .../(auth)/register/_components/Register.tsx | 4 +-- 9 files changed, 78 insertions(+), 25 deletions(-) diff --git a/apps/core-server/routes/member.ts b/apps/core-server/routes/member.ts index 37ef0d76..4aa7f1e9 100644 --- a/apps/core-server/routes/member.ts +++ b/apps/core-server/routes/member.ts @@ -45,7 +45,7 @@ router.post("/rename", async (req: Request, res: Response) => { console.log(`Member ${member.id} renamed to ${newName}`); res.status(200).json({ message: "Member renamed successfully" }); } catch (error) { - console.error("Error renaming member:", error); + console.error("Error renaming member:", (error as Error).message); res.status(500).json({ error: "Failed to rename member" }); } }); @@ -84,7 +84,7 @@ const handleRoleChange = (action: "add" | "remove") => async (req: Request, res: const result = await changeMemberRoles(memberId, roleIds, action); res.status(200).json(result); } catch (error) { - console.error(`Error ${action}ing roles:`, error); + console.error(`Error ${action}ing roles:`, (error as Error).message); res.status(500).json({ error: `Failed to ${action} roles` }); } }; diff --git a/apps/dispatch-server/modules/discord.ts b/apps/dispatch-server/modules/discord.ts index e8a0fb4e..311c3d9f 100644 --- a/apps/dispatch-server/modules/discord.ts +++ b/apps/dispatch-server/modules/discord.ts @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios, { AxiosError } from "axios"; const discordAxiosClient = axios.create({ baseURL: process.env.CORE_SERVER_URL, @@ -11,7 +11,10 @@ export const renameMember = async (memberId: string, newName: string) => { newName, }) .catch((error) => { - console.error("Error renaming member:", error); + console.error( + "Error renaming member:", + (error as AxiosError<{ error: string }>).response?.data.error || error.message, + ); }); }; @@ -22,7 +25,10 @@ export const addRolesToMember = async (memberId: string, roleIds: string[]) => { roleIds, }) .catch((error) => { - console.error("Error adding roles to member:", error); + console.error( + "Error adding roles to member:", + (error as AxiosError<{ error: string }>).response?.data.error || error.message, + ); }); }; @@ -33,7 +39,10 @@ export const removeRolesFromMember = async (memberId: string, roleIds: string[]) roleIds, }) .catch((error) => { - console.error("Error removing roles from member:", error); + console.error( + "Error removing roles from member:", + (error as AxiosError<{ error: string }>).response?.data.error || error.message, + ); }); }; @@ -43,6 +52,9 @@ export const sendReportEmbed = async (reportId: number) => { reportId, }) .catch((error) => { - console.error("Error removing roles from member:", error); + console.error( + "Error removing roles from member:", + (error as AxiosError<{ error: string }>).response?.data.error || error.message, + ); }); }; diff --git a/apps/dispatch-server/routes/aircraft.ts b/apps/dispatch-server/routes/aircraft.ts index fa665438..b1f4677b 100644 --- a/apps/dispatch-server/routes/aircraft.ts +++ b/apps/dispatch-server/routes/aircraft.ts @@ -154,6 +154,15 @@ router.post("/:id/send-sds-message", async (req, res) => { }, }); + const user = await prisma.user.findFirst({ + where: { publicId: sdsMessage.data.user.publicId, firstname: sdsMessage.data.user.firstname }, + }); + + if (!user) { + res.status(404).json({ error: "User not found" }); + return; + } + io.to( sdsMessage.data.direction === "to-lst" ? "dispatchers" : `station:${sdsMessage.data.stationId}`, ).emit(sdsMessage.data.direction === "to-lst" ? "notification" : "sds-status", { @@ -163,6 +172,7 @@ router.post("/:id/send-sds-message", async (req, res) => { data: { aircraftId: parseInt(id), stationId: sdsMessage.data.stationId, + userId: user.id, }, } as NotificationPayload); diff --git a/apps/dispatch/app/(app)/dispatch/_components/navbar/Settings.tsx b/apps/dispatch/app/(app)/dispatch/_components/navbar/Settings.tsx index d2a7402d..04936372 100644 --- a/apps/dispatch/app/(app)/dispatch/_components/navbar/Settings.tsx +++ b/apps/dispatch/app/(app)/dispatch/_components/navbar/Settings.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useRef, useState } from "react"; import { GearIcon } from "@radix-ui/react-icons"; -import { SettingsIcon, Volume2 } from "lucide-react"; +import { Info, SettingsIcon, Volume2 } from "lucide-react"; import MicVolumeBar from "_components/MicVolumeIndication"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { editUserAPI, getUserAPI } from "_querys/user"; @@ -27,7 +27,6 @@ export const SettingsBtn = () => { onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: ["user", session.data?.user.id] }); }, - }); useEffect(() => { @@ -82,10 +81,14 @@ export const SettingsBtn = () => { useEffect(() => { const setDevices = async () => { if (typeof navigator !== "undefined" && navigator.mediaDevices?.enumerateDevices) { - const stream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true }); - const devices = await navigator.mediaDevices.enumerateDevices(); - setInputDevices(devices.filter((d) => d.kind === "audioinput")); - stream.getTracks().forEach((track) => track.stop()); + try { + const stream = await navigator.mediaDevices.getUserMedia({ video: false, audio: true }); + const devices = await navigator.mediaDevices.enumerateDevices(); + setInputDevices(devices.filter((d) => d.kind === "audioinput")); + stream.getTracks().forEach((track) => track.stop()); + } catch (error) { + console.error("Error accessing media devices.", error); + } } }; @@ -214,7 +217,18 @@ export const SettingsBtn = () => { setSettingsPartial({ useHPGAsDispatcher: e.target.checked }); }} /> - HPG als Disponent verwenden + HPG Validierung verwenden{" "} +