@umituz/web-dashboard 3.1.11 → 3.2.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umituz/web-dashboard",
3
- "version": "3.1.11",
3
+ "version": "3.2.1",
4
4
  "description": "Dashboard Layout System - Comprehensive analytics, calendar, customizable layouts, and config-based architecture",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -63,7 +63,8 @@
63
63
  "react-dom": "^18.0.0 || ^19.0.0",
64
64
  "react-router-dom": "^6.0.0 || ^7.0.0",
65
65
  "firebase": "^10.0.0 || ^11.0.0 || ^12.0.0",
66
- "@umituz/web-firebase": "^3.0.0"
66
+ "@umituz/web-firebase": "^3.0.0",
67
+ "@umituz/web-polar-payment": "^1.0.20"
67
68
  },
68
69
  "dependencies": {
69
70
  "class-variance-authority": "^0.7.1",
@@ -0,0 +1,49 @@
1
+ /**
2
+ * BillingPage Component
3
+ *
4
+ * Complete billing page for displaying subscription, invoices, and plan management
5
+ * Data fetching should be handled by passing billing summary
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * <BillingPage
10
+ * billing={billingData}
11
+ * loading={false}
12
+ * activeTab="overview"
13
+ * onTabChange={(tab) => setActiveTab(tab)}
14
+ * />
15
+ * ```
16
+ */
17
+
18
+ import { BillingLayout, BillingPortal } from ".";
19
+ import type { BillingPortalProps } from "../types/billing";
20
+
21
+ export interface BillingPageProps extends Omit<BillingPortalProps, "showTabs"> {
22
+ /** Billing configuration */
23
+ config?: {
24
+ brandName?: string;
25
+ supportEmail?: string;
26
+ };
27
+ }
28
+
29
+ /**
30
+ * BillingPage Component
31
+ *
32
+ * Ready-to-use billing page component
33
+ * Combine BillingLayout with BillingPortal
34
+ */
35
+ export const BillingPage = ({ config, ...portalProps }: BillingPageProps) => {
36
+ const billingConfig = {
37
+ brandName: config?.brandName || "Growth Factory",
38
+ supportEmail: config?.supportEmail,
39
+ plans: [],
40
+ };
41
+
42
+ return (
43
+ <BillingLayout config={billingConfig}>
44
+ <BillingPortal showTabs={true} {...portalProps} />
45
+ </BillingLayout>
46
+ );
47
+ };
48
+
49
+ export default BillingPage;
@@ -10,3 +10,4 @@ export { InvoiceCard } from "./InvoiceCard";
10
10
  export { UsageCard } from "./UsageCard";
11
11
  export { BillingPortal } from "./BillingPortal";
12
12
  export { BillingLayout } from "./BillingLayout";
13
+ export { BillingPage } from "./BillingPage";
@@ -12,6 +12,7 @@ export {
12
12
  UsageCard,
13
13
  BillingPortal,
14
14
  BillingLayout,
15
+ BillingPage,
15
16
  } from "./components";
16
17
 
17
18
  // Hooks
@@ -42,6 +43,8 @@ export {
42
43
  formatFeature,
43
44
  isPopularPlan,
44
45
  getTrialDaysText,
46
+ transformPolarProductToPlan,
47
+ transformPolarProducts,
45
48
  } from "./utils";
46
49
 
47
50
  // Types
@@ -66,4 +69,5 @@ export type {
66
69
  BillingPortalProps,
67
70
  BillingLayoutProps,
68
71
  BillingConfig,
72
+ BillingPageProps,
69
73
  } from "./types";
@@ -26,3 +26,5 @@ export type {
26
26
  BillingLayoutProps,
27
27
  BillingConfig,
28
28
  } from "./billing";
29
+
30
+ export type { BillingPageProps } from "../components/BillingPage";
@@ -27,3 +27,5 @@ export {
27
27
  isPopularPlan,
28
28
  getTrialDaysText,
29
29
  } from "./billing";
30
+
31
+ export { transformPolarProductToPlan, transformPolarProducts } from "./polar";
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Polar.sh Integration Helpers
3
+ *
4
+ * Utility functions to transform Polar.sh data to billing types
5
+ *
6
+ * Note: These utilities require @umituz/web-polar-payment to be installed
7
+ */
8
+
9
+ import type { PlanTier } from "../types/billing";
10
+
11
+ // Polar types - will be resolved if package is installed
12
+ type PolarProduct = {
13
+ id: string;
14
+ name: string;
15
+ description: string | null;
16
+ is_archived: boolean;
17
+ prices: PolarPrice[];
18
+ benefits: Array<{ description: string | null }>;
19
+ };
20
+
21
+ type PolarPrice = {
22
+ amount?: number;
23
+ currency: string;
24
+ recurring_interval?: string;
25
+ is_archived: boolean;
26
+ };
27
+
28
+ /**
29
+ * Transform Polar product to billing plan format
30
+ */
31
+ export function transformPolarProductToPlan(
32
+ product: PolarProduct,
33
+ price: PolarPrice
34
+ ): PlanTier {
35
+ const amount = price.amount || 0;
36
+ const monthlyAmount = price.recurring_interval === "month" ? amount : amount / 12;
37
+
38
+ return {
39
+ id: product.id,
40
+ name: product.name,
41
+ description: product.description || "",
42
+ monthlyPrice: Math.round(monthlyAmount),
43
+ yearlyPrice: Math.round(amount),
44
+ currency: price.currency.toUpperCase() as PlanTier["currency"],
45
+ features: product.benefits
46
+ .map((b: { description: string | null }) => b.description || "")
47
+ .filter(Boolean),
48
+ };
49
+ }
50
+
51
+ /**
52
+ * Transform multiple Polar products to billing plans
53
+ */
54
+ export function transformPolarProducts(products: PolarProduct[]): PlanTier[] {
55
+ return products
56
+ .filter((product) => !product.is_archived)
57
+ .flatMap((product) => {
58
+ const activePrices = product.prices.filter((p: PolarPrice) => !p.is_archived);
59
+ return activePrices.map((price: PolarPrice) =>
60
+ transformPolarProductToPlan(product, price)
61
+ );
62
+ });
63
+ }