diff --git a/apps/dispatch/app/_components/navbar/AdminPanel.tsx b/apps/dispatch/app/_components/navbar/AdminPanel.tsx index fbc7dd95..acf566b7 100644 --- a/apps/dispatch/app/_components/navbar/AdminPanel.tsx +++ b/apps/dispatch/app/_components/navbar/AdminPanel.tsx @@ -267,7 +267,7 @@ export default function AdminPanel() { /> } onClick={({ reason, until }) => @@ -320,7 +320,7 @@ export default function AdminPanel() { /> } onClick={({ reason, until }) => @@ -374,7 +374,7 @@ export default function AdminPanel() { diff --git a/apps/hub/app/(app)/_components/Penalty.tsx b/apps/hub/app/(app)/_components/Penalty.tsx index d66119b7..2e64e1b7 100644 --- a/apps/hub/app/(app)/_components/Penalty.tsx +++ b/apps/hub/app/(app)/_components/Penalty.tsx @@ -1,4 +1,4 @@ -import { prisma } from "@repo/db"; +import { getPublicUser, prisma } from "@repo/db"; import { TriangleAlert } from "lucide-react"; import { getServerSession } from "next-auth"; import { PenaltyCountdown } from "./PenaltyCountdown"; @@ -11,8 +11,13 @@ export const Penalty = async () => { until: { gte: new Date(), }, + suspended: false, + type: { in: ["TIME_BAN", "BAN"] }, }, + include: { + CreatedUser: true, + }, }); if (!openPenaltys[0]) { return null; @@ -30,10 +35,16 @@ export const Penalty = async () => {

Du hast eine aktive Strafe und kannst dich deshalb nicht mit dem Netzwerk verbinden.

-

Grund: {openPenaltys[0].reason}

+

+ Grund: {openPenaltys[0].reason} +

+

+ Admin:{" "} + {getPublicUser(openPenaltys[0].CreatedUser).fullName} +

)} - {openPenaltys[0].type === "BAN" && ( + {session?.user.isBanned && (

@@ -44,6 +55,10 @@ export const Penalty = async () => { ausgeschlossen wurdest. Du kannst dich nicht mehr mit dem Netzwerk verbinden.

Grund: {openPenaltys[0].reason}

+

+ Admin:{" "} + {getPublicUser(openPenaltys[0].CreatedUser).fullName} +

)} diff --git a/apps/hub/app/(app)/admin/penalty/[id]/page.tsx b/apps/hub/app/(app)/admin/penalty/[id]/page.tsx index 5335ff2c..b7f31691 100644 --- a/apps/hub/app/(app)/admin/penalty/[id]/page.tsx +++ b/apps/hub/app/(app)/admin/penalty/[id]/page.tsx @@ -1,6 +1,7 @@ -import { ExclamationTriangleIcon } from "@radix-ui/react-icons"; +import { ReasonForm } from "(app)/admin/penalty/_components/form"; import { prisma } from "@repo/db"; import { Error } from "_components/Error"; +import { Shield } from "lucide-react"; export default async function Page({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; @@ -15,16 +16,62 @@ export default async function Page({ params }: { params: Promise<{ id: string }> }, }); - if (!penalty) return ; + const userReports = await prisma.report.findMany({ + where: { + reportedUserId: penalty?.User.id, + }, + include: { + Reported: true, + }, + }); + + if (!penalty) return ; return (

- + Strafe #{penalty.id}

+
+
+

Details

+
+

+ Benutzer: {penalty.User.firstname}{" "} + {penalty.User.lastname} ({penalty.User.publicId}) +

+

+ Erstellt von: {penalty.CreatedUser.firstname}{" "} + {penalty.CreatedUser.lastname} ({penalty.CreatedUser.publicId}) +

+

+ Typ: {penalty.type} +

+ +

+ Erstellt am:{" "} + {new Date(penalty.timestamp).toLocaleString("de-DE", { + dateStyle: "medium", + timeStyle: "short", + })} +

+ {penalty.until && ( +

+ Gültig bis:{" "} + {new Date(penalty.until).toLocaleString("de-DE", { + dateStyle: "medium", + timeStyle: "short", + })} +

+ )} +
+
+
+ +
); } diff --git a/apps/hub/app/(app)/admin/penalty/_components/form.tsx b/apps/hub/app/(app)/admin/penalty/_components/form.tsx index e69de29b..40870519 100644 --- a/apps/hub/app/(app)/admin/penalty/_components/form.tsx +++ b/apps/hub/app/(app)/admin/penalty/_components/form.tsx @@ -0,0 +1,83 @@ +"use client"; +import { editPenalty } from "(app)/admin/penalty/actions"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Penalty, Report, User } from "@repo/db"; +import { PenaltyOptionalDefaults, PenaltyOptionalDefaultsSchema } from "@repo/db/zod"; +import { Button } from "_components/ui/Button"; +import { Switch } from "_components/ui/Switch"; +import { useForm } from "react-hook-form"; + +export const ReasonForm = ({ + penalty, + userReports: suerReportsOfDay, +}: { + penalty: Penalty; + userReports: (Report & { Reported: User })[]; +}) => { + const form = useForm({ + defaultValues: penalty, + resolver: zodResolver(PenaltyOptionalDefaultsSchema), + }); + const isLoading = form.formState.isSubmitting; + + return ( + <> +
{ + if (!penalty.id) return; + const newPenalty = await editPenalty(penalty.id, penalty); + form.reset(newPenalty); + })} + > +

Begründung

+ +
+