1- import { useUserSubmissions } from '@/features/events/hooks/useUserSubmissions'
2- import { Card , CardContent , CardHeader , CardTitle } from '@/shared/components/ui/card'
3- import { Badge } from '@/shared/components/ui/badge'
4- import { Button } from '@/shared/components/ui/button'
5- import { Calendar , ExternalLink , Clock , CheckCircle , XCircle , AlertCircle } from 'lucide-react'
6- import { formatPrettyDate } from '@/shared/lib/dateUtils'
7- import type { EventSubmission } from '@/features/events/types/submission'
8- import { useNavigate } from 'react-router-dom'
1+ import { useUserSubmissions } from "@/features/events/hooks/useUserSubmissions" ;
2+ import {
3+ Card ,
4+ CardContent ,
5+ CardHeader ,
6+ CardTitle ,
7+ } from "@/shared/components/ui/card" ;
8+ import { Badge } from "@/shared/components/ui/badge" ;
9+ import { Button } from "@/shared/components/ui/button" ;
10+ import {
11+ Calendar ,
12+ ExternalLink ,
13+ Clock ,
14+ CheckCircle ,
15+ XCircle ,
16+ AlertCircle ,
17+ Trash2 ,
18+ } from "lucide-react" ;
19+ import { formatPrettyDate } from "@/shared/lib/dateUtils" ;
20+ import type { EventSubmission } from "@/features/events/types/submission" ;
21+ import { useNavigate } from "react-router-dom" ;
922
1023export function MySubmissionsPage ( ) {
11- const { data : submissions = [ ] , isLoading } = useUserSubmissions ( )
12- const navigate = useNavigate ( )
24+ const {
25+ data : submissions = [ ] ,
26+ isLoading,
27+ removeSubmission,
28+ isDeleting,
29+ } = useUserSubmissions ( ) ;
30+ const navigate = useNavigate ( ) ;
1331 // Type assertion to fix TypeScript issues
14- const submissionsArray = submissions as EventSubmission [ ]
32+ const submissionsArray = submissions as EventSubmission [ ] ;
1533
1634 const getStatusIcon = ( status : string ) => {
1735 switch ( status ) {
18- case ' approved' :
19- return < CheckCircle className = "h-4 w-4 text-green-600" />
20- case ' rejected' :
21- return < XCircle className = "h-4 w-4 text-red-600" />
22- case ' pending' :
23- return < AlertCircle className = "h-4 w-4 text-yellow-600" />
36+ case " approved" :
37+ return < CheckCircle className = "h-4 w-4 text-green-600" /> ;
38+ case " rejected" :
39+ return < XCircle className = "h-4 w-4 text-red-600" /> ;
40+ case " pending" :
41+ return < AlertCircle className = "h-4 w-4 text-yellow-600" /> ;
2442 default :
25- return < AlertCircle className = "h-4 w-4 text-gray-600" />
43+ return < AlertCircle className = "h-4 w-4 text-gray-600" /> ;
2644 }
27- }
45+ } ;
2846
2947 const getStatusBadgeVariant = ( status : string ) => {
3048 switch ( status ) {
31- case ' approved' :
32- return ' default' as const
33- case ' rejected' :
34- return ' destructive' as const
35- case ' pending' :
36- return ' secondary' as const
49+ case " approved" :
50+ return " default" as const ;
51+ case " rejected" :
52+ return " destructive" as const ;
53+ case " pending" :
54+ return " secondary" as const ;
3755 default :
38- return ' outline' as const
56+ return " outline" as const ;
3957 }
40- }
58+ } ;
4159
4260 if ( isLoading ) {
4361 return (
4462 < div className = "min-h-screen bg-gray-50 dark:bg-gray-900 py-12 px-4 sm:px-6 lg:px-8" >
4563 < div className = "max-w-6xl mx-auto" >
4664 < div className = "text-center py-12" >
4765 < div className = "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto" > </ div >
48- < p className = "mt-4 text-gray-600 dark:text-gray-400" > Loading your submissions...</ p >
66+ < p className = "mt-4 text-gray-600 dark:text-gray-400" >
67+ Loading your submissions...
68+ </ p >
4969 </ div >
5070 </ div >
5171 </ div >
52- )
72+ ) ;
5373 }
5474
5575 return (
@@ -77,7 +97,7 @@ export function MySubmissionsPage() {
7797 < p className = "text-gray-600 dark:text-gray-400 mb-6" >
7898 Submit your first event to get started!
7999 </ p >
80- < Button onClick = { ( ) => navigate ( ' /submit' ) } >
100+ < Button onClick = { ( ) => navigate ( " /submit" ) } >
81101 Submit Event
82102 </ Button >
83103 </ div >
@@ -86,12 +106,17 @@ export function MySubmissionsPage() {
86106 ) : (
87107 < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" >
88108 { submissionsArray . map ( ( submission ) => (
89- < Card key = { submission . id } className = "hover:shadow-lg transition-shadow" >
109+ < Card
110+ key = { submission . id }
111+ className = "hover:shadow-lg transition-shadow"
112+ >
90113 < CardHeader className = "pb-3" >
91114 < div className = "flex items-start justify-between" >
92115 < div className = "flex items-center gap-2" >
93116 { getStatusIcon ( submission . status ) }
94- < CardTitle className = "text-lg" > Submission #{ submission . id } </ CardTitle >
117+ < CardTitle className = "text-lg" >
118+ Submission #{ submission . id }
119+ </ CardTitle >
95120 </ div >
96121 < Badge variant = { getStatusBadgeVariant ( submission . status ) } >
97122 { submission . status }
@@ -162,19 +187,42 @@ export function MySubmissionsPage() {
162187 < Button
163188 variant = "outline"
164189 size = "sm"
165- onClick = { ( ) => navigate ( `/events/${ submission . created_event_id } ` ) }
190+ onClick = { ( ) =>
191+ navigate ( `/events/${ submission . created_event_id } ` )
192+ }
166193 className = "w-full"
167194 >
168195 View Created Event
169196 </ Button >
170197 </ div >
171198 ) }
199+
200+ { /* Remove Button (only if not approved) */ }
201+ { submission . status !== "approved" && (
202+ < Button
203+ variant = "destructive"
204+ size = "sm"
205+ className = "w-full"
206+ disabled = { isDeleting }
207+ onClick = { ( ) => {
208+ const confirmed = window . confirm (
209+ "Remove this submission? If it created an event, that event will also be removed. This cannot be undone."
210+ ) ;
211+ if ( confirmed ) {
212+ removeSubmission ( submission . id ) ;
213+ }
214+ } }
215+ >
216+ < Trash2 className = "h-4 w-4 mr-2" />
217+ Remove Submission
218+ </ Button >
219+ ) }
172220 </ CardContent >
173221 </ Card >
174222 ) ) }
175223 </ div >
176224 ) }
177225 </ div >
178226 </ div >
179- )
227+ ) ;
180228}
0 commit comments