diff --git a/src/components/ReposFilters.tsx b/src/components/ReposFilters.tsx index faa511b..8c894b4 100644 --- a/src/components/ReposFilters.tsx +++ b/src/components/ReposFilters.tsx @@ -1,9 +1,11 @@ import { FC } from "react"; -import { RepositoryRenderFormat } from "@/types/github"; +import { PullRequestState, RepositoryRenderFormat } from "@/types/github"; type ReposFiltersProps = { searchQuery: string; setSearchQuery: React.Dispatch>; + pullRequestState: PullRequestState; + setpullRequestState: React.Dispatch>; baseYear: number; year: number; setYear: React.Dispatch>; @@ -16,6 +18,8 @@ type ReposFiltersProps = { export const ReposFilters: FC = ({ searchQuery, setSearchQuery, + pullRequestState, + setpullRequestState, baseYear, year, setYear, @@ -39,6 +43,10 @@ export const ReposFilters: FC = ({ setHideOwnRepo((prevHideOwnRepo) => !prevHideOwnRepo); }; + const handlePullRequestStateChange = (selectedState: PullRequestState) => { + setpullRequestState(selectedState); + }; + return (
@@ -59,15 +67,32 @@ export const ReposFilters: FC = ({ ); })}
-
- - setSearchQuery(e.target.value)} - /> +
+
+ + setSearchQuery(e.target.value)} + /> +
+
+ + +
diff --git a/src/hooks/useFilteredRepositories.ts b/src/hooks/useFilteredRepositories.ts index 9e99b4c..de31e7b 100644 --- a/src/hooks/useFilteredRepositories.ts +++ b/src/hooks/useFilteredRepositories.ts @@ -1,11 +1,15 @@ import { useMemo } from "react"; import { useSession } from "next-auth/react"; -import { PullRequestContributionsByRepository } from "@/types/github"; +import { + PullRequestContributionsByRepository, + PullRequestState, +} from "@/types/github"; export const useFilteredRepositories = ( repositories: PullRequestContributionsByRepository[], searchQuery: string, - hideOwnRepo: boolean + hideOwnRepo: boolean, + pullRequestState: PullRequestState ) => { const { data: session } = useSession(); @@ -27,6 +31,16 @@ export const useFilteredRepositories = ( ); }; + const filterReposByPullRequestState = ( + repos: PullRequestContributionsByRepository[] + ) => { + return repos?.filter((repoData) => + repoData.contributions.nodes.some( + (contribution) => contribution.pullRequest.state === pullRequestState + ) + ); + }; + const filterRepos = (repos: PullRequestContributionsByRepository[]) => { let filteredRepos = repos; if (!searchQuery) { @@ -37,11 +51,16 @@ export const useFilteredRepositories = ( ? filterOutOwnRepos(filteredReposBySearchQuery) : filteredReposBySearchQuery; } + + filteredRepos = pullRequestState + ? filterReposByPullRequestState(filteredRepos) + : filteredRepos; + return filteredRepos; }; return filterRepos(repositories); - }, [repositories, searchQuery, hideOwnRepo, session]); + }, [repositories, searchQuery, hideOwnRepo, pullRequestState, session]); return filteredRepositories; }; diff --git a/src/pages/stats/[login].tsx b/src/pages/stats/[login].tsx index 0754252..c9f189d 100644 --- a/src/pages/stats/[login].tsx +++ b/src/pages/stats/[login].tsx @@ -3,7 +3,7 @@ import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; import { useGitHubPullRequests, useFilteredRepositories } from "@/hooks"; import { CardSkeleton, FormatStatsRender, ReposFilters } from "@/components"; -import { RepositoryRenderFormat } from "@/types/github"; +import { PullRequestState, RepositoryRenderFormat } from "@/types/github"; export default function Stats() { const { data: session } = useSession(); @@ -13,6 +13,9 @@ export default function Stats() { const [year, setYear] = useState(baseYear); const [format, setFormat] = useState("cards"); const [searchQuery, setSearchQuery] = useState(""); + const [pullRequestState, setpullRequestState] = useState( + null! + ); const [hideOwnRepo, setHideOwnRepo] = useState(false); const { repositories, isLoading } = useGitHubPullRequests( @@ -23,7 +26,8 @@ export default function Stats() { const filteredRepositories = useFilteredRepositories( repositories, searchQuery, - hideOwnRepo + hideOwnRepo, + pullRequestState ); return ( @@ -36,6 +40,8 @@ export default function Stats() {