Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 34 additions & 22 deletions src/pages/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import {
type CommitLog,
type MinerEvaluation,
type Repository,
useAllMiners,
useAllPrs,
useReposAndWeights,
useStats,
} from '../api';
import { useMonthlyRewards } from '../hooks/useMonthlyRewards';
Expand All @@ -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`,
Expand Down Expand Up @@ -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<HTMLAnchorElement>('/onboard');
const docsLink = useLinkBehavior<HTMLAnchorElement>(
Expand All @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -456,8 +470,7 @@ const HomePage: React.FC = () => {
<LiveProofPanel
rows={activityRows}
hasLiveData={activityRows.length > 0}
isLoading={datasets.prs.isLoading}
isError={datasets.prs.isError}
{...combineQueryState(prsQuery, reposQuery)}
/>
</Box>
<Box
Expand All @@ -477,8 +490,7 @@ const HomePage: React.FC = () => {
<TopMinersPanel
rows={minerRows}
hasLiveData={minerRows.length > 0}
isLoading={datasets.miners.isLoading}
isError={datasets.miners.isError}
{...combineQueryState(minersQuery)}
/>
</Box>
<Stack
Expand Down
Loading