diff --git a/components/bounty/SubmissionsReview.tsx b/components/bounty/SubmissionsReview.tsx new file mode 100644 index 000000000..9a2db6943 --- /dev/null +++ b/components/bounty/SubmissionsReview.tsx @@ -0,0 +1,122 @@ + +"use client"; +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { ExternalLink, FileText, CheckCircle, Clock } from "lucide-react"; + +interface Submission { + id: string; + applicantName: string; + applicantAddress: string; + contentUri: string; + anchorStatus: "pending" | "anchored" | "failed"; + submittedAt: string; + preSelected?: boolean; +} + +interface SubmissionsReviewProps { + submissions: Submission[]; + submissionVisibility: "public" | "hidden_until_deadline"; + deadlinePassed: boolean; + prizeTiers: { position: number; label: string; amount: number }[]; + onPreSelect: (submissionId: string, position: number) => void; + onClearSelect: (submissionId: string) => void; +} + +export function SubmissionsReview({ + submissions, submissionVisibility, deadlinePassed, prizeTiers, onPreSelect, onClearSelect +}: SubmissionsReviewProps) { + const [selected, setSelected] = useState>({}); + const gated = submissionVisibility === "hidden_until_deadline" && !deadlinePassed; + + const handlePreSelect = (subId: string, position: number) => { + setSelected(prev => ({ ...prev, [subId]: position })); + onPreSelect(subId, position); + }; + + const handleClear = (subId: string) => { + setSelected(prev => { const n = { ...prev }; delete n[subId]; return n; }); + onClearSelect(subId); + }; + + if (gated) { + return ( + + + +

Submissions are hidden until the deadline passes.

+
+
+ ); + } + + return ( +
+
+

+ {submissions.length} submission{submissions.length !== 1 ? "s" : ""} +

+ {Object.keys(selected).length > 0 && ( + {Object.keys(selected).length} pre-selected + )} +
+ + {submissions.length === 0 && ( + + +

No submissions yet.

+
+ )} + + {submissions.map(sub => { + const tier = selected[sub.id]; + return ( + + +
+
+ {sub.applicantName} + + {sub.applicantAddress.slice(0,8)}...{sub.applicantAddress.slice(-6)} + +
+
+ + {sub.anchorStatus} + + {tier !== undefined && ( + + + Position {tier} + + )} +
+
+
+ + + View submission + +

+ Submitted {new Date(sub.submittedAt).toLocaleDateString()} +

+
+ {prizeTiers.map(t => ( + + ))} +
+
+
+ ); + })} +
+ ); +} +export default SubmissionsReview;