Skip to content

Commit c5596a3

Browse files
authored
feat: add filter for state of PR (#116)
1 parent d8f3b16 commit c5596a3

File tree

4 files changed

+67
-16
lines changed

4 files changed

+67
-16
lines changed

src/components/ReposFilters.tsx

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { FC } from "react";
2-
import { RepositoryRenderFormat } from "@/types/github";
2+
import { PullRequestState, RepositoryRenderFormat } from "@/types/github";
33

44
type ReposFiltersProps = {
55
searchQuery: string;
66
setSearchQuery: React.Dispatch<React.SetStateAction<string>>;
7+
pullRequestState: PullRequestState;
8+
setpullRequestState: React.Dispatch<React.SetStateAction<PullRequestState>>;
79
baseYear: number;
810
year: number;
911
setYear: React.Dispatch<React.SetStateAction<number>>;
@@ -16,6 +18,8 @@ type ReposFiltersProps = {
1618
export const ReposFilters: FC<ReposFiltersProps> = ({
1719
searchQuery,
1820
setSearchQuery,
21+
pullRequestState,
22+
setpullRequestState,
1923
baseYear,
2024
year,
2125
setYear,
@@ -39,6 +43,10 @@ export const ReposFilters: FC<ReposFiltersProps> = ({
3943
setHideOwnRepo((prevHideOwnRepo) => !prevHideOwnRepo);
4044
};
4145

46+
const handlePullRequestStateChange = (selectedState: PullRequestState) => {
47+
setpullRequestState(selectedState);
48+
};
49+
4250
return (
4351
<div className="flex justify-between sm:gap-0 sm:flex-row flex-col gap-3">
4452
<div className="sm:text-left text-center">
@@ -59,15 +67,32 @@ export const ReposFilters: FC<ReposFiltersProps> = ({
5967
);
6068
})}
6169
</div>
62-
<div className="my-5 flex flex-col sm:items-start items-center">
63-
<label className="mb-2">Search</label>
64-
<input
65-
type="text"
66-
placeholder="Type here"
67-
className="input input-bordered w-full max-w-md"
68-
value={searchQuery}
69-
onChange={(e) => setSearchQuery(e.target.value)}
70-
/>
70+
<div className="sm:flex-row flex-col flex">
71+
<div className="my-5 mr-2 flex flex-col sm:items-start items-center">
72+
<label className="mb-2">Search</label>
73+
<input
74+
type="text"
75+
placeholder="Type here"
76+
className="input input-bordered w-full max-w-md"
77+
value={searchQuery}
78+
onChange={(e) => setSearchQuery(e.target.value)}
79+
/>
80+
</div>
81+
<div className="my-5 flex flex-col sm:items-start items-center">
82+
<label className="mb-2">State of PR</label>
83+
<select
84+
className="select select-bordered w-full max-w-md"
85+
value={pullRequestState}
86+
onChange={(e) =>
87+
handlePullRequestStateChange(e.target.value as PullRequestState)
88+
}
89+
>
90+
<option value={null!} selected></option>
91+
<option value="OPEN">Open</option>
92+
<option value="MERGED">Merged</option>
93+
<option value="CLOSED">Closed</option>
94+
</select>
95+
</div>
7196
</div>
7297

7398
<div className="flex sm:items-start items-center justify-center md:justify-start">

src/hooks/useFilteredRepositories.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { useMemo } from "react";
22
import { useSession } from "next-auth/react";
3-
import { PullRequestContributionsByRepository } from "@/types/github";
3+
import {
4+
PullRequestContributionsByRepository,
5+
PullRequestState,
6+
} from "@/types/github";
47

58
export const useFilteredRepositories = (
69
repositories: PullRequestContributionsByRepository[],
710
searchQuery: string,
8-
hideOwnRepo: boolean
11+
hideOwnRepo: boolean,
12+
pullRequestState: PullRequestState
913
) => {
1014
const { data: session } = useSession();
1115

@@ -27,6 +31,16 @@ export const useFilteredRepositories = (
2731
);
2832
};
2933

34+
const filterReposByPullRequestState = (
35+
repos: PullRequestContributionsByRepository[]
36+
) => {
37+
return repos?.filter((repoData) =>
38+
repoData.contributions.nodes.some(
39+
(contribution) => contribution.pullRequest.state === pullRequestState
40+
)
41+
);
42+
};
43+
3044
const filterRepos = (repos: PullRequestContributionsByRepository[]) => {
3145
let filteredRepos = repos;
3246
if (!searchQuery) {
@@ -37,11 +51,16 @@ export const useFilteredRepositories = (
3751
? filterOutOwnRepos(filteredReposBySearchQuery)
3852
: filteredReposBySearchQuery;
3953
}
54+
55+
filteredRepos = pullRequestState
56+
? filterReposByPullRequestState(filteredRepos)
57+
: filteredRepos;
58+
4059
return filteredRepos;
4160
};
4261

4362
return filterRepos(repositories);
44-
}, [repositories, searchQuery, hideOwnRepo, session]);
63+
}, [repositories, searchQuery, hideOwnRepo, pullRequestState, session]);
4564

4665
return filteredRepositories;
4766
};

src/pages/stats/[login].tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useSession } from "next-auth/react";
33
import { useRouter } from "next/router";
44
import { useGitHubPullRequests, useFilteredRepositories } from "@/hooks";
55
import { CardSkeleton, FormatStatsRender, ReposFilters } from "@/components";
6-
import { RepositoryRenderFormat } from "@/types/github";
6+
import { PullRequestState, RepositoryRenderFormat } from "@/types/github";
77

88
export default function Stats() {
99
const { data: session } = useSession();
@@ -13,6 +13,9 @@ export default function Stats() {
1313
const [year, setYear] = useState<number>(baseYear);
1414
const [format, setFormat] = useState<RepositoryRenderFormat>("cards");
1515
const [searchQuery, setSearchQuery] = useState<string>("");
16+
const [pullRequestState, setpullRequestState] = useState<PullRequestState>(
17+
null!
18+
);
1619
const [hideOwnRepo, setHideOwnRepo] = useState<boolean>(false);
1720

1821
const { repositories, isLoading } = useGitHubPullRequests(
@@ -23,7 +26,8 @@ export default function Stats() {
2326
const filteredRepositories = useFilteredRepositories(
2427
repositories,
2528
searchQuery,
26-
hideOwnRepo
29+
hideOwnRepo,
30+
pullRequestState
2731
);
2832

2933
return (
@@ -36,6 +40,8 @@ export default function Stats() {
3640
</h2>
3741
</div>
3842
<ReposFilters
43+
pullRequestState={pullRequestState!}
44+
setpullRequestState={setpullRequestState}
3945
searchQuery={searchQuery}
4046
setSearchQuery={setSearchQuery}
4147
baseYear={baseYear}

src/types/github.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type PullRequestNode = {
1515
export type PullRequest = {
1616
id: string;
1717
title: string;
18-
state: "MERGED" | "CLOSED" | "OPEN";
18+
state: PullRequestState;
1919
url: string;
2020
};
2121

@@ -44,3 +44,4 @@ export type User = {
4444
};
4545

4646
export type RepositoryRenderFormat = "cards" | "text" | "json";
47+
export type PullRequestState = "MERGED" | "CLOSED" | "OPEN";

0 commit comments

Comments
 (0)