Skip to content

Commit 2f78f80

Browse files
committed
Infinite Scroll
1 parent 1ebe402 commit 2f78f80

File tree

1 file changed

+35
-52
lines changed

1 file changed

+35
-52
lines changed

src/App.js

Lines changed: 35 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,30 @@ class App extends React.Component {
1111
repos: [],
1212
userDataError: null,
1313
loading: false,
14-
pageSize: '10',
14+
pageSize: 10,
1515
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();
1638
};
1739

1840
fetchUserData = async username => {
@@ -56,6 +78,7 @@ class App extends React.Component {
5678
return this.setState({
5779
user: user.data,
5880
repos: repos.data,
81+
page: 2,
5982
loading: false,
6083
});
6184
}
@@ -75,38 +98,22 @@ class App extends React.Component {
7598
};
7699

77100
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;
82102

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);
88105

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+
});
91113
};
92114

93-
handlePageSizeChange = e =>
94-
this.setState(
95-
{
96-
pageSize: e.target.value,
97-
},
98-
() => this.loadPage(),
99-
);
100-
101115
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;
110117

111118
const renderRepos = !loading && !reposError && !!repos.length;
112119

@@ -123,30 +130,6 @@ class App extends React.Component {
123130

124131
{renderRepos && (
125132
<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-
150133
{repos.map(repo => (
151134
<RepoCard key={repo.id} repo={repo} />
152135
))}

0 commit comments

Comments
 (0)