Skip to content

Commit d1a46fe

Browse files
committed
Load more button
1 parent f38269a commit d1a46fe

File tree

4 files changed

+110
-13
lines changed

4 files changed

+110
-13
lines changed

src/App.js

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,68 @@
11
import React from 'react';
22
import Search from './components/Search';
33
import UserCard from './components/UserCard';
4+
import RepoCard from './components/RepoCard';
5+
6+
const PAGE_SIZE = 30;
47

58
class App extends React.Component {
69
state = {
710
user: null,
8-
error: null,
11+
repos: [],
12+
userDataError: null,
913
loading: false,
14+
page: 1,
1015
};
1116

1217
fetchUserData = async username => {
18+
const res = await fetch(`https://api.github.com/users/${username}`);
19+
if (res.ok) {
20+
const data = await res.json();
21+
22+
return { data };
23+
}
24+
25+
const error = (await res.json()).message;
26+
27+
return { error };
28+
};
29+
30+
fetchRepos = async username => {
31+
const { page } = this.state;
32+
const res = await fetch(
33+
`https://api.github.com/users/${username}/repos?page=${page}&per_page=${PAGE_SIZE}`,
34+
);
35+
if (res.ok) {
36+
const data = await res.json();
37+
38+
return { data, page: page + 1 };
39+
}
40+
41+
const error = (await res.json()).message;
42+
43+
return { error };
44+
};
45+
46+
fetchData = async username => {
1347
this.setState({ loading: true }, async () => {
1448
try {
15-
const res = await fetch(`https://api.github.com/users/${username}`);
16-
if (res.ok) {
17-
const data = await res.json();
49+
const [user, repos] = await Promise.all([
50+
this.fetchUserData(username),
51+
this.fetchRepos(username),
52+
]);
1853

54+
if (user.data !== undefined && repos.data !== undefined) {
1955
return this.setState({
20-
user: data,
56+
user: user.data,
57+
repos: repos.data,
58+
page: repos.page,
2159
loading: false,
2260
});
2361
}
2462

25-
const error = (await res.json()).message;
26-
2763
this.setState({
28-
error,
64+
userDataError: user.error,
65+
reposError: repos.error,
2966
loading: false,
3067
});
3168
} catch (err) {
@@ -37,18 +74,49 @@ class App extends React.Component {
3774
});
3875
};
3976

77+
loadMore = async () => {
78+
const { data, page } = await this.fetchRepos(this.state.user.login);
79+
80+
if (data)
81+
this.setState(state => ({
82+
repos: [...state.repos, ...data],
83+
page,
84+
}));
85+
};
86+
4087
render() {
41-
const { error, loading, user } = this.state;
88+
const {
89+
userDataError,
90+
reposError,
91+
loading,
92+
user,
93+
repos,
94+
page,
95+
} = this.state;
4296

4397
return (
4498
<div>
45-
<Search fetchData={this.fetchUserData} />
99+
<Search fetchData={this.fetchData} />
46100
<div className="container">
47101
<div className="text-center pt-5">
48102
{loading && <p>Loading...</p>}
49-
{error && <p className="text-danger">{error}</p>}
103+
{userDataError && <p className="text-danger">{userDataError}</p>}
50104
</div>
51-
{!loading && !error && user && <UserCard user={user} />}
105+
{!loading && !userDataError && user && <UserCard user={user} />}
106+
{reposError && <p className="text-danger">{reposError}</p>}
107+
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+
)}
52120
</div>
53121
</div>
54122
);

src/components/RepoCard.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from 'react';
2+
3+
const RepoCard = ({ repo }) => (
4+
<div className="card mb-4">
5+
<div className="card-body">
6+
<a href={repo.html_url} target="_blank">
7+
<h3>{repo.full_name}</h3>
8+
9+
<p>
10+
<strong>Stars:</strong> {repo.stargazers_count}
11+
</p>
12+
<p className="mb-0">
13+
<strong>Watchers:</strong> {repo.watchers_count}
14+
</p>
15+
</a>
16+
</div>
17+
</div>
18+
);
19+
20+
export default RepoCard;

src/components/UserCard.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22

33
const UserCard = ({ user }) => {
44
return (
5-
<div className="card">
5+
<div className="card mb-4">
66
<div className="card-body">
77
<div className="d-flex">
88
<img className="img-round user-image mr-5" src={user.avatar_url} />

src/index.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,12 @@ code {
1616
width: 100px;
1717
height: 100px;
1818
}
19+
20+
a {
21+
color: inherit !important;
22+
cursor: pointer;
23+
}
24+
25+
a:hover {
26+
text-decoration: none !important;
27+
}

0 commit comments

Comments
 (0)