React Component — @cron/react
Drop-in subscribe button for any React app.
Install
bash
npm install @cron/react @cron/sdk wagmi viem @rainbow-me/rainbowkitSetup
CronButton uses wagmi for wallet interaction. Wrap your app with wagmi and RainbowKit providers before rendering the button.
tsx
// app/providers.tsx
"use client";
import { WagmiProvider } from "wagmi";
import { RainbowKitProvider } from "@rainbow-me/rainbowkit";
import { QueryClientProvider, QueryClient } from "@tanstack/react-query";
import { getDefaultConfig } from "@rainbow-me/rainbowkit";
import { base, baseSepolia } from "wagmi/chains";
const config = getDefaultConfig({
appName: "Your App",
projectId: process.env.NEXT_PUBLIC_WC_PROJECT_ID!,
chains: [base, baseSepolia],
ssr: true,
});
const queryClient = new QueryClient();
export function Providers({ children }: { children: React.ReactNode }) {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<RainbowKitProvider>{children}</RainbowKitProvider>
</QueryClientProvider>
</WagmiProvider>
);
}Basic usage
tsx
import { CronButton } from "@cron/react";
export function PricingCard({ planId }: { planId: bigint }) {
return (
<div>
<h2>Pro Plan — $9.99/mo</h2>
<CronButton
planId={planId}
chain="base"
onSuccess={(result) => {
console.log("Subscribed!", result.subscription.subscriber);
grantAccess(result.subscription.subscriber);
}}
onCancel={() => {
revokeAccess();
}}
/>
</div>
);
}Props
| Prop | Type | Required | Description |
|---|---|---|---|
planId | bigint | Yes | On-chain plan ID to subscribe to |
chain | string | Yes | "base", "baseSepolia", "arbitrum", "arbitrumSepolia" |
mintNFT | boolean | No | Mint a CronNFT identity token. Default: false |
theme | "dark" | "light" | No | Button color theme. Default: "dark" |
onSuccess | function | No | Called after successful subscription |
onCancel | function | No | Called if user cancels the flow |
onError | function | No | Called on error with an Error object |
Flow states
The button manages its own state machine:
- idle — shows “Subscribe”
- connecting — wallet connection in progress
- approving — token approval transaction pending
- subscribing — subscribe transaction pending
- subscribed — success state,
onSuccesscalled - error — shows error message,
onErrorcalled
[*] Custom UI
To build a fully custom subscription UI, use the SDK directly (
cron.subscriptions.subscribe()) instead of CronButton. The button is a convenience wrapper.onSuccess payload
typescript
interface SubscribeResult {
txHash: string;
subscription: {
planId: bigint;
subscriber: string; // wallet address
startedAt: number; // unix timestamp
nftTokenId?: bigint; // if mintNFT was true
};
}