diff --git a/src/components/charts/GithubContributionChart.js b/src/components/charts/GithubContributionChart.js index 418a3f7..4cd818b 100644 --- a/src/components/charts/GithubContributionChart.js +++ b/src/components/charts/GithubContributionChart.js @@ -1,12 +1,12 @@ import React, { useState, useEffect, useCallback } from 'react'; -import { getAllCommits } from '@/lib/github'; - +import { useFetchGithubCommits } from '@/hooks/githubQueries/useFetchGithubCommits'; +import { Tooltip } from 'primereact/tooltip'; const GithubContributionChart = ({ username }) => { const [contributionData, setContributionData] = useState({}); - const [loading, setLoading] = useState(true); - const [timeTaken, setTimeTaken] = useState(null); const [totalCommits, setTotalCommits] = useState(0); + const { data: commits, isLoading, isFetching } = useFetchGithubCommits(username); + const getColor = useCallback((count) => { if (count === 0) return 'bg-gray-100'; if (count < 5) return 'bg-green-300'; @@ -30,42 +30,35 @@ const GithubContributionChart = ({ username }) => { }, [contributionData]); useEffect(() => { - const fetchData = async () => { - setLoading(true); - const startTime = Date.now(); - const sixMonthsAgo = new Date(); - sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6); - + if (commits) { let commitCount = 0; - for await (const commit of getAllCommits(username, sixMonthsAgo)) { + const newContributionData = {}; + commits.forEach(commit => { const date = commit.commit.author.date.split('T')[0]; - setContributionData(prev => { - const newData = { ...prev }; - newData[date] = (newData[date] || 0) + 1; - return newData; - }); + newContributionData[date] = (newContributionData[date] || 0) + 1; commitCount++; - setTotalCommits(commitCount); - } + }); + + setContributionData(newContributionData); + setTotalCommits(commitCount); - const endTime = Date.now(); - setTimeTaken(((endTime - startTime) / 1000).toFixed(2)); - setLoading(false); console.log(`Total commits fetched: ${commitCount}`); - }; - - fetchData(); - }, [username]); + } + }, [commits]); const calendar = generateCalendar(); return ( -
-

Github Contributions for {username}

- {loading &&

Loading contribution data... ({totalCommits} commits fetched)

} - {timeTaken &&

Time taken to fetch data: {timeTaken} seconds

} - {!loading &&

Total commits: {totalCommits}

} +
+ {(isLoading || isFetching) &&

Loading contribution data... ({totalCommits} commits fetched)

} + {!isLoading && !isFetching && +
+

Total commits: {totalCommits}

+ + +
+ }
{calendar.map((day, index) => (
{ {nip19.npubEncode(user.pubkey)} +
{!session || !session?.user || !ndk ? ( diff --git a/src/hooks/githubQueries/useFetchGithubCommits.js b/src/hooks/githubQueries/useFetchGithubCommits.js new file mode 100644 index 0000000..ba22181 --- /dev/null +++ b/src/hooks/githubQueries/useFetchGithubCommits.js @@ -0,0 +1,22 @@ +import { useQuery } from '@tanstack/react-query'; +import { getAllCommits } from '@/lib/github'; + +export function useFetchGithubCommits(username) { + const fetchCommits = async () => { + const sixMonthsAgo = new Date(); + sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 6); + + const commits = []; + for await (const commit of getAllCommits(username, sixMonthsAgo)) { + commits.push(commit); + } + return commits; + }; + + return useQuery({ + queryKey: ['githubCommits', username], + queryFn: fetchCommits, + staleTime: 1000 * 60 * 30, // 30 minutes + refetchInterval: 1000 * 60 * 30, // 30 minutes + }); +} \ No newline at end of file