@@ -3,14 +3,15 @@ import Search from './components/Search';
3
3
import UserCard from './components/UserCard' ;
4
4
import RepoCard from './components/RepoCard' ;
5
5
6
- const PAGE_SIZE = 30 ;
6
+ const PAGE_SIZE = 10 ;
7
7
8
8
class App extends React . Component {
9
9
state = {
10
10
user : null ,
11
11
repos : [ ] ,
12
12
userDataError : null ,
13
13
loading : false ,
14
+ pageSize : '10' ,
14
15
page : 1 ,
15
16
} ;
16
17
@@ -28,14 +29,14 @@ class App extends React.Component {
28
29
} ;
29
30
30
31
fetchRepos = async username => {
31
- const { page } = this . state ;
32
+ const { pageSize , page } = this . state ;
32
33
const res = await fetch (
33
- `https://api.github.com/users/${ username } /repos?page=${ page } &per_page=${ PAGE_SIZE } ` ,
34
+ `https://api.github.com/users/${ username } /repos?page=${ page } &per_page=${ pageSize } ` ,
34
35
) ;
35
36
if ( res . ok ) {
36
37
const data = await res . json ( ) ;
37
38
38
- return { data, page : page + 1 } ;
39
+ return { data } ;
39
40
}
40
41
41
42
const error = ( await res . json ( ) ) . message ;
@@ -55,7 +56,6 @@ class App extends React.Component {
55
56
return this . setState ( {
56
57
user : user . data ,
57
58
repos : repos . data ,
58
- page : repos . page ,
59
59
loading : false ,
60
60
} ) ;
61
61
}
@@ -74,26 +74,42 @@ class App extends React.Component {
74
74
} ) ;
75
75
} ;
76
76
77
- loadMore = async ( ) => {
78
- const { data, page } = await this . fetchRepos ( this . state . user . login ) ;
77
+ loadPage = async ( ) => {
78
+ const { data } = await this . fetchRepos (
79
+ this . state . user . login ,
80
+ this . state . page ,
81
+ ) ;
79
82
80
83
if ( data )
81
84
this . setState ( state => ( {
82
- repos : [ ...state . repos , ...data ] ,
83
- page,
85
+ repos : data ,
84
86
} ) ) ;
85
87
} ;
86
88
89
+ handlePageChange = page => {
90
+ this . setState ( { page } , ( ) => this . loadPage ( ) ) ;
91
+ } ;
92
+
93
+ handlePageSizeChange = e =>
94
+ this . setState (
95
+ {
96
+ pageSize : e . target . value ,
97
+ } ,
98
+ ( ) => this . loadPage ( ) ,
99
+ ) ;
100
+
87
101
render ( ) {
88
102
const {
89
103
userDataError,
90
104
reposError,
91
105
loading,
92
106
user,
93
107
repos,
94
- page ,
108
+ pageSize ,
95
109
} = this . state ;
96
110
111
+ const renderRepos = ! loading && ! reposError && ! ! repos . length ;
112
+
97
113
return (
98
114
< div >
99
115
< Search fetchData = { this . fetchData } />
@@ -105,18 +121,37 @@ class App extends React.Component {
105
121
{ ! loading && ! userDataError && user && < UserCard user = { user } /> }
106
122
{ reposError && < p className = "text-danger" > { reposError } </ p > }
107
123
108
- { ! loading &&
109
- ! reposError &&
110
- repos . map ( repo => < RepoCard key = { repo . id } repo = { repo } /> ) }
111
-
112
- { ! loading &&
113
- ! userDataError &&
114
- user &&
115
- ( page - 1 ) * PAGE_SIZE < user . public_repos && (
116
- < button className = "btn btn-success" onClick = { this . loadMore } >
117
- Load More
118
- </ button >
119
- ) }
124
+ { renderRepos && (
125
+ < React . Fragment >
126
+ < div className = "mb-4" >
127
+ { [ ...new Array ( Math . ceil ( user . public_repos / pageSize ) ) ] . map (
128
+ ( _ , index ) => (
129
+ < button
130
+ key = { index }
131
+ className = "btn btn-success mr-2"
132
+ onClick = { ( ) => this . handlePageChange ( index + 1 ) } >
133
+ { index + 1 }
134
+ </ button >
135
+ ) ,
136
+ ) }
137
+ </ div >
138
+
139
+ < div className = "d-inline-block mb-4" >
140
+ < select
141
+ className = "form-control"
142
+ value = { pageSize }
143
+ onChange = { this . handlePageSizeChange } >
144
+ < option value = "10" > 10</ option >
145
+ < option value = "20" > 20</ option >
146
+ < option value = "30" > 30</ option >
147
+ </ select >
148
+ </ div >
149
+
150
+ { repos . map ( repo => (
151
+ < RepoCard key = { repo . id } repo = { repo } />
152
+ ) ) }
153
+ </ React . Fragment >
154
+ ) }
120
155
</ div >
121
156
</ div >
122
157
) ;
0 commit comments