mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2025-09-01 21:32:35 +02:00
Consider the top languages when inferring from solution
This commit is contained in:
@@ -6,12 +6,15 @@ import { httpPost } from '../../lib/http';
|
|||||||
import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
|
import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
|
||||||
import { SubmissionRequirement } from './SubmissionRequirement.tsx';
|
import { SubmissionRequirement } from './SubmissionRequirement.tsx';
|
||||||
import { useCopyText } from '../../hooks/use-copy-text.ts';
|
import { useCopyText } from '../../hooks/use-copy-text.ts';
|
||||||
|
import { getTopGitHubLanguages } from '../../lib/github.ts';
|
||||||
|
|
||||||
type SubmitProjectResponse = {
|
type SubmitProjectResponse = {
|
||||||
repositoryUrl: string;
|
repositoryUrl: string;
|
||||||
submittedAt: Date;
|
submittedAt: Date;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type GitHubApiLanguagesResponse = Record<string, number>;
|
||||||
|
|
||||||
type VerificationChecksType = {
|
type VerificationChecksType = {
|
||||||
repositoryExists: 'pending' | 'success' | 'error';
|
repositoryExists: 'pending' | 'success' | 'error';
|
||||||
readmeExists: 'pending' | 'success' | 'error';
|
readmeExists: 'pending' | 'success' | 'error';
|
||||||
@@ -170,12 +173,16 @@ export function SubmitProjectModal(props: SubmitProjectModalProps) {
|
|||||||
projectUrlExists: 'success',
|
projectUrlExists: 'success',
|
||||||
});
|
});
|
||||||
|
|
||||||
const languagesUrl = `${mainApiUrl}/languages`;
|
const languagesResponse = await fetch(`${mainApiUrl}/languages`);
|
||||||
const languagesResponse = await fetch(languagesUrl);
|
|
||||||
let languages: string[] = [];
|
let languages: string[] = [];
|
||||||
if (languagesResponse.ok) {
|
if (languagesResponse.ok) {
|
||||||
const languagesData = await languagesResponse.json();
|
const languagesData =
|
||||||
languages = Object.keys(languagesData || {})?.slice(0, 4);
|
(await languagesResponse.json()) as GitHubApiLanguagesResponse;
|
||||||
|
|
||||||
|
languages = getTopGitHubLanguages(languagesData);
|
||||||
|
if (languages?.length === 0) {
|
||||||
|
languages = Object.keys(languagesData || {})?.slice(0, 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const submitProjectUrl = `${import.meta.env.PUBLIC_API_URL}/v1-submit-project/${projectId}`;
|
const submitProjectUrl = `${import.meta.env.PUBLIC_API_URL}/v1-submit-project/${projectId}`;
|
||||||
|
@@ -33,18 +33,22 @@ export async function getFormattedStars(
|
|||||||
return formatter.format(stars);
|
return formatter.format(stars);
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultRanking = "7th";
|
const defaultRanking = '7th';
|
||||||
let ranking: string;
|
let ranking: string;
|
||||||
|
|
||||||
export async function getRepositoryRank(
|
export async function getRepositoryRank(
|
||||||
repo = 'kamranahmedse/developer-roadmap',
|
repo = 'kamranahmedse/developer-roadmap',
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`https://api.github.com/search/repositories?q=stars:>100000&o=desc&s=stars`);
|
const response = await fetch(
|
||||||
|
`https://api.github.com/search/repositories?q=stars:>100000&o=desc&s=stars`,
|
||||||
|
);
|
||||||
const json = await response.json();
|
const json = await response.json();
|
||||||
const repositories = json.items || [];
|
const repositories = json.items || [];
|
||||||
for (let rank = 1; rank <= repositories.length; rank++) {
|
for (let rank = 1; rank <= repositories.length; rank++) {
|
||||||
if (repositories[rank - 1].full_name.toLowerCase() === repo.toLowerCase()) {
|
if (
|
||||||
|
repositories[rank - 1].full_name.toLowerCase() === repo.toLowerCase()
|
||||||
|
) {
|
||||||
ranking = `${rank}${getOrdinalSuffix(rank)}`;
|
ranking = `${rank}${getOrdinalSuffix(rank)}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,3 +75,21 @@ function getOrdinalSuffix(rank: number): string {
|
|||||||
return 'th';
|
return 'th';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fetches the top languages of a GitHub repository
|
||||||
|
// i.e. 90% of the bytes are in these languages
|
||||||
|
export function getTopGitHubLanguages(languages: Record<string, number>) {
|
||||||
|
const total = Object.values(languages).reduce((a, b) => a + b, 0);
|
||||||
|
|
||||||
|
let sum = 0;
|
||||||
|
let topLanguages = [];
|
||||||
|
for (const [language, bytes] of Object.entries(languages)) {
|
||||||
|
sum += bytes;
|
||||||
|
topLanguages.push(language);
|
||||||
|
if (sum / total >= 0.9) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return topLanguages;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user