1
- import { useState , useEffect } from 'react' ;
1
+ import { useRef , useState , useEffect } from 'react' ;
2
2
3
3
import Card from '@mui/material/Card' ;
4
4
import Stack from '@mui/material/Stack' ;
@@ -15,56 +15,88 @@ import UserDialog from './user-dialog';
15
15
import TableNoData from '../table-no-data' ;
16
16
import UserTableRow from '../user-table-row' ;
17
17
import UserTableHead from '../user-table-head' ;
18
- import TableEmptyRows from '../table-empty-rows' ;
19
18
import UserTableToolbar from '../user-table-toolbar' ;
20
- import { emptyRows , applyFilter , getComparator } from '../utils' ;
21
19
22
20
// ----------------------------------------------------------------------
23
21
22
+
24
23
export default function UserPage ( ) {
25
24
25
+ const rowsPerPage = 10 ;
26
+
27
+ const fetchWrapper = async ( url ) => {
28
+ try {
29
+ const response = await fetch ( url , {
30
+ credentials : 'include' ,
31
+ } ) ;
32
+
33
+ if ( ! response . ok ) {
34
+ throw new Error ( `HTTP error! status: ${ response . status } ` ) ;
35
+ }
36
+
37
+ const data = await response . json ( ) ;
38
+ return data ;
39
+ } catch ( error ) {
40
+ console . error ( `Fetch failed: ${ error } ` ) ;
41
+ throw error ;
42
+ }
43
+ } ;
44
+
45
+
26
46
const [ page , setPage ] = useState ( 0 ) ;
27
47
28
48
const [ order , setOrder ] = useState ( 'asc' ) ;
29
49
30
- const [ orderBy , setOrderBy ] = useState ( 'name ' ) ;
50
+ const [ orderBy , setOrderBy ] = useState ( 'username ' ) ;
31
51
32
52
const [ filterName , setFilterName ] = useState ( '' ) ;
33
53
34
- const [ rowsPerPage , setRowsPerPage ] = useState ( 5 ) ;
35
-
36
54
// users
37
55
const [ users , setUsers ] = useState ( [ ] ) ;
38
56
const [ selectedUser , setSelectedUser ] = useState ( null ) ;
57
+ const [ total , setTotal ] = useState ( 0 ) ;
39
58
40
59
const [ openDialog , setOpenDialog ] = useState ( false ) ;
41
60
61
+ const prevFilterNameRef = useRef ( ) ;
62
+
42
63
useEffect ( ( ) => {
43
64
const apiUrl = import . meta. env . VITE_API_URL ;
65
+ const prevFilterName = prevFilterNameRef . current ;
66
+
67
+ console . log ( 'page' , page ) ;
68
+
44
69
const loadUsers = async ( ) => {
45
70
try {
46
71
// Load users from the backend using fetch
47
- const response = await fetch ( `${ apiUrl } /v1/users` , {
48
- credentials : 'include' // Crucial setting
49
- } ) ;
50
-
51
- if ( ! response . ok ) {
52
- // throw new Error('Users fetch failed');
53
- console . error ( 'Users fetch failed' , response ) ;
54
- } else {
55
- const data = await response . json ( ) ;
56
- console . log ( 'Users:' , { data } ) ;
57
- setUsers ( data )
58
- }
59
-
60
-
72
+ const data = await fetchWrapper ( `${ apiUrl } /v1/users/search?keyword=${ filterName } &page=${ page } &orderBy=${ orderBy } &order=${ order } ` ) ;
73
+ setUsers ( data ) ;
61
74
} catch ( error ) {
62
75
console . error ( 'Load users error:' , error ) ;
63
76
}
64
77
} ;
65
78
79
+ const loadTotal = async ( ) => {
80
+ try {
81
+ // Load users from the backend using fetch
82
+ const count = await fetchWrapper ( `${ apiUrl } /v1/users/count?keyword=${ filterName } ` ) ;
83
+ setTotal ( count . total ) ;
84
+ } catch ( error ) {
85
+ console . error ( 'Load total error:' , error ) ;
86
+ }
87
+ } ;
88
+
89
+ if ( filterName !== prevFilterName ) {
90
+ setPage ( 0 ) ;
91
+ loadTotal ( ) ;
92
+ }
93
+
66
94
loadUsers ( ) ;
67
- } , [ ] ) ;
95
+
96
+ prevFilterNameRef . current = filterName ;
97
+
98
+ } , [ filterName , page , order , orderBy ] ) ;
99
+
68
100
69
101
const handleSort = ( event , id ) => {
70
102
const isAsc = orderBy === id && order === 'asc' ;
@@ -78,15 +110,10 @@ export default function UserPage() {
78
110
setPage ( newPage ) ;
79
111
} ;
80
112
81
- const handleChangeRowsPerPage = ( event ) => {
82
- setPage ( 0 ) ;
83
- setRowsPerPage ( parseInt ( event . target . value , 10 ) ) ;
84
- } ;
85
-
86
113
const handleFilterByName = ( event ) => {
87
114
// setPage(0);
88
- setFilterName ( event . target . value ) ;
89
115
console . log ( 'handleFilterByName' , event . target . value ) ;
116
+ setFilterName ( event . target . value ) ;
90
117
} ;
91
118
92
119
const handleClick = async ( row ) => {
@@ -95,13 +122,6 @@ export default function UserPage() {
95
122
setOpenDialog ( true ) ;
96
123
}
97
124
98
- const dataFiltered = applyFilter ( {
99
- inputData : users ,
100
- comparator : getComparator ( order , orderBy ) ,
101
- filterName,
102
- } ) ;
103
-
104
- const notFound = ! dataFiltered . length && ! ! filterName ;
105
125
106
126
return (
107
127
< Container >
@@ -133,8 +153,7 @@ export default function UserPage() {
133
153
] }
134
154
/>
135
155
< TableBody >
136
- { dataFiltered
137
- . slice ( page * rowsPerPage , page * rowsPerPage + rowsPerPage )
156
+ { users
138
157
. map ( ( row ) => (
139
158
< UserTableRow
140
159
key = { row . _id }
@@ -145,15 +164,10 @@ export default function UserPage() {
145
164
avatarUrl = { row . avatarUrl }
146
165
public_repos = { row . public_repos }
147
166
handleClick = { ( event ) => handleClick ( row ) }
167
+ searchTerm = { filterName }
148
168
/>
149
169
) ) }
150
-
151
- < TableEmptyRows
152
- height = { 77 }
153
- emptyRows = { emptyRows ( page , rowsPerPage , users . length ) }
154
- />
155
-
156
- { notFound && < TableNoData query = { filterName } /> }
170
+ { ! total && < TableNoData query = { filterName } /> }
157
171
</ TableBody >
158
172
</ Table >
159
173
</ TableContainer >
@@ -162,11 +176,10 @@ export default function UserPage() {
162
176
< TablePagination
163
177
page = { page }
164
178
component = "div"
165
- count = { users . length }
166
- rowsPerPage = { rowsPerPage }
179
+ count = { total }
167
180
onPageChange = { handleChangePage }
168
- rowsPerPageOptions = { [ 5 , 10 , 25 ] }
169
- onRowsPerPageChange = { handleChangeRowsPerPage }
181
+ rowsPerPage = { rowsPerPage }
182
+ rowsPerPageOptions = { [ ] }
170
183
/>
171
184
</ Card >
172
185
{ selectedUser && < UserDialog open = { openDialog } setOpen = { setOpenDialog } user = { selectedUser } setSelectedUser = { setSelectedUser } /> }
0 commit comments