diff --git a/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx b/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx index 3d8dd7a98..7d789a7f9 100644 --- a/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx +++ b/src/components/PersonalizedRoadmap/PersonalizedRoadmap.tsx @@ -1,12 +1,17 @@ -import { PersonStandingIcon } from 'lucide-react'; +import { Loader2Icon, PersonStandingIcon } from 'lucide-react'; import { useState } from 'react'; import { usePersonalizedRoadmap } from '../../hooks/use-personalized-roadmap'; -import { renderTopicProgress } from '../../lib/resource-progress'; +import { + loadFreshProgress, + renderTopicProgress, +} from '../../lib/resource-progress'; import { PersonalizedRoadmapModal } from './PersonalizedRoadmapModal'; -import { useMutation } from '@tanstack/react-query'; +import { useMutation, useQuery } from '@tanstack/react-query'; import { httpPost } from '../../lib/query-http'; import { useToast } from '../../hooks/use-toast'; import { queryClient } from '../../stores/query-client'; +import { userResourceProgressOptions } from '../../queries/resource-progress'; +import { useAuth } from '../../hooks/use-auth'; type BulkUpdateResourceProgressBody = { done: string[]; @@ -23,27 +28,38 @@ export function PersonalizedRoadmap(props: PersonalizedRoadmapProps) { const { roadmapId } = props; const toast = useToast(); + const currentUser = useAuth(); 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.', - ); - }, - }, + const { data: userResourceProgress } = useQuery( + userResourceProgressOptions('roadmap', roadmapId), queryClient, ); - const { generatePersonalizedRoadmap } = usePersonalizedRoadmap({ + const { mutate: bulkUpdateResourceProgress, isPending: isBulkUpdating } = + 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.', + ); + }, + onSuccess: () => { + queryClient.invalidateQueries( + userResourceProgressOptions('roadmap', roadmapId), + ); + }, + }, + queryClient, + ); + + const { generatePersonalizedRoadmap, status } = usePersonalizedRoadmap({ roadmapId, onStart: () => { setIsModalOpen(false); @@ -55,6 +71,10 @@ export function PersonalizedRoadmap(props: PersonalizedRoadmapProps) { }); }, onFinish: (data) => { + console.log('-'.repeat(20)); + console.log('onFinish', data); + console.log('-'.repeat(20)); + bulkUpdateResourceProgress({ skipped: data.topicIds, learning: [], @@ -64,21 +84,65 @@ export function PersonalizedRoadmap(props: PersonalizedRoadmapProps) { }, }); + const { mutate: clearResourceProgress, isPending: isClearing } = useMutation( + { + mutationFn: () => { + return httpPost(`/v1-clear-resource-progress`, { + resourceId: roadmapId, + resourceType: 'roadmap', + }); + }, + onError: (error) => { + toast.error( + error?.message ?? 'Something went wrong, please try again.', + ); + }, + onSuccess: () => { + toast.success('Progress cleared successfully.'); + localStorage.removeItem( + `roadmap-${roadmapId}-${currentUser?.id}-progress`, + ); + localStorage.removeItem( + `roadmap-${roadmapId}-${currentUser?.id}-favorite`, + ); + window.location.reload(); + }, + }, + queryClient, + ); + + const isGenerating = status !== 'idle' || isBulkUpdating || isClearing; + return ( <> {isModalOpen && ( setIsModalOpen(false)} - onSubmit={generatePersonalizedRoadmap} + onSubmit={(information) => { + const { skipped = [] } = userResourceProgress ?? {}; + for (const topicId of skipped) { + renderTopicProgress(topicId, 'pending'); + } + + generatePersonalizedRoadmap(information); + }} + onClearProgress={() => { + setIsModalOpen(false); + clearResourceProgress(); + }} /> )} diff --git a/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx b/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx index 17c05cc8b..4c2156e6d 100644 --- a/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx +++ b/src/components/PersonalizedRoadmap/PersonalizedRoadmapForm.tsx @@ -1,13 +1,14 @@ -import { PersonStandingIcon } from 'lucide-react'; +import { PersonStandingIcon, XIcon } from 'lucide-react'; import { useId, useState, type FormEvent } from 'react'; type PersonalizedRoadmapFormProps = { info?: string; onSubmit: (info: string) => void; + onClearProgress: () => void; }; export function PersonalizedRoadmapForm(props: PersonalizedRoadmapFormProps) { - const { info: defaultInfo, onSubmit } = props; + const { info: defaultInfo, onSubmit, onClearProgress } = props; const [info, setInfo] = useState(defaultInfo || ''); const infoFieldId = useId(); @@ -34,7 +35,15 @@ export function PersonalizedRoadmapForm(props: PersonalizedRoadmapFormProps) { /> -
+
+