@omnikit-js/ui 0.9.4 → 0.9.5
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-FTRSN5WE.js → chunk-ROXYZX4K.js} +3 -3
- package/dist/{chunk-FTRSN5WE.js.map → chunk-ROXYZX4K.js.map} +1 -1
- package/dist/{chunk-7QQASFLM.js → chunk-V6P6L6UT.js} +64 -70
- package/dist/chunk-V6P6L6UT.js.map +1 -0
- package/dist/components/client/index.js +1 -1
- package/dist/components/server/index.js +2 -2
- package/dist/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-7QQASFLM.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BillingContent } from './chunk-
|
|
1
|
+
import { BillingContent } from './chunk-V6P6L6UT.js';
|
|
2
2
|
import { Alert, Table } from '@marcoschwartz/lite-ui';
|
|
3
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -473,5 +473,5 @@ function formatDate(dateString) {
|
|
|
473
473
|
}
|
|
474
474
|
|
|
475
475
|
export { Billing, DataList, OmniKitClient, createOmniKitClient };
|
|
476
|
-
//# sourceMappingURL=chunk-
|
|
477
|
-
//# sourceMappingURL=chunk-
|
|
476
|
+
//# sourceMappingURL=chunk-ROXYZX4K.js.map
|
|
477
|
+
//# sourceMappingURL=chunk-ROXYZX4K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/omnikit-client.ts","../src/components/server/DataList/index.tsx","../src/components/server/Billing/client.ts","../src/components/server/Billing/index.tsx"],"names":["jsxs","Alert","jsx"],"mappings":"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","file":"chunk-FTRSN5WE.js","sourcesContent":["/**\n * OmniKit API Client\n * Wrapper for making requests to OmniKit serverless platform\n */\n\nimport type {\n QueryOptions,\n QueryResponse,\n SingleRecordResponse,\n MutationResponse,\n OmniKitConfig,\n} from './types'\n\nexport class OmniKitClient {\n private baseUrl: string\n private apiKey?: string\n private jwt?: string\n\n constructor(config: OmniKitConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '') // Remove trailing slash\n this.apiKey = config.apiKey\n this.jwt = config.jwt\n }\n\n private getHeaders(): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n }\n\n if (this.jwt) {\n headers['Authorization'] = `Bearer ${this.jwt}`\n } else if (this.apiKey) {\n headers['X-API-Key'] = this.apiKey\n }\n\n return headers\n }\n\n private async request<T>(\n endpoint: string,\n options?: RequestInit\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.getHeaders(),\n ...options?.headers,\n },\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }))\n throw new Error(error.error || `HTTP ${response.status}`)\n }\n\n return response.json()\n }\n\n /**\n * Query records from a table\n */\n async query<T = any>(\n table: string,\n options?: QueryOptions\n ): Promise<QueryResponse<T>> {\n const params = new URLSearchParams()\n\n if (options?.filter) {\n params.append('filter', JSON.stringify(options.filter))\n }\n if (options?.sort) {\n params.append('sort', options.sort)\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString())\n }\n if (options?.offset) {\n params.append('offset', options.offset.toString())\n }\n\n const queryString = params.toString()\n const endpoint = `/data/${table}${queryString ? `?${queryString}` : ''}`\n\n return this.request<QueryResponse<T>>(endpoint)\n }\n\n /**\n * Find a record by ID\n */\n async findById<T = any>(\n table: string,\n id: string | number\n ): Promise<SingleRecordResponse<T>> {\n return this.request<SingleRecordResponse<T>>(`/data/${table}/${id}`)\n }\n\n /**\n * Insert a new record\n */\n async insert(\n table: string,\n data: Record<string, any>\n ): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Update an existing record\n */\n async update(\n table: string,\n id: string | number,\n data: Record<string, any>\n ): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Delete a record\n */\n async delete(table: string, id: string | number): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}/${id}`, {\n method: 'DELETE',\n })\n }\n\n /**\n * Upsert a record (insert or update)\n */\n async upsert(\n table: string,\n data: Record<string, any>\n ): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n }\n}\n\n/**\n * Create a new OmniKit client instance\n */\nexport function createOmniKitClient(config: OmniKitConfig): OmniKitClient {\n return new OmniKitClient(config)\n}\n","/**\n * DataList Component\n *\n * A server-side React component that fetches and displays data from OmniKit API.\n * Renders on the server with zero client JavaScript for data fetching.\n * Uses lite-ui Table component for consistent styling.\n *\n * @example\n * ```tsx\n * import { DataList } from '@omnikit-js/ui'\n *\n * export default function UsersPage() {\n * return (\n * <DataList\n * table=\"users\"\n * baseUrl={process.env.OMNIKIT_BASE_URL}\n * apiKey={process.env.OMNIKIT_API_KEY}\n * columns={['name', 'email', 'created_at']}\n * filter={{ active: true }}\n * limit={20}\n * />\n * )\n * }\n * ```\n */\n\nimport { Table, Alert } from '@marcoschwartz/lite-ui'\nimport { createOmniKitClient } from '../../../lib/omnikit-client'\nimport type { DataListProps, Column, ColumnDefinition } from './types'\n\nfunction normalizeColumn<T>(column: Column<T>): ColumnDefinition<T> {\n if (typeof column === 'string') {\n return {\n key: column,\n label: column.charAt(0).toUpperCase() + column.slice(1).replace(/_/g, ' '),\n sortable: true,\n }\n }\n return {\n ...column,\n label: column.label || column.key.charAt(0).toUpperCase() + column.key.slice(1).replace(/_/g, ' '),\n }\n}\n\nexport async function DataList<T extends Record<string, any>>({\n table,\n baseUrl,\n apiKey,\n jwt,\n columns,\n keyField = 'id' as keyof T,\n filter,\n sort,\n limit,\n offset,\n className = '',\n emptyMessage = 'No data found',\n errorMessage = 'Failed to load data',\n}: DataListProps<T>) {\n // Create API client\n const client = createOmniKitClient({ baseUrl, apiKey, jwt })\n\n // Fetch data\n let data: T[] = []\n let error: string | null = null\n\n try {\n const response = await client.query<T>(table, {\n filter,\n sort,\n limit,\n offset,\n })\n\n if (response.success) {\n data = response.data\n } else {\n error = response.error || errorMessage\n }\n } catch (err) {\n error = err instanceof Error ? err.message : errorMessage\n }\n\n // Normalize columns for lite-ui Table format\n const normalizedColumns = columns.map(normalizeColumn)\n\n // Pre-render data with custom render functions (since we can't pass functions to client components)\n const processedData = data.map((row) => {\n const processedRow: Record<string, any> = { ...row }\n normalizedColumns.forEach((col) => {\n if (col.render) {\n const value = col.key.split('.').reduce((obj, k) => obj?.[k], row)\n processedRow[`__rendered_${col.key}`] = col.render(value, row)\n }\n })\n return processedRow\n })\n\n const tableColumns = normalizedColumns.map((col) => ({\n key: col.render ? `__rendered_${col.key}` : col.key,\n title: col.label || col.key,\n }))\n\n // Error state\n if (error) {\n return (\n <Alert variant=\"error\" className={className}>\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1 text-sm\">{error}</p>\n </Alert>\n )\n }\n\n // Empty state\n if (data.length === 0) {\n return (\n <Alert variant=\"info\" className={className}>\n {emptyMessage}\n </Alert>\n )\n }\n\n // Render table using lite-ui Table component\n return (\n <Table\n columns={tableColumns}\n data={processedData}\n keyField={String(keyField)}\n hoverable\n responsive\n className={className}\n />\n )\n}\n","/**\n * Billing API Client\n *\n * Handles all API calls for the Billing component.\n */\n\nimport type {\n BillingData,\n BillingProps,\n Customer,\n Product,\n Subscription,\n Invoice,\n PaymentMethod,\n ProductFeature\n} from './types';\n\ninterface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\ninterface BillingClientConfig {\n baseUrl: string;\n apiKey?: string;\n accessToken?: string;\n projectId: number;\n}\n\nfunction createHeaders(config: BillingClientConfig): 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: BillingClientConfig,\n url: string,\n options: RequestInit = {}\n): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n ...createHeaders(config),\n ...options.headers as Record<string, string>,\n },\n // Prevent infinite re-fetching in Next.js\n cache: 'no-store',\n });\n\n // Check for non-OK responses before parsing\n if (!response.ok) {\n // Try to get error message from JSON, fallback to status text\n try {\n const errorData = await response.json();\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}: ${response.statusText}`\n };\n } catch {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`\n };\n }\n }\n\n // Check content type to avoid parsing HTML as JSON\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return {\n success: false,\n error: 'Invalid response: expected JSON'\n };\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'API request failed'\n };\n }\n}\n\n/**\n * Get or create customer for a user\n */\nasync function getOrCreateCustomer(\n config: BillingClientConfig,\n userId: string,\n organizationId: number,\n email: string,\n name?: string,\n testMode: boolean = true\n): Promise<ApiResponse<Customer>> {\n const { baseUrl, projectId } = config;\n\n // Try to get existing customer\n const customerData = await fetchAPI<Customer>(\n config,\n `${baseUrl}/billing/customers/by-user/${userId}?project_id=${projectId}`\n );\n\n if (customerData.success && customerData.data) {\n return customerData;\n }\n\n // Create new customer\n const createData = await fetchAPI<Customer>(\n config,\n `${baseUrl}/billing/customers`,\n {\n method: 'POST',\n body: JSON.stringify({\n project_id: projectId,\n user_id: userId,\n organization_id: organizationId,\n email,\n name,\n test_mode: testMode,\n sync_to_stripe: true\n })\n }\n );\n\n return createData;\n}\n\ninterface UserData {\n id: number;\n uuid?: string;\n email: string;\n full_name?: string;\n display_name?: string;\n organization_id?: number;\n}\n\n/**\n * Fetch user data by user ID\n */\nasync function fetchUserData(\n config: BillingClientConfig,\n userId: string\n): Promise<ApiResponse<UserData>> {\n const { baseUrl } = config;\n\n // Use the data/users endpoint (same as DataList uses)\n return fetchAPI<UserData>(\n config,\n `${baseUrl}/data/users/${userId}`\n );\n}\n\n/**\n * Fetch all billing data for a customer\n */\nexport async function fetchBillingData(\n props: BillingProps\n): Promise<ApiResponse<BillingData>> {\n const {\n baseUrl,\n apiKey,\n accessToken,\n projectId,\n userId,\n organizationId,\n userEmail,\n userName,\n testMode = true\n } = props;\n\n const config: BillingClientConfig = { baseUrl, apiKey, accessToken, projectId };\n\n try {\n // If email not provided, fetch user data first\n let email = userEmail;\n let name = userName;\n let orgId = organizationId;\n\n if (!email) {\n const userResult = await fetchUserData(config, userId);\n if (userResult.success && userResult.data) {\n email = userResult.data.email;\n name = name || userResult.data.full_name || userResult.data.display_name;\n orgId = orgId || userResult.data.organization_id;\n } else {\n return { success: false, error: userResult.error || 'User not found. Please provide userEmail.' };\n }\n }\n\n // 1. Get or create customer\n const finalOrgId = orgId || 1; // Default org if not provided\n const customerResult = await getOrCreateCustomer(\n config,\n userId,\n finalOrgId,\n email,\n name,\n testMode\n );\n\n if (!customerResult.success || !customerResult.data) {\n return { success: false, error: customerResult.error || 'Failed to get customer' };\n }\n\n const customer = customerResult.data;\n const customerId = customer.id;\n\n // 2. Fetch all billing data in parallel\n const [\n subsData,\n productsData,\n pricesData,\n entitlementsData,\n invoicesData,\n pmData\n ] = await Promise.all([\n fetchAPI<Subscription[]>(config, `${baseUrl}/billing/subscriptions?project_id=${projectId}&customer_id=${customerId}&status=active&include_items=true`),\n fetchAPI<Product[]>(config, `${baseUrl}/billing/products?project_id=${projectId}&limit=100&include_prices=false`),\n fetchAPI<any[]>(config, `${baseUrl}/billing/products/prices?project_id=${projectId}&limit=1000`),\n fetchAPI<any[]>(config, `${baseUrl}/billing/entitlements/list-entitlements?project_id=${projectId}&customer_id=${customerId}`),\n fetchAPI<Invoice[]>(config, `${baseUrl}/billing/invoices?project_id=${projectId}&customer_id=${customerId}&limit=10&sort=due_date:desc&include_line_items=true`),\n fetchAPI<PaymentMethod[]>(config, `${baseUrl}/billing/customers/${customerId}/payment-methods?project_id=${projectId}&status=active`)\n ]);\n\n const currentSubscription = subsData.success && subsData.data && subsData.data.length > 0\n ? subsData.data[0]\n : null;\n const products = productsData.success && productsData.data ? productsData.data : [];\n const allPrices = pricesData.success && pricesData.data ? pricesData.data : [];\n const entitlements = entitlementsData.success && entitlementsData.data ? entitlementsData.data : [];\n const invoices = invoicesData.success && invoicesData.data ? invoicesData.data : [];\n const paymentMethods = pmData.success && pmData.data ? pmData.data : [];\n\n // 3. Group prices by product\n const pricesByProduct: Record<number, any[]> = {};\n allPrices.forEach((price: any) => {\n if (!pricesByProduct[price.product_id]) {\n pricesByProduct[price.product_id] = [];\n }\n pricesByProduct[price.product_id].push(price);\n });\n\n products.forEach((product: Product) => {\n product.prices = pricesByProduct[product.id] || [];\n });\n\n // 4. Fetch product features for all products\n const productFeatures: Record<number, ProductFeature[]> = {};\n await Promise.all(\n products.map(async (product: Product) => {\n const featuresData = await fetchAPI<ProductFeature[]>(\n config,\n `${baseUrl}/billing/features/product/${product.id}?project_id=${projectId}&limit=100`\n );\n productFeatures[product.id] = featuresData.success && featuresData.data ? featuresData.data : [];\n })\n );\n\n const billingData: BillingData = {\n customer,\n currentSubscription,\n products,\n productFeatures,\n entitlements,\n invoices,\n paymentMethods\n };\n\n return { success: true, data: billingData };\n } catch (error) {\n console.error('Error fetching billing data:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to fetch billing data'\n };\n }\n}\n\n/**\n * Fetch payment configuration (Stripe publishable key)\n */\nexport async function fetchPaymentConfig(\n config: BillingClientConfig,\n testMode: boolean = true\n): Promise<ApiResponse<{ publishable_key: string }>> {\n const { baseUrl, projectId } = config;\n\n return fetchAPI(\n config,\n `${baseUrl}/billing/payment-config?project_id=${projectId}&test_mode=${testMode}`\n );\n}\n","/**\n * Billing Component\n *\n * A server-side React component that displays billing information for a SaaS application.\n * Fetches real data from OmniKit Billing API.\n *\n * User email and name are automatically fetched from user data if not provided.\n *\n * @example\n * ```tsx\n * import { Billing } from '@omnikit-js/ui'\n *\n * export default async function BillingPage() {\n * return (\n * <Billing\n * baseUrl={process.env.OMNIKIT_BASE_URL!}\n * apiKey={process.env.OMNIKIT_API_KEY}\n * projectId={1}\n * userId=\"user_123\"\n * />\n * )\n * }\n * ```\n */\n\nimport { Alert } from '@marcoschwartz/lite-ui'\nimport { BillingContent } from '../../client/BillingContent'\nimport { fetchBillingData } from './client'\nimport type { BillingProps } from './types'\n\nexport type { BillingProps } from './types'\nexport type {\n BillingData,\n Customer,\n Subscription,\n Product,\n Price,\n Invoice,\n PaymentMethod,\n Entitlement,\n ProductFeature\n} from './types'\n\nexport async function Billing(props: BillingProps) {\n const {\n className = '',\n errorMessage = 'Failed to load billing information'\n } = props;\n\n // Fetch billing data from API\n const result = await fetchBillingData(props);\n\n // Error state\n if (!result.success || !result.data) {\n return (\n <Alert variant=\"error\" className={className}>\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1 text-sm\">{result.error || errorMessage}</p>\n </Alert>\n );\n }\n\n const { data } = result;\n\n // Find current plan from subscription (like apteva-app does)\n const currentSubscriptionPriceId = data.currentSubscription?.items?.[0]?.price_id;\n const currentPlan = currentSubscriptionPriceId\n ? data.products.find(p => p.prices?.some(price => price.id === currentSubscriptionPriceId))\n : null;\n const currentPrice = currentPlan?.prices?.find(p => p.id === currentSubscriptionPriceId);\n\n // Transform data for BillingContent\n const subscription = data.currentSubscription ? {\n id: data.currentSubscription.id,\n plan: currentPlan?.name || 'Unknown Plan',\n status: data.currentSubscription.status,\n price: formatCurrency(\n currentPrice?.unit_amount || currentPrice?.amount || 0,\n data.currentSubscription.currency\n ),\n period: currentPrice?.recurring_interval || 'month',\n nextBilling: formatDate(data.currentSubscription.current_period_end),\n cancelAtPeriodEnd: data.currentSubscription.cancel_at_period_end,\n } : null;\n\n const invoices = data.invoices.map(inv => ({\n id: inv.number || inv.uuid,\n date: formatDate(inv.due_date || inv.created_at),\n amount: formatCurrency(inv.total || inv.amount_due, inv.currency),\n status: inv.status,\n url: inv.pdf_url || '#',\n }));\n\n const plans = data.products\n .filter(p => p.active && p.prices && p.prices.length > 0)\n .map(product => {\n const price = product.prices?.find(p => p.active) || product.prices?.[0];\n const features = data.productFeatures[product.id] || [];\n // Check if this product contains the current subscription's price\n const isCurrentPlan = currentSubscriptionPriceId\n ? product.prices?.some(p => p.id === currentSubscriptionPriceId)\n : false;\n\n // Get raw price amount for sorting\n const priceAmount = price?.unit_amount || 0;\n\n return {\n id: product.id,\n priceId: price?.id || 0,\n name: product.name,\n description: product.description,\n price: formatCurrency(priceAmount, price?.currency || 'usd'),\n priceAmount, // Raw amount in cents for sorting\n period: price?.recurring_interval || 'month',\n features: features.map(f => {\n // Get feature name and value\n const featureName = f.feature_name || f.feature_key || 'Feature';\n const featureValue = typeof f.value === 'object' && f.value !== null && 'value' in f.value\n ? f.value.value\n : f.value;\n const featureUnit = f.feature_unit || '';\n\n // If numeric feature with value, show it formatted\n if (featureValue !== undefined && featureValue !== null) {\n const formattedValue = typeof featureValue === 'number'\n ? featureValue.toLocaleString()\n : String(featureValue);\n return `${featureName}: ${formattedValue}${featureUnit ? ` ${featureUnit}` : ''}`.trim();\n }\n\n return featureName;\n }),\n current: isCurrentPlan || false,\n popular: product.name.toLowerCase().includes('pro') || product.name.toLowerCase().includes('professional'),\n };\n })\n .sort((a, b) => a.priceAmount - b.priceAmount); // Sort by price ascending (cheapest first)\n\n // Config for actions\n const actionConfig = {\n baseUrl: props.baseUrl,\n apiKey: props.apiKey,\n accessToken: props.accessToken,\n projectId: props.projectId,\n };\n\n return (\n <BillingContent\n subscription={subscription}\n invoices={invoices}\n paymentMethods={data.paymentMethods}\n plans={plans}\n customer={data.customer}\n entitlements={data.entitlements}\n actionConfig={actionConfig}\n className={className}\n />\n );\n}\n\n// Helper functions\nfunction formatCurrency(amount: number, currency: string = 'usd'): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency.toUpperCase(),\n });\n return formatter.format(amount / 100); // Stripe amounts are in cents\n}\n\nfunction formatDate(dateString: string | undefined): string {\n if (!dateString) return 'N/A';\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/omnikit-client.ts","../src/components/server/DataList/index.tsx","../src/components/server/Billing/client.ts","../src/components/server/Billing/index.tsx"],"names":["jsxs","Alert","jsx"],"mappings":"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","file":"chunk-ROXYZX4K.js","sourcesContent":["/**\n * OmniKit API Client\n * Wrapper for making requests to OmniKit serverless platform\n */\n\nimport type {\n QueryOptions,\n QueryResponse,\n SingleRecordResponse,\n MutationResponse,\n OmniKitConfig,\n} from './types'\n\nexport class OmniKitClient {\n private baseUrl: string\n private apiKey?: string\n private jwt?: string\n\n constructor(config: OmniKitConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '') // Remove trailing slash\n this.apiKey = config.apiKey\n this.jwt = config.jwt\n }\n\n private getHeaders(): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n }\n\n if (this.jwt) {\n headers['Authorization'] = `Bearer ${this.jwt}`\n } else if (this.apiKey) {\n headers['X-API-Key'] = this.apiKey\n }\n\n return headers\n }\n\n private async request<T>(\n endpoint: string,\n options?: RequestInit\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.getHeaders(),\n ...options?.headers,\n },\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }))\n throw new Error(error.error || `HTTP ${response.status}`)\n }\n\n return response.json()\n }\n\n /**\n * Query records from a table\n */\n async query<T = any>(\n table: string,\n options?: QueryOptions\n ): Promise<QueryResponse<T>> {\n const params = new URLSearchParams()\n\n if (options?.filter) {\n params.append('filter', JSON.stringify(options.filter))\n }\n if (options?.sort) {\n params.append('sort', options.sort)\n }\n if (options?.limit) {\n params.append('limit', options.limit.toString())\n }\n if (options?.offset) {\n params.append('offset', options.offset.toString())\n }\n\n const queryString = params.toString()\n const endpoint = `/data/${table}${queryString ? `?${queryString}` : ''}`\n\n return this.request<QueryResponse<T>>(endpoint)\n }\n\n /**\n * Find a record by ID\n */\n async findById<T = any>(\n table: string,\n id: string | number\n ): Promise<SingleRecordResponse<T>> {\n return this.request<SingleRecordResponse<T>>(`/data/${table}/${id}`)\n }\n\n /**\n * Insert a new record\n */\n async insert(\n table: string,\n data: Record<string, any>\n ): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}`, {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Update an existing record\n */\n async update(\n table: string,\n id: string | number,\n data: Record<string, any>\n ): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Delete a record\n */\n async delete(table: string, id: string | number): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}/${id}`, {\n method: 'DELETE',\n })\n }\n\n /**\n * Upsert a record (insert or update)\n */\n async upsert(\n table: string,\n data: Record<string, any>\n ): Promise<MutationResponse> {\n return this.request<MutationResponse>(`/data/${table}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n })\n }\n}\n\n/**\n * Create a new OmniKit client instance\n */\nexport function createOmniKitClient(config: OmniKitConfig): OmniKitClient {\n return new OmniKitClient(config)\n}\n","/**\n * DataList Component\n *\n * A server-side React component that fetches and displays data from OmniKit API.\n * Renders on the server with zero client JavaScript for data fetching.\n * Uses lite-ui Table component for consistent styling.\n *\n * @example\n * ```tsx\n * import { DataList } from '@omnikit-js/ui'\n *\n * export default function UsersPage() {\n * return (\n * <DataList\n * table=\"users\"\n * baseUrl={process.env.OMNIKIT_BASE_URL}\n * apiKey={process.env.OMNIKIT_API_KEY}\n * columns={['name', 'email', 'created_at']}\n * filter={{ active: true }}\n * limit={20}\n * />\n * )\n * }\n * ```\n */\n\nimport { Table, Alert } from '@marcoschwartz/lite-ui'\nimport { createOmniKitClient } from '../../../lib/omnikit-client'\nimport type { DataListProps, Column, ColumnDefinition } from './types'\n\nfunction normalizeColumn<T>(column: Column<T>): ColumnDefinition<T> {\n if (typeof column === 'string') {\n return {\n key: column,\n label: column.charAt(0).toUpperCase() + column.slice(1).replace(/_/g, ' '),\n sortable: true,\n }\n }\n return {\n ...column,\n label: column.label || column.key.charAt(0).toUpperCase() + column.key.slice(1).replace(/_/g, ' '),\n }\n}\n\nexport async function DataList<T extends Record<string, any>>({\n table,\n baseUrl,\n apiKey,\n jwt,\n columns,\n keyField = 'id' as keyof T,\n filter,\n sort,\n limit,\n offset,\n className = '',\n emptyMessage = 'No data found',\n errorMessage = 'Failed to load data',\n}: DataListProps<T>) {\n // Create API client\n const client = createOmniKitClient({ baseUrl, apiKey, jwt })\n\n // Fetch data\n let data: T[] = []\n let error: string | null = null\n\n try {\n const response = await client.query<T>(table, {\n filter,\n sort,\n limit,\n offset,\n })\n\n if (response.success) {\n data = response.data\n } else {\n error = response.error || errorMessage\n }\n } catch (err) {\n error = err instanceof Error ? err.message : errorMessage\n }\n\n // Normalize columns for lite-ui Table format\n const normalizedColumns = columns.map(normalizeColumn)\n\n // Pre-render data with custom render functions (since we can't pass functions to client components)\n const processedData = data.map((row) => {\n const processedRow: Record<string, any> = { ...row }\n normalizedColumns.forEach((col) => {\n if (col.render) {\n const value = col.key.split('.').reduce((obj, k) => obj?.[k], row)\n processedRow[`__rendered_${col.key}`] = col.render(value, row)\n }\n })\n return processedRow\n })\n\n const tableColumns = normalizedColumns.map((col) => ({\n key: col.render ? `__rendered_${col.key}` : col.key,\n title: col.label || col.key,\n }))\n\n // Error state\n if (error) {\n return (\n <Alert variant=\"error\" className={className}>\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1 text-sm\">{error}</p>\n </Alert>\n )\n }\n\n // Empty state\n if (data.length === 0) {\n return (\n <Alert variant=\"info\" className={className}>\n {emptyMessage}\n </Alert>\n )\n }\n\n // Render table using lite-ui Table component\n return (\n <Table\n columns={tableColumns}\n data={processedData}\n keyField={String(keyField)}\n hoverable\n responsive\n className={className}\n />\n )\n}\n","/**\n * Billing API Client\n *\n * Handles all API calls for the Billing component.\n */\n\nimport type {\n BillingData,\n BillingProps,\n Customer,\n Product,\n Subscription,\n Invoice,\n PaymentMethod,\n ProductFeature\n} from './types';\n\ninterface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\ninterface BillingClientConfig {\n baseUrl: string;\n apiKey?: string;\n accessToken?: string;\n projectId: number;\n}\n\nfunction createHeaders(config: BillingClientConfig): 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: BillingClientConfig,\n url: string,\n options: RequestInit = {}\n): Promise<ApiResponse<T>> {\n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n ...createHeaders(config),\n ...options.headers as Record<string, string>,\n },\n // Prevent infinite re-fetching in Next.js\n cache: 'no-store',\n });\n\n // Check for non-OK responses before parsing\n if (!response.ok) {\n // Try to get error message from JSON, fallback to status text\n try {\n const errorData = await response.json();\n return {\n success: false,\n error: errorData.error || `HTTP ${response.status}: ${response.statusText}`\n };\n } catch {\n return {\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`\n };\n }\n }\n\n // Check content type to avoid parsing HTML as JSON\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return {\n success: false,\n error: 'Invalid response: expected JSON'\n };\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'API request failed'\n };\n }\n}\n\n/**\n * Get or create customer for a user\n */\nasync function getOrCreateCustomer(\n config: BillingClientConfig,\n userId: string,\n organizationId: number,\n email: string,\n name?: string,\n testMode: boolean = true\n): Promise<ApiResponse<Customer>> {\n const { baseUrl, projectId } = config;\n\n // Try to get existing customer\n const customerData = await fetchAPI<Customer>(\n config,\n `${baseUrl}/billing/customers/by-user/${userId}?project_id=${projectId}`\n );\n\n if (customerData.success && customerData.data) {\n return customerData;\n }\n\n // Create new customer\n const createData = await fetchAPI<Customer>(\n config,\n `${baseUrl}/billing/customers`,\n {\n method: 'POST',\n body: JSON.stringify({\n project_id: projectId,\n user_id: userId,\n organization_id: organizationId,\n email,\n name,\n test_mode: testMode,\n sync_to_stripe: true\n })\n }\n );\n\n return createData;\n}\n\ninterface UserData {\n id: number;\n uuid?: string;\n email: string;\n full_name?: string;\n display_name?: string;\n organization_id?: number;\n}\n\n/**\n * Fetch user data by user ID\n */\nasync function fetchUserData(\n config: BillingClientConfig,\n userId: string\n): Promise<ApiResponse<UserData>> {\n const { baseUrl } = config;\n\n // Use the data/users endpoint (same as DataList uses)\n return fetchAPI<UserData>(\n config,\n `${baseUrl}/data/users/${userId}`\n );\n}\n\n/**\n * Fetch all billing data for a customer\n */\nexport async function fetchBillingData(\n props: BillingProps\n): Promise<ApiResponse<BillingData>> {\n const {\n baseUrl,\n apiKey,\n accessToken,\n projectId,\n userId,\n organizationId,\n userEmail,\n userName,\n testMode = true\n } = props;\n\n const config: BillingClientConfig = { baseUrl, apiKey, accessToken, projectId };\n\n try {\n // If email not provided, fetch user data first\n let email = userEmail;\n let name = userName;\n let orgId = organizationId;\n\n if (!email) {\n const userResult = await fetchUserData(config, userId);\n if (userResult.success && userResult.data) {\n email = userResult.data.email;\n name = name || userResult.data.full_name || userResult.data.display_name;\n orgId = orgId || userResult.data.organization_id;\n } else {\n return { success: false, error: userResult.error || 'User not found. Please provide userEmail.' };\n }\n }\n\n // 1. Get or create customer\n const finalOrgId = orgId || 1; // Default org if not provided\n const customerResult = await getOrCreateCustomer(\n config,\n userId,\n finalOrgId,\n email,\n name,\n testMode\n );\n\n if (!customerResult.success || !customerResult.data) {\n return { success: false, error: customerResult.error || 'Failed to get customer' };\n }\n\n const customer = customerResult.data;\n const customerId = customer.id;\n\n // 2. Fetch all billing data in parallel\n const [\n subsData,\n productsData,\n pricesData,\n entitlementsData,\n invoicesData,\n pmData\n ] = await Promise.all([\n fetchAPI<Subscription[]>(config, `${baseUrl}/billing/subscriptions?project_id=${projectId}&customer_id=${customerId}&status=active&include_items=true`),\n fetchAPI<Product[]>(config, `${baseUrl}/billing/products?project_id=${projectId}&limit=100&include_prices=false`),\n fetchAPI<any[]>(config, `${baseUrl}/billing/products/prices?project_id=${projectId}&limit=1000`),\n fetchAPI<any[]>(config, `${baseUrl}/billing/entitlements/list-entitlements?project_id=${projectId}&customer_id=${customerId}`),\n fetchAPI<Invoice[]>(config, `${baseUrl}/billing/invoices?project_id=${projectId}&customer_id=${customerId}&limit=10&sort=due_date:desc&include_line_items=true`),\n fetchAPI<PaymentMethod[]>(config, `${baseUrl}/billing/customers/${customerId}/payment-methods?project_id=${projectId}&status=active`)\n ]);\n\n const currentSubscription = subsData.success && subsData.data && subsData.data.length > 0\n ? subsData.data[0]\n : null;\n const products = productsData.success && productsData.data ? productsData.data : [];\n const allPrices = pricesData.success && pricesData.data ? pricesData.data : [];\n const entitlements = entitlementsData.success && entitlementsData.data ? entitlementsData.data : [];\n const invoices = invoicesData.success && invoicesData.data ? invoicesData.data : [];\n const paymentMethods = pmData.success && pmData.data ? pmData.data : [];\n\n // 3. Group prices by product\n const pricesByProduct: Record<number, any[]> = {};\n allPrices.forEach((price: any) => {\n if (!pricesByProduct[price.product_id]) {\n pricesByProduct[price.product_id] = [];\n }\n pricesByProduct[price.product_id].push(price);\n });\n\n products.forEach((product: Product) => {\n product.prices = pricesByProduct[product.id] || [];\n });\n\n // 4. Fetch product features for all products\n const productFeatures: Record<number, ProductFeature[]> = {};\n await Promise.all(\n products.map(async (product: Product) => {\n const featuresData = await fetchAPI<ProductFeature[]>(\n config,\n `${baseUrl}/billing/features/product/${product.id}?project_id=${projectId}&limit=100`\n );\n productFeatures[product.id] = featuresData.success && featuresData.data ? featuresData.data : [];\n })\n );\n\n const billingData: BillingData = {\n customer,\n currentSubscription,\n products,\n productFeatures,\n entitlements,\n invoices,\n paymentMethods\n };\n\n return { success: true, data: billingData };\n } catch (error) {\n console.error('Error fetching billing data:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to fetch billing data'\n };\n }\n}\n\n/**\n * Fetch payment configuration (Stripe publishable key)\n */\nexport async function fetchPaymentConfig(\n config: BillingClientConfig,\n testMode: boolean = true\n): Promise<ApiResponse<{ publishable_key: string }>> {\n const { baseUrl, projectId } = config;\n\n return fetchAPI(\n config,\n `${baseUrl}/billing/payment-config?project_id=${projectId}&test_mode=${testMode}`\n );\n}\n","/**\n * Billing Component\n *\n * A server-side React component that displays billing information for a SaaS application.\n * Fetches real data from OmniKit Billing API.\n *\n * User email and name are automatically fetched from user data if not provided.\n *\n * @example\n * ```tsx\n * import { Billing } from '@omnikit-js/ui'\n *\n * export default async function BillingPage() {\n * return (\n * <Billing\n * baseUrl={process.env.OMNIKIT_BASE_URL!}\n * apiKey={process.env.OMNIKIT_API_KEY}\n * projectId={1}\n * userId=\"user_123\"\n * />\n * )\n * }\n * ```\n */\n\nimport { Alert } from '@marcoschwartz/lite-ui'\nimport { BillingContent } from '../../client/BillingContent'\nimport { fetchBillingData } from './client'\nimport type { BillingProps } from './types'\n\nexport type { BillingProps } from './types'\nexport type {\n BillingData,\n Customer,\n Subscription,\n Product,\n Price,\n Invoice,\n PaymentMethod,\n Entitlement,\n ProductFeature\n} from './types'\n\nexport async function Billing(props: BillingProps) {\n const {\n className = '',\n errorMessage = 'Failed to load billing information'\n } = props;\n\n // Fetch billing data from API\n const result = await fetchBillingData(props);\n\n // Error state\n if (!result.success || !result.data) {\n return (\n <Alert variant=\"error\" className={className}>\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1 text-sm\">{result.error || errorMessage}</p>\n </Alert>\n );\n }\n\n const { data } = result;\n\n // Find current plan from subscription (like apteva-app does)\n const currentSubscriptionPriceId = data.currentSubscription?.items?.[0]?.price_id;\n const currentPlan = currentSubscriptionPriceId\n ? data.products.find(p => p.prices?.some(price => price.id === currentSubscriptionPriceId))\n : null;\n const currentPrice = currentPlan?.prices?.find(p => p.id === currentSubscriptionPriceId);\n\n // Transform data for BillingContent\n const subscription = data.currentSubscription ? {\n id: data.currentSubscription.id,\n plan: currentPlan?.name || 'Unknown Plan',\n status: data.currentSubscription.status,\n price: formatCurrency(\n currentPrice?.unit_amount || currentPrice?.amount || 0,\n data.currentSubscription.currency\n ),\n period: currentPrice?.recurring_interval || 'month',\n nextBilling: formatDate(data.currentSubscription.current_period_end),\n cancelAtPeriodEnd: data.currentSubscription.cancel_at_period_end,\n } : null;\n\n const invoices = data.invoices.map(inv => ({\n id: inv.number || inv.uuid,\n date: formatDate(inv.due_date || inv.created_at),\n amount: formatCurrency(inv.total || inv.amount_due, inv.currency),\n status: inv.status,\n url: inv.pdf_url || '#',\n }));\n\n const plans = data.products\n .filter(p => p.active && p.prices && p.prices.length > 0)\n .map(product => {\n const price = product.prices?.find(p => p.active) || product.prices?.[0];\n const features = data.productFeatures[product.id] || [];\n // Check if this product contains the current subscription's price\n const isCurrentPlan = currentSubscriptionPriceId\n ? product.prices?.some(p => p.id === currentSubscriptionPriceId)\n : false;\n\n // Get raw price amount for sorting\n const priceAmount = price?.unit_amount || 0;\n\n return {\n id: product.id,\n priceId: price?.id || 0,\n name: product.name,\n description: product.description,\n price: formatCurrency(priceAmount, price?.currency || 'usd'),\n priceAmount, // Raw amount in cents for sorting\n period: price?.recurring_interval || 'month',\n features: features.map(f => {\n // Get feature name and value\n const featureName = f.feature_name || f.feature_key || 'Feature';\n const featureValue = typeof f.value === 'object' && f.value !== null && 'value' in f.value\n ? f.value.value\n : f.value;\n const featureUnit = f.feature_unit || '';\n\n // If numeric feature with value, show it formatted\n if (featureValue !== undefined && featureValue !== null) {\n const formattedValue = typeof featureValue === 'number'\n ? featureValue.toLocaleString()\n : String(featureValue);\n return `${featureName}: ${formattedValue}${featureUnit ? ` ${featureUnit}` : ''}`.trim();\n }\n\n return featureName;\n }),\n current: isCurrentPlan || false,\n popular: product.name.toLowerCase().includes('pro') || product.name.toLowerCase().includes('professional'),\n };\n })\n .sort((a, b) => a.priceAmount - b.priceAmount); // Sort by price ascending (cheapest first)\n\n // Config for actions\n const actionConfig = {\n baseUrl: props.baseUrl,\n apiKey: props.apiKey,\n accessToken: props.accessToken,\n projectId: props.projectId,\n };\n\n return (\n <BillingContent\n subscription={subscription}\n invoices={invoices}\n paymentMethods={data.paymentMethods}\n plans={plans}\n customer={data.customer}\n entitlements={data.entitlements}\n actionConfig={actionConfig}\n className={className}\n />\n );\n}\n\n// Helper functions\nfunction formatCurrency(amount: number, currency: string = 'usd'): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency.toUpperCase(),\n });\n return formatter.format(amount / 100); // Stripe amounts are in cents\n}\n\nfunction formatDate(dateString: string | undefined): string {\n if (!dateString) return 'N/A';\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { Button, Tabs } from '@marcoschwartz/lite-ui';
|
|
3
|
+
import { Card, Button, Tabs } from '@marcoschwartz/lite-ui';
|
|
4
4
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
// src/components/client/BillingContent/index.tsx
|
|
@@ -242,65 +242,63 @@ function BillingContent({
|
|
|
242
242
|
content: /* @__PURE__ */ jsxs("div", { className: "space-y-6 mt-6", children: [
|
|
243
243
|
error && /* @__PURE__ */ jsx("div", { className: "p-4 bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 rounded-lg", children: error }),
|
|
244
244
|
success && /* @__PURE__ */ jsx("div", { className: "p-4 bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 rounded-lg", children: success }),
|
|
245
|
-
/* @__PURE__ */
|
|
246
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
247
|
-
/* @__PURE__ */ jsxs("div", {
|
|
248
|
-
/* @__PURE__ */
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
/* @__PURE__ */
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
] }) : /* @__PURE__ */ jsx("p", { className: "text-gray-600 dark:text-gray-400", children: "No active subscription" })
|
|
260
|
-
] }),
|
|
261
|
-
subscription && /* @__PURE__ */ jsx("span", { className: `inline-flex items-center rounded-full px-3 py-1 text-sm font-medium ${subscription.status === "active" ? "bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300" : subscription.status === "canceled" ? "bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300" : "bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300"}`, children: subscription.cancelAtPeriodEnd ? "Canceling" : subscription.status })
|
|
245
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs("div", { children: [
|
|
246
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between mb-4", children: [
|
|
247
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
248
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-2", children: "Current Plan" }),
|
|
249
|
+
subscription ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
250
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
|
|
251
|
+
/* @__PURE__ */ jsx("span", { className: "text-3xl font-bold", children: subscription.price }),
|
|
252
|
+
/* @__PURE__ */ jsxs("span", { className: "text-gray-600 dark:text-gray-400", children: [
|
|
253
|
+
"/ ",
|
|
254
|
+
subscription.period
|
|
255
|
+
] })
|
|
256
|
+
] }),
|
|
257
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-gray-600 dark:text-gray-400", children: subscription.plan })
|
|
258
|
+
] }) : /* @__PURE__ */ jsx("p", { className: "text-gray-600 dark:text-gray-400", children: "No active subscription" })
|
|
262
259
|
] }),
|
|
263
|
-
subscription && /* @__PURE__ */ jsx("
|
|
264
|
-
/* @__PURE__ */ jsx("span", { className: "text-gray-600 dark:text-gray-400", children: "Next billing date" }),
|
|
265
|
-
/* @__PURE__ */ jsx("span", { className: "font-medium", children: subscription.nextBilling })
|
|
266
|
-
] }) }),
|
|
267
|
-
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
268
|
-
/* @__PURE__ */ jsx(Button, { className: "flex-1", disabled: isLoading, children: subscription ? "Change Plan" : "Choose a Plan" }),
|
|
269
|
-
subscription && !subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsx(
|
|
270
|
-
Button,
|
|
271
|
-
{
|
|
272
|
-
variant: "secondary",
|
|
273
|
-
onClick: handleCancelSubscription,
|
|
274
|
-
disabled: isLoading,
|
|
275
|
-
children: "Cancel"
|
|
276
|
-
}
|
|
277
|
-
)
|
|
278
|
-
] })
|
|
260
|
+
subscription && /* @__PURE__ */ jsx("span", { className: `inline-flex items-center rounded-full px-3 py-1 text-sm font-medium ${subscription.status === "active" ? "bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300" : subscription.status === "canceled" ? "bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300" : "bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300"}`, children: subscription.cancelAtPeriodEnd ? "Canceling" : subscription.status })
|
|
279
261
|
] }),
|
|
280
|
-
|
|
281
|
-
/* @__PURE__ */ jsx("
|
|
282
|
-
/* @__PURE__ */ jsx("
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
limit
|
|
294
|
-
},
|
|
295
|
-
ent.id
|
|
296
|
-
);
|
|
262
|
+
subscription && /* @__PURE__ */ jsx("div", { className: "space-y-3 mb-4", children: /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
|
|
263
|
+
/* @__PURE__ */ jsx("span", { className: "text-gray-600 dark:text-gray-400", children: "Next billing date" }),
|
|
264
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: subscription.nextBilling })
|
|
265
|
+
] }) }),
|
|
266
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-3", children: [
|
|
267
|
+
/* @__PURE__ */ jsx(Button, { className: "flex-1", disabled: isLoading, children: subscription ? "Change Plan" : "Choose a Plan" }),
|
|
268
|
+
subscription && !subscription.cancelAtPeriodEnd && /* @__PURE__ */ jsx(
|
|
269
|
+
Button,
|
|
270
|
+
{
|
|
271
|
+
variant: "secondary",
|
|
272
|
+
onClick: handleCancelSubscription,
|
|
273
|
+
disabled: isLoading,
|
|
274
|
+
children: "Cancel"
|
|
297
275
|
}
|
|
298
|
-
|
|
299
|
-
/* @__PURE__ */ jsx("span", { className: "text-gray-700 dark:text-gray-300", children: featureName }),
|
|
300
|
-
/* @__PURE__ */ jsx("span", { className: "font-medium text-green-600 dark:text-green-400", children: entValue !== void 0 && entValue !== null ? String(entValue) : "Enabled" })
|
|
301
|
-
] }, ent.id);
|
|
302
|
-
}) })
|
|
276
|
+
)
|
|
303
277
|
] })
|
|
278
|
+
] }) }),
|
|
279
|
+
entitlements.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
|
|
280
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-4", children: "Current Usage" }),
|
|
281
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: entitlements.map((ent) => {
|
|
282
|
+
const featureName = ent.feature_key.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
283
|
+
const entValue = typeof ent.value === "object" && ent.value?.value !== void 0 ? ent.value.value : ent.value;
|
|
284
|
+
const limit = typeof entValue === "number" ? entValue : 0;
|
|
285
|
+
const used = ent.usage_count || 0;
|
|
286
|
+
if (typeof entValue === "number" && entValue > 0) {
|
|
287
|
+
return /* @__PURE__ */ jsx(
|
|
288
|
+
UsageBar,
|
|
289
|
+
{
|
|
290
|
+
label: featureName,
|
|
291
|
+
used,
|
|
292
|
+
limit
|
|
293
|
+
},
|
|
294
|
+
ent.id
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm p-3 bg-gray-50 dark:bg-neutral-800 rounded-lg", children: [
|
|
298
|
+
/* @__PURE__ */ jsx("span", { className: "text-gray-700 dark:text-gray-300", children: featureName }),
|
|
299
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-green-600 dark:text-green-400", children: entValue !== void 0 && entValue !== null ? String(entValue) : "Enabled" })
|
|
300
|
+
] }, ent.id);
|
|
301
|
+
}) })
|
|
304
302
|
] })
|
|
305
303
|
] })
|
|
306
304
|
},
|
|
@@ -370,11 +368,9 @@ function BillingContent({
|
|
|
370
368
|
{
|
|
371
369
|
id: "invoices",
|
|
372
370
|
label: "Invoices",
|
|
373
|
-
content: /* @__PURE__ */
|
|
374
|
-
/* @__PURE__ */
|
|
375
|
-
|
|
376
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-6", children: "View and download your past invoices" })
|
|
377
|
-
] }),
|
|
371
|
+
content: /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
372
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-2", children: "Invoice History" }),
|
|
373
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-6", children: "View and download your past invoices" }),
|
|
378
374
|
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 border border-gray-200 dark:border-neutral-700 rounded-lg hover:bg-gray-50 dark:hover:bg-neutral-800 transition-colors", children: [
|
|
379
375
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
380
376
|
/* @__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" }) }) }),
|
|
@@ -399,16 +395,14 @@ function BillingContent({
|
|
|
399
395
|
)
|
|
400
396
|
] })
|
|
401
397
|
] }, invoice.id)) })
|
|
402
|
-
] })
|
|
398
|
+
] }) })
|
|
403
399
|
},
|
|
404
400
|
{
|
|
405
401
|
id: "payment",
|
|
406
402
|
label: "Payment Method",
|
|
407
|
-
content: /* @__PURE__ */
|
|
408
|
-
/* @__PURE__ */
|
|
409
|
-
|
|
410
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-6", children: "Manage your payment methods" })
|
|
411
|
-
] }),
|
|
403
|
+
content: /* @__PURE__ */ jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
404
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-2", children: "Payment Methods" }),
|
|
405
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-6", children: "Manage your payment methods" }),
|
|
412
406
|
paymentMethods.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "text-center py-8 border border-dashed border-gray-300 dark:border-neutral-700 rounded-lg", children: [
|
|
413
407
|
/* @__PURE__ */ jsx("p", { className: "text-gray-500 dark:text-gray-400 mb-4", children: "No payment methods on file" }),
|
|
414
408
|
/* @__PURE__ */ jsx(Button, { children: "Add Payment Method" })
|
|
@@ -458,12 +452,12 @@ function BillingContent({
|
|
|
458
452
|
] }, pm.id)),
|
|
459
453
|
/* @__PURE__ */ jsx(Button, { variant: "secondary", className: "w-full mt-4", children: "Add Payment Method" })
|
|
460
454
|
] })
|
|
461
|
-
] })
|
|
455
|
+
] }) })
|
|
462
456
|
}
|
|
463
457
|
];
|
|
464
458
|
return /* @__PURE__ */ jsx("div", { className, children: /* @__PURE__ */ jsx(Tabs, { tabs, defaultIndex: 0 }) });
|
|
465
459
|
}
|
|
466
460
|
|
|
467
461
|
export { BillingContent };
|
|
468
|
-
//# sourceMappingURL=chunk-
|
|
469
|
-
//# sourceMappingURL=chunk-
|
|
462
|
+
//# sourceMappingURL=chunk-V6P6L6UT.js.map
|
|
463
|
+
//# sourceMappingURL=chunk-V6P6L6UT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/server/Billing/actions.ts","../src/components/client/BillingContent/index.tsx"],"names":[],"mappings":"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","file":"chunk-V6P6L6UT.js","sourcesContent":["'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 } 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 */\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","'use client'\n\nimport { useState } from 'react'\nimport { Button, Tabs, Card } from '@marcoschwartz/lite-ui'\nimport {\n removePaymentMethod,\n setDefaultPaymentMethod,\n createSubscription,\n cancelSubscription,\n updateSubscription\n} from '../../server/Billing/actions'\nimport type { Customer, PaymentMethod, Entitlement } from '../../server/Billing/types'\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 actionConfig: ActionConfig;\n className?: string;\n}\n\nexport function BillingContent({\n subscription,\n invoices,\n paymentMethods,\n plans,\n customer,\n entitlements,\n actionConfig,\n className = ''\n}: BillingContentProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\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 }\n\n setIsLoading(false);\n };\n\n const handleSelectPlan = async (plan: PlanDisplay) => {\n if (plan.current || !plan.priceId) return;\n\n setIsLoading(true);\n setError(null);\n\n if (subscription) {\n // Update existing subscription\n const result = await updateSubscription(actionConfig, subscription.id, plan.priceId);\n if (!result.success) {\n setError(result.error || 'Failed to update subscription');\n } else {\n setSuccess(`Successfully switched to ${plan.name} plan`);\n }\n } else {\n // Create new subscription\n const result = await createSubscription(actionConfig, customer.id, plan.priceId);\n if (!result.success) {\n setError(result.error || 'Failed to create subscription');\n } else {\n setSuccess(`Successfully subscribed to ${plan.name} plan`);\n }\n }\n\n setIsLoading(false);\n };\n\n const handleRemovePaymentMethod = async (pmId: number) => {\n setIsLoading(true);\n setError(null);\n\n const result = await removePaymentMethod(actionConfig, customer.id, String(pmId));\n\n if (!result.success) {\n setError(result.error || 'Failed to remove payment method');\n } else {\n setSuccess('Payment method removed');\n }\n\n setIsLoading(false);\n };\n\n const handleSetDefaultPaymentMethod = async (pmId: number) => {\n setIsLoading(true);\n setError(null);\n\n const result = await setDefaultPaymentMethod(actionConfig, customer.id, String(pmId));\n\n if (!result.success) {\n setError(result.error || 'Failed to set default payment method');\n } else {\n setSuccess('Default payment method updated');\n }\n\n setIsLoading(false);\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}>\n {subscription ? 'Change Plan' : 'Choose a Plan'}\n </Button>\n {subscription && !subscription.cancelAtPeriodEnd && (\n <Button\n variant=\"secondary\"\n onClick={handleCancelSubscription}\n disabled={isLoading}\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n </Card>\n\n {/* Entitlements / Usage */}\n {entitlements.length > 0 && (\n <Card>\n <h3 className=\"text-lg font-semibold mb-4\">Current Usage</h3>\n <div className=\"space-y-4\">\n {entitlements.map((ent) => {\n // Format feature name: replace underscores with spaces and capitalize\n const featureName = ent.feature_key\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase());\n\n // Get entitlement value (limit)\n const entValue = typeof ent.value === 'object' && ent.value?.value !== undefined\n ? ent.value.value\n : ent.value;\n const limit = typeof entValue === 'number' ? entValue : 0;\n\n // Get usage count if available\n const used = ent.usage_count || 0;\n\n // If it's a numeric limit, show as progress bar\n if (typeof entValue === 'number' && entValue > 0) {\n return (\n <UsageBar\n key={ent.id}\n label={featureName}\n used={used}\n limit={limit}\n />\n );\n }\n\n // For boolean/non-numeric entitlements, show as simple row\n return (\n <div key={ent.id} className=\"flex justify-between text-sm p-3 bg-gray-50 dark:bg-neutral-800 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300\">{featureName}</span>\n <span className=\"font-medium text-green-600 dark:text-green-400\">\n {entValue !== undefined && entValue !== null ? String(entValue) : 'Enabled'}\n </span>\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={`relative rounded-lg border-2 p-6 flex flex-col ${\n plan.current\n ? 'border-blue-600 dark:border-blue-500'\n : 'border-gray-200 dark:border-neutral-700'\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=\"flex items-center justify-between p-4 border border-gray-200 dark:border-neutral-700 rounded-lg hover:bg-gray-50 dark:hover:bg-neutral-800 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=\"text-center py-8 border border-dashed border-gray-300 dark:border-neutral-700 rounded-lg\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-4\">No payment methods on file</p>\n <Button>Add Payment Method</Button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {paymentMethods.map((pm) => (\n <div key={pm.id} className=\"flex items-center justify-between p-4 border border-gray-200 dark:border-neutral-700 rounded-lg\">\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.id)}\n disabled={isLoading}\n >\n Set Default\n </Button>\n )}\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => handleRemovePaymentMethod(pm.id)}\n disabled={isLoading}\n >\n Remove\n </Button>\n </div>\n </div>\n ))}\n\n <Button variant=\"secondary\" className=\"w-full mt-4\">\n Add Payment Method\n </Button>\n </div>\n )}\n </Card>\n </div>\n ),\n },\n ]\n\n return (\n <div className={className}>\n <Tabs tabs={tabs} defaultIndex={0} />\n </div>\n )\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { BillingContent } from '../../chunk-
|
|
1
|
+
export { BillingContent } from '../../chunk-V6P6L6UT.js';
|
|
2
2
|
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
3
3
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import { Button, TextInput, Spinner } from '@marcoschwartz/lite-ui';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Billing, DataList, OmniKitClient, createOmniKitClient } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { Billing, DataList, OmniKitClient, createOmniKitClient } from './chunk-ROXYZX4K.js';
|
|
2
|
+
import './chunk-V6P6L6UT.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/server/Billing/actions.ts","../src/components/client/BillingContent/index.tsx"],"names":[],"mappings":"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","file":"chunk-7QQASFLM.js","sourcesContent":["'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 } 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 */\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","'use client'\n\nimport { useState } from 'react'\nimport { Button, Tabs } from '@marcoschwartz/lite-ui'\nimport {\n removePaymentMethod,\n setDefaultPaymentMethod,\n createSubscription,\n cancelSubscription,\n updateSubscription\n} from '../../server/Billing/actions'\nimport type { Customer, PaymentMethod, Entitlement } from '../../server/Billing/types'\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 actionConfig: ActionConfig;\n className?: string;\n}\n\nexport function BillingContent({\n subscription,\n invoices,\n paymentMethods,\n plans,\n customer,\n entitlements,\n actionConfig,\n className = ''\n}: BillingContentProps) {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\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 }\n\n setIsLoading(false);\n };\n\n const handleSelectPlan = async (plan: PlanDisplay) => {\n if (plan.current || !plan.priceId) return;\n\n setIsLoading(true);\n setError(null);\n\n if (subscription) {\n // Update existing subscription\n const result = await updateSubscription(actionConfig, subscription.id, plan.priceId);\n if (!result.success) {\n setError(result.error || 'Failed to update subscription');\n } else {\n setSuccess(`Successfully switched to ${plan.name} plan`);\n }\n } else {\n // Create new subscription\n const result = await createSubscription(actionConfig, customer.id, plan.priceId);\n if (!result.success) {\n setError(result.error || 'Failed to create subscription');\n } else {\n setSuccess(`Successfully subscribed to ${plan.name} plan`);\n }\n }\n\n setIsLoading(false);\n };\n\n const handleRemovePaymentMethod = async (pmId: number) => {\n setIsLoading(true);\n setError(null);\n\n const result = await removePaymentMethod(actionConfig, customer.id, String(pmId));\n\n if (!result.success) {\n setError(result.error || 'Failed to remove payment method');\n } else {\n setSuccess('Payment method removed');\n }\n\n setIsLoading(false);\n };\n\n const handleSetDefaultPaymentMethod = async (pmId: number) => {\n setIsLoading(true);\n setError(null);\n\n const result = await setDefaultPaymentMethod(actionConfig, customer.id, String(pmId));\n\n if (!result.success) {\n setError(result.error || 'Failed to set default payment method');\n } else {\n setSuccess('Default payment method updated');\n }\n\n setIsLoading(false);\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 <div className=\"space-y-4\">\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}>\n {subscription ? 'Change Plan' : 'Choose a Plan'}\n </Button>\n {subscription && !subscription.cancelAtPeriodEnd && (\n <Button\n variant=\"secondary\"\n onClick={handleCancelSubscription}\n disabled={isLoading}\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n\n {/* Entitlements / Usage */}\n {entitlements.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold mb-4\">Current Usage</h3>\n <div className=\"space-y-4\">\n {entitlements.map((ent) => {\n // Format feature name: replace underscores with spaces and capitalize\n const featureName = ent.feature_key\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase());\n\n // Get entitlement value (limit)\n const entValue = typeof ent.value === 'object' && ent.value?.value !== undefined\n ? ent.value.value\n : ent.value;\n const limit = typeof entValue === 'number' ? entValue : 0;\n\n // Get usage count if available\n const used = ent.usage_count || 0;\n\n // If it's a numeric limit, show as progress bar\n if (typeof entValue === 'number' && entValue > 0) {\n return (\n <UsageBar\n key={ent.id}\n label={featureName}\n used={used}\n limit={limit}\n />\n );\n }\n\n // For boolean/non-numeric entitlements, show as simple row\n return (\n <div key={ent.id} className=\"flex justify-between text-sm p-3 bg-gray-50 dark:bg-neutral-800 rounded-lg\">\n <span className=\"text-gray-700 dark:text-gray-300\">{featureName}</span>\n <span className=\"font-medium text-green-600 dark:text-green-400\">\n {entValue !== undefined && entValue !== null ? String(entValue) : 'Enabled'}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\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={`relative rounded-lg border-2 p-6 flex flex-col ${\n plan.current\n ? 'border-blue-600 dark:border-blue-500'\n : 'border-gray-200 dark:border-neutral-700'\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=\"space-y-6 mt-6\">\n <div>\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 </div>\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=\"flex items-center justify-between p-4 border border-gray-200 dark:border-neutral-700 rounded-lg hover:bg-gray-50 dark:hover:bg-neutral-800 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 </div>\n ),\n },\n {\n id: 'payment',\n label: 'Payment Method',\n content: (\n <div className=\"space-y-6 mt-6\">\n <div>\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 </div>\n\n {paymentMethods.length === 0 ? (\n <div className=\"text-center py-8 border border-dashed border-gray-300 dark:border-neutral-700 rounded-lg\">\n <p className=\"text-gray-500 dark:text-gray-400 mb-4\">No payment methods on file</p>\n <Button>Add Payment Method</Button>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {paymentMethods.map((pm) => (\n <div key={pm.id} className=\"flex items-center justify-between p-4 border border-gray-200 dark:border-neutral-700 rounded-lg\">\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.id)}\n disabled={isLoading}\n >\n Set Default\n </Button>\n )}\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => handleRemovePaymentMethod(pm.id)}\n disabled={isLoading}\n >\n Remove\n </Button>\n </div>\n </div>\n ))}\n\n <Button variant=\"secondary\" className=\"w-full mt-4\">\n Add Payment Method\n </Button>\n </div>\n )}\n </div>\n ),\n },\n ]\n\n return (\n <div className={className}>\n <Tabs tabs={tabs} defaultIndex={0} />\n </div>\n )\n}\n"]}
|