From 21e4602881f5883469fa469593ab85a15e16629c Mon Sep 17 00:00:00 2001 From: Kamran Ahmed Date: Tue, 25 Mar 2025 15:36:39 +0000 Subject: [PATCH] Updates to AI usage --- .../GenerateCourse/AICourseContent.tsx | 1 + .../AICourseFollowUpPopover.tsx | 31 ++++++++++++------- .../GenerateCourse/AICourseLesson.tsx | 2 +- .../GenerateCourse/AICourseLimit.tsx | 1 - .../GenerateCourse/AICourseRoadmapView.tsx | 28 ++++++++++++++--- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/components/GenerateCourse/AICourseContent.tsx b/src/components/GenerateCourse/AICourseContent.tsx index 499729bd7..06e59c1c0 100644 --- a/src/components/GenerateCourse/AICourseContent.tsx +++ b/src/components/GenerateCourse/AICourseContent.tsx @@ -435,6 +435,7 @@ export function AICourseContent(props: AICourseContentProps) { setActiveLessonIndex={setActiveLessonIndex} setViewMode={setViewMode} setExpandedModules={setExpandedModules} + onUpgradeClick={() => setShowUpgradeModal(true)} /> )} diff --git a/src/components/GenerateCourse/AICourseFollowUpPopover.tsx b/src/components/GenerateCourse/AICourseFollowUpPopover.tsx index de116546b..35b49051f 100644 --- a/src/components/GenerateCourse/AICourseFollowUpPopover.tsx +++ b/src/components/GenerateCourse/AICourseFollowUpPopover.tsx @@ -2,8 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { BookOpen, Bot, - Code, - Globe, Hammer, + Hammer, HelpCircle, LockIcon, Send, @@ -22,6 +21,7 @@ import { } from '../../lib/markdown'; import { getAiCourseLimitOptions } from '../../queries/ai-course'; import { queryClient } from '../../stores/query-client'; +import { billingDetailsOptions } from '../../queries/billing'; export type AllowedAIChatRole = 'user' | 'assistant'; export type AIChatHistoryType = { @@ -70,7 +70,11 @@ export function AICourseFollowUpPopover(props: AICourseFollowUpPopoverProps) { queryClient, ); + const { data: userBillingDetails, isLoading: isBillingDetailsLoading } = + useQuery(billingDetailsOptions(), queryClient); + const isLimitExceeded = (tokenUsage?.used || 0) >= (tokenUsage?.limit || 0); + const isPaidUser = userBillingDetails?.status === 'active'; const handleChatSubmit = (e: FormEvent) => { e.preventDefault(); @@ -247,15 +251,20 @@ export function AICourseFollowUpPopover(props: AICourseFollowUpPopoverProps) { {isLimitExceeded && (
-

Limit reached for today

- +

+ Limit reached for today + {isPaidUser ? '. Please wait until tomorrow.' : ''} +

+ {!isPaidUser && ( + + )}
)} You have reached the AI usage limit for today. {!isPaidUser && <>Please upgrade your account to continue.} - {isPaidUser && <>Please wait until tomorrow to continue.} + {isPaidUser && <> Please wait until tomorrow to continue.}

{!isPaidUser && ( diff --git a/src/components/GenerateCourse/AICourseLimit.tsx b/src/components/GenerateCourse/AICourseLimit.tsx index d1dd7e4b8..f2c80a80b 100644 --- a/src/components/GenerateCourse/AICourseLimit.tsx +++ b/src/components/GenerateCourse/AICourseLimit.tsx @@ -32,7 +32,6 @@ export function AICourseLimit(props: AICourseLimitProps) { const totalPercentage = getPercentage(used, limit); // has consumed 85% of the limit - const isNearLimit = used >= limit * 0.85; const isPaidUser = userBillingDetails.status === 'active'; return ( diff --git a/src/components/GenerateCourse/AICourseRoadmapView.tsx b/src/components/GenerateCourse/AICourseRoadmapView.tsx index 8300f1cfc..41ab700dd 100644 --- a/src/components/GenerateCourse/AICourseRoadmapView.tsx +++ b/src/components/GenerateCourse/AICourseRoadmapView.tsx @@ -17,9 +17,11 @@ import { } from 'react'; import type { AICourseViewMode } from './AICourseContent'; import { replaceChildren } from '../../lib/dom'; -import { Loader2Icon } from 'lucide-react'; -import { ErrorIcon } from '../ReactIcons/ErrorIcon'; +import { Frown, Loader2Icon } from 'lucide-react'; import { renderTopicProgress } from '../../lib/resource-progress'; +import { queryClient } from '../../stores/query-client'; +import { useQuery } from '@tanstack/react-query'; +import { billingDetailsOptions } from '../../queries/billing'; export type AICourseRoadmapViewProps = { done: string[]; @@ -27,6 +29,7 @@ export type AICourseRoadmapViewProps = { setActiveModuleIndex: (index: number) => void; setActiveLessonIndex: (index: number) => void; setViewMode: (mode: AICourseViewMode) => void; + onUpgradeClick: () => void; setExpandedModules: Dispatch>>; }; @@ -38,6 +41,7 @@ export function AICourseRoadmapView(props: AICourseRoadmapViewProps) { setActiveLessonIndex, setViewMode, setExpandedModules, + onUpgradeClick, } = props; const containerEl = useRef(null); @@ -47,6 +51,11 @@ export function AICourseRoadmapView(props: AICourseRoadmapViewProps) { const [isGenerating, setIsGenerating] = useState(false); const [error, setError] = useState(null); + const { data: userBillingDetails, isLoading: isBillingDetailsLoading } = + useQuery(billingDetailsOptions(), queryClient); + + const isPaidUser = userBillingDetails?.status === 'active'; + const generateAICourseRoadmap = async (courseSlug: string) => { try { const response = await fetch( @@ -179,7 +188,7 @@ export function AICourseRoadmapView(props: AICourseRoadmapViewProps) { ); return ( -
+
{isLoading && (
@@ -188,10 +197,19 @@ export function AICourseRoadmapView(props: AICourseRoadmapViewProps) { {error && !isLoading && !isGenerating && (
- -

+ +

{error || 'Something went wrong'}

+ + {!isPaidUser && (error || '')?.includes('limit') && ( + + )}
)}