@@ -4,42 +4,63 @@ import React, { useEffect, useState } from 'react'
44import Grid from '@material-ui/core/Grid'
55import {
66 makeStyles ,
7+ Paper ,
78 TableContainer ,
89 Table ,
910 TableCell ,
1011 TableRow ,
1112 TableHead ,
12- Paper ,
13+ TableBody ,
1314 TableFooter ,
1415} from '@material-ui/core'
1516
17+ import { Alert , AlertTitle } from '@material-ui/lab'
18+
1619import api from '@/_api'
1720
18- import BasePageContainer from '../../.. /_common/BasePageContainer'
19- import BasePageToolbar from '../../.. /_common/BasePageToolbar'
20- import { BaseTablePagination } from '../../.. /_common/BaseTable'
21+ import BasePageContainer from '@ /_common/BasePageContainer'
22+ import BasePageToolbar from '@ /_common/BasePageToolbar'
23+ import { BaseTablePagination } from '@ /_common/BaseTable'
2124
22- import UsersListTableBody from './UsersListTableBody '
25+ import UsersListTableItems from './UsersListTableItems '
2326
2427const UsersList = ( { match } ) => {
2528 const classes = useStyles ( )
2629
30+ const [ status , setStatus ] = React . useState ( 'idle' )
31+ const [ statusMessage , setStatusMessage ] = React . useState ( '' )
2732 const [ page , setPage ] = React . useState ( 0 )
2833 const [ usersData , setUsersData ] = useState ( { users : [ ] , count : 0 } )
2934 const [ rowsPerPage , setRowsPerPage ] = React . useState ( 10 )
3035
36+ // Request users
3137 useEffect ( ( ) => {
3238 async function fetchUsers ( ) {
33- const userDataRes = await api . users . getList ( {
34- limit : rowsPerPage ,
35- offset : page * rowsPerPage ,
36- } )
37-
38- setUsersData ( userDataRes )
39+ setStatus ( 'loading' )
40+
41+ try {
42+ const userDataRes = await api . users . getList ( {
43+ limit : rowsPerPage ,
44+ offset : page * rowsPerPage ,
45+ } )
46+
47+ // Make some artificial delay
48+ await new Promise ( resolve => {
49+ setTimeout ( ( ) => resolve ( true ) , 1000 )
50+ } )
51+
52+ setStatus ( 'idle' )
53+ setUsersData ( userDataRes )
54+ } catch ( err ) {
55+ console . log ( 'error' , err . message )
56+
57+ setStatus ( 'error' )
58+ setStatusMessage ( err . message )
59+ }
3960 }
4061
4162 fetchUsers ( )
42- } , [ page , rowsPerPage ] )
63+ } , [ page , rowsPerPage , usersData . count ] )
4364
4465 const handleChangePage = ( event , newPage ) => {
4566 setPage ( newPage )
@@ -51,38 +72,54 @@ const UsersList = ({ match }) => {
5172 }
5273
5374 const { users, count } = usersData
75+ const rowsExpected = count ? Math . max ( count - rowsPerPage * page , 0 ) : rowsPerPage
5476
5577 return (
5678 < BasePageContainer >
5779 < BasePageToolbar title = { 'Users Adminstration' } > </ BasePageToolbar >
5880 < Grid container spacing = { 3 } >
5981 < Grid item xs = { 12 } >
60- < TableContainer component = { Paper } >
61- < Table className = { classes . table } aria-label = "custom pagination table" >
62- < TableHead >
63- < TableRow >
64- < TableCell > Avatar</ TableCell >
65- < TableCell > First Name</ TableCell >
66- < TableCell > Last Name</ TableCell >
67- < TableCell > Username</ TableCell >
68- < TableCell > Email</ TableCell >
69- < TableCell > Actions</ TableCell >
70- </ TableRow >
71- </ TableHead >
72- < UsersListTableBody users = { users } count = { count } rowsPerPage = { rowsPerPage } />
73- < TableFooter >
74- < TableRow >
75- < BaseTablePagination
76- page = { page }
82+ { status === 'error' && (
83+ < Alert severity = "error" >
84+ < AlertTitle > Error</ AlertTitle >
85+ { statusMessage }
86+ </ Alert >
87+ ) }
88+
89+ { status !== 'error' && (
90+ < TableContainer component = { Paper } >
91+ < Table className = { classes . table } aria-label = "custom pagination table" >
92+ < TableHead >
93+ < TableRow >
94+ < TableCell > Avatar</ TableCell >
95+ < TableCell > First Name</ TableCell >
96+ < TableCell > Last Name</ TableCell >
97+ < TableCell > Username</ TableCell >
98+ < TableCell > Email</ TableCell >
99+ < TableCell > Actions</ TableCell >
100+ </ TableRow >
101+ </ TableHead >
102+ < TableBody >
103+ < UsersListTableItems
104+ users = { status === 'loading' ? [ ] : users }
77105 rowsPerPage = { rowsPerPage }
78- count = { count }
79- onChangePage = { handleChangePage }
80- onChangeRowsPerPage = { handleChangeRowsPerPage }
106+ rowsExpected = { rowsExpected }
81107 />
82- </ TableRow >
83- </ TableFooter >
84- </ Table >
85- </ TableContainer >
108+ </ TableBody >
109+ < TableFooter >
110+ < TableRow >
111+ < BaseTablePagination
112+ page = { page }
113+ rowsPerPage = { rowsPerPage }
114+ count = { count }
115+ onChangePage = { handleChangePage }
116+ onChangeRowsPerPage = { handleChangeRowsPerPage }
117+ />
118+ </ TableRow >
119+ </ TableFooter >
120+ </ Table >
121+ </ TableContainer >
122+ ) }
86123 </ Grid >
87124 </ Grid >
88125 </ BasePageContainer >
0 commit comments