diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx index 6e4eb82..f8de101 100644 --- a/src/components/Footer.jsx +++ b/src/components/Footer.jsx @@ -83,5 +83,5 @@ export function Footer() { - ); + ) } diff --git a/src/components/moderation/ViewReport.jsx b/src/components/moderation/ViewReport.jsx new file mode 100644 index 0000000..ab10eb0 --- /dev/null +++ b/src/components/moderation/ViewReport.jsx @@ -0,0 +1,132 @@ +import { Fragment } from 'react' +import { Dialog, Transition } from '@headlessui/react' + +export default function ViewReport({ open, setOpen, report }) { + // Parse metadata if it exists and is a string + const metadata = report?.metadata ? + (typeof report.metadata === 'string' ? JSON.parse(report.metadata) : report.metadata) + : {}; + + return ( + + + +
+ + +
+
+ + +
+
+ + Report Details + +
+
+
+

Type:

+

{report?.type}

+
+ + {metadata.reportedUserId && ( +
+

Reported User ID:

+ + + {metadata.reportedUserId} + + +
+ )} + + {metadata.challengeId && ( +
+

Challenge ID:

+

{metadata.challengeId}

+
+ )} + + {metadata.url && ( +
+

URL:

+

{metadata.url}

+
+ )} + + {metadata.severity && ( +
+

Severity:

+

+ + {metadata.severity} + +

+
+ )} + + {metadata.featureType && ( +
+

Feature Type:

+

{metadata.featureType}

+
+ )} + +
+

Description:

+

+ {report?.desc} +

+
+ +
+

Submitted:

+

{report?.createdAt && new Date(report.createdAt).toLocaleString()}

+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx index 1e476d7..cc9bae2 100644 --- a/src/pages/_app.jsx +++ b/src/pages/_app.jsx @@ -46,7 +46,7 @@ export default function App({ Component, pageProps }) { return - ; + diff --git a/src/pages/_document.jsx b/src/pages/_document.jsx index 506c49d..c6746ec 100644 --- a/src/pages/_document.jsx +++ b/src/pages/_document.jsx @@ -57,7 +57,7 @@ class MyDocument extends Document { - ); + ) } } diff --git a/src/pages/challenges/[...id].jsx b/src/pages/challenges/[...id].jsx index f7df743..8488c1b 100644 --- a/src/pages/challenges/[...id].jsx +++ b/src/pages/challenges/[...id].jsx @@ -623,7 +623,7 @@ function TabLink({ tabName, selected, url, className }) { 'Hints': 'fas fa-question text-red-500', 'Description': 'fas fa-info-circle text-blue-500', 'AI': 'fas fa-robot text-orange-500', - }[tabName] || 'fas fa-file-alt text-blue-500'; + }[tabName] || 'fas fa-file-alt text-blue-500' return ( @@ -1069,7 +1069,7 @@ function WriteUpPage({ cache, setCache, onWriteupSelect }) { -

window.location.href = `../../users/${writeup.user.username}`}>@{writeup.user.username}

+

@{writeup.user.username}

@@ -1274,42 +1274,46 @@ function LeaderboardPage({ cache, setCache }) {
{leaderboard.length > 0 ? ( - leaderboard.slice(0, 10).map((entry, index) => { - let color; - switch (index) { - case 0: - color = "from-yellow-700 to-yellow-800"; // gold - break; - case 1: - color = "from-gray-700 to-gray-800"; // silver - break; - case 2: - color = "from-orange-800 to-orange-900"; // bronze - break; - default: - color = "bg-neutral-700"; // default color for others - } - return ( -
-
-
- {`${entry.user.username}'s - {index + 1}. - - - {entry.user.username} - - +
+ {leaderboard.slice(0, 10).map((entry, index) => { + let color; + switch (index) { + case 0: + color = "from-yellow-700 to-yellow-800"; // gold + break; + case 1: + color = "from-gray-700 to-gray-800"; // silver + break; + case 2: + color = "from-orange-800 to-orange-900"; // bronze + break; + default: + color = "bg-neutral-700"; // default color for others + } + return ( +
+
+
+ {`${entry.user.username}'s + {index + 1}. + + + {entry.user.username} + + +
+
{entry.points} points
-
{entry.points} points
-
- ) - }) + ) + })} + {/* Add fade-out overlay that stays anchored */} +
+
) : (
diff --git a/src/pages/moderation.jsx b/src/pages/moderation.jsx index 6e7a1e9..31fa1b8 100644 --- a/src/pages/moderation.jsx +++ b/src/pages/moderation.jsx @@ -13,6 +13,7 @@ import request from '@/utils/request'; import { MyTable } from '@/components/Table'; import { TableHead, TableRow, TableHeader, TableCell, TableBody, Table } from "@/components/ui/table" import ViewChallenge from '@/components/moderation/ViewChallenge'; +import ViewReport from '@/components/moderation/ViewReport'; export default function Competitions() { const [selectedChallenges, setSelectedChallenges] = useState([]); @@ -25,6 +26,8 @@ export default function Competitions() { const [bonusPoints, setBonusPoints] = useState(0); + const [selectedReport, setSelectedReport] = useState(null); + const [reportIsOpen, setReportIsOpen] = useState(false); // get reports @@ -323,7 +326,7 @@ export default function Competitions() { return ( <> - Leaderboards - CTFGuide + CTFGuide Moderation Panel