Skip to content

Commit 06f4344

Browse files
committed
update user item styles in following and followers page
1 parent 8354137 commit 06f4344

File tree

7 files changed

+191
-4
lines changed

7 files changed

+191
-4
lines changed

src/components/UserItem/index.jsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// @flow
2+
import React from 'react';
3+
import { Link } from 'react-router-dom';
4+
import UserItemStyles from './styles';
5+
6+
type Props = {
7+
data: any
8+
};
9+
10+
export default (props: Props) => (
11+
<Link to={`/user/${props.data.login}`}>
12+
<UserItemStyles>
13+
<div className="user-info">
14+
<figure className="user-info--avatar">
15+
<img src={props.data.avatarUrl} alt={props.data.name} />
16+
</figure>
17+
<div className="user-info--name">
18+
<span>{props.data.name}</span>
19+
<span>@{props.data.login}</span>
20+
</div>
21+
</div>
22+
{(props.data.repositories && props.data.repositories.totalCount) ? (
23+
<span className="repositories-count">
24+
{props.data.repositories.totalCount}
25+
</span>
26+
): null}
27+
</UserItemStyles>
28+
</Link>
29+
);

src/components/UserItem/styles.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// @flow
2+
3+
import styled from 'styled-components';
4+
5+
export default styled.div`
6+
width: 100%;
7+
padding: 20px;
8+
display: flex;
9+
margin: 0 auto;
10+
align-items: center;
11+
justify-content: space-between;
12+
background-color: #fff;
13+
margin-bottom: 10px;
14+
border-radius: 5px;
15+
box-shadow: 0 0 15px rgba(0,0,0,0.03);
16+
cursor: pointer;
17+
.user-info {
18+
display: flex;
19+
align-items: center;
20+
&--avatar {
21+
width: 50px;
22+
height: 50px;
23+
border-radius: 10rem;
24+
overflow: hidden;
25+
margin: 0;
26+
float: left;
27+
img {
28+
width: 100%;
29+
height: 100%;
30+
object-fit: cover;
31+
}
32+
}
33+
&--name {
34+
float: left;
35+
font-size: 15px;
36+
color: #444;
37+
margin-left: 20px;
38+
text-align: left;
39+
span {
40+
cursor: pointer;
41+
&:last-child {
42+
opacity: 0.4;
43+
}
44+
}
45+
}
46+
}
47+
.repositories-count {
48+
background-color: #ff5959;
49+
padding: 10px;
50+
border-radius: 10rem;
51+
color: #fff;
52+
font-size: 13px;
53+
line-height: 1;
54+
min-height: 35px;
55+
display: inline-block;
56+
min-width: 35px;
57+
cursor: pointer;
58+
}
59+
`;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// @flow
2+
import React, { Component } from "react";
3+
import RepositoryItem from "../RepositoryItem";
4+
import InfiniteLoader from "../InfiniteLoader";
5+
import UserItem from "../UserItem";
6+
7+
type Props = {
8+
data: any,
9+
hasLoadMore: boolean,
10+
onLoadMore: any
11+
};
12+
type State = {};
13+
14+
export default class UsersWrapper extends Component<Props, State> {
15+
render() {
16+
const { data, hasLoadMore, onLoadMore } = this.props;
17+
return (
18+
<div id="users--item">
19+
<InfiniteLoader hasNextPage={hasLoadMore} onLoadMore={onLoadMore}>
20+
{data.map((user: any, index: number) => (
21+
<UserItem data={user} key={`user-item--${index}`} />
22+
))}
23+
</InfiniteLoader>
24+
</div>
25+
);
26+
}
27+
}

src/containers/Followers/index.jsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import gql from "graphql-tag";
66
import { Query, withApollo } from "react-apollo";
77
import Loading from "../../components/Loading";
88
import UserSidebar from "../../components/UserSidebar";
9+
import UsersWrapper from "../../components/UsersWrapper";
910
import FollowersWrapper from './styles';
1011

