diff --git a/src/components/Dashboard/PersonalDashboard.tsx b/src/components/Dashboard/PersonalDashboard.tsx
index 2e99a343f..a90081a25 100644
--- a/src/components/Dashboard/PersonalDashboard.tsx
+++ b/src/components/Dashboard/PersonalDashboard.tsx
@@ -2,6 +2,7 @@ import { useStore } from '@nanostores/react';
import {
CheckCircle,
ChevronsDownUp,
+ ChevronsUpDown,
FolderGit2,
Zap,
type LucideIcon,
@@ -58,6 +59,8 @@ type DashboardStatsProps = {
topicsDoneToday?: number;
finishedProjectsCount?: number;
isLoading: boolean;
+ isAllCollapsed: boolean;
+ onToggleCollapseAll: () => void;
};
type DashboardStatItemProps = {
@@ -98,10 +101,12 @@ function DashboardStats(props: DashboardStatsProps) {
topicsDoneToday = 0,
finishedProjectsCount = 0,
isLoading,
+ onToggleCollapseAll,
+ isAllCollapsed,
} = props;
return (
-
+
-
);
@@ -142,7 +159,9 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
} = props;
const toast = useToast();
+
const [isLoading, setIsLoading] = useState(true);
+ const [isAllCollapsed, setIsAllCollapsed] = useState(false);
const [personalDashboardDetails, setPersonalDashboardDetails] =
useState
();
const [projectDetails, setProjectDetails] = useState([]);
@@ -261,37 +280,6 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
...builtInBestPractices,
];
- const relatedRoadmapIds = allRoadmapsAndBestPractices
- // take the ones that user is learning
- .filter((roadmap) =>
- learningRoadmapsToShow?.some(
- (learningRoadmap) => learningRoadmap.resourceId === roadmap.id,
- ),
- )
- .flatMap((roadmap) => roadmap.relatedRoadmapIds)
- // remove the ones that user is already learning or has bookmarked
- .filter(
- (roadmapId) =>
- !learningRoadmapsToShow.some((lr) => lr.resourceId === roadmapId),
- );
-
- const recommendedRoadmapIds = new Set(
- relatedRoadmapIds.length === 0
- ? [
- 'frontend',
- 'backend',
- 'devops',
- 'ai-data-scientist',
- 'full-stack',
- 'api-design',
- ]
- : relatedRoadmapIds,
- );
-
- const recommendedRoadmaps = allRoadmapsAndBestPractices.filter((roadmap) =>
- recommendedRoadmapIds.has(roadmap.id),
- );
-
const enrichedProjects = personalDashboardDetails?.projects
.map((project) => {
const projectDetail = projectDetails.find(
@@ -323,6 +311,10 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
isLoading={isLoading}
accountStreak={accountStreak}
topicsDoneToday={personalDashboardDetails?.topicDoneToday}
+ onToggleCollapseAll={() => {
+ setIsAllCollapsed(!isAllCollapsed);
+ }}
+ isAllCollapsed={isAllCollapsed}
finishedProjectsCount={
enrichedProjects?.filter((p) => p.submittedAt && p.repositoryUrl)
.length
@@ -335,6 +327,7 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
aiRoadmaps={aiGeneratedRoadmaps}
projects={enrichedProjects || []}
isLoading={isLoading}
+ isAllCollapsed={isAllCollapsed}
/>
diff --git a/src/components/HeroSection/FavoriteRoadmaps.tsx b/src/components/HeroSection/FavoriteRoadmaps.tsx
index a1898ed03..1df1c4803 100644
--- a/src/components/HeroSection/FavoriteRoadmaps.tsx
+++ b/src/components/HeroSection/FavoriteRoadmaps.tsx
@@ -112,7 +112,7 @@ function HeroTitle(props: HeroTitleProps) {
return (
-
+
{!isLoading && icon}
{isLoading && (
@@ -134,6 +134,7 @@ type FavoriteRoadmapsProps = {
customRoadmaps: UserProgress[];
aiRoadmaps: AIRoadmapType[];
isLoading: boolean;
+ isAllCollapsed: boolean;
};
type HeroProjectProps = {
@@ -185,7 +186,7 @@ export function HeroProject({ project }: HeroProjectProps) {
}
export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
- const { progress, isLoading, customRoadmaps, aiRoadmaps, projects } = props;
+ const { progress, isLoading, customRoadmaps, aiRoadmaps, projects, isAllCollapsed } = props;
const [showCompleted, setShowCompleted] = useState(false);
const completedProjects = projects.filter(
@@ -201,8 +202,11 @@ export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
];
return (
-
-
+
+
- {!isLoading && progress.length > 0 && (
-
+ {!isLoading && progress.length > 0 && !isAllCollapsed && (
+
{progress.map((resource) => (
-
+
) as any}
isLoading={isLoading}
title="Your custom roadmaps"
/>
- {!isLoading && customRoadmaps.length > 0 && (
-
+ {!isLoading && customRoadmaps.length > 0 && !isAllCollapsed && (
+
{customRoadmaps.map((customRoadmap) => (
-
+
) as any}
isLoading={isLoading}
title="Your AI roadmaps"
/>
- {!isLoading && aiRoadmaps.length > 0 && (
-
+ {!isLoading && aiRoadmaps.length > 0 && !isAllCollapsed && (
+
{aiRoadmaps.map((aiRoadmap) => (
-
+
- {!isLoading && projectsToShow.length > 0 && (
-
+ {!isLoading && projectsToShow.length > 0 && !isAllCollapsed && (
+
{projectsToShow.map((project) => (
))}