@burdenoff/microfe-billing 2026.526.1 → 2026.528.1
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/billing/BillingAdminRoutes.js +1 -1
- package/dist/billing/BillingAdminRoutes.js.map +1 -1
- package/dist/billing/BillingUserRoutes.js +1 -1
- package/dist/billing/BillingUserRoutes.js.map +1 -1
- package/dist/billing/modules/addons/components/FloatingCartDrawer.js +15 -8
- package/dist/billing/modules/addons/components/FloatingCartDrawer.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonBrowseDetailPage.js +13 -6
- package/dist/billing/modules/addons/pages/AddonBrowseDetailPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonCreatePage.js +1 -1
- package/dist/billing/modules/addons/pages/AddonCreatePage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonDetailPage.js +8 -4
- package/dist/billing/modules/addons/pages/AddonDetailPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonEditPage.js +3 -2
- package/dist/billing/modules/addons/pages/AddonEditPage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonsBrowsePage.js +44 -23
- package/dist/billing/modules/addons/pages/AddonsBrowsePage.js.map +1 -1
- package/dist/billing/modules/addons/pages/AddonsListPage.js +60 -31
- package/dist/billing/modules/addons/pages/AddonsListPage.js.map +1 -1
- package/dist/billing/modules/affiliate/pages/AffiliateDashboardPage.js +9 -9
- package/dist/billing/modules/affiliate/pages/AffiliateDashboardPage.js.map +1 -1
- package/dist/billing/modules/analytics/pages/AnalyticsPage.js +8 -8
- package/dist/billing/modules/analytics/pages/AnalyticsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/InvoiceDetailPage.js +16 -10
- package/dist/billing/modules/billing/pages/InvoiceDetailPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/InvoicesListPage.js +24 -16
- package/dist/billing/modules/billing/pages/InvoicesListPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/PaymentMethodsPage.js +5 -1
- package/dist/billing/modules/billing/pages/PaymentMethodsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/RefundsPage.js +46 -29
- package/dist/billing/modules/billing/pages/RefundsPage.js.map +1 -1
- package/dist/billing/modules/billing/pages/TransactionsPage.js +34 -22
- package/dist/billing/modules/billing/pages/TransactionsPage.js.map +1 -1
- package/dist/billing/modules/checkout/components/BillingAccountSelector.js +10 -10
- package/dist/billing/modules/checkout/components/BillingAccountSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/CreditsAmountInput.js +3 -3
- package/dist/billing/modules/checkout/components/CreditsAmountInput.js.map +1 -1
- package/dist/billing/modules/checkout/components/NativeCheckoutView.js +7 -0
- package/dist/billing/modules/checkout/components/NativeCheckoutView.js.map +1 -1
- package/dist/billing/modules/checkout/components/OrderSummary.js +13 -13
- package/dist/billing/modules/checkout/components/OrderSummary.js.map +1 -1
- package/dist/billing/modules/checkout/components/PromoCodeInput.js +5 -5
- package/dist/billing/modules/checkout/components/PromoCodeInput.js.map +1 -1
- package/dist/billing/modules/checkout/components/RazorpayPaymentButton.js +5 -5
- package/dist/billing/modules/checkout/components/RazorpayPaymentButton.js.map +1 -1
- package/dist/billing/modules/checkout/components/SimpleAutoPayToggle.js +4 -4
- package/dist/billing/modules/checkout/components/SimpleAutoPayToggle.js.map +1 -1
- package/dist/billing/modules/checkout/components/StripePaymentForm.js +11 -11
- package/dist/billing/modules/checkout/components/StripePaymentForm.js.map +1 -1
- package/dist/billing/modules/checkout/components/SubscriptionSelector.js +3 -3
- package/dist/billing/modules/checkout/components/SubscriptionSelector.js.map +1 -1
- package/dist/billing/modules/checkout/components/UnifiedPaymentMethodSelector.js +8 -8
- package/dist/billing/modules/checkout/components/UnifiedPaymentMethodSelector.js.map +1 -1
- package/dist/billing/modules/checkout/pages/CheckoutPage.js +61 -52
- package/dist/billing/modules/checkout/pages/CheckoutPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CouponDetailPage.js +22 -15
- package/dist/billing/modules/coupons/pages/CouponDetailPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CouponsListPage.js +30 -21
- package/dist/billing/modules/coupons/pages/CouponsListPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/CreateCouponPage.js +9 -8
- package/dist/billing/modules/coupons/pages/CreateCouponPage.js.map +1 -1
- package/dist/billing/modules/coupons/pages/EditCouponPage.js +11 -8
- package/dist/billing/modules/coupons/pages/EditCouponPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/AdminCreditsPage.js +1 -1
- package/dist/billing/modules/credits/pages/AdminCreditsPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditTransactionsPage.js +22 -17
- package/dist/billing/modules/credits/pages/CreditTransactionsPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditWithdrawalPage.js +15 -8
- package/dist/billing/modules/credits/pages/CreditWithdrawalPage.js.map +1 -1
- package/dist/billing/modules/credits/pages/CreditsPage.js +17 -11
- package/dist/billing/modules/credits/pages/CreditsPage.js.map +1 -1
- package/dist/billing/modules/dashboard/components/ActiveSubscriptionCard.js +15 -11
- package/dist/billing/modules/dashboard/components/ActiveSubscriptionCard.js.map +1 -1
- package/dist/billing/modules/dashboard/components/AddPaymentMethodModal.js +21 -17
- package/dist/billing/modules/dashboard/components/AddPaymentMethodModal.js.map +1 -1
- package/dist/billing/modules/dashboard/components/BillingAccountCard.js +14 -11
- package/dist/billing/modules/dashboard/components/BillingAccountCard.js.map +1 -1
- package/dist/billing/modules/dashboard/components/CreateBillingAccountModal.js +32 -26
- package/dist/billing/modules/dashboard/components/CreateBillingAccountModal.js.map +1 -1
- package/dist/billing/modules/dashboard/components/PaymentMethodsSection.js +14 -10
- package/dist/billing/modules/dashboard/components/PaymentMethodsSection.js.map +1 -1
- package/dist/billing/modules/dashboard/components/RecommendedAddonsSection.js +18 -11
- package/dist/billing/modules/dashboard/components/RecommendedAddonsSection.js.map +1 -1
- package/dist/billing/modules/dashboard/pages/OverviewPage.js +44 -32
- package/dist/billing/modules/dashboard/pages/OverviewPage.js.map +1 -1
- package/dist/billing/modules/discounts/pages/DiscountsListPage.js +35 -26
- package/dist/billing/modules/discounts/pages/DiscountsListPage.js.map +1 -1
- package/dist/billing/modules/earnings/pages/EarningsPage.js +15 -15
- package/dist/billing/modules/earnings/pages/EarningsPage.js.map +1 -1
- package/dist/billing/modules/earnings/pages/PayoutAdminPage.js +11 -11
- package/dist/billing/modules/earnings/pages/PayoutAdminPage.js.map +1 -1
- package/dist/billing/modules/earnings/pages/PayoutsPage.js +5 -5
- package/dist/billing/modules/earnings/pages/PayoutsPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanBrowseDetailPage.js +9 -4
- package/dist/billing/modules/plans/pages/PlanBrowseDetailPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanCreatePage.js +1 -1
- package/dist/billing/modules/plans/pages/PlanCreatePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanDetailPage.js +13 -8
- package/dist/billing/modules/plans/pages/PlanDetailPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlanEditPage.js +3 -2
- package/dist/billing/modules/plans/pages/PlanEditPage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlansBrowsePage.js +14 -7
- package/dist/billing/modules/plans/pages/PlansBrowsePage.js.map +1 -1
- package/dist/billing/modules/plans/pages/PlansListPage.js +23 -9
- package/dist/billing/modules/plans/pages/PlansListPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaPage.js +11 -7
- package/dist/billing/modules/quota/pages/QuotaPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateCreatePage.js +3 -3
- package/dist/billing/modules/quota/pages/QuotaTemplateCreatePage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateDetailPage.js +6 -2
- package/dist/billing/modules/quota/pages/QuotaTemplateDetailPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplateEditPage.js +5 -4
- package/dist/billing/modules/quota/pages/QuotaTemplateEditPage.js.map +1 -1
- package/dist/billing/modules/quota/pages/QuotaTemplatesListPage.js +26 -12
- package/dist/billing/modules/quota/pages/QuotaTemplatesListPage.js.map +1 -1
- package/dist/billing/modules/settings/pages/SettingsPage.js +356 -349
- package/dist/billing/modules/settings/pages/SettingsPage.js.map +1 -1
- package/dist/billing/modules/settings/pages/TeamPermissionsPage.js +157 -123
- package/dist/billing/modules/settings/pages/TeamPermissionsPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/components/ManageSeatsModal.js +13 -8
- package/dist/billing/modules/subscriptions/components/ManageSeatsModal.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/SubscriptionDetailPage.js +15 -7
- package/dist/billing/modules/subscriptions/pages/SubscriptionDetailPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/SubscriptionsListPage.js +30 -20
- package/dist/billing/modules/subscriptions/pages/SubscriptionsListPage.js.map +1 -1
- package/dist/billing/modules/subscriptions/pages/UpgradeSubscriptionPage.js +25 -16
- package/dist/billing/modules/subscriptions/pages/UpgradeSubscriptionPage.js.map +1 -1
- package/dist/billing/modules/usage/pages/UsagePage.js +50 -34
- package/dist/billing/modules/usage/pages/UsagePage.js.map +1 -1
- package/dist/billing/shared/components/AccessDenied.js +2 -2
- package/dist/billing/shared/components/AccessDenied.js.map +1 -1
- package/dist/billing/shared/components/ActorIdentity.js +67 -0
- package/dist/billing/shared/components/ActorIdentity.js.map +1 -0
- package/dist/billing/shared/components/CurrencyPriceOverridesEditor.js +6 -2
- package/dist/billing/shared/components/CurrencyPriceOverridesEditor.js.map +1 -1
- package/dist/billing/shared/components/EmptyState.js +7 -21
- package/dist/billing/shared/components/EmptyState.js.map +1 -1
- package/dist/billing/shared/components/PageHeader.js +7 -19
- package/dist/billing/shared/components/PageHeader.js.map +1 -1
- package/dist/billing/shared/components/ServerError.js +5 -4
- package/dist/billing/shared/components/ServerError.js.map +1 -1
- package/dist/billing/shared/components/index.js +1 -0
- package/dist/billing/shared/hooks/index.js +1 -0
- package/dist/billing/shared/hooks/useActorProfiles.js +113 -0
- package/dist/billing/shared/hooks/useActorProfiles.js.map +1 -0
- package/package.json +2 -2
|
@@ -35,8 +35,8 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
35
35
|
children: /* @__PURE__ */ m("div", {
|
|
36
36
|
className: "flex items-center gap-3",
|
|
37
37
|
children: [/* @__PURE__ */ p("div", {
|
|
38
|
-
className: "
|
|
39
|
-
children: /* @__PURE__ */ p(s, { className: "
|
|
38
|
+
className: "size-10 rounded-lg bg-status-success-bg-subtle flex items-center justify-center",
|
|
39
|
+
children: /* @__PURE__ */ p(s, { className: "size-5 text-status-success-text" })
|
|
40
40
|
}), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h4", {
|
|
41
41
|
className: "font-semibold text-foreground",
|
|
42
42
|
children: n.name
|
|
@@ -59,7 +59,7 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
59
59
|
className: "flex items-center justify-between text-sm",
|
|
60
60
|
children: [/* @__PURE__ */ m("div", {
|
|
61
61
|
className: "flex items-center gap-2",
|
|
62
|
-
children: [/* @__PURE__ */ p("span", { className: "
|
|
62
|
+
children: [/* @__PURE__ */ p("span", { className: "size-1.5 rounded-full bg-status-success-bg" }), /* @__PURE__ */ p("span", {
|
|
63
63
|
className: "text-muted-foreground",
|
|
64
64
|
children: e.name
|
|
65
65
|
})]
|
|
@@ -83,6 +83,7 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
83
83
|
/* @__PURE__ */ m("footer", {
|
|
84
84
|
className: "p-4 border-t border-border bg-muted/30 flex items-center gap-2",
|
|
85
85
|
children: [/* @__PURE__ */ p("button", {
|
|
86
|
+
type: "button",
|
|
86
87
|
onClick: i,
|
|
87
88
|
className: "flex-1 px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted rounded-lg transition-colors text-center",
|
|
88
89
|
children: "View Details"
|
|
@@ -90,31 +91,35 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
90
91
|
className: "flex items-center gap-1",
|
|
91
92
|
children: [
|
|
92
93
|
/* @__PURE__ */ p("button", {
|
|
94
|
+
type: "button",
|
|
93
95
|
onClick: y,
|
|
94
96
|
className: "p-2 text-destructive hover:bg-destructive/10 rounded-lg transition-colors",
|
|
95
97
|
title: "Remove from cart",
|
|
96
|
-
children: /* @__PURE__ */ p(d, { className: "
|
|
98
|
+
children: /* @__PURE__ */ p(d, { className: "size-4" })
|
|
97
99
|
}),
|
|
98
100
|
/* @__PURE__ */ p("button", {
|
|
101
|
+
type: "button",
|
|
99
102
|
onClick: () => v(_ - 1),
|
|
100
103
|
className: "p-2 text-foreground hover:bg-muted rounded-lg transition-colors",
|
|
101
|
-
children: /* @__PURE__ */ p(o, { className: "
|
|
104
|
+
children: /* @__PURE__ */ p(o, { className: "size-4" })
|
|
102
105
|
}),
|
|
103
106
|
/* @__PURE__ */ p("span", {
|
|
104
107
|
className: "w-8 text-center font-medium text-foreground",
|
|
105
108
|
children: _
|
|
106
109
|
}),
|
|
107
110
|
/* @__PURE__ */ p("button", {
|
|
111
|
+
type: "button",
|
|
108
112
|
onClick: () => v(_ + 1),
|
|
109
113
|
className: "p-2 text-foreground hover:bg-muted rounded-lg transition-colors",
|
|
110
|
-
children: /* @__PURE__ */ p(c, { className: "
|
|
114
|
+
children: /* @__PURE__ */ p(c, { className: "size-4" })
|
|
111
115
|
})
|
|
112
116
|
]
|
|
113
117
|
}) : /* @__PURE__ */ p("button", {
|
|
118
|
+
type: "button",
|
|
114
119
|
onClick: S,
|
|
115
120
|
disabled: b,
|
|
116
121
|
className: `flex-1 px-3 py-2 text-sm font-medium rounded-lg transition-colors text-center flex items-center justify-center gap-1.5 ${b ? "bg-status-success-bg text-primary-foreground hover:bg-status-success-bg/90" : "text-primary-foreground bg-primary hover:bg-primary/90"}`,
|
|
117
|
-
children: b ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(r, { className: "
|
|
122
|
+
children: b ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(r, { className: "size-4" }), "Added"] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(l, { className: "size-4" }), "Add to Cart"] })
|
|
118
123
|
})]
|
|
119
124
|
})
|
|
120
125
|
]
|
|
@@ -136,7 +141,7 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
136
141
|
children: "Enhance your subscription with these popular add-ons"
|
|
137
142
|
})] }), /* @__PURE__ */ p("div", {
|
|
138
143
|
className: "flex items-center justify-center py-12",
|
|
139
|
-
children: /* @__PURE__ */ p(a, { className: "
|
|
144
|
+
children: /* @__PURE__ */ p(a, { className: "size-6 animate-spin text-muted-foreground" })
|
|
140
145
|
})]
|
|
141
146
|
}) : C.length === 0 ? null : /* @__PURE__ */ m("section", {
|
|
142
147
|
className: `space-y-4 ${b}`,
|
|
@@ -145,7 +150,7 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
145
150
|
className: "flex items-center justify-between",
|
|
146
151
|
children: [/* @__PURE__ */ m("div", {
|
|
147
152
|
className: "flex items-center gap-2",
|
|
148
|
-
children: [/* @__PURE__ */ p(u, { className: "
|
|
153
|
+
children: [/* @__PURE__ */ p(u, { className: "size-5 text-status-warning-text" }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h3", {
|
|
149
154
|
className: "text-lg font-semibold text-foreground",
|
|
150
155
|
children: "Recommended Add-ons"
|
|
151
156
|
}), /* @__PURE__ */ p("p", {
|
|
@@ -153,9 +158,10 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
153
158
|
children: "Enhance your subscription with these popular add-ons"
|
|
154
159
|
})] })]
|
|
155
160
|
}), /* @__PURE__ */ m("button", {
|
|
161
|
+
type: "button",
|
|
156
162
|
onClick: s,
|
|
157
163
|
className: "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-primary hover:text-primary/80 transition-colors",
|
|
158
|
-
children: ["View All", /* @__PURE__ */ p(i, { className: "
|
|
164
|
+
children: ["View All", /* @__PURE__ */ p(i, { className: "size-4" })]
|
|
159
165
|
})]
|
|
160
166
|
}),
|
|
161
167
|
/* @__PURE__ */ p("div", {
|
|
@@ -174,13 +180,14 @@ var _ = ({ addon: n, onView: i, onPurchase: a, onAddToCart: u, isInCart: h = !1,
|
|
|
174
180
|
e.length > v && /* @__PURE__ */ p("div", {
|
|
175
181
|
className: "flex justify-center pt-2",
|
|
176
182
|
children: /* @__PURE__ */ m("button", {
|
|
183
|
+
type: "button",
|
|
177
184
|
onClick: s,
|
|
178
185
|
className: "inline-flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors",
|
|
179
186
|
children: [
|
|
180
187
|
"View all ",
|
|
181
188
|
e.length,
|
|
182
189
|
" add-ons",
|
|
183
|
-
/* @__PURE__ */ p(n, { className: "
|
|
190
|
+
/* @__PURE__ */ p(n, { className: "size-4" })
|
|
184
191
|
]
|
|
185
192
|
})
|
|
186
193
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecommendedAddonsSection.js","names":[],"sources":["../../../../../src/billing/modules/dashboard/components/RecommendedAddonsSection.tsx"],"sourcesContent":["/**\n * Recommended Addons Section Component\n * Displays recommended addons that users might want to purchase\n * Supports add to cart functionality\n */\n\nimport { type FC, useState, useMemo } from 'react';\nimport {\n Package,\n ArrowRight,\n Sparkles,\n ChevronRight,\n Loader2,\n ShoppingCart,\n Check,\n Plus,\n Minus,\n Trash2,\n} from 'lucide-react';\nimport type { Addon, PlanDuration, SubscriptionFeatures } from '../../../shared/types';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n/**\n * Combined quota info for display\n */\ninterface CombinedQuota {\n quotaId: string;\n name: string;\n totalValue: number;\n}\n\n/**\n * Combines duplicate quotas by quota ID and aggregates their values\n * e.g., 10 bots + 10 bots = 20 bots (shown as one feature)\n */\nfunction combineQuotas(features: SubscriptionFeatures[]): CombinedQuota[] {\n const quotaMap = new Map<string, CombinedQuota>();\n\n for (const feature of features) {\n if (!feature.quota) continue;\n\n const quotaId = feature.quota.id;\n const limits = feature.quota.limits as { value?: number } | null;\n const limitValue = limits?.value ?? 0;\n\n const existing = quotaMap.get(quotaId);\n if (existing) {\n existing.totalValue += limitValue;\n } else {\n quotaMap.set(quotaId, {\n quotaId,\n name: feature.quota.name ?? 'Unknown Quota',\n totalValue: limitValue,\n });\n }\n }\n\n return Array.from(quotaMap.values());\n}\n\ninterface RecommendedAddonsSectionProps {\n addons: Addon[];\n hasSubscription: boolean;\n onViewAddon: (addonId: string) => void;\n onPurchaseAddon: (addonId: string) => void;\n onViewAllAddons: () => void;\n /** Handler for adding addon to cart */\n onAddToCart?: (addon: Addon) => void;\n /** Check if addon is in cart */\n isInCart?: (addonId: string) => boolean;\n /** Get cart quantity for addon */\n getCartQuantity?: (addonId: string) => number;\n /** Update quantity in cart */\n onUpdateQuantity?: (addonId: string, quantity: number) => void;\n /** Remove from cart */\n onRemoveFromCart?: (addonId: string) => void;\n /** Maximum number of addons to show (default: 3) */\n maxAddons?: number;\n isLoading?: boolean;\n className?: string;\n}\n\nconst AddonCard: FC<{\n addon: Addon;\n onView: () => void;\n onPurchase: () => void;\n onAddToCart?: () => void;\n isInCart?: boolean;\n cartQuantity?: number;\n onUpdateQuantity?: (quantity: number) => void;\n onRemoveFromCart?: () => void;\n}> = ({\n addon,\n onView,\n onPurchase,\n onAddToCart,\n isInCart = false,\n cartQuantity = 0,\n onUpdateQuantity,\n onRemoveFromCart,\n}) => {\n const [justAdded, setJustAdded] = useState(false);\n\n const handleAddToCart = () => {\n if (onAddToCart) {\n onAddToCart();\n setJustAdded(true);\n setTimeout(() => setJustAdded(false), 2000);\n } else {\n onPurchase();\n }\n };\n\n const formatCurrency = (amount: number, currency: string) => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency || 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(amount);\n };\n\n const getDurationLabel = (duration: PlanDuration) => {\n return duration === 'yearly' ? 'year' : 'month';\n };\n\n // Combine duplicate quotas (e.g., 10 bots + 10 bots = 20 bots)\n const combinedQuotas = useMemo(() => {\n const features = addon.features || [];\n return combineQuotas(features as SubscriptionFeatures[]);\n }, [addon.features]);\n\n return (\n <article className=\"flex flex-col border border-border rounded-lg bg-card overflow-hidden hover:shadow-md transition-shadow\">\n {/* Header */}\n <header className=\"p-4 border-b border-border\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 rounded-lg bg-status-success-bg-subtle flex items-center justify-center\">\n <Package className=\"w-5 h-5 text-status-success-text\" />\n </div>\n <div>\n <h4 className=\"font-semibold text-foreground\">{addon.name}</h4>\n <p className=\"text-sm text-muted-foreground\">\n {formatCurrency(addon.price, addon.currency)}/{getDurationLabel(addon.duration)}\n </p>\n </div>\n </div>\n </div>\n </header>\n\n {/* Body */}\n <div className=\"p-4 flex-1\">\n {combinedQuotas.length > 0 ? (\n <ul className=\"space-y-2\">\n {combinedQuotas.slice(0, 2).map((quota) => (\n <li key={quota.quotaId} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-success-bg\" />\n <span className=\"text-muted-foreground\">{quota.name}</span>\n </div>\n <span className=\"font-medium text-foreground\">\n {quota.totalValue.toLocaleString()}\n </span>\n </li>\n ))}\n {combinedQuotas.length > 2 && (\n <li className=\"text-xs text-muted-foreground\">\n +{combinedQuotas.length - 2} more quotas\n </li>\n )}\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n Enhance your subscription with additional features\n </p>\n )}\n </div>\n\n {/* Footer */}\n <footer className=\"p-4 border-t border-border bg-muted/30 flex items-center gap-2\">\n <button\n onClick={onView}\n className=\"flex-1 px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted rounded-lg transition-colors text-center\"\n >\n View Details\n </button>\n {isInCart && onUpdateQuantity ? (\n // Quantity controls when in cart\n <div className=\"flex items-center gap-1\">\n <button\n onClick={onRemoveFromCart}\n className=\"p-2 text-destructive hover:bg-destructive/10 rounded-lg transition-colors\"\n title=\"Remove from cart\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => onUpdateQuantity(cartQuantity - 1)}\n className=\"p-2 text-foreground hover:bg-muted rounded-lg transition-colors\"\n >\n <Minus className=\"w-4 h-4\" />\n </button>\n <span className=\"w-8 text-center font-medium text-foreground\">{cartQuantity}</span>\n <button\n onClick={() => onUpdateQuantity(cartQuantity + 1)}\n className=\"p-2 text-foreground hover:bg-muted rounded-lg transition-colors\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n </div>\n ) : (\n // Add to cart button\n <button\n onClick={handleAddToCart}\n disabled={justAdded}\n className={`flex-1 px-3 py-2 text-sm font-medium rounded-lg transition-colors text-center flex items-center justify-center gap-1.5 ${\n justAdded\n ? 'bg-status-success-bg text-primary-foreground hover:bg-status-success-bg/90'\n : 'text-primary-foreground bg-primary hover:bg-primary/90'\n }`}\n >\n {justAdded ? (\n <>\n <Check className=\"w-4 h-4\" />\n Added\n </>\n ) : (\n <>\n <ShoppingCart className=\"w-4 h-4\" />\n Add to Cart\n </>\n )}\n </button>\n )}\n </footer>\n </article>\n );\n};\n\nexport const RecommendedAddonsSection: FC<RecommendedAddonsSectionProps> = ({\n addons,\n hasSubscription,\n onViewAddon,\n onPurchaseAddon,\n onViewAllAddons,\n onAddToCart,\n isInCart,\n getCartQuantity,\n onUpdateQuantity,\n onRemoveFromCart,\n maxAddons = 3,\n isLoading = false,\n className = '',\n}) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n // Only show if user has a subscription\n if (!hasSubscription) {\n return null;\n }\n\n // Limit addons to maxAddons\n const displayAddons = addons.slice(0, maxAddons);\n\n if (isLoading) {\n return (\n <section className={`space-y-4 ${className}`}>\n <header>\n <h3 className=\"text-lg font-semibold text-foreground\">\n {tr('billing.overview.recommendedAddons', 'Recommended Add-ons')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n Enhance your subscription with these popular add-ons\n </p>\n </header>\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"w-6 h-6 animate-spin text-muted-foreground\" />\n </div>\n </section>\n );\n }\n\n if (displayAddons.length === 0) {\n return null;\n }\n\n return (\n <section className={`space-y-4 ${className}`}>\n {/* Header */}\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"w-5 h-5 text-status-warning-text\" />\n <div>\n <h3 className=\"text-lg font-semibold text-foreground\">Recommended Add-ons</h3>\n <p className=\"text-sm text-muted-foreground\">\n Enhance your subscription with these popular add-ons\n </p>\n </div>\n </div>\n <button\n onClick={onViewAllAddons}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-primary hover:text-primary/80 transition-colors\"\n >\n View All\n <ChevronRight className=\"w-4 h-4\" />\n </button>\n </header>\n\n {/* Addons Grid - Limited to maxAddons */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {displayAddons.map((addon) => (\n <AddonCard\n key={addon.id}\n addon={addon}\n onView={() => onViewAddon(addon.id)}\n onPurchase={() => onPurchaseAddon(addon.id)}\n onAddToCart={onAddToCart ? () => onAddToCart(addon) : undefined}\n isInCart={isInCart ? isInCart(addon.id) : false}\n cartQuantity={getCartQuantity ? getCartQuantity(addon.id) : 0}\n onUpdateQuantity={\n onUpdateQuantity ? (qty) => onUpdateQuantity(addon.id, qty) : undefined\n }\n onRemoveFromCart={onRemoveFromCart ? () => onRemoveFromCart(addon.id) : undefined}\n />\n ))}\n </div>\n\n {/* See More Link - show if there are more addons */}\n {addons.length > maxAddons && (\n <div className=\"flex justify-center pt-2\">\n <button\n onClick={onViewAllAddons}\n className=\"inline-flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all {addons.length} add-ons\n <ArrowRight className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n </section>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RecommendedAddonsSection.js","names":[],"sources":["../../../../../src/billing/modules/dashboard/components/RecommendedAddonsSection.tsx"],"sourcesContent":["/**\n * Recommended Addons Section Component\n * Displays recommended addons that users might want to purchase\n * Supports add to cart functionality\n */\n\nimport { type FC, useState, useMemo } from 'react';\nimport {\n Package,\n ArrowRight,\n Sparkles,\n ChevronRight,\n Loader2,\n ShoppingCart,\n Check,\n Plus,\n Minus,\n Trash2,\n} from 'lucide-react';\nimport type { Addon, PlanDuration, SubscriptionFeatures } from '../../../shared/types';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\n/**\n * Combined quota info for display\n */\ninterface CombinedQuota {\n quotaId: string;\n name: string;\n totalValue: number;\n}\n\n/**\n * Combines duplicate quotas by quota ID and aggregates their values\n * e.g., 10 bots + 10 bots = 20 bots (shown as one feature)\n */\nfunction combineQuotas(features: SubscriptionFeatures[]): CombinedQuota[] {\n const quotaMap = new Map<string, CombinedQuota>();\n\n for (const feature of features) {\n if (!feature.quota) continue;\n\n const quotaId = feature.quota.id;\n const limits = feature.quota.limits as { value?: number } | null;\n const limitValue = limits?.value ?? 0;\n\n const existing = quotaMap.get(quotaId);\n if (existing) {\n existing.totalValue += limitValue;\n } else {\n quotaMap.set(quotaId, {\n quotaId,\n name: feature.quota.name ?? 'Unknown Quota',\n totalValue: limitValue,\n });\n }\n }\n\n return Array.from(quotaMap.values());\n}\n\ninterface RecommendedAddonsSectionProps {\n addons: Addon[];\n hasSubscription: boolean;\n onViewAddon: (addonId: string) => void;\n onPurchaseAddon: (addonId: string) => void;\n onViewAllAddons: () => void;\n /** Handler for adding addon to cart */\n onAddToCart?: (addon: Addon) => void;\n /** Check if addon is in cart */\n isInCart?: (addonId: string) => boolean;\n /** Get cart quantity for addon */\n getCartQuantity?: (addonId: string) => number;\n /** Update quantity in cart */\n onUpdateQuantity?: (addonId: string, quantity: number) => void;\n /** Remove from cart */\n onRemoveFromCart?: (addonId: string) => void;\n /** Maximum number of addons to show (default: 3) */\n maxAddons?: number;\n isLoading?: boolean;\n className?: string;\n}\n\nconst AddonCard: FC<{\n addon: Addon;\n onView: () => void;\n onPurchase: () => void;\n onAddToCart?: () => void;\n isInCart?: boolean;\n cartQuantity?: number;\n onUpdateQuantity?: (quantity: number) => void;\n onRemoveFromCart?: () => void;\n}> = ({\n addon,\n onView,\n onPurchase,\n onAddToCart,\n isInCart = false,\n cartQuantity = 0,\n onUpdateQuantity,\n onRemoveFromCart,\n}) => {\n const [justAdded, setJustAdded] = useState(false);\n\n const handleAddToCart = () => {\n if (onAddToCart) {\n onAddToCart();\n setJustAdded(true);\n setTimeout(() => setJustAdded(false), 2000);\n } else {\n onPurchase();\n }\n };\n\n const formatCurrency = (amount: number, currency: string) => {\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency || 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n }).format(amount);\n };\n\n const getDurationLabel = (duration: PlanDuration) => {\n return duration === 'yearly' ? 'year' : 'month';\n };\n\n // Combine duplicate quotas (e.g., 10 bots + 10 bots = 20 bots)\n const combinedQuotas = useMemo(() => {\n const features = addon.features || [];\n return combineQuotas(features as SubscriptionFeatures[]);\n }, [addon.features]);\n\n return (\n <article className=\"flex flex-col border border-border rounded-lg bg-card overflow-hidden hover:shadow-md transition-shadow\">\n {/* Header */}\n <header className=\"p-4 border-b border-border\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"size-10 rounded-lg bg-status-success-bg-subtle flex items-center justify-center\">\n <Package className=\"size-5 text-status-success-text\" />\n </div>\n <div>\n <h4 className=\"font-semibold text-foreground\">{addon.name}</h4>\n <p className=\"text-sm text-muted-foreground\">\n {formatCurrency(addon.price, addon.currency)}/{getDurationLabel(addon.duration)}\n </p>\n </div>\n </div>\n </div>\n </header>\n\n {/* Body */}\n <div className=\"p-4 flex-1\">\n {combinedQuotas.length > 0 ? (\n <ul className=\"space-y-2\">\n {combinedQuotas.slice(0, 2).map((quota) => (\n <li key={quota.quotaId} className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"size-1.5 rounded-full bg-status-success-bg\" />\n <span className=\"text-muted-foreground\">{quota.name}</span>\n </div>\n <span className=\"font-medium text-foreground\">\n {quota.totalValue.toLocaleString()}\n </span>\n </li>\n ))}\n {combinedQuotas.length > 2 && (\n <li className=\"text-xs text-muted-foreground\">\n +{combinedQuotas.length - 2} more quotas\n </li>\n )}\n </ul>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n Enhance your subscription with additional features\n </p>\n )}\n </div>\n\n {/* Footer */}\n <footer className=\"p-4 border-t border-border bg-muted/30 flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onView}\n className=\"flex-1 px-3 py-2 text-sm font-medium text-muted-foreground hover:text-foreground hover:bg-muted rounded-lg transition-colors text-center\"\n >\n View Details\n </button>\n {isInCart && onUpdateQuantity ? (\n // Quantity controls when in cart\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={onRemoveFromCart}\n className=\"p-2 text-destructive hover:bg-destructive/10 rounded-lg transition-colors\"\n title=\"Remove from cart\"\n >\n <Trash2 className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => onUpdateQuantity(cartQuantity - 1)}\n className=\"p-2 text-foreground hover:bg-muted rounded-lg transition-colors\"\n >\n <Minus className=\"size-4\" />\n </button>\n <span className=\"w-8 text-center font-medium text-foreground\">{cartQuantity}</span>\n <button\n type=\"button\"\n onClick={() => onUpdateQuantity(cartQuantity + 1)}\n className=\"p-2 text-foreground hover:bg-muted rounded-lg transition-colors\"\n >\n <Plus className=\"size-4\" />\n </button>\n </div>\n ) : (\n // Add to cart button\n <button\n type=\"button\"\n onClick={handleAddToCart}\n disabled={justAdded}\n className={`flex-1 px-3 py-2 text-sm font-medium rounded-lg transition-colors text-center flex items-center justify-center gap-1.5 ${\n justAdded\n ? 'bg-status-success-bg text-primary-foreground hover:bg-status-success-bg/90'\n : 'text-primary-foreground bg-primary hover:bg-primary/90'\n }`}\n >\n {justAdded ? (\n <>\n <Check className=\"size-4\" />\n Added\n </>\n ) : (\n <>\n <ShoppingCart className=\"size-4\" />\n Add to Cart\n </>\n )}\n </button>\n )}\n </footer>\n </article>\n );\n};\n\nexport const RecommendedAddonsSection: FC<RecommendedAddonsSectionProps> = ({\n addons,\n hasSubscription,\n onViewAddon,\n onPurchaseAddon,\n onViewAllAddons,\n onAddToCart,\n isInCart,\n getCartQuantity,\n onUpdateQuantity,\n onRemoveFromCart,\n maxAddons = 3,\n isLoading = false,\n className = '',\n}) => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n // Only show if user has a subscription\n if (!hasSubscription) {\n return null;\n }\n\n // Limit addons to maxAddons\n const displayAddons = addons.slice(0, maxAddons);\n\n if (isLoading) {\n return (\n <section className={`space-y-4 ${className}`}>\n <header>\n <h3 className=\"text-lg font-semibold text-foreground\">\n {tr('billing.overview.recommendedAddons', 'Recommended Add-ons')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n Enhance your subscription with these popular add-ons\n </p>\n </header>\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"size-6 animate-spin text-muted-foreground\" />\n </div>\n </section>\n );\n }\n\n if (displayAddons.length === 0) {\n return null;\n }\n\n return (\n <section className={`space-y-4 ${className}`}>\n {/* Header */}\n <header className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"size-5 text-status-warning-text\" />\n <div>\n <h3 className=\"text-lg font-semibold text-foreground\">Recommended Add-ons</h3>\n <p className=\"text-sm text-muted-foreground\">\n Enhance your subscription with these popular add-ons\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onViewAllAddons}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-primary hover:text-primary/80 transition-colors\"\n >\n View All\n <ChevronRight className=\"size-4\" />\n </button>\n </header>\n\n {/* Addons Grid - Limited to maxAddons */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {displayAddons.map((addon) => (\n <AddonCard\n key={addon.id}\n addon={addon}\n onView={() => onViewAddon(addon.id)}\n onPurchase={() => onPurchaseAddon(addon.id)}\n onAddToCart={onAddToCart ? () => onAddToCart(addon) : undefined}\n isInCart={isInCart ? isInCart(addon.id) : false}\n cartQuantity={getCartQuantity ? getCartQuantity(addon.id) : 0}\n onUpdateQuantity={\n onUpdateQuantity ? (qty) => onUpdateQuantity(addon.id, qty) : undefined\n }\n onRemoveFromCart={onRemoveFromCart ? () => onRemoveFromCart(addon.id) : undefined}\n />\n ))}\n </div>\n\n {/* See More Link - show if there are more addons */}\n {addons.length > maxAddons && (\n <div className=\"flex justify-center pt-2\">\n <button\n type=\"button\"\n onClick={onViewAllAddons}\n className=\"inline-flex items-center gap-2 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n View all {addons.length} add-ons\n <ArrowRight className=\"size-4\" />\n </button>\n </div>\n )}\n </section>\n );\n};\n"],"mappings":"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"}
|
|
@@ -131,7 +131,7 @@ var g = () => {
|
|
|
131
131
|
className: "flex items-center justify-center min-h-[400px]",
|
|
132
132
|
children: /* @__PURE__ */ h("div", {
|
|
133
133
|
className: "flex flex-col items-center gap-3",
|
|
134
|
-
children: [/* @__PURE__ */ m(xe, { className: "
|
|
134
|
+
children: [/* @__PURE__ */ m(xe, { className: "size-8 animate-spin text-primary" }), /* @__PURE__ */ m("p", {
|
|
135
135
|
className: "text-sm text-muted-foreground",
|
|
136
136
|
children: _("billing.overview.loadingInfo", "Loading billing information...")
|
|
137
137
|
})]
|
|
@@ -150,13 +150,14 @@ var g = () => {
|
|
|
150
150
|
})]
|
|
151
151
|
}),
|
|
152
152
|
/* @__PURE__ */ m(ee, {
|
|
153
|
-
icon: /* @__PURE__ */ m(c, { className: "
|
|
153
|
+
icon: /* @__PURE__ */ m(c, { className: "size-6 text-muted-foreground" }),
|
|
154
154
|
title: _("billing.overview.emptyTitle", "No billing account"),
|
|
155
155
|
description: _("billing.overview.emptyDescription", "Create a billing account to start managing your subscriptions and payments"),
|
|
156
156
|
action: x.canManageBillingAccount ? /* @__PURE__ */ h("button", {
|
|
157
|
+
type: "button",
|
|
157
158
|
onClick: () => T(!0),
|
|
158
159
|
className: "inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-primary-foreground bg-primary rounded-lg hover:bg-primary/90 transition-colors",
|
|
159
|
-
children: [/* @__PURE__ */ m(u, { className: "
|
|
160
|
+
children: [/* @__PURE__ */ m(u, { className: "size-4" }), _("billing.overview.createBillingAccount", "Create Billing Account")]
|
|
160
161
|
}) : void 0
|
|
161
162
|
}),
|
|
162
163
|
/* @__PURE__ */ m(r, {
|
|
@@ -183,14 +184,16 @@ var g = () => {
|
|
|
183
184
|
})] }), /* @__PURE__ */ h("div", {
|
|
184
185
|
className: "flex items-center gap-2",
|
|
185
186
|
children: [/* @__PURE__ */ m("button", {
|
|
187
|
+
type: "button",
|
|
186
188
|
onClick: Be,
|
|
187
189
|
className: "p-2 rounded-lg border border-border hover:bg-muted text-muted-foreground hover:text-foreground transition-colors",
|
|
188
190
|
"aria-label": _("billing.overview.refresh", "Refresh"),
|
|
189
|
-
children: /* @__PURE__ */ m(d, { className: `
|
|
191
|
+
children: /* @__PURE__ */ m(d, { className: `size-4 ${R ? "animate-spin" : ""}` })
|
|
190
192
|
}), x.canManageBillingAccount && N.length > 0 && /* @__PURE__ */ h("button", {
|
|
193
|
+
type: "button",
|
|
191
194
|
onClick: () => T(!0),
|
|
192
195
|
className: "inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-primary-foreground bg-primary rounded-lg hover:bg-primary/90 transition-colors",
|
|
193
|
-
children: [/* @__PURE__ */ m(u, { className: "
|
|
196
|
+
children: [/* @__PURE__ */ m(u, { className: "size-4" }), /* @__PURE__ */ m("span", {
|
|
194
197
|
className: "hidden sm:inline",
|
|
195
198
|
children: _("billing.overview.newAccount", "New Account")
|
|
196
199
|
})]
|
|
@@ -200,13 +203,14 @@ var g = () => {
|
|
|
200
203
|
N.length > 1 && /* @__PURE__ */ h("div", {
|
|
201
204
|
className: "relative",
|
|
202
205
|
children: [/* @__PURE__ */ h("button", {
|
|
206
|
+
type: "button",
|
|
203
207
|
onClick: () => k(!O),
|
|
204
208
|
className: "w-full sm:w-auto flex items-center justify-between gap-3 px-4 py-3 border border-border rounded-lg bg-card hover:bg-muted/50 transition-colors",
|
|
205
209
|
children: [/* @__PURE__ */ h("div", {
|
|
206
210
|
className: "flex items-center gap-3",
|
|
207
211
|
children: [/* @__PURE__ */ m("div", {
|
|
208
|
-
className: "
|
|
209
|
-
children: /* @__PURE__ */ m(c, { className: "
|
|
212
|
+
className: "size-8 rounded-lg bg-primary/10 flex items-center justify-center",
|
|
213
|
+
children: /* @__PURE__ */ m(c, { className: "size-4 text-primary" })
|
|
210
214
|
}), /* @__PURE__ */ h("div", {
|
|
211
215
|
className: "text-left",
|
|
212
216
|
children: [/* @__PURE__ */ m("p", {
|
|
@@ -217,20 +221,21 @@ var g = () => {
|
|
|
217
221
|
children: P?.email
|
|
218
222
|
})]
|
|
219
223
|
})]
|
|
220
|
-
}), /* @__PURE__ */ m(ye, { className: `
|
|
224
|
+
}), /* @__PURE__ */ m(ye, { className: `size-4 text-muted-foreground transition-transform ${O ? "rotate-180" : ""}` })]
|
|
221
225
|
}), O && /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
|
|
222
226
|
className: "fixed inset-0 z-10",
|
|
223
227
|
onClick: () => k(!1)
|
|
224
228
|
}), /* @__PURE__ */ m("div", {
|
|
225
229
|
className: "absolute top-full left-0 right-0 sm:right-auto mt-1 w-full sm:w-80 bg-popover border border-border rounded-lg shadow-lg z-20 py-1 max-h-60 overflow-y-auto",
|
|
226
230
|
children: N.map((e) => /* @__PURE__ */ h("button", {
|
|
231
|
+
type: "button",
|
|
227
232
|
onClick: () => ze(e),
|
|
228
233
|
className: "w-full flex items-center justify-between gap-3 px-4 py-3 hover:bg-muted transition-colors",
|
|
229
234
|
children: [/* @__PURE__ */ h("div", {
|
|
230
235
|
className: "flex items-center gap-3 min-w-0",
|
|
231
236
|
children: [/* @__PURE__ */ m("div", {
|
|
232
|
-
className: "
|
|
233
|
-
children: /* @__PURE__ */ m(c, { className: "
|
|
237
|
+
className: "size-8 rounded-lg bg-muted flex items-center justify-center flex-shrink-0",
|
|
238
|
+
children: /* @__PURE__ */ m(c, { className: "size-4 text-muted-foreground" })
|
|
234
239
|
}), /* @__PURE__ */ h("div", {
|
|
235
240
|
className: "text-left min-w-0",
|
|
236
241
|
children: [/* @__PURE__ */ m("p", {
|
|
@@ -241,7 +246,7 @@ var g = () => {
|
|
|
241
246
|
children: e.email
|
|
242
247
|
})]
|
|
243
248
|
})]
|
|
244
|
-
}), P?.id === e.id && /* @__PURE__ */ m(ve, { className: "
|
|
249
|
+
}), P?.id === e.id && /* @__PURE__ */ m(ve, { className: "size-4 text-primary flex-shrink-0" })]
|
|
245
250
|
}, e.id))
|
|
246
251
|
})] })]
|
|
247
252
|
}),
|
|
@@ -251,22 +256,22 @@ var g = () => {
|
|
|
251
256
|
/* @__PURE__ */ m(n, {
|
|
252
257
|
label: _("billing.overview.stats.creditBalance", "Credit Balance"),
|
|
253
258
|
value: `${(P.creditAmount || 0).toLocaleString()} Credits`,
|
|
254
|
-
icon: /* @__PURE__ */ m(f, { className: "
|
|
259
|
+
icon: /* @__PURE__ */ m(f, { className: "size-5" })
|
|
255
260
|
}),
|
|
256
261
|
/* @__PURE__ */ m(n, {
|
|
257
262
|
label: _("billing.overview.stats.activePlans", "Active Plans"),
|
|
258
263
|
value: I.length > 0 ? I.length === 1 ? I[0]?.plan?.name || "1 Plan" : `${I.length} ${_("billing.overview.stats.plansSuffix", "Plans")}` : _("billing.overview.stats.none", "None"),
|
|
259
|
-
icon: /* @__PURE__ */ m(d, { className: "
|
|
264
|
+
icon: /* @__PURE__ */ m(d, { className: "size-5" })
|
|
260
265
|
}),
|
|
261
266
|
/* @__PURE__ */ m(n, {
|
|
262
267
|
label: _("billing.overview.stats.paymentMethods", "Payment Methods"),
|
|
263
268
|
value: F.length,
|
|
264
|
-
icon: /* @__PURE__ */ m(c, { className: "
|
|
269
|
+
icon: /* @__PURE__ */ m(c, { className: "size-5" })
|
|
265
270
|
}),
|
|
266
271
|
/* @__PURE__ */ m(n, {
|
|
267
272
|
label: _("billing.overview.stats.paymentCurrency", "Payment Currency"),
|
|
268
273
|
value: P.currency || "USD",
|
|
269
|
-
icon: /* @__PURE__ */ m(c, { className: "
|
|
274
|
+
icon: /* @__PURE__ */ m(c, { className: "size-5" })
|
|
270
275
|
})
|
|
271
276
|
]
|
|
272
277
|
}),
|
|
@@ -287,13 +292,14 @@ var g = () => {
|
|
|
287
292
|
children: [I.length > 1 && /* @__PURE__ */ h("div", {
|
|
288
293
|
className: "relative",
|
|
289
294
|
children: [/* @__PURE__ */ h("button", {
|
|
295
|
+
type: "button",
|
|
290
296
|
onClick: () => M(!j),
|
|
291
297
|
className: "w-full sm:w-auto flex items-center justify-between gap-3 px-4 py-3 border border-border rounded-lg bg-card hover:bg-muted/50 transition-colors",
|
|
292
298
|
children: [/* @__PURE__ */ h("div", {
|
|
293
299
|
className: "flex items-center gap-3",
|
|
294
300
|
children: [/* @__PURE__ */ m("div", {
|
|
295
|
-
className: "
|
|
296
|
-
children: /* @__PURE__ */ m(l, { className: "
|
|
301
|
+
className: "size-8 rounded-lg bg-primary/10 flex items-center justify-center",
|
|
302
|
+
children: /* @__PURE__ */ m(l, { className: "size-4 text-primary" })
|
|
297
303
|
}), /* @__PURE__ */ h("div", {
|
|
298
304
|
className: "text-left",
|
|
299
305
|
children: [/* @__PURE__ */ h("p", {
|
|
@@ -315,13 +321,14 @@ var g = () => {
|
|
|
315
321
|
]
|
|
316
322
|
})]
|
|
317
323
|
})]
|
|
318
|
-
}), /* @__PURE__ */ m(ye, { className: `
|
|
324
|
+
}), /* @__PURE__ */ m(ye, { className: `size-4 text-muted-foreground transition-transform ${j ? "rotate-180" : ""}` })]
|
|
319
325
|
}), j && /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
|
|
320
326
|
className: "fixed inset-0 z-10",
|
|
321
327
|
onClick: () => M(!1)
|
|
322
328
|
}), /* @__PURE__ */ m("div", {
|
|
323
329
|
className: "absolute top-full left-0 right-0 sm:right-auto mt-1 w-full sm:w-80 bg-popover border border-border rounded-lg shadow-lg z-20 py-1 max-h-60 overflow-y-auto",
|
|
324
330
|
children: I.map((e, t) => /* @__PURE__ */ h("button", {
|
|
331
|
+
type: "button",
|
|
325
332
|
onClick: () => {
|
|
326
333
|
ke(t), M(!1);
|
|
327
334
|
},
|
|
@@ -329,8 +336,8 @@ var g = () => {
|
|
|
329
336
|
children: [/* @__PURE__ */ h("div", {
|
|
330
337
|
className: "flex items-center gap-3 min-w-0",
|
|
331
338
|
children: [/* @__PURE__ */ m("div", {
|
|
332
|
-
className: "
|
|
333
|
-
children: /* @__PURE__ */ m(l, { className: "
|
|
339
|
+
className: "size-8 rounded-lg bg-muted flex items-center justify-center flex-shrink-0",
|
|
340
|
+
children: /* @__PURE__ */ m(l, { className: "size-4 text-muted-foreground" })
|
|
334
341
|
}), /* @__PURE__ */ h("div", {
|
|
335
342
|
className: "text-left min-w-0",
|
|
336
343
|
children: [/* @__PURE__ */ m("p", {
|
|
@@ -348,7 +355,7 @@ var g = () => {
|
|
|
348
355
|
]
|
|
349
356
|
})]
|
|
350
357
|
})]
|
|
351
|
-
}), Oe === t && /* @__PURE__ */ m(ve, { className: "
|
|
358
|
+
}), Oe === t && /* @__PURE__ */ m(ve, { className: "size-4 text-primary flex-shrink-0" })]
|
|
352
359
|
}, e.id))
|
|
353
360
|
})] })]
|
|
354
361
|
}), /* @__PURE__ */ m(de, {
|
|
@@ -379,38 +386,42 @@ var g = () => {
|
|
|
379
386
|
className: "space-y-2",
|
|
380
387
|
children: [
|
|
381
388
|
/* @__PURE__ */ h("button", {
|
|
389
|
+
type: "button",
|
|
382
390
|
onClick: () => P && Q(`/transactions/${P.id}`),
|
|
383
391
|
disabled: !P,
|
|
384
392
|
className: "w-full flex items-center gap-3 px-3 py-2.5 text-sm text-left text-foreground hover:bg-muted rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
|
|
385
393
|
children: [/* @__PURE__ */ m("div", {
|
|
386
|
-
className: "
|
|
387
|
-
children: /* @__PURE__ */ m(Se, { className: "
|
|
394
|
+
className: "size-8 rounded bg-status-info-bg-subtle flex items-center justify-center",
|
|
395
|
+
children: /* @__PURE__ */ m(Se, { className: "size-4 text-accent-blue" })
|
|
388
396
|
}), "View Transactions"]
|
|
389
397
|
}),
|
|
390
398
|
/* @__PURE__ */ h("button", {
|
|
399
|
+
type: "button",
|
|
391
400
|
onClick: () => P && Q(`/creditTransactions/${P.id}`),
|
|
392
401
|
disabled: !P,
|
|
393
402
|
className: "w-full flex items-center gap-3 px-3 py-2.5 text-sm text-left text-foreground hover:bg-muted rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
|
|
394
403
|
children: [/* @__PURE__ */ m("div", {
|
|
395
|
-
className: "
|
|
396
|
-
children: /* @__PURE__ */ m(f, { className: "
|
|
404
|
+
className: "size-8 rounded bg-status-warning-bg-subtle flex items-center justify-center",
|
|
405
|
+
children: /* @__PURE__ */ m(f, { className: "size-4 text-status-warning-text" })
|
|
397
406
|
}), "Credit History"]
|
|
398
407
|
}),
|
|
399
408
|
/* @__PURE__ */ h("button", {
|
|
409
|
+
type: "button",
|
|
400
410
|
onClick: () => Q("/checkout/credits"),
|
|
401
411
|
className: "w-full flex items-center gap-3 px-3 py-2.5 text-sm text-left text-foreground hover:bg-muted rounded-lg transition-colors",
|
|
402
412
|
children: [/* @__PURE__ */ m("div", {
|
|
403
|
-
className: "
|
|
404
|
-
children: /* @__PURE__ */ m(be, { className: "
|
|
413
|
+
className: "size-8 rounded bg-status-success-bg-subtle flex items-center justify-center",
|
|
414
|
+
children: /* @__PURE__ */ m(be, { className: "size-4 text-status-success-text" })
|
|
405
415
|
}), "Purchase Credits"]
|
|
406
416
|
}),
|
|
407
417
|
/* @__PURE__ */ h("button", {
|
|
418
|
+
type: "button",
|
|
408
419
|
onClick: () => P && Q(`/usage?billingAccountId=${P.id}`),
|
|
409
420
|
disabled: !P,
|
|
410
421
|
className: "w-full flex items-center gap-3 px-3 py-2.5 text-sm text-left text-foreground hover:bg-muted rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
|
|
411
422
|
children: [/* @__PURE__ */ m("div", {
|
|
412
|
-
className: "
|
|
413
|
-
children: /* @__PURE__ */ m(ge, { className: "
|
|
423
|
+
className: "size-8 rounded bg-accent-violet-subtle flex items-center justify-center",
|
|
424
|
+
children: /* @__PURE__ */ m(ge, { className: "size-4 text-accent-violet" })
|
|
414
425
|
}), "Usage Analytics"]
|
|
415
426
|
})
|
|
416
427
|
]
|
|
@@ -420,8 +431,8 @@ var g = () => {
|
|
|
420
431
|
children: [/* @__PURE__ */ h("div", {
|
|
421
432
|
className: "flex items-start gap-3 mb-4",
|
|
422
433
|
children: [/* @__PURE__ */ m("div", {
|
|
423
|
-
className: "
|
|
424
|
-
children: /* @__PURE__ */ m(Ce, { className: "
|
|
434
|
+
className: "size-10 rounded-lg bg-primary/10 flex items-center justify-center flex-shrink-0",
|
|
435
|
+
children: /* @__PURE__ */ m(Ce, { className: "size-5 text-primary" })
|
|
425
436
|
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h3", {
|
|
426
437
|
className: "font-semibold text-foreground",
|
|
427
438
|
children: "Get Started"
|
|
@@ -430,9 +441,10 @@ var g = () => {
|
|
|
430
441
|
children: "Choose a plan that fits your needs to unlock all features"
|
|
431
442
|
})] })]
|
|
432
443
|
}), /* @__PURE__ */ h("button", {
|
|
444
|
+
type: "button",
|
|
433
445
|
onClick: () => Q("/plans"),
|
|
434
446
|
className: "w-full flex items-center justify-center gap-2 px-4 py-2.5 text-sm font-medium text-primary-foreground bg-primary rounded-lg hover:bg-primary/90 transition-colors",
|
|
435
|
-
children: ["Browse Plans", /* @__PURE__ */ m(_e, { className: "
|
|
447
|
+
children: ["Browse Plans", /* @__PURE__ */ m(_e, { className: "size-4" })]
|
|
436
448
|
})]
|
|
437
449
|
})]
|
|
438
450
|
})]
|