@startsimpli/billing 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +194 -0
- package/dist/index.d.ts +194 -0
- package/dist/index.js +961 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +946 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/index.d.mts +98 -0
- package/dist/types/index.d.ts +98 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +37 -12
- package/src/components/ManageSubscription.test.tsx +0 -1
- package/src/components/PricingDetailPage.integration.test.tsx +0 -1
- package/src/components/PricingDetailPage.test.tsx +0 -1
- package/src/components/PricingPage.test.tsx +0 -1
- package/src/components/PricingSection.test.tsx +0 -1
- package/src/components/SubscriptionManager.test.tsx +33 -1
- package/src/components/SubscriptionManager.tsx +6 -4
- package/src/components/UpgradeModal.test.tsx +0 -1
- package/src/hooks/BillingProvider.test.tsx +12 -63
- package/src/hooks/BillingProvider.tsx +13 -3
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useCheckout.test.tsx +6 -7
- package/src/hooks/usePortal.test.tsx +2 -3
- package/src/hooks/useSubscription.test.tsx +2 -3
- package/src/hooks/useSuccessSync.ts +48 -0
- package/src/index.ts +4 -1
- package/src/server/index.ts +2 -2
- package/src/server/proxy.ts +60 -1
- package/src/types/index.ts +36 -7
- package/src/utils/api.test.ts +13 -14
- package/src/utils/api.ts +28 -13
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { BillingConfig, BillingProduct, CheckoutResult, FreeSubscriptionResult, PortalResult, CachedSubscriptionState, SubscriptionInfo, ProductOffer } from './types/index.mjs';
|
|
4
|
+
export { OfferFeature, PaymentMethod } from './types/index.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* API client for billing endpoints.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare class BillingApiClient {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: BillingConfig);
|
|
13
|
+
private get fetcher();
|
|
14
|
+
private get headers();
|
|
15
|
+
/** Fetch a public billing product by slug. */
|
|
16
|
+
getProduct(slug: string): Promise<BillingProduct>;
|
|
17
|
+
/** Create a checkout session for an offer. */
|
|
18
|
+
createCheckout(params: {
|
|
19
|
+
offerId: string;
|
|
20
|
+
successUrl: string;
|
|
21
|
+
cancelUrl: string;
|
|
22
|
+
quantity?: number;
|
|
23
|
+
}): Promise<CheckoutResult>;
|
|
24
|
+
/** Subscribe to a free offer (no billing provider). */
|
|
25
|
+
subscribeFree(offerId: string): Promise<FreeSubscriptionResult>;
|
|
26
|
+
/** Create a customer portal session. */
|
|
27
|
+
createPortal(returnUrl: string): Promise<PortalResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Eagerly sync subscription state after Stripe checkout redirect.
|
|
30
|
+
* Call this from your success_url page to avoid waiting for the webhook.
|
|
31
|
+
*/
|
|
32
|
+
successSync(): Promise<CachedSubscriptionState | null>;
|
|
33
|
+
/** Get current user's subscription. */
|
|
34
|
+
getSubscription(): Promise<SubscriptionInfo | null>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface BillingContextValue {
|
|
38
|
+
client: BillingApiClient;
|
|
39
|
+
config: BillingConfig;
|
|
40
|
+
}
|
|
41
|
+
interface BillingProviderProps extends BillingConfig {
|
|
42
|
+
children: React.ReactNode;
|
|
43
|
+
}
|
|
44
|
+
declare function BillingProvider({ children, ...config }: BillingProviderProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
declare function useBillingContext(): BillingContextValue;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* useProduct — Fetch a BillingProduct by slug.
|
|
49
|
+
*
|
|
50
|
+
* Usage:
|
|
51
|
+
* const { product, loading, error } = useProduct("raise-simpli");
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
interface UseProductResult {
|
|
55
|
+
product: BillingProduct | null;
|
|
56
|
+
loading: boolean;
|
|
57
|
+
error: Error | null;
|
|
58
|
+
refetch: () => void;
|
|
59
|
+
}
|
|
60
|
+
declare function useProduct(slug: string): UseProductResult;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* useCheckout — Create a checkout session and redirect, or subscribe to a free offer.
|
|
64
|
+
*
|
|
65
|
+
* Usage:
|
|
66
|
+
* const { checkout, subscribeFree, loading, error } = useCheckout();
|
|
67
|
+
* // For paid offers:
|
|
68
|
+
* await checkout({ offerId, successUrl, cancelUrl });
|
|
69
|
+
* // For free offers:
|
|
70
|
+
* await subscribeFree(offerId);
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
interface UseCheckoutResult {
|
|
74
|
+
checkout: (params: {
|
|
75
|
+
offerId: string;
|
|
76
|
+
successUrl: string;
|
|
77
|
+
cancelUrl: string;
|
|
78
|
+
quantity?: number;
|
|
79
|
+
}) => Promise<CheckoutResult>;
|
|
80
|
+
subscribeFree: (offerId: string) => Promise<FreeSubscriptionResult>;
|
|
81
|
+
loading: boolean;
|
|
82
|
+
error: Error | null;
|
|
83
|
+
}
|
|
84
|
+
declare function useCheckout(): UseCheckoutResult;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* usePortal — Create a customer portal session and redirect.
|
|
88
|
+
*
|
|
89
|
+
* Usage:
|
|
90
|
+
* const { openPortal, loading, error } = usePortal();
|
|
91
|
+
* await openPortal("https://app.example.com/settings");
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
interface UsePortalResult {
|
|
95
|
+
openPortal: (returnUrl: string) => Promise<PortalResult>;
|
|
96
|
+
loading: boolean;
|
|
97
|
+
error: Error | null;
|
|
98
|
+
}
|
|
99
|
+
declare function usePortal(): UsePortalResult;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* useSubscription — Fetch current user's active subscription.
|
|
103
|
+
*/
|
|
104
|
+
|
|
105
|
+
interface UseSubscriptionResult {
|
|
106
|
+
subscription: SubscriptionInfo | null;
|
|
107
|
+
loading: boolean;
|
|
108
|
+
error: Error | null;
|
|
109
|
+
refetch: () => void;
|
|
110
|
+
}
|
|
111
|
+
declare function useSubscription(): UseSubscriptionResult;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* useSuccessSync — Eagerly sync subscription state after Stripe checkout.
|
|
115
|
+
*
|
|
116
|
+
* Call this from your checkout success page. It POSTs to the success-sync
|
|
117
|
+
* endpoint which fetches the latest subscription from Stripe and populates
|
|
118
|
+
* the Redis cache + DB, so the UI can show subscription status immediately
|
|
119
|
+
* instead of waiting for the webhook.
|
|
120
|
+
*
|
|
121
|
+
* Usage:
|
|
122
|
+
* const { sync, data, loading, error } = useSuccessSync();
|
|
123
|
+
* useEffect(() => { sync(); }, [sync]);
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
interface UseSuccessSyncResult {
|
|
127
|
+
sync: () => Promise<CachedSubscriptionState | null>;
|
|
128
|
+
data: CachedSubscriptionState | null;
|
|
129
|
+
loading: boolean;
|
|
130
|
+
error: Error | null;
|
|
131
|
+
}
|
|
132
|
+
declare function useSuccessSync(): UseSuccessSyncResult;
|
|
133
|
+
|
|
134
|
+
interface PricingPageProps {
|
|
135
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
136
|
+
productId: string;
|
|
137
|
+
/** Called when user clicks an offer's CTA button */
|
|
138
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
139
|
+
}
|
|
140
|
+
declare function PricingPage({ productId, onSelectOffer }: PricingPageProps): react_jsx_runtime.JSX.Element;
|
|
141
|
+
|
|
142
|
+
interface PricingSectionProps {
|
|
143
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
144
|
+
productId: string;
|
|
145
|
+
/** Called when user clicks an offer's CTA button */
|
|
146
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
147
|
+
/** Maximum number of features to display per card (default 4) */
|
|
148
|
+
maxFeatures?: number;
|
|
149
|
+
}
|
|
150
|
+
declare function PricingSection({ productId, onSelectOffer, maxFeatures, }: PricingSectionProps): react_jsx_runtime.JSX.Element;
|
|
151
|
+
|
|
152
|
+
interface UpgradeModalProps {
|
|
153
|
+
productId: string;
|
|
154
|
+
open: boolean;
|
|
155
|
+
onClose: () => void;
|
|
156
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
157
|
+
}
|
|
158
|
+
declare function UpgradeModal({ productId, open, onClose, onSelectOffer, }: UpgradeModalProps): react_jsx_runtime.JSX.Element | null;
|
|
159
|
+
|
|
160
|
+
interface PricingDetailPageProps {
|
|
161
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
162
|
+
productId: string;
|
|
163
|
+
/** Called when user clicks an offer's CTA button */
|
|
164
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
165
|
+
/** Whether to show the feature comparison table (defaults to true) */
|
|
166
|
+
showComparison?: boolean;
|
|
167
|
+
}
|
|
168
|
+
declare function PricingDetailPage({ productId, onSelectOffer, showComparison, }: PricingDetailPageProps): react_jsx_runtime.JSX.Element;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* ManageSubscription — Button that opens the billing provider's customer portal.
|
|
172
|
+
*
|
|
173
|
+
* Usage:
|
|
174
|
+
* <ManageSubscription returnUrl="https://app.example.com/settings" />
|
|
175
|
+
*/
|
|
176
|
+
interface ManageSubscriptionProps {
|
|
177
|
+
returnUrl: string;
|
|
178
|
+
buttonText?: string;
|
|
179
|
+
}
|
|
180
|
+
declare function ManageSubscription({ returnUrl, buttonText, }: ManageSubscriptionProps): react_jsx_runtime.JSX.Element;
|
|
181
|
+
|
|
182
|
+
interface SubscriptionManagerProps {
|
|
183
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
184
|
+
productId: string;
|
|
185
|
+
/** URL to return to after portal session */
|
|
186
|
+
returnUrl: string;
|
|
187
|
+
/** Called when user clicks an available plan's CTA button */
|
|
188
|
+
onPlanChange?: (offer: ProductOffer) => void;
|
|
189
|
+
/** Optional status message to display (e.g., after checkout redirect) */
|
|
190
|
+
statusMessage?: "success" | "cancelled" | "activating" | null;
|
|
191
|
+
}
|
|
192
|
+
declare function SubscriptionManager({ productId, returnUrl, onPlanChange, statusMessage, }: SubscriptionManagerProps): react_jsx_runtime.JSX.Element;
|
|
193
|
+
|
|
194
|
+
export { BillingApiClient, BillingConfig, BillingProduct, BillingProvider, type BillingProviderProps, CachedSubscriptionState, CheckoutResult, FreeSubscriptionResult, ManageSubscription, type ManageSubscriptionProps, PortalResult, PricingDetailPage, type PricingDetailPageProps, PricingPage, type PricingPageProps, PricingSection, type PricingSectionProps, ProductOffer, SubscriptionInfo, SubscriptionManager, type SubscriptionManagerProps, UpgradeModal, type UpgradeModalProps, useBillingContext, useCheckout, usePortal, useProduct, useSubscription, useSuccessSync };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { BillingConfig, BillingProduct, CheckoutResult, FreeSubscriptionResult, PortalResult, CachedSubscriptionState, SubscriptionInfo, ProductOffer } from './types/index.js';
|
|
4
|
+
export { OfferFeature, PaymentMethod } from './types/index.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* API client for billing endpoints.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare class BillingApiClient {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(config: BillingConfig);
|
|
13
|
+
private get fetcher();
|
|
14
|
+
private get headers();
|
|
15
|
+
/** Fetch a public billing product by slug. */
|
|
16
|
+
getProduct(slug: string): Promise<BillingProduct>;
|
|
17
|
+
/** Create a checkout session for an offer. */
|
|
18
|
+
createCheckout(params: {
|
|
19
|
+
offerId: string;
|
|
20
|
+
successUrl: string;
|
|
21
|
+
cancelUrl: string;
|
|
22
|
+
quantity?: number;
|
|
23
|
+
}): Promise<CheckoutResult>;
|
|
24
|
+
/** Subscribe to a free offer (no billing provider). */
|
|
25
|
+
subscribeFree(offerId: string): Promise<FreeSubscriptionResult>;
|
|
26
|
+
/** Create a customer portal session. */
|
|
27
|
+
createPortal(returnUrl: string): Promise<PortalResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Eagerly sync subscription state after Stripe checkout redirect.
|
|
30
|
+
* Call this from your success_url page to avoid waiting for the webhook.
|
|
31
|
+
*/
|
|
32
|
+
successSync(): Promise<CachedSubscriptionState | null>;
|
|
33
|
+
/** Get current user's subscription. */
|
|
34
|
+
getSubscription(): Promise<SubscriptionInfo | null>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface BillingContextValue {
|
|
38
|
+
client: BillingApiClient;
|
|
39
|
+
config: BillingConfig;
|
|
40
|
+
}
|
|
41
|
+
interface BillingProviderProps extends BillingConfig {
|
|
42
|
+
children: React.ReactNode;
|
|
43
|
+
}
|
|
44
|
+
declare function BillingProvider({ children, ...config }: BillingProviderProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
declare function useBillingContext(): BillingContextValue;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* useProduct — Fetch a BillingProduct by slug.
|
|
49
|
+
*
|
|
50
|
+
* Usage:
|
|
51
|
+
* const { product, loading, error } = useProduct("raise-simpli");
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
interface UseProductResult {
|
|
55
|
+
product: BillingProduct | null;
|
|
56
|
+
loading: boolean;
|
|
57
|
+
error: Error | null;
|
|
58
|
+
refetch: () => void;
|
|
59
|
+
}
|
|
60
|
+
declare function useProduct(slug: string): UseProductResult;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* useCheckout — Create a checkout session and redirect, or subscribe to a free offer.
|
|
64
|
+
*
|
|
65
|
+
* Usage:
|
|
66
|
+
* const { checkout, subscribeFree, loading, error } = useCheckout();
|
|
67
|
+
* // For paid offers:
|
|
68
|
+
* await checkout({ offerId, successUrl, cancelUrl });
|
|
69
|
+
* // For free offers:
|
|
70
|
+
* await subscribeFree(offerId);
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
interface UseCheckoutResult {
|
|
74
|
+
checkout: (params: {
|
|
75
|
+
offerId: string;
|
|
76
|
+
successUrl: string;
|
|
77
|
+
cancelUrl: string;
|
|
78
|
+
quantity?: number;
|
|
79
|
+
}) => Promise<CheckoutResult>;
|
|
80
|
+
subscribeFree: (offerId: string) => Promise<FreeSubscriptionResult>;
|
|
81
|
+
loading: boolean;
|
|
82
|
+
error: Error | null;
|
|
83
|
+
}
|
|
84
|
+
declare function useCheckout(): UseCheckoutResult;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* usePortal — Create a customer portal session and redirect.
|
|
88
|
+
*
|
|
89
|
+
* Usage:
|
|
90
|
+
* const { openPortal, loading, error } = usePortal();
|
|
91
|
+
* await openPortal("https://app.example.com/settings");
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
interface UsePortalResult {
|
|
95
|
+
openPortal: (returnUrl: string) => Promise<PortalResult>;
|
|
96
|
+
loading: boolean;
|
|
97
|
+
error: Error | null;
|
|
98
|
+
}
|
|
99
|
+
declare function usePortal(): UsePortalResult;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* useSubscription — Fetch current user's active subscription.
|
|
103
|
+
*/
|
|
104
|
+
|
|
105
|
+
interface UseSubscriptionResult {
|
|
106
|
+
subscription: SubscriptionInfo | null;
|
|
107
|
+
loading: boolean;
|
|
108
|
+
error: Error | null;
|
|
109
|
+
refetch: () => void;
|
|
110
|
+
}
|
|
111
|
+
declare function useSubscription(): UseSubscriptionResult;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* useSuccessSync — Eagerly sync subscription state after Stripe checkout.
|
|
115
|
+
*
|
|
116
|
+
* Call this from your checkout success page. It POSTs to the success-sync
|
|
117
|
+
* endpoint which fetches the latest subscription from Stripe and populates
|
|
118
|
+
* the Redis cache + DB, so the UI can show subscription status immediately
|
|
119
|
+
* instead of waiting for the webhook.
|
|
120
|
+
*
|
|
121
|
+
* Usage:
|
|
122
|
+
* const { sync, data, loading, error } = useSuccessSync();
|
|
123
|
+
* useEffect(() => { sync(); }, [sync]);
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
interface UseSuccessSyncResult {
|
|
127
|
+
sync: () => Promise<CachedSubscriptionState | null>;
|
|
128
|
+
data: CachedSubscriptionState | null;
|
|
129
|
+
loading: boolean;
|
|
130
|
+
error: Error | null;
|
|
131
|
+
}
|
|
132
|
+
declare function useSuccessSync(): UseSuccessSyncResult;
|
|
133
|
+
|
|
134
|
+
interface PricingPageProps {
|
|
135
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
136
|
+
productId: string;
|
|
137
|
+
/** Called when user clicks an offer's CTA button */
|
|
138
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
139
|
+
}
|
|
140
|
+
declare function PricingPage({ productId, onSelectOffer }: PricingPageProps): react_jsx_runtime.JSX.Element;
|
|
141
|
+
|
|
142
|
+
interface PricingSectionProps {
|
|
143
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
144
|
+
productId: string;
|
|
145
|
+
/** Called when user clicks an offer's CTA button */
|
|
146
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
147
|
+
/** Maximum number of features to display per card (default 4) */
|
|
148
|
+
maxFeatures?: number;
|
|
149
|
+
}
|
|
150
|
+
declare function PricingSection({ productId, onSelectOffer, maxFeatures, }: PricingSectionProps): react_jsx_runtime.JSX.Element;
|
|
151
|
+
|
|
152
|
+
interface UpgradeModalProps {
|
|
153
|
+
productId: string;
|
|
154
|
+
open: boolean;
|
|
155
|
+
onClose: () => void;
|
|
156
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
157
|
+
}
|
|
158
|
+
declare function UpgradeModal({ productId, open, onClose, onSelectOffer, }: UpgradeModalProps): react_jsx_runtime.JSX.Element | null;
|
|
159
|
+
|
|
160
|
+
interface PricingDetailPageProps {
|
|
161
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
162
|
+
productId: string;
|
|
163
|
+
/** Called when user clicks an offer's CTA button */
|
|
164
|
+
onSelectOffer?: (offer: ProductOffer) => void;
|
|
165
|
+
/** Whether to show the feature comparison table (defaults to true) */
|
|
166
|
+
showComparison?: boolean;
|
|
167
|
+
}
|
|
168
|
+
declare function PricingDetailPage({ productId, onSelectOffer, showComparison, }: PricingDetailPageProps): react_jsx_runtime.JSX.Element;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* ManageSubscription — Button that opens the billing provider's customer portal.
|
|
172
|
+
*
|
|
173
|
+
* Usage:
|
|
174
|
+
* <ManageSubscription returnUrl="https://app.example.com/settings" />
|
|
175
|
+
*/
|
|
176
|
+
interface ManageSubscriptionProps {
|
|
177
|
+
returnUrl: string;
|
|
178
|
+
buttonText?: string;
|
|
179
|
+
}
|
|
180
|
+
declare function ManageSubscription({ returnUrl, buttonText, }: ManageSubscriptionProps): react_jsx_runtime.JSX.Element;
|
|
181
|
+
|
|
182
|
+
interface SubscriptionManagerProps {
|
|
183
|
+
/** Product slug (e.g., "raise-simpli") */
|
|
184
|
+
productId: string;
|
|
185
|
+
/** URL to return to after portal session */
|
|
186
|
+
returnUrl: string;
|
|
187
|
+
/** Called when user clicks an available plan's CTA button */
|
|
188
|
+
onPlanChange?: (offer: ProductOffer) => void;
|
|
189
|
+
/** Optional status message to display (e.g., after checkout redirect) */
|
|
190
|
+
statusMessage?: "success" | "cancelled" | "activating" | null;
|
|
191
|
+
}
|
|
192
|
+
declare function SubscriptionManager({ productId, returnUrl, onPlanChange, statusMessage, }: SubscriptionManagerProps): react_jsx_runtime.JSX.Element;
|
|
193
|
+
|
|
194
|
+
export { BillingApiClient, BillingConfig, BillingProduct, BillingProvider, type BillingProviderProps, CachedSubscriptionState, CheckoutResult, FreeSubscriptionResult, ManageSubscription, type ManageSubscriptionProps, PortalResult, PricingDetailPage, type PricingDetailPageProps, PricingPage, type PricingPageProps, PricingSection, type PricingSectionProps, ProductOffer, SubscriptionInfo, SubscriptionManager, type SubscriptionManagerProps, UpgradeModal, type UpgradeModalProps, useBillingContext, useCheckout, usePortal, useProduct, useSubscription, useSuccessSync };
|