39 lines · 1.5 KB
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 };
  });