diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index c9b7145a..d9db1528 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -9,6 +9,9 @@ import { type CommitLog, type MinerEvaluation, type Repository, + useAllMiners, + useAllPrs, + useReposAndWeights, useStats, } from '../api'; import { useMonthlyRewards } from '../hooks/useMonthlyRewards'; @@ -18,9 +21,19 @@ import { getPrStatusLabel, parseNumber, } from '../utils'; -import useDashboardData from './dashboard/useDashboardData'; import { buildFeaturedWork } from './dashboard/dashboardData'; +const EMPTY_PRS: CommitLog[] = []; +const EMPTY_MINERS: MinerEvaluation[] = []; +const EMPTY_REPOS: Repository[] = []; + +const combineQueryState = ( + ...queries: { isLoading: boolean; isError: boolean }[] +) => ({ + isLoading: queries.some((q) => q.isLoading), + isError: queries.some((q) => q.isError), +}); + const fadeUp = (delayMs = 0) => ({ opacity: 0, animation: `landingFadeUp 680ms cubic-bezier(0.16, 1, 0.3, 1) ${delayMs}ms forwards`, @@ -298,7 +311,9 @@ const HomePage: React.FC = () => { }, 7000); return () => clearInterval(interval); }, []); - const { datasets, isLoading } = useDashboardData('35d'); + const prsQuery = useAllPrs(); + const minersQuery = useAllMiners(); + const reposQuery = useReposAndWeights(); const stats = useStats(); const onboardLink = useLinkBehavior('/onboard'); const docsLink = useLinkBehavior( @@ -308,29 +323,28 @@ const HomePage: React.FC = () => { '/repository-registration', ); - const minerRows = useMemo( - () => buildTopMinerRows(datasets.miners.data), - [datasets.miners.data], - ); + const prs = prsQuery.data ?? EMPTY_PRS; + const miners = minersQuery.data ?? EMPTY_MINERS; + const repos = reposQuery.data ?? EMPTY_REPOS; + const isLoading = prsQuery.isLoading || minersQuery.isLoading; + + const minerRows = useMemo(() => buildTopMinerRows(miners), [miners]); const activityRows = useMemo( - () => buildActivityRows(datasets.prs.data, datasets.repos.data), - [datasets.prs.data, datasets.repos.data], + () => buildActivityRows(prs, repos), + [prs, repos], ); - const mergedPrs35d = useMemo( - () => countMergedPrsInWindow(datasets.prs.data, 35), - [datasets.prs.data], - ); - const totalReposEver = datasets.repos.data.length; + const mergedPrs35d = useMemo(() => countMergedPrsInWindow(prs, 35), [prs]); + const totalReposEver = parseNumber(stats.data?.uniqueRepositories ?? 0); const totalLinesEver = parseNumber(stats.data?.totalLinesChanged ?? 0); const totalCommitsEver = parseNumber(stats.data?.totalCommits ?? 0); const totalMergedPrsEver = useMemo( - () => datasets.prs.data.filter((pr) => pr.mergedAt).length, - [datasets.prs.data], + () => prs.filter((pr) => pr.mergedAt).length, + [prs], ); const totalIssuesSolvedEver = parseNumber(stats.data?.totalIssues ?? 0); const medianMergeRate = useMemo(() => { - const rates = datasets.miners.data + const rates = miners .filter((miner) => miner.isEligible) .map((miner) => { const merged = parseNumber(miner.totalMergedPrs); @@ -345,8 +359,8 @@ const HomePage: React.FC = () => { const median = rates.length % 2 === 0 ? (rates[mid - 1] + rates[mid]) / 2 : rates[mid]; return Math.round(median * 100); - }, [datasets.miners.data]); - const minerCount = datasets.miners.data.length; + }, [miners]); + const minerCount = miners.length; const rewardPoolLabel = monthlyRewards && monthlyRewards > 0 ? formatUsd(monthlyRewards) @@ -456,8 +470,7 @@ const HomePage: React.FC = () => { 0} - isLoading={datasets.prs.isLoading} - isError={datasets.prs.isError} + {...combineQueryState(prsQuery, reposQuery)} /> { 0} - isLoading={datasets.miners.isLoading} - isError={datasets.miners.isError} + {...combineQueryState(minersQuery)} />