@@ -11,8 +11,30 @@ class App extends React.Component {
11
11
repos : [ ] ,
12
12
userDataError : null ,
13
13
loading : false ,
14
- pageSize : '10' ,
14
+ pageSize : 10 ,
15
15
page : 1 ,
16
+ fetchingRepos : false ,
17
+ } ;
18
+
19
+ componentDidMount ( ) {
20
+ window . addEventListener ( 'scroll' , this . handleScroll ) ;
21
+ }
22
+
23
+ componentWillUnmount ( ) {
24
+ window . removeEventListener ( 'scroll' , this . hanleScroll ) ;
25
+ }
26
+
27
+ handleScroll = ( ) => {
28
+ const currentScroll = window . scrollY ;
29
+ const maxScroll = window . scrollMaxY ;
30
+ const { page, pageSize, user } = this . state ;
31
+
32
+ if (
33
+ user &&
34
+ maxScroll - currentScroll <= 100 &&
35
+ ( page - 1 ) * pageSize < user . public_repos
36
+ )
37
+ this . loadPage ( ) ;
16
38
} ;
17
39
18
40
fetchUserData = async username => {
@@ -56,6 +78,7 @@ class App extends React.Component {
56
78
return this . setState ( {
57
79
user : user . data ,
58
80
repos : repos . data ,
81
+ page : 2 ,
59
82
loading : false ,
60
83
} ) ;
61
84
}
@@ -75,38 +98,22 @@ class App extends React.Component {
75
98
} ;
76
99
77
100
loadPage = async ( ) => {
78
- const { data } = await this . fetchRepos (
79
- this . state . user . login ,
80
- this . state . page ,
81
- ) ;
101
+ if ( this . state . fetchingRepos === true ) return ;
82
102
83
- if ( data )
84
- this . setState ( state => ( {
85
- repos : data ,
86
- } ) ) ;
87
- } ;
103
+ this . setState ( { fetchingRepos : true } , async ( ) => {
104
+ const { data } = await this . fetchRepos ( this . state . user . login ) ;
88
105
89
- handlePageChange = page => {
90
- this . setState ( { page } , ( ) => this . loadPage ( ) ) ;
106
+ if ( data )
107
+ this . setState ( state => ( {
108
+ repos : [ ...state . repos , ...data ] ,
109
+ page : state . page + 1 ,
110
+ fetchingRepos : false ,
111
+ } ) ) ;
112
+ } ) ;
91
113
} ;
92
114
93
- handlePageSizeChange = e =>
94
- this . setState (
95
- {
96
- pageSize : e . target . value ,
97
- } ,
98
- ( ) => this . loadPage ( ) ,
99
- ) ;
100
-
101
115
render ( ) {
102
- const {
103
- userDataError,
104
- reposError,
105
- loading,
106
- user,
107
- repos,
108
- pageSize,
109
- } = this . state ;
116
+ const { userDataError, reposError, loading, user, repos } = this . state ;
110
117
111
118
const renderRepos = ! loading && ! reposError && ! ! repos . length ;
112
119
@@ -123,30 +130,6 @@ class App extends React.Component {
123
130
124
131
{ renderRepos && (
125
132
< 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
133
{ repos . map ( repo => (
151
134
< RepoCard key = { repo . id } repo = { repo } />
152
135
) ) }
0 commit comments