From a143b0ec20268e44d179ef9e990014c4ab903b4a Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Mon, 10 Feb 2025 23:15:12 +0000 Subject: [PATCH] Collapse and expand --- .../Dashboard/PersonalDashboard.tsx | 63 +++++++++---------- .../HeroSection/FavoriteRoadmaps.tsx | 43 ++++++++----- 2 files changed, 56 insertions(+), 50 deletions(-) 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) => ( ))}