@@ -29,10 +29,17 @@ const STATUS_FILTERS = [
2929 { label : '超时' , value : 'time_limit_exceeded' } ,
3030] ;
3131
32+ const LANGUAGE_FILTERS = [
33+ { label : '全部语言' , value : '' } ,
34+ { label : 'JavaScript' , value : 'javascript' } ,
35+ { label : 'Python' , value : 'python' } ,
36+ ] ;
37+
3238const PAGE_SIZE = 15 ;
3339
3440export default function Submissions ( ) {
3541 const [ statusFilter , setStatusFilter ] = useState ( '' ) ;
42+ const [ languageFilter , setLanguageFilter ] = useState ( '' ) ;
3643 const [ page , setPage ] = useState ( 1 ) ;
3744 const [ data , setData ] = useState < PaginatedResponse < SubmissionType > | null > (
3845 null
@@ -50,6 +57,7 @@ export default function Submissions() {
5057 limit : PAGE_SIZE ,
5158 } ;
5259 if ( statusFilter ) params . status = statusFilter ;
60+ if ( languageFilter ) params . language = languageFilter ;
5361 const res = await api . submissions . list ( params ) ;
5462 setData ( res ) ;
5563 } catch ( err : any ) {
@@ -59,7 +67,7 @@ export default function Submissions() {
5967 } finally {
6068 setLoading ( false ) ;
6169 }
62- } , [ page , statusFilter ] ) ;
70+ } , [ page , statusFilter , languageFilter ] ) ;
6371
6472 useEffect ( ( ) => {
6573 fetchSubmissions ( ) ;
@@ -70,6 +78,11 @@ export default function Submissions() {
7078 setPage ( 1 ) ;
7179 } ;
7280
81+ const handleLanguageChange = ( value : string ) => {
82+ setLanguageFilter ( value ) ;
83+ setPage ( 1 ) ;
84+ } ;
85+
7386 const totalPages = data ? Math . ceil ( data . total / PAGE_SIZE ) : 0 ;
7487
7588 const getPageNumbers = ( ) : ( number | '...' ) [ ] => {
@@ -138,7 +151,7 @@ export default function Submissions() {
138151 </ div >
139152
140153 { /* Status filter */ }
141- < div className = "flex flex-wrap gap-1 mb-6 " >
154+ < div className = "flex flex-wrap gap-1 mb-2 " >
142155 { STATUS_FILTERS . map ( ( opt ) => (
143156 < button
144157 key = { opt . value }
@@ -153,6 +166,22 @@ export default function Submissions() {
153166 </ button >
154167 ) ) }
155168 </ div >
169+ { /* Language filter */ }
170+ < div className = "flex flex-wrap gap-1 mb-6" >
171+ { LANGUAGE_FILTERS . map ( ( opt ) => (
172+ < button
173+ key = { opt . value }
174+ onClick = { ( ) => handleLanguageChange ( opt . value ) }
175+ className = { `px-3 py-1.5 rounded-md text-sm transition-colors ${
176+ languageFilter === opt . value
177+ ? 'bg-emerald-600 text-white'
178+ : 'bg-dark-800 text-gray-300 hover:bg-dark-700'
179+ } `}
180+ >
181+ { opt . label }
182+ </ button >
183+ ) ) }
184+ </ div >
156185
157186 { /* Stats bar */ }
158187 { data && (
0 commit comments