@stripe-sdk/core 1.0.0 → 1.0.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/README.md +88 -261
- package/dist/client/index.d.mts +0 -4
- package/dist/client/index.d.ts +0 -4
- package/dist/client/index.js +70 -11
- package/dist/client/index.mjs +71 -12
- package/dist/{index-D8rM_YD4.d.mts → index-BKDJf1Hz.d.mts} +1 -27
- package/dist/{index-D8rM_YD4.d.ts → index-BKDJf1Hz.d.ts} +1 -27
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +601 -231
- package/dist/index.mjs +602 -232
- package/dist/next/index.d.mts +55 -32
- package/dist/next/index.d.ts +55 -32
- package/dist/next/index.js +362 -143
- package/dist/next/index.mjs +362 -143
- package/dist/server/index.d.mts +61 -21
- package/dist/server/index.d.ts +61 -21
- package/dist/server/index.js +546 -237
- package/dist/server/index.mjs +546 -237
- package/dist/server/webhooks/index.d.mts +1 -1
- package/dist/server/webhooks/index.d.ts +1 -1
- package/dist/server/webhooks/index.js +19 -7
- package/dist/server/webhooks/index.mjs +19 -7
- package/package.json +8 -5
- package/dist/client/index.js.map +0 -1
- package/dist/client/index.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/next/index.js.map +0 -1
- package/dist/next/index.mjs.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/index.mjs.map +0 -1
- package/dist/server/webhooks/index.js.map +0 -1
- package/dist/server/webhooks/index.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'stripe';
|
|
2
|
-
export { E as WebhookConfig, A as createNextWebhookHandler, B as createPagesWebhookHandler, D as createWebhookHandler } from '../../index-
|
|
2
|
+
export { E as WebhookConfig, A as createNextWebhookHandler, B as createPagesWebhookHandler, D as createWebhookHandler } from '../../index-BKDJf1Hz.mjs';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import 'stripe';
|
|
2
|
-
export { E as WebhookConfig, A as createNextWebhookHandler, B as createPagesWebhookHandler, D as createWebhookHandler } from '../../index-
|
|
2
|
+
export { E as WebhookConfig, A as createNextWebhookHandler, B as createPagesWebhookHandler, D as createWebhookHandler } from '../../index-BKDJf1Hz.js';
|
|
@@ -59,6 +59,9 @@ function createWebhookHandler(config) {
|
|
|
59
59
|
function createNextWebhookHandler(config) {
|
|
60
60
|
const handler = createWebhookHandler(config);
|
|
61
61
|
return async function POST(request) {
|
|
62
|
+
if (request.method !== "POST") {
|
|
63
|
+
return new Response(null, { status: 405 });
|
|
64
|
+
}
|
|
62
65
|
try {
|
|
63
66
|
const contentLength = request.headers.get("content-length");
|
|
64
67
|
if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {
|
|
@@ -68,6 +71,12 @@ function createNextWebhookHandler(config) {
|
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
const body = await request.text();
|
|
74
|
+
if (body.length > MAX_BODY_SIZE) {
|
|
75
|
+
return new Response(JSON.stringify({ error: "Webhook body too large" }), {
|
|
76
|
+
status: 413,
|
|
77
|
+
headers: { "Content-Type": "application/json" }
|
|
78
|
+
});
|
|
79
|
+
}
|
|
71
80
|
const signature = request.headers.get("stripe-signature");
|
|
72
81
|
if (!signature) {
|
|
73
82
|
return new Response(JSON.stringify({ error: "Missing stripe-signature header" }), {
|
|
@@ -81,8 +90,8 @@ function createNextWebhookHandler(config) {
|
|
|
81
90
|
headers: { "Content-Type": "application/json" }
|
|
82
91
|
});
|
|
83
92
|
} catch (error) {
|
|
84
|
-
|
|
85
|
-
return new Response(JSON.stringify({ error:
|
|
93
|
+
console.error("[@stripe-sdk/core] Webhook error:", error instanceof Error ? error.message : "Unknown error");
|
|
94
|
+
return new Response(JSON.stringify({ error: "Webhook processing failed" }), {
|
|
86
95
|
status: 400,
|
|
87
96
|
headers: { "Content-Type": "application/json" }
|
|
88
97
|
});
|
|
@@ -106,8 +115,8 @@ function createPagesWebhookHandler(webhookConfig) {
|
|
|
106
115
|
const result = await handler(body, signature);
|
|
107
116
|
res.status(200).json(result);
|
|
108
117
|
} catch (error) {
|
|
109
|
-
|
|
110
|
-
res.status(400).json({ error:
|
|
118
|
+
console.error("[@stripe-sdk/core] Webhook error:", error instanceof Error ? error.message : "Unknown error");
|
|
119
|
+
res.status(400).json({ error: "Webhook processing failed" });
|
|
111
120
|
}
|
|
112
121
|
};
|
|
113
122
|
}
|
|
@@ -135,16 +144,21 @@ function getRawBody(req) {
|
|
|
135
144
|
}
|
|
136
145
|
const chunks = [];
|
|
137
146
|
let totalLength = 0;
|
|
147
|
+
let rejected = false;
|
|
138
148
|
req.on("data", (chunk) => {
|
|
149
|
+
if (rejected) return;
|
|
139
150
|
const buf = Buffer.from(chunk);
|
|
140
151
|
totalLength += buf.length;
|
|
141
152
|
if (totalLength > MAX_BODY_SIZE) {
|
|
153
|
+
rejected = true;
|
|
142
154
|
reject(new Error("Webhook body too large"));
|
|
143
155
|
return;
|
|
144
156
|
}
|
|
145
157
|
chunks.push(buf);
|
|
146
158
|
});
|
|
147
|
-
req.on("end", () =>
|
|
159
|
+
req.on("end", () => {
|
|
160
|
+
if (!rejected) resolve(Buffer.concat(chunks).toString("utf8"));
|
|
161
|
+
});
|
|
148
162
|
req.on("error", reject);
|
|
149
163
|
});
|
|
150
164
|
}
|
|
@@ -152,5 +166,3 @@ function getRawBody(req) {
|
|
|
152
166
|
exports.createNextWebhookHandler = createNextWebhookHandler;
|
|
153
167
|
exports.createPagesWebhookHandler = createPagesWebhookHandler;
|
|
154
168
|
exports.createWebhookHandler = createWebhookHandler;
|
|
155
|
-
//# sourceMappingURL=index.js.map
|
|
156
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -57,6 +57,9 @@ function createWebhookHandler(config) {
|
|
|
57
57
|
function createNextWebhookHandler(config) {
|
|
58
58
|
const handler = createWebhookHandler(config);
|
|
59
59
|
return async function POST(request) {
|
|
60
|
+
if (request.method !== "POST") {
|
|
61
|
+
return new Response(null, { status: 405 });
|
|
62
|
+
}
|
|
60
63
|
try {
|
|
61
64
|
const contentLength = request.headers.get("content-length");
|
|
62
65
|
if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {
|
|
@@ -66,6 +69,12 @@ function createNextWebhookHandler(config) {
|
|
|
66
69
|
});
|
|
67
70
|
}
|
|
68
71
|
const body = await request.text();
|
|
72
|
+
if (body.length > MAX_BODY_SIZE) {
|
|
73
|
+
return new Response(JSON.stringify({ error: "Webhook body too large" }), {
|
|
74
|
+
status: 413,
|
|
75
|
+
headers: { "Content-Type": "application/json" }
|
|
76
|
+
});
|
|
77
|
+
}
|
|
69
78
|
const signature = request.headers.get("stripe-signature");
|
|
70
79
|
if (!signature) {
|
|
71
80
|
return new Response(JSON.stringify({ error: "Missing stripe-signature header" }), {
|
|
@@ -79,8 +88,8 @@ function createNextWebhookHandler(config) {
|
|
|
79
88
|
headers: { "Content-Type": "application/json" }
|
|
80
89
|
});
|
|
81
90
|
} catch (error) {
|
|
82
|
-
|
|
83
|
-
return new Response(JSON.stringify({ error:
|
|
91
|
+
console.error("[@stripe-sdk/core] Webhook error:", error instanceof Error ? error.message : "Unknown error");
|
|
92
|
+
return new Response(JSON.stringify({ error: "Webhook processing failed" }), {
|
|
84
93
|
status: 400,
|
|
85
94
|
headers: { "Content-Type": "application/json" }
|
|
86
95
|
});
|
|
@@ -104,8 +113,8 @@ function createPagesWebhookHandler(webhookConfig) {
|
|
|
104
113
|
const result = await handler(body, signature);
|
|
105
114
|
res.status(200).json(result);
|
|
106
115
|
} catch (error) {
|
|
107
|
-
|
|
108
|
-
res.status(400).json({ error:
|
|
116
|
+
console.error("[@stripe-sdk/core] Webhook error:", error instanceof Error ? error.message : "Unknown error");
|
|
117
|
+
res.status(400).json({ error: "Webhook processing failed" });
|
|
109
118
|
}
|
|
110
119
|
};
|
|
111
120
|
}
|
|
@@ -133,20 +142,23 @@ function getRawBody(req) {
|
|
|
133
142
|
}
|
|
134
143
|
const chunks = [];
|
|
135
144
|
let totalLength = 0;
|
|
145
|
+
let rejected = false;
|
|
136
146
|
req.on("data", (chunk) => {
|
|
147
|
+
if (rejected) return;
|
|
137
148
|
const buf = Buffer.from(chunk);
|
|
138
149
|
totalLength += buf.length;
|
|
139
150
|
if (totalLength > MAX_BODY_SIZE) {
|
|
151
|
+
rejected = true;
|
|
140
152
|
reject(new Error("Webhook body too large"));
|
|
141
153
|
return;
|
|
142
154
|
}
|
|
143
155
|
chunks.push(buf);
|
|
144
156
|
});
|
|
145
|
-
req.on("end", () =>
|
|
157
|
+
req.on("end", () => {
|
|
158
|
+
if (!rejected) resolve(Buffer.concat(chunks).toString("utf8"));
|
|
159
|
+
});
|
|
146
160
|
req.on("error", reject);
|
|
147
161
|
});
|
|
148
162
|
}
|
|
149
163
|
|
|
150
164
|
export { createNextWebhookHandler, createPagesWebhookHandler, createWebhookHandler };
|
|
151
|
-
//# sourceMappingURL=index.mjs.map
|
|
152
|
-
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stripe-sdk/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "SDK Stripe clé en main - Paiements, Abonnements, Facturation, Webhooks et plus. Compatible React, Next.js, Vue, Angular.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -47,12 +47,12 @@
|
|
|
47
47
|
"clean": "rm -rf dist"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@stripe/react-stripe-js": ">=2.
|
|
51
|
-
"@stripe/stripe-js": ">=
|
|
50
|
+
"@stripe/react-stripe-js": ">=2.9.0",
|
|
51
|
+
"@stripe/stripe-js": ">=4.0.0",
|
|
52
52
|
"next": ">=13.0.0",
|
|
53
53
|
"react": ">=18.0.0",
|
|
54
54
|
"react-dom": ">=18.0.0",
|
|
55
|
-
"stripe": ">=
|
|
55
|
+
"stripe": ">=17.0.0"
|
|
56
56
|
},
|
|
57
57
|
"peerDependenciesMeta": {
|
|
58
58
|
"next": {
|
|
@@ -101,9 +101,12 @@
|
|
|
101
101
|
"vue",
|
|
102
102
|
"angular"
|
|
103
103
|
],
|
|
104
|
+
"engines": {
|
|
105
|
+
"node": ">=18.0.0"
|
|
106
|
+
},
|
|
104
107
|
"license": "MIT",
|
|
105
108
|
"repository": {
|
|
106
109
|
"type": "git",
|
|
107
|
-
"url": ""
|
|
110
|
+
"url": "https://github.com/nicolashedoire/sdk-stripe.git"
|
|
108
111
|
}
|
|
109
112
|
}
|
package/dist/client/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/providers/StripeProvider.tsx","../../src/client/hooks/usePayment.ts","../../src/client/hooks/useSetupIntent.ts","../../src/client/hooks/useCheckout.ts","../../src/client/components/CheckoutForm.tsx","../../src/client/components/SetupForm.tsx","../../src/client/components/PricingTable.tsx","../../src/client/components/SubscriptionManager.tsx"],"names":["createContext","useContext","useMemo","loadStripe","jsx","Elements","useStripe","useElements","useState","useCallback","jsxs","LinkAuthenticationElement","PaymentElement","defaultFormatPrice"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport { loadStripe } from '@stripe/stripe-js';\nimport { Elements } from '@stripe/react-stripe-js';\nimport type { Stripe, StripeElementsOptions } from '@stripe/stripe-js';\nimport type { ReactNode } from 'react';\n\ninterface StripeContextValue {\n publishableKey: string;\n}\n\nconst StripeContext = createContext<StripeContextValue | null>(null);\n\nexport function useStripeConfig(): StripeContextValue {\n const context = useContext(StripeContext);\n if (!context) {\n throw new Error('useStripeConfig must be used within a <StripeProvider>');\n }\n return context;\n}\n\nexport interface StripeProviderProps {\n publishableKey: string;\n children: ReactNode;\n options?: StripeElementsOptions;\n locale?: string;\n}\n\nexport function StripeProvider({\n publishableKey,\n children,\n options,\n locale,\n}: StripeProviderProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, locale ? { locale: locale as 'auto' } : undefined),\n [publishableKey, locale]\n );\n\n return (\n <StripeContext.Provider value={{ publishableKey }}>\n <Elements stripe={stripePromise} options={options}>\n {children}\n </Elements>\n </StripeContext.Provider>\n );\n}\n\n/**\n * Provider for embedding Stripe Elements with a client secret.\n * Use this to wrap payment forms after creating a PaymentIntent or SetupIntent.\n */\nexport interface StripeElementsProviderProps {\n publishableKey: string;\n clientSecret: string;\n children: ReactNode;\n appearance?: StripeElementsOptions['appearance'];\n locale?: string;\n loader?: 'auto' | 'always' | 'never';\n}\n\nexport function StripeElementsProvider({\n publishableKey,\n clientSecret,\n children,\n appearance,\n locale,\n loader = 'auto',\n}: StripeElementsProviderProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, locale ? { locale: locale as 'auto' } : undefined),\n [publishableKey, locale]\n );\n\n const options: StripeElementsOptions = useMemo(\n () => ({\n clientSecret,\n appearance,\n loader,\n }),\n [clientSecret, appearance, loader]\n );\n\n return (\n <StripeContext.Provider value={{ publishableKey }}>\n <Elements stripe={stripePromise} options={options}>\n {children}\n </Elements>\n </StripeContext.Provider>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { useStripe, useElements } from '@stripe/react-stripe-js';\n\ninterface PaymentState {\n isProcessing: boolean;\n isSuccess: boolean;\n error: string | null;\n paymentIntentId: string | null;\n}\n\ninterface UsePaymentOptions {\n onSuccess?: (paymentIntentId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n}\n\nexport function usePayment(options?: UsePaymentOptions) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [state, setState] = useState<PaymentState>({\n isProcessing: false,\n isSuccess: false,\n error: null,\n paymentIntentId: null,\n });\n\n const processPayment = useCallback(async (\n overrides?: { returnUrl?: string }\n ) => {\n if (!stripe || !elements) {\n setState((s) => ({ ...s, error: 'Stripe not loaded yet' }));\n return { success: false, error: 'Stripe not loaded yet' };\n }\n\n setState({ isProcessing: true, isSuccess: false, error: null, paymentIntentId: null });\n\n const { error, paymentIntent } = await stripe.confirmPayment({\n elements,\n confirmParams: {\n return_url: overrides?.returnUrl ?? options?.returnUrl ?? (typeof window !== 'undefined' ? window.location.href : ''),\n },\n redirect: 'if_required',\n });\n\n if (error) {\n const message = error.message ?? 'Payment failed';\n setState({ isProcessing: false, isSuccess: false, error: message, paymentIntentId: null });\n options?.onError?.(message);\n return { success: false, error: message };\n }\n\n if (paymentIntent?.status === 'succeeded') {\n setState({ isProcessing: false, isSuccess: true, error: null, paymentIntentId: paymentIntent.id });\n options?.onSuccess?.(paymentIntent.id);\n return { success: true, paymentIntentId: paymentIntent.id };\n }\n\n setState({ isProcessing: false, isSuccess: false, error: null, paymentIntentId: paymentIntent?.id ?? null });\n return { success: false, status: paymentIntent?.status };\n }, [stripe, elements, options]);\n\n const reset = useCallback(() => {\n setState({ isProcessing: false, isSuccess: false, error: null, paymentIntentId: null });\n }, []);\n\n return {\n ...state,\n processPayment,\n reset,\n isReady: !!stripe && !!elements,\n };\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { useStripe, useElements } from '@stripe/react-stripe-js';\n\ninterface SetupState {\n isProcessing: boolean;\n isSuccess: boolean;\n error: string | null;\n setupIntentId: string | null;\n paymentMethodId: string | null;\n}\n\ninterface UseSetupIntentOptions {\n onSuccess?: (setupIntentId: string, paymentMethodId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n}\n\nexport function useSetupIntent(options?: UseSetupIntentOptions) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [state, setState] = useState<SetupState>({\n isProcessing: false,\n isSuccess: false,\n error: null,\n setupIntentId: null,\n paymentMethodId: null,\n });\n\n const confirmSetup = useCallback(async (\n overrides?: { returnUrl?: string }\n ) => {\n if (!stripe || !elements) {\n setState((s) => ({ ...s, error: 'Stripe not loaded yet' }));\n return { success: false, error: 'Stripe not loaded yet' };\n }\n\n setState({ isProcessing: true, isSuccess: false, error: null, setupIntentId: null, paymentMethodId: null });\n\n const { error, setupIntent } = await stripe.confirmSetup({\n elements,\n confirmParams: {\n return_url: overrides?.returnUrl ?? options?.returnUrl ?? (typeof window !== 'undefined' ? window.location.href : ''),\n },\n redirect: 'if_required',\n });\n\n if (error) {\n const message = error.message ?? 'Setup failed';\n setState({ isProcessing: false, isSuccess: false, error: message, setupIntentId: null, paymentMethodId: null });\n options?.onError?.(message);\n return { success: false, error: message };\n }\n\n if (setupIntent?.status === 'succeeded') {\n const pmId = typeof setupIntent.payment_method === 'string'\n ? setupIntent.payment_method\n : setupIntent.payment_method?.id ?? null;\n setState({ isProcessing: false, isSuccess: true, error: null, setupIntentId: setupIntent.id, paymentMethodId: pmId });\n if (pmId) options?.onSuccess?.(setupIntent.id, pmId);\n return { success: true, setupIntentId: setupIntent.id, paymentMethodId: pmId };\n }\n\n setState({ isProcessing: false, isSuccess: false, error: null, setupIntentId: setupIntent?.id ?? null, paymentMethodId: null });\n return { success: false, status: setupIntent?.status };\n }, [stripe, elements, options]);\n\n const reset = useCallback(() => {\n setState({ isProcessing: false, isSuccess: false, error: null, setupIntentId: null, paymentMethodId: null });\n }, []);\n\n return {\n ...state,\n confirmSetup,\n reset,\n isReady: !!stripe && !!elements,\n };\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { loadStripe } from '@stripe/stripe-js';\n\ninterface CheckoutState {\n isLoading: boolean;\n error: string | null;\n}\n\ninterface UseCheckoutOptions {\n publishableKey: string;\n onError?: (error: string) => void;\n}\n\nexport function useCheckout(options: UseCheckoutOptions) {\n const [state, setState] = useState<CheckoutState>({\n isLoading: false,\n error: null,\n });\n\n /**\n * Redirect to a Stripe Checkout session.\n * Pass the sessionId returned from your server (createCheckoutSession).\n */\n const redirectToCheckout = useCallback(async (sessionId: string) => {\n setState({ isLoading: true, error: null });\n\n try {\n const stripe = await loadStripe(options.publishableKey);\n if (!stripe) {\n throw new Error('Failed to load Stripe');\n }\n\n const { error } = await stripe.redirectToCheckout({ sessionId });\n\n if (error) {\n const message = error.message ?? 'Redirect to checkout failed';\n setState({ isLoading: false, error: message });\n options.onError?.(message);\n return { success: false, error: message };\n }\n\n return { success: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n setState({ isLoading: false, error: message });\n options.onError?.(message);\n return { success: false, error: message };\n }\n }, [options]);\n\n /**\n * Open a Stripe Customer Portal session.\n * Pass the portal URL returned from your server (createPortalSession).\n */\n const redirectToPortal = useCallback((portalUrl: string) => {\n window.location.href = portalUrl;\n }, []);\n\n return {\n ...state,\n redirectToCheckout,\n redirectToPortal,\n };\n}\n","'use client';\n\nimport React from 'react';\nimport { PaymentElement, LinkAuthenticationElement } from '@stripe/react-stripe-js';\nimport { usePayment } from '../hooks/usePayment';\nimport type { ReactNode, FormEvent } from 'react';\n\nexport interface CheckoutFormProps {\n onSuccess?: (paymentIntentId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n submitLabel?: string;\n showEmail?: boolean;\n className?: string;\n buttonClassName?: string;\n errorClassName?: string;\n children?: ReactNode;\n layout?: 'tabs' | 'accordion' | 'auto';\n}\n\nexport function CheckoutForm({\n onSuccess,\n onError,\n returnUrl,\n submitLabel = 'Pay now',\n showEmail = false,\n className,\n buttonClassName,\n errorClassName,\n children,\n layout = 'tabs',\n}: CheckoutFormProps) {\n const { processPayment, isProcessing, isSuccess, error, isReady } = usePayment({\n onSuccess,\n onError,\n returnUrl,\n });\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n await processPayment();\n };\n\n if (isSuccess) {\n return (\n <div className={className}>\n {children ?? <p>Payment successful!</p>}\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className}>\n {showEmail && <LinkAuthenticationElement />}\n <PaymentElement options={{ layout }} />\n {error && <p className={errorClassName} role=\"alert\">{error}</p>}\n <button\n type=\"submit\"\n disabled={!isReady || isProcessing}\n className={buttonClassName}\n >\n {isProcessing ? 'Processing...' : submitLabel}\n </button>\n </form>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { PaymentElement } from '@stripe/react-stripe-js';\nimport { useSetupIntent } from '../hooks/useSetupIntent';\nimport type { ReactNode, FormEvent } from 'react';\n\nexport interface SetupFormProps {\n onSuccess?: (setupIntentId: string, paymentMethodId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n submitLabel?: string;\n className?: string;\n buttonClassName?: string;\n errorClassName?: string;\n successContent?: ReactNode;\n layout?: 'tabs' | 'accordion' | 'auto';\n}\n\nexport function SetupForm({\n onSuccess,\n onError,\n returnUrl,\n submitLabel = 'Save payment method',\n className,\n buttonClassName,\n errorClassName,\n successContent,\n layout = 'tabs',\n}: SetupFormProps) {\n const { confirmSetup, isProcessing, isSuccess, error, isReady } = useSetupIntent({\n onSuccess,\n onError,\n returnUrl,\n });\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n await confirmSetup();\n };\n\n if (isSuccess) {\n return (\n <div className={className}>\n {successContent ?? <p>Payment method saved!</p>}\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className}>\n <PaymentElement options={{ layout }} />\n {error && <p className={errorClassName} role=\"alert\">{error}</p>}\n <button\n type=\"submit\"\n disabled={!isReady || isProcessing}\n className={buttonClassName}\n >\n {isProcessing ? 'Saving...' : submitLabel}\n </button>\n </form>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\n\nexport interface PricingPlan {\n id: string;\n name: string;\n description?: string;\n priceId: string;\n amount: number;\n currency: string;\n interval?: 'month' | 'year' | 'week' | 'day';\n features: string[];\n highlighted?: boolean;\n badge?: string;\n trialDays?: number;\n}\n\nexport interface PricingTableProps {\n plans: PricingPlan[];\n onSelectPlan: (plan: PricingPlan) => void;\n isLoading?: boolean;\n currentPlanId?: string;\n buttonLabel?: string;\n currentPlanLabel?: string;\n className?: string;\n planClassName?: string;\n highlightedClassName?: string;\n buttonClassName?: string;\n formatPrice?: (amount: number, currency: string) => string;\n renderFeature?: (feature: string) => ReactNode;\n}\n\nfunction defaultFormatPrice(amount: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n }).format(amount / 100);\n}\n\nexport function PricingTable({\n plans,\n onSelectPlan,\n isLoading,\n currentPlanId,\n buttonLabel = 'Get started',\n currentPlanLabel = 'Current plan',\n className,\n planClassName,\n highlightedClassName,\n buttonClassName,\n formatPrice = defaultFormatPrice,\n renderFeature,\n}: PricingTableProps) {\n const defaultStyles: Record<string, CSSProperties> = {\n container: {\n display: 'grid',\n gridTemplateColumns: `repeat(${Math.min(plans.length, 4)}, 1fr)`,\n gap: '1.5rem',\n maxWidth: '1200px',\n margin: '0 auto',\n },\n plan: {\n border: '1px solid #e5e7eb',\n borderRadius: '0.75rem',\n padding: '2rem',\n display: 'flex',\n flexDirection: 'column',\n },\n highlighted: {\n border: '2px solid #6366f1',\n boxShadow: '0 4px 14px rgba(99,102,241,0.15)',\n },\n badge: {\n background: '#6366f1',\n color: '#fff',\n padding: '0.25rem 0.75rem',\n borderRadius: '9999px',\n fontSize: '0.75rem',\n fontWeight: 600,\n alignSelf: 'flex-start',\n marginBottom: '0.5rem',\n },\n name: { fontSize: '1.25rem', fontWeight: 700, margin: '0 0 0.25rem' },\n description: { color: '#6b7280', fontSize: '0.875rem', margin: '0 0 1rem' },\n price: { fontSize: '2.5rem', fontWeight: 800, margin: '0' },\n interval: { color: '#6b7280', fontSize: '0.875rem', fontWeight: 400 },\n features: { listStyle: 'none', padding: 0, margin: '1.5rem 0', flex: 1 },\n feature: { padding: '0.375rem 0', fontSize: '0.875rem' },\n button: {\n padding: '0.75rem 1.5rem',\n borderRadius: '0.5rem',\n border: 'none',\n fontWeight: 600,\n cursor: 'pointer',\n fontSize: '0.875rem',\n background: '#6366f1',\n color: '#fff',\n width: '100%',\n },\n currentButton: {\n background: '#e5e7eb',\n color: '#374151',\n cursor: 'default',\n },\n };\n\n return (\n <div className={className} style={!className ? defaultStyles.container : undefined}>\n {plans.map((plan) => {\n const isCurrent = plan.id === currentPlanId;\n return (\n <div\n key={plan.id}\n className={plan.highlighted ? highlightedClassName : planClassName}\n style={\n !planClassName\n ? { ...defaultStyles.plan, ...(plan.highlighted ? defaultStyles.highlighted : {}) }\n : undefined\n }\n >\n {plan.badge && (\n <span style={!highlightedClassName ? defaultStyles.badge : undefined}>\n {plan.badge}\n </span>\n )}\n <h3 style={defaultStyles.name}>{plan.name}</h3>\n {plan.description && <p style={defaultStyles.description}>{plan.description}</p>}\n <p style={defaultStyles.price}>\n {formatPrice(plan.amount, plan.currency)}\n {plan.interval && (\n <span style={defaultStyles.interval}> / {plan.interval}</span>\n )}\n </p>\n {plan.trialDays && (\n <p style={{ ...defaultStyles.description, marginTop: '0.5rem' }}>\n {plan.trialDays}-day free trial\n </p>\n )}\n <ul style={defaultStyles.features}>\n {plan.features.map((feature, i) => (\n <li key={i} style={defaultStyles.feature}>\n {renderFeature ? renderFeature(feature) : `✓ ${feature}`}\n </li>\n ))}\n </ul>\n <button\n onClick={() => !isCurrent && onSelectPlan(plan)}\n disabled={isLoading || isCurrent}\n className={buttonClassName}\n style={\n !buttonClassName\n ? { ...defaultStyles.button, ...(isCurrent ? defaultStyles.currentButton : {}) }\n : undefined\n }\n >\n {isCurrent ? currentPlanLabel : buttonLabel}\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\n\nexport interface SubscriptionInfo {\n id: string;\n status: string;\n planName: string;\n amount: number;\n currency: string;\n interval: string;\n currentPeriodEnd: string | Date;\n cancelAtPeriodEnd: boolean;\n trialEnd?: string | Date | null;\n}\n\nexport interface SubscriptionManagerProps {\n subscription: SubscriptionInfo;\n onCancel: (subscriptionId: string) => Promise<void>;\n onResume?: (subscriptionId: string) => Promise<void>;\n onChangePlan?: (subscriptionId: string) => void;\n onManageBilling?: () => void;\n className?: string;\n formatPrice?: (amount: number, currency: string) => string;\n cancelLabel?: string;\n resumeLabel?: string;\n changePlanLabel?: string;\n manageBillingLabel?: string;\n children?: ReactNode;\n}\n\nfunction defaultFormatPrice(amount: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n }).format(amount / 100);\n}\n\nconst statusColors: Record<string, string> = {\n active: '#10b981',\n trialing: '#6366f1',\n past_due: '#f59e0b',\n canceled: '#ef4444',\n incomplete: '#f59e0b',\n unpaid: '#ef4444',\n paused: '#6b7280',\n};\n\nexport function SubscriptionManager({\n subscription,\n onCancel,\n onResume,\n onChangePlan,\n onManageBilling,\n className,\n formatPrice = defaultFormatPrice,\n cancelLabel = 'Cancel subscription',\n resumeLabel = 'Resume subscription',\n changePlanLabel = 'Change plan',\n manageBillingLabel = 'Manage billing',\n}: SubscriptionManagerProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [showConfirm, setShowConfirm] = useState(false);\n\n const endDate = new Date(subscription.currentPeriodEnd).toLocaleDateString();\n const trialEndDate = subscription.trialEnd\n ? new Date(subscription.trialEnd).toLocaleDateString()\n : null;\n\n const handleCancel = async () => {\n setIsLoading(true);\n try {\n await onCancel(subscription.id);\n } finally {\n setIsLoading(false);\n setShowConfirm(false);\n }\n };\n\n const handleResume = async () => {\n if (!onResume) return;\n setIsLoading(true);\n try {\n await onResume(subscription.id);\n } finally {\n setIsLoading(false);\n }\n };\n\n const styles: Record<string, CSSProperties> = {\n container: { border: '1px solid #e5e7eb', borderRadius: '0.75rem', padding: '1.5rem' },\n header: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1rem' },\n planName: { fontSize: '1.25rem', fontWeight: 700, margin: 0 },\n status: {\n padding: '0.25rem 0.75rem',\n borderRadius: '9999px',\n fontSize: '0.75rem',\n fontWeight: 600,\n color: '#fff',\n background: statusColors[subscription.status] ?? '#6b7280',\n },\n price: { fontSize: '1.5rem', fontWeight: 700, margin: '0 0 0.5rem' },\n detail: { color: '#6b7280', fontSize: '0.875rem', margin: '0.25rem 0' },\n actions: { display: 'flex', gap: '0.75rem', marginTop: '1.5rem', flexWrap: 'wrap' as const },\n button: {\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n background: '#fff',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n dangerButton: {\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #fca5a5',\n background: '#fef2f2',\n color: '#dc2626',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n confirm: {\n background: '#fef2f2',\n border: '1px solid #fca5a5',\n borderRadius: '0.5rem',\n padding: '1rem',\n marginTop: '1rem',\n },\n };\n\n return (\n <div className={className} style={!className ? styles.container : undefined}>\n <div style={styles.header}>\n <h3 style={styles.planName}>{subscription.planName}</h3>\n <span style={styles.status}>{subscription.status}</span>\n </div>\n\n <p style={styles.price}>\n {formatPrice(subscription.amount, subscription.currency)}\n <span style={{ fontSize: '0.875rem', fontWeight: 400, color: '#6b7280' }}>\n {' '}/ {subscription.interval}\n </span>\n </p>\n\n {trialEndDate && subscription.status === 'trialing' && (\n <p style={styles.detail}>Trial ends on {trialEndDate}</p>\n )}\n\n {subscription.cancelAtPeriodEnd ? (\n <p style={{ ...styles.detail, color: '#dc2626' }}>\n Cancels on {endDate}\n </p>\n ) : (\n <p style={styles.detail}>Renews on {endDate}</p>\n )}\n\n <div style={styles.actions}>\n {onChangePlan && subscription.status === 'active' && (\n <button onClick={() => onChangePlan(subscription.id)} style={styles.button}>\n {changePlanLabel}\n </button>\n )}\n\n {onManageBilling && (\n <button onClick={onManageBilling} style={styles.button}>\n {manageBillingLabel}\n </button>\n )}\n\n {subscription.cancelAtPeriodEnd && onResume ? (\n <button onClick={handleResume} disabled={isLoading} style={styles.button}>\n {isLoading ? 'Loading...' : resumeLabel}\n </button>\n ) : (\n subscription.status === 'active' && (\n <button onClick={() => setShowConfirm(true)} style={styles.dangerButton}>\n {cancelLabel}\n </button>\n )\n )}\n </div>\n\n {showConfirm && (\n <div style={styles.confirm}>\n <p style={{ margin: '0 0 0.75rem', fontWeight: 500 }}>\n Are you sure you want to cancel?\n </p>\n <p style={{ ...styles.detail, marginBottom: '0.75rem' }}>\n You will still have access until {endDate}.\n </p>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button onClick={handleCancel} disabled={isLoading} style={styles.dangerButton}>\n {isLoading ? 'Cancelling...' : 'Confirm cancellation'}\n </button>\n <button onClick={() => setShowConfirm(false)} style={styles.button}>\n Keep subscription\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/providers/StripeProvider.tsx","../../src/client/hooks/usePayment.ts","../../src/client/hooks/useSetupIntent.ts","../../src/client/hooks/useCheckout.ts","../../src/client/components/CheckoutForm.tsx","../../src/client/components/SetupForm.tsx","../../src/client/components/PricingTable.tsx","../../src/client/components/SubscriptionManager.tsx"],"names":["useStripe","useElements","useState","useCallback","loadStripe","jsx","jsxs","PaymentElement","defaultFormatPrice"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport { loadStripe } from '@stripe/stripe-js';\nimport { Elements } from '@stripe/react-stripe-js';\nimport type { Stripe, StripeElementsOptions } from '@stripe/stripe-js';\nimport type { ReactNode } from 'react';\n\ninterface StripeContextValue {\n publishableKey: string;\n}\n\nconst StripeContext = createContext<StripeContextValue | null>(null);\n\nexport function useStripeConfig(): StripeContextValue {\n const context = useContext(StripeContext);\n if (!context) {\n throw new Error('useStripeConfig must be used within a <StripeProvider>');\n }\n return context;\n}\n\nexport interface StripeProviderProps {\n publishableKey: string;\n children: ReactNode;\n options?: StripeElementsOptions;\n locale?: string;\n}\n\nexport function StripeProvider({\n publishableKey,\n children,\n options,\n locale,\n}: StripeProviderProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, locale ? { locale: locale as 'auto' } : undefined),\n [publishableKey, locale]\n );\n\n return (\n <StripeContext.Provider value={{ publishableKey }}>\n <Elements stripe={stripePromise} options={options}>\n {children}\n </Elements>\n </StripeContext.Provider>\n );\n}\n\n/**\n * Provider for embedding Stripe Elements with a client secret.\n * Use this to wrap payment forms after creating a PaymentIntent or SetupIntent.\n */\nexport interface StripeElementsProviderProps {\n publishableKey: string;\n clientSecret: string;\n children: ReactNode;\n appearance?: StripeElementsOptions['appearance'];\n locale?: string;\n loader?: 'auto' | 'always' | 'never';\n}\n\nexport function StripeElementsProvider({\n publishableKey,\n clientSecret,\n children,\n appearance,\n locale,\n loader = 'auto',\n}: StripeElementsProviderProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, locale ? { locale: locale as 'auto' } : undefined),\n [publishableKey, locale]\n );\n\n const options: StripeElementsOptions = useMemo(\n () => ({\n clientSecret,\n appearance,\n loader,\n }),\n [clientSecret, appearance, loader]\n );\n\n return (\n <StripeContext.Provider value={{ publishableKey }}>\n <Elements stripe={stripePromise} options={options}>\n {children}\n </Elements>\n </StripeContext.Provider>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { useStripe, useElements } from '@stripe/react-stripe-js';\n\ninterface PaymentState {\n isProcessing: boolean;\n isSuccess: boolean;\n error: string | null;\n paymentIntentId: string | null;\n}\n\ninterface UsePaymentOptions {\n onSuccess?: (paymentIntentId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n}\n\nexport function usePayment(options?: UsePaymentOptions) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [state, setState] = useState<PaymentState>({\n isProcessing: false,\n isSuccess: false,\n error: null,\n paymentIntentId: null,\n });\n\n const processPayment = useCallback(async (\n overrides?: { returnUrl?: string }\n ) => {\n if (!stripe || !elements) {\n setState((s) => ({ ...s, error: 'Stripe not loaded yet' }));\n return { success: false, error: 'Stripe not loaded yet' };\n }\n\n setState({ isProcessing: true, isSuccess: false, error: null, paymentIntentId: null });\n\n const { error, paymentIntent } = await stripe.confirmPayment({\n elements,\n confirmParams: {\n return_url: overrides?.returnUrl ?? options?.returnUrl ?? (typeof window !== 'undefined' ? window.location.href : ''),\n },\n redirect: 'if_required',\n });\n\n if (error) {\n const message = error.message ?? 'Payment failed';\n setState({ isProcessing: false, isSuccess: false, error: message, paymentIntentId: null });\n options?.onError?.(message);\n return { success: false, error: message };\n }\n\n if (paymentIntent?.status === 'succeeded') {\n setState({ isProcessing: false, isSuccess: true, error: null, paymentIntentId: paymentIntent.id });\n options?.onSuccess?.(paymentIntent.id);\n return { success: true, paymentIntentId: paymentIntent.id };\n }\n\n setState({ isProcessing: false, isSuccess: false, error: null, paymentIntentId: paymentIntent?.id ?? null });\n return { success: false, status: paymentIntent?.status };\n }, [stripe, elements, options]);\n\n const reset = useCallback(() => {\n setState({ isProcessing: false, isSuccess: false, error: null, paymentIntentId: null });\n }, []);\n\n return {\n ...state,\n processPayment,\n reset,\n isReady: !!stripe && !!elements,\n };\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { useStripe, useElements } from '@stripe/react-stripe-js';\n\ninterface SetupState {\n isProcessing: boolean;\n isSuccess: boolean;\n error: string | null;\n setupIntentId: string | null;\n paymentMethodId: string | null;\n}\n\ninterface UseSetupIntentOptions {\n onSuccess?: (setupIntentId: string, paymentMethodId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n}\n\nexport function useSetupIntent(options?: UseSetupIntentOptions) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [state, setState] = useState<SetupState>({\n isProcessing: false,\n isSuccess: false,\n error: null,\n setupIntentId: null,\n paymentMethodId: null,\n });\n\n const confirmSetup = useCallback(async (\n overrides?: { returnUrl?: string }\n ) => {\n if (!stripe || !elements) {\n setState((s) => ({ ...s, error: 'Stripe not loaded yet' }));\n return { success: false, error: 'Stripe not loaded yet' };\n }\n\n setState({ isProcessing: true, isSuccess: false, error: null, setupIntentId: null, paymentMethodId: null });\n\n const { error, setupIntent } = await stripe.confirmSetup({\n elements,\n confirmParams: {\n return_url: overrides?.returnUrl ?? options?.returnUrl ?? (typeof window !== 'undefined' ? window.location.href : ''),\n },\n redirect: 'if_required',\n });\n\n if (error) {\n const message = error.message ?? 'Setup failed';\n setState({ isProcessing: false, isSuccess: false, error: message, setupIntentId: null, paymentMethodId: null });\n options?.onError?.(message);\n return { success: false, error: message };\n }\n\n if (setupIntent?.status === 'succeeded') {\n const pmId = typeof setupIntent.payment_method === 'string'\n ? setupIntent.payment_method\n : setupIntent.payment_method?.id ?? null;\n setState({ isProcessing: false, isSuccess: true, error: null, setupIntentId: setupIntent.id, paymentMethodId: pmId });\n if (pmId) options?.onSuccess?.(setupIntent.id, pmId);\n return { success: true, setupIntentId: setupIntent.id, paymentMethodId: pmId };\n }\n\n setState({ isProcessing: false, isSuccess: false, error: null, setupIntentId: setupIntent?.id ?? null, paymentMethodId: null });\n return { success: false, status: setupIntent?.status };\n }, [stripe, elements, options]);\n\n const reset = useCallback(() => {\n setState({ isProcessing: false, isSuccess: false, error: null, setupIntentId: null, paymentMethodId: null });\n }, []);\n\n return {\n ...state,\n confirmSetup,\n reset,\n isReady: !!stripe && !!elements,\n };\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { loadStripe } from '@stripe/stripe-js';\n\ninterface CheckoutState {\n isLoading: boolean;\n error: string | null;\n}\n\ninterface UseCheckoutOptions {\n publishableKey: string;\n onError?: (error: string) => void;\n}\n\nexport function useCheckout(options: UseCheckoutOptions) {\n const [state, setState] = useState<CheckoutState>({\n isLoading: false,\n error: null,\n });\n\n /**\n * Redirect to a Stripe Checkout session.\n * Pass the sessionId returned from your server (createCheckoutSession).\n */\n const redirectToCheckout = useCallback(async (sessionId: string) => {\n setState({ isLoading: true, error: null });\n\n try {\n const stripe = await loadStripe(options.publishableKey);\n if (!stripe) {\n throw new Error('Failed to load Stripe');\n }\n\n const { error } = await stripe.redirectToCheckout({ sessionId });\n\n if (error) {\n const message = error.message ?? 'Redirect to checkout failed';\n setState({ isLoading: false, error: message });\n options.onError?.(message);\n return { success: false, error: message };\n }\n\n return { success: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n setState({ isLoading: false, error: message });\n options.onError?.(message);\n return { success: false, error: message };\n }\n }, [options]);\n\n /**\n * Open a Stripe Customer Portal session.\n * Pass the portal URL returned from your server (createPortalSession).\n */\n const redirectToPortal = useCallback((portalUrl: string) => {\n window.location.href = portalUrl;\n }, []);\n\n return {\n ...state,\n redirectToCheckout,\n redirectToPortal,\n };\n}\n","'use client';\n\nimport React from 'react';\nimport { PaymentElement, LinkAuthenticationElement } from '@stripe/react-stripe-js';\nimport { usePayment } from '../hooks/usePayment';\nimport type { ReactNode, FormEvent } from 'react';\n\nexport interface CheckoutFormProps {\n onSuccess?: (paymentIntentId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n submitLabel?: string;\n showEmail?: boolean;\n className?: string;\n buttonClassName?: string;\n errorClassName?: string;\n children?: ReactNode;\n layout?: 'tabs' | 'accordion' | 'auto';\n}\n\nexport function CheckoutForm({\n onSuccess,\n onError,\n returnUrl,\n submitLabel = 'Pay now',\n showEmail = false,\n className,\n buttonClassName,\n errorClassName,\n children,\n layout = 'tabs',\n}: CheckoutFormProps) {\n const { processPayment, isProcessing, isSuccess, error, isReady } = usePayment({\n onSuccess,\n onError,\n returnUrl,\n });\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n await processPayment();\n };\n\n if (isSuccess) {\n return (\n <div className={className}>\n {children ?? <p>Payment successful!</p>}\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className}>\n {showEmail && <LinkAuthenticationElement />}\n <PaymentElement options={{ layout }} />\n {error && <p className={errorClassName} role=\"alert\">{error}</p>}\n <button\n type=\"submit\"\n disabled={!isReady || isProcessing}\n className={buttonClassName}\n >\n {isProcessing ? 'Processing...' : submitLabel}\n </button>\n </form>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { PaymentElement } from '@stripe/react-stripe-js';\nimport { useSetupIntent } from '../hooks/useSetupIntent';\nimport type { ReactNode, FormEvent } from 'react';\n\nexport interface SetupFormProps {\n onSuccess?: (setupIntentId: string, paymentMethodId: string) => void;\n onError?: (error: string) => void;\n returnUrl?: string;\n submitLabel?: string;\n className?: string;\n buttonClassName?: string;\n errorClassName?: string;\n successContent?: ReactNode;\n layout?: 'tabs' | 'accordion' | 'auto';\n}\n\nexport function SetupForm({\n onSuccess,\n onError,\n returnUrl,\n submitLabel = 'Save payment method',\n className,\n buttonClassName,\n errorClassName,\n successContent,\n layout = 'tabs',\n}: SetupFormProps) {\n const { confirmSetup, isProcessing, isSuccess, error, isReady } = useSetupIntent({\n onSuccess,\n onError,\n returnUrl,\n });\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n await confirmSetup();\n };\n\n if (isSuccess) {\n return (\n <div className={className}>\n {successContent ?? <p>Payment method saved!</p>}\n </div>\n );\n }\n\n return (\n <form onSubmit={handleSubmit} className={className}>\n <PaymentElement options={{ layout }} />\n {error && <p className={errorClassName} role=\"alert\">{error}</p>}\n <button\n type=\"submit\"\n disabled={!isReady || isProcessing}\n className={buttonClassName}\n >\n {isProcessing ? 'Saving...' : submitLabel}\n </button>\n </form>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\n\nexport interface PricingPlan {\n id: string;\n name: string;\n description?: string;\n priceId: string;\n amount: number;\n currency: string;\n interval?: 'month' | 'year' | 'week' | 'day';\n features: string[];\n highlighted?: boolean;\n badge?: string;\n trialDays?: number;\n}\n\nexport interface PricingTableProps {\n plans: PricingPlan[];\n onSelectPlan: (plan: PricingPlan) => void;\n isLoading?: boolean;\n currentPlanId?: string;\n buttonLabel?: string;\n currentPlanLabel?: string;\n className?: string;\n planClassName?: string;\n highlightedClassName?: string;\n buttonClassName?: string;\n formatPrice?: (amount: number, currency: string) => string;\n renderFeature?: (feature: string) => ReactNode;\n}\n\nfunction defaultFormatPrice(amount: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n }).format(amount / 100);\n}\n\nexport function PricingTable({\n plans,\n onSelectPlan,\n isLoading,\n currentPlanId,\n buttonLabel = 'Get started',\n currentPlanLabel = 'Current plan',\n className,\n planClassName,\n highlightedClassName,\n buttonClassName,\n formatPrice = defaultFormatPrice,\n renderFeature,\n}: PricingTableProps) {\n const defaultStyles: Record<string, CSSProperties> = {\n container: {\n display: 'grid',\n gridTemplateColumns: `repeat(${Math.min(plans.length, 4)}, 1fr)`,\n gap: '1.5rem',\n maxWidth: '1200px',\n margin: '0 auto',\n },\n plan: {\n border: '1px solid #e5e7eb',\n borderRadius: '0.75rem',\n padding: '2rem',\n display: 'flex',\n flexDirection: 'column',\n },\n highlighted: {\n border: '2px solid #6366f1',\n boxShadow: '0 4px 14px rgba(99,102,241,0.15)',\n },\n badge: {\n background: '#6366f1',\n color: '#fff',\n padding: '0.25rem 0.75rem',\n borderRadius: '9999px',\n fontSize: '0.75rem',\n fontWeight: 600,\n alignSelf: 'flex-start',\n marginBottom: '0.5rem',\n },\n name: { fontSize: '1.25rem', fontWeight: 700, margin: '0 0 0.25rem' },\n description: { color: '#6b7280', fontSize: '0.875rem', margin: '0 0 1rem' },\n price: { fontSize: '2.5rem', fontWeight: 800, margin: '0' },\n interval: { color: '#6b7280', fontSize: '0.875rem', fontWeight: 400 },\n features: { listStyle: 'none', padding: 0, margin: '1.5rem 0', flex: 1 },\n feature: { padding: '0.375rem 0', fontSize: '0.875rem' },\n button: {\n padding: '0.75rem 1.5rem',\n borderRadius: '0.5rem',\n border: 'none',\n fontWeight: 600,\n cursor: 'pointer',\n fontSize: '0.875rem',\n background: '#6366f1',\n color: '#fff',\n width: '100%',\n },\n currentButton: {\n background: '#e5e7eb',\n color: '#374151',\n cursor: 'default',\n },\n };\n\n return (\n <div className={className} style={!className ? defaultStyles.container : undefined}>\n {plans.map((plan) => {\n const isCurrent = plan.id === currentPlanId;\n return (\n <div\n key={plan.id}\n className={plan.highlighted ? highlightedClassName : planClassName}\n style={\n !planClassName\n ? { ...defaultStyles.plan, ...(plan.highlighted ? defaultStyles.highlighted : {}) }\n : undefined\n }\n >\n {plan.badge && (\n <span style={!highlightedClassName ? defaultStyles.badge : undefined}>\n {plan.badge}\n </span>\n )}\n <h3 style={defaultStyles.name}>{plan.name}</h3>\n {plan.description && <p style={defaultStyles.description}>{plan.description}</p>}\n <p style={defaultStyles.price}>\n {formatPrice(plan.amount, plan.currency)}\n {plan.interval && (\n <span style={defaultStyles.interval}> / {plan.interval}</span>\n )}\n </p>\n {plan.trialDays && (\n <p style={{ ...defaultStyles.description, marginTop: '0.5rem' }}>\n {plan.trialDays}-day free trial\n </p>\n )}\n <ul style={defaultStyles.features}>\n {plan.features.map((feature, i) => (\n <li key={i} style={defaultStyles.feature}>\n {renderFeature ? renderFeature(feature) : `✓ ${feature}`}\n </li>\n ))}\n </ul>\n <button\n onClick={() => !isCurrent && onSelectPlan(plan)}\n disabled={isLoading || isCurrent}\n className={buttonClassName}\n style={\n !buttonClassName\n ? { ...defaultStyles.button, ...(isCurrent ? defaultStyles.currentButton : {}) }\n : undefined\n }\n >\n {isCurrent ? currentPlanLabel : buttonLabel}\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\n\nexport interface SubscriptionInfo {\n id: string;\n status: string;\n planName: string;\n amount: number;\n currency: string;\n interval: string;\n currentPeriodEnd: string | Date;\n cancelAtPeriodEnd: boolean;\n trialEnd?: string | Date | null;\n}\n\nexport interface SubscriptionManagerProps {\n subscription: SubscriptionInfo;\n onCancel: (subscriptionId: string) => Promise<void>;\n onResume?: (subscriptionId: string) => Promise<void>;\n onChangePlan?: (subscriptionId: string) => void;\n onManageBilling?: () => void;\n className?: string;\n formatPrice?: (amount: number, currency: string) => string;\n cancelLabel?: string;\n resumeLabel?: string;\n changePlanLabel?: string;\n manageBillingLabel?: string;\n children?: ReactNode;\n}\n\nfunction defaultFormatPrice(amount: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n }).format(amount / 100);\n}\n\nconst statusColors: Record<string, string> = {\n active: '#10b981',\n trialing: '#6366f1',\n past_due: '#f59e0b',\n canceled: '#ef4444',\n incomplete: '#f59e0b',\n unpaid: '#ef4444',\n paused: '#6b7280',\n};\n\nexport function SubscriptionManager({\n subscription,\n onCancel,\n onResume,\n onChangePlan,\n onManageBilling,\n className,\n formatPrice = defaultFormatPrice,\n cancelLabel = 'Cancel subscription',\n resumeLabel = 'Resume subscription',\n changePlanLabel = 'Change plan',\n manageBillingLabel = 'Manage billing',\n}: SubscriptionManagerProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [showConfirm, setShowConfirm] = useState(false);\n\n const endDate = new Date(subscription.currentPeriodEnd).toLocaleDateString();\n const trialEndDate = subscription.trialEnd\n ? new Date(subscription.trialEnd).toLocaleDateString()\n : null;\n\n const handleCancel = async () => {\n setIsLoading(true);\n try {\n await onCancel(subscription.id);\n } finally {\n setIsLoading(false);\n setShowConfirm(false);\n }\n };\n\n const handleResume = async () => {\n if (!onResume) return;\n setIsLoading(true);\n try {\n await onResume(subscription.id);\n } finally {\n setIsLoading(false);\n }\n };\n\n const styles: Record<string, CSSProperties> = {\n container: { border: '1px solid #e5e7eb', borderRadius: '0.75rem', padding: '1.5rem' },\n header: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1rem' },\n planName: { fontSize: '1.25rem', fontWeight: 700, margin: 0 },\n status: {\n padding: '0.25rem 0.75rem',\n borderRadius: '9999px',\n fontSize: '0.75rem',\n fontWeight: 600,\n color: '#fff',\n background: statusColors[subscription.status] ?? '#6b7280',\n },\n price: { fontSize: '1.5rem', fontWeight: 700, margin: '0 0 0.5rem' },\n detail: { color: '#6b7280', fontSize: '0.875rem', margin: '0.25rem 0' },\n actions: { display: 'flex', gap: '0.75rem', marginTop: '1.5rem', flexWrap: 'wrap' as const },\n button: {\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n background: '#fff',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n dangerButton: {\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #fca5a5',\n background: '#fef2f2',\n color: '#dc2626',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n },\n confirm: {\n background: '#fef2f2',\n border: '1px solid #fca5a5',\n borderRadius: '0.5rem',\n padding: '1rem',\n marginTop: '1rem',\n },\n };\n\n return (\n <div className={className} style={!className ? styles.container : undefined}>\n <div style={styles.header}>\n <h3 style={styles.planName}>{subscription.planName}</h3>\n <span style={styles.status}>{subscription.status}</span>\n </div>\n\n <p style={styles.price}>\n {formatPrice(subscription.amount, subscription.currency)}\n <span style={{ fontSize: '0.875rem', fontWeight: 400, color: '#6b7280' }}>\n {' '}/ {subscription.interval}\n </span>\n </p>\n\n {trialEndDate && subscription.status === 'trialing' && (\n <p style={styles.detail}>Trial ends on {trialEndDate}</p>\n )}\n\n {subscription.cancelAtPeriodEnd ? (\n <p style={{ ...styles.detail, color: '#dc2626' }}>\n Cancels on {endDate}\n </p>\n ) : (\n <p style={styles.detail}>Renews on {endDate}</p>\n )}\n\n <div style={styles.actions}>\n {onChangePlan && subscription.status === 'active' && (\n <button onClick={() => onChangePlan(subscription.id)} style={styles.button}>\n {changePlanLabel}\n </button>\n )}\n\n {onManageBilling && (\n <button onClick={onManageBilling} style={styles.button}>\n {manageBillingLabel}\n </button>\n )}\n\n {subscription.cancelAtPeriodEnd && onResume ? (\n <button onClick={handleResume} disabled={isLoading} style={styles.button}>\n {isLoading ? 'Loading...' : resumeLabel}\n </button>\n ) : (\n subscription.status === 'active' && (\n <button onClick={() => setShowConfirm(true)} style={styles.dangerButton}>\n {cancelLabel}\n </button>\n )\n )}\n </div>\n\n {showConfirm && (\n <div style={styles.confirm}>\n <p style={{ margin: '0 0 0.75rem', fontWeight: 500 }}>\n Are you sure you want to cancel?\n </p>\n <p style={{ ...styles.detail, marginBottom: '0.75rem' }}>\n You will still have access until {endDate}.\n </p>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button onClick={handleCancel} disabled={isLoading} style={styles.dangerButton}>\n {isLoading ? 'Cancelling...' : 'Confirm cancellation'}\n </button>\n <button onClick={() => setShowConfirm(false)} style={styles.button}>\n Keep subscription\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|