diff --git a/apps/dispatch/app/dispatch/_components/navbar/Navbar.tsx b/apps/dispatch/app/(app)/dispatch/_components/navbar/Navbar.tsx similarity index 96% rename from apps/dispatch/app/dispatch/_components/navbar/Navbar.tsx rename to apps/dispatch/app/(app)/dispatch/_components/navbar/Navbar.tsx index 9568f968..ca043ebc 100644 --- a/apps/dispatch/app/dispatch/_components/navbar/Navbar.tsx +++ b/apps/dispatch/app/(app)/dispatch/_components/navbar/Navbar.tsx @@ -1,6 +1,6 @@ import { Connection } from "./_components/Connection"; /* import { ThemeSwap } from "./_components/ThemeSwap"; */ -import { Audio } from "../../../_components/Audio/Audio"; +import { Audio } from "../../../../_components/Audio/Audio"; /* import { useState } from "react"; */ import { ExitIcon, ExternalLinkIcon } from "@radix-ui/react-icons"; import Link from "next/link"; diff --git a/apps/dispatch/app/dispatch/_components/navbar/_components/Connection.tsx b/apps/dispatch/app/(app)/dispatch/_components/navbar/_components/Connection.tsx similarity index 98% rename from apps/dispatch/app/dispatch/_components/navbar/_components/Connection.tsx rename to apps/dispatch/app/(app)/dispatch/_components/navbar/_components/Connection.tsx index 1da5f4ac..2496d489 100644 --- a/apps/dispatch/app/dispatch/_components/navbar/_components/Connection.tsx +++ b/apps/dispatch/app/(app)/dispatch/_components/navbar/_components/Connection.tsx @@ -1,6 +1,6 @@ "use client"; import { useSession } from "next-auth/react"; -import { useDispatchConnectionStore } from "../../../../_store/dispatch/connectionStore"; +import { useDispatchConnectionStore } from "../../../../../_store/dispatch/connectionStore"; import { useEffect, useRef, useState } from "react"; import { toast } from "react-hot-toast"; import { useMutation } from "@tanstack/react-query"; diff --git a/apps/dispatch/app/dispatch/_components/navbar/_components/ThemeSwap.tsx b/apps/dispatch/app/(app)/dispatch/_components/navbar/_components/ThemeSwap.tsx similarity index 100% rename from apps/dispatch/app/dispatch/_components/navbar/_components/ThemeSwap.tsx rename to apps/dispatch/app/(app)/dispatch/_components/navbar/_components/ThemeSwap.tsx diff --git a/apps/dispatch/app/dispatch/_components/pannel/MissionForm.tsx b/apps/dispatch/app/(app)/dispatch/_components/pannel/MissionForm.tsx similarity index 100% rename from apps/dispatch/app/dispatch/_components/pannel/MissionForm.tsx rename to apps/dispatch/app/(app)/dispatch/_components/pannel/MissionForm.tsx diff --git a/apps/dispatch/app/dispatch/_components/pannel/Pannel.tsx b/apps/dispatch/app/(app)/dispatch/_components/pannel/Pannel.tsx similarity index 100% rename from apps/dispatch/app/dispatch/_components/pannel/Pannel.tsx rename to apps/dispatch/app/(app)/dispatch/_components/pannel/Pannel.tsx diff --git a/apps/dispatch/app/(app)/dispatch/layout.tsx b/apps/dispatch/app/(app)/dispatch/layout.tsx new file mode 100644 index 00000000..9ef4a9bc --- /dev/null +++ b/apps/dispatch/app/(app)/dispatch/layout.tsx @@ -0,0 +1,27 @@ +import type { Metadata } from "next"; +import Navbar from "./_components/navbar/Navbar"; +import { getServerSession } from "api/auth/[...nextauth]/auth"; +import { Error } from "_components/Error"; + +export const metadata: Metadata = { + title: "VAR: Disponent", + description: "Die neue VAR Leitstelle.", +}; + +export default async function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const session = await getServerSession(); + + if (!session?.user.permissions.includes("DISPO")) + return ; + + return ( + <> + + {children} + + ); +} diff --git a/apps/dispatch/app/dispatch/page.tsx b/apps/dispatch/app/(app)/dispatch/page.tsx similarity index 81% rename from apps/dispatch/app/dispatch/page.tsx rename to apps/dispatch/app/(app)/dispatch/page.tsx index 4405f8c2..a97702f8 100644 --- a/apps/dispatch/app/dispatch/page.tsx +++ b/apps/dispatch/app/(app)/dispatch/page.tsx @@ -1,14 +1,14 @@ "use client"; -import { Pannel } from "dispatch/_components/pannel/Pannel"; +import { Pannel } from "(app)/dispatch/_components/pannel/Pannel"; import { usePannelStore } from "_store/pannelStore"; import { cn } from "@repo/shared-components"; import dynamic from "next/dynamic"; -import { Chat } from "../_components/left/Chat"; -import { Report } from "../_components/left/Report"; +import { Chat } from "../../_components/left/Chat"; +import { Report } from "../../_components/left/Report"; import { SituationBoard } from "_components/left/SituationBoard"; -const Map = dynamic(() => import("../_components/map/Map"), { ssr: false }); +const Map = dynamic(() => import("../../_components/map/Map"), { ssr: false }); const DispatchPage = () => { const { isOpen } = usePannelStore(); diff --git a/apps/dispatch/app/dispatch/socket.ts b/apps/dispatch/app/(app)/dispatch/socket.ts similarity index 100% rename from apps/dispatch/app/dispatch/socket.ts rename to apps/dispatch/app/(app)/dispatch/socket.ts diff --git a/apps/dispatch/app/pilot/layout.tsx b/apps/dispatch/app/(app)/layout.tsx similarity index 71% rename from apps/dispatch/app/pilot/layout.tsx rename to apps/dispatch/app/(app)/layout.tsx index 5e60497e..b26ff919 100644 --- a/apps/dispatch/app/pilot/layout.tsx +++ b/apps/dispatch/app/(app)/layout.tsx @@ -1,7 +1,6 @@ import type { Metadata } from "next"; -import Navbar from "./_components/navbar/Navbar"; import { redirect } from "next/navigation"; -import { getServerSession } from "../api/auth/[...nextauth]/auth"; +import { getServerSession } from "api/auth/[...nextauth]/auth"; import { Error } from "_components/Error"; import { prisma } from "@repo/db"; @@ -27,8 +26,9 @@ export default async function RootLayout({ }, }); - if (!session || !session.user.firstname) { - redirect("/login"); + if (!session) { + console.log(session); + return redirect("/logout"); } if (openPenaltys[0]) { @@ -37,7 +37,7 @@ export default async function RootLayout({ ); } @@ -45,7 +45,7 @@ export default async function RootLayout({ ); } @@ -53,14 +53,5 @@ export default async function RootLayout({ if (!session.user.emailVerified) { return ; } - - if (!session.user.permissions.includes("PILOT")) - return ; - - return ( - <> - - {children} - - ); + return <>{children}; } diff --git a/apps/dispatch/app/pilot/_components/dme/Dme.tsx b/apps/dispatch/app/(app)/pilot/_components/dme/Dme.tsx similarity index 100% rename from apps/dispatch/app/pilot/_components/dme/Dme.tsx rename to apps/dispatch/app/(app)/pilot/_components/dme/Dme.tsx diff --git a/apps/dispatch/app/pilot/_components/dme/Melder_NoReflections.png b/apps/dispatch/app/(app)/pilot/_components/dme/Melder_NoReflections.png similarity index 100% rename from apps/dispatch/app/pilot/_components/dme/Melder_NoReflections.png rename to apps/dispatch/app/(app)/pilot/_components/dme/Melder_NoReflections.png diff --git a/apps/dispatch/app/pilot/_components/dme/reflektion.png b/apps/dispatch/app/(app)/pilot/_components/dme/reflektion.png similarity index 100% rename from apps/dispatch/app/pilot/_components/dme/reflektion.png rename to apps/dispatch/app/(app)/pilot/_components/dme/reflektion.png diff --git a/apps/dispatch/app/pilot/_components/dme/squad-x15.jpg b/apps/dispatch/app/(app)/pilot/_components/dme/squad-x15.jpg similarity index 100% rename from apps/dispatch/app/pilot/_components/dme/squad-x15.jpg rename to apps/dispatch/app/(app)/pilot/_components/dme/squad-x15.jpg diff --git a/apps/dispatch/app/pilot/_components/dme/useButtons.ts b/apps/dispatch/app/(app)/pilot/_components/dme/useButtons.ts similarity index 100% rename from apps/dispatch/app/pilot/_components/dme/useButtons.ts rename to apps/dispatch/app/(app)/pilot/_components/dme/useButtons.ts diff --git a/apps/dispatch/app/pilot/_components/dme/useSounds.ts b/apps/dispatch/app/(app)/pilot/_components/dme/useSounds.ts similarity index 100% rename from apps/dispatch/app/pilot/_components/dme/useSounds.ts rename to apps/dispatch/app/(app)/pilot/_components/dme/useSounds.ts diff --git a/apps/dispatch/app/pilot/_components/mrt/MRT.png b/apps/dispatch/app/(app)/pilot/_components/mrt/MRT.png similarity index 100% rename from apps/dispatch/app/pilot/_components/mrt/MRT.png rename to apps/dispatch/app/(app)/pilot/_components/mrt/MRT.png diff --git a/apps/dispatch/app/pilot/_components/mrt/MRT_MESSAGE.png b/apps/dispatch/app/(app)/pilot/_components/mrt/MRT_MESSAGE.png similarity index 100% rename from apps/dispatch/app/pilot/_components/mrt/MRT_MESSAGE.png rename to apps/dispatch/app/(app)/pilot/_components/mrt/MRT_MESSAGE.png diff --git a/apps/dispatch/app/pilot/_components/mrt/Mrt.tsx b/apps/dispatch/app/(app)/pilot/_components/mrt/Mrt.tsx similarity index 100% rename from apps/dispatch/app/pilot/_components/mrt/Mrt.tsx rename to apps/dispatch/app/(app)/pilot/_components/mrt/Mrt.tsx diff --git a/apps/dispatch/app/pilot/_components/mrt/mrt.css b/apps/dispatch/app/(app)/pilot/_components/mrt/mrt.css similarity index 100% rename from apps/dispatch/app/pilot/_components/mrt/mrt.css rename to apps/dispatch/app/(app)/pilot/_components/mrt/mrt.css diff --git a/apps/dispatch/app/pilot/_components/mrt/useButtons.ts b/apps/dispatch/app/(app)/pilot/_components/mrt/useButtons.ts similarity index 97% rename from apps/dispatch/app/pilot/_components/mrt/useButtons.ts rename to apps/dispatch/app/(app)/pilot/_components/mrt/useButtons.ts index 048fc515..dfaad039 100644 --- a/apps/dispatch/app/pilot/_components/mrt/useButtons.ts +++ b/apps/dispatch/app/(app)/pilot/_components/mrt/useButtons.ts @@ -1,7 +1,7 @@ import { ConnectedAircraft, Prisma } from "@repo/db"; import { usePilotConnectionStore } from "_store/pilot/connectionStore"; import { useMrtStore } from "_store/pilot/MrtStore"; -import { pilotSocket } from "pilot/socket"; +import { pilotSocket } from "(app)/pilot/socket"; import { editConnectedAircraftAPI } from "_querys/aircrafts"; import { useEffect } from "react"; import { useMutation } from "@tanstack/react-query"; diff --git a/apps/dispatch/app/pilot/_components/mrt/useSounds.ts b/apps/dispatch/app/(app)/pilot/_components/mrt/useSounds.ts similarity index 100% rename from apps/dispatch/app/pilot/_components/mrt/useSounds.ts rename to apps/dispatch/app/(app)/pilot/_components/mrt/useSounds.ts diff --git a/apps/dispatch/app/pilot/_components/navbar/Navbar.tsx b/apps/dispatch/app/(app)/pilot/_components/navbar/Navbar.tsx similarity index 90% rename from apps/dispatch/app/pilot/_components/navbar/Navbar.tsx rename to apps/dispatch/app/(app)/pilot/_components/navbar/Navbar.tsx index a8376f12..e1712fe8 100644 --- a/apps/dispatch/app/pilot/_components/navbar/Navbar.tsx +++ b/apps/dispatch/app/(app)/pilot/_components/navbar/Navbar.tsx @@ -1,9 +1,7 @@ "use client"; import { Connection } from "./_components/Connection"; -/* import { ThemeSwap } from "./ThemeSwap"; */ -import { Audio } from "../../../_components/Audio/Audio"; -/* import { useState } from "react"; */ +import { Audio } from "_components/Audio/Audio"; import { ExitIcon, ExternalLinkIcon } from "@radix-ui/react-icons"; import Link from "next/link"; import { Settings } from "_components/navbar/Settings"; diff --git a/apps/dispatch/app/pilot/_components/navbar/_components/Connection.tsx b/apps/dispatch/app/(app)/pilot/_components/navbar/_components/Connection.tsx similarity index 100% rename from apps/dispatch/app/pilot/_components/navbar/_components/Connection.tsx rename to apps/dispatch/app/(app)/pilot/_components/navbar/_components/Connection.tsx diff --git a/apps/dispatch/app/pilot/_components/navbar/_components/ThemeSwap.tsx b/apps/dispatch/app/(app)/pilot/_components/navbar/_components/ThemeSwap.tsx similarity index 100% rename from apps/dispatch/app/pilot/_components/navbar/_components/ThemeSwap.tsx rename to apps/dispatch/app/(app)/pilot/_components/navbar/_components/ThemeSwap.tsx diff --git a/apps/dispatch/app/(app)/pilot/layout.tsx b/apps/dispatch/app/(app)/pilot/layout.tsx new file mode 100644 index 00000000..c734eb8e --- /dev/null +++ b/apps/dispatch/app/(app)/pilot/layout.tsx @@ -0,0 +1,27 @@ +import type { Metadata } from "next"; +import Navbar from "./_components/navbar/Navbar"; +import { getServerSession } from "api/auth/[...nextauth]/auth"; +import { Error } from "_components/Error"; + +export const metadata: Metadata = { + title: "VAR: Pilot", + description: "Die neue VAR Leitstelle.", +}; + +export default async function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const session = await getServerSession(); + + if (!session?.user.permissions.includes("PILOT")) + return ; + + return ( + <> + + {children} + + ); +} diff --git a/apps/dispatch/app/pilot/page.tsx b/apps/dispatch/app/(app)/pilot/page.tsx similarity index 84% rename from apps/dispatch/app/pilot/page.tsx rename to apps/dispatch/app/(app)/pilot/page.tsx index d16ad76d..6b97554a 100644 --- a/apps/dispatch/app/pilot/page.tsx +++ b/apps/dispatch/app/(app)/pilot/page.tsx @@ -1,13 +1,13 @@ "use client"; -import { Mrt } from "pilot/_components/mrt/Mrt"; -import { Chat } from "../_components/left/Chat"; -import { Report } from "../_components/left/Report"; -import { Dme } from "pilot/_components/dme/Dme"; +import { Mrt } from "(app)/pilot/_components/mrt/Mrt"; +import { Chat } from "../../_components/left/Chat"; +import { Report } from "../../_components/left/Report"; +import { Dme } from "(app)/pilot/_components/dme/Dme"; import dynamic from "next/dynamic"; import { ConnectedDispatcher } from "tracker/_components/ConnectedDispatcher"; -const Map = dynamic(() => import("../_components/map/Map"), { +const Map = dynamic(() => import("_components/map/Map"), { ssr: false, }); diff --git a/apps/dispatch/app/pilot/socket.ts b/apps/dispatch/app/(app)/pilot/socket.ts similarity index 100% rename from apps/dispatch/app/pilot/socket.ts rename to apps/dispatch/app/(app)/pilot/socket.ts diff --git a/apps/dispatch/app/(auth)/login/_components/Login.tsx b/apps/dispatch/app/(auth)/login/_components/Login.tsx index 93440f59..57c23341 100644 --- a/apps/dispatch/app/(auth)/login/_components/Login.tsx +++ b/apps/dispatch/app/(auth)/login/_components/Login.tsx @@ -7,11 +7,11 @@ import { Toaster } from "react-hot-toast"; export const Login = () => { const [isLoading, setIsLoading] = useState(false); const searchParams = useSearchParams(); - const { data: session } = useSession(); + const { data: session, status } = useSession(); const navigate = useRouter(); useEffect(() => { - if (session) { + if (status === "authenticated") { navigate.push("/"); } }, [session, navigate]); diff --git a/apps/dispatch/app/_components/QueryProvider.tsx b/apps/dispatch/app/_components/QueryProvider.tsx index 2e222dba..de75b3d6 100644 --- a/apps/dispatch/app/_components/QueryProvider.tsx +++ b/apps/dispatch/app/_components/QueryProvider.tsx @@ -4,12 +4,12 @@ import { toast } from "react-hot-toast"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactNode, useEffect, useState } from "react"; -import { dispatchSocket } from "dispatch/socket"; +import { dispatchSocket } from "(app)/dispatch/socket"; import { Mission, NotificationPayload } from "@repo/db"; import { HPGnotificationToast } from "_components/customToasts/HPGnotification"; import { useMapStore } from "_store/mapStore"; import { AdminMessageToast } from "_components/customToasts/AdminMessage"; -import { pilotSocket } from "pilot/socket"; +import { pilotSocket } from "(app)/pilot/socket"; export function QueryProvider({ children }: { children: ReactNode }) { const mapStore = useMapStore((s) => s); diff --git a/apps/dispatch/app/_components/navbar/AdminPanel.tsx b/apps/dispatch/app/_components/navbar/AdminPanel.tsx index 2b9022d7..d5109957 100644 --- a/apps/dispatch/app/_components/navbar/AdminPanel.tsx +++ b/apps/dispatch/app/_components/navbar/AdminPanel.tsx @@ -150,21 +150,29 @@ export default function AdminPanel() { } onClick={({ reason }) => kickPilotMutation.mutate({ id: p.id, reason }) } /> } - onClick={({ reason, until }) => - kickPilotMutation.mutate({ id: p.id, reason, bann: true, until }) - } + onClick={({ reason, until }) => { + 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 }); + }} /> } onClick={({ reason }) => kickDispatchMutation.mutate({ id: d.id, reason }) } /> } onClick={({ reason, until }) => @@ -264,12 +274,6 @@ export default function AdminPanel() { > - ) { - const session = await getServerSession(); - const openPenaltys = await prisma.penalty.findMany({ - where: { - userId: session?.user.id, - until: { - gte: new Date(), - }, - suspended: false, - - type: { in: ["TIME_BAN", "BAN"] }, - }, - }); - - if (!session || !session.user) { - redirect("/login"); - } - - if (openPenaltys[0]) { - if (openPenaltys[0].type === "BAN") { - return ( - - ); - } - return ( - - ); - } - - if (!session.user.emailVerified) - return ; - - if (!session.user.permissions.includes("DISPO")) - return ; - - return ( - <> - - {children} - - ); -} diff --git a/apps/dispatch/app/layout.tsx b/apps/dispatch/app/layout.tsx index c399a84d..867f3528 100644 --- a/apps/dispatch/app/layout.tsx +++ b/apps/dispatch/app/layout.tsx @@ -42,8 +42,9 @@ export default async function RootLayout({ style: { background: "var(--color-base-100)", color: "var(--color-base-content)", + zIndex: 9999, }, - duration: 4000, + duration: 5000, }} position="top-left" reverseOrder={false} diff --git a/apps/dispatch/app/page.tsx b/apps/dispatch/app/page.tsx index af959221..90f44de0 100644 --- a/apps/dispatch/app/page.tsx +++ b/apps/dispatch/app/page.tsx @@ -8,7 +8,7 @@ export default () => { const session = useSession(); useEffect(() => { - if (session.status !== "authenticated") { + if (session.status === "unauthenticated") { router.replace("/login"); return; } diff --git a/apps/dispatch/app/tracker/page.tsx b/apps/dispatch/app/tracker/page.tsx index 2b62dc2c..01e1339f 100644 --- a/apps/dispatch/app/tracker/page.tsx +++ b/apps/dispatch/app/tracker/page.tsx @@ -2,9 +2,9 @@ import ModeSwitchDropdown from "_components/navbar/ModeSwitchDropdown"; import { useSession } from "next-auth/react"; import dynamic from "next/dynamic"; -import { ConnectedDispatcher } from "tracker/_components/ConnectedDispatcher"; +import { ConnectedDispatcher } from "./_components/ConnectedDispatcher"; -const Map = dynamic(() => import("../_components/map/Map"), { +const Map = dynamic(() => import("_components/map/Map"), { ssr: false, }); diff --git a/apps/hub/app/(app)/_components/FirstPath.tsx b/apps/hub/app/(app)/_components/FirstPath.tsx index de0fc873..f3f8a4ac 100644 --- a/apps/hub/app/(app)/_components/FirstPath.tsx +++ b/apps/hub/app/(app)/_components/FirstPath.tsx @@ -158,7 +158,7 @@ export const FirstPath = () => { } }} > - {page === "path" ? "Weiter" : "Pfad auswählen"} + {page === "path" ? "Weiter" : "Intro abschließen"} diff --git a/apps/hub/app/(app)/_components/Stats.tsx b/apps/hub/app/(app)/_components/Stats.tsx index a747fcdb..e8962ab2 100644 --- a/apps/hub/app/(app)/_components/Stats.tsx +++ b/apps/hub/app/(app)/_components/Stats.tsx @@ -256,7 +256,7 @@ export const DispoStats = async () => {
Disponent Login Zeit
- {hours}h {minutes}m + {hours}h {minutes}min
diff --git a/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx b/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx index b0085d7c..029a087a 100644 --- a/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx +++ b/apps/hub/app/(app)/admin/user/[id]/_components/forms.tsx @@ -6,10 +6,7 @@ import { ConnectedAircraft, ConnectedDispatcher, DiscordAccount, - Penalty, - PenaltyType, PERMISSION, - Report, Station, User, } from "@repo/db"; @@ -57,7 +54,7 @@ import { Error } from "_components/Error"; import { useSession } from "next-auth/react"; import { setStandardName } from "../../../../../../helper/discord"; import { penaltyColumns } from "(app)/admin/penalty/columns"; -import { addPenalty, editPenalty, editPenaltys } from "(app)/admin/penalty/actions"; +import { addPenalty, editPenaltys } from "(app)/admin/penalty/actions"; import { reportColumns } from "(app)/admin/report/columns"; interface ProfileFormProps { @@ -123,26 +120,30 @@ export const ProfileForm: React.FC = ({ user }: ProfileFormPro {form.formState.errors.lastname && (

{form.formState.errors.lastname?.message}

)} - - {form.formState.errors.email && ( -

{form.formState.errors.email?.message}

- )} + {session.data?.user.permissions.includes("ADMIN_USER_ADVANCED") && ( + <> + + {form.formState.errors.email && ( +

{form.formState.errors.email?.message}

+ )} - + + + )} +

{btnName}

+