diff --git a/src/components/Billing/UpgradeAccountModal.tsx b/src/components/Billing/UpgradeAccountModal.tsx
index 4192bf63f..cb8e08843 100644
--- a/src/components/Billing/UpgradeAccountModal.tsx
+++ b/src/components/Billing/UpgradeAccountModal.tsx
@@ -185,6 +185,7 @@ export function UpgradeAccountModal(props: UpgradeAccountModalProps) {
bodyClassName="p-4 sm:p-6 bg-white"
wrapperClassName="h-auto rounded-xl max-w-3xl w-full min-h-[540px] mx-2 sm:mx-4"
overlayClassName="items-start md:items-center"
+ hasCloseButton={true}
>
e.stopPropagation()}>
{errorContent}
diff --git a/src/components/FrameRenderer/RoadmapFloatingChat.tsx b/src/components/FrameRenderer/RoadmapFloatingChat.tsx
index 129c1bce0..07001c449 100644
--- a/src/components/FrameRenderer/RoadmapFloatingChat.tsx
+++ b/src/components/FrameRenderer/RoadmapFloatingChat.tsx
@@ -22,14 +22,15 @@ import {
import { cn } from '../../lib/classname';
import { lockBodyScroll } from '../../lib/dom';
import { slugify } from '../../lib/slugger';
+import { getAiCourseLimitOptions } from '../../queries/ai-course';
+import { billingDetailsOptions } from '../../queries/billing';
import { roadmapJSONOptions } from '../../queries/roadmap';
import { roadmapQuestionsOptions } from '../../queries/roadmap-questions';
import { queryClient } from '../../stores/query-client';
+import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
import { RoadmapAIChatCard } from '../RoadmapAIChat/RoadmapAIChatCard';
-import { UpdatePersonaModal } from '../UserPersona/UpdatePersonaModal';
import { CLOSE_TOPIC_DETAIL_EVENT } from '../TopicDetail/TopicDetail';
-import { billingDetailsOptions } from '../../queries/billing';
-import { getAiCourseLimitOptions } from '../../queries/ai-course';
+import { UpdatePersonaModal } from '../UserPersona/UpdatePersonaModal';
type ChatHeaderButtonProps = {
onClick?: () => void;
@@ -156,6 +157,7 @@ export function RoadmapFloatingChat(props: RoadmapChatProps) {
const [inputValue, setInputValue] = useState('');
const inputRef = useRef(null);
const [isPersonalizeOpen, setIsPersonalizeOpen] = useState(false);
+ const [showUpgradeModal, setShowUpgradeModal] = useState(false);
// Fetch questions from API
const { data: questionsData } = useQuery(
@@ -292,6 +294,14 @@ export function RoadmapFloatingChat(props: RoadmapChatProps) {
>
)}
+ {showUpgradeModal && (
+ {
+ setShowUpgradeModal(false);
+ }}
+ />
+ )}
+
{isPersonalizeOpen && (
{
+ if (isLimitExceeded) {
+ setShowUpgradeModal(true);
+ setIsOpen(false);
+ return;
+ }
+
handleChatSubmit(
textToJSON(question),
isRoadmapDetailLoading,
@@ -415,7 +431,8 @@ export function RoadmapFloatingChat(props: RoadmapChatProps) {
{isLimitExceeded && (
{
- window.open('/premium', '_blank');
+ setShowUpgradeModal(true);
+ setIsOpen(false);
}}
/>
)}
@@ -436,7 +453,8 @@ export function RoadmapFloatingChat(props: RoadmapChatProps) {
{
- window.open('/premium', '_blank');
+ setShowUpgradeModal(true);
+ setIsOpen(false);
}}
/>
)}
diff --git a/src/components/Modal.tsx b/src/components/Modal.tsx
index d8c05d0a0..e22b4cc45 100644
--- a/src/components/Modal.tsx
+++ b/src/components/Modal.tsx
@@ -2,6 +2,7 @@ import { type ReactNode, useRef } from 'react';
import { useOutsideClick } from '../hooks/use-outside-click';
import { useKeydown } from '../hooks/use-keydown';
import { cn } from '../lib/classname';
+import { X } from 'lucide-react';
type ModalProps = {
onClose: () => void;
@@ -9,6 +10,7 @@ type ModalProps = {
overlayClassName?: string;
bodyClassName?: string;
wrapperClassName?: string;
+ hasCloseButton?: boolean;
};
export function Modal(props: ModalProps) {
@@ -18,6 +20,7 @@ export function Modal(props: ModalProps) {
bodyClassName,
wrapperClassName,
overlayClassName,
+ hasCloseButton = true,
} = props;
const popupBodyEl = useRef(null);
@@ -33,7 +36,7 @@ export function Modal(props: ModalProps) {
return (
@@ -50,6 +53,14 @@ export function Modal(props: ModalProps) {
bodyClassName,
)}
>
+ {hasCloseButton && (
+
+ )}
{children}