Consider the top languages when inferring from solution

pull/6812/head
Kamran Ahmed 3 months ago
parent 2b6c326819
commit 2de99daebb
  1. 15
      src/components/Projects/SubmitProjectModal.tsx
  2. 30
      src/lib/github.ts

@ -6,12 +6,15 @@ import { httpPost } from '../../lib/http';
import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
import { SubmissionRequirement } from './SubmissionRequirement.tsx';
import { useCopyText } from '../../hooks/use-copy-text.ts';
import { getTopGitHubLanguages } from '../../lib/github.ts';
type SubmitProjectResponse = {
repositoryUrl: string;
submittedAt: Date;
};
type GitHubApiLanguagesResponse = Record<string, number>;
type VerificationChecksType = {
repositoryExists: 'pending' | 'success' | 'error';
readmeExists: 'pending' | 'success' | 'error';
@ -170,12 +173,16 @@ export function SubmitProjectModal(props: SubmitProjectModalProps) {
projectUrlExists: 'success',
});
const languagesUrl = `${mainApiUrl}/languages`;
const languagesResponse = await fetch(languagesUrl);
const languagesResponse = await fetch(`${mainApiUrl}/languages`);
let languages: string[] = [];
if (languagesResponse.ok) {
const languagesData = await languagesResponse.json();
languages = Object.keys(languagesData || {})?.slice(0, 4);
const languagesData =
(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}`;

@ -33,18 +33,22 @@ export async function getFormattedStars(
return formatter.format(stars);
}
const defaultRanking = "7th";
const defaultRanking = '7th';
let ranking: string;
export async function getRepositoryRank(
repo = 'kamranahmedse/developer-roadmap',
): Promise<string> {
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 repositories = json.items || [];
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)}`;
}
}
@ -70,4 +74,22 @@ function getOrdinalSuffix(rank: number): string {
default:
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;
}

Loading…
Cancel
Save