Skip to content

Commit 71e587e

Browse files
committed
Last adjustments
1 parent 83225cd commit 71e587e

File tree

8 files changed

+141
-101
lines changed

8 files changed

+141
-101
lines changed

src/components/ProfileData/index.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
OrganizationsContainer,
1818
OrganizationCard,
1919
} from './styles';
20+
import kFormatter from '../../utils/kFormatter';
2021

2122
interface Orgs {
2223
login?: string;
@@ -52,9 +53,7 @@ const ProfileData: React.FC<Props> = ({ username, name, avatarUrl, followers, fo
5253
return (
5354
<Container>
5455
<Flex>
55-
<a href={`https://github.com/${username}`} target="_blank" rel="noopener noreferrer" data-tip="Go to user's GitHub profile">
56-
<Avatar src={avatarUrl} alt={username} data-tip="Go to user's GitHub profile" />
57-
</a>
56+
<Avatar src={avatarUrl} alt={username} data-tip="Go to user's GitHub profile" onClick={() => window.open(`https://github.com/${username}`, 'blank')} />
5857

5958
<div>
6059
<h1>{name}</h1>
@@ -69,13 +68,13 @@ const ProfileData: React.FC<Props> = ({ username, name, avatarUrl, followers, fo
6968
<Row>
7069
<li className="link-li" onClick={() => window.open(`https://github.com/${username}?tab=followers`, '_blank')} data-tip="Go to user's followers">
7170
<PeopleIcon />
72-
<b>{followers}</b>
71+
<b>{kFormatter(followers)}</b>
7372
<span>followers</span>
7473
<span>·</span>
7574
</li>
7675

7776
<li className="link-li" onClick={() => window.open(`https://github.com/${username}?tab=following`, '_blank')} data-tip="Go to user's followings">
78-
<b>{following}</b>
77+
<b>{kFormatter(following)}</b>
7978
<span>following</span>
8079
</li>
8180
</Row>

src/components/ProfileData/styles.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export const Flex = styled.div`
1919
font-weight: 600;
2020
}
2121
> a {
22+
width: 100%;
23+
height: 100%;
2224
text-decoration: none;
2325
transition: filter 0.6s ease-in-out !important;
2426
}
@@ -55,6 +57,7 @@ export const Flex = styled.div`
5557
export const Avatar = styled.img`
5658
width: 16%;
5759
border-radius: 50%;
60+
cursor: pointer;
5861
5962
@media (min-width: 768px) {
6063
width: 100%;

src/components/RepoCard/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Link } from 'react-router-dom';
66
import languageColors from '../../utils/language-colors';
77

88
import { Container, Topside, RepoIcon, Botside, StarIcon, ForkIcon, LanguageDot } from './styles';
9+
import kFormatter from '../../utils/kFormatter';
910

1011
interface Props {
1112
username: string;
@@ -43,13 +44,13 @@ const RepoCard: React.FC<Props> = ({ username, reponame, description, language,
4344
{stars && stars > 0 ? (
4445
<li data-tip={`Repository has ${stars} stars`}>
4546
<StarIcon />
46-
<span>{stars}</span>
47+
<span>{kFormatter(stars)}</span>
4748
</li>
4849
) : null}
4950
{forks && forks > 0 ? (
5051
<li data-tip={`Repository was forked by ${forks} users`}>
5152
<ForkIcon />
52-
<span>{forks}</span>
53+
<span>{kFormatter(forks)}</span>
5354
</li>
5455
) : null}
5556
</ul>

src/pages/Profile/index.tsx

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Error404 from '../../components/Error404';
1313
import { APIUser, APIRepo } from '../../@types';
1414
import api from '../../services/api';
1515
import notify from '../../services/toast';
16+
import kFormatter from '../../utils/kFormatter';
1617

1718
interface Data {
1819
user?: APIUser;
@@ -21,7 +22,7 @@ interface Data {
2122
}
2223

2324
const Profile: React.FC = () => {
24-
const { username = 'leoronne' } = useParams();
25+
const { username = 'facebook' } = useParams();
2526
const [data, setData] = useState<Data>();
2627
const [panelActive, setPanelActive] = useState(1);
2728
const [repositories, setRepos] = useState([]);
@@ -73,11 +74,11 @@ const Profile: React.FC = () => {
7374
const userResponse = await api.get(`users/${username}`);
7475
const user = userResponse.data;
7576

76-
const reposResponse = await api.get(`users/${username}/repos`);
77+
const reposResponse = await api.get(`users/${username}/repos?per_page=100`);
7778
const repos = reposResponse.data;
7879
setRepos(repos);
7980

80-
const orgsResponse = await api.get(`users/${username}/orgs`);
81+
const orgsResponse = await api.get(`users/${username}/orgs?per_page=100`);
8182
const orgs = orgsResponse.data;
8283
setOrgs(orgs);
8384

@@ -98,33 +99,6 @@ const Profile: React.FC = () => {
9899
}
99100
setData({});
100101
loadUserInfo();
101-
102-
// Promise.all([
103-
// fetch(`https://api.github.com/users/${username}`),
104-
// fetch(`https://api.github.com/users/${username}/repos`),
105-
// fetch(`https://api.github.com/users/${username}/orgs`),
106-
// ]).then(async responses => {
107-
// const [userResponse, reposResponse, orgsResponse] = responses;
108-
109-
// if (userResponse?.status === 404) {
110-
// setData({ error: 'User not found!' });
111-
// return;
112-
// }
113-
114-
// const user = await userResponse.json();
115-
// const repos = await reposResponse.json();
116-
// const orgs = await orgsResponse.json();
117-
// setRepos(repos);
118-
// setOrgs(orgs);
119-
120-
// const shuffledRepos = repos.sort(() => 0.5 - Math.random());
121-
// const slicedRepos = shuffledRepos.slice(0, 6); // 6 repos
122-
123-
// setData({
124-
// user,
125-
// repos: slicedRepos,
126-
// });
127-
// });
128102
}, [username]);
129103

130104
if (loading) {
@@ -154,7 +128,7 @@ const Profile: React.FC = () => {
154128
<div className={`content ${panelActive === 2 ? ' active' : ''}`} onClick={() => setPanelActive(2)} role="button" data-tip="User's Repositories">
155129
<RepoIcon />
156130
<span className="label">Repositories</span>
157-
<span className="number">{data.user?.public_repos}</span>
131+
<span className="number">{kFormatter(data.user?.public_repos)}</span>
158132
</div>
159133
<div className="content" onClick={() => window.open(`https://github.com/${data.user.login}?tab=projects`, '_blank')} role="button" data-tip="Go to user's projects">
160134
<ProjectsIcon />
@@ -169,6 +143,7 @@ const Profile: React.FC = () => {
169143

170144
return (
171145
<Container panelActive={panelActive} id="main-profile">
146+
<ReactTooltip place="bottom" type="dark" effect="solid" />
172147
<Tab className="desktop">
173148
<div className="wrapper">
174149
<span className="offset" />
@@ -203,7 +178,7 @@ const Profile: React.FC = () => {
203178
{panelActive === 1 ? (
204179
<>
205180
<Repos>
206-
<h2>Random Repositories</h2>
181+
<h2>{data?.repos.length > 0 ? 'Random Repositories' : 'User does not have any public repositories yet'}</h2>
207182

208183
<div>
209184
{data.repos.map(item => (
@@ -222,7 +197,7 @@ const Profile: React.FC = () => {
222197
</Repos>
223198

224199
<CalendarHeading data-tip="Does not represent actual contribution data">
225-
{`${Math.floor(Math.random() * (2000 - 1)) + 1} contributions in the last year`}
200+
{`${kFormatter(Math.floor(Math.random() * (2000 - 1)) + 1)} contributions in the last year`}
226201
</CalendarHeading>
227202

228203
<RandomCalendar />
@@ -231,7 +206,17 @@ const Profile: React.FC = () => {
231206
<>
232207
<Repos>
233208
<h2>Repositories</h2>
234-
209+
{data?.repos.length > 0 && (
210+
<a
211+
href={`https://github.com/${username}?tab=repositories`}
212+
className="repo-link"
213+
data-tip={`see all repositories from ${username}`}
214+
target="_blank"
215+
rel="noopener noreferrer"
216+
>
217+
see all repositories
218+
</a>
219+
)}
235220
<div>
236221
{repositories.map(item => (
237222
<RepoCard
@@ -251,7 +236,6 @@ const Profile: React.FC = () => {
251236
)}
252237
</RightSide>
253238
</Main>
254-
<ReactTooltip place="bottom" type="dark" effect="solid" />
255239
</Container>
256240
);
257241
};

src/pages/Profile/styles.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,20 @@ export const RightSide = styled.div`
6262

6363
export const Repos = styled.div`
6464
margin-top: var(--verticalPadding);
65+
position: relative;
66+
67+
> .repo-link {
68+
position: absolute;
69+
font-size: 14px;
70+
color: var(--link);
71+
top: 0;
72+
right: 0;
73+
}
6574
6675
> h2 {
6776
font-size: 16px;
68-
font-weight: normal;
77+
font-weight: 500;
78+
margin-bottom: 15px;
6979
}
7080
> div {
7181
margin-top: 8px;

src/pages/Repo/index.tsx

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { useFavicon } from 'react-use';
99
import notify from '../../services/toast';
1010

1111
import languageColors from '../../utils/language-colors';
12+
import kFormatter from '../../utils/kFormatter';
1213

1314
import Error404 from '../../components/Error404';
1415

@@ -47,6 +48,8 @@ import {
4748
IssuesIcon,
4849
CommitsIcon,
4950
CheckIcon,
51+
HorizontalBar,
52+
LanguageBar,
5053
} from './styles';
5154

5255
import { APIRepo } from '../../@types';
@@ -91,7 +94,11 @@ const Repo: React.FC = () => {
9194

9295
useFavicon(`${window.location.origin}/favicon.ico`);
9396

94-
// https://api.github.com/repos/leoronne/twitter-ui-clone
97+
const sumValues = obj => Object.values(obj).reduce((a: number, b: number) => a + b);
98+
const getPercentageValue = (value: number, total: number) => {
99+
const percentage = (value * 100) / total;
100+
return percentage.toFixed(2);
101+
};
95102

96103
useEffect(() => {
97104
async function loadRepoInfo() {
@@ -111,15 +118,31 @@ const Repo: React.FC = () => {
111118

112119
const languagesResponse = await api.get(`repos/${username}/${reponame}/languages`);
113120
const languages = languagesResponse.data;
114-
setLanguages(Object.keys(languages));
121+
if (languages !== {}) {
122+
const allMb = sumValues(languages);
123+
const languageKeys = Object.keys(languages);
124+
const calculatedLanguages = languageKeys.map(lang => {
125+
return { language: lang, percentage: getPercentageValue(languages[lang], Number(allMb)) };
126+
});
127+
if (calculatedLanguages.length > 7) {
128+
const mainLanguages = calculatedLanguages.slice(0, 6); // 6 languages
129+
const slicedLanguages = calculatedLanguages.slice(6, calculatedLanguages.length); // other languages
130+
let remainingValues = 0;
131+
slicedLanguages.forEach(lng => {
132+
remainingValues += Number(lng.percentage);
133+
});
134+
mainLanguages.push({ language: 'Other', percentage: String(remainingValues) });
135+
setLanguages(mainLanguages);
136+
} else setLanguages(calculatedLanguages);
137+
}
115138

116-
const pullsResponse = await api.get(`repos/${username}/${reponame}/pulls`);
139+
const pullsResponse = await api.get(`repos/${username}/${reponame}/pulls?per_page=100`);
117140
const pulls = pullsResponse.data;
118141
setPulls(pulls.length > 0 ? pulls.length : 0);
119142

120-
const issuesResponse = await api.get(`repos/${username}/${reponame}/issues`);
121-
const issues = issuesResponse.data;
122-
setIssues(issues.length > 0 ? issues.length : 0);
143+
// const issuesResponse = await api.get(`repos/${username}/${reponame}/issues?per_page=100`);
144+
// const issues = issuesResponse.data;
145+
setIssues(repo.open_issues > 0 ? repo.open_issues - (pulls.length > 0 ? pulls.length : 0) : repo.open_issues);
123146

124147
const contributorsResponse = await api.get(`repos/${username}/${reponame}/contributors`);
125148
const contributors = contributorsResponse.data;
@@ -144,46 +167,6 @@ const Repo: React.FC = () => {
144167
}
145168
}
146169
loadRepoInfo();
147-
// Promise.all([
148-
// fetch(`https://api.github.com/repos/${username}/${reponame}`),
149-
// fetch(`https://api.github.com/repos/${username}/${reponame}/commits`),
150-
// fetch(`https://api.github.com/repos/${username}/${reponame}/releases`),
151-
// fetch(`https://api.github.com/repos/${username}/${reponame}/languages`),
152-
// fetch(`https://api.github.com/repos/${username}/${reponame}/pulls`),
153-
// fetch(`https://api.github.com/repos/${username}/${reponame}/issues`),
154-
// fetch(`https://api.github.com/repos/${username}/${reponame}/contributors`),
155-
// ]).then(async responses => {
156-
// const [repoResponse, commitsResponse, releasesResponse, languagesResponse, pullsResponse, issuesResponse, contributorsResponse] = responses;
157-
// if (repoResponse?.status === 404) {
158-
// setData({ error: 'Repository not found!' });
159-
// return;
160-
// }
161-
162-
// const repo = await repoResponse.json();
163-
// const commits = await commitsResponse.json();
164-
165-
// if (commitsResponse?.status === 409) {
166-
// setData({ repo });
167-
// setEmptyRepo(true);
168-
// throw new Error('Repository is empty!');
169-
// }
170-
171-
// const releases = await releasesResponse.json();
172-
// const languages = await languagesResponse.json();
173-
// const pulls = await pullsResponse.json();
174-
// const issues = await issuesResponse.json();
175-
// const contributors = await contributorsResponse.json();
176-
177-
// const shuffledContributors = contributors.sort(() => 0.5 - Math.random());
178-
// const slicedContributors = shuffledContributors.slice(0, 10);
179-
// setLanguages(Object.keys(languages));
180-
// setReleases(releases);
181-
// setPulls(pulls.length > 0 ? pulls.length : 0);
182-
// setIssues(issues.length > 0 ? issues.length : 0);
183-
// setContributors(slicedContributors);
184-
// setCommits(commits);
185-
// setData({ repo });
186-
// });
187170
}, [reponame, username]);
188171

189172
function getLanguageColor(language) {
@@ -284,7 +267,7 @@ const Repo: React.FC = () => {
284267
>
285268
<WatchIcon />
286269
<span>Watch</span>
287-
<b>{data.repo.subscribers_count}</b>
270+
<b>{kFormatter(data.repo.subscribers_count)}</b>
288271
</li>
289272
<li
290273
data-tip={`This repository has ${data.repo.stargazers_count} stars`}
@@ -293,7 +276,7 @@ const Repo: React.FC = () => {
293276
>
294277
<StarIcon />
295278
<span>Star</span>
296-
<b>{data.repo.stargazers_count}</b>
279+
<b>{kFormatter(data.repo.stargazers_count)}</b>
297280
</li>
298281
<li
299282
data-tip={`This repository was forked by ${data.repo?.fork && data.repo?.parent?.forks_count ? data.repo.parent.forks_count : data.repo.forks} users`}
@@ -302,7 +285,7 @@ const Repo: React.FC = () => {
302285
>
303286
<ForkIcon />
304287
<span>Fork</span>
305-
<b>{data.repo?.fork && data.repo?.parent?.forks_count ? data.repo.parent.forks_count : data.repo.forks}</b>
288+
<b>{data.repo?.fork && data.repo?.parent?.forks_count ? kFormatter(data.repo.parent.forks_count) : kFormatter(data.repo.forks)}</b>
306289
</li>
307290
</Stats>
308291
</HeaderInfo>
@@ -351,7 +334,7 @@ const Repo: React.FC = () => {
351334
)}
352335
{repoCommits[0]?.commit?.message && (
353336
<span className="message">
354-
<a href={`https://github.com/${username}/${reponame}/commit/${repoCommits[0].sha}`} data-tip="See commit on GitHub" target="_blank" rel="noopener noreferrer">
337+
<a href={`https://github.com/${username}/${reponame}/commit/${repoCommits[0].sha}`} target="_blank" rel="noopener noreferrer">
355338
{repoCommits[0].commit.message}
356339
</a>
357340
</span>
@@ -395,11 +378,17 @@ const Repo: React.FC = () => {
395378
<Row>
396379
<h4>Languages</h4>
397380

381+
<HorizontalBar>
382+
{repoLanguages.map(lng => (
383+
<LanguageBar color={getLanguageColor(lng.language)} size={lng.percentage} key={lng.language} />
384+
))}
385+
</HorizontalBar>
386+
398387
<ul className="languages">
399-
{repoLanguages.map((language, index) => (
388+
{repoLanguages.map((lng, index) => (
400389
<li key={index}>
401-
<LanguageDot color={getLanguageColor(language)} />
402-
<span>{language}</span>
390+
<LanguageDot color={getLanguageColor(lng.language)} />
391+
<span>{`${lng.language}: ${lng.percentage}%`}</span>
403392
</li>
404393
))}
405394
</ul>

0 commit comments

Comments
 (0)