11'use client' ;
22
3- import React , { useCallback , useEffect , useMemo , useState } from 'react' ;
3+ import React , { useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
44import {
55 Button ,
66 Chip ,
@@ -53,6 +53,9 @@ export default function AdminUsersPage() {
5353 const [ totalPages , setTotalPages ] = useState ( 1 ) ;
5454 const [ totalUsers , setTotalUsers ] = useState ( 0 ) ;
5555 const [ sortDescriptor , setSortDescriptor ] = useState ( { column : 'name' , direction : 'ascending' } ) ;
56+ const [ pendingSort , setPendingSort ] = useState ( sortDescriptor ) ;
57+ const sortTimerRef = useRef ( null ) ;
58+ const lastQueryRef = useRef ( { page, q : query , sort : sortDescriptor } ) ;
5659
5760 /** 내 정보(자기 자신 삭제/변경 방지용) */
5861 const me = useMemo ( ( ) => {
@@ -99,8 +102,11 @@ export default function AdminUsersPage() {
99102 } ) , [ ] ) ;
100103
101104 const fetchUsers = useCallback ( async ( ) => {
102- setLoading ( true ) ;
103105 setErr ( '' ) ;
106+ const keyNow = JSON . stringify ( { page, q : query , sort : sortDescriptor } ) ;
107+ const keyPrev = JSON . stringify ( lastQueryRef . current ) ;
108+ if ( keyNow === keyPrev ) return ;
109+ setLoading ( true ) ;
104110 try {
105111 const sort = sortColMap [ sortDescriptor . column ] || 'name' ;
106112 const dir = sortDescriptor . direction === 'descending' ? 'DESC' : 'ASC' ;
@@ -126,6 +132,7 @@ export default function AdminUsersPage() {
126132 const total = meta ?. totalElements ?? pageData ?. totalElements ?? content . length ;
127133 setTotalUsers ( total ) ;
128134 setTotalPages ( Math . max ( 1 , Math . ceil ( total / rowsPerPage ) ) ) ;
135+ lastQueryRef . current = { page, q : query , sort : sortDescriptor } ;
129136 } catch ( e ) {
130137 setErr ( e ?. message || '사용자 목록을 불러오지 못했습니다.' ) ;
131138 setRows ( [ ] ) ;
@@ -140,6 +147,14 @@ export default function AdminUsersPage() {
140147 fetchUsers ( ) ;
141148 } , [ fetchUsers ] ) ;
142149
150+ useEffect ( ( ) => {
151+ if ( sortTimerRef . current ) clearTimeout ( sortTimerRef . current ) ;
152+ sortTimerRef . current = setTimeout ( ( ) => {
153+ setSortDescriptor ( pendingSort ) ;
154+ } , 250 ) ;
155+ return ( ) => clearTimeout ( sortTimerRef . current ) ;
156+ } , [ pendingSort ] ) ;
157+
143158 const onSearch = useCallback ( ( ) => {
144159 setPage ( 1 ) ;
145160 setQuery ( ( searchValue || '' ) . trim ( ) ) ;
@@ -208,8 +223,8 @@ export default function AdminUsersPage() {
208223 < Table
209224 aria-label = "Users table"
210225 className = "dark"
211- sortDescriptor = { sortDescriptor }
212- onSortChange = { setSortDescriptor }
226+ sortDescriptor = { pendingSort }
227+ onSortChange = { setPendingSort }
213228 bottomContent = { < AdminTableBottomContent
214229 page = { page }
215230 totalPages = { totalPages }
0 commit comments