From a21fcddb5465cfa702cf34392359995be6654598 Mon Sep 17 00:00:00 2001 From: Aiden <30964272+0xaaiden@users.noreply.github.com> Date: Mon, 2 Dec 2024 10:20:05 -0500 Subject: [PATCH 1/3] Disable the free tier and only have the paid tiers --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/function03-labs/WalletLabels?shareId=XXXX-XXXX-XXXX-XXXX). --- app/api/pricing/tiers/route.ts | 4 +- components/app/dashboard-free-tier-card.tsx | 70 --------------------- components/app/pricing-client.tsx | 4 +- components/app/subscription-client.tsx | 6 +- 4 files changed, 6 insertions(+), 78 deletions(-) delete mode 100644 components/app/dashboard-free-tier-card.tsx diff --git a/app/api/pricing/tiers/route.ts b/app/api/pricing/tiers/route.ts index 73e63959..aa64d3df 100644 --- a/app/api/pricing/tiers/route.ts +++ b/app/api/pricing/tiers/route.ts @@ -61,7 +61,7 @@ export async function getTiers() { return acc }, []) - return { tiers: [...paidTiers] } + return { tiers: paidTiers } } export async function GET() { @@ -75,4 +75,4 @@ export async function GET() { { status: 500 } ) } -} \ No newline at end of file +} diff --git a/components/app/dashboard-free-tier-card.tsx b/components/app/dashboard-free-tier-card.tsx deleted file mode 100644 index 0b06cc99..00000000 --- a/components/app/dashboard-free-tier-card.tsx +++ /dev/null @@ -1,70 +0,0 @@ -"use client" - -import React, { useState } from "react" -import { AnimatePresence, motion } from "framer-motion" -import { ChevronDown } from "lucide-react" - -import { useTiers } from "@/lib/hooks/use-tiers" -import { cn } from "@/lib/utils" - -import { Icons } from "@/components/shared/icons" -import { Button } from "@/components/ui/button" -import { Card, CardContent } from "@/components/ui/card" - -export const FreeTierCard: React.FC = () => { - const [showFreeTierFeatures, setShowFreeTierFeatures] = useState(false) - const { data } = useTiers() - - const freeTier = data?.tiers.find((tier) => tier.id === "tier-free") - - if (!freeTier) { - return null - } - - return ( - - - - - {showFreeTierFeatures && ( - -
-

- These are the features available on the Free Tier. -

-
    - {freeTier.features.map((feature, index) => ( -
  • - - {feature} -
  • - ))} -
-
-
- )} -
-
-
- ) -} diff --git a/components/app/pricing-client.tsx b/components/app/pricing-client.tsx index 883e55b1..87e79f6d 100644 --- a/components/app/pricing-client.tsx +++ b/components/app/pricing-client.tsx @@ -34,6 +34,8 @@ export function PricingClient({ initialData }: PricingClientProps) { return } + const paidTiers = initialData.tiers.filter(tier => tier.id !== "tier-free") + return (
@@ -52,7 +54,7 @@ export function PricingClient({ initialData }: PricingClientProps) { />
- {initialData.tiers.map((tier) => ( + {paidTiers.map((tier) => (
} - const paidTiers = initialData.tiers.filter( - (tier) => tier.id !== "tier-free-plan" - ) + const paidTiers = initialData.tiers if (!subscription?.planId) { return ( -

Choose Your Plan From 0ae0f61d1afee5125c2ac88533e75ce4b2abdf1a Mon Sep 17 00:00:00 2001 From: Ahmed0-0Kallel Date: Tue, 3 Dec 2024 00:06:52 +0100 Subject: [PATCH 2/3] Free Tier removed from pricing and subscription pages + Removed unecessary field from schema --- components/app/pricing-client.tsx | 9 ++++++--- components/app/subscription-client.tsx | 4 +++- prisma/schema.prisma | 1 - 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/components/app/pricing-client.tsx b/components/app/pricing-client.tsx index 87e79f6d..d9f778ed 100644 --- a/components/app/pricing-client.tsx +++ b/components/app/pricing-client.tsx @@ -34,7 +34,10 @@ export function PricingClient({ initialData }: PricingClientProps) { return } - const paidTiers = initialData.tiers.filter(tier => tier.id !== "tier-free") + const paidTiers = initialData.tiers.filter( + (tier) => tier.id !== "tier-free-plan" + ) + console.log(paidTiers) return (
@@ -53,7 +56,7 @@ export function PricingClient({ initialData }: PricingClientProps) { onFrequencyChange={setFrequency} /> -
+
{paidTiers.map((tier) => (

} - const paidTiers = initialData.tiers + const paidTiers = initialData.tiers.filter( + (tier) => tier.id !== "tier-free-plan" + ) if (!subscription?.planId) { return ( diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9b7eba23..6ec1bd43 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -16,7 +16,6 @@ model User { organizationSlug String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - lemonSqueezyCustomerId String? @unique AddressLabel AddressLabel[] apiKeys ApiKey[] subscriptions Subscription[] From cc057e07c37fcb4696d23bc0e18298a7cd14eb0d Mon Sep 17 00:00:00 2001 From: Ahmed0-0Kallel Date: Tue, 3 Dec 2024 00:35:24 +0100 Subject: [PATCH 3/3] Add subscription check to API Key generation page - Validate subscriptions for API key generation. - Prompt users without active subscriptions. - Include subscription details in user retrieval. --- app/(dashboard)/dashboard/page.tsx | 31 ++++++++++++++++++++++++++---- lib/app/user-profile.ts | 13 ++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/app/(dashboard)/dashboard/page.tsx b/app/(dashboard)/dashboard/page.tsx index a94141f2..6b11e142 100644 --- a/app/(dashboard)/dashboard/page.tsx +++ b/app/(dashboard)/dashboard/page.tsx @@ -1,3 +1,4 @@ +import Link from "next/link" import { redirect } from "next/navigation" import { getApiKeys } from "@/lib/app/api-key" @@ -6,6 +7,7 @@ import { getSession } from "@/lib/session" import { DashboardGenerateAPIkeysDialog } from "@/components/app/dashboard-generate-apikeys-dialog" import { DashboardTableAPIKeys } from "@/components/app/dashboard-table-apikeys" +import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" import { PageHeader } from "@/components/ui/page-header" @@ -21,6 +23,13 @@ export default async function PageDashboardApiKeys() { const apiKeys = await getApiKeys(session.user.id) const user = await getUser(session.user.id) + const hasActiveSubscription = user.subscriptions?.some( + (sub) => + sub.status === "active" && + !sub.isPaused && + (!sub.endsAt || new Date(sub.endsAt) > new Date()) && + sub.planId != 0 // Not free Tier + ) return (
@@ -38,10 +47,24 @@ export default async function PageDashboardApiKeys() { - + {hasActiveSubscription ? ( + + ) : ( +
+

Subscription Required

+

+ You need an active subscription to generate API keys. +

+ +
+ )}
diff --git a/lib/app/user-profile.ts b/lib/app/user-profile.ts index 85c3b833..34a5a68d 100644 --- a/lib/app/user-profile.ts +++ b/lib/app/user-profile.ts @@ -1,11 +1,12 @@ "use server" import { cookies } from "next/headers" -import { User } from "@prisma/client" +import { Subscription, User } from "@prisma/client" import { getIronSession } from "iron-session" import { prisma } from "@/lib/prisma" import { SERVER_SESSION_SETTINGS, SessionData } from "@/lib/session" +import { getCurrentSubscription } from "./actions" export async function Logout() { const session = await getIronSession( @@ -27,7 +28,7 @@ export async function updateUser( }) } -export async function getUser(userId: string): Promise { +export async function getUser(userId: string): Promise { const user = await prisma.user.findUnique({ where: { id: userId, @@ -36,8 +37,14 @@ export async function getUser(userId: string): Promise { if (!user) { throw new Error("User not found") } - return user + + const subscription = await getCurrentSubscription(userId) + return { + ...user, + subscriptions: subscription ? [subscription] : [] + } } + export async function createUser(data: Omit): Promise { return await prisma.user.create({ data,