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. 28
      src/lib/github.ts

@ -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;
}

Loading…
Cancel
Save