@@ -9,6 +9,7 @@ import { useFavicon } from 'react-use';
99import notify from '../../services/toast' ;
1010
1111import languageColors from '../../utils/language-colors' ;
12+ import kFormatter from '../../utils/kFormatter' ;
1213
1314import Error404 from '../../components/Error404' ;
1415
@@ -47,6 +48,8 @@ import {
4748 IssuesIcon ,
4849 CommitsIcon ,
4950 CheckIcon ,
51+ HorizontalBar ,
52+ LanguageBar ,
5053} from './styles' ;
5154
5255import { 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