1112
const GET_FOLLOWERS = gql`
@@ -25,6 +26,10 @@ const GET_FOLLOWERS = gql`
2526
}
2627
followers(first: 100, after: $nextPage) {
2728
totalCount
29+
pageInfo {
30+
hasNextPage
31+
endCursor
32+
}
2833
nodes {
2934
name
3035
login
@@ -63,7 +68,38 @@ const FollowersPage = (props : any) => {
6368
<header id="repositories--header">
6469
<h3>Followers</h3>
6570
</header>
66-
71+
<UsersWrapper
72+
data={repositoryOwner.followers.nodes}
73+
hasLoadMore={
74+
repositoryOwner.followers.pageInfo.hasNextPage
75+
}
76+
onLoadMore={() => {
77+
fetchMore({
78+
variables: {
79+
nextPage:
80+
repositoryOwner.followers.pageInfo.endCursor
81+
},
82+
updateQuery: (prev, { fetchMoreResult }) => {
83+
if (!fetchMoreResult) return prev;
84+
return {
85+
repositoryOwner: {
86+
...prev.repositoryOwner,
87+
followers: {
88+
...fetchMoreResult.repositoryOwner
89+
.followers,
90+
nodes: [
91+
...prev.repositoryOwner.followers
92+
.nodes,
93+
...fetchMoreResult.repositoryOwner
94+
.followers.nodes
95+
]
96+
}
97+
}
98+
};
99+
}
100+
});
101+
}}
102+
/>
67103
</div>
68104
</Fragment>
69105
);

src/containers/Followers/styles.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default styled.div `
2525
letter-spacing: 1.2px;
2626
}
2727
}
28-
#repositories--item {
28+
#users--item {
2929
margin: 40px -10px;
3030
height: 81.4vh;
3131
}

src/containers/Followings/index.jsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import gql from "graphql-tag";
66
import { Query, withApollo } from "react-apollo";
77
import Loading from "../../components/Loading";
88
import UserSidebar from "../../components/UserSidebar";
9+
import UsersWrapper from "../../components/UsersWrapper";
910
import FollowingsWrapper from './styles';
1011

1112
const GET_FOLLOWINGS = gql`
@@ -25,6 +26,10 @@ const GET_FOLLOWINGS = gql`
2526
}
2627
following(first: 100, after: $nextPage) {
2728
totalCount
29+
pageInfo {
30+
hasNextPage
31+
endCursor
32+
}
2833
nodes {
2934
name
3035
login
@@ -63,7 +68,38 @@ const FollowingsPage = (props : any) => {
6368
<header id="repositories--header">
6469
<h3>Followings</h3>
6570
</header>
66-
71+
<UsersWrapper
72+
data={repositoryOwner.following.nodes}
73+
hasLoadMore={
74+
repositoryOwner.following.pageInfo.hasNextPage
75+
}
76+
onLoadMore={() => {
77+
fetchMore({
78+
variables: {
79+
nextPage:
80+
repositoryOwner.following.pageInfo.endCursor
81+
},
82+
updateQuery: (prev, { fetchMoreResult }) => {
83+
if (!fetchMoreResult) return prev;
84+
return {
85+
repositoryOwner: {
86+
...prev.repositoryOwner,
87+
following: {
88+
...fetchMoreResult.repositoryOwner
89+
.following,
90+
nodes: [
91+
...prev.repositoryOwner.following
92+
.nodes,
93+
...fetchMoreResult.repositoryOwner
94+
.following.nodes
95+
]
96+
}
97+
}
98+
};
99+
}
100+
});
101+
}}
102+
/>
67103
</div>
68104
</Fragment>
69105
);

src/containers/Followings/styles.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default styled.div `
2525
letter-spacing: 1.2px;
2626
}
2727
}
28-
#repositories--item {
28+
#users--item {
2929
margin: 40px -10px;
3030
height: 81.4vh;
3131
}

0 commit comments

Comments
 (0)