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}