1
+ import React , { useEffect , useState } from 'react' ;
2
+ import { Table , TableBody , TableCell , TableContainer , TableHead , TableRow , Paper , Select , MenuItem , TablePagination , SelectChangeEvent , Grid , Typography , Button } from '@mui/material' ;
3
+ import { useData } from '../data/data.context' ;
4
+ import { updateUser } from '../api/user' ;
5
+
6
+ interface NormalUser {
7
+ email : string ;
8
+ name ?: string ;
9
+ year ?: string ;
10
+ major ?: string ;
11
+ role : string ;
12
+ completed : number ;
13
+ }
14
+
15
+ const ITEMS_PER_PAGE_OPTIONS = [ 5 , 10 ] ; // Number of items to display per page
16
+
17
+ const NormalUsersTable : React . FC = ( ) => {
18
+ const [ normalUsersData , setNormalUsers ] = useState < NormalUser [ ] > ( [ ] ) ;
19
+ const [ currentPage , setCurrentPage ] = useState < number > ( 0 ) ;
20
+ const [ itemsPerPage , setItemsPerPage ] = useState < number > ( ITEMS_PER_PAGE_OPTIONS [ 0 ] ) ;
21
+ const { normalUsers, getNormalUsers } = useData ( ) ;
22
+
23
+ useEffect ( ( ) => {
24
+ async function getUsers ( ) {
25
+ getNormalUsers ( ) ;
26
+ }
27
+ getUsers ( ) ;
28
+ // eslint-disable-next-line react-hooks/exhaustive-deps
29
+ } , [ ] ) ;
30
+
31
+ useEffect ( ( ) => {
32
+ setNormalUsers ( normalUsers ) ;
33
+ console . log ( 'check' )
34
+ } , [ normalUsers ] ) ;
35
+
36
+ const handlePageChange = ( event : unknown , newPage : number ) => {
37
+ setCurrentPage ( newPage ) ;
38
+ } ;
39
+
40
+ const handleChangeItemsPerPage = (
41
+ event : SelectChangeEvent < unknown > ,
42
+ ) => {
43
+ setItemsPerPage ( event . target . value as number ) ;
44
+ setCurrentPage ( 0 ) ;
45
+ } ;
46
+
47
+ const giveAdmin = async ( user : NormalUser , index : number ) => {
48
+ await updateUser ( {
49
+ email : user ?. email ? user ?. email : "" ,
50
+ name : user ?. name ? user ?. name : "" ,
51
+ year : user ?. year ? user ?. year : "" ,
52
+ major : user ?. major ? user . major : "" ,
53
+ role : "admin" ,
54
+ completed : user ?. completed ? user . completed : 0 ,
55
+ } )
56
+ setNormalUsers ( normalUsersData . filter ( ( e , i ) => i !== index ) ) ;
57
+ }
58
+
59
+ const indexOfLastUser = ( currentPage + 1 ) * itemsPerPage ;
60
+ const indexOfFirstUser = indexOfLastUser - itemsPerPage ;
61
+ const currentUsers = normalUsersData . slice ( indexOfFirstUser , indexOfLastUser ) ;
62
+
63
+ return (
64
+ < > < div style = { { maxHeight : '400px' , overflowY : 'auto' , width : '100%' } } >
65
+
66
+ < TableContainer component = { Paper } style = { { margin : '10px' , padding : '10px' } } >
67
+ < Grid container >
68
+ < Grid item xs = { 3 } >
69
+ < Typography fontWeight = { 600 } > Normal Users:</ Typography >
70
+ </ Grid >
71
+ </ Grid >
72
+ < Table style = { { minWidth : 650 , fontSize : '14px' } } >
73
+ < TableHead >
74
+ < TableRow >
75
+ < TableCell > Email</ TableCell >
76
+ < TableCell > Name</ TableCell >
77
+ < TableCell > Year</ TableCell >
78
+ < TableCell > Major</ TableCell >
79
+ { /* <TableCell>Role</TableCell> */ }
80
+ { /* <TableCell>Completed</TableCell> */ }
81
+ < TableCell > Grant Privileges</ TableCell >
82
+ </ TableRow >
83
+ </ TableHead >
84
+ < TableBody >
85
+ { currentUsers . map ( ( user :NormalUser , index :number ) => (
86
+ < TableRow key = { index } >
87
+ < TableCell > { user . email } </ TableCell >
88
+ < TableCell > { user . name } </ TableCell >
89
+ < TableCell > { user . year } </ TableCell >
90
+ < TableCell > { user . major } </ TableCell >
91
+ < TableCell >
92
+ < Button onClick = { ( ) => giveAdmin ( user , index ) } >
93
+ Confirm
94
+ </ Button >
95
+ </ TableCell >
96
+
97
+ { /* <TableCell>{user.role}</TableCell> */ }
98
+ { /* <TableCell>{user.completed}</TableCell> */ }
99
+ </ TableRow >
100
+ ) ) }
101
+ </ TableBody >
102
+ </ Table >
103
+ </ TableContainer >
104
+ </ div > < div style = { { display : 'flex' , alignItems : 'center' } } >
105
+ < Select
106
+ value = { itemsPerPage }
107
+ onChange = { handleChangeItemsPerPage }
108
+ style = { { marginTop : '10px' } }
109
+ >
110
+ { ITEMS_PER_PAGE_OPTIONS . map ( ( option ) => (
111
+ < MenuItem key = { option } value = { option } >
112
+ { `${ option } per page` }
113
+ </ MenuItem >
114
+ ) ) }
115
+ </ Select >
116
+
117
+ < TablePagination
118
+ rowsPerPageOptions = { [ ] }
119
+ component = "div"
120
+ count = { normalUsersData . length }
121
+ rowsPerPage = { itemsPerPage }
122
+ page = { currentPage }
123
+ onPageChange = { handlePageChange } />
124
+ </ div > </ >
125
+
126
+ ) ;
127
+ } ;
128
+
129
+ export default NormalUsersTable ;
0 commit comments