diff --git a/src/components/GenerateCourse/AICourseCard.tsx b/src/components/GenerateCourse/AICourseCard.tsx index 1ac7305fa..4ac42f814 100644 --- a/src/components/GenerateCourse/AICourseCard.tsx +++ b/src/components/GenerateCourse/AICourseCard.tsx @@ -40,7 +40,7 @@ export function AICourseCard(props: AICourseCardProps) { return ( <a href={`/ai-tutor/${course.slug}`} - className="group relative flex w-full flex-col overflow-hidden rounded-md border border-gray-300 bg-white p-4 text-left transition-all hover:border-gray-300 hover:bg-gray-50" + className="group relative flex w-full flex-col overflow-hidden rounded-md border border-gray-300 bg-white p-4 text-left transition-all hover:border-gray-3 00 hover:bg-gray-50" > <div className="mb-2 flex items-center justify-between"> <span diff --git a/src/components/GenerateCourse/AICourseContent.tsx b/src/components/GenerateCourse/AICourseContent.tsx index 5ee51fe46..36554e0ed 100644 --- a/src/components/GenerateCourse/AICourseContent.tsx +++ b/src/components/GenerateCourse/AICourseContent.tsx @@ -1,5 +1,12 @@ import { useQuery } from '@tanstack/react-query'; -import { BookOpenCheck, ChevronLeft, Loader2, Menu, X } from 'lucide-react'; +import { + BookOpenCheck, + ChevronLeft, + Loader2, + Menu, + X, + CircleAlert, +} from 'lucide-react'; import { useState } from 'react'; import { type AiCourse } from '../../lib/ai'; import { cn } from '../../lib/classname'; @@ -107,18 +114,8 @@ export function AICourseContent(props: AICourseContentProps) { (totalDoneLessons / totalCourseLessons) * 100, ); - if (error && !isLoading) { - return ( - <div className="flex h-screen flex-col items-center justify-center px-4 text-center"> - <ErrorIcon additionalClasses="h-24 w-24" /> - <h1 className="mt-2.5 text-2xl font-bold">Error Generating Course</h1> - <p className="mt-1 text-gray-500">{error}</p> - </div> - ); - } - - return ( - <section className="flex h-screen flex-grow flex-col overflow-hidden bg-gray-50"> + const modals = ( + <> {showUpgradeModal && ( <UpgradeAccountModal onClose={() => setShowUpgradeModal(false)} /> )} @@ -132,6 +129,53 @@ export function AICourseContent(props: AICourseContentProps) { }} /> )} + </> + ); + + if (error && !isLoading) { + const isLimitReached = error.includes('limit'); + + const icon = isLimitReached ? ( + <CircleAlert className="mb-4 size-16 text-red-500" /> + ) : ( + <ErrorIcon additionalClasses="mb-4 size-16" /> + ); + const title = isLimitReached ? 'Limit Reached' : 'Error Generating Course'; + const message = isLimitReached + ? 'You have reached the daily AI usage limit. Please upgrade your account to continue.' + : error; + return ( + <> + {modals} + <div className="flex h-screen flex-col items-center justify-center px-4 text-center"> + {icon} + <h1 className="text-2xl font-bold">{title}</h1> + <p className="my-3 max-w-sm text-balance text-gray-500">{message}</p> + + {isLimitReached && ( + <div className="mt-4"> + <button + onClick={() => setShowUpgradeModal(true)} + className="rounded-md bg-yellow-400 px-6 py-2 text-sm font-medium text-black hover:bg-yellow-500" + > + Upgrade to remove Limits + </button> + + <p className="mt-4 text-sm text-black"> + <a href="/ai-tutor" className="underline underline-offset-2"> + Back to AI Tutor + </a> + </p> + </div> + )} + </div> + </> + ); + } + + return ( + <section className="flex h-screen flex-grow flex-col overflow-hidden bg-gray-50"> + {modals} <div className="border-b border-gray-200 bg-gray-100"> <div className="flex items-center justify-between px-4 py-2">