"use client"; import { PublicUser } from "@repo/db"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { cn } from "_helpers/cn"; import { getConnectedAircraftsAPI, kickAircraftAPI } from "_querys/aircrafts"; import { getConnectedDispatcherAPI, kickDispatcherAPI } from "_querys/dispatcher"; import { getLivekitRooms, kickLivekitParticipant } from "_querys/livekit"; import { editUserAPI } from "_querys/user"; import { ParticipantInfo } from "livekit-server-sdk"; import { Eye, LockKeyhole, Plane, RedoDot, Shield, ShieldAlert, Speaker, User, UserCheck, Workflow, } from "lucide-react"; import { ReactNode, useRef, useState } from "react"; import toast from "react-hot-toast"; const PenaltyDropdown = ({ onClick, btnClassName, showDatePicker, btnTip, Icon, }: { onClick: (data: { reason: string; until: Date | null }) => void; showDatePicker?: boolean; btnClassName?: string; btnTip?: string; Icon: ReactNode; }) => { const [reason, setReason] = useState(""); const [until, setUntil] = useState("default"); return (
{Icon}
setReason(e.target.value)} type="text" className="input min-w-[250px]" placeholder="Begründung" /> {showDatePicker && ( )}
); }; 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: 10000, }); 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); 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 }) => kickPilotMutation.mutate({ id: p.id, reason }) } /> } onClick={({ reason, until }) => 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 }) => kickDispatchMutation.mutate({ id: d.id, reason, bann: true, until }) } />
{p.participant.identity} {publicUser?.fullName} Nicht verbunden {p.room}
{/*
Allgemeine Befehle
*/}
); }