Files
var-monorepo/apps/dispatch/app/dispatch/_components/pannel/Pannel.tsx
PxlLoewe 50f42e99d3 feat: Implement connected user API and integrate chat and report components
- Added API routes for fetching connected users, keywords, missions, and stations.
- Created a new QueryProvider component for managing query states and socket events.
- Introduced connection stores for dispatch and pilot, managing socket connections and states.
- Updated Prisma schema for connected aircraft model.
- Enhanced UI with toast notifications for status updates and chat interactions.
- Implemented query functions for fetching connected users and keywords with error handling.
2025-05-07 00:43:45 -07:00

78 lines
2.0 KiB
TypeScript

import { usePannelStore } from "_store/pannelStore";
import { cn } from "helpers/cn";
import { MissionForm } from "./MissionForm";
import { Rss, Trash2Icon } from "lucide-react";
import { useEffect } from "react";
import { useQuery } from "@tanstack/react-query";
import { getMissionsAPI } from "querys/missions";
export const Pannel = () => {
const { setOpen, setMissionFormValues } = usePannelStore();
const { isEditingMission, setEditingMission, missionFormValues } =
usePannelStore();
const missions = useQuery({
queryKey: ["missions"],
queryFn: () =>
getMissionsAPI({
OR: [{ state: "draft" }, { state: "running" }],
}),
});
useEffect(() => {
if (isEditingMission && missionFormValues) {
const mission = missions.data?.find(
(mission) => mission.id === missionFormValues.id,
);
if (!mission) {
setEditingMission(false, null);
setMissionFormValues({});
setOpen(false);
}
}
}, [
isEditingMission,
missions,
setMissionFormValues,
setEditingMission,
setOpen,
missionFormValues,
]);
return (
<div className={cn("flex-1 max-w-[600px] z-9999999")}>
<div className="bg-base-100 min-h-screen h-full max-h-screen w-full overflow-auto">
<div className="flex flex-row justify-between items-center p-4">
<h1 className="text-xl font-bold flex items-center gap-2">
<Rss /> {isEditingMission ? "Einsatz bearbeiten" : "Neuer Einsatz"}
</h1>
<div>
<button
className="btn btn-ghost btn-sm mr-2 btn-warning"
onClick={() => {
setMissionFormValues({});
setEditingMission(false, null);
}}
>
<Trash2Icon size={18} />
</button>
<button
className="btn"
onClick={() => {
setOpen(false);
setEditingMission(false, null);
setMissionFormValues({});
}}
>
Abbrechen
</button>
</div>
</div>
<div className="divider m-0" />
<div className="p-4">
<MissionForm />
</div>
</div>
</div>
);
};