1
0
mirror of https://github.com/kamranahmedse/developer-roadmap.git synced 2025-07-31 06:20:14 +02:00

Is paid user checks

This commit is contained in:
Kamran Ahmed
2025-03-14 02:37:47 +00:00
parent 143e27bbdd
commit 0ac14cbbe8
2 changed files with 57 additions and 41 deletions

View File

@@ -21,6 +21,7 @@ import { AICourseModuleView } from './AICourseModuleView';
import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
import { AILimitsPopup } from './AILimitsPopup';
import { RegenerateOutline } from './RegenerateOutline';
import { useIsPaidUser } from '../../queries/billing';
type AICourseContentProps = {
courseSlug?: string;
@@ -41,6 +42,8 @@ export function AICourseContent(props: AICourseContentProps) {
const [sidebarOpen, setSidebarOpen] = useState(false);
const [viewMode, setViewMode] = useState<'module' | 'full'>('full');
const { isPaidUser } = useIsPaidUser();
const { data: aiCourseProgress } = useQuery(
getAiCourseProgressOptions({ aiCourseSlug: courseSlug || '' }),
queryClient,
@@ -162,12 +165,14 @@ export function AICourseContent(props: AICourseContentProps) {
{isLimitReached && (
<div className="mt-4">
{!isPaidUser && (
<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">

View File

@@ -25,6 +25,7 @@ import {
import { queryClient } from '../../stores/query-client';
import { AICourseFollowUp } from './AICourseFollowUp';
import './AICourseFollowUp.css';
import { useIsPaidUser } from '../../queries/billing';
type AICourseModuleViewProps = {
courseSlug: string;
@@ -72,6 +73,8 @@ export function AICourseModuleView(props: AICourseModuleViewProps) {
const lessonId = `${slugify(currentModuleTitle)}__${slugify(currentLessonTitle)}`;
const isLessonDone = aiCourseProgress?.done.includes(lessonId);
const { isPaidUser } = useIsPaidUser();
const abortController = useMemo(
() => new AbortController(),
[activeModuleIndex, activeLessonIndex],
@@ -124,16 +127,17 @@ export function AICourseModuleView(props: AICourseModuleViewProps) {
removeAuthToken();
window.location.reload();
}
}
const reader = response.body?.getReader();
if (!reader) {
setIsLoading(false);
setError('Something went wrong');
return;
}
if (!response.body) {
setIsLoading(false);
setError('No response body received');
return;
}
try {
const reader = response.body.getReader();
setIsLoading(false);
setIsGenerating(true);
await readStream(reader, {
@@ -154,6 +158,10 @@ export function AICourseModuleView(props: AICourseModuleViewProps) {
setIsGenerating(false);
},
});
} catch (e) {
setError(e instanceof Error ? e.message : 'Something went wrong');
setIsLoading(false);
}
};
const { mutate: toggleDone, isPending: isTogglingDone } = useMutation(
@@ -273,10 +281,12 @@ export function AICourseModuleView(props: AICourseModuleViewProps) {
Limit reached
</h2>
<p className="my-3 text-red-600">
You have reached the AI usage limit for today. Please upgrade
your account to continue.
You have reached the AI usage limit for today.
{!isPaidUser && <>Please upgrade your account to continue.</>}
{isPaidUser && <>Please wait until tomorrow to continue.</>}
</p>
{!isPaidUser && (
<button
onClick={() => {
onUpgrade();
@@ -285,6 +295,7 @@ export function AICourseModuleView(props: AICourseModuleViewProps) {
>
Upgrade Account
</button>
)}
</div>
) : (
<p className="text-red-600">{error}</p>