@@ -17,6 +17,7 @@ import {
1717 TableHeader ,
1818 TableRow ,
1919} from "@/components/ui/table" ;
20+ import { Button } from "@/components/ui/button" ;
2021
2122interface Props {
2223 verifyFilter : VerifyStatus ;
@@ -41,7 +42,8 @@ const LANGUAGE_TEST_OPTIONS: { value: LanguageTestType; label: string }[] = [
4142
4243export function LanguageScoreTable ( { verifyFilter } : Props ) {
4344 const [ scores , setScores ] = useState < LanguageScoreWithUser [ ] > ( [ ] ) ;
44- const [ page ] = useState ( 1 ) ;
45+ const [ page , setPage ] = useState ( 1 ) ;
46+ const [ totalPages , setTotalPages ] = useState ( 1 ) ;
4547 const [ loading , setLoading ] = useState ( false ) ;
4648 const [ editingId , setEditingId ] = useState < number | null > ( null ) ;
4749 const [ editingScore , setEditingScore ] = useState < string > ( "" ) ;
@@ -55,6 +57,7 @@ export function LanguageScoreTable({ verifyFilter }: Props) {
5557 page ,
5658 ) ;
5759 setScores ( response . content ) ;
60+ setTotalPages ( response . totalPages ) ;
5861 } catch ( error ) {
5962 console . error ( "Failed to fetch Language scores:" , error ) ;
6063 } finally {
@@ -122,6 +125,11 @@ export function LanguageScoreTable({ verifyFilter }: Props) {
122125 }
123126 } ;
124127
128+ const handlePageChange = ( newPage : number ) => {
129+ if ( newPage < 1 || newPage > totalPages ) return ;
130+ setPage ( newPage ) ;
131+ } ;
132+
125133 return (
126134 < div className = "rounded-lg border bg-white shadow" >
127135 < div className = "overflow-x-auto" >
@@ -211,31 +219,31 @@ export function LanguageScoreTable({ verifyFilter }: Props) {
211219 onChange = { ( e ) => setEditingScore ( e . target . value ) }
212220 className = "w-20 rounded border px-2 py-1"
213221 />
214- < button
222+ < Button
215223 onClick = { ( ) => handleSave ( score ) }
216- className = "rounded bg-blue-500 px-2 py-1 text-white hover:bg-blue-600 "
224+ variant = "default "
217225 >
218226 저장
219- </ button >
220- < button
227+ </ Button >
228+ < Button
221229 onClick = { ( ) => setEditingId ( null ) }
222- className = "rounded bg-gray-500 px-2 py-1 text-white hover:bg-gray-600 "
230+ variant = "secondary "
223231 >
224232 취소
225- </ button >
233+ </ Button >
226234 </ div >
227235 ) : (
228236 < div className = "flex gap-2" >
229237 {
230238 score . languageTestScoreStatusResponse
231239 . languageTestResponse . languageTestScore
232240 }
233- < button
241+ < Button
234242 onClick = { ( ) => handleEdit ( score ) }
235- className = "rounded bg-gray-100 px-2 py-1 text-gray-600 hover:bg-gray-200 "
243+ variant = "secondary "
236244 >
237245 수정
238- </ button >
246+ </ Button >
239247 </ div >
240248 ) }
241249 </ TableCell >
@@ -286,6 +294,31 @@ export function LanguageScoreTable({ verifyFilter }: Props) {
286294 </ TableBody >
287295 </ Table >
288296 </ div >
297+ < div className = "mt-4 flex items-center justify-center gap-2" >
298+ < Button
299+ onClick = { ( ) => handlePageChange ( page - 1 ) }
300+ disabled = { page === 1 }
301+ variant = "secondary"
302+ >
303+ 이전
304+ </ Button >
305+ { Array . from ( { length : totalPages } , ( _ , idx ) => (
306+ < Button
307+ key = { idx + 1 }
308+ onClick = { ( ) => handlePageChange ( idx + 1 ) }
309+ variant = { page === idx + 1 ? "default" : "secondary" }
310+ >
311+ { idx + 1 }
312+ </ Button >
313+ ) ) }
314+ < Button
315+ onClick = { ( ) => handlePageChange ( page + 1 ) }
316+ disabled = { page === totalPages }
317+ variant = "secondary"
318+ >
319+ 다음
320+ </ Button >
321+ </ div >
289322 </ div >
290323 ) ;
291324}
0 commit comments