1
0
mirror of https://github.com/kamranahmedse/developer-roadmap.git synced 2025-08-23 01:13:03 +02:00

Add upgrade and limits checks

This commit is contained in:
Kamran Ahmed
2025-07-29 21:56:33 +01:00
parent 3557132752
commit 989015c766
2 changed files with 35 additions and 4 deletions

View File

@@ -14,6 +14,8 @@ import { queryClient } from '../../stores/query-client';
import { userResourceProgressOptions } from '../../queries/resource-progress'; import { userResourceProgressOptions } from '../../queries/resource-progress';
import { useAuth } from '../../hooks/use-auth'; import { useAuth } from '../../hooks/use-auth';
import { roadmapJSONOptions } from '../../queries/roadmap'; import { roadmapJSONOptions } from '../../queries/roadmap';
import { isLoggedIn } from '../../lib/jwt';
import { showLoginPopup } from '../../lib/popup';
type PersonalizedRoadmapProps = { type PersonalizedRoadmapProps = {
roadmapId: string; roadmapId: string;
@@ -200,7 +202,14 @@ export function PersonalizedRoadmap(props: PersonalizedRoadmapProps) {
) : ( ) : (
<button <button
className="group inline-flex items-center gap-1.5 border-b-2 border-b-transparent px-2 pb-2.5 text-sm font-normal text-gray-400 transition-colors hover:text-gray-700" className="group inline-flex items-center gap-1.5 border-b-2 border-b-transparent px-2 pb-2.5 text-sm font-normal text-gray-400 transition-colors hover:text-gray-700"
onClick={() => setIsModalOpen(true)} onClick={() => {
if (!isLoggedIn()) {
showLoginPopup();
return;
}
setIsModalOpen(true);
}}
disabled={isGenerating} disabled={isGenerating}
> >
{isGenerating ? ( {isGenerating ? (

View File

@@ -1,6 +1,10 @@
import { PersonStandingIcon, Trash2 } from 'lucide-react'; import { PersonStandingIcon, Trash2 } from 'lucide-react';
import { useId, useState, type FormEvent } from 'react'; import { useId, useState, type FormEvent } from 'react';
import { Modal } from '../Modal'; import { Modal } from '../Modal';
import { queryClient } from '../../stores/query-client';
import { aiLimitOptions } from '../../queries/ai-course';
import { useQuery } from '@tanstack/react-query';
import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
type PersonalizedRoadmapModalProps = { type PersonalizedRoadmapModalProps = {
onClose: () => void; onClose: () => void;
@@ -10,16 +14,34 @@ type PersonalizedRoadmapModalProps = {
}; };
export function PersonalizedRoadmapModal(props: PersonalizedRoadmapModalProps) { export function PersonalizedRoadmapModal(props: PersonalizedRoadmapModalProps) {
const { onClose, info: infoProp, onSubmit: onSubmitProp, onClearProgress } = props; const {
onClose,
info: infoProp,
onSubmit: onSubmitProp,
onClearProgress,
} = props;
const [info, setInfo] = useState(infoProp); const [info, setInfo] = useState(infoProp);
const infoFieldId = useId(); const infoFieldId = useId();
const { data: limits, isLoading: isLimitLoading } = useQuery(
aiLimitOptions(),
queryClient,
);
const hasReachedLimit =
limits?.used && limits?.limit ? limits.used >= limits.limit : false;
console.log(limits);
const handleSubmit = (e: FormEvent<HTMLFormElement>) => { const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
e.preventDefault(); e.preventDefault();
onSubmitProp(info); onSubmitProp(info);
}; };
if (hasReachedLimit) {
return <UpgradeAccountModal onClose={onClose} />;
}
return ( return (
<Modal onClose={onClose} bodyClassName="rounded-2xl"> <Modal onClose={onClose} bodyClassName="rounded-2xl">
<form onSubmit={handleSubmit} className="p-4"> <form onSubmit={handleSubmit} className="p-4">
@@ -42,7 +64,7 @@ export function PersonalizedRoadmapModal(props: PersonalizedRoadmapModalProps) {
<div className="mt-2 grid grid-cols-2 gap-2"> <div className="mt-2 grid grid-cols-2 gap-2">
<button <button
type="button" type="button"
className="flex text-sm items-center justify-center gap-2 rounded-xl border border-red-200 p-2 px-2 text-red-600 hover:bg-red-50 focus:outline-none" className="flex items-center justify-center gap-2 rounded-xl border border-red-200 p-2 px-2 text-sm text-red-600 hover:bg-red-50 focus:outline-none"
onClick={onClearProgress} onClick={onClearProgress}
> >
<Trash2 className="h-4 w-4" /> <Trash2 className="h-4 w-4" />
@@ -51,7 +73,7 @@ export function PersonalizedRoadmapModal(props: PersonalizedRoadmapModalProps) {
<button <button
type="submit" type="submit"
disabled={!info.trim()} disabled={!info.trim()}
className="flex disabled:opacity-50 disabled:cursor-not-allowed items-center justify-center gap-2 rounded-xl bg-black p-2 px-2 text-white hover:opacity-90 focus:outline-none" className="flex items-center justify-center gap-2 rounded-xl bg-black p-2 px-2 text-white hover:opacity-90 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50"
> >
<PersonStandingIcon className="h-4 w-4" /> <PersonStandingIcon className="h-4 w-4" />
Personalize Personalize