From 402a48b6070af614cd3a222905228c96f3f6f115 Mon Sep 17 00:00:00 2001 From: Arnab Nandy Date: Fri, 3 Jul 2026 00:07:32 +0530 Subject: [PATCH] Hacktoverfest support --- src/app/api/search/route.ts | 1 + src/features/issues/components/issue-card.tsx | 7 ++ .../issues/components/issue-finder.tsx | 26 +++++- src/features/issues/data/search-options.ts | 13 ++- src/features/issues/server/github-search.ts | 51 ++++++++++-- src/features/issues/types/search.ts | 3 + tests/app/api/search/route.test.ts | 3 +- tests/features/issues/lib/ranking.test.ts | 2 + .../issues/server/github-search.test.ts | 82 +++++++++++++++++++ 9 files changed, 179 insertions(+), 9 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index e47c6ae..987a27e 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -52,6 +52,7 @@ export async function GET(request: Request) { label: searchParams.get("label"), sort: searchParams.get("sort"), linkedPr: searchParams.get("linkedPr"), + hacktoberfest: searchParams.get("hacktoberfest"), page, }); diff --git a/src/features/issues/components/issue-card.tsx b/src/features/issues/components/issue-card.tsx index 7f81f08..c291f41 100644 --- a/src/features/issues/components/issue-card.tsx +++ b/src/features/issues/components/issue-card.tsx @@ -25,6 +25,13 @@ export function IssueCard({ issue }: { issue: Issue }) { {issue.repo}
+ {issue.hacktoberfest ? ( + + {issue.hacktoberfestSource === "repo-topic" + ? "Hacktoberfest repo" + : "Hacktoberfest label"} + + ) : null} {issue.qualityScore >= 70 ? ( {issue.qualityScore} quality diff --git a/src/features/issues/components/issue-finder.tsx b/src/features/issues/components/issue-finder.tsx index a7bd96e..61d682a 100644 --- a/src/features/issues/components/issue-finder.tsx +++ b/src/features/issues/components/issue-finder.tsx @@ -24,6 +24,7 @@ import { IssueCard } from "@/features/issues/components/issue-card"; import { LoadingResults } from "@/features/issues/components/loading-results"; import { Metric } from "@/features/issues/components/metric"; import { + HACKTOBERFEST_OPTIONS, LABEL_OPTIONS, LINKED_PR_OPTIONS, SORT_OPTIONS, @@ -38,6 +39,7 @@ export function IssueFinder() { const [label, setLabel] = useState("help-wanted"); const [sort, setSort] = useState("updated"); const [linkedPr, setLinkedPr] = useState("any"); + const [hacktoberfest, setHacktoberfest] = useState("any"); const [data, setData] = useState(null); const [issues, setIssues] = useState([]); const [page, setPage] = useState(1); @@ -59,6 +61,12 @@ export function IssueFinder() { () => SORT_OPTIONS.find((item) => item.value === sort) ?? SORT_OPTIONS[0], [sort], ); + const selectedHacktoberfest = useMemo( + () => + HACKTOBERFEST_OPTIONS.find((item) => item.value === hacktoberfest) ?? + HACKTOBERFEST_OPTIONS[0], + [hacktoberfest], + ); const hasMore = useMemo(() => { if (!data) return false; @@ -84,6 +92,7 @@ export function IssueFinder() { label, sort, linkedPr, + hacktoberfest, }); try { @@ -122,6 +131,7 @@ export function IssueFinder() { label, sort, linkedPr, + hacktoberfest, page: String(nextPage), }); @@ -176,7 +186,7 @@ export function IssueFinder() {
@@ -228,6 +238,19 @@ export function IssueFinder() { + +