"use client"; import { PublicUser } from "@repo/db"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { PenaltyDropdown } from "@repo/shared-components"; import { getConnectedAircraftsAPI, kickAircraftAPI } from "_querys/aircrafts"; import { getConnectedDispatcherAPI, kickDispatcherAPI } from "_querys/dispatcher"; import { getLivekitRooms, kickLivekitParticipant } from "_querys/livekit"; import { ParticipantInfo } from "livekit-server-sdk"; import { LockKeyhole, Plane, RedoDot, Shield, Speaker, User, UserCheck, Workflow, } from "lucide-react"; import { useRef } from "react"; import toast from "react-hot-toast"; export default function AdminPanel() { const queryClient = useQueryClient(); const { data: pilots } = useQuery({ queryKey: ["pilots"], queryFn: () => getConnectedAircraftsAPI(), refetchInterval: 10000, }); const { data: dispatcher } = useQuery({ queryKey: ["dispatcher"], queryFn: () => getConnectedDispatcherAPI(), refetchInterval: 10000, }); const { data: livekitRooms } = useQuery({ queryKey: ["livekit-rooms"], queryFn: () => getLivekitRooms(), refetchInterval: 5000, }); const kickLivekitParticipantMutation = useMutation({ mutationFn: kickLivekitParticipant, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["livekit-rooms"] }); }, }); const kickPilotMutation = useMutation({ mutationFn: kickAircraftAPI, onSuccess: () => { toast.success("Pilot wurde erfolgreich gekickt"); queryClient.invalidateQueries({ queryKey: ["aircrafts"], }); queryClient.invalidateQueries({ queryKey: ["connected-audio-users"], }); }, }); const kickDispatchMutation = useMutation({ mutationFn: kickDispatcherAPI, onSuccess: () => { toast.success("Disponent wurde erfolgreich gekickt"); queryClient.invalidateQueries({ queryKey: ["dispatcher"], }); queryClient.invalidateQueries({ queryKey: ["connected-audio-users"], }); }, }); const participants: { participant: ParticipantInfo; room: string }[] = []; if (livekitRooms) { livekitRooms?.forEach((room) => { room.participants.forEach((participant) => { participants.push({ participant, room: room.room.name, }); }); }); } const livekitUserNotConnected = participants.filter((p) => { const pilot = pilots?.find( (d) => (d.publicUser as unknown as PublicUser).publicId === p.participant.identity, ); const fDispatcher = dispatcher?.find( (d) => (d.publicUser as unknown as PublicUser).publicId === p.participant.identity, ); return !pilot && !fDispatcher; }); const modalRef = useRef(null); console.debug("piloten von API", { anzahl: pilots?.length, pilots, }); return (

Admin Panel

Verbundene Clients
{pilots?.map((p) => { const publicUser = p.publicUser as unknown as PublicUser; const livekitParticipant = participants.find( (p) => p.participant.identity === publicUser.publicId, ); return ( ); })} {dispatcher?.map((d) => { const publicUser = d.publicUser as unknown as PublicUser; const livekitParticipant = participants.find( (p) => p.participant.identity === publicUser.publicId, ); return ( ); })} {livekitUserNotConnected.map((p) => { const publicUser = JSON.parse( p.participant.attributes.publicUser || "{}", ) as PublicUser; return ( ); })}
VAR # Name Station Voice Actions
{publicUser.publicId} {publicUser.fullName} {p.Station.bosCallsign} {!livekitParticipant ? ( Nicht verbunden ) : ( {livekitParticipant.room} )} } onClick={({ reason }) => { if (!reason.length) return toast.error("Bitte gib einen Grund für die Strafe an."); kickPilotMutation.mutate({ id: p.id, reason }); }} /> } onClick={({ reason, until }) => { if (!reason.length) return toast.error("Bitte gib einen Grund für die Strafe an."); if (!until) { toast.error( "Bitte wähle ein Datum aus. Ein permanenter Bann ist nur vom HUB aus möglich.", ); return; } kickPilotMutation.mutate({ id: p.id, reason, bann: true, until }); }} />
{publicUser.publicId} {publicUser.fullName} {d.zone} {!livekitParticipant ? ( Nicht verbunden ) : ( {livekitParticipant.room} )} } onClick={({ reason }) => kickDispatchMutation.mutate({ id: d.id, reason }) } /> } onClick={({ reason, until }) => { if (!reason.length) return toast.error("Bitte gib einen Grund für die Strafe an."); if (!until) { toast.error( "Bitte wähle ein Datum aus. Ein permanenter Bann ist nur vom HUB aus möglich.", ); return; } kickDispatchMutation.mutate({ id: d.id, reason, bann: true, until, }); }} />
{p.participant.identity} {publicUser?.fullName} Nicht verbunden {p.room}
{/*
Allgemeine Befehle
*/}
); }