diff --git a/src/app/auth/callback/page.tsx b/src/app/auth/callback/page.tsx
index b4674a1..c709c3d 100644
--- a/src/app/auth/callback/page.tsx
+++ b/src/app/auth/callback/page.tsx
@@ -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 (
+
+
+
+ Finishing sign-in…
+
+
+ );
+}
+
export default function AuthCallbackPage() {
return (
-
+ }>
);
diff --git a/src/app/issues/page.tsx b/src/app/issues/page.tsx
index 2b32818..828f79f 100644
--- a/src/app/issues/page.tsx
+++ b/src/app/issues/page.tsx
@@ -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.";
@@ -39,11 +41,19 @@ export default async function IssuesPage() {
moment it's merged.
-
- {bounties.map((bounty) => (
-
- ))}
-
+ {bounties.length === 0 ? (
+
+ ) : (
+
+ {bounties.map((bounty) => (
+
+ ))}
+
+ )}
);
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index ec2a3dd..b755440 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -285,7 +285,12 @@ export default function HomePage() {
{faq.question}
- +
+
+ +
+
diff --git a/src/lib/mock-data.ts b/src/lib/mock-data.ts
index bd045ad..d7b8ba9 100644
--- a/src/lib/mock-data.ts
+++ b/src/lib/mock-data.ts
@@ -145,6 +145,39 @@ export const mockReputationProfiles: Record = {
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