@omnikit-js/ui 0.9.20 → 0.9.21
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/chunk-2MKNXIZG.mjs +6154 -0
- package/dist/chunk-2MKNXIZG.mjs.map +1 -0
- package/dist/chunk-FA7CH4TP.mjs +511 -0
- package/dist/chunk-FA7CH4TP.mjs.map +1 -0
- package/dist/{chunk-L7N56HNE.js → chunk-MTFFRTQW.js} +17 -17
- package/dist/chunk-MTFFRTQW.js.map +1 -0
- package/dist/{chunk-UAN65U7P.js → chunk-NHN5YSUE.js} +3 -3
- package/dist/{chunk-UAN65U7P.js.map → chunk-NHN5YSUE.js.map} +1 -1
- package/dist/components/client/index.css +160 -0
- package/dist/components/client/index.css.map +1 -0
- package/dist/components/client/index.js +2 -2
- package/dist/components/client/index.mjs +1350 -0
- package/dist/components/client/index.mjs.map +1 -0
- package/dist/components/server/index.css +160 -0
- package/dist/components/server/index.css.map +1 -0
- package/dist/components/server/index.js +2 -2
- package/dist/components/server/index.mjs +4 -0
- package/dist/components/server/index.mjs.map +1 -0
- package/dist/index.css +160 -0
- package/dist/index.css.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.mjs +4 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-L7N56HNE.js.map +0 -1
|
@@ -710,7 +710,7 @@ function BillingContent({
|
|
|
710
710
|
plans.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-gray-500 dark:text-gray-400", children: "No plans available." }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: plans.map((plan) => /* @__PURE__ */ jsxs(
|
|
711
711
|
"div",
|
|
712
712
|
{
|
|
713
|
-
className: `
|
|
713
|
+
className: `okt-plan-card relative p-6 flex flex-col ${plan.current ? "okt-plan-card-selected" : "okt-plan-card-default"} ${plan.popular ? "shadow-lg" : ""}`,
|
|
714
714
|
children: [
|
|
715
715
|
plan.popular && !plan.current && /* @__PURE__ */ jsx("div", { className: "absolute -top-3 left-1/2 -translate-x-1/2", children: /* @__PURE__ */ jsx("span", { className: "bg-blue-600 text-white text-xs font-semibold px-3 py-1 rounded-full", children: "Most Popular" }) }),
|
|
716
716
|
plan.current && /* @__PURE__ */ jsx("div", { className: "absolute -top-3 left-1/2 -translate-x-1/2", children: /* @__PURE__ */ jsx("span", { className: "bg-green-600 text-white text-xs font-semibold px-3 py-1 rounded-full", children: "Current Plan" }) }),
|
|
@@ -768,7 +768,7 @@ function BillingContent({
|
|
|
768
768
|
content: /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
769
769
|
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-2", children: "Invoice History" }),
|
|
770
770
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-6", children: "View and download your past invoices" }),
|
|
771
|
-
invoices.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-gray-500 dark:text-gray-400", children: "No invoices yet." }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: invoices.map((invoice) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-4
|
|
771
|
+
invoices.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-gray-500 dark:text-gray-400", children: "No invoices yet." }) : /* @__PURE__ */ jsx("div", { className: "space-y-3", children: invoices.map((invoice) => /* @__PURE__ */ jsxs("div", { className: "okt-card-border flex items-center justify-between p-4 transition-colors", children: [
|
|
772
772
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
773
773
|
/* @__PURE__ */ jsx("div", { className: "h-10 w-10 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center", children: /* @__PURE__ */ jsx("svg", { className: "w-5 h-5 text-blue-600 dark:text-blue-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }) }) }),
|
|
774
774
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -800,11 +800,11 @@ function BillingContent({
|
|
|
800
800
|
content: /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
801
801
|
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-2", children: "Payment Methods" }),
|
|
802
802
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-6", children: "Manage your payment methods" }),
|
|
803
|
-
paymentMethods.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-8
|
|
803
|
+
paymentMethods.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "okt-empty-border text-center py-8", children: [
|
|
804
804
|
/* @__PURE__ */ jsx("p", { className: "text-gray-500 dark:text-gray-400 mb-4", children: "No payment methods on file" }),
|
|
805
805
|
/* @__PURE__ */ jsx(Button, { onClick: () => setIsAddPaymentModalOpen(true), disabled: stripeLoading, children: stripeLoading ? "Loading..." : "Add Payment Method" })
|
|
806
806
|
] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
807
|
-
paymentMethods.map((pm) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-4
|
|
807
|
+
paymentMethods.map((pm) => /* @__PURE__ */ jsxs("div", { className: "okt-card-border flex items-center justify-between p-4", children: [
|
|
808
808
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
809
809
|
/* @__PURE__ */ jsx("div", { className: "h-10 w-10 rounded-full bg-gray-100 dark:bg-neutral-800 flex items-center justify-center", children: /* @__PURE__ */ jsx("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" }) }) }),
|
|
810
810
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -1043,7 +1043,7 @@ function BillingContent({
|
|
|
1043
1043
|
initialTaxInfo.reverse_charge && /* @__PURE__ */ jsx("p", { className: "text-blue-600 dark:text-blue-400", children: "Reverse charge applies" })
|
|
1044
1044
|
] })
|
|
1045
1045
|
] }),
|
|
1046
|
-
/* @__PURE__ */ jsx("div", { className: "flex justify-end pt-4
|
|
1046
|
+
/* @__PURE__ */ jsx("div", { className: "okt-divider flex justify-end pt-4", children: /* @__PURE__ */ jsx(
|
|
1047
1047
|
Button,
|
|
1048
1048
|
{
|
|
1049
1049
|
onClick: handleSavePreferences,
|
|
@@ -1055,7 +1055,7 @@ function BillingContent({
|
|
|
1055
1055
|
] }) })
|
|
1056
1056
|
}
|
|
1057
1057
|
];
|
|
1058
|
-
return /* @__PURE__ */ jsxs("div", { className
|
|
1058
|
+
return /* @__PURE__ */ jsxs("div", { className: `okt-billing ${className}`, children: [
|
|
1059
1059
|
/* @__PURE__ */ jsx(Tabs, { tabs, defaultIndex: activeTabIndex, onChange: setActiveTabIndex }, activeTabIndex),
|
|
1060
1060
|
/* @__PURE__ */ jsx(
|
|
1061
1061
|
Modal,
|
|
@@ -1097,7 +1097,7 @@ function BillingContent({
|
|
|
1097
1097
|
] })
|
|
1098
1098
|
] }) }),
|
|
1099
1099
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-500 dark:text-gray-400", children: "This action cannot be undone." }),
|
|
1100
|
-
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 justify-end mt-6 pt-4
|
|
1100
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 justify-end mt-6 pt-4 okt-divider", children: [
|
|
1101
1101
|
/* @__PURE__ */ jsx(
|
|
1102
1102
|
Button,
|
|
1103
1103
|
{
|
|
@@ -1130,7 +1130,7 @@ function BillingContent({
|
|
|
1130
1130
|
onClose: () => setIsCancelModalOpen(false),
|
|
1131
1131
|
title: "Cancel Subscription",
|
|
1132
1132
|
children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
1133
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 bg-yellow-50 dark:bg-yellow-900/20
|
|
1133
|
+
/* @__PURE__ */ jsxs("div", { className: "okt-alert-warning flex items-start gap-3 bg-yellow-50 dark:bg-yellow-900/20 p-4", children: [
|
|
1134
1134
|
/* @__PURE__ */ jsx("svg", { className: "w-6 h-6 text-yellow-600 dark:text-yellow-400 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }),
|
|
1135
1135
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1136
1136
|
/* @__PURE__ */ jsx("p", { className: "font-medium text-yellow-900 dark:text-yellow-100 mb-1", children: "Are you sure you want to cancel?" }),
|
|
@@ -1147,7 +1147,7 @@ function BillingContent({
|
|
|
1147
1147
|
/* @__PURE__ */ jsx("span", { className: "font-medium", children: subscription.nextBilling })
|
|
1148
1148
|
] })
|
|
1149
1149
|
] }),
|
|
1150
|
-
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 justify-end mt-6 pt-4
|
|
1150
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3 justify-end mt-6 pt-4 okt-divider", children: [
|
|
1151
1151
|
/* @__PURE__ */ jsx(
|
|
1152
1152
|
Button,
|
|
1153
1153
|
{
|
|
@@ -1231,7 +1231,7 @@ function BillingContent({
|
|
|
1231
1231
|
] }) : null
|
|
1232
1232
|
] }),
|
|
1233
1233
|
taxInfo && taxInfo.reverse_charge && /* @__PURE__ */ jsx("div", { className: "mt-2 p-2 bg-blue-50 dark:bg-blue-900/20 rounded text-xs text-blue-700 dark:text-blue-300", children: "EU reverse charge applies - you are responsible for reporting VAT in your country." }),
|
|
1234
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
1234
|
+
/* @__PURE__ */ jsx("div", { className: "okt-divider mt-3 pt-3", children: /* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
|
|
1235
1235
|
/* @__PURE__ */ jsx("span", { className: "font-semibold text-gray-900 dark:text-white", children: selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) === 0 ? "Total:" : "Charged Today:" }),
|
|
1236
1236
|
/* @__PURE__ */ jsx("span", { className: "font-bold text-lg text-gray-900 dark:text-white", children: selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) === 0 ? /* @__PURE__ */ jsx("span", { className: "text-green-600 dark:text-green-400", children: "FREE" }) : taxInfo ? `$${(taxInfo.total / 100).toFixed(2)}` : selectedPlan?.price || "$0" })
|
|
1237
1237
|
] }) })
|
|
@@ -1241,7 +1241,7 @@ function BillingContent({
|
|
|
1241
1241
|
/* @__PURE__ */ jsx("div", { className: "space-y-2", children: paymentMethods.map((method) => /* @__PURE__ */ jsxs(
|
|
1242
1242
|
"label",
|
|
1243
1243
|
{
|
|
1244
|
-
className: `flex items-center gap-3 p-3
|
|
1244
|
+
className: `okt-selectable flex items-center gap-3 p-3 transition-all ${selectedUpgradePaymentMethod === method.id ? "okt-selectable-selected" : "okt-selectable-default"}`,
|
|
1245
1245
|
children: [
|
|
1246
1246
|
/* @__PURE__ */ jsx(
|
|
1247
1247
|
"input",
|
|
@@ -1269,10 +1269,10 @@ function BillingContent({
|
|
|
1269
1269
|
method.id
|
|
1270
1270
|
)) })
|
|
1271
1271
|
] }),
|
|
1272
|
-
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) > 0 && paymentMethods.length === 0 && /* @__PURE__ */ jsx("div", { className: "bg-yellow-50 dark:bg-yellow-900/20
|
|
1273
|
-
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) === 0 && /* @__PURE__ */ jsx("div", { className: "bg-green-50 dark:bg-green-900/20
|
|
1272
|
+
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) > 0 && paymentMethods.length === 0 && /* @__PURE__ */ jsx("div", { className: "okt-alert-warning bg-yellow-50 dark:bg-yellow-900/20 p-3", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-yellow-800 dark:text-yellow-200", children: "Please add a payment method before subscribing to a paid plan." }) }),
|
|
1273
|
+
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) === 0 && /* @__PURE__ */ jsx("div", { className: "okt-alert-success bg-green-50 dark:bg-green-900/20 p-3", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-green-800 dark:text-green-200", children: "This is a free plan. No payment method required!" }) }),
|
|
1274
1274
|
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) > 0 && /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Your payment method will be charged immediately. You can cancel anytime." }),
|
|
1275
|
-
error && /* @__PURE__ */ jsx("div", { className: "bg-red-50 dark:bg-red-900/20
|
|
1275
|
+
error && /* @__PURE__ */ jsx("div", { className: "okt-alert-error bg-red-50 dark:bg-red-900/20 p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
|
|
1276
1276
|
/* @__PURE__ */ jsx("svg", { className: "w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }),
|
|
1277
1277
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-red-800 dark:text-red-200", children: error })
|
|
1278
1278
|
] }) }),
|
|
@@ -1327,7 +1327,7 @@ function BillingContent({
|
|
|
1327
1327
|
/* @__PURE__ */ jsx("span", { className: "text-gray-600 dark:text-gray-400", children: "Billing:" }),
|
|
1328
1328
|
/* @__PURE__ */ jsx("span", { className: "font-medium text-gray-900 dark:text-white", children: selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) === 0 ? "Free" : `${selectedPlan?.price}/${selectedPlan?.period}` })
|
|
1329
1329
|
] }),
|
|
1330
|
-
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) > 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm pt-2
|
|
1330
|
+
selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, "")) > 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm pt-2 okt-divider", children: [
|
|
1331
1331
|
/* @__PURE__ */ jsx("span", { className: "text-gray-600 dark:text-gray-400", children: "Status:" }),
|
|
1332
1332
|
/* @__PURE__ */ jsx("span", { className: "font-medium text-green-600 dark:text-green-400", children: "Active" })
|
|
1333
1333
|
] })
|
|
@@ -1348,5 +1348,5 @@ function BillingContent({
|
|
|
1348
1348
|
}
|
|
1349
1349
|
|
|
1350
1350
|
export { AddPaymentMethodForm, BillingContent, Modal };
|
|
1351
|
-
//# sourceMappingURL=chunk-
|
|
1352
|
-
//# sourceMappingURL=chunk-
|
|
1351
|
+
//# sourceMappingURL=chunk-MTFFRTQW.js.map
|
|
1352
|
+
//# sourceMappingURL=chunk-MTFFRTQW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/client/Modal/index.tsx","../src/components/client/AddPaymentMethodForm/index.tsx","../src/components/server/Billing/actions.ts","../src/components/client/BillingContent/index.tsx"],"names":["jsxs","jsx","useEffect","isDark","useState","Button"],"mappings":"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","file":"chunk-MTFFRTQW.js","sourcesContent":["'use client'\n\nimport { useEffect } from 'react'\n\nexport interface ModalProps {\n isOpen: boolean\n onClose: () => void\n title: string\n children: React.ReactNode\n className?: string\n}\n\nexport function Modal({ isOpen, onClose, title, children, className = '' }: ModalProps) {\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n document.body.style.overflow = 'hidden'\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = 'unset'\n }\n }, [isOpen, onClose])\n\n if (!isOpen) return null\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div\n className={`relative bg-white dark:bg-gray-900 rounded-lg shadow-xl max-w-md w-full max-h-[90vh] overflow-y-auto ${className}`}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-xl font-semibold\">{title}</h2>\n <button\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n {children}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect, useMemo } from 'react'\nimport { loadStripe, Stripe } from '@stripe/stripe-js'\nimport {\n Elements,\n PaymentElement,\n useStripe,\n useElements,\n} from '@stripe/react-stripe-js'\nimport { Button } from '@marcoschwartz/lite-ui'\n\ninterface PaymentFormProps {\n customerId: number\n onSuccess: () => void\n onCancel: () => void\n onSubmit: (stripePaymentMethodId: string, setAsDefault: boolean) => Promise<{ success: boolean; error?: string }>\n}\n\nfunction PaymentForm({ customerId, onSuccess, onCancel, onSubmit }: PaymentFormProps) {\n const stripe = useStripe()\n const elements = useElements()\n const [isProcessing, setIsProcessing] = useState(false)\n const [errorMessage, setErrorMessage] = useState<string | null>(null)\n const [setAsDefault, setSetAsDefault] = useState(false)\n\n // Suppress unused customerId warning - it's passed for future use\n void customerId\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!stripe || !elements) {\n return\n }\n\n setIsProcessing(true)\n setErrorMessage(null)\n\n try {\n // Submit the elements first (required by Stripe)\n const { error: submitError } = await elements.submit()\n\n if (submitError) {\n setErrorMessage(submitError.message || 'Failed to validate payment details')\n setIsProcessing(false)\n return\n }\n\n // Now create the payment method\n const { error, paymentMethod } = await stripe.createPaymentMethod({\n elements,\n })\n\n if (error) {\n setErrorMessage(error.message || 'Failed to create payment method')\n setIsProcessing(false)\n return\n }\n\n // Call the provided onSubmit handler to attach the payment method\n const result = await onSubmit(paymentMethod!.id, setAsDefault)\n\n if (!result.success) {\n throw new Error(result.error || 'Failed to add payment method')\n }\n\n onSuccess()\n } catch (error: unknown) {\n setErrorMessage(error instanceof Error ? error.message : String(error) || 'An error occurred')\n setIsProcessing(false)\n }\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <PaymentElement />\n\n {errorMessage && (\n <div className=\"text-red-600 dark:text-red-400 text-sm\">\n {errorMessage}\n </div>\n )}\n\n <div className=\"flex items-center gap-2 pt-2\">\n <input\n type=\"checkbox\"\n id=\"setDefault\"\n checked={setAsDefault}\n onChange={(e) => setSetAsDefault(e.target.checked)}\n className=\"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n />\n <label\n htmlFor=\"setDefault\"\n className=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n Set as default payment method\n </label>\n </div>\n\n <div className=\"flex gap-3 justify-end mt-6 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={onCancel}\n disabled={isProcessing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" disabled={!stripe || isProcessing}>\n {isProcessing ? 'Processing...' : 'Add Payment Method'}\n </Button>\n </div>\n </form>\n )\n}\n\nexport interface AddPaymentMethodFormProps {\n customerId: number\n stripePublishableKey: string\n onSuccess: () => void\n onCancel: () => void\n onSubmit: (stripePaymentMethodId: string, setAsDefault: boolean) => Promise<{ success: boolean; error?: string }>\n}\n\nexport function AddPaymentMethodForm({\n customerId,\n stripePublishableKey,\n onSuccess,\n onCancel,\n onSubmit,\n}: AddPaymentMethodFormProps) {\n const [stripePromise, setStripePromise] = useState<Promise<Stripe | null> | null>(null)\n const [theme, setTheme] = useState<'light' | 'dark'>('light')\n\n useEffect(() => {\n if (stripePublishableKey) {\n setStripePromise(loadStripe(stripePublishableKey))\n }\n }, [stripePublishableKey])\n\n useEffect(() => {\n // Check if dark mode is active\n const isDark = document.documentElement.classList.contains('dark') ||\n window.matchMedia('(prefers-color-scheme: dark)').matches\n setTheme(isDark ? 'dark' : 'light')\n\n // Listen for theme changes\n const observer = new MutationObserver(() => {\n const isDark = document.documentElement.classList.contains('dark')\n setTheme(isDark ? 'dark' : 'light')\n })\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n return () => observer.disconnect()\n }, [])\n\n const stripeOptions = useMemo(() => ({\n mode: 'setup' as const,\n currency: 'usd',\n paymentMethodCreation: 'manual' as const,\n appearance: {\n theme: theme === 'dark' ? ('night' as const) : ('stripe' as const),\n variables: {\n colorPrimary: '#3b82f6',\n colorBackground: theme === 'dark' ? '#1f2937' : '#ffffff',\n colorText: theme === 'dark' ? '#f9fafb' : '#1f2937',\n colorDanger: '#ef4444',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n spacingUnit: '4px',\n borderRadius: '6px',\n },\n },\n }), [theme])\n\n if (!stripePromise) {\n return (\n <div className=\"text-center py-8\">\n <p className=\"text-gray-600 dark:text-gray-400\">Loading...</p>\n </div>\n )\n }\n\n return (\n <Elements stripe={stripePromise} options={stripeOptions}>\n <PaymentForm\n customerId={customerId}\n onSuccess={onSuccess}\n onCancel={onCancel}\n onSubmit={onSubmit}\n />\n </Elements>\n )\n}\n\nexport default AddPaymentMethodForm\n","'use server';\n\n/**\n * Billing Server Actions\n *\n * Server actions for billing mutations (add payment method, subscribe, cancel, etc.)\n * These actions can be called from client components.\n */\n\nimport type { PaymentMethod, Subscription, Customer, CustomerAddress } from './types';\n\ninterface ActionConfig {\n baseUrl: string;\n apiKey?: string;\n accessToken?: string;\n projectId: number;\n}\n\ninterface ActionResult<T = void> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nfunction createHeaders(config: ActionConfig): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json'\n };\n\n if (config.accessToken) {\n headers['Authorization'] = `Bearer ${config.accessToken}`;\n }\n\n if (config.apiKey) {\n headers['X-API-Key'] = config.apiKey;\n }\n\n return headers;\n}\n\nasync function fetchAPI<T>(\n config: ActionConfig,\n url: string,\n options: RequestInit = {}\n): Promise<{ success: boolean; data?: T; error?: string }> {\n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n ...createHeaders(config),\n ...options.headers as Record<string, string>,\n },\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'API request failed'\n };\n }\n}\n\n/**\n * Add a payment method for a customer\n */\nexport async function addPaymentMethod(\n config: ActionConfig,\n customerId: number,\n stripePaymentMethodId: string,\n setAsDefault: boolean = false\n): Promise<ActionResult<PaymentMethod>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<PaymentMethod>(\n config,\n `${baseUrl}/billing/customers/${customerId}/payment-methods`,\n {\n method: 'POST',\n body: JSON.stringify({\n project_id: projectId,\n type: 'card',\n stripe_payment_method_id: stripePaymentMethodId,\n set_as_default: setAsDefault\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to add payment method' };\n }\n\n return { success: true, data: result.data };\n}\n\n/**\n * Remove a payment method\n */\nexport async function removePaymentMethod(\n config: ActionConfig,\n customerId: number,\n paymentMethodId: string\n): Promise<ActionResult> {\n const { baseUrl, projectId } = config;\n\n const isStripeId = paymentMethodId.startsWith('pm_');\n const idType = isStripeId ? 'stripe' : 'database';\n\n const result = await fetchAPI(\n config,\n `${baseUrl}/billing/payment-methods/${paymentMethodId}`,\n {\n method: 'DELETE',\n body: JSON.stringify({\n customer_id: customerId,\n project_id: projectId,\n id_type: idType,\n test_mode: true\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to remove payment method' };\n }\n\n return { success: true };\n}\n\n/**\n * Set a payment method as default\n */\nexport async function setDefaultPaymentMethod(\n config: ActionConfig,\n customerId: number,\n paymentMethodId: string\n): Promise<ActionResult> {\n const { baseUrl, projectId } = config;\n\n const isStripeId = paymentMethodId.startsWith('pm_');\n const idType = isStripeId ? 'stripe' : 'database';\n\n const result = await fetchAPI(\n config,\n `${baseUrl}/billing/payment-methods/${paymentMethodId}`,\n {\n method: 'PUT',\n body: JSON.stringify({\n customer_id: customerId,\n project_id: projectId,\n id_type: idType,\n is_default: true,\n test_mode: true\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to set default payment method' };\n }\n\n return { success: true };\n}\n\n/**\n * Create a subscription\n * Tax is calculated server-side by the create-subscription function\n */\nexport async function createSubscription(\n config: ActionConfig,\n customerId: number,\n priceId: number,\n paymentMethodId?: string\n): Promise<ActionResult<Subscription>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<Subscription>(\n config,\n `${baseUrl}/billing/subscriptions`,\n {\n method: 'POST',\n body: JSON.stringify({\n customer_id: customerId,\n price_id: priceId,\n payment_method_id: paymentMethodId || undefined,\n project_id: projectId,\n sync_to_stripe: true,\n test_mode: true\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to create subscription' };\n }\n\n return { success: true, data: result.data };\n}\n\n/**\n * Cancel a subscription\n */\nexport async function cancelSubscription(\n config: ActionConfig,\n subscriptionId: number,\n cancelAtPeriodEnd: boolean = true\n): Promise<ActionResult> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI(\n config,\n `${baseUrl}/billing/subscriptions/${subscriptionId}/cancel`,\n {\n method: 'POST',\n body: JSON.stringify({\n project_id: projectId,\n cancel_at_period_end: cancelAtPeriodEnd,\n cancellation_reason: 'requested'\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to cancel subscription' };\n }\n\n return { success: true };\n}\n\n/**\n * Update subscription (change plan)\n */\nexport async function updateSubscription(\n config: ActionConfig,\n subscriptionId: number,\n newPriceId: number\n): Promise<ActionResult<Subscription>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<Subscription>(\n config,\n `${baseUrl}/billing/subscriptions/${subscriptionId}`,\n {\n method: 'PUT',\n body: JSON.stringify({\n project_id: projectId,\n price_id: newPriceId,\n sync_to_stripe: true\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to update subscription' };\n }\n\n return { success: true, data: result.data };\n}\n\n/**\n * Resume a canceled subscription\n */\nexport async function resumeSubscription(\n config: ActionConfig,\n subscriptionId: number\n): Promise<ActionResult<Subscription>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<Subscription>(\n config,\n `${baseUrl}/billing/subscriptions/${subscriptionId}/resume`,\n {\n method: 'POST',\n body: JSON.stringify({\n project_id: projectId\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to resume subscription' };\n }\n\n return { success: true, data: result.data };\n}\n\n/**\n * Fetch payment configuration (Stripe publishable key)\n */\nexport async function fetchPaymentConfig(\n config: ActionConfig\n): Promise<ActionResult<{ public_key: string; mode: string }>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<{ public_key: string; mode: string }>(\n config,\n `${baseUrl}/billing/payment-config?project_id=${projectId}&test_mode=true`\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to fetch payment configuration' };\n }\n\n return { success: true, data: result.data };\n}\n\n/**\n * Tax calculation result\n */\nexport interface TaxCalculation {\n tax_rate: number;\n tax_amount: number;\n tax_type: string;\n tax_label: string;\n jurisdiction: string;\n reverse_charge: boolean;\n customer_country?: string;\n seller_country?: string;\n subtotal: number;\n total: number;\n reason?: string;\n}\n\n/**\n * Calculate tax for a transaction based on customer location\n */\nexport async function calculateTax(\n config: ActionConfig,\n params: {\n customer_id?: number;\n country_code?: string;\n amount: number;\n product_type?: 'digital' | 'physical' | 'service';\n customer_tax_id?: string;\n }\n): Promise<ActionResult<TaxCalculation>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<TaxCalculation>(\n config,\n `${baseUrl}/billing/tax/calculate`,\n {\n method: 'POST',\n body: JSON.stringify({\n project_id: projectId,\n ...params\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to calculate tax' };\n }\n\n return { success: true, data: result.data };\n}\n\n/**\n * Customer update data\n */\nexport interface CustomerUpdateData {\n name?: string;\n email?: string;\n phone?: string;\n currency?: string;\n address?: CustomerAddress;\n customer_type?: 'individual' | 'business';\n company_name?: string;\n vat_number?: string;\n tax_id_type?: string;\n tax_id_value?: string;\n}\n\n/**\n * Update customer information\n */\nexport async function updateCustomer(\n config: ActionConfig,\n customerId: number,\n data: CustomerUpdateData\n): Promise<ActionResult<Customer>> {\n const { baseUrl, projectId } = config;\n\n const result = await fetchAPI<Customer>(\n config,\n `${baseUrl}/billing/customers/${customerId}`,\n {\n method: 'PUT',\n body: JSON.stringify({\n project_id: projectId,\n ...data\n })\n }\n );\n\n if (!result.success) {\n return { success: false, error: result.error || 'Failed to update customer' };\n }\n\n return { success: true, data: result.data };\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { Button, Tabs, Card, TextInput, Select, Radio } from '@marcoschwartz/lite-ui'\nimport { useRouter } from 'next/navigation'\nimport './styles.css'\nimport {\n removePaymentMethod,\n setDefaultPaymentMethod,\n createSubscription,\n cancelSubscription,\n addPaymentMethod,\n fetchPaymentConfig,\n calculateTax,\n updateCustomer,\n type TaxCalculation,\n type CustomerUpdateData\n} from '../../server/Billing/actions'\nimport type { Customer, PaymentMethod, Entitlement, FeatureUsage } from '../../server/Billing/types'\nimport { Modal } from '../Modal'\nimport { AddPaymentMethodForm } from '../AddPaymentMethodForm'\n\n// Usage bar component for displaying entitlement limits (like apteva-app)\nfunction UsageBar({ label, used, limit, unit = \"\" }: { label: string; used: number; limit: number; unit?: string }) {\n const percentage = limit > 0 ? (used / limit) * 100 : 0;\n const isWarning = percentage > 80;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-700 dark:text-gray-300\">{label}</span>\n <span className=\"text-gray-600 dark:text-gray-400\">\n {used.toLocaleString()}{unit} / {limit.toLocaleString()}{unit}\n </span>\n </div>\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2\">\n <div\n className={`h-2 rounded-full transition-all ${\n isWarning ? 'bg-yellow-500' : 'bg-blue-600'\n }`}\n style={{ width: `${Math.min(percentage, 100)}%` }}\n />\n </div>\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n {percentage.toFixed(1)}% used\n </div>\n </div>\n );\n}\n\ninterface ActionConfig {\n baseUrl: string;\n apiKey?: string;\n accessToken?: string;\n projectId: number;\n}\n\ninterface SubscriptionDisplay {\n id: number;\n plan: string;\n status: string;\n price: string;\n period: string;\n nextBilling: string;\n cancelAtPeriodEnd?: boolean;\n}\n\ninterface InvoiceDisplay {\n id: string;\n date: string;\n amount: string;\n status: string;\n url: string;\n}\n\ninterface PlanDisplay {\n id: number;\n priceId: number;\n name: string;\n description?: string;\n price: string;\n period: string;\n features: string[];\n current: boolean;\n popular?: boolean;\n}\n\ninterface BillingContentProps {\n subscription: SubscriptionDisplay | null;\n invoices: InvoiceDisplay[];\n paymentMethods: PaymentMethod[];\n plans: PlanDisplay[];\n customer: Customer;\n entitlements: Entitlement[];\n featureUsage: Record<string, FeatureUsage>;\n actionConfig: ActionConfig;\n initialTaxInfo?: TaxCalculation | null;\n className?: string;\n}\n\nexport function BillingContent({\n subscription,\n invoices,\n paymentMethods,\n plans,\n customer,\n featureUsage,\n actionConfig,\n initialTaxInfo,\n className = ''\n}: BillingContentProps) {\n const router = useRouter();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // Tab state - use key to force re-render when switching programmatically\n const [activeTabIndex, setActiveTabIndex] = useState(0);\n\n // Modal states\n const [isAddPaymentModalOpen, setIsAddPaymentModalOpen] = useState(false);\n const [isRemovePaymentModalOpen, setIsRemovePaymentModalOpen] = useState(false);\n const [isCancelModalOpen, setIsCancelModalOpen] = useState(false);\n const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] = useState<PaymentMethod | null>(null);\n const [selectedPlan, setSelectedPlan] = useState<PlanDisplay | null>(null);\n const [selectedUpgradePaymentMethod, setSelectedUpgradePaymentMethod] = useState<number | null>(null);\n const [stripePublishableKey, setStripePublishableKey] = useState<string | null>(null);\n const [stripeLoading, setStripeLoading] = useState(false);\n const [isUpgrading, setIsUpgrading] = useState(false);\n const [upgradeSuccess, setUpgradeSuccess] = useState(false);\n // Initialize with server-side tax info if provided\n const [taxInfo, setTaxInfo] = useState<TaxCalculation | null>(initialTaxInfo || null);\n const [taxLoading, setTaxLoading] = useState(false);\n\n // Preferences form state\n const [preferencesForm, setPreferencesForm] = useState({\n name: customer.name || '',\n email: customer.email || '',\n phone: customer.phone || '',\n customer_type: customer.customer_type || 'individual' as 'individual' | 'business',\n company_name: customer.company_name || '',\n vat_number: customer.vat_number || '',\n address_line1: customer.address?.line1 || '',\n address_line2: customer.address?.line2 || '',\n address_city: customer.address?.city || '',\n address_state: customer.address?.state || '',\n address_postal_code: customer.address?.postal_code || '',\n address_country: customer.address?.country || '',\n });\n const [preferencesSaving, setPreferencesSaving] = useState(false);\n const [preferencesSuccess, setPreferencesSuccess] = useState(false);\n\n // Fetch Stripe publishable key on mount\n useEffect(() => {\n async function loadStripeConfig() {\n setStripeLoading(true);\n try {\n const result = await fetchPaymentConfig(actionConfig);\n if (result.success && result.data?.public_key) {\n setStripePublishableKey(result.data.public_key);\n }\n } catch (err) {\n console.error('Failed to load Stripe config:', err);\n } finally {\n setStripeLoading(false);\n }\n }\n loadStripeConfig();\n }, [actionConfig]);\n\n const handleCancelSubscription = async () => {\n if (!subscription) return;\n\n setIsLoading(true);\n setError(null);\n\n const result = await cancelSubscription(actionConfig, subscription.id);\n\n if (!result.success) {\n setError(result.error || 'Failed to cancel subscription');\n } else {\n setSuccess('Subscription will be canceled at the end of the billing period');\n setIsCancelModalOpen(false);\n }\n\n setIsLoading(false);\n };\n\n const handleAddPaymentMethod = async (stripePaymentMethodId: string, setAsDefault: boolean) => {\n const result = await addPaymentMethod(actionConfig, customer.id, stripePaymentMethodId, setAsDefault);\n return result;\n };\n\n const handleAddPaymentSuccess = () => {\n setIsAddPaymentModalOpen(false);\n setSuccess('Payment method added successfully');\n router.refresh();\n };\n\n const handleRemovePaymentClick = (pm: PaymentMethod) => {\n setSelectedPaymentMethod(pm);\n setIsRemovePaymentModalOpen(true);\n };\n\n const handleConfirmRemovePayment = async () => {\n if (!selectedPaymentMethod) return;\n\n setIsLoading(true);\n setError(null);\n\n // Use Stripe payment method ID if available, otherwise use database ID\n const paymentMethodId = selectedPaymentMethod.provider_payment_method_id || String(selectedPaymentMethod.id);\n const result = await removePaymentMethod(actionConfig, customer.id, paymentMethodId);\n\n if (!result.success) {\n setError(result.error || 'Failed to remove payment method');\n } else {\n setSuccess('Payment method removed');\n setIsRemovePaymentModalOpen(false);\n setSelectedPaymentMethod(null);\n router.refresh();\n }\n\n setIsLoading(false);\n };\n\n // Open upgrade modal when selecting a plan\n const handleSelectPlan = async (plan: PlanDisplay) => {\n if (plan.current || !plan.priceId) return;\n\n setSelectedPlan(plan);\n setIsUpgradeModalOpen(true);\n setError(null);\n\n // Pre-select default payment method if plan is paid\n const priceNum = parseFloat(plan.price.replace(/[^0-9.]/g, '')) || 0;\n if (priceNum > 0) {\n const defaultPaymentMethod = paymentMethods.find((pm) => pm.is_default);\n setSelectedUpgradePaymentMethod(defaultPaymentMethod?.id || null);\n\n const amountInCents = Math.round(priceNum * 100);\n\n // Use server-side tax rate for immediate estimate while API call is pending\n if (initialTaxInfo && initialTaxInfo.tax_rate > 0) {\n const estimatedTax = Math.round(amountInCents * initialTaxInfo.tax_rate / 100);\n setTaxInfo({\n ...initialTaxInfo,\n tax_amount: estimatedTax,\n subtotal: amountInCents,\n total: amountInCents + estimatedTax\n });\n } else {\n setTaxInfo(null);\n }\n\n // Fetch precise tax from API (will update the estimate)\n setTaxLoading(true);\n try {\n const taxResult = await calculateTax(actionConfig, {\n customer_id: customer.id,\n amount: amountInCents,\n product_type: 'digital'\n });\n\n if (taxResult.success && taxResult.data) {\n setTaxInfo(taxResult.data);\n }\n } catch (err) {\n console.error('Failed to calculate tax:', err);\n } finally {\n setTaxLoading(false);\n }\n } else {\n setSelectedUpgradePaymentMethod(null);\n setTaxInfo(null);\n }\n };\n\n // Confirm and process the upgrade\n // Always use createSubscription - it handles both new subscriptions and plan changes\n // (the backend cancels old subscription and creates new one)\n const handleConfirmUpgrade = async () => {\n if (!selectedPlan) return;\n\n const priceNum = parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) || 0;\n\n // For paid plans, require payment method if available\n if (priceNum > 0 && !selectedUpgradePaymentMethod && paymentMethods.length > 0) {\n setError('Please select a payment method');\n return;\n }\n\n setIsUpgrading(true);\n setError(null);\n\n try {\n // Always use createSubscription - backend handles canceling old subscription\n // Tax is calculated server-side in create-subscription function\n const paymentMethodId = selectedUpgradePaymentMethod\n ? paymentMethods.find(pm => pm.id === selectedUpgradePaymentMethod)?.provider_payment_method_id || String(selectedUpgradePaymentMethod)\n : undefined;\n\n const result = await createSubscription(\n actionConfig,\n customer.id,\n selectedPlan.priceId,\n paymentMethodId\n );\n if (!result.success) {\n setError(result.error || 'Failed to create subscription');\n setIsUpgrading(false);\n return;\n }\n\n // Success\n setIsUpgradeModalOpen(false);\n setUpgradeSuccess(true);\n router.refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An error occurred');\n } finally {\n setIsUpgrading(false);\n }\n };\n\n const handleCloseSuccessModal = () => {\n setUpgradeSuccess(false);\n setSelectedPlan(null);\n setSelectedUpgradePaymentMethod(null);\n setTaxInfo(null);\n };\n\n // Save preferences\n const handleSavePreferences = async () => {\n setPreferencesSaving(true);\n setError(null);\n setPreferencesSuccess(false);\n\n try {\n const updateData: CustomerUpdateData = {\n name: preferencesForm.name || undefined,\n email: preferencesForm.email || undefined,\n phone: preferencesForm.phone || undefined,\n customer_type: preferencesForm.customer_type,\n company_name: preferencesForm.customer_type === 'business' ? preferencesForm.company_name : undefined,\n vat_number: preferencesForm.vat_number || undefined,\n address: {\n line1: preferencesForm.address_line1 || undefined,\n line2: preferencesForm.address_line2 || undefined,\n city: preferencesForm.address_city || undefined,\n state: preferencesForm.address_state || undefined,\n postal_code: preferencesForm.address_postal_code || undefined,\n country: preferencesForm.address_country || undefined,\n },\n };\n\n const result = await updateCustomer(actionConfig, customer.id, updateData);\n\n if (!result.success) {\n setError(result.error || 'Failed to save preferences');\n } else {\n setPreferencesSuccess(true);\n router.refresh();\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An error occurred');\n } finally {\n setPreferencesSaving(false);\n }\n };\n\n const handleSetDefaultPaymentMethod = async (pm: PaymentMethod) => {\n setIsLoading(true);\n setError(null);\n\n // Use Stripe payment method ID if available, otherwise use database ID\n const paymentMethodId = pm.provider_payment_method_id || String(pm.id);\n const result = await setDefaultPaymentMethod(actionConfig, customer.id, paymentMethodId);\n\n if (!result.success) {\n setError(result.error || 'Failed to set default payment method');\n } else {\n setSuccess('Default payment method updated');\n router.refresh();\n }\n\n setIsLoading(false);\n };\n\n // Switch to Plans tab when Change Plan is clicked\n const handleChangePlanClick = () => {\n setActiveTabIndex(1); // Plans is index 1\n };\n\n const tabs = [\n {\n id: 'subscription',\n label: 'Subscription',\n content: (\n <div className=\"space-y-6 mt-6\">\n {/* Status Messages */}\n {error && (\n <div className=\"p-4 bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 rounded-lg\">\n {error}\n </div>\n )}\n {success && (\n <div className=\"p-4 bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 rounded-lg\">\n {success}\n </div>\n )}\n\n {/* Current Plan */}\n <Card>\n <div>\n <div className=\"flex items-start justify-between mb-4\">\n <div>\n <h3 className=\"text-lg font-semibold mb-2\">Current Plan</h3>\n {subscription ? (\n <>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-3xl font-bold\">{subscription.price}</span>\n <span className=\"text-gray-600 dark:text-gray-400\">/ {subscription.period}</span>\n </div>\n <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">\n {subscription.plan}\n </p>\n </>\n ) : (\n <p className=\"text-gray-600 dark:text-gray-400\">No active subscription</p>\n )}\n </div>\n {subscription && (\n <span className={`inline-flex items-center rounded-full px-3 py-1 text-sm font-medium ${\n subscription.status === 'active'\n ? 'bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300'\n : subscription.status === 'canceled'\n ? 'bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300'\n : 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300'\n }`}>\n {subscription.cancelAtPeriodEnd ? 'Canceling' : subscription.status}\n </span>\n )}\n </div>\n\n {subscription && (\n <div className=\"space-y-3 mb-4\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400\">Next billing date</span>\n <span className=\"font-medium\">{subscription.nextBilling}</span>\n </div>\n </div>\n )}\n\n <div className=\"flex gap-3\">\n <Button className=\"flex-1\" disabled={isLoading} onClick={handleChangePlanClick}>\n {subscription ? 'Change Plan' : 'Choose a Plan'}\n </Button>\n {subscription && !subscription.cancelAtPeriodEnd && (\n <Button\n variant=\"secondary\"\n onClick={() => setIsCancelModalOpen(true)}\n disabled={isLoading}\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n </Card>\n\n {/* Feature Usage */}\n {Object.keys(featureUsage).length > 0 && (\n <Card>\n <h3 className=\"text-lg font-semibold mb-4\">Current Usage</h3>\n <div className=\"space-y-4\">\n {Object.values(featureUsage).map((usage) => {\n // Format feature name\n const featureName = usage.feature_name || usage.feature_key\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c: string) => c.toUpperCase());\n\n // If it has a numeric limit > 0, show as progress bar\n if (usage.limit > 0) {\n return (\n <UsageBar\n key={usage.feature_key}\n label={featureName}\n used={usage.current_usage}\n limit={usage.limit}\n unit={usage.unit ? ` ${usage.unit}` : ''}\n />\n );\n }\n\n // For boolean/unlimited features, show as simple row\n const isEnabled = usage.feature_type === 'boolean' || usage.limit === 0;\n\n return (\n <div key={usage.feature_key} className=\"flex justify-between items-center text-sm\">\n <span className=\"text-gray-700 dark:text-gray-300\">{featureName}</span>\n {isEnabled ? (\n <span className=\"flex items-center gap-1.5 text-green-600 dark:text-green-400\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n Included\n </span>\n ) : (\n <span className=\"flex items-center gap-1.5 text-gray-400 dark:text-gray-500\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n Not included\n </span>\n )}\n </div>\n );\n })}\n </div>\n </Card>\n )}\n </div>\n ),\n },\n {\n id: 'plans',\n label: 'Plans',\n content: (\n <div className=\"space-y-6 mt-6\">\n <div>\n <h3 className=\"text-lg font-semibold mb-2\">Choose Your Plan</h3>\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-6\">\n Select the plan that best fits your needs. You can upgrade or downgrade at any time.\n </p>\n </div>\n\n {plans.length === 0 ? (\n <p className=\"text-gray-500 dark:text-gray-400\">No plans available.</p>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n {plans.map((plan) => (\n <div\n key={plan.id}\n className={`okt-plan-card relative p-6 flex flex-col ${\n plan.current\n ? 'okt-plan-card-selected'\n : 'okt-plan-card-default'\n } ${plan.popular ? 'shadow-lg' : ''}`}\n >\n {plan.popular && !plan.current && (\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <span className=\"bg-blue-600 text-white text-xs font-semibold px-3 py-1 rounded-full\">\n Most Popular\n </span>\n </div>\n )}\n {plan.current && (\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <span className=\"bg-green-600 text-white text-xs font-semibold px-3 py-1 rounded-full\">\n Current Plan\n </span>\n </div>\n )}\n\n <div className=\"mb-6\">\n <h4 className=\"text-xl font-bold mb-2\">{plan.name}</h4>\n {plan.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">{plan.description}</p>\n )}\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-3xl font-bold\">{plan.price}</span>\n <span className=\"text-gray-600 dark:text-gray-400\">/ {plan.period}</span>\n </div>\n </div>\n\n <ul className=\"space-y-3 mb-6 flex-1\">\n {plan.features.map((feature, idx) => (\n <li key={idx} className=\"flex items-start gap-2 text-sm\">\n <svg\n className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n <span className=\"text-gray-700 dark:text-gray-300\">{feature}</span>\n </li>\n ))}\n </ul>\n\n <Button\n className=\"w-full\"\n disabled={plan.current || isLoading}\n variant={plan.current ? 'secondary' : 'primary'}\n onClick={() => handleSelectPlan(plan)}\n >\n {plan.current ? 'Current Plan' : subscription ? 'Switch Plan' : 'Select Plan'}\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n ),\n },\n {\n id: 'invoices',\n label: 'Invoices',\n content: (\n <div className=\"mt-6\">\n <Card>\n <h3 className=\"text-lg font-semibold mb-2\">Invoice History</h3>\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-6\">\n View and download your past invoices\n </p>\n\n {invoices.length === 0 ? (\n <p className=\"text-gray-500 dark:text-gray-400\">No invoices yet.</p>\n ) : (\n <div className=\"space-y-3\">\n {invoices.map((invoice) => (\n <div key={invoice.id} className=\"okt-card-border flex items-center justify-between p-4 transition-colors\">\n <div className=\"flex items-center gap-4\">\n <div className=\"h-10 w-10 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center\">\n <svg className=\"w-5 h-5 text-blue-600 dark:text-blue-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium text-sm\">{invoice.id}</p>\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${\n invoice.status === 'paid'\n ? 'bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300'\n : invoice.status === 'open'\n ? 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300'\n : 'bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-300'\n }`}>\n {invoice.status}\n </span>\n </div>\n <p className=\"text-xs text-gray-600 dark:text-gray-400\">{invoice.date}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n <p className=\"font-semibold\">{invoice.amount}</p>\n {invoice.url && invoice.url !== '#' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => window.open(invoice.url, '_blank')}\n >\n Download\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </Card>\n </div>\n ),\n },\n {\n id: 'payment',\n label: 'Payment Method',\n content: (\n <div className=\"mt-6\">\n <Card>\n <h3 className=\"text-lg font-semibold mb-2\">Payment Methods</h3>\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-6\">\n Manage your payment methods\n </p>\n\n {paymentMethods.length === 0 ? (\n <div className=\"okt-empty-border text-center py-8\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-4\">No payment methods on file</p>\n <Button onClick={() => setIsAddPaymentModalOpen(true)} disabled={stripeLoading}>\n {stripeLoading ? 'Loading...' : 'Add Payment Method'}\n </Button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {paymentMethods.map((pm) => (\n <div key={pm.id} className=\"okt-card-border flex items-center justify-between p-4\">\n <div className=\"flex items-center gap-4\">\n <div className=\"h-10 w-10 rounded-full bg-gray-100 dark:bg-neutral-800 flex items-center justify-center\">\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium text-sm\">\n {pm.card_brand || pm.type} •••• {pm.card_last4 || pm.bank_last4 || '****'}\n </p>\n {pm.is_default && (\n <span className=\"inline-flex items-center rounded-full bg-blue-100 dark:bg-blue-900/30 px-2 py-0.5 text-xs font-medium text-blue-800 dark:text-blue-300\">\n Default\n </span>\n )}\n </div>\n {pm.card_exp_month && pm.card_exp_year && (\n <p className=\"text-xs text-gray-600 dark:text-gray-400\">\n Expires {pm.card_exp_month}/{pm.card_exp_year}\n </p>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {!pm.is_default && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => handleSetDefaultPaymentMethod(pm)}\n disabled={isLoading}\n >\n Set Default\n </Button>\n )}\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => handleRemovePaymentClick(pm)}\n disabled={isLoading}\n >\n Remove\n </Button>\n </div>\n </div>\n ))}\n\n <Button\n variant=\"secondary\"\n className=\"w-full mt-4\"\n onClick={() => setIsAddPaymentModalOpen(true)}\n disabled={stripeLoading}\n >\n {stripeLoading ? 'Loading...' : 'Add Payment Method'}\n </Button>\n </div>\n )}\n </Card>\n </div>\n ),\n },\n {\n id: 'preferences',\n label: 'Preferences',\n content: (\n <div className=\"mt-6\">\n <Card>\n <h3 className=\"text-lg font-semibold mb-2\">Billing Preferences</h3>\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-6\">\n Manage your billing information and tax settings\n </p>\n\n {/* Success message */}\n {preferencesSuccess && (\n <div className=\"p-4 mb-6 bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 rounded-lg\">\n Preferences saved successfully\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* Customer Type */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n Customer Type\n </label>\n <Radio\n name=\"customer_type\"\n options={[\n { value: 'individual', label: 'Individual' },\n { value: 'business', label: 'Business' }\n ]}\n value={preferencesForm.customer_type}\n onChange={(value) => setPreferencesForm({ ...preferencesForm, customer_type: value as 'individual' | 'business' })}\n orientation=\"horizontal\"\n />\n </div>\n\n {/* Basic Info */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <TextInput\n label={preferencesForm.customer_type === 'business' ? 'Contact Name' : 'Full Name'}\n value={preferencesForm.name}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, name: e.target.value })}\n placeholder=\"John Doe\"\n />\n <TextInput\n label=\"Email\"\n type=\"email\"\n value={preferencesForm.email}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, email: e.target.value })}\n placeholder=\"john@example.com\"\n />\n <TextInput\n label=\"Phone\"\n type=\"tel\"\n value={preferencesForm.phone}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, phone: e.target.value })}\n placeholder=\"+1 555 123 4567\"\n />\n {preferencesForm.customer_type === 'business' && (\n <TextInput\n label=\"Company Name\"\n value={preferencesForm.company_name}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, company_name: e.target.value })}\n placeholder=\"Acme Inc.\"\n />\n )}\n </div>\n\n {/* VAT Number (for business) */}\n {preferencesForm.customer_type === 'business' && (\n <TextInput\n label=\"VAT Number\"\n value={preferencesForm.vat_number}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, vat_number: e.target.value })}\n placeholder=\"EU123456789\"\n helperText=\"For EU businesses, provide your VAT ID to enable reverse charge\"\n />\n )}\n\n {/* Address */}\n <div>\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-3\">Billing Address</h4>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"md:col-span-2\">\n <TextInput\n label=\"Address Line 1\"\n value={preferencesForm.address_line1}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, address_line1: e.target.value })}\n placeholder=\"123 Main Street\"\n />\n </div>\n <div className=\"md:col-span-2\">\n <TextInput\n label=\"Address Line 2\"\n value={preferencesForm.address_line2}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, address_line2: e.target.value })}\n placeholder=\"Apt 4B\"\n />\n </div>\n <TextInput\n label=\"City\"\n value={preferencesForm.address_city}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, address_city: e.target.value })}\n placeholder=\"New York\"\n />\n <TextInput\n label=\"State / Region\"\n value={preferencesForm.address_state}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, address_state: e.target.value })}\n placeholder=\"NY\"\n />\n <TextInput\n label=\"Postal Code\"\n value={preferencesForm.address_postal_code}\n onChange={(e) => setPreferencesForm({ ...preferencesForm, address_postal_code: e.target.value })}\n placeholder=\"10001\"\n />\n <Select\n label=\"Country\"\n value={preferencesForm.address_country}\n onChange={(value) => setPreferencesForm({ ...preferencesForm, address_country: value })}\n searchable={true}\n searchPlaceholder=\"Search countries...\"\n options={[\n { value: '', label: 'Select country' },\n { value: 'US', label: 'United States' },\n { value: 'CA', label: 'Canada' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'ES', label: 'Spain' },\n { value: 'IT', label: 'Italy' },\n { value: 'NL', label: 'Netherlands' },\n { value: 'BE', label: 'Belgium' },\n { value: 'AT', label: 'Austria' },\n { value: 'CH', label: 'Switzerland' },\n { value: 'SE', label: 'Sweden' },\n { value: 'NO', label: 'Norway' },\n { value: 'DK', label: 'Denmark' },\n { value: 'FI', label: 'Finland' },\n { value: 'IE', label: 'Ireland' },\n { value: 'PT', label: 'Portugal' },\n { value: 'PL', label: 'Poland' },\n { value: 'CZ', label: 'Czech Republic' },\n { value: 'AU', label: 'Australia' },\n { value: 'NZ', label: 'New Zealand' },\n { value: 'SG', label: 'Singapore' },\n { value: 'JP', label: 'Japan' },\n { value: 'KR', label: 'South Korea' },\n { value: 'IN', label: 'India' },\n { value: 'BR', label: 'Brazil' },\n { value: 'MX', label: 'Mexico' },\n ]}\n />\n </div>\n </div>\n\n {/* Tax info display */}\n {initialTaxInfo && (\n <div className=\"p-4 bg-gray-50 dark:bg-neutral-800 rounded-lg\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">Tax Information</h4>\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n <p>Jurisdiction: {initialTaxInfo.jurisdiction}</p>\n <p>Tax Type: {initialTaxInfo.tax_label}</p>\n <p>Tax Rate: {initialTaxInfo.tax_rate}%</p>\n {initialTaxInfo.reverse_charge && (\n <p className=\"text-blue-600 dark:text-blue-400\">Reverse charge applies</p>\n )}\n </div>\n </div>\n )}\n\n {/* Save Button */}\n <div className=\"okt-divider flex justify-end pt-4\">\n <Button\n onClick={handleSavePreferences}\n disabled={preferencesSaving}\n >\n {preferencesSaving ? 'Saving...' : 'Save Preferences'}\n </Button>\n </div>\n </div>\n </Card>\n </div>\n ),\n },\n ]\n\n return (\n <div className={`okt-billing ${className}`}>\n <Tabs key={activeTabIndex} tabs={tabs} defaultIndex={activeTabIndex} onChange={setActiveTabIndex} />\n\n {/* Add Payment Method Modal */}\n <Modal\n isOpen={isAddPaymentModalOpen}\n onClose={() => setIsAddPaymentModalOpen(false)}\n title=\"Add Payment Method\"\n >\n {stripePublishableKey ? (\n <AddPaymentMethodForm\n customerId={customer.id}\n stripePublishableKey={stripePublishableKey}\n onSuccess={handleAddPaymentSuccess}\n onCancel={() => setIsAddPaymentModalOpen(false)}\n onSubmit={handleAddPaymentMethod}\n />\n ) : (\n <div className=\"text-center py-8\">\n <p className=\"text-gray-600 dark:text-gray-400\">\n {stripeLoading ? 'Loading payment form...' : 'Payment configuration not available'}\n </p>\n </div>\n )}\n </Modal>\n\n {/* Remove Payment Method Modal */}\n <Modal\n isOpen={isRemovePaymentModalOpen}\n onClose={() => {\n setIsRemovePaymentModalOpen(false);\n setSelectedPaymentMethod(null);\n }}\n title=\"Remove Payment Method\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-gray-600 dark:text-gray-400\">\n Are you sure you want to remove this payment method?\n </p>\n\n {selectedPaymentMethod && (\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-12 h-8 bg-gradient-to-br from-indigo-500 to-purple-600 rounded-lg flex items-center justify-center flex-shrink-0\">\n <svg className=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n </div>\n <div>\n <p className=\"font-semibold text-gray-900 dark:text-white\">\n {selectedPaymentMethod.card_brand || 'Card'}\n </p>\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n •••• •••• •••• {selectedPaymentMethod.card_last4 || '****'}\n </p>\n </div>\n </div>\n </div>\n )}\n\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n This action cannot be undone.\n </p>\n\n <div className=\"flex gap-3 justify-end mt-6 pt-4 okt-divider\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsRemovePaymentModalOpen(false);\n setSelectedPaymentMethod(null);\n }}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={handleConfirmRemovePayment}\n disabled={isLoading}\n >\n {isLoading ? 'Removing...' : 'Remove Payment Method'}\n </Button>\n </div>\n </div>\n </Modal>\n\n {/* Cancel Subscription Modal */}\n <Modal\n isOpen={isCancelModalOpen}\n onClose={() => setIsCancelModalOpen(false)}\n title=\"Cancel Subscription\"\n >\n <div className=\"space-y-4\">\n <div className=\"okt-alert-warning flex items-start gap-3 bg-yellow-50 dark:bg-yellow-900/20 p-4\">\n <svg className=\"w-6 h-6 text-yellow-600 dark:text-yellow-400 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n <div>\n <p className=\"font-medium text-yellow-900 dark:text-yellow-100 mb-1\">\n Are you sure you want to cancel?\n </p>\n <p className=\"text-sm text-yellow-800 dark:text-yellow-200\">\n You'll lose access to premium features when your current billing period ends.\n </p>\n </div>\n </div>\n\n {subscription && (\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400\">Current Plan:</span>\n <span className=\"font-medium\">{subscription.plan}</span>\n </div>\n <div className=\"flex justify-between text-sm mt-2\">\n <span className=\"text-gray-600 dark:text-gray-400\">Access Until:</span>\n <span className=\"font-medium\">{subscription.nextBilling}</span>\n </div>\n </div>\n )}\n\n <div className=\"flex gap-3 justify-end mt-6 pt-4 okt-divider\">\n <Button\n variant=\"secondary\"\n onClick={() => setIsCancelModalOpen(false)}\n disabled={isLoading}\n >\n Keep Subscription\n </Button>\n <Button\n variant=\"primary\"\n onClick={handleCancelSubscription}\n disabled={isLoading}\n >\n {isLoading ? 'Canceling...' : 'Yes, Cancel Subscription'}\n </Button>\n </div>\n </div>\n </Modal>\n\n {/* Upgrade Plan Confirmation Modal */}\n <Modal\n isOpen={isUpgradeModalOpen}\n onClose={() => {\n setIsUpgradeModalOpen(false);\n setError(null);\n }}\n title={\n selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0\n ? \"Start Free Plan\"\n : subscription\n ? \"Confirm Plan Change\"\n : \"Confirm Subscription\"\n }\n >\n <div className=\"space-y-4\">\n <p className=\"text-gray-600 dark:text-gray-400\">\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0 ? (\n <>Start your free <strong>{selectedPlan?.name}</strong> plan</>\n ) : subscription ? (\n <>Switch to the <strong>{selectedPlan?.name}</strong> plan</>\n ) : (\n <>Subscribe to the <strong>{selectedPlan?.name}</strong> plan</>\n )}\n </p>\n\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\n <h4 className=\"font-semibold text-gray-900 dark:text-white mb-2\">\n Billing Summary\n </h4>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Plan:</span>\n <span className=\"font-medium text-gray-900 dark:text-white\">{selectedPlan?.name}</span>\n </div>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Billing Cycle:</span>\n <span className=\"font-medium text-gray-900 dark:text-white\">\n {selectedPlan?.period || 'month'}ly\n </span>\n </div>\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) > 0 && (\n <>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Subtotal:</span>\n <span className=\"font-medium text-gray-900 dark:text-white\">\n {selectedPlan.price}\n </span>\n </div>\n\n {/* Tax display */}\n {taxLoading ? (\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">Tax:</span>\n <span className=\"text-gray-400 dark:text-gray-500 text-xs\">Calculating...</span>\n </div>\n ) : taxInfo && taxInfo.tax_rate > 0 ? (\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">\n {taxInfo.tax_label} ({taxInfo.tax_rate}%):\n </span>\n <span className=\"font-medium text-gray-900 dark:text-white\">\n ${(taxInfo.tax_amount / 100).toFixed(2)}\n </span>\n </div>\n ) : taxInfo && taxInfo.reverse_charge ? (\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"text-gray-600 dark:text-gray-400\">VAT (Reverse Charge):</span>\n <span className=\"font-medium text-gray-900 dark:text-white\">$0.00</span>\n </div>\n ) : null}\n </>\n )}\n\n {/* Reverse charge notice */}\n {taxInfo && taxInfo.reverse_charge && (\n <div className=\"mt-2 p-2 bg-blue-50 dark:bg-blue-900/20 rounded text-xs text-blue-700 dark:text-blue-300\">\n EU reverse charge applies - you are responsible for reporting VAT in your country.\n </div>\n )}\n\n <div className=\"okt-divider mt-3 pt-3\">\n <div className=\"flex justify-between\">\n <span className=\"font-semibold text-gray-900 dark:text-white\">\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0 ? 'Total:' : 'Charged Today:'}\n </span>\n <span className=\"font-bold text-lg text-gray-900 dark:text-white\">\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0 ? (\n <span className=\"text-green-600 dark:text-green-400\">FREE</span>\n ) : taxInfo ? (\n `$${(taxInfo.total / 100).toFixed(2)}`\n ) : (\n selectedPlan?.price || '$0'\n )}\n </span>\n </div>\n </div>\n </div>\n\n {/* Payment Method Selection - Only for paid plans */}\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) > 0 && paymentMethods.length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"font-semibold text-gray-900 dark:text-white text-sm\">\n Select Payment Method\n </h4>\n <div className=\"space-y-2\">\n {paymentMethods.map((method) => (\n <label\n key={method.id}\n className={`okt-selectable flex items-center gap-3 p-3 transition-all ${\n selectedUpgradePaymentMethod === method.id\n ? 'okt-selectable-selected'\n : 'okt-selectable-default'\n }`}\n >\n <input\n type=\"radio\"\n name=\"paymentMethod\"\n value={method.id}\n checked={selectedUpgradePaymentMethod === method.id}\n onChange={() => setSelectedUpgradePaymentMethod(method.id)}\n className=\"w-4 h-4 text-blue-600\"\n />\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-gray-900 dark:text-white text-sm\">\n {method.card_brand ? method.card_brand.charAt(0).toUpperCase() + method.card_brand.slice(1) : 'Card'}\n </span>\n {method.is_default && (\n <span className=\"inline-flex items-center rounded-full bg-blue-100 dark:bg-blue-900/30 px-2 py-0.5 text-xs font-medium text-blue-800 dark:text-blue-300\">\n Default\n </span>\n )}\n </div>\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">\n •••• {method.card_last4 || 'XXXX'}\n </span>\n </div>\n </label>\n ))}\n </div>\n </div>\n )}\n\n {/* No payment methods warning for paid plans */}\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) > 0 && paymentMethods.length === 0 && (\n <div className=\"okt-alert-warning bg-yellow-50 dark:bg-yellow-900/20 p-3\">\n <p className=\"text-sm text-yellow-800 dark:text-yellow-200\">\n Please add a payment method before subscribing to a paid plan.\n </p>\n </div>\n )}\n\n {/* Free plan info */}\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0 && (\n <div className=\"okt-alert-success bg-green-50 dark:bg-green-900/20 p-3\">\n <p className=\"text-sm text-green-800 dark:text-green-200\">\n This is a free plan. No payment method required!\n </p>\n </div>\n )}\n\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) > 0 && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n Your payment method will be charged immediately. You can cancel anytime.\n </p>\n )}\n\n {/* Error Message */}\n {error && (\n <div className=\"okt-alert-error bg-red-50 dark:bg-red-900/20 p-3\">\n <div className=\"flex items-start gap-2\">\n <svg className=\"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <p className=\"text-sm text-red-800 dark:text-red-200\">{error}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex gap-3 justify-end mt-6\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n setIsUpgradeModalOpen(false);\n setError(null);\n }}\n disabled={isUpgrading}\n >\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={handleConfirmUpgrade}\n disabled={isUpgrading || !!(selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) > 0 && paymentMethods.length === 0)}\n >\n {isUpgrading\n ? 'Processing...'\n : selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0\n ? 'Start Free Plan'\n : subscription\n ? 'Confirm Change'\n : 'Confirm Subscription'\n }\n </Button>\n </div>\n </div>\n </Modal>\n\n {/* Success Modal */}\n <Modal\n isOpen={upgradeSuccess}\n onClose={handleCloseSuccessModal}\n title=\"Subscription Successful!\"\n >\n <div className=\"space-y-4\">\n <div className=\"flex justify-center\">\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center\">\n <svg className=\"w-8 h-8 text-green-600 dark:text-green-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n </div>\n\n <div className=\"text-center\">\n <h3 className=\"text-xl font-bold text-gray-900 dark:text-white mb-2\">\n Welcome to {selectedPlan?.name}!\n </h3>\n <p className=\"text-gray-600 dark:text-gray-400\">\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0\n ? 'Your free plan is now active. Start exploring all the features!'\n : 'Your subscription has been activated and your payment method has been charged.'}\n </p>\n </div>\n\n <div className=\"bg-gray-50 dark:bg-gray-800 rounded-lg p-4\">\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400\">Plan:</span>\n <span className=\"font-medium text-gray-900 dark:text-white\">{selectedPlan?.name}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400\">Billing:</span>\n <span className=\"font-medium text-gray-900 dark:text-white\">\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) === 0 ? 'Free' : `${selectedPlan?.price}/${selectedPlan?.period}`}\n </span>\n </div>\n {selectedPlan && parseFloat(selectedPlan.price.replace(/[^0-9.]/g, '')) > 0 && (\n <div className=\"flex justify-between text-sm pt-2 okt-divider\">\n <span className=\"text-gray-600 dark:text-gray-400\">Status:</span>\n <span className=\"font-medium text-green-600 dark:text-green-400\">Active</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-center pt-2\">\n <Button\n variant=\"primary\"\n onClick={handleCloseSuccessModal}\n className=\"px-8\"\n >\n Get Started\n </Button>\n </div>\n </div>\n </Modal>\n </div>\n )\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BillingContent } from './chunk-
|
|
1
|
+
import { BillingContent } from './chunk-MTFFRTQW.js';
|
|
2
2
|
import { Alert, Table } from '@marcoschwartz/lite-ui';
|
|
3
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -508,5 +508,5 @@ function formatDate(dateString) {
|
|
|
508
508
|
}
|
|
509
509
|
|
|
510
510
|
export { Billing, DataList, OmniKitClient, createOmniKitClient };
|
|
511
|
-
//# sourceMappingURL=chunk-
|
|
512
|
-
//# sourceMappingURL=chunk-
|
|
511
|
+
//# sourceMappingURL=chunk-NHN5YSUE.js.map
|
|
512
|
+
//# sourceMappingURL=chunk-NHN5YSUE.js.map
|