Skip to content
Open
Show file tree
Hide file tree
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
22 changes: 21 additions & 1 deletion src/app/auth/callback/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,29 @@
import { Suspense } from "react";
import { CallbackClient } from "./CallbackClient";

/**
* CallbackClient reads useSearchParams(), which the App Router requires to sit
* behind a Suspense boundary. Without a fallback the page renders nothing at
* all until that boundary resolves, so a user completing sign-in sees a blank
* screen rather than any sign the app is working.
*/
function CallbackFallback() {
return (
<div className="mx-auto flex max-w-md flex-col items-center px-6 py-24 text-center">
<span
aria-hidden="true"
className="h-8 w-8 animate-spin rounded-full border-2 border-slate-200 border-t-indigo-600 dark:border-slate-700 dark:border-t-indigo-400"
/>
<p className="mt-4 text-sm text-slate-500 dark:text-slate-400" role="status">
Finishing sign-in&hellip;
</p>
</div>
);
}

export default function AuthCallbackPage() {
return (
<Suspense>
<Suspense fallback={<CallbackFallback />}>
<CallbackClient />
</Suspense>
);
Expand Down
20 changes: 15 additions & 5 deletions src/app/issues/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { Metadata } from "next";
import { Inbox } from "lucide-react";
import { fetchBounties } from "@/lib/api";
import { mockBounties } from "@/lib/mock-data";
import { BountyCard } from "@/components/bounty/BountyCard";
import { EmptyState } from "@/components/ui/EmptyState";

const issuesDescription =
"Browse paid, escrow-backed GitHub issues funded through MergeFi and ready for contributors.";
Expand Down Expand Up @@ -39,11 +41,19 @@ export default async function IssuesPage() {
moment it&apos;s merged.
</p>
</div>
<div className="grid gap-4 md:grid-cols-2">
{bounties.map((bounty) => (
<BountyCard key={bounty.id} bounty={bounty} />
))}
</div>
{bounties.length === 0 ? (
<EmptyState
icon={Inbox}
title="No paid issues yet"
description="Nothing is funded on this deployment right now. Once a sponsor locks funds into an escrow, the bounty shows up here."
/>
) : (
<div className="grid gap-4 md:grid-cols-2">
{bounties.map((bounty) => (
<BountyCard key={bounty.id} bounty={bounty} />
))}
</div>
)}
</div>
);
}
7 changes: 6 additions & 1 deletion src/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,12 @@ export default function HomePage() {
<summary className="cursor-pointer list-none font-medium text-slate-900 marker:content-none dark:text-white">
<span className="flex items-center justify-between">
{faq.question}
<span className="ml-4 text-slate-400 transition-transform group-open:rotate-45">+</span>
<span
aria-hidden="true"
className="ml-4 text-slate-400 transition-transform group-open:rotate-45"
>
+
</span>
</span>
</summary>
<p className="mt-3 text-sm leading-relaxed text-slate-500 dark:text-slate-400">
Expand Down
33 changes: 33 additions & 0 deletions src/lib/mock-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,39 @@ export const mockReputationProfiles: Record<string, ReputationProfile> = {
languages: ["Rust", "Solidity"],
organizations: ["mergefi"],
},
devrel_ana: {
handle: "devrel_ana",
avatarUrl: "https://avatars.githubusercontent.com/u/3?v=4",
lifetimeEarnings: 2890,
mergedPRs: 24,
completionRate: 0.92,
avgReviewTimeHours: 11,
onTimeDeliveryRate: 0.86,
languages: ["TypeScript", "Python"],
organizations: ["mergefi", "soroban-foundation"],
},
qa_marcus: {
handle: "qa_marcus",
avatarUrl: "https://avatars.githubusercontent.com/u/4?v=4",
lifetimeEarnings: 2140,
mergedPRs: 19,
completionRate: 0.87,
avgReviewTimeHours: 26,
onTimeDeliveryRate: 0.79,
languages: ["Go", "TypeScript"],
organizations: ["core-indexer"],
},
linh_dev: {
handle: "linh_dev",
avatarUrl: "https://avatars.githubusercontent.com/u/5?v=4",
lifetimeEarnings: 1780,
mergedPRs: 15,
completionRate: 0.91,
avgReviewTimeHours: 9,
onTimeDeliveryRate: 0.9,
languages: ["TypeScript", "Rust"],
organizations: ["stellar-labs"],
},
};

// Not modeled in types/index.ts alongside Bounty/Milestone/etc: this shape
Expand Down