chore: Secure routes with auth middleware, update text and fix minor bugs
This commit is contained in:
@@ -103,82 +103,71 @@ export default function UpgradePage() {
|
||||
<p className="text-xl text-muted-foreground">Unlock the full power of PragatiVeer to master JEE & NEET.</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 items-stretch">
|
||||
{/* Free Tier */}
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 max-w-5xl mx-auto items-stretch">
|
||||
{/* Free Tier
|
||||
<Card className="bg-background/80 backdrop-blur-md border border-border p-6 rounded-[2rem] flex flex-col justify-between h-full z-10 relative shadow-xl hover:border-border/80 transition-colors">
|
||||
<div>
|
||||
<CardHeader className="p-0 mb-6">
|
||||
<CardTitle className="text-3xl font-bold mb-1 text-foreground">Free</CardTitle>
|
||||
<CardDescription className="text-muted-foreground mb-6 text-base">Perfect to get started.</CardDescription>
|
||||
<div className="text-6xl font-bold tracking-tighter mb-6 text-foreground">
|
||||
₹0<span className="text-xl text-white/60 font-medium tracking-normal ml-1">/year</span>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="p-0 space-y-3 mb-6 font-medium text-lg">
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-foreground shrink-0" size={24}/> 1 Daily Practice Sheet</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-foreground shrink-0" size={24}/> Basic Performance Analytics</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-foreground shrink-0" size={24}/> Community Access</div>
|
||||
</CardContent>
|
||||
<h3 className="text-3xl font-bold mb-2 text-foreground">Free</h3>
|
||||
<p className="text-muted-foreground mb-6 text-base">Perfect to get started.</p>
|
||||
<div className="text-6xl font-bold tracking-tighter mb-6 text-foreground">
|
||||
₹0<span className="text-xl text-white/60 font-medium tracking-normal ml-1">/year</span>
|
||||
</div>
|
||||
<ul className="space-y-3 mb-6 font-medium text-lg">
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-foreground shrink-0" size={24}/> 1 Daily Practice Sheet</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-foreground shrink-0" size={24}/> Basic Performance Analytics</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-foreground shrink-0" size={24}/> Community Access</li>
|
||||
</ul>
|
||||
</div>
|
||||
<CardFooter className="p-0">
|
||||
<Button variant="outline" className="w-full rounded-2xl h-12 border-border text-foreground font-bold text-lg hover:bg-secondary" disabled>Get Started Free</Button>
|
||||
</CardFooter>
|
||||
<Button variant="outline" className="w-full rounded-2xl h-12 border-border text-foreground font-bold text-lg hover:bg-secondary" disabled>Get Started Free</Button>
|
||||
</Card>
|
||||
*/}
|
||||
|
||||
{/* Pro Tier */}
|
||||
<Card className="bg-background/80 backdrop-blur-md border border-border p-6 rounded-[2rem] flex flex-col justify-between h-full z-10 relative shadow-xl hover:border-border/80 transition-colors">
|
||||
<div>
|
||||
<CardHeader className="p-0 mb-6">
|
||||
<CardTitle className="text-3xl font-bold mb-1 text-yellow-500">Pro</CardTitle>
|
||||
<CardDescription className="text-muted-foreground mb-6 text-base">Perfect for self-paced practice.</CardDescription>
|
||||
<div className="text-6xl font-bold tracking-tighter mb-6 text-yellow-500">
|
||||
₹3,499<span className="text-xl text-yellow-500/60 font-medium tracking-normal ml-1">/year</span>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="p-0 space-y-3 mb-6 font-medium text-lg">
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Unlimited Daily Practice Sheets</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Weekly Test Series & Mock Tests</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Detailed Performance Analytics</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Parent Dashboard Access</div>
|
||||
</CardContent>
|
||||
<h3 className="text-3xl font-bold mb-2 text-yellow-500">Pro</h3>
|
||||
<p className="text-muted-foreground mb-6 text-base">Perfect for self-paced practice.</p>
|
||||
<div className="text-6xl font-bold tracking-tighter mb-6 text-yellow-500">
|
||||
₹3,499<span className="text-xl text-yellow-500/60 font-medium tracking-normal ml-1">/year</span>
|
||||
</div>
|
||||
<ul className="space-y-3 mb-6 font-medium text-lg">
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Unlimited Daily Practice Sheets</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Weekly Test Series & Mock Tests</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Detailed Performance Analytics</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-yellow-500 shrink-0" size={24}/> Parent Dashboard Access</li>
|
||||
</ul>
|
||||
</div>
|
||||
<CardFooter className="p-0">
|
||||
<Button
|
||||
className="w-full bg-yellow-500 text-black hover:bg-yellow-400 font-bold text-lg rounded-2xl h-12"
|
||||
onClick={() => handleUpgrade("Pro")}
|
||||
disabled={!!loadingTier}
|
||||
>
|
||||
{loadingTier === "Pro" ? <Loader2 className="animate-spin" /> : "Get Pro"}
|
||||
</Button>
|
||||
</CardFooter>
|
||||
<Button
|
||||
className="w-full bg-yellow-500 text-black hover:bg-yellow-400 font-bold text-lg rounded-2xl h-12"
|
||||
onClick={() => handleUpgrade("Pro")}
|
||||
disabled={!!loadingTier}
|
||||
>
|
||||
{loadingTier === "Pro" ? <Loader2 className="animate-spin" /> : "Get Pro"}
|
||||
</Button>
|
||||
</Card>
|
||||
|
||||
{/* AI Coach Tier */}
|
||||
<Card className="bg-background/80 backdrop-blur-md border border-border p-6 rounded-[2rem] flex flex-col justify-between h-full z-10 relative shadow-xl hover:border-border/80 transition-colors">
|
||||
<div>
|
||||
<CardHeader className="p-0 mb-6">
|
||||
<CardTitle className="text-3xl font-bold mb-2 text-[#00F0FF]">AI Coach</CardTitle>
|
||||
<CardDescription className="text-muted-foreground mb-6 text-base">The complete AI-driven system.</CardDescription>
|
||||
<div className="text-6xl font-bold tracking-tighter mb-6 text-[#00F0FF]">
|
||||
₹11,999<span className="text-xl text-[#00F0FF]/60 font-medium tracking-normal ml-1">/year</span>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="p-0 space-y-3 mb-6 font-medium text-lg">
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> Everything in Pro</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> AI Spaced Repetition (Mistakes)</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> 24/7 Streaming AI Tutor Chat</div>
|
||||
<div className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> Predictive Rank & College Predictor</div>
|
||||
</CardContent>
|
||||
<h3 className="text-3xl font-bold mb-2 text-[#00F0FF]">AI Coach</h3>
|
||||
<p className="text-muted-foreground mb-6 text-base">The complete AI-driven system.</p>
|
||||
<div className="text-6xl font-bold tracking-tighter mb-6 text-[#00F0FF]">
|
||||
₹11,999<span className="text-xl text-[#00F0FF]/60 font-medium tracking-normal ml-1">/year</span>
|
||||
</div>
|
||||
<ul className="space-y-3 mb-6 font-medium text-lg">
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> Everything in Pro</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> AI Spaced Repetition (Mistakes)</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> 24/7 Streaming AI Tutor Chat</li>
|
||||
<li className="flex items-center gap-4"><CheckCircle2 className="text-[#00F0FF] shrink-0" size={24}/> Predictive Rank & College Predictor</li>
|
||||
</ul>
|
||||
</div>
|
||||
<CardFooter className="p-0">
|
||||
<Button
|
||||
className="w-full font-bold text-lg rounded-2xl h-12 bg-[#00F0FF] text-black hover:bg-[#00F0FF]/90 transition-all"
|
||||
onClick={() => handleUpgrade("Al_Coach")}
|
||||
disabled={!!loadingTier}
|
||||
>
|
||||
{loadingTier === "Al_Coach" ? <Loader2 className="animate-spin" /> : "Get AI Coach"}
|
||||
</Button>
|
||||
</CardFooter>
|
||||
<Button
|
||||
className="w-full font-bold text-lg rounded-2xl h-12 bg-[#00F0FF] text-black hover:bg-[#00F0FF]/90 transition-all"
|
||||
onClick={() => handleUpgrade("Al_Coach")}
|
||||
disabled={!!loadingTier}
|
||||
>
|
||||
{loadingTier === "Al_Coach" ? <Loader2 className="animate-spin" /> : "Get AI Coach"}
|
||||
</Button>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
@@ -199,10 +188,10 @@ export default function UpgradePage() {
|
||||
<table className="w-full text-left border-collapse min-w-[700px]">
|
||||
<thead>
|
||||
<tr className="border-b border-border/50 bg-background/50">
|
||||
<th className="p-4 md:p-6 font-bold text-lg w-2/5 border-l border-t border-border/50">Feature</th>
|
||||
<th className="p-4 md:p-6 font-bold text-lg text-center w-1/5 border-x border-t border-white">Free</th>
|
||||
<th className="p-4 md:p-6 font-bold text-lg text-center w-1/5 text-yellow-500 border-x border-t border-yellow-500">Pro</th>
|
||||
<th className="p-4 md:p-6 font-bold text-lg text-center w-1/5 text-[#00F0FF] bg-[#00F0FF]/5 border-x border-t border-[#00F0FF]">AI Coach</th>
|
||||
<th className="p-4 md:p-6 font-bold text-lg w-1/2 border-l border-t border-border/50">Feature</th>
|
||||
{/* <th className="p-4 md:p-6 font-bold text-lg text-center w-1/5 border-x border-t border-white">Free</th> */}
|
||||
<th className="p-4 md:p-6 font-bold text-lg text-center w-1/4 text-yellow-500 border-x border-t border-yellow-500">Pro</th>
|
||||
<th className="p-4 md:p-6 font-bold text-lg text-center w-1/4 text-[#00F0FF] bg-[#00F0FF]/5 border-x border-t border-[#00F0FF]">AI Coach</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-border/30 text-sm md:text-base">
|
||||
@@ -232,9 +221,9 @@ export default function UpgradePage() {
|
||||
].map((feature, idx) => (
|
||||
<tr key={idx} className="hover:bg-background/40 transition-colors">
|
||||
<td className="p-4 md:p-6 font-medium border-y border-l border-border/30">{feature.name}</td>
|
||||
<td className="p-4 md:p-6 text-center text-muted-foreground border border-white">
|
||||
{/* <td className="p-4 md:p-6 text-center text-muted-foreground border border-white">
|
||||
{typeof feature.free === 'boolean' ? (feature.free ? <CheckCircle2 className="mx-auto text-white" size={20} /> : <Minus className="mx-auto text-white/30" size={20} />) : <span className="font-semibold text-white">{feature.free}</span>}
|
||||
</td>
|
||||
</td> */}
|
||||
<td className="p-4 md:p-6 text-center border border-yellow-500">
|
||||
{typeof feature.pro === 'boolean' ? (feature.pro ? <CheckCircle2 className="mx-auto text-yellow-500" size={20} /> : <Minus className="mx-auto text-yellow-500/30" size={20} />) : <span className="font-semibold text-yellow-500">{feature.pro}</span>}
|
||||
</td>
|
||||
|
||||
Reference in New Issue
Block a user