import { createServerFn } from "@tanstack/react-start"; import { viewerMiddleware, requireViewer } from "./middleware"; import { limitWrite } from "~/server/limits"; import { stripeEnabled } from "~/server/billing/config"; import { dismissNudge, isSupporter, shouldNudge } from "~/server/supporter"; import { plans } from "~/server/metering/quota"; import { PRO_PRICE_CENTS } from "~/lib/pricing"; /** Everything the /pro page needs: what each plan includes, the price, and where the viewer stands. */ export const getProPitch = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .handler(async ({ context }) => { const all = plans(); const viewer = context.viewer; return { billingEnabled: stripeEnabled(), priceCents: PRO_PRICE_CENTS, free: all.free.included, pro: all.pro.included, signedIn: viewer !== null, supporter: viewer ? await isSupporter(viewer.id) : false, nudge: viewer ? await shouldNudge(viewer.id) : false, }; }); export const getProNudge = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .handler(async ({ context }) => ({ show: context.viewer ? await shouldNudge(context.viewer.id) : false })); /** "Not now": hides the nudge for about six months. */ export const dismissProNudge = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .handler(async ({ context }) => { const viewer = requireViewer(context.viewer); await limitWrite(viewer); await dismissNudge(viewer.id); return { ok: true }; });