{roadmapSlug && (
)}
{!roadmapSlug && (
diff --git a/src/components/AIRoadmap/AIRoadmapContent.tsx b/src/components/AIRoadmap/AIRoadmapContent.tsx
index 41f37b18e..6d98447f2 100644
--- a/src/components/AIRoadmap/AIRoadmapContent.tsx
+++ b/src/components/AIRoadmap/AIRoadmapContent.tsx
@@ -1,13 +1,16 @@
import { cn } from '../../lib/classname';
+import { AIRoadmapRegenerate } from './AIRoadmapRegenerate';
import { LoadingChip } from '../LoadingChip';
type AIRoadmapContentProps = {
isLoading?: boolean;
svgHtml: string;
+ onRegenerate?: (prompt?: string) => void;
+ roadmapSlug?: string;
};
export function AIRoadmapContent(props: AIRoadmapContentProps) {
- const { isLoading, svgHtml } = props;
+ const { isLoading, svgHtml, onRegenerate, roadmapSlug } = props;
return (
- {isLoading && (
+ {isLoading && !svgHtml && (
)}
+
+ {onRegenerate && !isLoading && roadmapSlug && (
+
+ )}
);
}
diff --git a/src/components/AIRoadmap/AIRoadmapRegenerate.tsx b/src/components/AIRoadmap/AIRoadmapRegenerate.tsx
new file mode 100644
index 000000000..f1eeeb211
--- /dev/null
+++ b/src/components/AIRoadmap/AIRoadmapRegenerate.tsx
@@ -0,0 +1,250 @@
+import {
+ Loader2Icon,
+ PenSquare,
+ RefreshCcw,
+ SaveIcon,
+ SettingsIcon,
+ type LucideIcon,
+} from 'lucide-react';
+import { useRef, useState } from 'react';
+import { useOutsideClick } from '../../hooks/use-outside-click';
+import { cn } from '../../lib/classname';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
+import { ModifyCoursePrompt } from '../GenerateCourse/ModifyCoursePrompt';
+import type { QuestionAnswerChatMessage } from '../ContentGenerator/QuestionAnswerChat';
+import { useMutation, useQuery } from '@tanstack/react-query';
+import { queryClient } from '../../stores/query-client';
+import { httpPost } from '../../lib/query-http';
+import { aiRoadmapOptions } from '../../queries/ai-roadmap';
+import { UpdatePreferences } from '../GenerateGuide/UpdatePreferences';
+import { generateAIRoadmapFromText } from '@roadmapsh/editor';
+import { useToast } from '../../hooks/use-toast';
+
+type AIRoadmapRegenerateProps = {
+ onRegenerate: (prompt?: string) => void;
+ roadmapSlug: string;
+};
+
+export function AIRoadmapRegenerate(props: AIRoadmapRegenerateProps) {
+ const { onRegenerate, roadmapSlug } = props;
+
+ const toast = useToast();
+ const [isDropdownVisible, setIsDropdownVisible] = useState(false);
+ const [showUpgradeModal, setShowUpgradeModal] = useState(false);
+ const [showPromptModal, setShowPromptModal] = useState(false);
+ const [showUpdatePreferencesModal, setShowUpdatePreferencesModal] =
+ useState(false);
+
+ const ref = useRef