Purchase flow: name -> placeholder -> configure via the shipped PlanConfigurator -> Paddle overlay with custom_data -> paste install UUID to link and issue. lineItemsFor mirrors the Go catalogue.LineItems/billable exactly (base included in exactly one place). ManageBillingButton opens the hosted portal. Paddle token and env are baked into the build, never fetched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
18 lines
662 B
TypeScript
18 lines
662 B
TypeScript
import { initializePaddle, type Paddle } from "@paddle/paddle-js";
|
|
|
|
let cached: Promise<Paddle | undefined> | null = null;
|
|
|
|
/* One Paddle instance for the app. The token and environment are baked into the
|
|
* build (NEXT_PUBLIC_*), never fetched, so a production build can never load a
|
|
* sandbox token by accident. */
|
|
export function initPaddle(): Promise<Paddle | undefined> {
|
|
if (!cached) {
|
|
cached = initializePaddle({
|
|
environment:
|
|
(process.env.NEXT_PUBLIC_PADDLE_ENV as "sandbox" | "production") ?? "sandbox",
|
|
token: process.env.NEXT_PUBLIC_PADDLE_CLIENT_TOKEN ?? "",
|
|
});
|
|
}
|
|
return cached;
|
|
}
|