Account migration funktioniert nun

This commit is contained in:
PxlLoewe
2025-06-26 01:01:42 -07:00
parent 2bd8a455c8
commit d2ebea7fc2
11 changed files with 749926 additions and 138 deletions

View File

@@ -93,7 +93,9 @@ const EventSelect = ({ pathSelected }: { pathSelected: "disponent" | "pilot" })
export const FirstPath = () => {
const modalRef = useRef<HTMLDialogElement>(null);
const { data: session } = useSession();
const [selected, setSelected] = useState<"disponent" | "pilot" | null>(null);
const [selected, setSelected] = useState<"disponent" | "pilot" | null>(
session?.user.badges.includes("D1") ? "disponent" : null,
);
const [page, setPage] = useState<"path" | "event-select">("path");
useEffect(() => {
@@ -105,12 +107,28 @@ export const FirstPath = () => {
return (
<dialog ref={modalRef} className="modal">
<div className="modal-box w-11/12 max-w-5xl">
<h3 className="flex items-center gap-2 text-lg font-bold mb-10">Wähle deinen Einstieg!</h3>
<p className="mb-8 text-base text-base-content/80 text-center">
Willkommen bei Virtual Air Rescue!
<br /> Wie möchtest du bei uns starten? Du kannst später jederzeit auch den anderen Pfad
ausprobieren, wenn du möchtest.
</p>
<h3 className="flex items-center gap-2 text-lg font-bold mb-10">
{session?.user.migratedFromV1
? "Hallo, Hier hat sich einiges geändert!"
: "Wähle deinen Einstieg!"}
</h3>
<h2 className="text-2xl font-bold mb-4 text-center">Willkommen bei Virtual Air Rescue!</h2>
{session?.user.migratedFromV1 ? (
<p className="mb-8 text-base text-base-content/80 text-center">
Dein Account wurde erfolgreich auf das neue System migriert. Herzlich wilkommen im neuen
HUB! Um die Erfahrung für alle Nutzer zu steigern haben wir uns dazu entschlossen, dass
alle Nutzer einen Test absolvieren müssen:{" "}
{session.user.badges.includes("D1") &&
`Da du vorher schon den D1-Test absolviert hast, kannst du unter Disponent das Quick-Lane Event auswähen. Um Pilot zu werden kannst du dann später den Piloten-Kurs absolvieren.`}
{(!session.user.badges.includes("D1") || session.user.badges.includes("P1")) &&
`Als Pilot musst du den Piloten-Test abschließen.`}
</p>
) : (
<p>
Wie möchtest du bei uns starten? Du kannst später jederzeit auch den anderen Pfad
ausprobieren, wenn du möchtest.
</p>
)}
<div className="flex flex-col items-center justify-center m-20">
{page === "path" && <PathsOptions selected={selected} setSelected={setSelected} />}
{page === "event-select" && (

View File

@@ -0,0 +1,70 @@
import { Report, User } from "@repo/db";
import { ColumnDef } from "@tanstack/react-table";
import { Check, Eye, Plane, ShieldQuestion, Workflow, X } from "lucide-react";
import Link from "next/link";
export const reportColumns: ColumnDef<Report & { Sender?: User; Reported: User }>[] = [
{
accessorKey: "reviewed",
header: "Erledigt",
cell: ({ row }) => {
return (
<div className="text-center">
{row.getValue("reviewed") ? (
<Check className="text-green-500 w-5 h-5" />
) : (
<X className="text-red-500 w-5 h-5" />
)}
</div>
);
},
},
{
accessorKey: "Sender",
header: "Sender",
cell: ({ row }) => {
const user = row.original.Sender;
if (!user) return "Unbekannt";
return `${user.firstname} ${user.lastname} (${user.publicId})`;
},
},
{
accessorKey: "reportedUserRole",
header: "Rolle des gemeldeten Nutzers",
cell: ({ row }) => {
const role = row.getValue("reportedUserRole") as string | undefined;
const Icon = role ? (role.startsWith("LST") ? Workflow : Plane) : ShieldQuestion;
return (
<span className="flex items-center gap-2">
<Icon className="w-4 h-4" />
{role || "Unbekannt"}
</span>
);
},
},
{
accessorKey: "Reported",
header: "Reported",
cell: ({ row }) => {
const user = row.original.Reported;
return `${user.firstname} ${user.lastname} (${user.publicId})`;
},
},
{
accessorKey: "timestamp",
header: "Time",
cell: ({ row }) => new Date(row.getValue("timestamp")).toLocaleString(),
},
{
accessorKey: "actions",
header: "Actions",
cell: ({ row }) => (
<Link href={`/admin/report/${row.original.id}`}>
<button className="btn btn-sm btn-outline btn-info flex items-center gap-2">
<Eye className="w-4 h-4" /> Anzeigen
</button>
</Link>
),
},
];

View File

@@ -1,10 +1,6 @@
"use client";
import { Check, Eye, ShieldQuestion, X } from "lucide-react";
import Link from "next/link";
import { PaginatedTable } from "_components/PaginatedTable";
import { Report, User } from "@repo/db";
import { ColumnDef } from "@tanstack/react-table";
import { Workflow, Plane } from "lucide-react";
import { reportColumns } from "(app)/admin/report/columns";
export default function ReportPage() {
return (
@@ -15,72 +11,7 @@ export default function ReportPage() {
Sender: true,
Reported: true,
}}
columns={
[
{
accessorKey: "reviewed",
header: "Erledigt",
cell: ({ row }) => {
return (
<div className="text-center">
{row.getValue("reviewed") ? (
<Check className="text-green-500 w-5 h-5" />
) : (
<X className="text-red-500 w-5 h-5" />
)}
</div>
);
},
},
{
accessorKey: "Sender",
header: "Sender",
cell: ({ row }) => {
const user = row.getValue("Sender") as User;
return `${user.firstname} ${user.lastname} (${user.publicId})`;
},
},
{
accessorKey: "reportedUserRole",
header: "Rolle des gemeldeten Nutzers",
cell: ({ row }) => {
const role = row.getValue("reportedUserRole") as string | undefined;
const Icon = role ? (role.startsWith("LST") ? Workflow : Plane) : ShieldQuestion;
return (
<span className="flex items-center gap-2">
<Icon className="w-4 h-4" />
{role || "Unbekannt"}
</span>
);
},
},
{
accessorKey: "Reported",
header: "Reported",
cell: ({ row }) => {
const user = row.getValue("Reported") as User;
return `${user.firstname} ${user.lastname} (${user.publicId})`;
},
},
{
accessorKey: "timestamp",
header: "Time",
cell: ({ row }) => new Date(row.getValue("timestamp")).toLocaleString(),
},
{
accessorKey: "actions",
header: "Actions",
cell: ({ row }) => (
<Link href={`/admin/report/${row.original.id}`}>
<button className="btn btn-sm btn-outline btn-info flex items-center gap-2">
<Eye className="w-4 h-4" /> Anzeigen
</button>
</Link>
),
},
] as ColumnDef<Report>[]
}
columns={reportColumns}
/>
);
}

View File

@@ -58,6 +58,7 @@ import { setStandardName } from "../../../../../../helper/discord";
import { penaltyColumns } from "(app)/admin/penalty/columns";
import { PenaltyDropdown } from "(app)/admin/user/[id]/_components/AddPenaltyDropdown";
import { addPenalty, editPenalty, editPenaltys } from "(app)/admin/penalty/actions";
import { reportColumns } from "(app)/admin/report/columns";
interface ProfileFormProps {
user: User;
@@ -405,50 +406,7 @@ export const UserReports = ({ user }: { user: User }) => {
Sender: true,
Reported: true,
}}
columns={
[
{
accessorKey: "reviewed",
header: "Erledigt",
cell: ({ row }) => {
return (
<div className="text-center">
{row.getValue("reviewed") ? (
<Check className="text-green-500 w-5 h-5" />
) : (
<X className="text-red-500 w-5 h-5" />
)}
</div>
);
},
},
{
accessorKey: "Sender",
header: "Sender",
cell: ({ row }) => {
const user = row.getValue("Sender") as User;
return `${user.firstname} ${user.lastname} (${user.publicId})`;
},
},
{
accessorKey: "timestamp",
header: "Time",
cell: ({ row }) => new Date(row.getValue("timestamp")).toLocaleString(),
},
{
accessorKey: "actions",
header: "Actions",
cell: ({ row }) => (
<Link href={`/admin/report/${row.original.id}`}>
<button className="btn btn-sm btn-outline btn-info flex items-center gap-2">
<Eye className="w-4 h-4" /> Anzeigen
</button>
</Link>
),
},
] as ColumnDef<Report>[]
}
columns={reportColumns}
/>
</div>
);

View File

@@ -32,7 +32,7 @@ export const ProfileForm = ({
user: User;
penaltys: Penalty[];
}): React.JSX.Element => {
const canEdit = penaltys.length === 0 && user.isBanned;
const canEdit = penaltys.length === 0 && !user.isBanned;
const schema = z.object({
firstname: z.string().min(2).max(30),
@@ -318,7 +318,7 @@ export const DeleteForm = ({ user, penaltys }: { user: User; penaltys: Penalty[]
className="btn-error btn-outline btn-sm w-full"
onClick={async () => {
await deleteUser(user.id);
router.push("/login");
router.push("/logout");
}}
>
<Trash2 size={15} /> Konto sofort löschen