diff --git a/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx b/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx new file mode 100644 index 000000000..3d8dd7a98 --- /dev/null +++ b/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx @@ -0,0 +1,86 @@ +import { PersonStandingIcon } from 'lucide-react'; +import { useState } from 'react'; +import { usePersonalizedRoadmap } from '../../hooks/use-personalized-roadmap'; +import { renderTopicProgress } from '../../lib/resource-progress'; +import { PersonalizedRoadmapModal } from './PersonalizedRoadmapModal'; +import { useMutation } from '@tanstack/react-query'; +import { httpPost } from '../../lib/query-http'; +import { useToast } from '../../hooks/use-toast'; +import { queryClient } from '../../stores/query-client'; + +type BulkUpdateResourceProgressBody = { + done: string[]; + learning: string[]; + skipped: string[]; + pending: string[]; +}; + +type PersonalizedRoadmapProps = { + roadmapId: string; +}; + +export function PersonalizedRoadmap(props: PersonalizedRoadmapProps) { + const { roadmapId } = props; + + const toast = useToast(); + const [isModalOpen, setIsModalOpen] = useState(false); + + const { + mutate: bulkUpdateResourceProgress, + isPending: isBulkUpdating, + isSuccess: isBulkUpdateSuccess, + } = useMutation( + { + mutationFn: (body: BulkUpdateResourceProgressBody) => { + return httpPost(`/v1-bulk-update-resource-progress/${roadmapId}`, body); + }, + onError: (error) => { + toast.error( + error?.message ?? 'Something went wrong, please try again.', + ); + }, + }, + queryClient, + ); + + const { generatePersonalizedRoadmap } = usePersonalizedRoadmap({ + roadmapId, + onStart: () => { + setIsModalOpen(false); + }, + onData: (data) => { + const { topicIds } = data; + topicIds.forEach((topicId) => { + renderTopicProgress(topicId, 'skipped'); + }); + }, + onFinish: (data) => { + bulkUpdateResourceProgress({ + skipped: data.topicIds, + learning: [], + done: [], + pending: [], + }); + }, + }); + + return ( + <> + {isModalOpen && ( + setIsModalOpen(false)} + onSubmit={generatePersonalizedRoadmap} + /> + )} + + + + ); +} diff --git a/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx b/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx new file mode 100644 index 000000000..17c05cc8b --- /dev/null +++ b/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx @@ -0,0 +1,48 @@ +import { PersonStandingIcon } from 'lucide-react'; +import { useId, useState, type FormEvent } from 'react'; + +type PersonalizedRoadmapFormProps = { + info?: string; + onSubmit: (info: string) => void; +}; + +export function PersonalizedRoadmapForm(props: PersonalizedRoadmapFormProps) { + const { info: defaultInfo, onSubmit } = props; + + const [info, setInfo] = useState(defaultInfo || ''); + const infoFieldId = useId(); + + const handleSubmit = (e: FormEvent) => { + e.preventDefault(); + onSubmit(info); + }; + + return ( +
+

Personalize Roadmap

+
+ +