+ );
+}
diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx
index 617bea42..92767e34 100644
--- a/src/app/dashboard/page.tsx
+++ b/src/app/dashboard/page.tsx
@@ -1,5 +1,10 @@
import DiscussionsWidget from "@/components/DiscussionsWidget";
+import ActivityRingChart from "@/components/ActivityRingChart";
+import ContributionGraph from "@/components/ContributionGraph";
+import ContributionHeatmap from "@/components/ContributionHeatmap";
+import PRMetrics from "@/components/PRMetrics";
import CommunityMetrics from "@/components/CommunityMetrics";
+import PRBreakdownChart from "@/components/PRBreakdownChart";
import GoalTracker from "@/components/GoalTracker";
import DashboardHeader from "@/components/DashboardHeader";
import StreakTracker from "@/components/StreakTracker";
@@ -7,10 +12,12 @@ import TopRepos from "@/components/TopRepos";
import PinnedRepos from "@/components/PinnedRepos";
import InactiveRepositoriesCard from "@/components/InactiveRepositoriesCard";
import LanguageBreakdown from "@/components/LanguageBreakdown";
+import CommitTimeChart from "@/components/CommitTimeChart";
+import CodingActivityInsightsCard from "@/components/CodingActivityInsightsCard";
+import PRReviewTrendChart from "@/components/PRReviewTrendChart";
import CIAnalytics from "@/components/CIAnalytics";
import IssueMetrics from "@/components/IssueMetrics";
import StreakAtRiskBanner from "@/components/StreakAtRiskBanner";
-import RepoAnalyticsExplorer from "@/components/repo-analytics/RepoAnalyticsExplorer";
import dynamic from "next/dynamic";
const SkeletonCard = () => (
@@ -89,7 +96,7 @@ import ExportButton from "@/components/ExportButton";
import Link from "next/link";
import PersonalRecords from "@/components/PersonalRecords";
import LocalCodingTime from "@/components/LocalCodingTime";
-import CodingTimeWidget from "@/components/CodingTimeWidget";
+import CodingTimeCard from "@/components/CodingTimeCard";
import RecentActivity from "@/components/RecentActivity";
import { authOptions } from "@/lib/auth";
import { getServerSession } from "next-auth";
@@ -99,24 +106,15 @@ import DashboardSSEProvider from "@/components/DashboardSSEProvider";
export default async function DashboardPage() {
const session = await getServerSession(authOptions);
if (!session) redirect("/");
- // If the JWT callback detected that the GitHub token has been revoked,
- // redirect to the landing page so the user must re-authenticate.
if (session.error === "TokenRevoked") redirect("/");
return (
-
-
-
+
+
-
- Year in Code
-
Settings
@@ -142,19 +140,6 @@ export default async function DashboardPage() {
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Row 1: Contribution graph + Streak + Local Coding Time */}
@@ -164,73 +149,16 @@ export default async function DashboardPage() {
-
-
-
-
+
-
- {/* Row 2: PR metrics, community metrics, PR breakdown & Time Chart */}
-
-
-
-
-
-
- {/* Row 2b: Activity Ring Chart */}
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Row 3: Issue metrics + CI analytics */}
-
-
-
-
-
-
- {/* Row 3b: Discussion activity */}
-
-
-
-
- {/* Row 4: Pinned repositories */}
-
-
-
-
- {/* Row 5: Inactive repository reminder */}
-
-
-
-
- {/* Row 6: Top repos + Language breakdown + Goal tracker */}
-
-
-
-
-
-
- {/* Row 7: Recent GitHub activity */}
-
-
-
);
diff --git a/src/app/dashboard/productivity/page.tsx b/src/app/dashboard/productivity/page.tsx
new file mode 100644
index 00000000..8dd1fc43
--- /dev/null
+++ b/src/app/dashboard/productivity/page.tsx
@@ -0,0 +1,39 @@
+import DashboardHeader from "@/components/DashboardHeader";
+import { AIMentorWidget } from "@/components/AIMentorWidget";
+import LocalCodingTime from "@/components/LocalCodingTime";
+import PersonalRecords from "@/components/PersonalRecords";
+import CodingActivityInsightsCard from "@/components/CodingActivityInsightsCard";
+import { authOptions } from "@/lib/auth";
+import { getServerSession } from "next-auth";
+import { redirect } from "next/navigation";
+
+export default async function ProductivityPage() {
+ const session = await getServerSession(authOptions);
+ if (!session) redirect("/");
+ if (session.error === "TokenRevoked") redirect("/");
+
+ return (
+
+
+
+ {/* Row 1: AI mentor + Local Coding Time editor sync */}
+