From c1e00a476ee34b1c1ca35fab1b67bc7f961d94cb Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Fri, 16 Aug 2024 19:55:59 +0100 Subject: [PATCH] Finalize project solution stepper --- .../Projects/ProjectMilestoneStrip.tsx | 222 ------------------ .../Projects/StatusStepper/ProjectStepper.tsx | 17 +- src/pages/projects/[projectId]/index.astro | 4 +- .../projects/[projectId]/solutions.astro | 1 - 4 files changed, 5 insertions(+), 239 deletions(-) delete mode 100644 src/components/Projects/ProjectMilestoneStrip.tsx diff --git a/src/components/Projects/ProjectMilestoneStrip.tsx b/src/components/Projects/ProjectMilestoneStrip.tsx deleted file mode 100644 index 842e4ecf0..000000000 --- a/src/components/Projects/ProjectMilestoneStrip.tsx +++ /dev/null @@ -1,222 +0,0 @@ -import { useEffect, useState } from 'react'; -import { cn } from '../../lib/classname'; -import { StartProjectModal } from './StartProjectModal'; -import { SubmitProjectModal } from './SubmitProjectModal'; -import { pageProgressMessage } from '../../stores/page'; -import { httpGet, httpPost } from '../../lib/http'; -import { useToast } from '../../hooks/use-toast'; - -type ProjectStatusResponse = { - id?: string; - - startedAt?: Date; - submittedAt?: Date; - repositoryUrl?: string; - - upvotes: number; - downvotes: number; -}; - -type ProjectMilestoneStripProps = { - projectId: string; -}; - -export function ProjectMilestoneStrip(props: ProjectMilestoneStripProps) { - const { projectId } = props; - - const toast = useToast(); - - const [isLoading, setIsLoading] = useState(true); - const [stepIndex, setStepIndex] = useState(0); - - const [projectStatus, setProjectStatus] = useState({ - upvotes: 0, - downvotes: 0, - }); - - const [isStartProjectModalOpen, setIsStartProjectModalOpen] = useState(false); - const [isSubmitProjectModalOpen, setIsSubmitProjectModalOpen] = - useState(false); - - const handleStartProject = async () => { - pageProgressMessage.set('Starting project...'); - setIsStartProjectModalOpen(true); - - const { response, error } = await httpPost<{ - startedAt: Date; - }>(`${import.meta.env.PUBLIC_API_URL}/v1-start-project/${projectId}`, {}); - - if (error || !response) { - toast.error(error?.message || 'Failed to start project'); - pageProgressMessage.set(''); - return; - } - - setStepIndex(1); - setProjectStatus({ - ...projectStatus, - startedAt: response.startedAt, - }); - pageProgressMessage.set(''); - }; - - const loadProjectStatus = async () => { - setIsLoading(true); - - const { response, error } = await httpGet( - `${import.meta.env.PUBLIC_API_URL}/v1-project-status/${projectId}`, - {}, - ); - - if (error || !response) { - toast.error(error?.message || 'Failed to load project status'); - setIsLoading(false); - return; - } - - const { startedAt, submittedAt, upvotes } = response; - - if (upvotes >= 10) { - setStepIndex(4); - } else if (upvotes >= 5) { - setStepIndex(3); - } else if (submittedAt) { - setStepIndex(2); - } else if (startedAt) { - setStepIndex(1); - } - - setProjectStatus(response); - setIsLoading(false); - }; - - useEffect(() => { - loadProjectStatus().finally(() => {}); - }, []); - - const startProjectModal = isStartProjectModalOpen ? ( - setIsStartProjectModalOpen(false)} - startedAt={projectStatus?.startedAt} - /> - ) : null; - const submitProjectModal = isSubmitProjectModalOpen ? ( - setIsSubmitProjectModalOpen(false)} - projectId={projectId} - onSubmit={(response) => { - const { repositoryUrl, submittedAt } = response; - - setProjectStatus({ - ...projectStatus, - repositoryUrl, - submittedAt, - }); - setStepIndex(2); - }} - repositoryUrl={projectStatus.repositoryUrl} - /> - ) : null; - - return ( - <> - {startProjectModal} - {submitProjectModal} - -
-
- -
-
- = 1} /> - - -
-
- = 2} /> - - -
-
- = 3} /> - - - 5 Upvotes - -
-
- = 4} isLast={true} /> - - - 10 Upvotes - -
-
-
- - ); -} - -type MilestoneStepProps = { - isActive: boolean; - isLast?: boolean; -}; - -function MilestoneStep(props: MilestoneStepProps) { - const { isActive = false, isLast = false } = props; - - return ( -
- -
- ); -} diff --git a/src/components/Projects/StatusStepper/ProjectStepper.tsx b/src/components/Projects/StatusStepper/ProjectStepper.tsx index fc0737675..687c0faab 100644 --- a/src/components/Projects/StatusStepper/ProjectStepper.tsx +++ b/src/components/Projects/StatusStepper/ProjectStepper.tsx @@ -169,17 +169,6 @@ export function ProjectStepper(props: ProjectStepperProps) { {activeStep >= 2 && ( <> Congrats on submitting your solution.{' '} - - View your submission - {' '} - or{' '} )} @@ -245,7 +234,9 @@ export function ProjectStepper(props: ProjectStepperProps) { text={ activeStep == 3 ? `${projectStatus.upvotes} / 10 upvotes` - : `10 upvotes` + : activeStep > 3 + ? `${projectStatus.upvotes} upvotes` + : `10 upvotes` } />
diff --git a/src/pages/projects/[projectId]/index.astro b/src/pages/projects/[projectId]/index.astro index d08db9a86..212d801cd 100644 --- a/src/pages/projects/[projectId]/index.astro +++ b/src/pages/projects/[projectId]/index.astro @@ -7,8 +7,7 @@ import { type ProjectFrontmatter, } from '../../../lib/project'; import AstroIcon from '../../../components/AstroIcon.astro'; -import { ProjectMilestoneStrip } from '../../../components/Projects/ProjectMilestoneStrip'; -import { ProjectStepper } from "../../../components/Projects/StatusStepper/ProjectStepper"; +import { ProjectStepper } from '../../../components/Projects/StatusStepper/ProjectStepper'; import { ProjectTabs } from '../../../components/Projects/ProjectTabs'; export async function getStaticPaths() { @@ -71,7 +70,6 @@ const githubUrl = `https://github.com/kamranahmedse/developer-roadmap/tree/maste -