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