diff --git a/app/api/checkout/success/route.ts b/app/api/checkout/success/route.ts index a2c04ef6..3c97e821 100644 --- a/app/api/checkout/success/route.ts +++ b/app/api/checkout/success/route.ts @@ -57,5 +57,7 @@ export async function GET(req: NextRequest) { console.error("Error processing checkout success:", err); } - return NextResponse.redirect(new URL(returnUrl, req.url)); + const redirectUrl = new URL(returnUrl, req.url); + redirectUrl.searchParams.set("upgrade", "success"); + return NextResponse.redirect(redirectUrl); } diff --git a/app/api/rpc/[command]/get_publication_analytics.ts b/app/api/rpc/[command]/get_publication_analytics.ts index 749e6e78..540c4564 100644 --- a/app/api/rpc/[command]/get_publication_analytics.ts +++ b/app/api/rpc/[command]/get_publication_analytics.ts @@ -21,7 +21,7 @@ export const get_publication_analytics = makeRoute({ { supabase }: Pick, ) => { const identity = await getIdentityData(); - if (!identity?.atp_did || !identity.entitlements?.publication_analytics) { + if (!identity?.atp_did || !identity.entitlements?.publication_analytics || !identity.entitlements?.pro_plan_visible) { return { error: "unauthorized" as const }; } diff --git a/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts b/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts index 81bd65a4..ac280b7c 100644 --- a/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts +++ b/app/api/rpc/[command]/get_publication_subscribers_timeseries.ts @@ -19,7 +19,7 @@ export const get_publication_subscribers_timeseries = makeRoute({ { supabase }: Pick, ) => { const identity = await getIdentityData(); - if (!identity?.atp_did || !identity.entitlements?.publication_analytics) { + if (!identity?.atp_did || !identity.entitlements?.publication_analytics || !identity.entitlements?.pro_plan_visible) { return { error: "unauthorized" as const }; } diff --git a/app/layout.tsx b/app/layout.tsx index 16e89e78..0b31dcdd 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -9,6 +9,8 @@ import { IdentityProviderServer } from "components/IdentityProviderServer"; import { headers } from "next/headers"; import { RequestHeadersProvider } from "components/Providers/RequestHeadersProvider"; import { RouteUIStateManager } from "components/RouteUIStateManger"; +import { SubscriptionSuccessModal } from "components/SubscriptionSuccessModal"; +import { Suspense } from "react"; export const metadata = { title: "Leaflet", @@ -87,6 +89,9 @@ export default async function RootLayout({ timezone={ipTimezone} > {children} + + + diff --git a/app/lish/[did]/[publication]/dashboard/Actions.tsx b/app/lish/[did]/[publication]/dashboard/Actions.tsx index df919ee7..bac897c7 100644 --- a/app/lish/[did]/[publication]/dashboard/Actions.tsx +++ b/app/lish/[did]/[publication]/dashboard/Actions.tsx @@ -13,14 +13,15 @@ import { SpeedyLink } from "components/SpeedyLink"; import { ButtonSecondary, ButtonTertiary } from "components/Buttons"; import { UpgradeModal } from "../UpgradeModal"; import { LeafletPro } from "components/Icons/LeafletPro"; -import { useIsPro } from "src/hooks/useEntitlement"; +import { useIsPro, useCanSeePro } from "src/hooks/useEntitlement"; export const Actions = (props: { publication: string }) => { let isPro = useIsPro(); + let canSeePro = useCanSeePro(); return ( <> - {!isPro && } + {canSeePro && !isPro && } diff --git a/app/lish/[did]/[publication]/dashboard/PublicationAnalytics.tsx b/app/lish/[did]/[publication]/dashboard/PublicationAnalytics.tsx index c256a60e..0ea36d2e 100644 --- a/app/lish/[did]/[publication]/dashboard/PublicationAnalytics.tsx +++ b/app/lish/[did]/[publication]/dashboard/PublicationAnalytics.tsx @@ -7,7 +7,7 @@ import { useLocalizedDate } from "src/hooks/useLocalizedDate"; import type { DateRange } from "react-day-picker"; import { usePublicationData } from "./PublicationSWRProvider"; import { Combobox, ComboboxResult } from "components/Combobox"; -import { useIsPro } from "src/hooks/useEntitlement"; +import { useIsPro, useCanSeePro } from "src/hooks/useEntitlement"; import { callRPC } from "app/api/rpc/client"; import useSWR from "swr"; import { @@ -76,6 +76,7 @@ export const PublicationAnalytics = (props: { showPageBackground: boolean; }) => { let isPro = useIsPro(); + let canSeePro = useCanSeePro(); let { data: publication } = usePublicationData(); let [dateRange, setDateRange] = useState(() => { @@ -146,6 +147,8 @@ export const PublicationAnalytics = (props: { [analyticsData?.traffic, dateRange.from, dateRange.to], ); + if (!canSeePro) return null; + if (!isPro) return (
diff --git a/components/ActionBar/ProfileButton.tsx b/components/ActionBar/ProfileButton.tsx index a6da2387..58983d4e 100644 --- a/components/ActionBar/ProfileButton.tsx +++ b/components/ActionBar/ProfileButton.tsx @@ -12,7 +12,7 @@ import { ArrowRightTiny } from "components/Icons/ArrowRightTiny"; import { Modal } from "components/Modal"; import { UpgradeContent } from "app/lish/[did]/[publication]/UpgradeModal"; import { ManageProSubscription } from "app/lish/[did]/[publication]/dashboard/settings/ManageProSubscription"; -import { useIsPro } from "src/hooks/useEntitlement"; +import { useIsPro, useCanSeePro } from "src/hooks/useEntitlement"; import { useState } from "react"; export const ProfileButton = () => { @@ -21,6 +21,7 @@ export const ProfileButton = () => { let isMobile = useIsMobile(); let [state, setState] = useState<"menu" | "manage-subscription">("menu"); let isPro = useIsPro(); + let canSeePro = useCanSeePro(); return ( {
)} - {!isPro ? ( - - Get Leaflet Pro + {canSeePro && ( + <> + {!isPro ? ( + + Get Leaflet Pro + +
+ } + > + + + ) : ( + - )} + + )} -
+
+ + )}