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
-
{
- onUpgradeClick();
- }}
- className="rounded-md bg-white px-2 py-1 text-xs font-medium text-black hover:bg-gray-300"
- >
- Upgrade for more
-
+
+ Limit reached for today
+ {isPaidUser ? '. Please wait until tomorrow.' : ''}
+
+ {!isPaidUser && (
+
{
+ onUpgradeClick();
+ }}
+ className="rounded-md bg-white px-2 py-1 text-xs font-medium text-black hover:bg-gray-300"
+ >
+ Upgrade for more
+
+ )}
)}
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') && (
+
+ Upgrade Account
+
+ )}
)}