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{" "} +
+ +
diff --git a/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx b/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx index a3d3b64a..beb7ff06 100644 --- a/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx +++ b/apps/dispatch/app/_components/customToasts/StationStatusToast.tsx @@ -78,6 +78,7 @@ export const StatusToast = ({ event, t }: { event: StationStatus; t: Toast }) => }); }, }); + console.log("Audio Room:", audioRoom, participants, livekitUser, event); useEffect(() => { let soundRef: React.RefObject | null = null; @@ -113,7 +114,6 @@ export const StatusToast = ({ event, t }: { event: StationStatus; t: Toast }) => }; }, [event.status, livekitUser?.roomName, audioRoom, t.id]); - console.log(connectedAircraft, station); if (!connectedAircraft || !station || !session.data) return null; return ( diff --git a/apps/dispatch/app/_store/audioStore.ts b/apps/dispatch/app/_store/audioStore.ts index 72aabd9f..77768838 100644 --- a/apps/dispatch/app/_store/audioStore.ts +++ b/apps/dispatch/app/_store/audioStore.ts @@ -201,11 +201,23 @@ export const useAudioStore = create((set, get) => ({ }); } - const inputStream = await navigator.mediaDevices.getUserMedia({ - audio: { - deviceId: get().settings.micDeviceId ?? undefined, - }, - }); + let inputStream = await navigator.mediaDevices + .getUserMedia({ + audio: { + deviceId: get().settings.micDeviceId ?? undefined, + }, + }) + .catch((e) => { + console.error("Konnte das Audio-Gerät nicht öffnen:", e); + return null; + }); + if (!inputStream) { + inputStream = await navigator.mediaDevices.getUserMedia({ audio: true }).catch((e) => { + console.error("Konnte das Audio-Gerät nicht öffnen:", e); + return null; + }); + } + if (!inputStream) throw new Error("Konnte das Audio-Gerät nicht öffnen"); // Funk-Effekt anwenden const radioStream = getRadioStream(inputStream, get().settings.micVolume); if (!radioStream) throw new Error("Konnte Funkstream nicht erzeugen"); diff --git a/apps/hub-server/modules/mail.ts b/apps/hub-server/modules/mail.ts index d8d0beeb..fabf48fa 100644 --- a/apps/hub-server/modules/mail.ts +++ b/apps/hub-server/modules/mail.ts @@ -5,6 +5,7 @@ import { renderPasswordChanged } from "./mail-templates/PasswordChanged"; import { renderVerificationCode } from "./mail-templates/ConfirmEmail"; import { renderBannNotice } from "modules/mail-templates/Bann"; import { renderTimeBanNotice } from "modules/mail-templates/TimeBann"; +import Mail from "nodemailer/lib/mailer"; let transporter: nodemailer.Transporter | null = null; @@ -23,8 +24,9 @@ const initTransporter = () => { pass: process.env.MAIL_PASSWORD, }, }); + transporter.on("error", (err) => { - console.error("Mail occurred:", err); + console.error("Mail error:", err); }); transporter.on("idle", () => { console.log("Mail Idle"); diff --git a/apps/hub/app/(app)/settings/_components/forms.tsx b/apps/hub/app/(app)/settings/_components/forms.tsx index e1739cab..580de74c 100644 --- a/apps/hub/app/(app)/settings/_components/forms.tsx +++ b/apps/hub/app/(app)/settings/_components/forms.tsx @@ -407,8 +407,11 @@ export const DeleteForm = ({ export const PasswordForm = (): React.JSX.Element => { const schema = z.object({ password: z.string().min(2).max(30), - newPassword: z.string().min(2).max(30), - newPasswordConfirm: z.string().min(2).max(30), + newPassword: z + .string() + .min(8, { message: "Das Passwort muss mindestens 8 Zeichen lang sein" }) + .max(30), + newPasswordConfirm: z.string().min(8).max(30), }); const [isLoading, setIsLoading] = useState(false); type IFormInput = z.infer; diff --git a/apps/hub/app/(auth)/register/_components/Register.tsx b/apps/hub/app/(auth)/register/_components/Register.tsx index 11aad2b8..8c99aa67 100644 --- a/apps/hub/app/(auth)/register/_components/Register.tsx +++ b/apps/hub/app/(auth)/register/_components/Register.tsx @@ -49,8 +49,8 @@ export const Register = () => { .refine((val) => val.length === 0 || val.includes(" ") || /^[A-ZÄÖÜ]/.test(val), { message: "Der Nachname muss mit einem Großbuchstaben beginnen", }), - password: z.string().min(12, { - message: "Das Passwort muss mindestens 12 Zeichen lang sein", + password: z.string().min(8, { + message: "Das Passwort muss mindestens 8 Zeichen lang sein", }), passwordConfirm: z.string(), })