- 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.
78 lines
2.0 KiB
TypeScript
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>
|
|
);
|
|
};
|