Add projects toggle

pull/8189/head
Kamran Ahmed 3 months ago
parent 393022c826
commit 576c307a5f
  1. 59
      src/components/HeroSection/FavoriteRoadmaps.tsx

@ -1,4 +1,14 @@
import { FolderKanban, MapIcon, Plus, Sparkle, ThumbsUp } from 'lucide-react'; import {
FolderKanban,
MapIcon,
Plus,
Sparkle,
ThumbsUp,
ChevronDown,
ChevronUp,
Eye,
EyeOff,
} from 'lucide-react';
import type { ReactNode } from 'react'; import type { ReactNode } from 'react';
import type { ResourceType } from '../../lib/resource-progress.ts'; import type { ResourceType } from '../../lib/resource-progress.ts';
import { CreateRoadmapButton } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapButton.tsx'; import { CreateRoadmapButton } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapButton.tsx';
@ -8,6 +18,7 @@ import { Spinner } from '../ReactIcons/Spinner.tsx';
import type { UserProgress } from '../TeamProgress/TeamProgressPage.tsx'; import type { UserProgress } from '../TeamProgress/TeamProgressPage.tsx';
import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions.tsx'; import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions.tsx';
import { getRelativeTimeString } from '../../lib/date'; import { getRelativeTimeString } from '../../lib/date';
import { useState } from 'react';
export type AIRoadmapType = { export type AIRoadmapType = {
id: string; id: string;
@ -66,12 +77,14 @@ type HeroTitleProps = {
icon: any; icon: any;
isLoading?: boolean; isLoading?: boolean;
title: string | ReactNode; title: string | ReactNode;
rightContent?: ReactNode;
}; };
function HeroTitle(props: HeroTitleProps) { function HeroTitle(props: HeroTitleProps) {
const { isLoading = false, title, icon } = props; const { isLoading = false, title, icon, rightContent } = props;
return ( return (
<div className="flex items-center justify-between">
<p className="mb-4 flex items-center text-sm text-gray-400"> <p className="mb-4 flex items-center text-sm text-gray-400">
{!isLoading && icon} {!isLoading && icon}
{isLoading && ( {isLoading && (
@ -81,6 +94,8 @@ function HeroTitle(props: HeroTitleProps) {
)} )}
{title} {title}
</p> </p>
<div>{rightContent}</div>
</div>
); );
} }
@ -107,7 +122,7 @@ export function HeroProject({ project }: HeroProjectProps) {
className="group relative flex flex-col justify-between gap-2 rounded-md border border-slate-800 bg-slate-900 p-4 hover:border-slate-600" className="group relative flex flex-col justify-between gap-2 rounded-md border border-slate-800 bg-slate-900 p-4 hover:border-slate-600"
> >
<div className="relative z-10 flex items-start justify-between gap-2"> <div className="relative z-10 flex items-start justify-between gap-2">
<h3 className="font-medium text-slate-200 group-hover:text-slate-100"> <h3 className="font-medium text-slate-200 group-hover:text-slate-100 truncate">
{project.title} {project.title}
</h3> </h3>
<span <span
@ -119,14 +134,16 @@ export function HeroProject({ project }: HeroProjectProps) {
> >
{project.submittedAt && project.repositoryUrl {project.submittedAt && project.repositoryUrl
? 'Submitted' ? 'Submitted'
: 'In Progress'} : 'Started'}
</span> </span>
</div> </div>
<div className="relative z-10 flex items-center gap-2 text-xs text-slate-400"> <div className="relative z-10 flex items-center gap-2 text-xs text-slate-400">
{project.submittedAt && project.repositoryUrl && (
<span className="flex items-center gap-1"> <span className="flex items-center gap-1">
<ThumbsUp className="h-3 w-3" /> <ThumbsUp className="h-3 w-3" />
{project.upvotes} {project.upvotes}
</span> </span>
)}
{project.startedAt && ( {project.startedAt && (
<span>Started {getRelativeTimeString(project.startedAt)}</span> <span>Started {getRelativeTimeString(project.startedAt)}</span>
)} )}
@ -142,6 +159,19 @@ export function HeroProject({ project }: HeroProjectProps) {
export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) { export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
const { progress, isLoading, customRoadmaps, aiRoadmaps, projects } = props; const { progress, isLoading, customRoadmaps, aiRoadmaps, projects } = props;
const [showCompleted, setShowCompleted] = useState(false);
const completedProjects = projects.filter(
(project) => project.submittedAt && project.repositoryUrl,
);
const inProgressProjects = projects.filter(
(project) => !project.submittedAt || !project.repositoryUrl,
);
const projectsToShow = [
...inProgressProjects,
...(showCompleted ? completedProjects : []),
];
return ( return (
<div className="flex flex-col gap-5 pt-5"> <div className="flex flex-col gap-5 pt-5">
@ -254,16 +284,31 @@ export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
} }
isLoading={isLoading} isLoading={isLoading}
title="Your projects" title="Your projects"
rightContent={
completedProjects.length > 0 && (
<button
onClick={() => setShowCompleted(!showCompleted)}
className="flex items-center gap-2 rounded-md px-2 py-1 text-xs text-slate-400 hover:text-slate-300"
>
{showCompleted ? (
<EyeOff className="h-3.5 w-3.5" />
) : (
<Eye className="h-3.5 w-3.5" />
)}
{completedProjects.length} Completed
</button>
)
}
/> />
{!isLoading && projects.length > 0 && ( {!isLoading && projectsToShow.length > 0 && (
<div className="grid grid-cols-1 gap-2 pb-5 sm:grid-cols-2 md:grid-cols-3"> <div className="grid grid-cols-1 gap-2 pb-5 sm:grid-cols-2 md:grid-cols-3">
{projects.map((project) => ( {projectsToShow.map((project) => (
<HeroProject key={project._id} project={project} /> <HeroProject key={project._id} project={project} />
))} ))}
<a <a
href="/projects" href="/projects"
className="flex h-[120px] items-center justify-center gap-2 rounded-md border border-dashed border-slate-800 p-4 text-sm text-slate-400 hover:border-slate-600 hover:bg-slate-900/50 hover:text-slate-300" className="flex min-h-[80px] items-center justify-center gap-2 rounded-md border border-dashed border-slate-800 p-4 text-sm text-slate-400 hover:border-slate-600 hover:bg-slate-900/50 hover:text-slate-300"
> >
<Plus size={16} /> <Plus size={16} />
Start a new project Start a new project

Loading…
Cancel
Save