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 };
});