From be0a5c08bf9d1059330ba4f3309b3689ce2fbb8f Mon Sep 17 00:00:00 2001 From: pax2678 Date: Thu, 10 Jul 2025 14:30:25 -0700 Subject: [PATCH 1/3] Update the polarPriceId in Subscription table when subscription is updated in Polar. Select the latest subscription when querying subscription based on userId. --- convex/subscriptions.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/convex/subscriptions.ts b/convex/subscriptions.ts index 41b2d2c..cac4b3e 100644 --- a/convex/subscriptions.ts +++ b/convex/subscriptions.ts @@ -185,7 +185,7 @@ export const checkUserSubscriptionStatus = query({ } tokenIdentifier = identity.subject; } - + const user = await ctx.db .query("users") .withIndex("by_token", (q) => q.eq("tokenIdentifier", tokenIdentifier)) @@ -194,10 +194,11 @@ export const checkUserSubscriptionStatus = query({ if (!user) { return { hasActiveSubscription: false }; } - + const subscription = await ctx.db .query("subscriptions") .withIndex("userId", (q) => q.eq("userId", user.tokenIdentifier)) + .order("desc") // Order by createdAt in descending order .first(); const hasActiveSubscription = subscription?.status === "active"; @@ -234,6 +235,7 @@ export const checkUserSubscriptionStatusByClerkId = query({ const subscription = await ctx.db .query("subscriptions") .withIndex("userId", (q) => q.eq("userId", user.tokenIdentifier)) + .order("desc") // Order by createdAt in descending order .first(); const hasActiveSubscription = subscription?.status === "active"; @@ -261,6 +263,7 @@ export const fetchUserSubscription = query({ const subscription = await ctx.db .query("subscriptions") .withIndex("userId", (q) => q.eq("userId", user.tokenIdentifier)) + .order("desc") // Order by createdAt in descending order .first(); return subscription; @@ -328,6 +331,7 @@ export const handleWebhookEvent = mutation({ if (existingSub) { await ctx.db.patch(existingSub._id, { + polarPriceId: args.body.data.price_id, amount: args.body.data.amount, status: args.body.data.status, currentPeriodStart: new Date( From 22ef41e922f072f45252cca0238b4c38bc01a287 Mon Sep 17 00:00:00 2001 From: pax2678 Date: Mon, 18 Aug 2025 20:14:54 -0700 Subject: [PATCH 2/3] fix inconsistent priceId value in metadata stored in Polar and Convex. priceId is not updated after a user changes the subscription creating confusion. Changes Summary: Checkout Creation (lines 52-54): - REMOVED: priceId: productPriceId, from the metadata object - RESULT: Metadata now only contains userId when creating Polar checkouts Impact: - Polar subscriptions: Will only store userId in metadata (no priceId) - Convex subscriptions: Will only store userId in metadata (no priceId) - Price tracking: Still works via the polarPriceId field in the subscription record - User linking: Preserved via userId in metadata for webhook processing --- convex/subscriptions.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/convex/subscriptions.ts b/convex/subscriptions.ts index cac4b3e..7cc7674 100644 --- a/convex/subscriptions.ts +++ b/convex/subscriptions.ts @@ -51,7 +51,6 @@ const createCheckout = async ({ customerEmail: customerEmail, metadata: { ...metadata, - priceId: productPriceId, }, }; From 0cf77d6e3b88c73581d91a2527323d78b27e4810 Mon Sep 17 00:00:00 2001 From: pax2678 Date: Mon, 1 Sep 2025 18:18:43 -0700 Subject: [PATCH 3/3] fix: clean up dashboard settings navigation and remove duplicate links Changes Made: - Removed duplicate Settings link from sidebar navigation - Eliminated redundant Settings entry in navSecondary array in app-sidebar.tsx - Fixed Settings link in user dropdown navigation - Added proper routing to Settings dropdown item in nav-user.tsx - Settings link now navigates to /dashboard/settings when clicked - Used asChild pattern with React Router Link for proper navigation Result: - Eliminates confusing duplicate Settings links in dashboard - Provides single, functional Settings access through user dropdown - Improves user experience with cleaner navigation structure --- app/components/dashboard/app-sidebar.tsx | 8 +------- app/components/dashboard/nav-user.tsx | 10 +++++++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/components/dashboard/app-sidebar.tsx b/app/components/dashboard/app-sidebar.tsx index 1708ba1..f552ae6 100644 --- a/app/components/dashboard/app-sidebar.tsx +++ b/app/components/dashboard/app-sidebar.tsx @@ -26,13 +26,7 @@ const data = { icon: MessageCircle, }, ], - navSecondary: [ - { - title: "Settings", - url: "/dashboard/settings", - icon: IconSettings, - }, - ], + navSecondary: [], }; export function AppSidebar({ diff --git a/app/components/dashboard/nav-user.tsx b/app/components/dashboard/nav-user.tsx index 3ded485..25e1177 100644 --- a/app/components/dashboard/nav-user.tsx +++ b/app/components/dashboard/nav-user.tsx @@ -5,6 +5,7 @@ import { IconUserCircle, } from "@tabler/icons-react"; import { SettingsIcon } from "lucide-react"; +import { Link } from "react-router"; import { Avatar, AvatarFallback, AvatarImage } from "~/components/ui/avatar"; import { DropdownMenu, @@ -85,9 +86,12 @@ export function NavUser({ user }: any) { Account - - - Settings + + + + + Settings +