Skip to content

Commit 1ebe402

Browse files
committed
Implement Pagination
1 parent d1a46fe commit 1ebe402

File tree

1 file changed

+57
-22
lines changed

1 file changed

+57
-22
lines changed

src/App.js

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import Search from './components/Search';
33
import UserCard from './components/UserCard';
44
import RepoCard from './components/RepoCard';
55

6-
const PAGE_SIZE = 30;
6+
const PAGE_SIZE = 10;
77

88
class App extends React.Component {
99
state = {
1010
user: null,
1111
repos: [],
1212
userDataError: null,
1313
loading: false,
14+
pageSize: '10',
1415
page: 1,
1516
};
1617

@@ -28,14 +29,14 @@ class App extends React.Component {
2829
};
2930

3031
fetchRepos = async username => {
31-
const { page } = this.state;
32+
const { pageSize, page } = this.state;
3233
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}`,
3435
);
3536
if (res.ok) {
3637
const data = await res.json();
3738

38-
return { data, page: page + 1 };
39+
return { data };
3940
}
4041

4142
const error = (await res.json()).message;
@@ -55,7 +56,6 @@ class App extends React.Component {
5556
return this.setState({
5657
user: user.data,
5758
repos: repos.data,
58-
page: repos.page,
5959
loading: false,
6060
});
6161
}
@@ -74,26 +74,42 @@ class App extends React.Component {
7474
});
7575
};
7676

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+
);
7982

8083
if (data)
8184
this.setState(state => ({
82-
repos: [...state.repos, ...data],
83-
page,
85+
repos: data,
8486
}));
8587
};
8688

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+
87101
render() {
88102
const {
89103
userDataError,
90104
reposError,
91105
loading,
92106
user,
93107
repos,
94-
page,
108+
pageSize,
95109
} = this.state;
96110

111+
const renderRepos = !loading && !reposError && !!repos.length;
112+
97113
return (
98114
<div>
99115
<Search fetchData={this.fetchData} />
@@ -105,18 +121,37 @@ class App extends React.Component {
105121
{!loading && !userDataError && user && <UserCard user={user} />}
106122
{reposError && <p className="text-danger">{reposError}</p>}
107123

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+
)}
120155
</div>
121156
</div>
122157
);

0 commit comments

Comments
 (0)