subos-frontend 1.0.111 → 1.0.112
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/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/envConfig.ts","../src/api/config.ts","../src/api/client.ts","../src/context/CurrencyContextDefinition.tsx","../src/utils/currency.ts","../src/hooks/useCountryAndCurrency.ts","../src/context/useCurrency.tsx","../src/context/CurrencyContext.tsx","../src/context/SubscriptionContext.tsx","../src/hooks/useSubscription.ts","../src/utils/planUtils.ts","../src/contexts/UpgradeContext.tsx","../src/hooks/usePlans.ts","../src/hooks/useTransactions.ts","../src/hooks/usePagination.ts","../src/hooks/useCancelSubscription.ts","../src/hooks/useCustomerPortal.ts","../src/context/NavigationContext.tsx","../src/components/plans/BillingCycleToggle.tsx","../src/components/plans/TierFilterDropdown.tsx","../src/components/icons/CheckIcon.tsx","../src/components/plans/PlanCard.tsx","../src/components/icons/CommonIcons.tsx","../src/components/plans/PlansGrid.tsx","../src/components/plans/PlanSelector.tsx","../src/components/payments/ChangeCardButton.tsx","../src/components/payments/PaymentCancelView.tsx","../src/components/payments/PaymentSuccessView.tsx","../src/components/LogoInline.tsx","../src/components/common/Layout.tsx","../src/hooks/payments/usePaymentParams.ts","../src/pages/PaymentSuccessPage.tsx","../src/utils/upgradeUtils.ts","../src/components/transaction/TransactionItem.tsx","../src/components/transaction/TransactionLoadingState.tsx","../src/components/transaction/TransactionErrorState.tsx","../src/components/transaction/TransactionEmptyState.tsx","../src/components/transaction/TransactionList.tsx","../src/components/transaction/TransactionStatusFilter.tsx","../src/components/transaction/TransactionFilter.tsx","../src/components/transaction/TransactionPagination.tsx","../src/components/transaction/TransactionModal.tsx","../src/components/subscription/SubscriptionInfoGrid.tsx","../src/components/subscription/SubscriptionUsageDisplay.tsx","../src/components/subscription/SubscriptionTransactionButton.tsx","../src/components/subscription/SubscriptionCancelButton.tsx","../src/components/subscription/SubscriptionActionButtons.tsx","../src/components/subscription/SubscriptionCancelModal.tsx","../src/components/subscription/ScheduledPlanNotification.tsx","../src/components/subscription/GracePeriodNotification.tsx","../src/components/subscription/SubscriptionDetails.tsx","../src/components/upgrade/UpgradeSummary.tsx","../src/components/common/SubOSThemeProvider.tsx","../src/components/pagination/Pagination.tsx","../src/pages/DashboardPage.tsx","../src/hooks/payments/useProcessPaymentCancel.ts","../src/pages/PaymentCancelPage.tsx","../src/App.tsx"],"names":["createContext","useState","useEffect","useContext","jsx","useRef","useCallback","error","clearSelectedPlan","jsxs","Fragment","useMemo","DownloadIcon","React","planToDisplay","App"],"mappings":"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J,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAG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","file":"index.js","sourcesContent":["// Environment configuration with runtime overrides\n// Centralized config that can be set by the consumer project at runtime\n\ntype EnvDefaults = {\n API_ENDPOINT: string;\n NEXT_PUBLIC_API_END_POINT: string;\n PROJECT_ID: string;\n APP_NAME: string;\n APP_VERSION: string;\n APP_ENVIRONMENT: string;\n DEBUG: boolean;\n MODE: string;\n DEV: boolean;\n PROD: boolean;\n};\n\n// Safe environment access that works in both Vite and other bundlers\n// Overloads ensure callers get a correctly typed value when a fallback is provided\nfunction getEnvVar(key: string, fallback: string): string;\nfunction getEnvVar(key: string, fallback: boolean): boolean;\nfunction getEnvVar(key: string): string | boolean | undefined;\nfunction getEnvVar(\n key: string,\n fallback?: string | boolean\n): string | boolean | undefined {\n try {\n // Check Vite environment first\n if (\n typeof import.meta !== 'undefined' &&\n (import.meta as unknown as { env?: Record<string, string | boolean | undefined> }).env\n ) {\n const v = (import.meta as unknown as { env?: Record<string, string | boolean | undefined> }).env![key] as\n | string\n | boolean\n | undefined;\n if (typeof fallback === 'boolean') {\n if (typeof v === 'boolean') return v;\n if (typeof v === 'string') return ['true', '1', 'yes'].includes(v.toLowerCase());\n return fallback;\n }\n if (typeof fallback === 'string') {\n if (typeof v === 'string') return v;\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n return fallback;\n }\n return v;\n }\n\n // Fallback for Node.js / other environments\n const nodeEnv = (typeof globalThis !== 'undefined' && (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env) as\n | Record<string, string | undefined>\n | undefined;\n if (nodeEnv) {\n const v = nodeEnv[key];\n if (typeof fallback === 'boolean') {\n if (typeof v === 'string') return ['true', '1', 'yes'].includes(v.toLowerCase());\n return fallback;\n }\n if (typeof fallback === 'string') {\n return v ?? fallback;\n }\n return v;\n }\n\n return fallback;\n } catch {\n return fallback;\n }\n}\n\n\nconst envDefaults: EnvDefaults = {\n // API Configuration - These MUST be configured by the consuming app\n API_ENDPOINT: getEnvVar('VITE_API_ENDPOINT', ''),\n NEXT_PUBLIC_API_END_POINT: getEnvVar('VITE_NEXT_PUBLIC_API_END_POINT', ''),\n // Project configuration for backend header - This MUST be configured by the consuming app\n PROJECT_ID: getEnvVar('VITE_PROJECT_ID', ''),\n // App Configuration\n APP_NAME: getEnvVar('VITE_APP_NAME', 'SubOS Frontend'),\n APP_VERSION: getEnvVar('VITE_APP_VERSION', '1.0.0'),\n APP_ENVIRONMENT: getEnvVar('VITE_APP_ENVIRONMENT', 'development'),\n // Development Configuration\n DEBUG: getEnvVar('VITE_DEBUG', false),\n // Mode\n MODE: getEnvVar('MODE', 'development'),\n DEV: getEnvVar('DEV', false),\n PROD: getEnvVar('PROD', false),\n};\n\nconst runtimeOverrides: Partial<EnvDefaults> = {};\n\nexport type EnvConfig = EnvDefaults;\n\nexport type ConfigureSubOSInput = Partial<{\n apiEndpoint: string;\n stripePublishableKey: string;\n appName: string;\n appVersion: string;\n appEnvironment: string;\n debug: boolean;\n}>;\n\n// Call from consumer app to override defaults at runtime\nexport function configureSubOS(input: ConfigureSubOSInput = {}): void {\n if (input.apiEndpoint !== undefined) runtimeOverrides.API_ENDPOINT = input.apiEndpoint;\n if (input.appName !== undefined) runtimeOverrides.APP_NAME = input.appName;\n if (input.appVersion !== undefined) runtimeOverrides.APP_VERSION = input.appVersion;\n if (input.appEnvironment !== undefined) runtimeOverrides.APP_ENVIRONMENT = input.appEnvironment;\n if (input.debug !== undefined) runtimeOverrides.DEBUG = input.debug;\n}\n\n// Validation function to ensure required config is set\nexport function validateSubOSConfig(): { isValid: boolean; missingFields: string[] } {\n const missingFields: string[] = [];\n \n if (!getApiBaseUrl()) missingFields.push('apiEndpoint');\n // if (!getProjectId()) missingFields.push('projectId');\n \n return {\n isValid: missingFields.length === 0,\n missingFields\n };\n}\n\n// Helper to throw error if config is invalid\nexport function ensureSubOSConfig(): void {\n const validation = validateSubOSConfig();\n if (!validation.isValid) {\n throw new Error(\n `SubOS configuration is incomplete. Missing required fields: ${validation.missingFields.join(', ')}. ` +\n 'Please call configureSubOS() with the required configuration before using SubOS components.'\n );\n }\n}\n\n// Resolved config getters (runtime override wins over env defaults)\nexport const getApiBaseUrl = (): string => runtimeOverrides.API_ENDPOINT ?? envDefaults.API_ENDPOINT;\nexport const getProjectId = (): string => runtimeOverrides.PROJECT_ID ?? envDefaults.PROJECT_ID;\n\nexport const isDevelopment = (): boolean => {\n const env = runtimeOverrides.APP_ENVIRONMENT ?? envDefaults.APP_ENVIRONMENT;\n const devFlag = runtimeOverrides.DEV ?? envDefaults.DEV;\n return env === 'development' || !!devFlag;\n};\n\nexport const isProduction = (): boolean => {\n const env = runtimeOverrides.APP_ENVIRONMENT ?? envDefaults.APP_ENVIRONMENT;\n const prodFlag = runtimeOverrides.PROD ?? envDefaults.PROD;\n return env === 'production' || !!prodFlag;\n};\n\nexport const getDefaultProjectId = (): string => envDefaults.PROJECT_ID;\n","import { getApiBaseUrl, getProjectId, getDefaultProjectId } from '../config/envConfig.js';\n// API configuration (use getter so runtime overrides apply)\nexport { getApiBaseUrl };\nexport { getDefaultProjectId };\n\n// Common headers for API requests\nexport const getHeaders = () => {\n return {\n 'Content-Type': 'application/json',\n 'auth': 'auth', // Adding auth header with value 'auth' for all API requests\n 'projectId': getProjectId(),\n };\n};\n\n// API endpoints\nexport const ENDPOINTS = {\n PLANS: '/plans',\n PAYMENTS: '/api/payments',\n CHECKOUT: '/checkout',\n SUBSCRIPTION: '/subscription',\n CUSTOMER: '/customer',\n TRANSACTIONS: '/transaction'\n};\n","import { getApiBaseUrl, getHeaders, ENDPOINTS, getDefaultProjectId } from './config';\nimport type { ApiResponse, Plan } from '../types';\n\n// Generic API request handler\nasync function apiRequest<T>(\n endpoint: string, \n method: string = 'GET', \n data?: unknown,\n headers?: Record<string, string>,\n excludeProjectId?: boolean\n): Promise<ApiResponse<T>> {\n try {\n const url = `${getApiBaseUrl()}${endpoint}`;\n const baseHeaders = getHeaders();\n \n // Remove projectId from headers if excludeProjectId is true\n const finalHeaders: Record<string, string> = { ...baseHeaders, ...(headers ?? {}) };\n if (excludeProjectId && 'projectId' in finalHeaders) {\n delete finalHeaders.projectId;\n }\n \n const options: RequestInit = {\n method,\n headers: finalHeaders,\n credentials: 'include',\n };\n\n if (data) {\n options.body = JSON.stringify(data);\n }\n\n const response = await fetch(url, options);\n const result = await response.json();\n\n if (!response.ok) {\n return { success: false, error: result.message || 'An error occurred' };\n }\n\n return { success: true, data: result };\n } catch (error) {\n console.error('API request failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n\n// Plan API functions\nexport const plansApi = {\n getPlans: async (): Promise<ApiResponse<Plan[]>> => {\n return apiRequest<Plan[]>(`${ENDPOINTS.PLANS}`, 'GET', undefined, { projectId: getDefaultProjectId() });\n },\n getPlanByCode: (code: string, externalId: string, queryParams?: { paymentMethodId?: string | null; couponCode?: string | null }) => {\n const params = new URLSearchParams({ planCode: code, externalId });\n if (queryParams?.paymentMethodId) params.append('paymentMethodId', queryParams.paymentMethodId);\n if (queryParams?.couponCode) params.append('couponCode', queryParams.couponCode);\n return apiRequest<Plan>(`${ENDPOINTS.PLANS}?${params.toString()}`);\n },\n \n // Create unified checkout session and get hosted checkout URL\n createPaymentSession: async (\n planCode: string,\n options?: { amount?: number; currency?: string; externalId?: string; couponCode?: string; returnUrl?: string; cancelUrl?: string; }\n ): Promise<ApiResponse<{ checkoutUrl: string; gateway: string; sessionId?: string; paymentId?: string }>> => {\n const externalId = options?.externalId;\n // Currency from options takes priority, fallback to USD if not provided\n const currency = options?.currency || 'USD';\n const amount = options?.amount; // if not provided, backend will compute from plan\n\n const payload: any = {\n planCode,\n currency,\n returnUrl: options?.returnUrl ?? `${window.location.origin}/payment-success`,\n cancelUrl: options?.cancelUrl ?? `${window.location.origin}/payment-cancel`,\n // billableMetricCode: options?.billableMetricCode,\n };\n\n if (externalId) payload.externalId = externalId;\n if (options?.couponCode) payload.couponCode = options.couponCode;\n if (typeof amount === 'number' && amount > 0) payload.amount = amount;\n\n const resp = await apiRequest<any>(\n `${ENDPOINTS.CHECKOUT}`,\n 'POST',\n payload,\n { projectId: getDefaultProjectId() }\n );\n\n // Backend returns { success: boolean, data: { checkoutUrl, ... } }\n // Our apiRequest wraps this again as { success: true, data: <backendResponse> }\n if (resp.success && resp.data && typeof resp.data === 'object' && 'data' in resp.data) {\n return { success: true, data: (resp.data as any).data };\n }\n return resp as ApiResponse<{ checkoutUrl: string; gateway: string; sessionId?: string; paymentId?: string }>;\n },\n};\n\n// Subscription API functions (via SDK)\nexport const subscriptionApi = {\n getActiveSubscription: async (externalId: string, options?: { currency?: string; billableMetric?: string | boolean }): Promise<ApiResponse<any>> => {\n let endpoint = `${ENDPOINTS.SUBSCRIPTION}/${externalId}`;\n\n const params = new URLSearchParams();\n if (options?.currency) {\n params.append('currency', options.currency);\n }\n if (options?.billableMetric) {\n params.append('billableMetric', typeof options.billableMetric === 'string' ? options.billableMetric : 'true');\n }\n\n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n \n return apiRequest<any>(endpoint, 'GET', undefined, undefined, true);\n },\n cancelSubscription: async (\n externalId: string,\n options?: {\n cancellationMode?: string;\n cancellationReason?: string;\n }\n ): Promise<ApiResponse<any>> => {\n let endpoint = `${ENDPOINTS.SUBSCRIPTION}/${externalId}`;\n \n if (options) {\n const params = new URLSearchParams();\n if (options.cancellationMode) params.append('cancellationMode', options.cancellationMode);\n if (options.cancellationReason) params.append('cancellationReason', options.cancellationReason);\n \n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n }\n \n return apiRequest<any>(endpoint, 'DELETE', undefined, { projectId: getDefaultProjectId() });\n },\n checkoutInfo: async (planCode: string, externalId: string, options?: { billableMetricCode?: string; currency?: string }): Promise<ApiResponse<any>> => {\n let endpoint = `${ENDPOINTS.CHECKOUT}/info/${planCode}/${externalId}`;\n const params = new URLSearchParams();\n\n if (options?.billableMetricCode) {\n params.append('billableMetricCode', options.billableMetricCode);\n }\n if (options?.currency) {\n params.append('currency', options.currency);\n }\n\n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n\n return apiRequest<any>(endpoint, 'GET', undefined, { projectId: getDefaultProjectId() });\n }\n};\n\n// Customer API functions (partially via SDK)\nexport const customerApi = {\n getCustomer: (externalId: string): Promise<ApiResponse<any>> =>\n apiRequest<any>(`${ENDPOINTS.CUSTOMER}/${externalId}`, 'GET', undefined, { projectId: getDefaultProjectId() }),\n createPortalSession: (\n externalId: string,\n returnUrl: string\n ): Promise<ApiResponse<{ url: string }>> =>\n apiRequest<{ url: string }>(\n `${ENDPOINTS.CUSTOMER}/${externalId}/portal`,\n 'POST',\n { returnUrl },\n { projectId: getDefaultProjectId() }\n ),\n};\n\n// Transaction API functions\nexport const transactionApi = {\n getTransactions: (externalId: string, filters?: { startDate?: string; endDate?: string; status?: string; page?: number; limit?: number }) => {\n // Using the endpoint from transaction.controller.ts: GET /:externalId/history\n let endpoint = `${ENDPOINTS.TRANSACTIONS}/${externalId}/history`;\n \n if (filters) {\n const params = new URLSearchParams();\n if (filters.startDate) params.append('startDate', filters.startDate);\n if (filters.endDate) params.append('endDate', filters.endDate);\n if (filters.status) params.append('status', filters.status);\n if (filters.page) params.append('page', filters.page.toString());\n if (filters.limit) params.append('limit', filters.limit.toString());\n \n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n }\n \n return apiRequest<any>(endpoint, 'GET', undefined, { projectId: getDefaultProjectId() });\n },\n \n getInvoice: (transactionId: string) =>\n apiRequest<{ invoiceUrl: string }>(`${ENDPOINTS.TRANSACTIONS}/${transactionId}/invoice`),\n};\n","import { createContext } from 'react';\n\nexport interface CurrencyContextType {\n country: string | null;\n currency: string;\n isLoading: boolean;\n error: string | null;\n setCurrency: (currency: string) => void;\n}\n\nexport const CurrencyContext = createContext<CurrencyContextType | undefined>(undefined);\n","export const CURRENCY_SYMBOLS: Record<string, string> = {\n USD: '$',\n INR: '₹',\n EUR: '€',\n GBP: '£',\n AUD: 'A$',\n CAD: 'C$',\n JPY: '¥',\n};\n\nexport function getCurrencySymbol(code?: string): string {\n if (!code) return '$';\n const upper = code.toUpperCase();\n return CURRENCY_SYMBOLS[upper] ?? '$';\n}\n\n// Country to currency mapping\nexport function mapCountryToCurrency(countryCode: string): string {\n const countryToCurrency: Record<string, string> = {\n // North America\n US: 'usd',\n CA: 'cad',\n MX: 'mxn',\n \n // Europe\n GB: 'gbp',\n DE: 'eur',\n FR: 'eur',\n IT: 'eur',\n ES: 'eur',\n NL: 'eur',\n BE: 'eur',\n AT: 'eur',\n PT: 'eur',\n IE: 'eur',\n FI: 'eur',\n GR: 'eur',\n LU: 'eur',\n CH: 'chf',\n SE: 'sek',\n NO: 'nok',\n DK: 'dkk',\n PL: 'pln',\n CZ: 'czk',\n HU: 'huf',\n RO: 'ron',\n \n // Asia\n IN: 'inr',\n CN: 'cny',\n JP: 'jpy',\n KR: 'krw',\n SG: 'sgd',\n HK: 'hkd',\n TW: 'twd',\n MY: 'myr',\n TH: 'thb',\n ID: 'idr',\n PH: 'php',\n VN: 'vnd',\n BD: 'bdt',\n PK: 'pkr',\n LK: 'lkr',\n \n // Oceania\n AU: 'aud',\n NZ: 'nzd',\n \n // Middle East\n AE: 'aed',\n SA: 'sar',\n IL: 'ils',\n TR: 'try',\n QA: 'qar',\n KW: 'kwd',\n OM: 'omr',\n BH: 'bhd',\n \n // Africa\n ZA: 'zar',\n EG: 'egp',\n NG: 'ngn',\n KE: 'kes',\n \n // South America\n BR: 'brl',\n AR: 'ars',\n CL: 'clp',\n CO: 'cop',\n PE: 'pen',\n };\n\n return countryToCurrency[countryCode] || 'USD';\n}\n\n/**\n * Format number according to currency locale\n * INR uses Indian numbering system (lakhs/crores): 1,00,000\n * Other currencies use international system: 100,000\n */\nexport function formatCurrencyAmount(amount: number, currencyCode?: string): string {\n const currency = currencyCode?.toUpperCase() || 'USD';\n \n // Indian numbering system for INR\n if (currency === 'INR') {\n const amountStr = Math.round(amount).toString();\n const lastThree = amountStr.substring(amountStr.length - 3);\n const otherNumbers = amountStr.substring(0, amountStr.length - 3);\n \n if (otherNumbers !== '') {\n return otherNumbers.replace(/\\B(?=(\\d{2})+(?!\\d))/g, ',') + ',' + lastThree;\n }\n return lastThree;\n }\n \n // International numbering system for other currencies\n return Math.round(amount).toLocaleString('en-US');\n}\n","import { useState, useEffect } from 'react';\nimport { mapCountryToCurrency } from '../utils/currency';\n\nexport interface UseCountryAndCurrencyProps {\n ipInfoToken?: string;\n defaultCurrency?: string;\n skipAutoDetect?: boolean;\n}\n\nexport interface UseCountryAndCurrencyReturn {\n country: string | null;\n currency: string;\n isLoading: boolean;\n error: string | null;\n setCurrency: (newCurrency: string) => void;\n}\n\nexport const useCountryAndCurrency = ({\n ipInfoToken,\n defaultCurrency = 'usd',\n skipAutoDetect = false\n}: UseCountryAndCurrencyProps = {}): UseCountryAndCurrencyReturn => {\n const [country, setCountry] = useState<string | null>(null);\n const [currency, setCurrencyState] = useState<string>(defaultCurrency);\n const [isLoading, setIsLoading] = useState<boolean>(!skipAutoDetect);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (skipAutoDetect) {\n setIsLoading(false);\n return;\n }\n\n const fetchCountryAndCurrency = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const url = ipInfoToken \n ? `https://ipinfo.io/json?token=${ipInfoToken}`\n : 'https://ipinfo.io/json';\n \n const response = await fetch(url);\n \n if (!response.ok) {\n throw new Error('Failed to fetch location data');\n }\n\n const data = await response.json();\n const detectedCountry = data.country;\n const normalizedCountry = detectedCountry === 'IN' ? 'IN' : 'US';\n \n setCountry(normalizedCountry);\n \n // Map country to currency\n const detectedCurrency = mapCountryToCurrency(normalizedCountry);\n setCurrencyState(detectedCurrency);\n } catch (err) {\n console.error('Error fetching location:', err);\n setError(err instanceof Error ? err.message : 'Unknown error');\n // Keep default currency on error\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchCountryAndCurrency();\n }, [ipInfoToken, skipAutoDetect]);\n\n const setCurrency = (newCurrency: string) => {\n setCurrencyState(newCurrency);\n };\n\n return {\n country,\n currency,\n isLoading,\n error,\n setCurrency\n };\n};\n","import { useContext } from 'react';\nimport { CurrencyContext } from './CurrencyContextDefinition';\nimport type { CurrencyContextType } from './CurrencyContextDefinition';\n\nexport const useCurrency = (): CurrencyContextType => {\n const context = useContext(CurrencyContext);\n if (context === undefined) {\n throw new Error('useCurrency must be used within a CurrencyProvider');\n }\n return context;\n};\n","import React from 'react';\nimport type { ReactNode } from 'react';\nimport { CurrencyContext } from './CurrencyContextDefinition';\nimport { useCountryAndCurrency } from '../hooks/useCountryAndCurrency';\n\n// Re-export types and context for convenience\nexport type { CurrencyContextType } from './CurrencyContextDefinition';\nexport { CurrencyContext } from './CurrencyContextDefinition';\n\nexport interface CurrencyProviderProps {\n children: ReactNode;\n ipInfoToken?: string;\n defaultCurrency?: string;\n skipAutoDetect?: boolean;\n}\n\nexport const CurrencyProvider: React.FC<CurrencyProviderProps> = ({ \n children, \n ipInfoToken,\n defaultCurrency = 'usd',\n skipAutoDetect = false\n}) => {\n const { country, currency, isLoading, error, setCurrency } = useCountryAndCurrency({\n ipInfoToken,\n defaultCurrency,\n skipAutoDetect\n });\n\n return (\n <CurrencyContext.Provider value={{ country, currency, isLoading, error, setCurrency }}>\n {children}\n </CurrencyContext.Provider>\n );\n};\n\n// Re-export the hook for backward compatibility\nexport { useCurrency } from './useCurrency';\n","import React, { createContext, useContext, useState, useCallback, ReactNode, useRef } from 'react';\nimport { subscriptionApi } from '../api/client';\nimport type { Subscription } from '../types';\nimport { useCurrency } from './CurrencyContext';\n\ninterface SubscriptionContextType {\n subscription: Subscription | null;\n loading: boolean;\n error: string | null;\n fetchSubscription: (externalId: string) => Promise<void>;\n clearSubscription: () => void;\n}\n\nconst SubscriptionContext = createContext<SubscriptionContextType | undefined>(undefined);\n\nexport const SubscriptionProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { currency } = useCurrency();\n const [subscription, setSubscription] = useState<Subscription | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadingRef = useRef(false);\n const fetchSubscription = useCallback(async (externalId: string) => {\n if (!externalId || externalId === 'undefined' || externalId.trim() === '') {\n setError('Invalid user ID. Please ensure you are properly authenticated.');\n return;\n }\n\n if (loadingRef.current) return;\n\n loadingRef.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const response = await subscriptionApi.getActiveSubscription(externalId, { currency, billableMetric: 'CANDIDATES' });\n if (response.success && response.data) {\n setSubscription(response.data);\n } else {\n setError(response.error || 'Failed to load subscription information');\n }\n } catch (err) {\n if (err instanceof Error && err.name !== 'AbortError') {\n console.error('Error fetching subscription:', err);\n setError('Failed to load subscription information. Please try again later.');\n }\n } finally {\n loadingRef.current = false;\n setLoading(false);\n }\n }, [currency]);\n\n const clearSubscription = useCallback(() => {\n setSubscription(null);\n setError(null);\n }, []);\n\n return (\n <SubscriptionContext.Provider value={{ subscription, loading, error, fetchSubscription, clearSubscription }}>\n {children}\n </SubscriptionContext.Provider>\n );\n};\n\nexport const useSubscriptionContext = () => {\n const context = useContext(SubscriptionContext);\n if (context === undefined) {\n throw new Error('useSubscriptionContext must be used within a SubscriptionProvider');\n }\n return context;\n};\n","import { useSubscriptionContext } from '../context/SubscriptionContext';\nimport type { Subscription } from '../types';\n\nexport interface UseSubscriptionReturn {\n subscription: Subscription | null;\n loading: boolean;\n error: string | null;\n fetchSubscription: (externalId: string) => Promise<void>;\n clearSubscription: () => void;\n}\n\nexport const useSubscription = (): UseSubscriptionReturn => {\n return useSubscriptionContext();\n};\n","import type { Plan } from '../types';\n\nexport interface DropdownOption {\n value: string;\n label: string;\n candidates: number;\n}\n\n/**\n * Get plan features for display based on plan name\n */\nexport const getPlanFeatures = (plan: Plan): string[] => {\n const features: string[] = [];\n if (plan.charges && plan.charges.length > 0) {\n plan.charges.forEach(charge => {\n if (charge.billableMetric?.name) {\n features.push(charge.billableMetric.name);\n }\n });\n }\n return features.length > 0 ? features : ['Core features included'];\n};\n\n/**\n * Get candidate units from plan's billable metrics (numeric only)\n */\nexport const getCandidateUnits = (plan: Plan): number => {\n if (plan.charges && plan.charges.length > 0) {\n const candidateCharge = plan.charges.find(\n (charge) => charge.billableMetric && charge.billableMetric.code === 'CANDIDATES'\n );\n\n const units = candidateCharge?.properties?.units;\n if (typeof units === 'number' && Number.isFinite(units)) {\n return units;\n }\n }\n return 0;\n};\n\n/**\n * Get unique candidate units from all plans (numeric only)\n */\nexport const getUniqueCandidateUnits = (plans: Plan[]): number[] => {\n const unitsSet = new Set<number>();\n\n plans.forEach((plan) => {\n plan.charges.forEach((charge) => {\n if (charge.billableMetric?.code === 'CANDIDATES') {\n const units = charge.properties?.units;\n if (typeof units === 'number' && Number.isFinite(units) && units !== 500) {\n unitsSet.add(units);\n }\n }\n });\n });\n\n return Array.from(unitsSet).sort((a, b) => a - b); // Sort in ascending order\n};\n\n/**\n * Get dropdown options with unique candidate units\n */\nexport const getDropdownOptions = (plans: Plan[]): DropdownOption[] => {\n const options: DropdownOption[] = [];\n const uniqueUnits = getUniqueCandidateUnits(plans);\n\n // Add options for each unique candidate unit value\n uniqueUnits.forEach(units => {\n options.push({\n value: units.toString(),\n label: `Up to ${units.toLocaleString()} Candidates`,\n candidates: units\n });\n });\n\n return options;\n};\n\n/**\n * Get current selection display text\n */\nexport const getCurrentSelectionText = (tierFilter: string, plans: Plan[]): string => {\n const options = getDropdownOptions(plans);\n const currentOption = options.find(option => option.value === tierFilter);\n\n if (!currentOption) {\n // If no option found, check if tierFilter is a number (candidate units)\n const units = parseInt(tierFilter);\n if (!isNaN(units)) {\n return `Up to ${units.toLocaleString()} Candidates`;\n }\n // Fallback to the lowest candidates label if available, otherwise empty string\n return options.length > 0 ? options[0].label : '';\n }\n\n return currentOption.label;\n};\n\n/**\n * Filter plans based on billing cycle\n */\nexport const filterPlansByBillingCycle = (\n plans: Plan[],\n billingCycle: 'monthly' | 'yearly'\n): Plan[] => {\n return plans.filter((plan) => {\n const planInterval = plan.interval.toLowerCase();\n if (billingCycle === 'monthly') {\n return planInterval === 'month' || planInterval === 'monthly';\n } else {\n return planInterval === 'year' || planInterval === 'yearly';\n }\n });\n};\n\n/**\n * Filter plans based on candidate units\n */\nexport const filterPlansByTier = (plans: Plan[], tierFilter: string): Plan[] => {\n if (tierFilter === 'all') {\n return plans;\n }\n\n const targetUnits = parseInt(tierFilter);\n return plans.filter((plan) => {\n // Always include Starter plan regardless of tier filter\n const planNameLc = plan.name?.toLowerCase?.() || '';\n if (planNameLc.includes('starter')) return true;\n\n const planCandidateUnits = getCandidateUnits(plan);\n return planCandidateUnits === targetUnits;\n });\n};\n\n/**\n * Check if a plan is popular (typically Growth plan)\n */\nexport const isPlanPopular = (plan: Plan): boolean => {\n const planName = plan.name.toLowerCase();\n return planName.includes('scale');\n};\n\n/**\n * Sort plans into a stable display order: Starter -> Growth -> Scale\n * This avoids API-order-dependent shuffling when filtering by tiers.\n */\nexport const sortPlansForDisplay = (plans: Plan[]): Plan[] => {\n const priorityOf = (name: string | undefined): number => {\n const n = (name || '').toLowerCase();\n if (n.includes('starter') || n.includes('basic')) return 0;\n if (n.includes('growth') || n.includes('pro')) return 1;\n if (n.includes('scale') || n.includes('premium')) return 2;\n return 99;\n };\n\n return [...plans].sort((a, b) => {\n const pa = priorityOf(a.name);\n const pb = priorityOf(b.name);\n if (pa !== pb) return pa - pb;\n // Tie-breaker: by name for deterministic ordering\n return (a.name || '').localeCompare(b.name || '');\n });\n};\n\n/**\n * Get plan description based on plan name\n */\nexport const getPlanDescription = (plan: Plan): string => {\n const planName = plan.name.toLowerCase();\n\n if (planName.includes('starter') || planName.includes('basic')) {\n return 'Ideal for solopreneurs looking to start their niche job board journey.';\n } else if (planName.includes('growth') || planName.includes('pro')) {\n return 'Ideal for creators launching their job board with powerful features and built-in scalability.';\n } else {\n return 'Perfect for creators ready to run a full-scale, smart hiring engine with AI and advanced capabilities.';\n }\n};\n\n/**\n * Format date string with optional time format\n */\nexport const formatDate = (dateString: string, format: 'date' | 'datetime' = 'date'): string => {\n const date = new Date(dateString);\n\n if (format === 'datetime') {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false // Military time format\n }).format(date);\n }\n\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n }).format(date);\n};\n\n/**\n * Get grace period information for display\n */\nexport const getGracePeriodInfo = (subscription: any) => {\n if (!subscription?.meta?.isGracePeriod) {\n return null;\n }\n\n const startDate = subscription.meta.gracePeriodStart;\n const endDate = subscription.meta.gracePeriodEnd;\n\n // Calculate remaining days if endDate is available\n let remainingDays = subscription.remainingGracePeriodDays ?? 0;\n if (endDate) {\n const end = new Date(endDate).getTime();\n const now = new Date().getTime();\n const diff = end - now;\n remainingDays = Math.max(0, Math.ceil(diff / (1000 * 60 * 60 * 24)));\n }\n\n return {\n startDate,\n endDate,\n remainingDays,\n message: `Your 7-day grace period started on ${startDate ? formatDate(startDate) : 'N/A'}. You have ${remainingDays} days remaining to update your payment method to continue your subscription without interruption.`\n };\n};\n","import React, { createContext, useContext, useState } from 'react';\nimport type { ReactNode } from 'react';\n\ninterface UpgradeContextType {\n isUpgradeSummaryVisible: boolean;\n setUpgradeSummaryVisible: (visible: boolean) => void;\n clearUpgradeSelection: () => void;\n}\n\nconst UpgradeContext = createContext<UpgradeContextType | undefined>(undefined);\n\nexport interface UpgradeProviderProps {\n children: ReactNode;\n}\n\nexport const UpgradeProvider: React.FC<UpgradeProviderProps> = ({ children }) => {\n const [isUpgradeSummaryVisible, setIsUpgradeSummaryVisible] = useState(false);\n\n const setUpgradeSummaryVisible = (visible: boolean) => {\n setIsUpgradeSummaryVisible(visible);\n };\n\n const clearUpgradeSelection = () => {\n setIsUpgradeSummaryVisible(false);\n };\n\n return (\n <UpgradeContext.Provider\n value={{\n isUpgradeSummaryVisible,\n setUpgradeSummaryVisible,\n clearUpgradeSelection,\n }}\n >\n {children}\n </UpgradeContext.Provider>\n );\n};\n\nexport const useUpgrade = (): UpgradeContextType => {\n const context = useContext(UpgradeContext);\n if (context === undefined) {\n throw new Error('useUpgrade must be used within an UpgradeProvider');\n }\n return context;\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { plansApi } from '../api/client';\nimport type { Plan } from '../types';\nimport { \n filterPlansByBillingCycle, \n filterPlansByTier, \n getUniqueCandidateUnits,\n getDropdownOptions,\n getCurrentSelectionText,\n sortPlansForDisplay,\n type DropdownOption\n} from '../utils/planUtils';\nimport { useCurrency } from '../contexts';\n\nexport interface UpgradeOptions {\n returnUrl?: string;\n cancelUrl?: string;\n}\n\nexport interface UsePlansReturn {\n // Data\n plans: Plan[];\n filteredPlans: Plan[];\n selectedPlan: Plan | null;\n \n // Filters\n tierFilter: string;\n billingCycle: 'monthly' | 'yearly';\n \n // Loading and error states\n loading: boolean;\n error: string | null;\n \n // Actions\n fetchPlans: () => Promise<void>;\n setSelectedPlan: (plan: Plan | null) => void;\n setTierFilter: (filter: string) => void;\n setBillingCycle: (cycle: 'monthly' | 'yearly') => void;\n clearPlans: () => void;\n clearSelectedPlan: () => void;\n \n // Computed values\n dropdownOptions: DropdownOption[];\n currentSelectionText: string;\n \n // Plan operations\n handlePlanSelect: (plan: Plan) => void;\n handleUpgrade: (externalId: string, options?: UpgradeOptions) => Promise<void>;\n}\n\nexport const usePlans = (): UsePlansReturn => {\n // Currency context\n const { currency } = useCurrency();\n \n // Core state\n const [plans, setPlans] = useState<Plan[]>([]);\n const [filteredPlans, setFilteredPlans] = useState<Plan[]>([]);\n const [selectedPlan, setSelectedPlan] = useState<Plan | null>(null);\n \n // Filter state\n const [tierFilter, setTierFilter] = useState<string>('all');\n const [billingCycle, setBillingCycle] = useState<'monthly' | 'yearly'>('monthly');\n \n // Loading and error state\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n // Fetch plans from API\n const fetchPlans = useCallback(async () => {\n // Prevent multiple simultaneous requests\n if (loading) return;\n \n setLoading(true);\n setError(null);\n\n try {\n const response = await plansApi.getPlans();\n if (response.success && response.data) {\n const data = response.data;\n setPlans(data);\n setFilteredPlans(data);\n } else {\n setError(response.error || 'Failed to load plan information');\n }\n } catch (err) {\n // Only set error if it's not an AbortError (request cancellation)\n if (err instanceof Error && err.name !== 'AbortError') {\n console.error('Error fetching plans:', err);\n setError('Failed to load plan information. Please try again later.');\n }\n } finally {\n setLoading(false);\n }\n }, [loading]);\n\n // Set default tierFilter to lowest candidate unit when plans are loaded\n useEffect(() => {\n if (plans.length > 0 && tierFilter === 'all') {\n const uniqueUnits = getUniqueCandidateUnits(plans);\n if (uniqueUnits.length > 0) {\n setTierFilter(uniqueUnits[0].toString()); // Set to lowest value\n }\n }\n }, [plans, tierFilter]);\n\n // Filter plans based on candidate units and billing cycle\n useEffect(() => {\n let filtered = [...plans];\n\n // Filter by billing cycle (monthly/yearly)\n filtered = filterPlansByBillingCycle(filtered, billingCycle);\n\n // Filter by candidate units if not 'all'\n filtered = filterPlansByTier(filtered, tierFilter);\n\n // Ensure deterministic order: Starter -> Growth -> Scale\n const sorted = sortPlansForDisplay(filtered);\n setFilteredPlans(sorted);\n }, [plans, tierFilter, billingCycle]);\n\n // Handle plan selection\n const handlePlanSelect = useCallback((plan: Plan) => {\n setSelectedPlan(plan);\n }, []);\n\n // Handle upgrade button click\n const handleUpgrade = useCallback(async (externalId: string, options?: UpgradeOptions) => {\n if (!selectedPlan) return;\n\n try {\n const response = await plansApi.createPaymentSession(selectedPlan.code, {\n externalId: externalId,\n currency,\n returnUrl: options?.returnUrl,\n cancelUrl: options?.cancelUrl,\n // billableMetricCode: \"CANDIDATES\"\n });\n if (response.success && response.data?.checkoutUrl) {\n window.location.href = response.data.checkoutUrl;\n } else {\n console.error('Failed to create payment session:', response.error);\n alert('Failed to initiate payment. Please try again.');\n }\n } catch (error) {\n console.error('Error creating payment session:', error);\n alert('An error occurred. Please try again.');\n }\n }, [selectedPlan, currency]);\n\n // Clear plans data\n const clearPlans = useCallback(() => {\n setPlans([]);\n setFilteredPlans([]);\n setSelectedPlan(null);\n setError(null);\n setTierFilter('all');\n }, []);\n\n // Clear selected plan only\n const clearSelectedPlan = useCallback(() => {\n setSelectedPlan(null);\n }, []);\n\n // Computed values\n const dropdownOptions = getDropdownOptions(plans);\n const currentSelectionText = getCurrentSelectionText(tierFilter, plans);\n\n return {\n // Data\n plans,\n filteredPlans,\n selectedPlan,\n \n // Filters\n tierFilter,\n billingCycle,\n \n // Loading and error states\n loading,\n error,\n \n // Actions\n fetchPlans,\n setSelectedPlan,\n setTierFilter,\n setBillingCycle,\n clearPlans,\n clearSelectedPlan,\n \n // Computed values\n dropdownOptions,\n currentSelectionText,\n \n // Plan operations\n handlePlanSelect,\n handleUpgrade,\n };\n};\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { transactionApi } from '../api/client';\nimport type { Transaction, TransactionFilters, PaginatedResponse, ApiResponse } from '../types';\n\nexport interface UseTransactionsProps {\n externalId: string;\n initialFilters?: TransactionFilters;\n autoFetch?: boolean;\n}\n\nexport interface UseTransactionsReturn {\n transactions: Transaction[];\n loading: boolean;\n error: string | null;\n filters: TransactionFilters;\n meta: {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n } | null;\n fetchTransactions: () => Promise<void>;\n updateFilters: (newFilters: Partial<TransactionFilters>) => void;\n clearFilters: () => void;\n refetch: () => Promise<void>;\n}\n\nconst DEFAULT_FILTERS: TransactionFilters = {\n page: 1,\n limit: 10,\n};\n\n// Helper function to apply frontend filters\nconst applyFrontendFilters = (transactions: Transaction[], filters: TransactionFilters): Transaction[] => {\n let filtered = [...transactions];\n\n // Filter by status (only if status filter is set and not empty)\n if (filters.status && filters.status.trim() !== '') {\n filtered = filtered.filter(transaction => \n transaction.transactionStatus.toLowerCase() === filters.status?.toLowerCase()\n );\n }\n\n // Filter by date range (only if dates are set)\n if (filters.startDate && filters.startDate.trim() !== '') {\n const startDate = new Date(filters.startDate);\n filtered = filtered.filter(transaction => {\n const transactionDate = new Date(transaction.transactionDate || transaction.membershipDate);\n return transactionDate >= startDate;\n });\n }\n\n if (filters.endDate && filters.endDate.trim() !== '') {\n const endDate = new Date(filters.endDate);\n filtered = filtered.filter(transaction => {\n const transactionDate = new Date(transaction.transactionDate || transaction.membershipDate);\n return transactionDate <= endDate;\n });\n }\n\n return filtered;\n};\n\n// Helper function to apply frontend pagination\nconst applyFrontendPagination = (transactions: Transaction[], filters: TransactionFilters) => {\n const currentPage = filters.page || 1;\n const limit = filters.limit || 10;\n const startIndex = (currentPage - 1) * limit;\n const endIndex = startIndex + limit;\n const paginatedTransactions = transactions.slice(startIndex, endIndex);\n \n // Calculate total pages - ensure at least 1 page even if no items\n const totalPages = Math.max(1, Math.ceil(transactions.length / limit));\n \n // Ensure we're not on a page that doesn't exist\n const adjustedCurrentPage = Math.min(currentPage, totalPages);\n \n return {\n data: paginatedTransactions,\n meta: {\n currentPage: adjustedCurrentPage,\n totalPages: totalPages,\n totalItems: transactions.length,\n itemsPerPage: limit,\n hasNextPage: endIndex < transactions.length,\n hasPreviousPage: adjustedCurrentPage > 1,\n }\n };\n};\n\nexport const useTransactions = ({\n externalId,\n initialFilters = {},\n autoFetch = false,\n}: UseTransactionsProps): UseTransactionsReturn => {\n const [transactions, setTransactions] = useState<Transaction[]>([]);\n const [allTransactions, setAllTransactions] = useState<Transaction[]>([]); // Store all transactions for frontend pagination\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filters, setFilters] = useState<TransactionFilters>({\n ...DEFAULT_FILTERS,\n ...initialFilters,\n });\n const [meta, setMeta] = useState<{\n currentPage: number;\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n } | null>(null);\n const [isBackendPaginated, setIsBackendPaginated] = useState<boolean>(false);\n const hasAutoFetchedRef = useRef(false);\n\n const fetchTransactions = useCallback(async () => {\n if (!externalId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response: ApiResponse<PaginatedResponse<Transaction> | Transaction[]> = await transactionApi.getTransactions(\n externalId,\n filters\n );\n\n if (response.success && response.data) {\n \n \n // Handle both paginated and non-paginated responses\n if (Array.isArray(response.data)) {\n // Non-paginated response - handle frontend pagination\n setIsBackendPaginated(false);\n setAllTransactions(response.data);\n \n // Apply proper frontend pagination even in debug mode\n const filteredTransactions = applyFrontendFilters(response.data, filters);\n const paginatedResult = applyFrontendPagination(filteredTransactions, filters);\n \n setTransactions(paginatedResult.data);\n setMeta(paginatedResult.meta);\n \n // Apply frontend filtering and pagination (commented out for debugging)\n // const filteredTransactions = applyFrontendFilters(response.data, filters);\n // const paginatedResult = applyFrontendPagination(filteredTransactions, filters);\n \n \n \n // setTransactions(paginatedResult.data);\n // setMeta(paginatedResult.meta);\n } else {\n // Paginated response from backend\n setIsBackendPaginated(true);\n const paginatedData = response.data as PaginatedResponse<Transaction>;\n setTransactions(paginatedData.data);\n setMeta(paginatedData.meta);\n setAllTransactions([]); // Clear all transactions as backend handles pagination\n }\n } else {\n setError(response.error || 'Failed to fetch transactions');\n setTransactions([]);\n setAllTransactions([]);\n setMeta(null);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An unexpected error occurred');\n setTransactions([]);\n setAllTransactions([]);\n setMeta(null);\n } finally {\n setLoading(false);\n }\n }, [externalId, filters]);\n\n const updateFilters = useCallback((newFilters: Partial<TransactionFilters>) => {\n setFilters(prev => ({\n ...prev,\n ...newFilters,\n // Reset to page 1 when filters change (except when explicitly setting page)\n page: newFilters.page !== undefined ? newFilters.page : 1,\n }));\n }, []);\n\n // Handle frontend pagination when backend doesn't provide pagination\n useEffect(() => {\n if (!isBackendPaginated && allTransactions.length > 0) {\n const filteredTransactions = applyFrontendFilters(allTransactions, filters);\n const paginatedResult = applyFrontendPagination(filteredTransactions, filters);\n \n setTransactions(paginatedResult.data);\n setMeta(paginatedResult.meta);\n }\n }, [filters, allTransactions, isBackendPaginated]);\n\n const clearFilters = useCallback(() => {\n setFilters(DEFAULT_FILTERS);\n }, []);\n\n const refetch = useCallback(async () => {\n await fetchTransactions();\n }, [fetchTransactions]);\n\n // Auto-fetch once per externalId if enabled\n useEffect(() => {\n if (autoFetch && externalId && !hasAutoFetchedRef.current) {\n hasAutoFetchedRef.current = true;\n fetchTransactions();\n }\n }, [autoFetch, externalId, fetchTransactions]);\n\n // Fetch when filters change (only for backend pagination or initial load)\n useEffect(() => {\n if (!autoFetch) return; // Only auto-refetch if autoFetch is enabled\n \n // For backend pagination, refetch on filter changes\n // For frontend pagination, only fetch on initial load or when non-pagination filters change\n const hasNonPaginationFilters = (\n filters.startDate !== undefined ||\n filters.endDate !== undefined ||\n filters.status !== undefined\n );\n\n // In backend-paginated mode: always refetch on filter changes\n // In frontend mode: fetch only if we don't have data yet (initial load),\n // even if filters are present. Once data is loaded, do not refetch.\n const shouldFetch = isBackendPaginated || (allTransactions.length === 0 && hasNonPaginationFilters);\n \n if (shouldFetch) {\n const timeoutId = setTimeout(() => {\n fetchTransactions();\n }, 300); // Debounce API calls\n\n return () => clearTimeout(timeoutId);\n }\n }, [filters, fetchTransactions, autoFetch, isBackendPaginated, allTransactions.length]);\n\n return {\n transactions,\n loading,\n error,\n filters,\n meta,\n fetchTransactions,\n updateFilters,\n clearFilters,\n refetch,\n };\n};\n","import { useState, useCallback } from 'react';\nimport type { PaginationMeta } from '../types';\n\nexport interface UsePaginationProps {\n initialPage?: number;\n initialLimit?: number;\n}\n\nexport interface UsePaginationReturn {\n currentPage: number;\n limit: number;\n meta: PaginationMeta | null;\n goToPage: (page: number) => void;\n goToNextPage: () => void;\n goToPreviousPage: () => void;\n goToFirstPage: () => void;\n goToLastPage: () => void;\n setLimit: (newLimit: number) => void;\n setMeta: (meta: PaginationMeta) => void;\n reset: () => void;\n}\n\nexport const usePagination = ({\n initialPage = 1,\n initialLimit = 10,\n}: UsePaginationProps = {}): UsePaginationReturn => {\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [limit, setLimitState] = useState(initialLimit);\n const [meta, setMeta] = useState<PaginationMeta | null>(null);\n\n const goToPage = useCallback((page: number) => {\n if (meta) {\n const validPage = Math.max(1, Math.min(page, meta.totalPages));\n setCurrentPage(validPage);\n } else {\n setCurrentPage(Math.max(1, page));\n }\n }, [meta]);\n\n const goToNextPage = useCallback(() => {\n if (meta && meta.hasNextPage) {\n setCurrentPage(prev => prev + 1);\n }\n }, [meta]);\n\n const goToPreviousPage = useCallback(() => {\n if (meta && meta.hasPreviousPage) {\n setCurrentPage(prev => prev - 1);\n }\n }, [meta]);\n\n const goToFirstPage = useCallback(() => {\n setCurrentPage(1);\n }, []);\n\n const goToLastPage = useCallback(() => {\n if (meta) {\n setCurrentPage(meta.totalPages);\n }\n }, [meta]);\n\n const setLimit = useCallback((newLimit: number) => {\n setLimitState(newLimit);\n setCurrentPage(1); // Reset to first page when changing limit\n }, []);\n\n const reset = useCallback(() => {\n setCurrentPage(initialPage);\n setLimitState(initialLimit);\n setMeta(null);\n }, [initialPage, initialLimit]);\n\n return {\n currentPage,\n limit,\n meta,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n setLimit,\n setMeta,\n reset,\n };\n};\n","import { useState, useCallback } from 'react';\nimport { subscriptionApi } from '../api/client';\nimport type { ApiResponse } from '../types';\n\nexport interface UseCancelSubscriptionProps {\n onSuccess?: () => void;\n onError?: (error: string) => void;\n}\n\nexport interface CancelSubscriptionOptions {\n cancellationMode?: string;\n cancellationReason?: string;\n}\n\nexport interface UseCancelSubscriptionReturn {\n loading: boolean;\n error: string | null;\n cancelSubscription: (externalId: string, options?: CancelSubscriptionOptions) => Promise<boolean>;\n reset: () => void;\n}\n\nexport const useCancelSubscription = ({\n onSuccess,\n onError,\n}: UseCancelSubscriptionProps = {}): UseCancelSubscriptionReturn => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const cancelSubscription = useCallback(async (externalId: string, options?: CancelSubscriptionOptions): Promise<boolean> => {\n if (!externalId) {\n const errorMsg = 'External ID is required';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const response: ApiResponse<any> = await subscriptionApi.cancelSubscription(externalId, options);\n\n if (response.success) {\n onSuccess?.();\n return true;\n } else {\n const errorMsg = response.error || 'Failed to cancel subscription';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n } finally {\n setLoading(false);\n }\n }, [onSuccess, onError]);\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n }, []);\n\n return {\n loading,\n error,\n cancelSubscription,\n reset,\n };\n};\n","import { useState, useCallback } from 'react';\nimport { customerApi } from '../api/client';\nimport type { ApiResponse } from '../types';\n\nexport interface UseCustomerPortalProps {\n onSuccess?: (url: string) => void;\n onError?: (error: string) => void;\n returnPath?: string;\n}\n\nexport interface UseCustomerPortalReturn {\n loading: boolean;\n error: string | null;\n openCustomerPortal: (externalId: string) => Promise<boolean>;\n reset: () => void;\n}\n\n// (removed local apiRequest in favor of shared API client)\n\nexport const useCustomerPortal = ({\n onSuccess,\n onError,\n returnPath = '/dashboard',\n}: UseCustomerPortalProps = {}): UseCustomerPortalReturn => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const openCustomerPortal = useCallback(async (externalId: string): Promise<boolean> => {\n if (!externalId) {\n const errorMsg = 'External ID is required';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const returnUrl = `${window.location.origin}${returnPath}`;\n \n const response: ApiResponse<{ url: string }> = await customerApi.createPortalSession(\n externalId,\n returnUrl\n );\n const portalResponse: any = response.data;\n const portalUrl: string | undefined = portalResponse?.data?.url ?? portalResponse?.url;\n\n if (response.success && portalUrl) {\n onSuccess?.(portalUrl);\n // Redirect to Stripe Customer Portal\n window.location.href = portalUrl;\n return true;\n } else {\n const errorMsg =\n response.error ||\n portalResponse?.error ||\n portalResponse?.message ||\n 'Failed to open customer portal';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n } finally {\n setLoading(false);\n }\n }, [onSuccess, onError, returnPath]);\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n }, []);\n\n return {\n loading,\n error,\n openCustomerPortal,\n reset,\n };\n};\n","import React, { createContext, useContext, useState } from 'react';\nimport type { ReactNode } from 'react';\n\ntype PageType = 'dashboard' | 'payment-success' | 'payment-cancel';\n\ninterface NavigationContextType {\n currentPage: PageType;\n navigateTo: (page: PageType) => void;\n goBack: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextType | undefined>(undefined);\n\ninterface NavigationProviderProps {\n children: ReactNode;\n initialPage?: PageType;\n}\n\nexport const NavigationProvider: React.FC<NavigationProviderProps> = ({ \n children, \n initialPage = 'dashboard' \n}) => {\n const [currentPage, setCurrentPage] = useState<PageType>(initialPage);\n const [history, setHistory] = useState<PageType[]>([initialPage]);\n\n const navigateTo = (page: PageType) => {\n setCurrentPage(page);\n setHistory(prev => [...prev, page]);\n };\n\n const goBack = () => {\n if (history.length > 1) {\n const newHistory = [...history];\n newHistory.pop();\n const previousPage = newHistory[newHistory.length - 1];\n setCurrentPage(previousPage);\n setHistory(newHistory);\n }\n };\n\n return (\n <NavigationContext.Provider value={{ currentPage, navigateTo, goBack }}>\n {children}\n </NavigationContext.Provider>\n );\n};\n\nexport const useNavigation = () => {\n const context = useContext(NavigationContext);\n if (!context) {\n throw new Error('useNavigation must be used within NavigationProvider');\n }\n return context;\n};\n","import React from 'react';\n\nexport interface BillingCycleToggleProps {\n billingCycle: 'monthly' | 'yearly';\n onBillingCycleChange: (cycle: 'monthly' | 'yearly') => void;\n className?: string;\n}\n\nexport const BillingCycleToggle: React.FC<BillingCycleToggleProps> = ({\n billingCycle,\n onBillingCycleChange,\n className,\n}) => {\n return (\n <div \n className=\"inline-flex rounded-lg p-1\"\n style={{ \n backgroundColor: 'var(--subos-muted, #f1f5f9)',\n border: '1px solid var(--subos-border, #e2e8f0)'\n }}\n >\n <button\n onClick={() => onBillingCycleChange('monthly')}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all duration-200 ${className || ''}`}\n style={billingCycle === 'monthly' ? {\n backgroundColor: 'var(--subos-primary-500, #ef4444)',\n color: 'white',\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.1)',\n fontWeight: '600'\n } : {\n backgroundColor: 'transparent',\n color: 'var(--subos-muted-foreground, #64748b)',\n fontWeight: '500'\n }}\n onMouseEnter={billingCycle !== 'monthly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-foreground, #1e293b)';\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';\n } : undefined}\n onMouseLeave={billingCycle !== 'monthly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-muted-foreground, #64748b)';\n e.currentTarget.style.backgroundColor = 'transparent';\n } : undefined}\n >\n Monthly\n </button>\n <button\n onClick={() => onBillingCycleChange('yearly')}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all duration-200 ${className || ''}`}\n style={billingCycle === 'yearly' ? {\n backgroundColor: 'var(--subos-primary-500, #ef4444)',\n color: 'white',\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.1)',\n fontWeight: '600'\n } : {\n backgroundColor: 'transparent',\n color: 'var(--subos-muted-foreground, #64748b)',\n fontWeight: '500'\n }}\n onMouseEnter={billingCycle !== 'yearly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-foreground, #1e293b)';\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';\n } : undefined}\n onMouseLeave={billingCycle !== 'yearly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-muted-foreground, #64748b)';\n e.currentTarget.style.backgroundColor = 'transparent';\n } : undefined}\n >\n Yearly\n </button>\n </div>\n );\n};\n\n","import React, { useRef, useEffect } from 'react';\nimport type { DropdownOption } from '../../utils/planUtils';\n\nexport interface TierFilterDropdownProps {\n isOpen: boolean;\n onToggle: () => void;\n currentSelectionText: string;\n options: DropdownOption[];\n selectedValue: string;\n onSelect: (value: string) => void;\n}\n\nexport const TierFilterDropdown: React.FC<TierFilterDropdownProps> = ({\n isOpen,\n onToggle,\n currentSelectionText,\n options,\n selectedValue,\n onSelect,\n}) => {\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Handle clicking outside dropdown\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n if (isOpen) {\n onToggle();\n }\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onToggle]);\n\n const handleOptionSelect = (value: string) => {\n onSelect(value);\n onToggle(); // Close dropdown\n };\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n <button\n onClick={onToggle}\n className=\"w-full min-w-[280px] px-4 py-3 border rounded-lg text-left focus:outline-none focus:ring-2 flex items-center justify-between transition-all duration-200\"\n style={{\n backgroundColor: 'var(--subos-background, #ffffff)',\n borderColor: isOpen ? 'var(--subos-primary-500, #3f51b5)' : 'var(--subos-border, #e2e8f0)',\n color: 'var(--subos-foreground, #1e293b)',\n boxShadow: isOpen ? '0 0 0 1px var(--subos-primary-500, #3f51b5)' : 'none'\n }}\n onMouseEnter={(e) => {\n if (!isOpen) {\n e.currentTarget.style.borderColor = 'var(--subos-muted-foreground, #64748b)';\n }\n }}\n onMouseLeave={(e) => {\n if (!isOpen) {\n e.currentTarget.style.borderColor = 'var(--subos-border, #e2e8f0)';\n }\n }}\n >\n <span style={{ color: 'var(--subos-foreground, #1e293b)' }}>{currentSelectionText}</span>\n <svg\n className={`w-5 h-5 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div \n className=\"absolute top-full left-0 w-full min-w-[280px] mt-1 border rounded-lg z-50\"\n style={{\n backgroundColor: 'var(--subos-background, #ffffff)',\n borderColor: 'var(--subos-border, #e2e8f0)',\n boxShadow: 'var(--subos-shadow-card, 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06))'\n }}\n >\n {options.map((option) => (\n <button\n key={option.value}\n onClick={() => handleOptionSelect(option.value)}\n className=\"w-full px-4 py-3 text-left transition-colors first:rounded-t-lg last:rounded-b-lg\"\n style={{\n backgroundColor: selectedValue === option.value \n ? 'var(--subos-primary-50, #eff6ff)' \n : 'transparent',\n color: selectedValue === option.value \n ? 'var(--subos-primary-700, #1d4ed8)' \n : 'var(--subos-foreground, #1e293b)'\n }}\n onMouseEnter={(e) => {\n if (selectedValue !== option.value) {\n e.currentTarget.style.backgroundColor = 'var(--subos-accent, #f8fafc)';\n }\n }}\n onMouseLeave={(e) => {\n if (selectedValue !== option.value) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">\n {option.label}\n </span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\n\ninterface CheckIconProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const CheckIcon: React.FC<CheckIconProps> = ({ className = \"w-5 h-5\", style }) => {\n return (\n <svg \n className={className} \n style={style}\n fill=\"currentColor\" \n viewBox=\"0 0 20 20\" \n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path \n fillRule=\"evenodd\" \n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" \n clipRule=\"evenodd\" \n />\n </svg>\n );\n};\n","import React from 'react';\nimport type { Plan } from '../../types';\nimport { CheckIcon } from '../icons/CheckIcon';\nimport { getPlanFeatures, getPlanDescription, isPlanPopular } from '../../utils/planUtils';\n\nexport interface PlanCardProps {\n plan: Plan;\n isSelected: boolean;\n billingCycle: 'monthly' | 'yearly';\n onSelect: (plan: Plan) => void;\n // Indicates if this plan is the user's currently active subscription plan\n isActive?: boolean;\n // Indicates if this plan is the user's next membership plan (scheduled to activate)\n isNextActive?: boolean;\n comparisonUrl?: string;\n // Optional list of features to show, intersected with plan's computed features\n featureFilter?: string[];\n}\n\nexport const PlanCard: React.FC<PlanCardProps> = ({\n plan,\n isSelected,\n billingCycle,\n onSelect,\n isActive = false,\n isNextActive = false,\n comparisonUrl = 'https://arthajobboard.com/pricing',\n featureFilter,\n}) => {\n const computedFeatures = getPlanFeatures(plan);\n const features = Array.isArray(featureFilter) && featureFilter.length > 0\n ? featureFilter\n : computedFeatures;\n const description = getPlanDescription(plan);\n const isPopular = isPlanPopular(plan);\n const isFree = Number(plan.fixedCost) === 0;\n\n return (\n <div\n onClick={isFree || isActive || isNextActive ? undefined : () => onSelect(plan)}\n className={`relative border rounded-lg p-6 transition-all flex flex-col h-full font-subos ${\n !isFree && !isActive && !isNextActive ? 'cursor-pointer' : 'cursor-default'\n } ${\n !isFree && isSelected && !isActive\n ? 'border-primary-500 bg-primary-50'\n : 'border-subos-border'\n } ${!isFree && !isActive ? 'hover:border-subos-muted-foreground' : ''} ${isPopular ? 'border-primary-500' : ''}`}\n style={{ \n backgroundColor: !isFree && isSelected && !isActive ? 'var(--subos-primary-50, #e8eaf6)' : 'var(--subos-background, #ffffff)',\n borderColor: !isFree && isSelected && !isActive ? 'var(--subos-primary-500, #3f51b5)' : \n isPopular ? 'var(--subos-primary-500, #3f51b5)' : 'var(--subos-border, #dee2e6)',\n color: 'var(--subos-foreground, inherit)'\n }}\n >\n {isPopular && (\n <div className=\"absolute -top-3 left-1/2 transform -translate-x-1/2\">\n <span \n className=\"text-white px-3 py-1 rounded-full text-xs font-medium\"\n style={{ backgroundColor: 'var(--subos-primary-500, #3f51b5)' }}\n >\n Most Popular\n </span>\n </div>\n )}\n \n {!isFree && isSelected && !isActive && (\n <div className=\"absolute top-4 right-4\">\n <div \n className=\"text-white rounded-full p-1\"\n style={{ backgroundColor: 'var(--subos-primary-500, #3f51b5)' }}\n >\n <CheckIcon className=\"w-4 h-4\" />\n </div>\n </div>\n )}\n \n <div className=\"mb-0\">\n <h4 \n className=\"text-xl font-bold mb-2\" \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-title, 1.25rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-title, 700)',\n color: 'var(--subos-color-plan-card-title, var(--subos-foreground, inherit))' \n }}\n >\n {plan.name}\n </h4>\n <p \n className=\"text-sm mb-1\" \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-description, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-description, 400)',\n color: 'var(--subos-color-plan-card-description, var(--subos-muted-foreground, #6c757d))' \n }}\n >\n {description}\n </p>\n \n <div className=\"mb-0\">\n {isFree ? (\n <span className=\"text-3xl font-bold\" style={{ color: 'var(--subos-primary-500, #3f51b5)' }}>Free</span>\n ) : (\n <>\n <span className=\"text-3xl font-bold\" style={{ color: 'var(--subos-primary-500, #3f51b5)' }}>\n ${plan.fixedCost}\n </span>\n <span className=\"ml-1\" style={{ color: 'var(--subos-muted-foreground, #6c757d)' }}>\n per {billingCycle === 'yearly' ? 'year' : 'month'}\n </span>\n </>\n )}\n </div>\n </div>\n\n {/* Horizontal line before features */}\n <div className=\"mb-6\">\n <hr className=\"mt-0 mb-0\" style={{ borderColor: 'var(--subos-border,rgb(2, 48, 94))', marginTop: 0, marginBottom: 0 }} />\n </div>\n \n <ul className=\"space-y-2 mb-6 flex-grow\">\n {features.map((feature, index) => (\n <li key={index} className=\"flex items-center text-sm\">\n <div\n className=\"mr-2 flex-shrink-0 rounded-full p-0.5\"\n style={{ backgroundColor: isActive ? 'var(--subos-muted-foreground,rgb(148, 150, 153))' : 'var(--subos-primary-500, #3f51b5)' }}\n >\n <CheckIcon className=\"w-3 h-3 text-white\" />\n </div>\n <span \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-feature, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-feature, 400)',\n color: 'var(--subos-color-plan-card-feature, var(--subos-foreground, inherit))' \n }}\n >\n {feature}\n </span>\n </li>\n ))}\n </ul>\n\n\n {/* Informational text for free plans */}\n {isFree && (\n <div className=\"mb-4\">\n <p \n className=\"text-sm mb-4\" \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-info, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-info, 400)',\n color: 'var(--subos-color-plan-card-info, var(--subos-muted-foreground, #6c757d))' \n }}\n >\n The mentioned plan will become the default once the current subscription expires, provided the tier requirement is met.\n </p>\n </div>\n )}\n \n <div className=\"mt-auto space-y-3\">\n {!isFree && (\n isActive ? (\n <div\n className=\"w-full border py-2 px-4 rounded-md font-medium cursor-default transition-colors text-center\"\n style={{ \n backgroundColor: 'var(--subos-muted, #f8f9fa)',\n borderColor: 'var(--subos-border, #dee2e6)',\n color: 'var(--subos-primary-500, #3f51b5)'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #3f51b5)';\n e.currentTarget.style.borderColor = 'var(--subos-primary-500, #3f51b5)';\n e.currentTarget.style.color = 'white';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-muted, #f8f9fa)';\n e.currentTarget.style.borderColor = 'var(--subos-border, #dee2e6)';\n e.currentTarget.style.color = 'var(--subos-primary-500, #3f51b5)';\n }}\n >\n Active\n </div>\n ) : isNextActive ? (\n <div\n className=\"w-full border py-2 px-4 rounded-md font-medium cursor-default transition-colors text-center\"\n style={{ \n backgroundColor: 'var(--subos-muted, #f8f9fa)',\n borderColor: 'var(--subos-border, #dee2e6)',\n color: 'var(--subos-primary-500, #3f51b5)'\n }}\n >\n Scheduled\n </div>\n ) : isSelected ? (\n <button \n className=\"w-full subos-btn-primary text-white py-2 px-4 rounded-md font-medium\"\n >\n Selected\n </button>\n ) : (\n <button \n className=\"w-full border py-2 px-4 rounded-md font-medium transition-colors\"\n style={{ \n backgroundColor: 'var(--subos-primary-500, #3f51b5)',\n borderColor: 'var(--subos-primary-500, #3f51b5)',\n color: 'white'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-600, #303f9f)';\n e.currentTarget.style.borderColor = 'var(--subos-primary-600, #303f9f)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #3f51b5)';\n e.currentTarget.style.borderColor = 'var(--subos-primary-500, #3f51b5)';\n }}\n >\n Select\n </button>\n )\n )}\n \n {/* Show Plan Comparison button - only if comparisonUrl is provided */}\n {comparisonUrl && !isFree && (\n <button\n className=\"w-full py-2 px-4 rounded-md font-medium text-sm transition-colors text-center\"\n style={{ \n backgroundColor: 'transparent',\n border: 'none',\n color: 'var(--subos-primary-500, #3f51b5)'\n }}\n onClick={(e) => {\n e.stopPropagation();\n window.open(comparisonUrl, '_blank');\n }}\n >\n Show Plan Comparison\n </button>\n )}\n </div>\n </div>\n );\n};\n\n","interface IconProps {\n className?: string;\n}\n\nexport const SearchIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nexport const FilterIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\" />\n </svg>\n);\n\nexport const TrendingUpIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6\" />\n </svg>\n);\n\nexport const LoadingSpinner: React.FC<IconProps> = ({ className = \"w-8 h-8\" }) => (\n <svg className={`${className} animate-spin`} fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n);\n\nexport const CheckCircleIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n);\n\nexport const AddIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n);\n\nexport const CreditCardIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} 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);\n\nexport const DeleteIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n);\n\nexport const DownloadIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 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);\n\nexport const DashboardIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n);\n\nexport const EmailIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n);\n\nexport const ReceiptIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5l-5-5-4 4-3-3m6-6V4a2 2 0 00-2-2H5a2 2 0 00-2 2v16l3-3 3 3 3-3 3 3z\" />\n </svg>\n);\n\nexport const StarBorderIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n);\n\nexport const UpgradeIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />\n </svg>\n);\n\nexport const CancelIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\nexport const AddCardIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 6v6m0 0v6m0-6h6m-6 0H6m12-3h3a3 3 0 013 3v8a3 3 0 01-3 3H6a3 3 0 01-3-3v-8a3 3 0 013-3h3\" />\n </svg>\n);\nexport const WarningIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} viewBox=\"0 0 20 20\">\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n);\n","import React from 'react';\nimport type { Plan } from '../../types';\nimport { PlanCard } from './PlanCard';\nimport { LoadingSpinner } from '../icons/CommonIcons';\n\nexport interface PlansGridProps {\n plans: Plan[];\n selectedPlan: Plan | null;\n billingCycle: 'monthly' | 'yearly';\n loading: boolean;\n error: string | null;\n onPlanSelect: (plan: Plan) => void;\n // Currently active subscription plan code to mark the active plan in the grid\n activePlanCode?: string;\n // Next membership plan ID to mark the next active plan in the grid\n nextMembershipPlanId?: string;\n // Optional: map of plan code to desired features to display\n planFeatures?: Record<string, string[]>;\n}\n\nexport const PlansGrid: React.FC<PlansGridProps> = ({\n plans,\n selectedPlan,\n billingCycle,\n loading,\n error,\n onPlanSelect,\n activePlanCode,\n nextMembershipPlanId,\n planFeatures,\n}) => {\n if (loading) {\n return (\n <div className=\"flex justify-center py-8\">\n <LoadingSpinner className=\"h-10 w-10 text-primary animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-4 bg-red-50 border border-red-200 text-red-700 rounded-md\">\n {error}\n </div>\n );\n }\n \n\n return (\n <div>\n {plans.map((plan) => {\n // Determine feature list: exact match by code, else prefix match by key (e.g., LITE, PLUS, PREMIUM)\n let featureFilter: string[] | undefined = undefined;\n if (planFeatures) {\n const code = (plan.code || '').toUpperCase();\n // exact\n featureFilter = planFeatures[code] || planFeatures[plan.code];\n if (!featureFilter) {\n const keys = Object.keys(planFeatures);\n const matchKey = keys.find((k) => code.startsWith(k.toUpperCase()));\n if (matchKey) featureFilter = planFeatures[matchKey];\n }\n }\n\n return (\n <PlanCard\n key={plan.id}\n plan={plan}\n isSelected={selectedPlan?.id === plan.id}\n billingCycle={billingCycle}\n onSelect={onPlanSelect}\n isActive={activePlanCode ? plan.code === activePlanCode : false}\n isNextActive={nextMembershipPlanId ? plan.id === nextMembershipPlanId : false}\n featureFilter={featureFilter}\n />\n );\n })}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport type { Plan } from '../../types';\nimport type { DropdownOption } from '../../utils/planUtils';\nimport { BillingCycleToggle } from './BillingCycleToggle';\nimport { TierFilterDropdown } from './TierFilterDropdown';\nimport { PlansGrid } from './PlansGrid';\n\nexport interface PlanSelectorProps {\n // Plans data\n plans: Plan[];\n selectedPlan: Plan | null;\n \n // Filters\n tierFilter: string;\n billingCycle: 'monthly' | 'yearly';\n \n // Loading and error states\n loading: boolean;\n error: string | null;\n \n // Computed values\n dropdownOptions: DropdownOption[];\n currentSelectionText: string;\n \n // Event handlers\n onPlanSelect: (plan: Plan) => void;\n onTierFilterChange: (filter: string) => void;\n onBillingCycleChange: (cycle: 'monthly' | 'yearly') => void;\n // Currently active subscription plan code to disable and mark Active\n activePlanCode?: string;\n // Next membership plan ID to mark the next active plan\n nextMembershipPlanId?: string;\n}\n\nexport const PlanSelector: React.FC<PlanSelectorProps> = ({\n plans,\n selectedPlan,\n tierFilter,\n billingCycle,\n loading,\n error,\n dropdownOptions,\n currentSelectionText,\n onPlanSelect,\n onTierFilterChange,\n onBillingCycleChange,\n activePlanCode,\n nextMembershipPlanId,\n}) => {\n const [isDropdownOpen, setIsDropdownOpen] = useState<boolean>(false);\n\n const handleDropdownToggle = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const handleTierSelect = (value: string) => {\n onTierFilterChange(value);\n setIsDropdownOpen(false);\n };\n\n return (\n <div className=\"mb-6\">\n <h3 \n className=\"text-lg font-semibold mb-2\"\n style={{\n fontSize: 'var(--subos-font-size-plan-title, 1.125rem)',\n fontWeight: 'var(--subos-font-weight-plan-title, 600)',\n color: 'var(--subos-color-plan-title, inherit)'\n }}\n >\n Upgrade your plan\n </h3>\n <div className=\"flex items-center gap-4 justify-between flex-wrap mb-6\">\n <p \n className=\"text-gray-600 mb-0 flex-1 min-w-[260px]\"\n style={{\n fontSize: 'var(--subos-font-size-plan-description, 1rem)',\n fontWeight: 'var(--subos-font-weight-plan-description, 400)',\n color: 'var(--subos-color-plan-description, #6c757d)'\n }}\n >\n Enhance your experience with exclusive access - unlock more features and possibilities!\n </p>\n\n <div className=\"flex items-center gap-4\">\n {/* Custom Tier Filter Dropdown */}\n <TierFilterDropdown\n isOpen={isDropdownOpen}\n onToggle={handleDropdownToggle}\n currentSelectionText={currentSelectionText}\n options={dropdownOptions}\n selectedValue={tierFilter}\n onSelect={handleTierSelect}\n />\n\n {/* Billing Toggle */}\n <BillingCycleToggle\n billingCycle={billingCycle}\n onBillingCycleChange={onBillingCycleChange}\n />\n </div>\n </div>\n\n {/* Plans Grid */}\n <PlansGrid\n plans={plans}\n selectedPlan={selectedPlan}\n billingCycle={billingCycle}\n loading={loading}\n error={error}\n onPlanSelect={onPlanSelect}\n activePlanCode={activePlanCode}\n nextMembershipPlanId={nextMembershipPlanId}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { useCustomerPortal } from '../../hooks/useCustomerPortal';\n\nexport interface ChangeCardButtonProps {\n externalId: string;\n className?: string;\n children?: React.ReactNode;\n onSuccess?: () => void;\n onError?: (error: string) => void;\n returnPath?: string;\n}\n\nexport const ChangeCardButton: React.FC<ChangeCardButtonProps> = ({\n externalId,\n className = '',\n children,\n onSuccess,\n onError,\n returnPath,\n}) => {\n const { openCustomerPortal } = useCustomerPortal({\n onSuccess: () => {\n onSuccess?.();\n },\n onError: (error) => {\n onError?.(error);\n },\n returnPath,\n });\n\n const handleClick = async () => {\n await openCustomerPortal(externalId);\n };\n\n const defaultClassName = \"text-sm font-medium transition-colors duration-200\";\n const finalClassName = className || defaultClassName;\n\n const getStyles = () => ({\n color: 'var(--subos-primary-600, #2563eb)',\n textDecoration: 'none',\n });\n\n return (\n <button\n onClick={handleClick}\n className={finalClassName}\n type=\"button\"\n style={getStyles()}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = 'var(--subos-primary-700, #1d4ed8)';\n e.currentTarget.style.textDecoration = 'underline';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = 'var(--subos-primary-600, #2563eb)';\n e.currentTarget.style.textDecoration = 'none';\n }}\n >\n {children || 'Manage Billing'}\n </button>\n );\n};\n","import React from 'react';\nimport type { PaymentParams } from '../../hooks/payments/usePaymentParams';\nimport { useNavigation } from '../../context/NavigationContext';\n\ninterface PaymentCancelViewProps {\n details: PaymentParams;\n dashboardUrl?: string;\n planUrl?: string;\n supportUrl?: string;\n}\n\nexport const PaymentCancelView: React.FC<PaymentCancelViewProps> = ({ details, dashboardUrl = '/dashboard', planUrl = '/plans', supportUrl = '/support' }) => {\n const { navigateTo } = useNavigation();\n \n const handleTryAgain = () => {\n // If planUrl is provided (external routing), use window.history.back\n // Otherwise use internal navigation\n if (planUrl && planUrl.startsWith('/')) {\n window.history.back();\n } else {\n navigateTo('dashboard');\n }\n };\n \n return (\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md overflow-hidden\">\n {/* Cancel Header */}\n <div className=\"bg-gradient-to-r from-orange-500 to-red-500 text-white p-6 text-center\">\n <div className=\"mb-2 flex justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n className=\"h-10 w-10 text-white\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold\">Payment Cancelled</h1>\n <p className=\"text-orange-100 mt-1\">Your payment was not processed</p>\n </div>\n\n {/* Cancellation Details */}\n <div className=\"p-6\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-4\">What Happened?</h2>\n <div className=\"p-4 bg-orange-50 rounded-lg mb-4\">\n <p className=\"text-orange-800\">\n {details.reason\n ? `Reason: ${details.reason}`\n : 'Your payment was cancelled before it was completed. No changes were made to your account.'}\n </p>\n </div>\n\n {(details.gateway || details.sessionId) && (\n <div className=\"space-y-3 mb-4\">\n <h3 className=\"font-medium text-gray-900\">Transaction Details</h3>\n {details.gateway && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Payment Gateway</span>\n <span className=\"font-medium capitalize\">{details.gateway}</span>\n </div>\n )}\n {details.sessionId && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Session ID</span>\n <span className=\"font-medium font-mono text-sm\">{details.sessionId}</span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Status</span>\n <span className=\"font-medium text-orange-600\">Cancelled</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Date</span>\n <span className=\"font-medium\">{new Date().toLocaleDateString()}</span>\n </div>\n </div>\n )}\n </div>\n\n {/* What's Next */}\n <div className=\"mb-6 p-4 bg-blue-50 rounded-lg\">\n <h3 className=\"font-semibold text-blue-900 mb-2\">What's Next?</h3>\n <ul className=\"text-sm text-blue-800 space-y-1\">\n <li>• No changes were made to your account</li>\n <li>• You can try the payment again anytime</li>\n <li>• Contact support if you need assistance</li>\n </ul>\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3\">\n <button\n onClick={handleTryAgain}\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Try Payment Again\n </button>\n\n {planUrl && (\n <button\n onClick={() => {\n if (planUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = planUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Browse Plans\n </button>\n )}\n\n {dashboardUrl && (\n <button\n onClick={() => {\n if (dashboardUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = dashboardUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Return Home\n </button>\n )}\n </div>\n\n {/* Support */}\n <div className=\"mt-6 text-center\">\n <p className=\"text-sm text-gray-500\">\n Having trouble?{' '}\n <a href={supportUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:text-blue-700\">\n Contact Support\n </a>\n </p>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PaymentCancelView;\n","import React from 'react';\nimport type { PaymentParams } from '../../hooks/payments/usePaymentParams';\nimport { useNavigation } from '../../context/NavigationContext';\n\ninterface PaymentSuccessViewProps {\n details: PaymentParams;\n planName?: string;\n planAmount?: number;\n planCurrency?: string;\n invoiceDownloadUrl?: string;\n dashboardUrl?: string;\n supportUrl?: string;\n}\n\nexport const PaymentSuccessView: React.FC<PaymentSuccessViewProps> = ({ \n details, \n planName, \n planAmount, \n planCurrency = 'USD', \n invoiceDownloadUrl, \n dashboardUrl = '/dashboard', \n supportUrl = '/support'\n}) => {\n const { navigateTo } = useNavigation();\n return (\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md overflow-hidden\">\n {/* Success Header */}\n <div className=\"bg-gradient-to-r from-green-500 to-green-600 text-white p-6 text-center\">\n <div className=\"text-4xl mb-2\">✅</div>\n <h1 className=\"text-2xl font-bold\">Payment Successful!</h1>\n <p className=\"text-green-100 mt-1\">Thank you for your purchase</p>\n </div>\n\n {/* Payment Details */}\n <div className=\"p-6\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-4\">Payment Details</h2>\n <div className=\"space-y-3\">\n {details.gateway && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Payment Gateway</span>\n <span className=\"font-medium capitalize\">{details.gateway}</span>\n </div>\n )}\n {planName && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Plan</span>\n <span className=\"font-medium\">{planName}</span>\n </div>\n )}\n {planAmount && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Amount</span>\n <span className=\"font-medium\">${planAmount} {planCurrency}</span>\n </div>\n )}\n {details.paymentId && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Payment ID</span>\n <span className=\"font-medium font-mono text-sm\">{details.paymentId}</span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Status</span>\n <span className=\"font-medium text-green-600\">Completed</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Date</span>\n <span className=\"font-medium\">{new Date().toLocaleDateString()}</span>\n </div>\n </div>\n </div>\n\n {/* Next Steps */}\n <div className=\"mb-6 p-4 bg-blue-50 rounded-lg\">\n <h3 className=\"font-semibold text-blue-900 mb-2\">What's Next?</h3>\n <ul className=\"text-sm text-blue-800 space-y-1\">\n <li>• You'll receive a confirmation email shortly</li>\n <li>• Your subscription is now active</li>\n <li>• Access your dashboard to manage your account</li>\n </ul>\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3\">\n {invoiceDownloadUrl ? (\n <a\n href={invoiceDownloadUrl}\n download\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-md transition-colors block text-center\"\n >\n Download Invoice\n </a>\n ) : (\n <button\n onClick={() => {\n if (dashboardUrl && dashboardUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = dashboardUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Download Invoice\n </button>\n )}\n\n <button\n onClick={() => {\n if (dashboardUrl && dashboardUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = dashboardUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Go to Dashboard\n </button>\n </div>\n\n {/* Support */}\n <div className=\"mt-6 text-center\">\n <p className=\"text-sm text-gray-500\">\n Need help?{' '}\n <a href={supportUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:text-blue-700\">\n Contact Support\n </a>\n </p>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PaymentSuccessView;\n","import React from \"react\";\n\n// Renders the public/file.svg inside an inline <svg>, so you can pass standard SVG props\n// like className, width, height, etc. You can also override the src via props if needed.\n\ntype Props = React.SVGProps<SVGSVGElement> & {\n src?: string;\n alt?: string;\n};\n\nexport const LogoInline = ({ src, alt = \"Logo\", viewBox = \"0 0 1024 1024\", ...props }: Props) => {\n // Resolve the public asset respecting Vite's base path\n const resolvedSrc = src ?? \"https://upload.wikimedia.org/wikipedia/commons/a/a7/React-icon.svg\";\n\n return (\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox}\n aria-label={alt}\n role=\"img\"\n {...props}\n >\n {/* Embed the external SVG asset inside this inline <svg> */}\n <image href={resolvedSrc} width=\"100%\" height=\"100%\" preserveAspectRatio=\"xMidYMid meet\" />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\nimport { LogoInline } from '../LogoInline';\nimport { useNavigation } from '../../context/NavigationContext';\n\ninterface LayoutProps {\n children: ReactNode;\n hideHeader?: boolean;\n hideFooter?: boolean;\n}\n\nexport const Layout: React.FC<LayoutProps> = ({ children, hideHeader = false, hideFooter = false }) => {\n const { navigateTo } = useNavigation();\n\n return (\n <div className=\"flex flex-col min-h-screen w-full\">\n {!hideHeader && (\n <header className=\"bg-white/80 backdrop-blur border-b border-gray-200\">\n <nav className=\"w-full flex items-center justify-between px-4 py-3\">\n <div className=\"flex-grow\">\n <button \n onClick={() => navigateTo('dashboard')} \n className=\"no-underline text-inherit bg-transparent border-0 cursor-pointer p-0\"\n >\n <div className=\"flex items-center\">\n <LogoInline className=\"h-8 w-auto\" alt=\"SubOS\" />\n </div>\n </button>\n </div>\n </nav>\n </header>\n )}\n \n <main className=\"flex-1 w-full\">\n {children}\n </main>\n \n {!hideFooter && (\n <footer className=\"bg-gray-100 py-6 w-full mt-auto\">\n <div className=\"max-w-7xl mx-auto px-4\">\n <p className=\"text-sm text-gray-600 text-center\">\n © {new Date().getFullYear()} SubOS. All rights reserved.\n </p>\n </div>\n </footer>\n )}\n </div>\n );\n};\n\n\n\n","import { useMemo } from 'react';\n\nexport interface PaymentParams {\n gateway?: string;\n sessionId?: string;\n paymentId?: string;\n reason?: string;\n}\n\nexport const usePaymentParams = (): PaymentParams => {\n return useMemo(() => {\n const params = new URLSearchParams(window.location.search);\n return {\n gateway: params.get('gateway') || undefined,\n sessionId: params.get('session_id') || undefined,\n paymentId: params.get('payment_id') || undefined,\n reason: params.get('reason') || undefined,\n };\n }, []);\n};\n","import React, { useMemo } from 'react';\nimport { Layout } from '../components/common/Layout';\nimport { usePaymentParams } from '../hooks/payments/usePaymentParams';\nimport PaymentSuccessView from '../components/payments/PaymentSuccessView';\nimport { useTransactions } from '../hooks/useTransactions';\n\ninterface PaymentSuccessPageProps {\n externalId?: string;\n planName?: string;\n planAmount?: number;\n planCurrency?: string;\n invoiceDownloadUrl?: string;\n dashboardUrl?: string;\n supportUrl?: string;\n}\n\nconst PaymentSuccessPage: React.FC<PaymentSuccessPageProps> = ({ \n externalId: propExternalId,\n planName,\n planAmount,\n planCurrency,\n invoiceDownloadUrl: propInvoiceDownloadUrl,\n dashboardUrl,\n supportUrl\n}) => {\n const paymentDetails = usePaymentParams();\n\n // Resolve externalId from props (passed by parent) or URL params (fallback)\n const urlParams = new URLSearchParams(window.location.search);\n const externalId = propExternalId || urlParams.get('externalId') || '';\n\n // Fetch transactions for this externalId\n const {\n transactions,\n loading: transactionsLoading,\n error: transactionsError,\n } = useTransactions({\n externalId,\n initialFilters: { page: 1, limit: 100 },\n autoFetch: !!externalId,\n });\n\n // Pick the transaction with the highest 'order' value and use its invoice_pdf, or use provided URL\n const invoiceDownloadUrl = useMemo(() => {\n // If a custom invoice URL is provided, use that\n if (propInvoiceDownloadUrl) return propInvoiceDownloadUrl;\n \n // Otherwise, try to get it from transactions\n if (!transactions || transactions.length === 0) return undefined;\n const withOrder = transactions.filter(t => typeof t.order === 'number');\n if (withOrder.length === 0) return undefined;\n const top = withOrder.reduce((max, cur) => (cur.order! > (max.order ?? -Infinity) ? cur : max), withOrder[0]);\n return top.invoice_pdf || undefined;\n }, [transactions, propInvoiceDownloadUrl]);\n\n if (transactionsLoading) {\n return (\n <Layout hideHeader hideFooter>\n <div className=\"container mx-auto p-4\">\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md p-6\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-green-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Processing your payment...</p>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n if (transactionsError) {\n return (\n <Layout hideHeader hideFooter>\n <div className=\"container mx-auto p-4\">\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md p-6\">\n <div className=\"text-center\">\n <div className=\"text-red-600 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Payment Processing Error</h2>\n <p className=\"text-red-600 mb-4\">{transactionsError}</p>\n <div className=\"space-y-2\">\n <button\n onClick={() => window.location.reload()}\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition-colors\"\n >\n Try Again\n </button>\n <button\n onClick={() => window.location.href = '/'}\n className=\"w-full bg-gray-500 hover:bg-gray-600 text-white font-medium py-2 px-4 rounded-md transition-colors\"\n >\n Go Home\n </button>\n </div>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout hideHeader hideFooter>\n <div className=\"container mx-auto p-4\">\n <PaymentSuccessView \n details={paymentDetails} \n planName={planName}\n planAmount={planAmount}\n planCurrency={planCurrency}\n invoiceDownloadUrl={invoiceDownloadUrl}\n dashboardUrl={dashboardUrl}\n supportUrl={supportUrl}\n />\n </div>\n </Layout>\n );\n};\n\nexport default PaymentSuccessPage;\n\n","/**\n * Utility functions for managing upgrade state\n */\n\n// Global variable to store the clear function\nlet globalClearSelectedPlan: (() => void) | null = null;\n\n/**\n * Register a function to clear the selected plan globally\n * This should be called by components that manage plan selection\n */\nexport const registerClearSelectedPlan = (clearFn: () => void) => {\n globalClearSelectedPlan = clearFn;\n};\n\n/**\n * Clear the selected plan from anywhere in the application\n * This can be called when navigating to transactions or other sections\n */\nexport const clearSelectedPlan = () => {\n if (globalClearSelectedPlan) {\n globalClearSelectedPlan();\n }\n};\n\n/**\n * Unregister the clear function (cleanup)\n */\nexport const unregisterClearSelectedPlan = () => {\n globalClearSelectedPlan = null;\n};\n","import React from 'react';\nimport type { Transaction } from '../../types';\nimport { formatDate } from '../../utils/planUtils';\n\nexport interface TransactionItemProps {\n transaction: Transaction;\n className?: string;\n showInvoiceButton?: boolean;\n customStatusColors?: Record<string, string>;\n showFields?: {\n planName?: boolean;\n transactionDate?: boolean;\n amount?: boolean;\n discount?: boolean;\n status?: boolean;\n coupon?: boolean;\n invoice?: boolean;\n };\n dateFormat?: 'date' | 'datetime';\n metaFields?: string[]; // Array of meta field keys to display (max 2)\n}\n\n// Download icon component\nconst DownloadIcon: React.FC<{ className?: string }> = ({ className = \"w-4 h-4\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 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);\n\nconst getStatusColor = (status: string, customColors?: Record<string, string>) => {\n if (customColors && customColors[status.toLowerCase()]) {\n return customColors[status.toLowerCase()];\n }\n\n switch (status.toLowerCase()) {\n case 'activated':\n case 'succeeded':\n case 'renewed':\n case 'use_stripe_sdk':\n return 'bg-green-100 text-green-800';\n case 'pending':\n case 'processing':\n return 'bg-yellow-100 text-yellow-800';\n case 'payment_failed':\n return 'bg-red-100 text-red-800';\n default:\n return 'bg-blue-100 text-blue-800';\n }\n};\n\nconst formatCurrency = (amount: string | number, currency?: string | null) => {\n const numericAmount = typeof amount === 'string' ? parseFloat(amount) : amount;\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency || 'USD',\n }).format(numericAmount);\n};\n\n// Helper function to format meta field keys into readable labels\nconst formatMetaLabel = (key: string): string => {\n // Convert snake_case or UPPER_CASE to Title Case\n return key\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n};\n\n// Helper function to format meta field values\nconst formatMetaValue = (value: any): string => {\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n if (typeof value === 'string') {\n // If it's \"unlimited\", capitalize it\n if (value.toLowerCase() === 'unlimited') {\n return 'Unlimited';\n }\n return value;\n }\n return String(value);\n};\n\nexport const TransactionItem: React.FC<TransactionItemProps> = ({\n transaction,\n className = '',\n showInvoiceButton = true,\n customStatusColors,\n showFields = {\n planName: true,\n transactionDate: true,\n amount: true,\n discount: true,\n status: true,\n coupon: true,\n invoice: true,\n },\n dateFormat = 'datetime',\n metaFields = [],\n}) => {\n const handleInvoiceDownload = (invoiceUrl: string) => {\n const link = document.createElement('a');\n link.href = invoiceUrl;\n link.download = `invoice-${transaction.id}.pdf`;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // Generate meta fields display string\n const getMetaFieldsDisplay = () => {\n if (metaFields.length === 0 || !transaction.meta) return '';\n \n const metaValues = metaFields\n .slice(0, 2)\n .map((fieldKey) => {\n const value = transaction.meta?.[fieldKey];\n if (value === undefined || value === null) return null;\n return `${formatMetaLabel(fieldKey)}: ${formatMetaValue(value)}`;\n })\n .filter(Boolean);\n \n return metaValues.length > 0 ? ` (${metaValues.join(', ')})` : '';\n };\n\n return (\n <li className={`px-6 py-4 hover:bg-gray-50 ${className}`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between\">\n <div>\n {showFields.planName && (\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n {transaction.planName ? `${transaction.planName} Plan${getMetaFieldsDisplay()}` : `Transaction #${transaction.transactionCode || transaction.id}${getMetaFieldsDisplay()}`}\n </p>\n )}\n {showFields.transactionDate && (\n <p className=\"text-sm text-gray-500\">\n {formatDate(transaction.transactionDate || transaction.membershipDate, dateFormat)}\n </p>\n )}\n </div>\n <div className=\"flex items-center space-x-4\">\n {showFields.amount && (\n <div className=\"text-right\">\n <p className=\"text-sm font-medium text-gray-900\">\n {formatCurrency(transaction?.amount, transaction?.currency)}\n </p>\n {showFields.discount && transaction?.discountAmt && parseFloat(transaction?.discountAmt.toString()) > 0 && (\n <p className=\"text-xs text-green-600\">\n -{formatCurrency(transaction?.discountAmt, transaction?.currency)} discount\n </p>\n )}\n </div>\n )}\n {showFields.status && (\n <span\n className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getStatusColor(\n transaction.transactionStatus,\n customStatusColors\n )}`}\n>\n {transaction.transactionStatus === 'payment_failed'\n ? 'Failed'\n : transaction.transactionStatus === 'succeeded'\n ? 'Succeeded'\n : transaction.transactionStatus === 'activated'\n ? 'Activated'\n : transaction.transactionStatus === 'renewed'\n ? 'Renewed'\n : transaction.transactionStatus}\n</span>\n\n )}\n {showFields.invoice && showInvoiceButton && transaction.invoice_pdf && (\n <button\n onClick={() => {\n handleInvoiceDownload(transaction.invoice_pdf!);\n }}\n className=\"inline-flex items-center justify-center p-0 text-blue-600 hover:text-blue-800 transition-colors border-0 bg-transparent focus:outline-none focus:ring-0 focus-visible:outline-none active:outline-none\"\n title=\"Download Invoice\"\n aria-label=\"Download Invoice\"\n >\n <DownloadIcon className=\"w-4 h-4\" />\n \n </button>\n )}\n </div>\n </div>\n {showFields.coupon && transaction.coupon && (\n <div className=\"mt-2\">\n <span className=\"inline-flex items-center px-2 py-1 rounded-md text-xs font-medium bg-purple-100 text-purple-800\">\n Coupon: {transaction.coupon}\n </span>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n};\n\nexport default TransactionItem;\n","import React from 'react';\n\nexport interface TransactionLoadingStateProps {\n message?: string;\n className?: string;\n showSpinner?: boolean;\n rows?: number;\n}\n\nexport const TransactionLoadingState: React.FC<TransactionLoadingStateProps> = ({\n message = \"Loading transactions...\",\n className = '',\n showSpinner = true,\n rows = 5,\n}) => {\n if (showSpinner) {\n return (\n <div className={`flex items-center justify-center py-8 ${className}`}>\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\n <span className=\"ml-2 text-gray-600\">{message}</span>\n </div>\n );\n }\n\n // Skeleton loading state\n return (\n <div className={`bg-white shadow overflow-hidden sm:rounded-md ${className}`}>\n <ul className=\"divide-y divide-gray-200\">\n {Array.from({ length: rows }).map((_, index) => (\n <li key={index} className=\"px-6 py-4 animate-pulse\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-gray-200 rounded w-48\"></div>\n <div className=\"h-3 bg-gray-200 rounded w-32\"></div>\n </div>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-right space-y-2\">\n <div className=\"h-4 bg-gray-200 rounded w-20\"></div>\n </div>\n <div className=\"h-6 bg-gray-200 rounded-full w-16\"></div>\n <div className=\"h-4 bg-gray-200 rounded w-12\"></div>\n </div>\n </div>\n </div>\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default TransactionLoadingState;\n","import React from 'react';\n\nexport interface TransactionErrorStateProps {\n error: string;\n title?: string;\n onRetry?: () => void;\n className?: string;\n showRetryButton?: boolean;\n}\n\nexport const TransactionErrorState: React.FC<TransactionErrorStateProps> = ({\n error,\n title = \"Error loading transactions\",\n onRetry,\n className = '',\n showRetryButton = true,\n}) => {\n return (\n <div className={`bg-red-50 border border-red-200 rounded-md p-4 ${className}`}>\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-red-800\">{title}</h3>\n <div className=\"mt-2 text-sm text-red-700\">{error}</div>\n {showRetryButton && onRetry && (\n <div className=\"mt-4\">\n <button\n onClick={onRetry}\n className=\"bg-red-100 hover:bg-red-200 text-red-800 font-medium py-2 px-4 rounded text-sm transition-colors duration-200\"\n >\n Try Again\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default TransactionErrorState;\n","import React from 'react';\n\nexport interface TransactionEmptyStateProps {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport const TransactionEmptyState: React.FC<TransactionEmptyStateProps> = ({\n title = \"No transactions found\",\n description = \"There are no transactions to display.\",\n icon,\n action,\n className = '',\n}) => {\n const defaultIcon = (\n <svg\n className=\"mx-auto h-12 w-12 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n 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 />\n </svg>\n );\n\n return (\n <div className={`text-center py-8 ${className}`}>\n {icon || defaultIcon}\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">{title}</h3>\n <p className=\"mt-1 text-sm text-gray-500\">{description}</p>\n {action && (\n <div className=\"mt-4\">\n {action}\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionEmptyState;\n","import React from 'react';\nimport type { Transaction } from '../../types';\nimport { TransactionItem } from './TransactionItem';\nimport { TransactionLoadingState } from './TransactionLoadingState';\nimport { TransactionErrorState } from './TransactionErrorState';\nimport { TransactionEmptyState } from './TransactionEmptyState';\n\nexport interface TransactionListProps {\n transactions: Transaction[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n className?: string;\n showInvoiceButton?: boolean;\n customStatusColors?: Record<string, string>;\n emptyStateProps?: {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n };\n loadingStateProps?: {\n message?: string;\n showSpinner?: boolean;\n rows?: number;\n };\n}\n\nexport const TransactionList: React.FC<TransactionListProps> = ({\n transactions,\n loading = false,\n error = null,\n onRetry,\n className = '',\n showInvoiceButton = true,\n customStatusColors,\n emptyStateProps,\n loadingStateProps,\n}) => {\n\n if (loading) {\n return (\n <TransactionLoadingState \n className={className}\n {...loadingStateProps}\n />\n );\n }\n\n if (error) {\n return (\n <TransactionErrorState \n error={error}\n onRetry={onRetry}\n className={className}\n />\n );\n }\n\n if (transactions.length === 0) {\n return (\n <TransactionEmptyState \n className={className}\n {...emptyStateProps}\n />\n );\n }\n\n return (\n <div className={`bg-white shadow overflow-hidden sm:rounded-md ${className}`}>\n <ul className=\"divide-y divide-gray-200\">\n {transactions.map((transaction) => (\n <TransactionItem\n key={transaction.id}\n transaction={transaction}\n showInvoiceButton={showInvoiceButton}\n customStatusColors={customStatusColors}\n metaFields={['CANDIDATES']}\n />\n ))}\n </ul>\n </div>\n );\n};\n\n","import React from 'react';\n\nexport interface TransactionStatusFilterProps {\n selectedStatus?: string;\n onStatusChange: (status: string) => void;\n className?: string;\n showAllOption?: boolean;\n customStatuses?: Array<{ value: string; label: string; color?: string }>;\n}\n\nconst defaultStatuses = [\n { value: '', label: 'All Statuses', color: 'bg-blue-600 text-white' },\n { value: 'pending', label: 'Pending', color: 'bg-yellow-100 text-yellow-800' },\n { value: 'succeeded', label: 'Succeeded', color: 'bg-green-100 text-green-800' },\n { value: 'payment_failed', label: 'Payment Failed', color: 'bg-red-100 text-red-800' },\n];\n\nexport const TransactionStatusFilter: React.FC<TransactionStatusFilterProps> = ({\n selectedStatus = '',\n onStatusChange,\n className = '',\n showAllOption = true,\n customStatuses,\n}) => {\n const statuses = customStatuses || defaultStatuses;\n const statusesToShow = showAllOption ? statuses : statuses.filter(s => s.value !== '');\n\n return (\n <div className={`flex flex-wrap gap-2 ${className}`}>\n {statusesToShow.map((status) => (\n <button\n key={status.value}\n onClick={() => onStatusChange(status.value)}\n className={`\n px-3 py-1 rounded-full text-sm font-medium transition-all duration-200\n ${selectedStatus === status.value \n ? (status.color || 'text-white')\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'}\n `}\n >\n {status.label}\n </button>\n ))}\n </div>\n );\n};\n\nexport default TransactionStatusFilter;\n","import React from 'react';\nimport { TransactionStatusFilter } from './TransactionStatusFilter';\nimport type { TransactionFilters } from '../../types';\n\nexport interface TransactionFilterProps {\n filters: TransactionFilters;\n onFiltersChange: (filters: TransactionFilters) => void;\n className?: string;\n showStatusFilter?: boolean;\n showDateFilter?: boolean;\n showSearchFilter?: boolean;\n showClearFilters?: boolean;\n customStatusOptions?: Array<{ value: string; label: string; color?: string }>;\n}\n\nexport const TransactionFilter: React.FC<TransactionFilterProps> = ({\n filters,\n onFiltersChange,\n className = '',\n showStatusFilter = true,\n showDateFilter = true,\n showSearchFilter = true,\n showClearFilters = true,\n customStatusOptions,\n}) => {\n const handleFilterChange = (key: keyof TransactionFilters, value: string | number | undefined) => {\n onFiltersChange({\n ...filters,\n [key]: value,\n page: 1, // Reset to first page when filters change\n });\n };\n\n const clearFilters = () => {\n onFiltersChange({\n page: 1,\n limit: filters.limit || 10,\n });\n };\n\n const hasActiveFilters = filters.status || filters.startDate || filters.endDate;\n\n return (\n <div className={`space-y-4 ${className}`}>\n {/* Search Filter */}\n {showSearchFilter && (\n <div className=\"flex items-center space-x-2\">\n <div className=\"relative flex-1 max-w-md\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg className=\"h-5 w-5 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n <input\n type=\"text\"\n placeholder=\"Search transactions...\"\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-blue-500 focus:border-blue-500 sm:text-sm\"\n onChange={(e) => handleFilterChange('search' as keyof TransactionFilters, e.target.value)}\n />\n </div>\n </div>\n )}\n\n {/* Date Range Filter */}\n {showDateFilter && (\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"flex items-center space-x-2\">\n <label className=\"text-sm font-medium text-gray-700\">From:</label>\n <input\n type=\"date\"\n value={filters.startDate || ''}\n onChange={(e) => handleFilterChange('startDate', e.target.value)}\n className=\"px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n <div className=\"flex items-center space-x-2\">\n <label className=\"text-sm font-medium text-gray-700\">To:</label>\n <input\n type=\"date\"\n value={filters.endDate || ''}\n onChange={(e) => handleFilterChange('endDate', e.target.value)}\n className=\"px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n )}\n\n {/* Status Filter */}\n {showStatusFilter && (\n <div className=\"space-y-2\">\n {/* <label className=\"text-sm font-medium text-gray-700\">Status:</label> */}\n <TransactionStatusFilter\n selectedStatus={filters.status}\n onStatusChange={(status) => handleFilterChange('status', status)}\n customStatuses={customStatusOptions}\n />\n </div>\n )}\n\n {/* Clear Filters */}\n {hasActiveFilters && showClearFilters && (\n <div className=\"flex justify-end\">\n <button\n onClick={clearFilters}\n className=\"text-sm text-blue-600 hover:text-blue-800 font-medium\"\n >\n Clear all filters\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionFilter;\n","import React from 'react';\nimport type { PaginationMeta } from '../../types';\n\nexport interface TransactionPaginationProps {\n pagination: PaginationMeta;\n onPageChange: (page: number) => void;\n onLimitChange?: (limit: number) => void;\n className?: string;\n showPageSizeSelector?: boolean;\n pageSizeOptions?: number[];\n showInfo?: boolean;\n}\n\nexport const TransactionPagination: React.FC<TransactionPaginationProps> = ({\n pagination,\n onPageChange,\n onLimitChange,\n className = '',\n showPageSizeSelector = true,\n pageSizeOptions = [10, 25, 50, 100],\n showInfo = true,\n}) => {\n const { currentPage, totalPages, totalItems, itemsPerPage, hasNextPage, hasPreviousPage } = pagination;\n\n const getVisiblePages = () => {\n // If there's only one page, just return [1]\n if (totalPages <= 1) {\n return [1];\n }\n \n const delta = 2;\n const range = [];\n const rangeWithDots = [];\n\n for (let i = Math.max(2, currentPage - delta); i <= Math.min(totalPages - 1, currentPage + delta); i++) {\n range.push(i);\n }\n\n if (currentPage - delta > 2) {\n rangeWithDots.push(1, '...');\n } else {\n rangeWithDots.push(1);\n }\n\n rangeWithDots.push(...range);\n\n if (currentPage + delta < totalPages - 1) {\n rangeWithDots.push('...', totalPages);\n } else if (totalPages > 1) {\n rangeWithDots.push(totalPages);\n }\n\n return rangeWithDots;\n };\n\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n // Always show pagination controls, even with one page\n // This allows users to change the page size even when all data fits on one page\n\n return (\n <div className={`flex flex-col sm:flex-row items-center justify-between space-y-3 sm:space-y-0 ${className}`}>\n {/* Info and Page Size Selector */}\n <div className=\"flex flex-col sm:flex-row items-center space-y-2 sm:space-y-0 sm:space-x-4\">\n {showInfo && (\n <div className=\"text-sm text-gray-700\">\n Showing <span className=\"font-medium\">{startItem}</span> to{' '}\n <span className=\"font-medium\">{endItem}</span> of{' '}\n <span className=\"font-medium\">{totalItems}</span> results\n </div>\n )}\n\n {showPageSizeSelector && onLimitChange && (\n <div className=\"flex items-center space-x-2\">\n <label className=\"text-sm text-gray-700\">Show:</label>\n <select\n value={itemsPerPage}\n onChange={(e) => onLimitChange(Number(e.target.value))}\n className=\"px-2 py-1 border border-gray-300 rounded text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n <span className=\"text-sm text-gray-700\">per page</span>\n </div>\n )}\n </div>\n\n {/* Pagination Controls */}\n <div className=\"flex items-center space-x-1\">\n {/* Previous Button */}\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={!hasPreviousPage || totalPages <= 1}\n className={`\n px-3 py-2 text-sm font-medium rounded-md\n ${hasPreviousPage && totalPages > 1\n ? 'text-gray-500 bg-white border border-gray-300 hover:bg-gray-50 hover:text-gray-700'\n : 'text-gray-300 bg-white border border-gray-300 cursor-not-allowed'\n }\n `}\n >\n Previous\n </button>\n\n {/* Page Numbers */}\n <div className=\"flex items-center space-x-1\">\n {getVisiblePages().map((page, index) => (\n <React.Fragment key={index}>\n {page === '...' ? (\n <span className=\"px-3 py-2 text-sm text-gray-500\">...</span>\n ) : (\n <button\n onClick={() => onPageChange(page as number)}\n className={`\n px-3 py-2 text-sm font-medium rounded-md\n ${currentPage === page\n ? 'bg-blue-600 text-white border border-blue-600'\n : 'text-gray-500 bg-white border border-gray-300 hover:bg-gray-50 hover:text-gray-700'\n }\n `}\n >\n {page}\n </button>\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Next Button */}\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={!hasNextPage || totalPages <= 1}\n className={`\n px-3 py-2 text-sm font-medium rounded-md\n ${hasNextPage && totalPages > 1\n ? 'text-gray-500 bg-white border border-gray-300 hover:bg-gray-50 hover:text-gray-700'\n : 'text-gray-300 bg-white border border-gray-300 cursor-not-allowed'\n }\n `}\n >\n Next\n </button>\n </div>\n </div>\n );\n};\n\nexport default TransactionPagination;\n","import React, { useEffect } from 'react';\nimport { TransactionList, TransactionFilter, TransactionPagination } from './index';\nimport { useTransactions } from '../../hooks/useTransactions';\nimport type { TransactionFilters } from '../../types';\n\nexport interface TransactionModalProps {\n isOpen: boolean;\n onClose: () => void;\n externalId: string;\n title?: string;\n}\n\nexport const TransactionModal: React.FC<TransactionModalProps> = ({\n isOpen,\n onClose,\n externalId,\n title = 'Transaction History',\n}) => {\n const {\n transactions,\n loading,\n error,\n filters,\n meta,\n updateFilters,\n fetchTransactions,\n } = useTransactions({\n externalId,\n initialFilters: { page: 1, limit: 10 },\n autoFetch: true, // Enable auto-fetch so it works when modal opens\n });\n\n // Fetch transactions when modal opens\n useEffect(() => {\n if (isOpen && externalId) {\n fetchTransactions();\n }\n }, [isOpen, externalId, fetchTransactions]);\n\n const handlePageChange = (page: number) => {\n updateFilters({ page });\n };\n\n const handleLimitChange = (limit: number) => {\n updateFilters({ limit, page: 1 });\n };\n\n const handleFiltersChange = (newFilters: TransactionFilters) => {\n updateFilters(newFilters);\n };\n\n if (!isOpen) return null;\n\n\n return (\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n {/* Background overlay */}\n <div\n className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity z-0\"\n onClick={onClose}\n />\n\n {/* Modal panel */}\n <div className=\"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-4xl sm:w-full relative z-10\">\n {/* Header */}\n <div className=\"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4\">\n <div className=\"flex items-center justify-between mb-4\">\n {/* <h3 className=\"text-lg leading-6 font-medium text-gray-900\">\n {title}\n </h3> */}\n <button\n onClick={onClose}\n className=\"bg-white rounded-md text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary\"\n >\n <span className=\"sr-only\">Close</span>\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {/* Filters */}\n <TransactionFilter\n filters={filters}\n onFiltersChange={handleFiltersChange}\n className=\"mb-4\"\n showSearchFilter={false}\n />\n </div>\n\n {/* Content */}\n <div className=\"px-4 pb-4 sm:px-6 sm:pb-6\">\n <TransactionList\n transactions={transactions}\n loading={loading}\n error={error}\n className=\"mb-4\"\n />\n\n {/* Pagination */}\n {meta && (\n <TransactionPagination\n pagination={meta}\n onPageChange={handlePageChange}\n onLimitChange={handleLimitChange}\n pageSizeOptions={[5, 10, 20, 25, 50]}\n />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-primary text-base font-medium text-white hover:bg-primary-dark focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary sm:ml-3 sm:w-auto sm:text-sm\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { Subscription } from '../../types';\nimport { formatDate } from '../../utils/planUtils';\n\nexport interface InfoField {\n key: string;\n label: string;\n getValue: (subscription: Subscription | null) => string | React.ReactNode;\n className?: string;\n}\n\nexport interface SubscriptionInfoGridProps {\n subscription: Subscription | null;\n fields?: InfoField[];\n className?: string;\n gridCols?: 1 | 2 | 3 | 4 | 5;\n showDefaultFields?: boolean;\n loading?: boolean;\n}\n\nconst defaultFields: InfoField[] = [\n {\n key: 'planName',\n label: 'Active Subscription',\n getValue: (subscription) => subscription?.plan?.name || 'N/A',\n },\n {\n key: 'planInterval',\n label: 'Subscription Type',\n getValue: (subscription) => {\n const interval = subscription?.plan?.interval || 'N/A';\n return interval !== 'N/A'\n ? interval.charAt(0) + interval.slice(1).toLowerCase()\n : interval;\n },\n },\n {\n key: 'expiryDate',\n label: 'Subscription Renews on',\n getValue: (subscription) => subscription?.expiryDate ? formatDate(subscription.expiryDate) : 'N/A',\n },\n];\n\nexport const SubscriptionInfoGrid: React.FC<SubscriptionInfoGridProps> = ({\n subscription,\n fields,\n className = '',\n gridCols = 3,\n showDefaultFields = true,\n loading = false,\n}) => {\n const displayFields = fields || (showDefaultFields ? defaultFields : []);\n\n if (displayFields.length === 0) {\n return null;\n }\n\n const getGridClass = () => {\n switch (gridCols) {\n case 1: return 'grid-cols-1';\n case 2: return 'grid-cols-1 md:grid-cols-2';\n case 3: return 'grid-cols-1 md:grid-cols-3';\n case 4: return 'grid-cols-2 md:grid-cols-4';\n case 5: return 'grid-cols-2 md:grid-cols-5';\n default: return 'grid-cols-1 md:grid-cols-3';\n }\n };\n\n\n return (\n <div className={`grid ${getGridClass()} gap-4 ${className}`}>\n {displayFields.map((field) => (\n <div key={field.key} className={`p-4 border border-gray-200 rounded-lg bg-white ${field.className || ''}`}>\n <p \n className=\"text-sm text-gray-500\" \n style={{\n fontSize: 'var(--subos-font-size-subscription-label, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-subscription-label, 400)',\n color: 'var(--subos-color-subscription-label, #6c757d)'\n }}\n >\n {field.key === 'expiryDate' && (subscription?.plan?.canceledOn || subscription?.plan?.name === 'Trial') ? 'Subscription Expires on' : field.label}\n </p>\n <div \n className=\"font-medium\"\n style={{\n fontSize: 'var(--subos-font-size-subscription-value, 1rem)',\n fontWeight: 'var(--subos-font-weight-subscription-value, 500)',\n color: 'var(--subos-color-subscription-value, inherit)'\n }}\n >\n {loading ? 'N/A' : (field.getValue(subscription) || 'N/A')}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nexport default SubscriptionInfoGrid;\n","import React from 'react';\nimport type { Subscription } from '../../types';\n\nexport interface UsageMetric {\n key: string;\n label: string;\n showProgress?: boolean;\n formatValue?: (used: number, total: number) => string;\n}\n\nexport interface SubscriptionUsageDisplayProps {\n subscription: Subscription | null;\n usageMetrics: UsageMetric[];\n className?: string;\n gridCols?: 1 | 2 | 3 | 4 | 5;\n showProgressBars?: boolean;\n loading?: boolean;\n}\n\nexport const SubscriptionUsageDisplay: React.FC<SubscriptionUsageDisplayProps> = ({\n subscription,\n usageMetrics,\n className = '',\n gridCols = 3,\n showProgressBars = false,\n loading = false,\n}) => {\n if (usageMetrics.length === 0) {\n return null;\n }\n\n const getGridClass = () => {\n switch (gridCols) {\n case 1: return 'grid-cols-1';\n case 2: return 'grid-cols-1 md:grid-cols-2';\n case 3: return 'grid-cols-1 md:grid-cols-3';\n case 4: return 'grid-cols-2 md:grid-cols-4';\n case 5: return 'grid-cols-2 md:grid-cols-5';\n default: return 'grid-cols-1 md:grid-cols-3';\n }\n };\n\n const formatDefaultValue = (used: number, total: number) => {\n return `${used}/${total}`;\n };\n\n const getProgressPercentage = (used: number, total: number) => {\n if (total === 0) return 0;\n return Math.min((used / total) * 100, 100);\n };\n\n const getProgressColor = (percentage: number) => {\n if (percentage >= 90) return 'bg-red-500';\n if (percentage >= 75) return 'bg-yellow-500';\n return 'bg-green-500';\n };\n\n\n return (\n <div className={`grid ${getGridClass()} gap-4 ${className}`}>\n {usageMetrics.map((metric) => {\n const used = subscription?.usage?.[metric.key] ?? 0;\n const total = subscription?.meta?.[metric.key] ?? 0;\n \n const displayValue = loading ? 'N/A' : (metric.formatValue \n ? metric.formatValue(used, total)\n : formatDefaultValue(used, total));\n \n const percentage = getProgressPercentage(used, total);\n const shouldShowProgress = showProgressBars || metric.showProgress;\n\n return (\n <div key={metric.key} className=\"p-4 border border-gray-200 rounded-lg bg-white space-y-1\">\n <p \n className=\"text-sm text-gray-500\" \n style={{\n fontSize: 'var(--subos-font-size-subscription-label, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-subscription-label, 400)',\n color: 'var(--subos-color-subscription-label, #6c757d)'\n }}\n >\n {metric.label}\n </p>\n <p \n className=\"font-medium\"\n style={{\n fontSize: 'var(--subos-font-size-subscription-value, 1rem)',\n fontWeight: 'var(--subos-font-weight-subscription-value, 500)',\n color: 'var(--subos-color-subscription-value, inherit)'\n }}\n >\n {displayValue}\n </p>\n {shouldShowProgress && total > 0 && (\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className={`h-2 rounded-full transition-all duration-300 ${getProgressColor(percentage)}`}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default SubscriptionUsageDisplay;\n","import React from 'react';\n\nexport interface SubscriptionTransactionButtonProps {\n onClick: () => void;\n className?: string;\n children?: React.ReactNode;\n disabled?: boolean;\n variant?: 'text' | 'button';\n}\n\nexport const SubscriptionTransactionButton: React.FC<SubscriptionTransactionButtonProps> = ({\n onClick,\n className = '',\n children = 'Transactions',\n disabled = false,\n variant = 'text',\n}) => {\n const baseClasses = variant === 'text'\n ? 'transition-colors duration-200 disabled:cursor-not-allowed'\n : 'px-4 py-2 text-white rounded-md transition-colors duration-200 disabled:cursor-not-allowed';\n\n const getStyles = () => {\n const baseStyles = {\n fontSize: 'var(--subos-font-size-button-text, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-button-text, 500)',\n };\n\n if (variant === 'text') {\n return {\n ...baseStyles,\n color: disabled \n ? 'var(--subos-muted-foreground, #64748b)' \n : 'var(--subos-color-button-text, var(--subos-primary-600, #2563eb))',\n textDecoration: 'none',\n };\n } else {\n return {\n ...baseStyles,\n backgroundColor: disabled \n ? 'var(--subos-muted, #f1f5f9)' \n : 'var(--subos-primary-500, #3f51b5)',\n color: disabled ? 'var(--subos-muted-foreground, #64748b)' : 'white',\n };\n }\n };\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`${baseClasses} ${className}`}\n style={getStyles()}\n onMouseEnter={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-primary-700, #1d4ed8)';\n e.currentTarget.style.textDecoration = 'underline';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-600, #2563eb)';\n } : undefined}\n onMouseLeave={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-primary-600, #2563eb)';\n e.currentTarget.style.textDecoration = 'none';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #3f51b5)';\n } : undefined}\n >\n {children}\n </button>\n );\n};\n\nexport default SubscriptionTransactionButton;\n","import React from 'react';\n\nexport interface SubscriptionCancelButtonProps {\n onClick: () => void;\n className?: string;\n children?: React.ReactNode;\n disabled?: boolean;\n variant?: 'text' | 'button';\n title?: string;\n}\n\nexport const SubscriptionCancelButton: React.FC<SubscriptionCancelButtonProps> = ({\n onClick,\n className = '',\n children = 'Cancel Renewal',\n disabled = false,\n variant = 'text',\n title,\n}) => {\n const baseClasses = variant === 'text'\n ? 'transition-colors duration-200 disabled:cursor-not-allowed'\n : 'px-4 py-2 text-white rounded-md transition-colors duration-200 disabled:cursor-not-allowed';\n\n const getStyles = () => {\n const baseStyles = {\n fontSize: 'var(--subos-font-size-button-text, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-button-text, 500)',\n };\n\n if (variant === 'text') {\n return {\n ...baseStyles,\n color: disabled \n ? 'var(--subos-muted-foreground, #64748b)' \n : '#dc2626', // Keep red for cancel action\n textDecoration: 'none',\n };\n } else {\n return {\n ...baseStyles,\n backgroundColor: disabled \n ? 'var(--subos-muted, #f1f5f9)' \n : '#dc2626', // Keep red for cancel action\n color: disabled ? 'var(--subos-muted-foreground, #64748b)' : 'white',\n };\n }\n };\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`${baseClasses} ${className}`}\n style={getStyles()}\n title={title}\n onMouseEnter={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = '#b91c1c';\n e.currentTarget.style.textDecoration = 'underline';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = '#b91c1c';\n } : undefined}\n onMouseLeave={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = '#dc2626';\n e.currentTarget.style.textDecoration = 'none';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = '#dc2626';\n } : undefined}\n >\n {children}\n </button>\n );\n};\n\nexport default SubscriptionCancelButton;\n","import React from 'react';\nimport { SubscriptionTransactionButton } from './SubscriptionTransactionButton';\nimport { SubscriptionCancelButton } from './SubscriptionCancelButton';\nimport type { Subscription } from '../../types';\n\nexport interface ActionButton {\n key: string;\n component: React.ReactNode;\n show?: boolean;\n}\n\nexport interface SubscriptionActionButtonsProps {\n onTransactionClick?: () => void;\n onCancelClick?: () => void;\n customActions?: ActionButton[];\n showTransactionButton?: boolean;\n showCancelButton?: boolean;\n className?: string;\n layout?: 'horizontal' | 'vertical';\n spacing?: 'tight' | 'normal' | 'loose';\n subscription?: Subscription | null;\n}\n\nexport const SubscriptionActionButtons: React.FC<SubscriptionActionButtonsProps> = ({\n onTransactionClick,\n onCancelClick,\n customActions = [],\n showTransactionButton = true,\n showCancelButton = true,\n className = '',\n layout = 'horizontal',\n spacing = 'normal',\n subscription,\n}) => {\n const getSpacingClass = () => {\n const isVertical = layout === 'vertical';\n switch (spacing) {\n case 'tight':\n return isVertical ? 'space-y-1' : 'space-x-1'; // Made tighter\n case 'normal':\n return isVertical ? 'space-y-2' : 'space-x-3'; // Reduced spacing\n case 'loose':\n return isVertical ? 'space-y-4' : 'space-x-8';\n default:\n return isVertical ? 'space-y-2' : 'space-x-3'; // Reduced spacing\n }\n };\n\n const containerClass = layout === 'vertical' \n ? `flex flex-col ${getSpacingClass()}`\n : `flex items-center ${getSpacingClass()}`; // Added items-center for better alignment\n\n // Determine if cancel button should be disabled and the tooltip message\n const getCancelButtonState = () => {\n if (!subscription) {\n return { disabled: false, tooltip: undefined };\n }\n\n const canceledOn = subscription.plan?.canceledOn;\n\n // Check if already canceled\n if (canceledOn) {\n return {\n disabled: true,\n tooltip: 'Renewal already canceled — it will end after this billing cycle.',\n };\n }\n\n // Check if plan is Starter or Trail (case-insensitive)\n if (subscription.plan?.fixedCost === 0) {\n return {\n disabled: true,\n tooltip: 'You’re on a starter/free-trial plan — there’s no active renewal to cancel.',\n };\n }\n\n return { disabled: false, tooltip: undefined };\n };\n\n const cancelButtonState = getCancelButtonState();\n\n const defaultActions: ActionButton[] = [\n {\n key: 'transaction',\n component: onTransactionClick && (\n <SubscriptionTransactionButton onClick={onTransactionClick} />\n ),\n show: showTransactionButton && !!onTransactionClick,\n },\n {\n key: 'cancel',\n component: onCancelClick && (\n <SubscriptionCancelButton \n onClick={onCancelClick} \n disabled={cancelButtonState.disabled}\n title={cancelButtonState.tooltip}\n />\n ),\n show: showCancelButton && !!onCancelClick,\n },\n ];\n\n const allActions = [...defaultActions, ...customActions];\n const visibleActions = allActions.filter(action => action.show !== false && action.component);\n\n if (visibleActions.length === 0) {\n return null;\n }\n\n return (\n <div className={`${containerClass} ${className}`}>\n {visibleActions.map((action) => (\n <div key={action.key}>\n {action.component}\n </div>\n ))}\n </div>\n );\n};\n\nexport default SubscriptionActionButtons;\n","import React from 'react';\n\nexport interface CancelOptions {\n cancellationMode?: 'immediate' | 'endOfPeriod';\n cancellationReason?: string;\n}\n\nexport interface SubscriptionCancelModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: (options: CancelOptions) => Promise<void>;\n loading?: boolean;\n title?: string;\n description?: string;\n buttonText?: string;\n subscription?: any; // Add subscription prop to avoid prop errors\n}\n\n\nexport const SubscriptionCancelModal: React.FC<SubscriptionCancelModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n loading = false,\n title = 'Cancel Subscription',\n description = 'Are you sure you want to cancel your subscription? This action cannot be undone.',\n buttonText = 'Cancel Renewal',\n subscription: _subscription, // Accept subscription prop but don't use it\n ..._props // Capture any other props to avoid React warnings\n}) => {\n // Static values as requested\n const cancellationMode = 'endOfPeriod';\n const cancellationReason = 'subscription_user_canceled_request';\n\n const handleConfirm = async () => {\n await onConfirm({\n cancellationMode,\n cancellationReason,\n });\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Background overlay */}\n <div\n className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity\"\n onClick={onClose}\n />\n\n {/* Modal panel */}\n <div className=\"relative bg-white rounded-2xl shadow-xl w-[560px] max-w-[90vw] z-10\">\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"absolute top-4 right-4 text-gray-400 focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors z-20\"\n style={{\n // default color stays gray; hover handled below to mirror theme usage in other components\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = 'var(--subos-primary-600, #303f9f)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = '';\n }}\n onFocus={(e) => {\n // emulate themed ring color if Tailwind var ring color isn't applied\n e.currentTarget.style.setProperty('--tw-ring-color', 'var(--subos-primary-500, #3f51b5)');\n }}\n >\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n {/* Header */}\n <div className=\"bg-white px-6 pt-3 pb-0 sm:px-8 sm:pt-4 sm:pb-0 rounded-t-2xl\">\n <div className=\"flex flex-col items-center text-center\">\n <div className=\"flex items-center justify-center h-12 w-12 rounded-xl bg-yellow-100\">\n <svg className=\"h-6 w-6 text-yellow-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <h3 className=\"mt-4 text-xl font-semibold text-gray-900\">\n {title}\n </h3>\n <p className=\"mt-2 mb-4 text-sm text-gray-500\">\n {description}\n </p>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 pt-1 pb-5 sm:px-8 flex justify-center rounded-b-2xl\">\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={loading}\n className=\"inline-flex justify-center rounded-md border border-transparent shadow-sm px-6 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:text-sm disabled:bg-red-300 disabled:cursor-not-allowed relative z-10\"\n style={{ minHeight: '40px' }}\n >\n {loading ? 'Cancelling...' : buttonText}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default SubscriptionCancelModal;\n","import { WarningIcon } from '../icons/CommonIcons';\nimport type { Subscription } from '../../types';\n\nexport interface ScheduledPlanNotificationProps {\n subscription: Subscription | null;\n className?: string;\n}\n\nexport const ScheduledPlanNotification: React.FC<ScheduledPlanNotificationProps> = ({\n subscription,\n className = '',\n}) => {\n if (!subscription?.nextMembership) {\n return null;\n }\n\n const formatInterval = (interval: string) => {\n return interval.charAt(0).toUpperCase() + interval.slice(1).toLowerCase();\n };\n\n const nextPlan = subscription.nextMembership.plan;\n const metrics = nextPlan.charges && nextPlan.charges.length > 0\n ? `(${nextPlan.charges.map(charge => \n `${charge.billableMetric.name}: ${charge.properties?.units?.toLocaleString() || 0}`\n ).join(', ')}) `\n : '';\n\n return (\n <div className={`mb-4 p-4 bg-yellow-50 border border-yellow-200 rounded-md flex items-start gap-3 ${className}`}>\n <div className=\"text-yellow-600 mt-0.5\">\n <WarningIcon className=\"w-5 h-5\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm text-yellow-800\">\n Your subscription will change to{' '}\n <span className=\"font-semibold\">\n {nextPlan.name} {formatInterval(nextPlan.interval)} {metrics}\n </span>\n plan on{' '}\n <span className=\"font-semibold\">\n {new Date(subscription.nextMembership.membershipDate).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })}\n </span>\n </p>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { Subscription } from '../../types';\nimport { formatDate } from '../../utils/planUtils';\n\nexport interface GracePeriodNotificationProps {\n subscription: Subscription | null;\n className?: string;\n}\n\nexport const GracePeriodNotification: React.FC<GracePeriodNotificationProps> = ({\n subscription,\n className = '',\n}) => {\n if (!subscription?.meta?.isGracePeriod) {\n return null;\n }\n\n const startDate = subscription.meta.gracePeriodStart;\n const endDate = subscription.meta.gracePeriodEnd;\n \n // Calculate remaining days if endDate is available\n let remainingDays = subscription.remainingGracePeriodDays ?? 0;\n if (endDate) {\n const end = new Date(endDate).getTime();\n const now = new Date().getTime();\n const diff = end - now;\n remainingDays = Math.max(0, Math.ceil(diff / (1000 * 60 * 60 * 24)));\n }\n\n return (\n <div className={`mb-4 p-4 bg-orange-50 border border-orange-200 rounded-lg flex items-start gap-3 ${className}`}>\n <div className=\"text-orange-500 mt-0.5\">\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-bold text-orange-900 mb-1\">Grace Period Active</h3>\n <p className=\"text-sm text-orange-800\">\n Your <span className=\"font-bold\">7-day</span> grace period started on{' '}\n <span className=\"font-bold\">{startDate ? formatDate(startDate) : 'N/A'}</span>.\n You have <span className=\"font-bold text-orange-900 text-base\">{remainingDays} days remaining</span> to update your payment method to continue your subscription without interruption.\n </p>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { clearSelectedPlan } from '../../utils/upgradeUtils';\nimport type { Subscription } from '../../types';\nimport { TransactionModal } from '../transaction/TransactionModal';\nimport { useCancelSubscription } from '../../hooks/useCancelSubscription';\nimport { ChangeCardButton } from '../payments/ChangeCardButton';\nimport { SubscriptionInfoGrid } from './SubscriptionInfoGrid';\nimport { SubscriptionUsageDisplay, type UsageMetric } from './SubscriptionUsageDisplay';\nimport { SubscriptionActionButtons } from './SubscriptionActionButtons';\nimport { SubscriptionCancelModal, type CancelOptions } from './SubscriptionCancelModal';\nimport { ScheduledPlanNotification } from './ScheduledPlanNotification';\nimport { GracePeriodNotification } from './GracePeriodNotification';\n\nexport interface SubscriptionDetailsProps {\n subscription: Subscription | null;\n externalId: string;\n onSubscriptionCancelled?: () => void;\n usageMetrics?: UsageMetric[];\n showTransactionButton?: boolean;\n showCancelButton?: boolean;\n showChangeCardButton?: boolean;\n customActions?: React.ReactNode[];\n className?: string;\n loading?: boolean;\n}\n\nexport const SubscriptionDetails: React.FC<SubscriptionDetailsProps> = ({\n subscription,\n externalId,\n onSubscriptionCancelled,\n usageMetrics = [\n { key: 'ACTIVE_JOBS', label: 'Active Jobs' },\n { key: 'CANDIDATES', label: 'Candidates' },\n ],\n showTransactionButton = true,\n showCancelButton = true,\n showChangeCardButton = true,\n customActions = [],\n className = '',\n loading = false,\n}) => {\n const [isTransactionModalOpen, setIsTransactionModalOpen] = useState(false);\n const [showCancelConfirmation, setShowCancelConfirmation] = useState(false);\n\n const [localSubscription, setLocalSubscription] = useState<Subscription | null>(subscription);\n\n useEffect(() => {\n setLocalSubscription(subscription);\n }, [subscription]);\n\n const { cancelSubscription, loading: cancelLoading } = useCancelSubscription({\n onSuccess: () => {\n setShowCancelConfirmation(false);\n\n // Optimistically mark the subscription as canceled locally so UI updates immediately\n setLocalSubscription((prev) => {\n if (!prev) return prev;\n return {\n ...prev,\n plan: prev.plan\n ? {\n ...prev.plan,\n canceledOn: prev.plan.canceledOn || new Date().toISOString(),\n }\n : prev.plan,\n };\n });\n\n onSubscriptionCancelled?.();\n // Show success message or notification here\n alert('Subscription cancelled successfully');\n },\n onError: (error) => {\n // Show error message or notification here\n alert(`Failed to cancel subscription: ${error}`);\n },\n });\n\n const handleTransactionClick = () => {\n // Hide upgrade summary selection when navigating to transactions\n clearSelectedPlan();\n setIsTransactionModalOpen(true);\n };\n\n const handleCancelClick = () => {\n // Hide upgrade summary selection when initiating cancellation flow\n clearSelectedPlan();\n setShowCancelConfirmation(true);\n };\n\n const handleConfirmCancel = async (options: CancelOptions) => {\n await cancelSubscription(externalId, {\n cancellationMode: options.cancellationMode || 'endOfPeriod',\n cancellationReason: options.cancellationReason || 'subscription_user_canceled_request'\n });\n };\n\n const handleCancelModalClose = () => {\n setShowCancelConfirmation(false);\n };\n return (\n <>\n {/* Email summary and change button */}\n\n {/* Subscription Details Header */}\n <div className={`mb-6 ${className}`}>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">Subscription Details</h2>\n <div className=\"flex gap-4\">\n <SubscriptionActionButtons\n onTransactionClick={showTransactionButton ? handleTransactionClick : undefined}\n onCancelClick={showCancelButton ? handleCancelClick : undefined}\n showTransactionButton={showTransactionButton}\n showCancelButton={showCancelButton}\n subscription={localSubscription}\n customActions={[\n ...(showChangeCardButton ? [{\n key: 'changeCard',\n component: (\n <ChangeCardButton\n externalId={externalId}\n onSuccess={() => {\n // Optional: Show success message or refresh data\n }}\n onError={(error) => {\n // Optional: Show error message\n alert(`Failed to open payment portal: ${error}`);\n }}\n >\n Manage Billing\n </ChangeCardButton>\n ),\n show: true,\n }] : []),\n ...customActions.map((action, index) => ({\n key: `custom-${index}`,\n component: action,\n show: true,\n })),\n ]}\n />\n </div>\n </div>\n\n {/* Scheduled Plan Notification */}\n <ScheduledPlanNotification subscription={localSubscription} />\n \n {/* Grace Period Notification */}\n <GracePeriodNotification subscription={localSubscription} />\n \n {/* Info + Usage in one row with equal spacing */}\n <div className=\"grid grid-cols-1 md:grid-cols-5 gap-4\">\n {/* Subscription Info Grid */}\n <SubscriptionInfoGrid\n subscription={localSubscription}\n loading={loading}\n className=\"!contents\"\n gridCols={usageMetrics.length > 0 ? 3 : 5}\n />\n\n {/* Usage Display */}\n {usageMetrics.length > 0 && (\n <SubscriptionUsageDisplay\n subscription={localSubscription}\n loading={loading}\n usageMetrics={usageMetrics}\n gridCols={Math.min(usageMetrics.length, 3) as 1 | 2 | 3}\n className=\"!contents\"\n />\n )}\n </div>\n </div>\n\n {/* Transaction Modal */}\n <TransactionModal\n isOpen={isTransactionModalOpen}\n onClose={() => setIsTransactionModalOpen(false)}\n externalId={externalId}\n />\n\n {/* Cancellation Confirmation Modal */}\n <SubscriptionCancelModal\n isOpen={showCancelConfirmation}\n onClose={handleCancelModalClose}\n onConfirm={handleConfirmCancel}\n loading={cancelLoading}\n />\n </>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport type { Plan } from '../../types';\nimport { subscriptionApi } from '../../api/client';\nimport { getCurrencySymbol, formatCurrencyAmount } from '../../utils/currency';\nimport { useCurrency } from '../../contexts';\n\ninterface CheckoutInfo {\n planName: string;\n planPrice: number;\n planInterval: string;\n proration: number;\n planCode: string;\n planCurrency: string;\n contactSupport?: boolean;\n}\n\nexport interface UpgradeSummaryProps {\n selectedPlan: Plan | null;\n currentPlan?: Plan | null;\n externalId: string;\n onUpgrade: () => void;\n isVisible?: boolean;\n billableMetricCode?: string;\n}\n\nexport const UpgradeSummary: React.FC<UpgradeSummaryProps> = ({\n selectedPlan,\n currentPlan,\n externalId,\n onUpgrade,\n isVisible = true,\n billableMetricCode,\n}) => {\n const { currency } = useCurrency();\n const [checkoutInfo, setCheckoutInfo] = useState<CheckoutInfo | null>(null);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n // Determine which plan to display - selected plan takes priority, then current plan\n const planToDisplay = selectedPlan || currentPlan;\n \n if (!planToDisplay || !isVisible || Number(planToDisplay.fixedCost) === 0) {\n setCheckoutInfo(null);\n return;\n }\n\n // If showing current plan (no selected plan), create mock checkout info\n if (!selectedPlan && currentPlan) {\n const mockCheckoutInfo: CheckoutInfo = {\n planName: currentPlan.name,\n planPrice: currentPlan.fixedCost,\n planInterval: currentPlan.interval,\n proration: 0, // No proration for current plan\n planCode: currentPlan.code,\n planCurrency: currentPlan.currency,\n contactSupport: false,\n };\n setCheckoutInfo(mockCheckoutInfo);\n return;\n }\n\n // Fetch checkout info for selected plan (upgrade scenario)\n const fetchCheckoutInfo = async () => {\n setLoading(true);\n try {\n const response = await subscriptionApi.checkoutInfo(selectedPlan!.code, externalId, {\n billableMetricCode,\n currency\n });\n const dataWrapper = (response as { data?: { success?: boolean; data?: CheckoutInfo } })?.data;\n if (dataWrapper?.success && dataWrapper?.data) {\n setCheckoutInfo(dataWrapper.data as CheckoutInfo);\n }\n } catch (error) {\n console.error('Failed to fetch checkout info:', error);\n } finally {\n setLoading(false);\n }\n };\n\n fetchCheckoutInfo();\n }, [selectedPlan, currentPlan, externalId, isVisible, billableMetricCode, currency]);\n\n // Determine which plan to display - selected plan takes priority, then current plan\n const planToDisplay = selectedPlan || currentPlan;\n const isShowingCurrentPlan = !selectedPlan && currentPlan;\n \n if (!planToDisplay || !isVisible || Number(planToDisplay.fixedCost) === 0 || loading || !checkoutInfo) {\n return null;\n }\n const displayInfo = checkoutInfo;\n\n const intervalDisplay = displayInfo.planInterval === 'MONTHLY' ? 'Mo' : 'Yr';\n const dueToday = displayInfo.proration > 0 ? displayInfo.proration : displayInfo.planPrice;\n const shouldContactSupport = !!displayInfo.contactSupport;\n const currencyCode = displayInfo.planCurrency || currentPlan?.currency || currency;\n const currencySymbol = getCurrencySymbol(currencyCode);\n\n return (\n <div className='w-full'>\n <div className='w-full'>\n <div \n className='shadow-xl rounded-md border px-4 py-3 backdrop-blur-md'\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n borderColor: 'var(--subos-border, #e2e8f0)',\n boxShadow: 'var(--subos-shadow-card-hover, 0 8px 24px rgba(0,0,0,0.15))'\n }}\n >\n <div className='flex items-center justify-between'>\n <div>\n <p \n className='text-sm'\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n Summary\n </p>\n <h2 \n className='text-sm font-medium'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n {displayInfo.planName}\n </h2>\n </div>\n <div className='flex items-center gap-6'>\n <div className='text-right'>\n <h3 \n className='text-2xl font-semibold'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n {currencySymbol}{formatCurrencyAmount(displayInfo?.planPrice || 0, currencyCode)}/{intervalDisplay}\n </h3>\n <p \n className='text-sm font-semibold mt-0.5'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n (Inclusive Tax)\n </p>\n </div>\n <div className='flex items-center gap-4'>\n <div className='text-right'>\n <p \n className='text-sm'\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n {isShowingCurrentPlan ? 'Current Cost' : 'Due Today'}\n </p>\n <p \n className='text-xl font-semibold'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n {currencySymbol}{formatCurrencyAmount(dueToday || 0, currencyCode)}\n </p>\n {displayInfo.proration > 0 && !isShowingCurrentPlan && (\n <p \n className='text-xs mt-1'\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n (Includes prorated discount for unused days of your current plan)\n </p>\n )}\n {shouldContactSupport && (\n <p className='text-sm mt-2' style={{ color: '#dc2626' }}>\n You are choosing to switch from a yearly to monthly plan. Please contact our support team for assistance.\n </p>\n )}\n </div>\n <button\n onClick={isShowingCurrentPlan || shouldContactSupport ? undefined : onUpgrade}\n disabled={loading || !!isShowingCurrentPlan || shouldContactSupport}\n className='text-white px-8 py-3 rounded-lg font-medium transition-all duration-200 text-sm disabled:opacity-50 shadow-md'\n style={{\n backgroundColor: loading || isShowingCurrentPlan || shouldContactSupport\n ? 'var(--subos-muted, #f1f5f9)' \n : 'var(--subos-primary-500, #ef4444)',\n color: loading || isShowingCurrentPlan || shouldContactSupport ? 'var(--subos-muted-foreground, #64748b)' : 'white',\n border: isShowingCurrentPlan || shouldContactSupport\n ? '1px solid var(--subos-border, #e2e8f0)'\n : 'none',\n boxShadow: loading || isShowingCurrentPlan || shouldContactSupport ? 'none' : '0 4px 12px rgba(239, 68, 68, 0.3)',\n cursor: isShowingCurrentPlan || shouldContactSupport ? 'not-allowed' : 'pointer'\n }}\n onMouseEnter={!loading && !isShowingCurrentPlan && !shouldContactSupport ? (e) => {\n e.currentTarget.style.backgroundColor = '#dc2626';\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = '0 6px 16px rgba(239, 68, 68, 0.4)';\n } : undefined}\n onMouseLeave={!loading && !isShowingCurrentPlan && !shouldContactSupport ? (e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #ef4444)';\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(239, 68, 68, 0.3)';\n } : undefined}\n title={isShowingCurrentPlan ? 'This is your current active plan' : shouldContactSupport ? 'Please contact support for this change' : undefined}\n >\n {loading ? 'Loading...' : isShowingCurrentPlan ? 'Current Plan' : (checkoutInfo?.proration === 0 && currentPlan?.fixedCost !== 0 ? 'Confirm Changes' : 'Upgrade Now')}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n","import React, { createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\n\nexport interface SubOSTheme {\n // Primary colors\n primaryColors?: {\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n };\n \n // Secondary colors\n secondaryColors?: {\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n };\n \n // Neutral colors\n background?: string;\n foreground?: string;\n muted?: string;\n mutedForeground?: string;\n border?: string;\n accent?: string;\n accentForeground?: string;\n \n // Typography\n fontFamily?: string;\n \n // Font sizes for specific elements\n fontSizes?: {\n subscriptionLabel?: string;\n subscriptionValue?: string;\n buttonText?: string;\n planTitle?: string;\n planDescription?: string;\n planCardTitle?: string;\n planCardDescription?: string;\n planCardInfo?: string;\n planCardFeature?: string;\n };\n \n // Font weights for specific elements\n fontWeights?: {\n subscriptionLabel?: number | string;\n subscriptionValue?: number | string;\n buttonText?: number | string;\n planTitle?: number | string;\n planDescription?: number | string;\n planCardTitle?: number | string;\n planCardDescription?: number | string;\n planCardInfo?: number | string;\n planCardFeature?: number | string;\n };\n \n // Font colors for specific elements\n fontColors?: {\n subscriptionLabel?: string;\n subscriptionValue?: string;\n buttonText?: string;\n planTitle?: string;\n planDescription?: string;\n planCardTitle?: string;\n planCardDescription?: string;\n planCardInfo?: string;\n planCardFeature?: string;\n };\n \n // Layout\n borderRadius?: string;\n \n // Shadows\n shadowCard?: string;\n shadowCardHover?: string;\n}\n\ninterface SubOSThemeContextType {\n theme: SubOSTheme;\n setTheme: (theme: SubOSTheme) => void;\n}\n\nconst SubOSThemeContext = createContext<SubOSThemeContextType | undefined>(undefined);\n\nexport const useSubOSTheme = () => {\n const context = useContext(SubOSThemeContext);\n if (!context) {\n throw new Error('useSubOSTheme must be used within a SubOSThemeProvider');\n }\n return context;\n};\n\ninterface SubOSThemeProviderProps {\n children: ReactNode;\n theme?: SubOSTheme;\n className?: string;\n}\n\nexport const SubOSThemeProvider: React.FC<SubOSThemeProviderProps> = ({ \n children, \n theme = {},\n className = ''\n}) => {\n const [currentTheme, setCurrentTheme] = React.useState<SubOSTheme>(theme);\n \n // Generate CSS custom properties from theme\n const cssVariables = React.useMemo(() => {\n const vars: Record<string, string> = {};\n \n // Primary colors\n if (currentTheme.primaryColors) {\n Object.entries(currentTheme.primaryColors).forEach(([key, value]) => {\n if (value) vars[`--subos-primary-${key}`] = value;\n });\n }\n \n // Secondary colors\n if (currentTheme.secondaryColors) {\n Object.entries(currentTheme.secondaryColors).forEach(([key, value]) => {\n if (value) vars[`--subos-secondary-${key}`] = value;\n });\n }\n \n // Neutral colors\n if (currentTheme.background) vars['--subos-background'] = currentTheme.background;\n if (currentTheme.foreground) vars['--subos-foreground'] = currentTheme.foreground;\n if (currentTheme.muted) vars['--subos-muted'] = currentTheme.muted;\n if (currentTheme.mutedForeground) vars['--subos-muted-foreground'] = currentTheme.mutedForeground;\n if (currentTheme.border) vars['--subos-border'] = currentTheme.border;\n if (currentTheme.accent) vars['--subos-accent'] = currentTheme.accent;\n if (currentTheme.accentForeground) vars['--subos-accent-foreground'] = currentTheme.accentForeground;\n \n // Typography\n if (currentTheme.fontFamily) vars['--subos-font-family'] = currentTheme.fontFamily;\n \n // Font sizes\n if (currentTheme.fontSizes) {\n Object.entries(currentTheme.fontSizes).forEach(([key, value]) => {\n if (value) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars[`--subos-font-size-${cssKey}`] = value;\n }\n });\n }\n \n // Font weights\n if (currentTheme.fontWeights) {\n Object.entries(currentTheme.fontWeights).forEach(([key, value]) => {\n if (value !== undefined) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars[`--subos-font-weight-${cssKey}`] = String(value);\n }\n });\n }\n \n // Font colors\n if (currentTheme.fontColors) {\n Object.entries(currentTheme.fontColors).forEach(([key, value]) => {\n if (value) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars[`--subos-color-${cssKey}`] = value;\n }\n });\n }\n \n // Layout\n if (currentTheme.borderRadius) vars['--subos-border-radius'] = currentTheme.borderRadius;\n \n // Shadows\n if (currentTheme.shadowCard) vars['--subos-shadow-card'] = currentTheme.shadowCard;\n if (currentTheme.shadowCardHover) vars['--subos-shadow-card-hover'] = currentTheme.shadowCardHover;\n \n return vars;\n }, [currentTheme]);\n \n const contextValue = React.useMemo(() => ({\n theme: currentTheme,\n setTheme: setCurrentTheme,\n }), [currentTheme]);\n \n return (\n <SubOSThemeContext.Provider value={contextValue}>\n <div \n className={`subos-container ${className}`}\n style={cssVariables}\n >\n {children}\n </div>\n </SubOSThemeContext.Provider>\n );\n};\n\n// Hook to easily apply theme from host application\nexport const useApplyHostTheme = (hostTheme?: Partial<SubOSTheme>) => {\n const { setTheme } = useSubOSTheme();\n \n React.useEffect(() => {\n if (hostTheme) {\n setTheme(hostTheme);\n }\n }, [hostTheme, setTheme]);\n};\n","import React from 'react';\nimport type { PaginationMeta } from '../../types';\n\nexport interface PaginationProps {\n meta: PaginationMeta;\n onPageChange: (page: number) => void;\n onLimitChange?: (limit: number) => void;\n showLimitSelector?: boolean;\n limitOptions?: number[];\n className?: string;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n meta,\n onPageChange,\n onLimitChange,\n showLimitSelector = true,\n limitOptions = [10, 25, 50, 100],\n className = '',\n}) => {\n const { currentPage, totalPages, totalItems, itemsPerPage, hasNextPage, hasPreviousPage } = meta;\n\n // Generate page numbers to display\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisiblePages = 7;\n \n if (totalPages <= maxVisiblePages) {\n // Show all pages if total pages is small\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Show first page\n pages.push(1);\n \n if (currentPage > 4) {\n pages.push('...');\n }\n \n // Show pages around current page\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n \n for (let i = start; i <= end; i++) {\n if (i !== 1 && i !== totalPages) {\n pages.push(i);\n }\n }\n \n if (currentPage < totalPages - 3) {\n pages.push('...');\n }\n \n // Show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n \n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n return (\n <div className={`flex flex-col sm:flex-row items-center justify-between gap-4 ${className}`}>\n {/* Items info */}\n <div className=\"text-sm text-gray-700\">\n Showing {startItem} to {endItem} of {totalItems} results\n </div>\n\n <div className=\"flex items-center gap-4\">\n {/* Limit selector */}\n {showLimitSelector && onLimitChange && (\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"limit-select\" className=\"text-sm text-gray-700\">\n Show:\n </label>\n <select\n id=\"limit-select\"\n value={itemsPerPage}\n onChange={(e) => onLimitChange(Number(e.target.value))}\n className=\"border border-gray-300 rounded px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent\"\n >\n {limitOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Pagination controls */}\n <div className=\"flex items-center gap-1\">\n {/* Previous button */}\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={!hasPreviousPage}\n className=\"px-3 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-l-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n\n {/* Page numbers */}\n {pageNumbers.map((page, index) => (\n <React.Fragment key={index}>\n {page === '...' ? (\n <span className=\"px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300\">\n ...\n </span>\n ) : (\n <button\n onClick={() => onPageChange(page as number)}\n className={`px-3 py-2 text-sm font-medium border ${\n currentPage === page\n ? 'bg-primary text-white border-primary'\n : 'text-gray-700 bg-white border-gray-300 hover:bg-gray-50'\n }`}\n >\n {page}\n </button>\n )}\n </React.Fragment>\n ))}\n\n {/* Next button */}\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={!hasNextPage}\n className=\"px-3 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-r-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { Layout } from '../components/common/Layout';\nimport { useSubscription } from '../hooks/useSubscription';\nimport { usePlans } from '../hooks/usePlans';\nimport { SubscriptionDetails } from '../components/subscription/SubscriptionDetails';\nimport { PlanSelector } from '../components/plans/PlanSelector';\nimport { UpgradeSummary } from '../components/upgrade/UpgradeSummary';\nimport { UpgradeProvider, useCurrency } from '../contexts';\nimport { registerClearSelectedPlan, unregisterClearSelectedPlan } from '../utils/upgradeUtils';\n\nexport interface DashboardPageProps {\n externalId: string;\n}\n\nexport const DashboardPage: React.FC<DashboardPageProps> = ({ \n externalId, \n}) => {\n // Custom hooks\n const subscription = useSubscription();\n const plans = usePlans();\n const { currency, isLoading: isCurrencyLoading } = useCurrency();\n \n // Track the last loaded externalId to prevent unnecessary re-fetches\n const lastLoadedIdRef = useRef<string | null>(null);\n\n // Load dashboard data on mount or when externalId/currency changes\n useEffect(() => {\n // Wait for currency detection to complete before fetching\n if (isCurrencyLoading) return;\n \n const cacheKey = `${externalId}-${currency}`;\n if (lastLoadedIdRef.current !== cacheKey) {\n subscription.fetchSubscription(externalId);\n plans.fetchPlans();\n lastLoadedIdRef.current = cacheKey;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalId, currency, isCurrencyLoading]); // Re-fetch when currency changes\n\n // Register the clear function for global access\n useEffect(() => {\n registerClearSelectedPlan(plans.clearSelectedPlan);\n return () => {\n unregisterClearSelectedPlan();\n };\n }, [plans.clearSelectedPlan]);\n\n // Handle upgrade\n const handleUpgrade = () => {\n plans.handleUpgrade(externalId);\n };\n\n return (\n <UpgradeProvider>\n <Layout>\n <div className=\"max-w-7xl mx-auto w-full h-full py-8 px-4 pb-24\">\n <SubscriptionDetails\n subscription={subscription.subscription}\n loading={subscription.loading}\n externalId={externalId}\n onSubscriptionCancelled={() => {\n // Refresh subscription data after cancellation\n subscription.fetchSubscription(externalId);\n // Clear selected plan when subscription is cancelled\n plans.clearSelectedPlan();\n }}\n />\n\n <PlanSelector\n plans={plans.filteredPlans}\n selectedPlan={plans.selectedPlan}\n tierFilter={plans.tierFilter}\n billingCycle={plans.billingCycle}\n loading={plans.loading}\n error={plans.error}\n dropdownOptions={plans.dropdownOptions}\n currentSelectionText={plans.currentSelectionText}\n onPlanSelect={plans.handlePlanSelect}\n onTierFilterChange={plans.setTierFilter}\n onBillingCycleChange={plans.setBillingCycle}\n activePlanCode={subscription.subscription?.plan.code}\n nextMembershipPlanId={subscription.subscription?.nextMembership?.planId}\n />\n\n <UpgradeSummary\n selectedPlan={plans.selectedPlan}\n currentPlan={subscription.subscription?.plan ? {\n id: subscription.subscription.plan.code,\n name: subscription.subscription.plan.name,\n code: subscription.subscription.plan.code,\n fixedCost: subscription.subscription.plan.fixedCost,\n paymentMode: subscription.subscription.plan.paymentMode,\n interval: subscription.subscription.plan.interval,\n successRedirectUrl: '',\n order: 0,\n isDefault: false,\n intervalCount: 1,\n projectId: '',\n charges: subscription.subscription.plan.charges || [],\n currency: subscription.subscription?.currency\n } : null}\n externalId={externalId}\n onUpgrade={handleUpgrade}\n isVisible={!!plans.selectedPlan || !!subscription.subscription?.plan}\n />\n </div>\n </Layout>\n </UpgradeProvider>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { getApiBaseUrl, getHeaders } from '../../api/config';\nimport type { PaymentParams } from './usePaymentParams';\n\ninterface CancelHookResult {\n loading: boolean;\n error: string | null;\n}\n\nexport const useProcessPaymentCancel = (params: PaymentParams): CancelHookResult => {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const run = async () => {\n try {\n const qs = new URLSearchParams({\n ...(params.gateway ? { gateway: params.gateway } : {}),\n ...(params.sessionId ? { session_id: params.sessionId } : {}),\n ...(params.paymentId ? { payment_id: params.paymentId } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n }).toString();\n\n const url = `${getApiBaseUrl()}/api/payments/cancel?${qs}`;\n await fetch(url, {\n headers: getHeaders(),\n credentials: 'include',\n });\n } catch (err: any) {\n setError(err?.message || 'Failed to process cancellation');\n } finally {\n setLoading(false);\n }\n };\n\n run();\n // run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { loading, error };\n};\n","import React from 'react';\nimport { Layout } from '../components/common/Layout';\nimport { usePaymentParams } from '../hooks/payments/usePaymentParams';\nimport { useProcessPaymentCancel } from '../hooks/payments/useProcessPaymentCancel';\nimport PaymentCancelView from '../components/payments/PaymentCancelView';\n\nconst PaymentCancelPage: React.FC = () => {\n const details = usePaymentParams();\n const { loading } = useProcessPaymentCancel(details);\n\n if (loading) {\n return (\n <Layout>\n <div className=\"container mx-auto p-4\">\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md p-6\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-orange-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Processing cancellation...</p>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout>\n <div className=\"container mx-auto p-4\">\n <PaymentCancelView details={details} />\n </div>\n </Layout>\n );\n};\n\nexport default PaymentCancelPage;\n","import { DashboardPage } from './pages/DashboardPage';\nimport PaymentSuccessPage from './pages/PaymentSuccessPage';\nimport PaymentCancelPage from './pages/PaymentCancelPage';\nimport { CurrencyProvider } from './context/CurrencyContext';\nimport { NavigationProvider, useNavigation } from './context/NavigationContext';\nimport { SubscriptionProvider } from './context/SubscriptionContext';\n\nexport interface AppProps {\n externalId: string;\n initialPage?: 'dashboard' | 'payment-success' | 'payment-cancel';\n}\n\n// Helper function to detect initial page from URL\nconst getInitialPageFromURL = (): 'dashboard' | 'payment-success' | 'payment-cancel' => {\n if (typeof window === 'undefined') return 'dashboard';\n \n const urlParams = new URLSearchParams(window.location.search);\n const pathname = window.location.pathname;\n \n // Check URL path\n if (pathname.includes('payment-success')) return 'payment-success';\n if (pathname.includes('payment-cancel')) return 'payment-cancel';\n \n // Check URL parameters\n if (urlParams.has('payment-success') || urlParams.get('status') === 'success') {\n return 'payment-success';\n }\n if (urlParams.has('payment-cancel') || urlParams.get('status') === 'cancel') {\n return 'payment-cancel';\n }\n \n return 'dashboard';\n};\n\nconst AppContent = ({ externalId }: AppProps) => {\n const { currentPage } = useNavigation();\n\n return (\n <>\n <style>\n {`\n :root {\n --primary-light: #3f51b5;\n --primary-dark: #3f51b5;\n }\n `}\n </style>\n {currentPage === 'dashboard' && <DashboardPage externalId={externalId} />}\n {currentPage === 'payment-success' && <PaymentSuccessPage />}\n {currentPage === 'payment-cancel' && <PaymentCancelPage />}\n </>\n );\n};\n\nexport const App = function App({ externalId, initialPage }: AppProps) {\n // Use provided initialPage or detect from URL\n const detectedPage = initialPage || getInitialPageFromURL();\n \n return (\n <CurrencyProvider>\n <SubscriptionProvider>\n <NavigationProvider initialPage={detectedPage}>\n <AppContent externalId={externalId} />\n </NavigationProvider>\n </SubscriptionProvider>\n </CurrencyProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/envConfig.ts","../src/api/config.ts","../src/api/client.ts","../src/context/CurrencyContextDefinition.tsx","../src/utils/currency.ts","../src/hooks/useCountryAndCurrency.ts","../src/context/useCurrency.tsx","../src/context/CurrencyContext.tsx","../src/context/SubscriptionContext.tsx","../src/hooks/useSubscription.ts","../src/utils/planUtils.ts","../src/contexts/UpgradeContext.tsx","../src/hooks/usePlans.ts","../src/hooks/useTransactions.ts","../src/hooks/usePagination.ts","../src/hooks/useCancelSubscription.ts","../src/hooks/useCustomerPortal.ts","../src/context/NavigationContext.tsx","../src/components/plans/BillingCycleToggle.tsx","../src/components/plans/TierFilterDropdown.tsx","../src/components/icons/CheckIcon.tsx","../src/components/plans/PlanCard.tsx","../src/components/icons/CommonIcons.tsx","../src/components/plans/PlansGrid.tsx","../src/components/plans/PlanSelector.tsx","../src/components/payments/ChangeCardButton.tsx","../src/components/payments/PaymentCancelView.tsx","../src/components/payments/PaymentSuccessView.tsx","../src/components/LogoInline.tsx","../src/components/common/Layout.tsx","../src/hooks/payments/usePaymentParams.ts","../src/pages/PaymentSuccessPage.tsx","../src/utils/upgradeUtils.ts","../src/components/transaction/TransactionItem.tsx","../src/components/transaction/TransactionLoadingState.tsx","../src/components/transaction/TransactionErrorState.tsx","../src/components/transaction/TransactionEmptyState.tsx","../src/components/transaction/TransactionList.tsx","../src/components/transaction/TransactionStatusFilter.tsx","../src/components/transaction/TransactionFilter.tsx","../src/components/transaction/TransactionPagination.tsx","../src/components/transaction/TransactionModal.tsx","../src/components/subscription/SubscriptionInfoGrid.tsx","../src/components/subscription/SubscriptionUsageDisplay.tsx","../src/components/subscription/SubscriptionTransactionButton.tsx","../src/components/subscription/SubscriptionCancelButton.tsx","../src/components/subscription/SubscriptionActionButtons.tsx","../src/components/subscription/SubscriptionCancelModal.tsx","../src/components/subscription/ScheduledPlanNotification.tsx","../src/components/subscription/GracePeriodNotification.tsx","../src/components/subscription/SubscriptionDetails.tsx","../src/components/upgrade/UpgradeSummary.tsx","../src/components/common/SubOSThemeProvider.tsx","../src/components/pagination/Pagination.tsx","../src/pages/DashboardPage.tsx","../src/hooks/payments/useProcessPaymentCancel.ts","../src/pages/PaymentCancelPage.tsx","../src/App.tsx"],"names":["createContext","useState","useEffect","useContext","jsx","useRef","useCallback","error","clearSelectedPlan","jsxs","Fragment","useMemo","DownloadIcon","React","planToDisplay","App"],"mappings":"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J,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAGJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA;AAAA,IAG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","file":"index.js","sourcesContent":["// Environment configuration with runtime overrides\n// Centralized config that can be set by the consumer project at runtime\n\ntype EnvDefaults = {\n API_ENDPOINT: string;\n NEXT_PUBLIC_API_END_POINT: string;\n PROJECT_ID: string;\n APP_NAME: string;\n APP_VERSION: string;\n APP_ENVIRONMENT: string;\n DEBUG: boolean;\n MODE: string;\n DEV: boolean;\n PROD: boolean;\n};\n\n// Safe environment access that works in both Vite and other bundlers\n// Overloads ensure callers get a correctly typed value when a fallback is provided\nfunction getEnvVar(key: string, fallback: string): string;\nfunction getEnvVar(key: string, fallback: boolean): boolean;\nfunction getEnvVar(key: string): string | boolean | undefined;\nfunction getEnvVar(\n key: string,\n fallback?: string | boolean\n): string | boolean | undefined {\n try {\n // Check Vite environment first\n if (\n typeof import.meta !== 'undefined' &&\n (import.meta as unknown as { env?: Record<string, string | boolean | undefined> }).env\n ) {\n const v = (import.meta as unknown as { env?: Record<string, string | boolean | undefined> }).env![key] as\n | string\n | boolean\n | undefined;\n if (typeof fallback === 'boolean') {\n if (typeof v === 'boolean') return v;\n if (typeof v === 'string') return ['true', '1', 'yes'].includes(v.toLowerCase());\n return fallback;\n }\n if (typeof fallback === 'string') {\n if (typeof v === 'string') return v;\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n return fallback;\n }\n return v;\n }\n\n // Fallback for Node.js / other environments\n const nodeEnv = (typeof globalThis !== 'undefined' && (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env) as\n | Record<string, string | undefined>\n | undefined;\n if (nodeEnv) {\n const v = nodeEnv[key];\n if (typeof fallback === 'boolean') {\n if (typeof v === 'string') return ['true', '1', 'yes'].includes(v.toLowerCase());\n return fallback;\n }\n if (typeof fallback === 'string') {\n return v ?? fallback;\n }\n return v;\n }\n\n return fallback;\n } catch {\n return fallback;\n }\n}\n\n\nconst envDefaults: EnvDefaults = {\n // API Configuration - These MUST be configured by the consuming app\n API_ENDPOINT: getEnvVar('VITE_API_ENDPOINT', ''),\n NEXT_PUBLIC_API_END_POINT: getEnvVar('VITE_NEXT_PUBLIC_API_END_POINT', ''),\n // Project configuration for backend header - This MUST be configured by the consuming app\n PROJECT_ID: getEnvVar('VITE_PROJECT_ID', ''),\n // App Configuration\n APP_NAME: getEnvVar('VITE_APP_NAME', 'SubOS Frontend'),\n APP_VERSION: getEnvVar('VITE_APP_VERSION', '1.0.0'),\n APP_ENVIRONMENT: getEnvVar('VITE_APP_ENVIRONMENT', 'development'),\n // Development Configuration\n DEBUG: getEnvVar('VITE_DEBUG', false),\n // Mode\n MODE: getEnvVar('MODE', 'development'),\n DEV: getEnvVar('DEV', false),\n PROD: getEnvVar('PROD', false),\n};\n\nconst runtimeOverrides: Partial<EnvDefaults> = {};\n\nexport type EnvConfig = EnvDefaults;\n\nexport type ConfigureSubOSInput = Partial<{\n apiEndpoint: string;\n stripePublishableKey: string;\n appName: string;\n appVersion: string;\n appEnvironment: string;\n debug: boolean;\n}>;\n\n// Call from consumer app to override defaults at runtime\nexport function configureSubOS(input: ConfigureSubOSInput = {}): void {\n if (input.apiEndpoint !== undefined) runtimeOverrides.API_ENDPOINT = input.apiEndpoint;\n if (input.appName !== undefined) runtimeOverrides.APP_NAME = input.appName;\n if (input.appVersion !== undefined) runtimeOverrides.APP_VERSION = input.appVersion;\n if (input.appEnvironment !== undefined) runtimeOverrides.APP_ENVIRONMENT = input.appEnvironment;\n if (input.debug !== undefined) runtimeOverrides.DEBUG = input.debug;\n}\n\n// Validation function to ensure required config is set\nexport function validateSubOSConfig(): { isValid: boolean; missingFields: string[] } {\n const missingFields: string[] = [];\n \n if (!getApiBaseUrl()) missingFields.push('apiEndpoint');\n // if (!getProjectId()) missingFields.push('projectId');\n \n return {\n isValid: missingFields.length === 0,\n missingFields\n };\n}\n\n// Helper to throw error if config is invalid\nexport function ensureSubOSConfig(): void {\n const validation = validateSubOSConfig();\n if (!validation.isValid) {\n throw new Error(\n `SubOS configuration is incomplete. Missing required fields: ${validation.missingFields.join(', ')}. ` +\n 'Please call configureSubOS() with the required configuration before using SubOS components.'\n );\n }\n}\n\n// Resolved config getters (runtime override wins over env defaults)\nexport const getApiBaseUrl = (): string => runtimeOverrides.API_ENDPOINT ?? envDefaults.API_ENDPOINT;\nexport const getProjectId = (): string => runtimeOverrides.PROJECT_ID ?? envDefaults.PROJECT_ID;\n\nexport const isDevelopment = (): boolean => {\n const env = runtimeOverrides.APP_ENVIRONMENT ?? envDefaults.APP_ENVIRONMENT;\n const devFlag = runtimeOverrides.DEV ?? envDefaults.DEV;\n return env === 'development' || !!devFlag;\n};\n\nexport const isProduction = (): boolean => {\n const env = runtimeOverrides.APP_ENVIRONMENT ?? envDefaults.APP_ENVIRONMENT;\n const prodFlag = runtimeOverrides.PROD ?? envDefaults.PROD;\n return env === 'production' || !!prodFlag;\n};\n\nexport const getDefaultProjectId = (): string => envDefaults.PROJECT_ID;\n","import { getApiBaseUrl, getProjectId, getDefaultProjectId } from '../config/envConfig.js';\n// API configuration (use getter so runtime overrides apply)\nexport { getApiBaseUrl };\nexport { getDefaultProjectId };\n\n// Common headers for API requests\nexport const getHeaders = () => {\n return {\n 'Content-Type': 'application/json',\n 'auth': 'auth', // Adding auth header with value 'auth' for all API requests\n 'projectId': getProjectId(),\n };\n};\n\n// API endpoints\nexport const ENDPOINTS = {\n PLANS: '/plans',\n PAYMENTS: '/api/payments',\n CHECKOUT: '/checkout',\n SUBSCRIPTION: '/subscription',\n CUSTOMER: '/customer',\n TRANSACTIONS: '/transaction'\n};\n","import { getApiBaseUrl, getHeaders, ENDPOINTS, getDefaultProjectId } from './config';\nimport type { ApiResponse, Plan } from '../types';\n\n// Generic API request handler\nasync function apiRequest<T>(\n endpoint: string, \n method: string = 'GET', \n data?: unknown,\n headers?: Record<string, string>,\n excludeProjectId?: boolean\n): Promise<ApiResponse<T>> {\n try {\n const url = `${getApiBaseUrl()}${endpoint}`;\n const baseHeaders = getHeaders();\n \n // Remove projectId from headers if excludeProjectId is true\n const finalHeaders: Record<string, string> = { ...baseHeaders, ...(headers ?? {}) };\n if (excludeProjectId && 'projectId' in finalHeaders) {\n delete finalHeaders.projectId;\n }\n \n const options: RequestInit = {\n method,\n headers: finalHeaders,\n credentials: 'include',\n };\n\n if (data) {\n options.body = JSON.stringify(data);\n }\n\n const response = await fetch(url, options);\n const result = await response.json();\n\n if (!response.ok) {\n return { success: false, error: result.message || 'An error occurred' };\n }\n\n return { success: true, data: result };\n } catch (error) {\n console.error('API request failed:', error);\n return { \n success: false, \n error: error instanceof Error ? error.message : 'Unknown error occurred'\n };\n }\n}\n\n// Plan API functions\nexport const plansApi = {\n getPlans: async (): Promise<ApiResponse<Plan[]>> => {\n return apiRequest<Plan[]>(`${ENDPOINTS.PLANS}`, 'GET', undefined, { projectId: getDefaultProjectId() });\n },\n getPlanByCode: (code: string, externalId: string, queryParams?: { paymentMethodId?: string | null; couponCode?: string | null }) => {\n const params = new URLSearchParams({ planCode: code, externalId });\n if (queryParams?.paymentMethodId) params.append('paymentMethodId', queryParams.paymentMethodId);\n if (queryParams?.couponCode) params.append('couponCode', queryParams.couponCode);\n return apiRequest<Plan>(`${ENDPOINTS.PLANS}?${params.toString()}`);\n },\n \n // Create unified checkout session and get hosted checkout URL\n createPaymentSession: async (\n planCode: string,\n options?: { amount?: number; currency?: string; externalId?: string; couponCode?: string; returnUrl?: string; cancelUrl?: string; }\n ): Promise<ApiResponse<{ checkoutUrl: string; gateway: string; sessionId?: string; paymentId?: string }>> => {\n const externalId = options?.externalId;\n // Currency from options takes priority, fallback to USD if not provided\n const currency = options?.currency || 'USD';\n const amount = options?.amount; // if not provided, backend will compute from plan\n\n const payload: any = {\n planCode,\n currency,\n returnUrl: options?.returnUrl ?? `${window.location.origin}/payment-success`,\n cancelUrl: options?.cancelUrl ?? `${window.location.origin}/payment-cancel`,\n // billableMetricCode: options?.billableMetricCode,\n };\n\n if (externalId) payload.externalId = externalId;\n if (options?.couponCode) payload.couponCode = options.couponCode;\n if (typeof amount === 'number' && amount > 0) payload.amount = amount;\n\n const resp = await apiRequest<any>(\n `${ENDPOINTS.CHECKOUT}`,\n 'POST',\n payload,\n { projectId: getDefaultProjectId() }\n );\n\n // Backend returns { success: boolean, data: { checkoutUrl, ... } }\n // Our apiRequest wraps this again as { success: true, data: <backendResponse> }\n if (resp.success && resp.data && typeof resp.data === 'object' && 'data' in resp.data) {\n return { success: true, data: (resp.data as any).data };\n }\n return resp as ApiResponse<{ checkoutUrl: string; gateway: string; sessionId?: string; paymentId?: string }>;\n },\n};\n\n// Subscription API functions (via SDK)\nexport const subscriptionApi = {\n getActiveSubscription: async (externalId: string, options?: { currency?: string; billableMetric?: string | boolean }): Promise<ApiResponse<any>> => {\n let endpoint = `${ENDPOINTS.SUBSCRIPTION}/${externalId}`;\n\n const params = new URLSearchParams();\n if (options?.currency) {\n params.append('currency', options.currency);\n }\n if (options?.billableMetric) {\n params.append('billableMetric', typeof options.billableMetric === 'string' ? options.billableMetric : 'true');\n }\n\n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n \n return apiRequest<any>(endpoint, 'GET', undefined, undefined, true);\n },\n cancelSubscription: async (\n externalId: string,\n options?: {\n cancellationMode?: string;\n cancellationReason?: string;\n }\n ): Promise<ApiResponse<any>> => {\n let endpoint = `${ENDPOINTS.SUBSCRIPTION}/${externalId}`;\n \n if (options) {\n const params = new URLSearchParams();\n if (options.cancellationMode) params.append('cancellationMode', options.cancellationMode);\n if (options.cancellationReason) params.append('cancellationReason', options.cancellationReason);\n \n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n }\n \n return apiRequest<any>(endpoint, 'DELETE', undefined, { projectId: getDefaultProjectId() });\n },\n checkoutInfo: async (planCode: string, externalId: string, options?: { billableMetricCode?: string; currency?: string }): Promise<ApiResponse<any>> => {\n let endpoint = `${ENDPOINTS.CHECKOUT}/info/${planCode}/${externalId}`;\n const params = new URLSearchParams();\n\n if (options?.billableMetricCode) {\n params.append('billableMetricCode', options.billableMetricCode);\n }\n if (options?.currency) {\n params.append('currency', options.currency);\n }\n\n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n\n return apiRequest<any>(endpoint, 'GET', undefined, { projectId: getDefaultProjectId() });\n }\n};\n\n// Customer API functions (partially via SDK)\nexport const customerApi = {\n getCustomer: (externalId: string): Promise<ApiResponse<any>> =>\n apiRequest<any>(`${ENDPOINTS.CUSTOMER}/${externalId}`, 'GET', undefined, { projectId: getDefaultProjectId() }),\n createPortalSession: (\n externalId: string,\n returnUrl: string\n ): Promise<ApiResponse<{ url: string }>> =>\n apiRequest<{ url: string }>(\n `${ENDPOINTS.CUSTOMER}/${externalId}/portal`,\n 'POST',\n { returnUrl },\n { projectId: getDefaultProjectId() }\n ),\n};\n\n// Transaction API functions\nexport const transactionApi = {\n getTransactions: (externalId: string, filters?: { startDate?: string; endDate?: string; status?: string; page?: number; limit?: number }) => {\n // Using the endpoint from transaction.controller.ts: GET /:externalId/history\n let endpoint = `${ENDPOINTS.TRANSACTIONS}/${externalId}/history`;\n \n if (filters) {\n const params = new URLSearchParams();\n if (filters.startDate) params.append('startDate', filters.startDate);\n if (filters.endDate) params.append('endDate', filters.endDate);\n if (filters.status) params.append('status', filters.status);\n if (filters.page) params.append('page', filters.page.toString());\n if (filters.limit) params.append('limit', filters.limit.toString());\n \n if (params.toString()) {\n endpoint += `?${params.toString()}`;\n }\n }\n \n return apiRequest<any>(endpoint, 'GET', undefined, { projectId: getDefaultProjectId() });\n },\n \n getInvoice: (transactionId: string) =>\n apiRequest<{ invoiceUrl: string }>(`${ENDPOINTS.TRANSACTIONS}/${transactionId}/invoice`),\n};\n","import { createContext } from 'react';\n\nexport interface CurrencyContextType {\n country: string | null;\n currency: string;\n isLoading: boolean;\n error: string | null;\n setCurrency: (currency: string) => void;\n}\n\nexport const CurrencyContext = createContext<CurrencyContextType | undefined>(undefined);\n","export const CURRENCY_SYMBOLS: Record<string, string> = {\n USD: '$',\n INR: '₹',\n EUR: '€',\n GBP: '£',\n AUD: 'A$',\n CAD: 'C$',\n JPY: '¥',\n};\n\nexport function getCurrencySymbol(code?: string): string {\n if (!code) return '$';\n const upper = code.toUpperCase();\n return CURRENCY_SYMBOLS[upper] ?? '$';\n}\n\n// Country to currency mapping\nexport function mapCountryToCurrency(countryCode: string): string {\n const countryToCurrency: Record<string, string> = {\n // North America\n US: 'usd',\n CA: 'cad',\n MX: 'mxn',\n \n // Europe\n GB: 'gbp',\n DE: 'eur',\n FR: 'eur',\n IT: 'eur',\n ES: 'eur',\n NL: 'eur',\n BE: 'eur',\n AT: 'eur',\n PT: 'eur',\n IE: 'eur',\n FI: 'eur',\n GR: 'eur',\n LU: 'eur',\n CH: 'chf',\n SE: 'sek',\n NO: 'nok',\n DK: 'dkk',\n PL: 'pln',\n CZ: 'czk',\n HU: 'huf',\n RO: 'ron',\n \n // Asia\n IN: 'inr',\n CN: 'cny',\n JP: 'jpy',\n KR: 'krw',\n SG: 'sgd',\n HK: 'hkd',\n TW: 'twd',\n MY: 'myr',\n TH: 'thb',\n ID: 'idr',\n PH: 'php',\n VN: 'vnd',\n BD: 'bdt',\n PK: 'pkr',\n LK: 'lkr',\n \n // Oceania\n AU: 'aud',\n NZ: 'nzd',\n \n // Middle East\n AE: 'aed',\n SA: 'sar',\n IL: 'ils',\n TR: 'try',\n QA: 'qar',\n KW: 'kwd',\n OM: 'omr',\n BH: 'bhd',\n \n // Africa\n ZA: 'zar',\n EG: 'egp',\n NG: 'ngn',\n KE: 'kes',\n \n // South America\n BR: 'brl',\n AR: 'ars',\n CL: 'clp',\n CO: 'cop',\n PE: 'pen',\n };\n\n return countryToCurrency[countryCode] || 'USD';\n}\n\n/**\n * Format number according to currency locale\n * INR uses Indian numbering system (lakhs/crores): 1,00,000\n * Other currencies use international system: 100,000\n */\nexport function formatCurrencyAmount(amount: number, currencyCode?: string): string {\n const currency = currencyCode?.toUpperCase() || 'USD';\n \n // Indian numbering system for INR\n if (currency === 'INR') {\n const amountStr = Math.round(amount).toString();\n const lastThree = amountStr.substring(amountStr.length - 3);\n const otherNumbers = amountStr.substring(0, amountStr.length - 3);\n \n if (otherNumbers !== '') {\n return otherNumbers.replace(/\\B(?=(\\d{2})+(?!\\d))/g, ',') + ',' + lastThree;\n }\n return lastThree;\n }\n \n // International numbering system for other currencies\n return Math.round(amount).toLocaleString('en-US');\n}\n","import { useState, useEffect } from 'react';\nimport { mapCountryToCurrency } from '../utils/currency';\n\nexport interface UseCountryAndCurrencyProps {\n ipInfoToken?: string;\n defaultCurrency?: string;\n skipAutoDetect?: boolean;\n}\n\nexport interface UseCountryAndCurrencyReturn {\n country: string | null;\n currency: string;\n isLoading: boolean;\n error: string | null;\n setCurrency: (newCurrency: string) => void;\n}\n\nexport const useCountryAndCurrency = ({\n ipInfoToken,\n defaultCurrency = 'usd',\n skipAutoDetect = false\n}: UseCountryAndCurrencyProps = {}): UseCountryAndCurrencyReturn => {\n const [country, setCountry] = useState<string | null>(null);\n const [currency, setCurrencyState] = useState<string>(defaultCurrency);\n const [isLoading, setIsLoading] = useState<boolean>(!skipAutoDetect);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (skipAutoDetect) {\n setIsLoading(false);\n return;\n }\n\n const fetchCountryAndCurrency = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const url = ipInfoToken \n ? `https://ipinfo.io/json?token=${ipInfoToken}`\n : 'https://ipinfo.io/json';\n \n const response = await fetch(url);\n \n if (!response.ok) {\n throw new Error('Failed to fetch location data');\n }\n\n const data = await response.json();\n const detectedCountry = data.country;\n const normalizedCountry = detectedCountry === 'IN' ? 'IN' : 'US';\n \n setCountry(normalizedCountry);\n \n // Map country to currency\n const detectedCurrency = mapCountryToCurrency(normalizedCountry);\n setCurrencyState(detectedCurrency);\n } catch (err) {\n console.error('Error fetching location:', err);\n setError(err instanceof Error ? err.message : 'Unknown error');\n // Keep default currency on error\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchCountryAndCurrency();\n }, [ipInfoToken, skipAutoDetect]);\n\n const setCurrency = (newCurrency: string) => {\n setCurrencyState(newCurrency);\n };\n\n return {\n country,\n currency,\n isLoading,\n error,\n setCurrency\n };\n};\n","import { useContext } from 'react';\nimport { CurrencyContext } from './CurrencyContextDefinition';\nimport type { CurrencyContextType } from './CurrencyContextDefinition';\n\nexport const useCurrency = (): CurrencyContextType => {\n const context = useContext(CurrencyContext);\n if (context === undefined) {\n throw new Error('useCurrency must be used within a CurrencyProvider');\n }\n return context;\n};\n","import React from 'react';\nimport type { ReactNode } from 'react';\nimport { CurrencyContext } from './CurrencyContextDefinition';\nimport { useCountryAndCurrency } from '../hooks/useCountryAndCurrency';\n\n// Re-export types and context for convenience\nexport type { CurrencyContextType } from './CurrencyContextDefinition';\nexport { CurrencyContext } from './CurrencyContextDefinition';\n\nexport interface CurrencyProviderProps {\n children: ReactNode;\n ipInfoToken?: string;\n defaultCurrency?: string;\n skipAutoDetect?: boolean;\n}\n\nexport const CurrencyProvider: React.FC<CurrencyProviderProps> = ({ \n children, \n ipInfoToken,\n defaultCurrency = 'usd',\n skipAutoDetect = false\n}) => {\n const { country, currency, isLoading, error, setCurrency } = useCountryAndCurrency({\n ipInfoToken,\n defaultCurrency,\n skipAutoDetect\n });\n\n return (\n <CurrencyContext.Provider value={{ country, currency, isLoading, error, setCurrency }}>\n {children}\n </CurrencyContext.Provider>\n );\n};\n\n// Re-export the hook for backward compatibility\nexport { useCurrency } from './useCurrency';\n","import React, { createContext, useContext, useState, useCallback, ReactNode, useRef } from 'react';\nimport { subscriptionApi } from '../api/client';\nimport type { Subscription } from '../types';\nimport { useCurrency } from './CurrencyContext';\n\ninterface SubscriptionContextType {\n subscription: Subscription | null;\n loading: boolean;\n error: string | null;\n fetchSubscription: (externalId: string) => Promise<void>;\n clearSubscription: () => void;\n}\n\nconst SubscriptionContext = createContext<SubscriptionContextType | undefined>(undefined);\n\nexport const SubscriptionProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { currency } = useCurrency();\n const [subscription, setSubscription] = useState<Subscription | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n const loadingRef = useRef(false);\n const fetchSubscription = useCallback(async (externalId: string) => {\n if (!externalId || externalId === 'undefined' || externalId.trim() === '') {\n setError('Invalid user ID. Please ensure you are properly authenticated.');\n return;\n }\n\n if (loadingRef.current) return;\n\n loadingRef.current = true;\n setLoading(true);\n setError(null);\n\n try {\n const response = await subscriptionApi.getActiveSubscription(externalId, { currency, billableMetric: 'CANDIDATES' });\n if (response.success && response.data) {\n setSubscription(response.data);\n } else {\n setError(response.error || 'Failed to load subscription information');\n }\n } catch (err) {\n if (err instanceof Error && err.name !== 'AbortError') {\n console.error('Error fetching subscription:', err);\n setError('Failed to load subscription information. Please try again later.');\n }\n } finally {\n loadingRef.current = false;\n setLoading(false);\n }\n }, [currency]);\n\n const clearSubscription = useCallback(() => {\n setSubscription(null);\n setError(null);\n }, []);\n\n return (\n <SubscriptionContext.Provider value={{ subscription, loading, error, fetchSubscription, clearSubscription }}>\n {children}\n </SubscriptionContext.Provider>\n );\n};\n\nexport const useSubscriptionContext = () => {\n const context = useContext(SubscriptionContext);\n if (context === undefined) {\n throw new Error('useSubscriptionContext must be used within a SubscriptionProvider');\n }\n return context;\n};\n","import { useSubscriptionContext } from '../context/SubscriptionContext';\nimport type { Subscription } from '../types';\n\nexport interface UseSubscriptionReturn {\n subscription: Subscription | null;\n loading: boolean;\n error: string | null;\n fetchSubscription: (externalId: string) => Promise<void>;\n clearSubscription: () => void;\n}\n\nexport const useSubscription = (): UseSubscriptionReturn => {\n return useSubscriptionContext();\n};\n","import type { Plan } from '../types';\n\nexport interface DropdownOption {\n value: string;\n label: string;\n candidates: number;\n}\n\n/**\n * Get plan features for display based on plan name\n */\nexport const getPlanFeatures = (plan: Plan): string[] => {\n const features: string[] = [];\n if (plan.charges && plan.charges.length > 0) {\n plan.charges.forEach(charge => {\n if (charge.billableMetric?.name) {\n features.push(charge.billableMetric.name);\n }\n });\n }\n return features.length > 0 ? features : ['Core features included'];\n};\n\n/**\n * Get candidate units from plan's billable metrics (numeric only)\n */\nexport const getCandidateUnits = (plan: Plan): number => {\n if (plan.charges && plan.charges.length > 0) {\n const candidateCharge = plan.charges.find(\n (charge) => charge.billableMetric && charge.billableMetric.code === 'CANDIDATES'\n );\n\n const units = candidateCharge?.properties?.units;\n if (typeof units === 'number' && Number.isFinite(units)) {\n return units;\n }\n }\n return 0;\n};\n\n/**\n * Get unique candidate units from all plans (numeric only)\n */\nexport const getUniqueCandidateUnits = (plans: Plan[]): number[] => {\n const unitsSet = new Set<number>();\n\n plans.forEach((plan) => {\n plan.charges.forEach((charge) => {\n if (charge.billableMetric?.code === 'CANDIDATES') {\n const units = charge.properties?.units;\n if (typeof units === 'number' && Number.isFinite(units) && units !== 500) {\n unitsSet.add(units);\n }\n }\n });\n });\n\n return Array.from(unitsSet).sort((a, b) => a - b); // Sort in ascending order\n};\n\n/**\n * Get dropdown options with unique candidate units\n */\nexport const getDropdownOptions = (plans: Plan[]): DropdownOption[] => {\n const options: DropdownOption[] = [];\n const uniqueUnits = getUniqueCandidateUnits(plans);\n\n // Add options for each unique candidate unit value\n uniqueUnits.forEach(units => {\n options.push({\n value: units.toString(),\n label: `Up to ${units.toLocaleString()} Candidates`,\n candidates: units\n });\n });\n\n return options;\n};\n\n/**\n * Get current selection display text\n */\nexport const getCurrentSelectionText = (tierFilter: string, plans: Plan[]): string => {\n const options = getDropdownOptions(plans);\n const currentOption = options.find(option => option.value === tierFilter);\n\n if (!currentOption) {\n // If no option found, check if tierFilter is a number (candidate units)\n const units = parseInt(tierFilter);\n if (!isNaN(units)) {\n return `Up to ${units.toLocaleString()} Candidates`;\n }\n // Fallback to the lowest candidates label if available, otherwise empty string\n return options.length > 0 ? options[0].label : '';\n }\n\n return currentOption.label;\n};\n\n/**\n * Filter plans based on billing cycle\n */\nexport const filterPlansByBillingCycle = (\n plans: Plan[],\n billingCycle: 'monthly' | 'yearly'\n): Plan[] => {\n return plans.filter((plan) => {\n const planInterval = plan.interval.toLowerCase();\n if (billingCycle === 'monthly') {\n return planInterval === 'month' || planInterval === 'monthly';\n } else {\n return planInterval === 'year' || planInterval === 'yearly';\n }\n });\n};\n\n/**\n * Filter plans based on candidate units\n */\nexport const filterPlansByTier = (plans: Plan[], tierFilter: string): Plan[] => {\n if (tierFilter === 'all') {\n return plans;\n }\n\n const targetUnits = parseInt(tierFilter);\n return plans.filter((plan) => {\n // Always include Starter plan regardless of tier filter\n const planNameLc = plan.name?.toLowerCase?.() || '';\n if (planNameLc.includes('starter')) return true;\n\n const planCandidateUnits = getCandidateUnits(plan);\n return planCandidateUnits === targetUnits;\n });\n};\n\n/**\n * Check if a plan is popular (typically Growth plan)\n */\nexport const isPlanPopular = (plan: Plan): boolean => {\n const planName = plan.name.toLowerCase();\n return planName.includes('scale');\n};\n\n/**\n * Sort plans into a stable display order: Starter -> Growth -> Scale\n * This avoids API-order-dependent shuffling when filtering by tiers.\n */\nexport const sortPlansForDisplay = (plans: Plan[]): Plan[] => {\n const priorityOf = (name: string | undefined): number => {\n const n = (name || '').toLowerCase();\n if (n.includes('starter') || n.includes('basic')) return 0;\n if (n.includes('growth') || n.includes('pro')) return 1;\n if (n.includes('scale') || n.includes('premium')) return 2;\n return 99;\n };\n\n return [...plans].sort((a, b) => {\n const pa = priorityOf(a.name);\n const pb = priorityOf(b.name);\n if (pa !== pb) return pa - pb;\n // Tie-breaker: by name for deterministic ordering\n return (a.name || '').localeCompare(b.name || '');\n });\n};\n\n/**\n * Get plan description based on plan name\n */\nexport const getPlanDescription = (plan: Plan): string => {\n const planName = plan.name.toLowerCase();\n\n if (planName.includes('starter') || planName.includes('basic')) {\n return 'Ideal for solopreneurs looking to start their niche job board journey.';\n } else if (planName.includes('growth') || planName.includes('pro')) {\n return 'Ideal for creators launching their job board with powerful features and built-in scalability.';\n } else {\n return 'Perfect for creators ready to run a full-scale, smart hiring engine with AI and advanced capabilities.';\n }\n};\n\n/**\n * Format date string with optional time format\n */\nexport const formatDate = (dateString: string, format: 'date' | 'datetime' = 'date'): string => {\n const date = new Date(dateString);\n\n if (format === 'datetime') {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false // Military time format\n }).format(date);\n }\n\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n }).format(date);\n};\n\n/**\n * Get grace period information for display\n */\nexport const getGracePeriodInfo = (subscription: any) => {\n if (!subscription?.meta?.isGracePeriod) {\n return null;\n }\n\n const startDate = subscription.meta.gracePeriodStart;\n const endDate = subscription.meta.gracePeriodEnd;\n\n // Calculate remaining days if endDate is available\n let remainingDays = subscription.remainingGracePeriodDays ?? 0;\n if (endDate) {\n const end = new Date(endDate).getTime();\n const now = new Date().getTime();\n const diff = end - now;\n remainingDays = Math.max(0, Math.ceil(diff / (1000 * 60 * 60 * 24)));\n }\n\n return {\n startDate,\n endDate,\n remainingDays,\n message: `Your 7-day grace period started on ${startDate ? formatDate(startDate) : 'N/A'}. You have ${remainingDays} days remaining to update your payment method to continue your subscription without interruption.`\n };\n};\n","import React, { createContext, useContext, useState } from 'react';\nimport type { ReactNode } from 'react';\n\ninterface UpgradeContextType {\n isUpgradeSummaryVisible: boolean;\n setUpgradeSummaryVisible: (visible: boolean) => void;\n clearUpgradeSelection: () => void;\n}\n\nconst UpgradeContext = createContext<UpgradeContextType | undefined>(undefined);\n\nexport interface UpgradeProviderProps {\n children: ReactNode;\n}\n\nexport const UpgradeProvider: React.FC<UpgradeProviderProps> = ({ children }) => {\n const [isUpgradeSummaryVisible, setIsUpgradeSummaryVisible] = useState(false);\n\n const setUpgradeSummaryVisible = (visible: boolean) => {\n setIsUpgradeSummaryVisible(visible);\n };\n\n const clearUpgradeSelection = () => {\n setIsUpgradeSummaryVisible(false);\n };\n\n return (\n <UpgradeContext.Provider\n value={{\n isUpgradeSummaryVisible,\n setUpgradeSummaryVisible,\n clearUpgradeSelection,\n }}\n >\n {children}\n </UpgradeContext.Provider>\n );\n};\n\nexport const useUpgrade = (): UpgradeContextType => {\n const context = useContext(UpgradeContext);\n if (context === undefined) {\n throw new Error('useUpgrade must be used within an UpgradeProvider');\n }\n return context;\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { plansApi } from '../api/client';\nimport type { Plan } from '../types';\nimport { \n filterPlansByBillingCycle, \n filterPlansByTier, \n getUniqueCandidateUnits,\n getDropdownOptions,\n getCurrentSelectionText,\n sortPlansForDisplay,\n type DropdownOption\n} from '../utils/planUtils';\nimport { useCurrency } from '../contexts';\n\nexport interface UpgradeOptions {\n returnUrl?: string;\n cancelUrl?: string;\n}\n\nexport interface UsePlansReturn {\n // Data\n plans: Plan[];\n filteredPlans: Plan[];\n selectedPlan: Plan | null;\n \n // Filters\n tierFilter: string;\n billingCycle: 'monthly' | 'yearly';\n \n // Loading and error states\n loading: boolean;\n error: string | null;\n \n // Actions\n fetchPlans: () => Promise<void>;\n setSelectedPlan: (plan: Plan | null) => void;\n setTierFilter: (filter: string) => void;\n setBillingCycle: (cycle: 'monthly' | 'yearly') => void;\n clearPlans: () => void;\n clearSelectedPlan: () => void;\n \n // Computed values\n dropdownOptions: DropdownOption[];\n currentSelectionText: string;\n \n // Plan operations\n handlePlanSelect: (plan: Plan) => void;\n handleUpgrade: (externalId: string, options?: UpgradeOptions) => Promise<void>;\n}\n\nexport const usePlans = (): UsePlansReturn => {\n // Currency context\n const { currency } = useCurrency();\n \n // Core state\n const [plans, setPlans] = useState<Plan[]>([]);\n const [filteredPlans, setFilteredPlans] = useState<Plan[]>([]);\n const [selectedPlan, setSelectedPlan] = useState<Plan | null>(null);\n \n // Filter state\n const [tierFilter, setTierFilter] = useState<string>('all');\n const [billingCycle, setBillingCycle] = useState<'monthly' | 'yearly'>('monthly');\n \n // Loading and error state\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n // Fetch plans from API\n const fetchPlans = useCallback(async () => {\n // Prevent multiple simultaneous requests\n if (loading) return;\n \n setLoading(true);\n setError(null);\n\n try {\n const response = await plansApi.getPlans();\n if (response.success && response.data) {\n const data = response.data;\n setPlans(data);\n setFilteredPlans(data);\n } else {\n setError(response.error || 'Failed to load plan information');\n }\n } catch (err) {\n // Only set error if it's not an AbortError (request cancellation)\n if (err instanceof Error && err.name !== 'AbortError') {\n console.error('Error fetching plans:', err);\n setError('Failed to load plan information. Please try again later.');\n }\n } finally {\n setLoading(false);\n }\n }, [loading]);\n\n // Set default tierFilter to lowest candidate unit when plans are loaded\n useEffect(() => {\n if (plans.length > 0 && tierFilter === 'all') {\n const uniqueUnits = getUniqueCandidateUnits(plans);\n if (uniqueUnits.length > 0) {\n setTierFilter(uniqueUnits[0].toString()); // Set to lowest value\n }\n }\n }, [plans, tierFilter]);\n\n // Filter plans based on candidate units and billing cycle\n useEffect(() => {\n let filtered = [...plans];\n\n // Filter by billing cycle (monthly/yearly)\n filtered = filterPlansByBillingCycle(filtered, billingCycle);\n\n // Filter by candidate units if not 'all'\n filtered = filterPlansByTier(filtered, tierFilter);\n\n // Ensure deterministic order: Starter -> Growth -> Scale\n const sorted = sortPlansForDisplay(filtered);\n setFilteredPlans(sorted);\n }, [plans, tierFilter, billingCycle]);\n\n // Handle plan selection\n const handlePlanSelect = useCallback((plan: Plan) => {\n setSelectedPlan(plan);\n }, []);\n\n // Handle upgrade button click\n const handleUpgrade = useCallback(async (externalId: string, options?: UpgradeOptions) => {\n if (!selectedPlan) return;\n\n try {\n const response = await plansApi.createPaymentSession(selectedPlan.code, {\n externalId: externalId,\n currency,\n returnUrl: options?.returnUrl,\n cancelUrl: options?.cancelUrl,\n // billableMetricCode: \"CANDIDATES\"\n });\n if (response.success && response.data?.checkoutUrl) {\n window.location.href = response.data.checkoutUrl;\n } else {\n console.error('Failed to create payment session:', response.error);\n alert('Failed to initiate payment. Please try again.');\n }\n } catch (error) {\n console.error('Error creating payment session:', error);\n alert('An error occurred. Please try again.');\n }\n }, [selectedPlan, currency]);\n\n // Clear plans data\n const clearPlans = useCallback(() => {\n setPlans([]);\n setFilteredPlans([]);\n setSelectedPlan(null);\n setError(null);\n setTierFilter('all');\n }, []);\n\n // Clear selected plan only\n const clearSelectedPlan = useCallback(() => {\n setSelectedPlan(null);\n }, []);\n\n // Computed values\n const dropdownOptions = getDropdownOptions(plans);\n const currentSelectionText = getCurrentSelectionText(tierFilter, plans);\n\n return {\n // Data\n plans,\n filteredPlans,\n selectedPlan,\n \n // Filters\n tierFilter,\n billingCycle,\n \n // Loading and error states\n loading,\n error,\n \n // Actions\n fetchPlans,\n setSelectedPlan,\n setTierFilter,\n setBillingCycle,\n clearPlans,\n clearSelectedPlan,\n \n // Computed values\n dropdownOptions,\n currentSelectionText,\n \n // Plan operations\n handlePlanSelect,\n handleUpgrade,\n };\n};\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { transactionApi } from '../api/client';\nimport type { Transaction, TransactionFilters, PaginatedResponse, ApiResponse } from '../types';\n\nexport interface UseTransactionsProps {\n externalId: string;\n initialFilters?: TransactionFilters;\n autoFetch?: boolean;\n}\n\nexport interface UseTransactionsReturn {\n transactions: Transaction[];\n loading: boolean;\n error: string | null;\n filters: TransactionFilters;\n meta: {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n } | null;\n fetchTransactions: () => Promise<void>;\n updateFilters: (newFilters: Partial<TransactionFilters>) => void;\n clearFilters: () => void;\n refetch: () => Promise<void>;\n}\n\nconst DEFAULT_FILTERS: TransactionFilters = {\n page: 1,\n limit: 10,\n};\n\n// Helper function to apply frontend filters\nconst applyFrontendFilters = (transactions: Transaction[], filters: TransactionFilters): Transaction[] => {\n let filtered = [...transactions];\n\n // Filter by status (only if status filter is set and not empty)\n if (filters.status && filters.status.trim() !== '') {\n filtered = filtered.filter(transaction => \n transaction.transactionStatus.toLowerCase() === filters.status?.toLowerCase()\n );\n }\n\n // Filter by date range (only if dates are set)\n if (filters.startDate && filters.startDate.trim() !== '') {\n const startDate = new Date(filters.startDate);\n filtered = filtered.filter(transaction => {\n const transactionDate = new Date(transaction.transactionDate || transaction.membershipDate);\n return transactionDate >= startDate;\n });\n }\n\n if (filters.endDate && filters.endDate.trim() !== '') {\n const endDate = new Date(filters.endDate);\n filtered = filtered.filter(transaction => {\n const transactionDate = new Date(transaction.transactionDate || transaction.membershipDate);\n return transactionDate <= endDate;\n });\n }\n\n return filtered;\n};\n\n// Helper function to apply frontend pagination\nconst applyFrontendPagination = (transactions: Transaction[], filters: TransactionFilters) => {\n const currentPage = filters.page || 1;\n const limit = filters.limit || 10;\n const startIndex = (currentPage - 1) * limit;\n const endIndex = startIndex + limit;\n const paginatedTransactions = transactions.slice(startIndex, endIndex);\n \n // Calculate total pages - ensure at least 1 page even if no items\n const totalPages = Math.max(1, Math.ceil(transactions.length / limit));\n \n // Ensure we're not on a page that doesn't exist\n const adjustedCurrentPage = Math.min(currentPage, totalPages);\n \n return {\n data: paginatedTransactions,\n meta: {\n currentPage: adjustedCurrentPage,\n totalPages: totalPages,\n totalItems: transactions.length,\n itemsPerPage: limit,\n hasNextPage: endIndex < transactions.length,\n hasPreviousPage: adjustedCurrentPage > 1,\n }\n };\n};\n\nexport const useTransactions = ({\n externalId,\n initialFilters = {},\n autoFetch = false,\n}: UseTransactionsProps): UseTransactionsReturn => {\n const [transactions, setTransactions] = useState<Transaction[]>([]);\n const [allTransactions, setAllTransactions] = useState<Transaction[]>([]); // Store all transactions for frontend pagination\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filters, setFilters] = useState<TransactionFilters>({\n ...DEFAULT_FILTERS,\n ...initialFilters,\n });\n const [meta, setMeta] = useState<{\n currentPage: number;\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n } | null>(null);\n const [isBackendPaginated, setIsBackendPaginated] = useState<boolean>(false);\n const hasAutoFetchedRef = useRef(false);\n\n const fetchTransactions = useCallback(async () => {\n if (!externalId) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response: ApiResponse<PaginatedResponse<Transaction> | Transaction[]> = await transactionApi.getTransactions(\n externalId,\n filters\n );\n\n if (response.success && response.data) {\n \n \n // Handle both paginated and non-paginated responses\n if (Array.isArray(response.data)) {\n // Non-paginated response - handle frontend pagination\n setIsBackendPaginated(false);\n setAllTransactions(response.data);\n \n // Apply proper frontend pagination even in debug mode\n const filteredTransactions = applyFrontendFilters(response.data, filters);\n const paginatedResult = applyFrontendPagination(filteredTransactions, filters);\n \n setTransactions(paginatedResult.data);\n setMeta(paginatedResult.meta);\n \n // Apply frontend filtering and pagination (commented out for debugging)\n // const filteredTransactions = applyFrontendFilters(response.data, filters);\n // const paginatedResult = applyFrontendPagination(filteredTransactions, filters);\n \n \n \n // setTransactions(paginatedResult.data);\n // setMeta(paginatedResult.meta);\n } else {\n // Paginated response from backend\n setIsBackendPaginated(true);\n const paginatedData = response.data as PaginatedResponse<Transaction>;\n setTransactions(paginatedData.data);\n setMeta(paginatedData.meta);\n setAllTransactions([]); // Clear all transactions as backend handles pagination\n }\n } else {\n setError(response.error || 'Failed to fetch transactions');\n setTransactions([]);\n setAllTransactions([]);\n setMeta(null);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An unexpected error occurred');\n setTransactions([]);\n setAllTransactions([]);\n setMeta(null);\n } finally {\n setLoading(false);\n }\n }, [externalId, filters]);\n\n const updateFilters = useCallback((newFilters: Partial<TransactionFilters>) => {\n setFilters(prev => ({\n ...prev,\n ...newFilters,\n // Reset to page 1 when filters change (except when explicitly setting page)\n page: newFilters.page !== undefined ? newFilters.page : 1,\n }));\n }, []);\n\n // Handle frontend pagination when backend doesn't provide pagination\n useEffect(() => {\n if (!isBackendPaginated && allTransactions.length > 0) {\n const filteredTransactions = applyFrontendFilters(allTransactions, filters);\n const paginatedResult = applyFrontendPagination(filteredTransactions, filters);\n \n setTransactions(paginatedResult.data);\n setMeta(paginatedResult.meta);\n }\n }, [filters, allTransactions, isBackendPaginated]);\n\n const clearFilters = useCallback(() => {\n setFilters(DEFAULT_FILTERS);\n }, []);\n\n const refetch = useCallback(async () => {\n await fetchTransactions();\n }, [fetchTransactions]);\n\n // Auto-fetch once per externalId if enabled\n useEffect(() => {\n if (autoFetch && externalId && !hasAutoFetchedRef.current) {\n hasAutoFetchedRef.current = true;\n fetchTransactions();\n }\n }, [autoFetch, externalId, fetchTransactions]);\n\n // Fetch when filters change (only for backend pagination or initial load)\n useEffect(() => {\n if (!autoFetch) return; // Only auto-refetch if autoFetch is enabled\n \n // For backend pagination, refetch on filter changes\n // For frontend pagination, only fetch on initial load or when non-pagination filters change\n const hasNonPaginationFilters = (\n filters.startDate !== undefined ||\n filters.endDate !== undefined ||\n filters.status !== undefined\n );\n\n // In backend-paginated mode: always refetch on filter changes\n // In frontend mode: fetch only if we don't have data yet (initial load),\n // even if filters are present. Once data is loaded, do not refetch.\n const shouldFetch = isBackendPaginated || (allTransactions.length === 0 && hasNonPaginationFilters);\n \n if (shouldFetch) {\n const timeoutId = setTimeout(() => {\n fetchTransactions();\n }, 300); // Debounce API calls\n\n return () => clearTimeout(timeoutId);\n }\n }, [filters, fetchTransactions, autoFetch, isBackendPaginated, allTransactions.length]);\n\n return {\n transactions,\n loading,\n error,\n filters,\n meta,\n fetchTransactions,\n updateFilters,\n clearFilters,\n refetch,\n };\n};\n","import { useState, useCallback } from 'react';\nimport type { PaginationMeta } from '../types';\n\nexport interface UsePaginationProps {\n initialPage?: number;\n initialLimit?: number;\n}\n\nexport interface UsePaginationReturn {\n currentPage: number;\n limit: number;\n meta: PaginationMeta | null;\n goToPage: (page: number) => void;\n goToNextPage: () => void;\n goToPreviousPage: () => void;\n goToFirstPage: () => void;\n goToLastPage: () => void;\n setLimit: (newLimit: number) => void;\n setMeta: (meta: PaginationMeta) => void;\n reset: () => void;\n}\n\nexport const usePagination = ({\n initialPage = 1,\n initialLimit = 10,\n}: UsePaginationProps = {}): UsePaginationReturn => {\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [limit, setLimitState] = useState(initialLimit);\n const [meta, setMeta] = useState<PaginationMeta | null>(null);\n\n const goToPage = useCallback((page: number) => {\n if (meta) {\n const validPage = Math.max(1, Math.min(page, meta.totalPages));\n setCurrentPage(validPage);\n } else {\n setCurrentPage(Math.max(1, page));\n }\n }, [meta]);\n\n const goToNextPage = useCallback(() => {\n if (meta && meta.hasNextPage) {\n setCurrentPage(prev => prev + 1);\n }\n }, [meta]);\n\n const goToPreviousPage = useCallback(() => {\n if (meta && meta.hasPreviousPage) {\n setCurrentPage(prev => prev - 1);\n }\n }, [meta]);\n\n const goToFirstPage = useCallback(() => {\n setCurrentPage(1);\n }, []);\n\n const goToLastPage = useCallback(() => {\n if (meta) {\n setCurrentPage(meta.totalPages);\n }\n }, [meta]);\n\n const setLimit = useCallback((newLimit: number) => {\n setLimitState(newLimit);\n setCurrentPage(1); // Reset to first page when changing limit\n }, []);\n\n const reset = useCallback(() => {\n setCurrentPage(initialPage);\n setLimitState(initialLimit);\n setMeta(null);\n }, [initialPage, initialLimit]);\n\n return {\n currentPage,\n limit,\n meta,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n setLimit,\n setMeta,\n reset,\n };\n};\n","import { useState, useCallback } from 'react';\nimport { subscriptionApi } from '../api/client';\nimport type { ApiResponse } from '../types';\n\nexport interface UseCancelSubscriptionProps {\n onSuccess?: () => void;\n onError?: (error: string) => void;\n}\n\nexport interface CancelSubscriptionOptions {\n cancellationMode?: string;\n cancellationReason?: string;\n}\n\nexport interface UseCancelSubscriptionReturn {\n loading: boolean;\n error: string | null;\n cancelSubscription: (externalId: string, options?: CancelSubscriptionOptions) => Promise<boolean>;\n reset: () => void;\n}\n\nexport const useCancelSubscription = ({\n onSuccess,\n onError,\n}: UseCancelSubscriptionProps = {}): UseCancelSubscriptionReturn => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const cancelSubscription = useCallback(async (externalId: string, options?: CancelSubscriptionOptions): Promise<boolean> => {\n if (!externalId) {\n const errorMsg = 'External ID is required';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const response: ApiResponse<any> = await subscriptionApi.cancelSubscription(externalId, options);\n\n if (response.success) {\n onSuccess?.();\n return true;\n } else {\n const errorMsg = response.error || 'Failed to cancel subscription';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n } finally {\n setLoading(false);\n }\n }, [onSuccess, onError]);\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n }, []);\n\n return {\n loading,\n error,\n cancelSubscription,\n reset,\n };\n};\n","import { useState, useCallback } from 'react';\nimport { customerApi } from '../api/client';\nimport type { ApiResponse } from '../types';\n\nexport interface UseCustomerPortalProps {\n onSuccess?: (url: string) => void;\n onError?: (error: string) => void;\n returnPath?: string;\n}\n\nexport interface UseCustomerPortalReturn {\n loading: boolean;\n error: string | null;\n openCustomerPortal: (externalId: string) => Promise<boolean>;\n reset: () => void;\n}\n\n// (removed local apiRequest in favor of shared API client)\n\nexport const useCustomerPortal = ({\n onSuccess,\n onError,\n returnPath = '/dashboard',\n}: UseCustomerPortalProps = {}): UseCustomerPortalReturn => {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const openCustomerPortal = useCallback(async (externalId: string): Promise<boolean> => {\n if (!externalId) {\n const errorMsg = 'External ID is required';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const returnUrl = `${window.location.origin}${returnPath}`;\n \n const response: ApiResponse<{ url: string }> = await customerApi.createPortalSession(\n externalId,\n returnUrl\n );\n const portalResponse: any = response.data;\n const portalUrl: string | undefined = portalResponse?.data?.url ?? portalResponse?.url;\n\n if (response.success && portalUrl) {\n onSuccess?.(portalUrl);\n // Redirect to Stripe Customer Portal\n window.location.href = portalUrl;\n return true;\n } else {\n const errorMsg =\n response.error ||\n portalResponse?.error ||\n portalResponse?.message ||\n 'Failed to open customer portal';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(errorMsg);\n onError?.(errorMsg);\n return false;\n } finally {\n setLoading(false);\n }\n }, [onSuccess, onError, returnPath]);\n\n const reset = useCallback(() => {\n setLoading(false);\n setError(null);\n }, []);\n\n return {\n loading,\n error,\n openCustomerPortal,\n reset,\n };\n};\n","import React, { createContext, useContext, useState } from 'react';\nimport type { ReactNode } from 'react';\n\ntype PageType = 'dashboard' | 'payment-success' | 'payment-cancel';\n\ninterface NavigationContextType {\n currentPage: PageType;\n navigateTo: (page: PageType) => void;\n goBack: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextType | undefined>(undefined);\n\ninterface NavigationProviderProps {\n children: ReactNode;\n initialPage?: PageType;\n}\n\nexport const NavigationProvider: React.FC<NavigationProviderProps> = ({ \n children, \n initialPage = 'dashboard' \n}) => {\n const [currentPage, setCurrentPage] = useState<PageType>(initialPage);\n const [history, setHistory] = useState<PageType[]>([initialPage]);\n\n const navigateTo = (page: PageType) => {\n setCurrentPage(page);\n setHistory(prev => [...prev, page]);\n };\n\n const goBack = () => {\n if (history.length > 1) {\n const newHistory = [...history];\n newHistory.pop();\n const previousPage = newHistory[newHistory.length - 1];\n setCurrentPage(previousPage);\n setHistory(newHistory);\n }\n };\n\n return (\n <NavigationContext.Provider value={{ currentPage, navigateTo, goBack }}>\n {children}\n </NavigationContext.Provider>\n );\n};\n\nexport const useNavigation = () => {\n const context = useContext(NavigationContext);\n if (!context) {\n throw new Error('useNavigation must be used within NavigationProvider');\n }\n return context;\n};\n","import React from 'react';\n\nexport interface BillingCycleToggleProps {\n billingCycle: 'monthly' | 'yearly';\n onBillingCycleChange: (cycle: 'monthly' | 'yearly') => void;\n className?: string;\n}\n\nexport const BillingCycleToggle: React.FC<BillingCycleToggleProps> = ({\n billingCycle,\n onBillingCycleChange,\n className,\n}) => {\n return (\n <div \n className=\"inline-flex rounded-lg p-1\"\n style={{ \n backgroundColor: 'var(--subos-muted, #f1f5f9)',\n border: '1px solid var(--subos-border, #e2e8f0)'\n }}\n >\n <button\n onClick={() => onBillingCycleChange('monthly')}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all duration-200 ${className || ''}`}\n style={billingCycle === 'monthly' ? {\n backgroundColor: 'var(--subos-primary-500, #ef4444)',\n color: 'white',\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.1)',\n fontWeight: '600'\n } : {\n backgroundColor: 'transparent',\n color: 'var(--subos-muted-foreground, #64748b)',\n fontWeight: '500'\n }}\n onMouseEnter={billingCycle !== 'monthly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-foreground, #1e293b)';\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';\n } : undefined}\n onMouseLeave={billingCycle !== 'monthly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-muted-foreground, #64748b)';\n e.currentTarget.style.backgroundColor = 'transparent';\n } : undefined}\n >\n Monthly\n </button>\n <button\n onClick={() => onBillingCycleChange('yearly')}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all duration-200 ${className || ''}`}\n style={billingCycle === 'yearly' ? {\n backgroundColor: 'var(--subos-primary-500, #ef4444)',\n color: 'white',\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.1)',\n fontWeight: '600'\n } : {\n backgroundColor: 'transparent',\n color: 'var(--subos-muted-foreground, #64748b)',\n fontWeight: '500'\n }}\n onMouseEnter={billingCycle !== 'yearly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-foreground, #1e293b)';\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';\n } : undefined}\n onMouseLeave={billingCycle !== 'yearly' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-muted-foreground, #64748b)';\n e.currentTarget.style.backgroundColor = 'transparent';\n } : undefined}\n >\n Yearly\n </button>\n </div>\n );\n};\n\n","import React, { useRef, useEffect } from 'react';\nimport type { DropdownOption } from '../../utils/planUtils';\n\nexport interface TierFilterDropdownProps {\n isOpen: boolean;\n onToggle: () => void;\n currentSelectionText: string;\n options: DropdownOption[];\n selectedValue: string;\n onSelect: (value: string) => void;\n}\n\nexport const TierFilterDropdown: React.FC<TierFilterDropdownProps> = ({\n isOpen,\n onToggle,\n currentSelectionText,\n options,\n selectedValue,\n onSelect,\n}) => {\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Handle clicking outside dropdown\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n if (isOpen) {\n onToggle();\n }\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onToggle]);\n\n const handleOptionSelect = (value: string) => {\n onSelect(value);\n onToggle(); // Close dropdown\n };\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n <button\n onClick={onToggle}\n className=\"w-full min-w-[280px] px-4 py-3 border rounded-lg text-left focus:outline-none focus:ring-2 flex items-center justify-between transition-all duration-200\"\n style={{\n backgroundColor: 'var(--subos-background, #ffffff)',\n borderColor: isOpen ? 'var(--subos-primary-500, #3f51b5)' : 'var(--subos-border, #e2e8f0)',\n color: 'var(--subos-foreground, #1e293b)',\n boxShadow: isOpen ? '0 0 0 1px var(--subos-primary-500, #3f51b5)' : 'none'\n }}\n onMouseEnter={(e) => {\n if (!isOpen) {\n e.currentTarget.style.borderColor = 'var(--subos-muted-foreground, #64748b)';\n }\n }}\n onMouseLeave={(e) => {\n if (!isOpen) {\n e.currentTarget.style.borderColor = 'var(--subos-border, #e2e8f0)';\n }\n }}\n >\n <span style={{ color: 'var(--subos-foreground, #1e293b)' }}>{currentSelectionText}</span>\n <svg\n className={`w-5 h-5 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div \n className=\"absolute top-full left-0 w-full min-w-[280px] mt-1 border rounded-lg z-50\"\n style={{\n backgroundColor: 'var(--subos-background, #ffffff)',\n borderColor: 'var(--subos-border, #e2e8f0)',\n boxShadow: 'var(--subos-shadow-card, 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06))'\n }}\n >\n {options.map((option) => (\n <button\n key={option.value}\n onClick={() => handleOptionSelect(option.value)}\n className=\"w-full px-4 py-3 text-left transition-colors first:rounded-t-lg last:rounded-b-lg\"\n style={{\n backgroundColor: selectedValue === option.value \n ? 'var(--subos-primary-50, #eff6ff)' \n : 'transparent',\n color: selectedValue === option.value \n ? 'var(--subos-primary-700, #1d4ed8)' \n : 'var(--subos-foreground, #1e293b)'\n }}\n onMouseEnter={(e) => {\n if (selectedValue !== option.value) {\n e.currentTarget.style.backgroundColor = 'var(--subos-accent, #f8fafc)';\n }\n }}\n onMouseLeave={(e) => {\n if (selectedValue !== option.value) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">\n {option.label}\n </span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\n\ninterface CheckIconProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const CheckIcon: React.FC<CheckIconProps> = ({ className = \"w-5 h-5\", style }) => {\n return (\n <svg \n className={className} \n style={style}\n fill=\"currentColor\" \n viewBox=\"0 0 20 20\" \n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path \n fillRule=\"evenodd\" \n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" \n clipRule=\"evenodd\" \n />\n </svg>\n );\n};\n","import React from 'react';\nimport type { Plan } from '../../types';\nimport { CheckIcon } from '../icons/CheckIcon';\nimport { getPlanFeatures, getPlanDescription, isPlanPopular } from '../../utils/planUtils';\n\nexport interface PlanCardProps {\n plan: Plan;\n isSelected: boolean;\n billingCycle: 'monthly' | 'yearly';\n onSelect: (plan: Plan) => void;\n // Indicates if this plan is the user's currently active subscription plan\n isActive?: boolean;\n // Indicates if this plan is the user's next membership plan (scheduled to activate)\n isNextActive?: boolean;\n comparisonUrl?: string;\n // Optional list of features to show, intersected with plan's computed features\n featureFilter?: string[];\n}\n\nexport const PlanCard: React.FC<PlanCardProps> = ({\n plan,\n isSelected,\n billingCycle,\n onSelect,\n isActive = false,\n isNextActive = false,\n comparisonUrl = 'https://arthajobboard.com/pricing',\n featureFilter,\n}) => {\n const computedFeatures = getPlanFeatures(plan);\n const features = Array.isArray(featureFilter) && featureFilter.length > 0\n ? featureFilter\n : computedFeatures;\n const description = getPlanDescription(plan);\n const isPopular = isPlanPopular(plan);\n const isFree = Number(plan.fixedCost) === 0;\n\n return (\n <div\n onClick={isFree || isActive || isNextActive ? undefined : () => onSelect(plan)}\n className={`relative border rounded-lg p-6 transition-all flex flex-col h-full font-subos ${\n !isFree && !isActive && !isNextActive ? 'cursor-pointer' : 'cursor-default'\n } ${\n !isFree && isSelected && !isActive\n ? 'border-primary-500 bg-primary-50'\n : 'border-subos-border'\n } ${!isFree && !isActive ? 'hover:border-subos-muted-foreground' : ''} ${isPopular ? 'border-primary-500' : ''}`}\n style={{ \n backgroundColor: !isFree && isSelected && !isActive ? 'var(--subos-primary-50, #e8eaf6)' : 'var(--subos-background, #ffffff)',\n borderColor: !isFree && isSelected && !isActive ? 'var(--subos-primary-500, #3f51b5)' : \n isPopular ? 'var(--subos-primary-500, #3f51b5)' : 'var(--subos-border, #dee2e6)',\n color: 'var(--subos-foreground, inherit)'\n }}\n >\n {isPopular && (\n <div className=\"absolute -top-3 left-1/2 transform -translate-x-1/2\">\n <span \n className=\"text-white px-3 py-1 rounded-full text-xs font-medium\"\n style={{ backgroundColor: 'var(--subos-primary-500, #3f51b5)' }}\n >\n Most Popular\n </span>\n </div>\n )}\n \n {!isFree && isSelected && !isActive && (\n <div className=\"absolute top-4 right-4\">\n <div \n className=\"text-white rounded-full p-1\"\n style={{ backgroundColor: 'var(--subos-primary-500, #3f51b5)' }}\n >\n <CheckIcon className=\"w-4 h-4\" />\n </div>\n </div>\n )}\n \n <div className=\"mb-0\">\n <h4 \n className=\"text-xl font-bold mb-2\" \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-title, 1.25rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-title, 700)',\n color: 'var(--subos-color-plan-card-title, var(--subos-foreground, inherit))' \n }}\n >\n {plan.name}\n </h4>\n <p \n className=\"text-sm mb-1\" \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-description, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-description, 400)',\n color: 'var(--subos-color-plan-card-description, var(--subos-muted-foreground, #6c757d))' \n }}\n >\n {description}\n </p>\n \n <div className=\"mb-0\">\n {isFree ? (\n <span className=\"text-3xl font-bold\" style={{ color: 'var(--subos-primary-500, #3f51b5)' }}>Free</span>\n ) : (\n <>\n <span className=\"text-3xl font-bold\" style={{ color: 'var(--subos-primary-500, #3f51b5)' }}>\n ${plan.fixedCost}\n </span>\n <span className=\"ml-1\" style={{ color: 'var(--subos-muted-foreground, #6c757d)' }}>\n per {billingCycle === 'yearly' ? 'year' : 'month'}\n </span>\n </>\n )}\n </div>\n </div>\n\n {/* Horizontal line before features */}\n <div className=\"mb-6\">\n <hr className=\"mt-0 mb-0\" style={{ borderColor: 'var(--subos-border,rgb(2, 48, 94))', marginTop: 0, marginBottom: 0 }} />\n </div>\n \n <ul className=\"space-y-2 mb-6 flex-grow\">\n {features.map((feature, index) => (\n <li key={index} className=\"flex items-center text-sm\">\n <div\n className=\"mr-2 flex-shrink-0 rounded-full p-0.5\"\n style={{ backgroundColor: isActive ? 'var(--subos-muted-foreground,rgb(148, 150, 153))' : 'var(--subos-primary-500, #3f51b5)' }}\n >\n <CheckIcon className=\"w-3 h-3 text-white\" />\n </div>\n <span \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-feature, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-feature, 400)',\n color: 'var(--subos-color-plan-card-feature, var(--subos-foreground, inherit))' \n }}\n >\n {feature}\n </span>\n </li>\n ))}\n </ul>\n\n\n {/* Informational text for free plans */}\n {isFree && (\n <div className=\"mb-4\">\n <p \n className=\"text-sm mb-4\" \n style={{ \n fontSize: 'var(--subos-font-size-plan-card-info, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-plan-card-info, 400)',\n color: 'var(--subos-color-plan-card-info, var(--subos-muted-foreground, #6c757d))' \n }}\n >\n The mentioned plan will become the default once the current subscription expires, provided the tier requirement is met.\n </p>\n </div>\n )}\n \n <div className=\"mt-auto space-y-3\">\n {!isFree && (\n isActive ? (\n <div\n className=\"w-full border py-2 px-4 rounded-md font-medium cursor-default transition-colors text-center\"\n style={{ \n backgroundColor: 'var(--subos-muted, #f8f9fa)',\n borderColor: 'var(--subos-border, #dee2e6)',\n color: 'var(--subos-primary-500, #3f51b5)'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #3f51b5)';\n e.currentTarget.style.borderColor = 'var(--subos-primary-500, #3f51b5)';\n e.currentTarget.style.color = 'white';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-muted, #f8f9fa)';\n e.currentTarget.style.borderColor = 'var(--subos-border, #dee2e6)';\n e.currentTarget.style.color = 'var(--subos-primary-500, #3f51b5)';\n }}\n >\n Active\n </div>\n ) : isNextActive ? (\n <div\n className=\"w-full border py-2 px-4 rounded-md font-medium cursor-default transition-colors text-center\"\n style={{ \n backgroundColor: 'var(--subos-muted, #f8f9fa)',\n borderColor: 'var(--subos-border, #dee2e6)',\n color: 'var(--subos-primary-500, #3f51b5)'\n }}\n >\n Scheduled\n </div>\n ) : isSelected ? (\n <button \n className=\"w-full subos-btn-primary text-white py-2 px-4 rounded-md font-medium\"\n >\n Selected\n </button>\n ) : (\n <button \n className=\"w-full border py-2 px-4 rounded-md font-medium transition-colors\"\n style={{ \n backgroundColor: 'var(--subos-primary-500, #3f51b5)',\n borderColor: 'var(--subos-primary-500, #3f51b5)',\n color: 'white'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-600, #303f9f)';\n e.currentTarget.style.borderColor = 'var(--subos-primary-600, #303f9f)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #3f51b5)';\n e.currentTarget.style.borderColor = 'var(--subos-primary-500, #3f51b5)';\n }}\n >\n Select\n </button>\n )\n )}\n \n {/* Show Plan Comparison button - only if comparisonUrl is provided */}\n {comparisonUrl && !isFree && (\n <button\n className=\"w-full py-2 px-4 rounded-md font-medium text-sm transition-colors text-center\"\n style={{ \n backgroundColor: 'transparent',\n border: 'none',\n color: 'var(--subos-primary-500, #3f51b5)'\n }}\n onClick={(e) => {\n e.stopPropagation();\n window.open(comparisonUrl, '_blank');\n }}\n >\n Show Plan Comparison\n </button>\n )}\n </div>\n </div>\n );\n};\n\n","interface IconProps {\n className?: string;\n}\n\nexport const SearchIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nexport const FilterIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\" />\n </svg>\n);\n\nexport const TrendingUpIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6\" />\n </svg>\n);\n\nexport const LoadingSpinner: React.FC<IconProps> = ({ className = \"w-8 h-8\" }) => (\n <svg className={`${className} animate-spin`} fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n);\n\nexport const CheckCircleIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n);\n\nexport const AddIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n);\n\nexport const CreditCardIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} 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);\n\nexport const DeleteIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n);\n\nexport const DownloadIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 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);\n\nexport const DashboardIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n);\n\nexport const EmailIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n);\n\nexport const ReceiptIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5l-5-5-4 4-3-3m6-6V4a2 2 0 00-2-2H5a2 2 0 00-2 2v16l3-3 3 3 3-3 3 3z\" />\n </svg>\n);\n\nexport const StarBorderIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n);\n\nexport const UpgradeIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />\n </svg>\n);\n\nexport const CancelIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\nexport const AddCardIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 6v6m0 0v6m0-6h6m-6 0H6m12-3h3a3 3 0 013 3v8a3 3 0 01-3 3H6a3 3 0 01-3-3v-8a3 3 0 013-3h3\" />\n </svg>\n);\nexport const WarningIcon: React.FC<IconProps> = ({ className = \"w-5 h-5\" }) => (\n <svg className={className} viewBox=\"0 0 20 20\">\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n);\n","import React from 'react';\nimport type { Plan } from '../../types';\nimport { PlanCard } from './PlanCard';\nimport { LoadingSpinner } from '../icons/CommonIcons';\n\nexport interface PlansGridProps {\n plans: Plan[];\n selectedPlan: Plan | null;\n billingCycle: 'monthly' | 'yearly';\n loading: boolean;\n error: string | null;\n onPlanSelect: (plan: Plan) => void;\n // Currently active subscription plan code to mark the active plan in the grid\n activePlanCode?: string;\n // Next membership plan ID to mark the next active plan in the grid\n nextMembershipPlanId?: string;\n // Optional: map of plan code to desired features to display\n planFeatures?: Record<string, string[]>;\n}\n\nexport const PlansGrid: React.FC<PlansGridProps> = ({\n plans,\n selectedPlan,\n billingCycle,\n loading,\n error,\n onPlanSelect,\n activePlanCode,\n nextMembershipPlanId,\n planFeatures,\n}) => {\n if (loading) {\n return (\n <div className=\"flex justify-center py-8\">\n <LoadingSpinner className=\"h-10 w-10 text-primary animate-spin\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-4 bg-red-50 border border-red-200 text-red-700 rounded-md\">\n {error}\n </div>\n );\n }\n \n\n return (\n <div>\n {plans.map((plan) => {\n // Determine feature list: exact match by code, else prefix match by key (e.g., LITE, PLUS, PREMIUM)\n let featureFilter: string[] | undefined = undefined;\n if (planFeatures) {\n const code = (plan.code || '').toUpperCase();\n // exact\n featureFilter = planFeatures[code] || planFeatures[plan.code];\n if (!featureFilter) {\n const keys = Object.keys(planFeatures);\n const matchKey = keys.find((k) => code.startsWith(k.toUpperCase()));\n if (matchKey) featureFilter = planFeatures[matchKey];\n }\n }\n\n return (\n <PlanCard\n key={plan.id}\n plan={plan}\n isSelected={selectedPlan?.id === plan.id}\n billingCycle={billingCycle}\n onSelect={onPlanSelect}\n isActive={activePlanCode ? plan.code === activePlanCode : false}\n isNextActive={nextMembershipPlanId ? plan.id === nextMembershipPlanId : false}\n featureFilter={featureFilter}\n />\n );\n })}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport type { Plan } from '../../types';\nimport type { DropdownOption } from '../../utils/planUtils';\nimport { BillingCycleToggle } from './BillingCycleToggle';\nimport { TierFilterDropdown } from './TierFilterDropdown';\nimport { PlansGrid } from './PlansGrid';\n\nexport interface PlanSelectorProps {\n // Plans data\n plans: Plan[];\n selectedPlan: Plan | null;\n \n // Filters\n tierFilter: string;\n billingCycle: 'monthly' | 'yearly';\n \n // Loading and error states\n loading: boolean;\n error: string | null;\n \n // Computed values\n dropdownOptions: DropdownOption[];\n currentSelectionText: string;\n \n // Event handlers\n onPlanSelect: (plan: Plan) => void;\n onTierFilterChange: (filter: string) => void;\n onBillingCycleChange: (cycle: 'monthly' | 'yearly') => void;\n // Currently active subscription plan code to disable and mark Active\n activePlanCode?: string;\n // Next membership plan ID to mark the next active plan\n nextMembershipPlanId?: string;\n}\n\nexport const PlanSelector: React.FC<PlanSelectorProps> = ({\n plans,\n selectedPlan,\n tierFilter,\n billingCycle,\n loading,\n error,\n dropdownOptions,\n currentSelectionText,\n onPlanSelect,\n onTierFilterChange,\n onBillingCycleChange,\n activePlanCode,\n nextMembershipPlanId,\n}) => {\n const [isDropdownOpen, setIsDropdownOpen] = useState<boolean>(false);\n\n const handleDropdownToggle = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const handleTierSelect = (value: string) => {\n onTierFilterChange(value);\n setIsDropdownOpen(false);\n };\n\n return (\n <div className=\"mb-6\">\n <h3 \n className=\"text-lg font-semibold mb-2\"\n style={{\n fontSize: 'var(--subos-font-size-plan-title, 1.125rem)',\n fontWeight: 'var(--subos-font-weight-plan-title, 600)',\n color: 'var(--subos-color-plan-title, inherit)'\n }}\n >\n Upgrade your plan\n </h3>\n <div className=\"flex items-center gap-4 justify-between flex-wrap mb-6\">\n <p \n className=\"text-gray-600 mb-0 flex-1 min-w-[260px]\"\n style={{\n fontSize: 'var(--subos-font-size-plan-description, 1rem)',\n fontWeight: 'var(--subos-font-weight-plan-description, 400)',\n color: 'var(--subos-color-plan-description, #6c757d)'\n }}\n >\n Enhance your experience with exclusive access - unlock more features and possibilities!\n </p>\n\n <div className=\"flex items-center gap-4\">\n {/* Custom Tier Filter Dropdown */}\n <TierFilterDropdown\n isOpen={isDropdownOpen}\n onToggle={handleDropdownToggle}\n currentSelectionText={currentSelectionText}\n options={dropdownOptions}\n selectedValue={tierFilter}\n onSelect={handleTierSelect}\n />\n\n {/* Billing Toggle */}\n <BillingCycleToggle\n billingCycle={billingCycle}\n onBillingCycleChange={onBillingCycleChange}\n />\n </div>\n </div>\n\n {/* Plans Grid */}\n <PlansGrid\n plans={plans}\n selectedPlan={selectedPlan}\n billingCycle={billingCycle}\n loading={loading}\n error={error}\n onPlanSelect={onPlanSelect}\n activePlanCode={activePlanCode}\n nextMembershipPlanId={nextMembershipPlanId}\n />\n </div>\n );\n};\n","import React from 'react';\nimport { useCustomerPortal } from '../../hooks/useCustomerPortal';\n\nexport interface ChangeCardButtonProps {\n externalId: string;\n className?: string;\n children?: React.ReactNode;\n onSuccess?: () => void;\n onError?: (error: string) => void;\n returnPath?: string;\n}\n\nexport const ChangeCardButton: React.FC<ChangeCardButtonProps> = ({\n externalId,\n className = '',\n children,\n onSuccess,\n onError,\n returnPath,\n}) => {\n const { openCustomerPortal } = useCustomerPortal({\n onSuccess: () => {\n onSuccess?.();\n },\n onError: (error) => {\n onError?.(error);\n },\n returnPath,\n });\n\n const handleClick = async () => {\n await openCustomerPortal(externalId);\n };\n\n const defaultClassName = \"text-sm font-medium transition-colors duration-200\";\n const finalClassName = className || defaultClassName;\n\n const getStyles = () => ({\n color: 'var(--subos-primary-600, #2563eb)',\n textDecoration: 'none',\n });\n\n return (\n <button\n onClick={handleClick}\n className={finalClassName}\n type=\"button\"\n style={getStyles()}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = 'var(--subos-primary-700, #1d4ed8)';\n e.currentTarget.style.textDecoration = 'underline';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = 'var(--subos-primary-600, #2563eb)';\n e.currentTarget.style.textDecoration = 'none';\n }}\n >\n {children || 'Manage Billing'}\n </button>\n );\n};\n","import React from 'react';\nimport type { PaymentParams } from '../../hooks/payments/usePaymentParams';\nimport { useNavigation } from '../../context/NavigationContext';\n\ninterface PaymentCancelViewProps {\n details: PaymentParams;\n dashboardUrl?: string;\n planUrl?: string;\n supportUrl?: string;\n}\n\nexport const PaymentCancelView: React.FC<PaymentCancelViewProps> = ({ details, dashboardUrl = '/dashboard', planUrl = '/plans', supportUrl = '/support' }) => {\n const { navigateTo } = useNavigation();\n \n const handleTryAgain = () => {\n // If planUrl is provided (external routing), use window.history.back\n // Otherwise use internal navigation\n if (planUrl && planUrl.startsWith('/')) {\n window.history.back();\n } else {\n navigateTo('dashboard');\n }\n };\n \n return (\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md overflow-hidden\">\n {/* Cancel Header */}\n <div className=\"bg-gradient-to-r from-orange-500 to-red-500 text-white p-6 text-center\">\n <div className=\"mb-2 flex justify-center\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n className=\"h-10 w-10 text-white\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M6 6l12 12M6 18L18 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold\">Payment Cancelled</h1>\n <p className=\"text-orange-100 mt-1\">Your payment was not processed</p>\n </div>\n\n {/* Cancellation Details */}\n <div className=\"p-6\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-4\">What Happened?</h2>\n <div className=\"p-4 bg-orange-50 rounded-lg mb-4\">\n <p className=\"text-orange-800\">\n {details.reason\n ? `Reason: ${details.reason}`\n : 'Your payment was cancelled before it was completed. No changes were made to your account.'}\n </p>\n </div>\n\n {(details.gateway || details.sessionId) && (\n <div className=\"space-y-3 mb-4\">\n <h3 className=\"font-medium text-gray-900\">Transaction Details</h3>\n {details.gateway && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Payment Gateway</span>\n <span className=\"font-medium capitalize\">{details.gateway}</span>\n </div>\n )}\n {details.sessionId && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Session ID</span>\n <span className=\"font-medium font-mono text-sm\">{details.sessionId}</span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Status</span>\n <span className=\"font-medium text-orange-600\">Cancelled</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Date</span>\n <span className=\"font-medium\">{new Date().toLocaleDateString()}</span>\n </div>\n </div>\n )}\n </div>\n\n {/* What's Next */}\n <div className=\"mb-6 p-4 bg-blue-50 rounded-lg\">\n <h3 className=\"font-semibold text-blue-900 mb-2\">What's Next?</h3>\n <ul className=\"text-sm text-blue-800 space-y-1\">\n <li>• No changes were made to your account</li>\n <li>• You can try the payment again anytime</li>\n <li>• Contact support if you need assistance</li>\n </ul>\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3\">\n <button\n onClick={handleTryAgain}\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Try Payment Again\n </button>\n\n {planUrl && (\n <button\n onClick={() => {\n if (planUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = planUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Browse Plans\n </button>\n )}\n\n {dashboardUrl && (\n <button\n onClick={() => {\n if (dashboardUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = dashboardUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Return Home\n </button>\n )}\n </div>\n\n {/* Support */}\n <div className=\"mt-6 text-center\">\n <p className=\"text-sm text-gray-500\">\n Having trouble?{' '}\n <a href={supportUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:text-blue-700\">\n Contact Support\n </a>\n </p>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PaymentCancelView;\n","import React from 'react';\nimport type { PaymentParams } from '../../hooks/payments/usePaymentParams';\nimport { useNavigation } from '../../context/NavigationContext';\n\ninterface PaymentSuccessViewProps {\n details: PaymentParams;\n planName?: string;\n planAmount?: number;\n planCurrency?: string;\n invoiceDownloadUrl?: string;\n dashboardUrl?: string;\n supportUrl?: string;\n}\n\nexport const PaymentSuccessView: React.FC<PaymentSuccessViewProps> = ({ \n details, \n planName, \n planAmount, \n planCurrency = 'USD', \n invoiceDownloadUrl, \n dashboardUrl = '/dashboard', \n supportUrl = '/support'\n}) => {\n const { navigateTo } = useNavigation();\n return (\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md overflow-hidden\">\n {/* Success Header */}\n <div className=\"bg-gradient-to-r from-green-500 to-green-600 text-white p-6 text-center\">\n <div className=\"text-4xl mb-2\">✅</div>\n <h1 className=\"text-2xl font-bold\">Payment Successful!</h1>\n <p className=\"text-green-100 mt-1\">Thank you for your purchase</p>\n </div>\n\n {/* Payment Details */}\n <div className=\"p-6\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-4\">Payment Details</h2>\n <div className=\"space-y-3\">\n {details.gateway && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Payment Gateway</span>\n <span className=\"font-medium capitalize\">{details.gateway}</span>\n </div>\n )}\n {planName && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Plan</span>\n <span className=\"font-medium\">{planName}</span>\n </div>\n )}\n {planAmount && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Amount</span>\n <span className=\"font-medium\">${planAmount} {planCurrency}</span>\n </div>\n )}\n {details.paymentId && (\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Payment ID</span>\n <span className=\"font-medium font-mono text-sm\">{details.paymentId}</span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Status</span>\n <span className=\"font-medium text-green-600\">Completed</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-600\">Date</span>\n <span className=\"font-medium\">{new Date().toLocaleDateString()}</span>\n </div>\n </div>\n </div>\n\n {/* Next Steps */}\n <div className=\"mb-6 p-4 bg-blue-50 rounded-lg\">\n <h3 className=\"font-semibold text-blue-900 mb-2\">What's Next?</h3>\n <ul className=\"text-sm text-blue-800 space-y-1\">\n <li>• You'll receive a confirmation email shortly</li>\n <li>• Your subscription is now active</li>\n <li>• Access your dashboard to manage your account</li>\n </ul>\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3\">\n {invoiceDownloadUrl ? (\n <a\n href={invoiceDownloadUrl}\n download\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-md transition-colors block text-center\"\n >\n Download Invoice\n </a>\n ) : (\n <button\n onClick={() => {\n if (dashboardUrl && dashboardUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = dashboardUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Download Invoice\n </button>\n )}\n\n <button\n onClick={() => {\n if (dashboardUrl && dashboardUrl.startsWith('/')) {\n // External URL - use window.location for Next.js routing\n window.location.href = dashboardUrl;\n } else {\n navigateTo('dashboard');\n }\n }}\n className=\"w-full bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-md transition-colors\"\n >\n Go to Dashboard\n </button>\n </div>\n\n {/* Support */}\n <div className=\"mt-6 text-center\">\n <p className=\"text-sm text-gray-500\">\n Need help?{' '}\n <a href={supportUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:text-blue-700\">\n Contact Support\n </a>\n </p>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PaymentSuccessView;\n","import React from \"react\";\n\n// Renders the public/file.svg inside an inline <svg>, so you can pass standard SVG props\n// like className, width, height, etc. You can also override the src via props if needed.\n\ntype Props = React.SVGProps<SVGSVGElement> & {\n src?: string;\n alt?: string;\n};\n\nexport const LogoInline = ({ src, alt = \"Logo\", viewBox = \"0 0 1024 1024\", ...props }: Props) => {\n // Resolve the public asset respecting Vite's base path\n const resolvedSrc = src ?? \"https://upload.wikimedia.org/wikipedia/commons/a/a7/React-icon.svg\";\n\n return (\n <svg\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox}\n aria-label={alt}\n role=\"img\"\n {...props}\n >\n {/* Embed the external SVG asset inside this inline <svg> */}\n <image href={resolvedSrc} width=\"100%\" height=\"100%\" preserveAspectRatio=\"xMidYMid meet\" />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\nimport { LogoInline } from '../LogoInline';\nimport { useNavigation } from '../../context/NavigationContext';\n\ninterface LayoutProps {\n children: ReactNode;\n hideHeader?: boolean;\n hideFooter?: boolean;\n}\n\nexport const Layout: React.FC<LayoutProps> = ({ children, hideHeader = false, hideFooter = false }) => {\n const { navigateTo } = useNavigation();\n\n return (\n <div className=\"flex flex-col min-h-screen w-full\">\n {!hideHeader && (\n <header className=\"bg-white/80 backdrop-blur border-b border-gray-200\">\n <nav className=\"w-full flex items-center justify-between px-4 py-3\">\n <div className=\"flex-grow\">\n <button \n onClick={() => navigateTo('dashboard')} \n className=\"no-underline text-inherit bg-transparent border-0 cursor-pointer p-0\"\n >\n <div className=\"flex items-center\">\n <LogoInline className=\"h-8 w-auto\" alt=\"SubOS\" />\n </div>\n </button>\n </div>\n </nav>\n </header>\n )}\n \n <main className=\"flex-1 w-full\">\n {children}\n </main>\n \n {!hideFooter && (\n <footer className=\"bg-gray-100 py-6 w-full mt-auto\">\n <div className=\"max-w-7xl mx-auto px-4\">\n <p className=\"text-sm text-gray-600 text-center\">\n © {new Date().getFullYear()} SubOS. All rights reserved.\n </p>\n </div>\n </footer>\n )}\n </div>\n );\n};\n\n\n\n","import { useMemo } from 'react';\n\nexport interface PaymentParams {\n gateway?: string;\n sessionId?: string;\n paymentId?: string;\n reason?: string;\n}\n\nexport const usePaymentParams = (): PaymentParams => {\n return useMemo(() => {\n const params = new URLSearchParams(window.location.search);\n return {\n gateway: params.get('gateway') || undefined,\n sessionId: params.get('session_id') || undefined,\n paymentId: params.get('payment_id') || undefined,\n reason: params.get('reason') || undefined,\n };\n }, []);\n};\n","import React, { useMemo } from 'react';\nimport { Layout } from '../components/common/Layout';\nimport { usePaymentParams } from '../hooks/payments/usePaymentParams';\nimport PaymentSuccessView from '../components/payments/PaymentSuccessView';\nimport { useTransactions } from '../hooks/useTransactions';\n\ninterface PaymentSuccessPageProps {\n externalId?: string;\n planName?: string;\n planAmount?: number;\n planCurrency?: string;\n invoiceDownloadUrl?: string;\n dashboardUrl?: string;\n supportUrl?: string;\n}\n\nconst PaymentSuccessPage: React.FC<PaymentSuccessPageProps> = ({ \n externalId: propExternalId,\n planName,\n planAmount,\n planCurrency,\n invoiceDownloadUrl: propInvoiceDownloadUrl,\n dashboardUrl,\n supportUrl\n}) => {\n const paymentDetails = usePaymentParams();\n\n // Resolve externalId from props (passed by parent) or URL params (fallback)\n const urlParams = new URLSearchParams(window.location.search);\n const externalId = propExternalId || urlParams.get('externalId') || '';\n\n // Fetch transactions for this externalId\n const {\n transactions,\n loading: transactionsLoading,\n error: transactionsError,\n } = useTransactions({\n externalId,\n initialFilters: { page: 1, limit: 100 },\n autoFetch: !!externalId,\n });\n\n // Pick the transaction with the highest 'order' value and use its invoice_pdf, or use provided URL\n const invoiceDownloadUrl = useMemo(() => {\n // If a custom invoice URL is provided, use that\n if (propInvoiceDownloadUrl) return propInvoiceDownloadUrl;\n \n // Otherwise, try to get it from transactions\n if (!transactions || transactions.length === 0) return undefined;\n const withOrder = transactions.filter(t => typeof t.order === 'number');\n if (withOrder.length === 0) return undefined;\n const top = withOrder.reduce((max, cur) => (cur.order! > (max.order ?? -Infinity) ? cur : max), withOrder[0]);\n return top.invoice_pdf || undefined;\n }, [transactions, propInvoiceDownloadUrl]);\n\n if (transactionsLoading) {\n return (\n <Layout hideHeader hideFooter>\n <div className=\"container mx-auto p-4\">\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md p-6\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-green-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Processing your payment...</p>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n if (transactionsError) {\n return (\n <Layout hideHeader hideFooter>\n <div className=\"container mx-auto p-4\">\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md p-6\">\n <div className=\"text-center\">\n <div className=\"text-red-600 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Payment Processing Error</h2>\n <p className=\"text-red-600 mb-4\">{transactionsError}</p>\n <div className=\"space-y-2\">\n <button\n onClick={() => window.location.reload()}\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition-colors\"\n >\n Try Again\n </button>\n <button\n onClick={() => window.location.href = '/'}\n className=\"w-full bg-gray-500 hover:bg-gray-600 text-white font-medium py-2 px-4 rounded-md transition-colors\"\n >\n Go Home\n </button>\n </div>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout hideHeader hideFooter>\n <div className=\"container mx-auto p-4\">\n <PaymentSuccessView \n details={paymentDetails} \n planName={planName}\n planAmount={planAmount}\n planCurrency={planCurrency}\n invoiceDownloadUrl={invoiceDownloadUrl}\n dashboardUrl={dashboardUrl}\n supportUrl={supportUrl}\n />\n </div>\n </Layout>\n );\n};\n\nexport default PaymentSuccessPage;\n\n","/**\n * Utility functions for managing upgrade state\n */\n\n// Global variable to store the clear function\nlet globalClearSelectedPlan: (() => void) | null = null;\n\n/**\n * Register a function to clear the selected plan globally\n * This should be called by components that manage plan selection\n */\nexport const registerClearSelectedPlan = (clearFn: () => void) => {\n globalClearSelectedPlan = clearFn;\n};\n\n/**\n * Clear the selected plan from anywhere in the application\n * This can be called when navigating to transactions or other sections\n */\nexport const clearSelectedPlan = () => {\n if (globalClearSelectedPlan) {\n globalClearSelectedPlan();\n }\n};\n\n/**\n * Unregister the clear function (cleanup)\n */\nexport const unregisterClearSelectedPlan = () => {\n globalClearSelectedPlan = null;\n};\n","import React from 'react';\nimport type { Transaction } from '../../types';\nimport { formatDate } from '../../utils/planUtils';\n\nexport interface TransactionItemProps {\n transaction: Transaction;\n className?: string;\n showInvoiceButton?: boolean;\n customStatusColors?: Record<string, string>;\n showFields?: {\n planName?: boolean;\n transactionDate?: boolean;\n amount?: boolean;\n discount?: boolean;\n status?: boolean;\n coupon?: boolean;\n invoice?: boolean;\n };\n dateFormat?: 'date' | 'datetime';\n metaFields?: string[]; // Array of meta field keys to display (max 2)\n}\n\n// Download icon component\nconst DownloadIcon: React.FC<{ className?: string }> = ({ className = \"w-4 h-4\" }) => (\n <svg className={className} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 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);\n\nconst getStatusColor = (status: string, customColors?: Record<string, string>) => {\n if (customColors && customColors[status.toLowerCase()]) {\n return customColors[status.toLowerCase()];\n }\n\n switch (status.toLowerCase()) {\n case 'activated':\n case 'succeeded':\n case 'renewed':\n case 'use_stripe_sdk':\n return 'bg-green-100 text-green-800';\n case 'pending':\n case 'processing':\n return 'bg-yellow-100 text-yellow-800';\n case 'payment_failed':\n return 'bg-red-100 text-red-800';\n default:\n return 'bg-blue-100 text-blue-800';\n }\n};\n\nconst formatCurrency = (amount: string | number, currency?: string | null) => {\n const numericAmount = typeof amount === 'string' ? parseFloat(amount) : amount;\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency || 'USD',\n }).format(numericAmount);\n};\n\n// Helper function to format meta field keys into readable labels\nconst formatMetaLabel = (key: string): string => {\n // Convert snake_case or UPPER_CASE to Title Case\n return key\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n};\n\n// Helper function to format meta field values\nconst formatMetaValue = (value: any): string => {\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return value.toLocaleString();\n }\n if (typeof value === 'string') {\n // If it's \"unlimited\", capitalize it\n if (value.toLowerCase() === 'unlimited') {\n return 'Unlimited';\n }\n return value;\n }\n return String(value);\n};\n\nexport const TransactionItem: React.FC<TransactionItemProps> = ({\n transaction,\n className = '',\n showInvoiceButton = true,\n customStatusColors,\n showFields = {\n planName: true,\n transactionDate: true,\n amount: true,\n discount: true,\n status: true,\n coupon: true,\n invoice: true,\n },\n dateFormat = 'datetime',\n metaFields = [],\n}) => {\n const handleInvoiceDownload = (invoiceUrl: string) => {\n const link = document.createElement('a');\n link.href = invoiceUrl;\n link.download = `invoice-${transaction.id}.pdf`;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // Generate meta fields display string\n const getMetaFieldsDisplay = () => {\n if (metaFields.length === 0 || !transaction.meta) return '';\n \n const metaValues = metaFields\n .slice(0, 2)\n .map((fieldKey) => {\n const value = transaction.meta?.[fieldKey];\n if (value === undefined || value === null) return null;\n return `${formatMetaLabel(fieldKey)}: ${formatMetaValue(value)}`;\n })\n .filter(Boolean);\n \n return metaValues.length > 0 ? ` (${metaValues.join(', ')})` : '';\n };\n\n return (\n <li className={`px-6 py-4 hover:bg-gray-50 ${className}`}>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between\">\n <div>\n {showFields.planName && (\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n {transaction.planName ? `${transaction.planName} Plan${getMetaFieldsDisplay()}` : `Transaction #${transaction.transactionCode || transaction.id}${getMetaFieldsDisplay()}`}\n </p>\n )}\n {showFields.transactionDate && (\n <p className=\"text-sm text-gray-500\">\n {formatDate(transaction.transactionDate || transaction.membershipDate, dateFormat)}\n </p>\n )}\n </div>\n <div className=\"flex items-center space-x-4\">\n {showFields.amount && (\n <div className=\"text-right\">\n <p className=\"text-sm font-medium text-gray-900\">\n {formatCurrency(transaction?.amount, transaction?.currency)}\n </p>\n {showFields.discount && transaction?.discountAmt && parseFloat(transaction?.discountAmt.toString()) > 0 && (\n <p className=\"text-xs text-green-600\">\n -{formatCurrency(transaction?.discountAmt, transaction?.currency)} discount\n </p>\n )}\n </div>\n )}\n {showFields.status && (\n <span\n className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getStatusColor(\n transaction.transactionStatus,\n customStatusColors\n )}`}\n>\n {transaction.transactionStatus === 'payment_failed'\n ? 'Failed'\n : transaction.transactionStatus === 'succeeded'\n ? 'Succeeded'\n : transaction.transactionStatus === 'activated'\n ? 'Activated'\n : transaction.transactionStatus === 'renewed'\n ? 'Renewed'\n : transaction.transactionStatus}\n</span>\n\n )}\n {showFields.invoice && showInvoiceButton && transaction.invoice_pdf && (\n <button\n onClick={() => {\n handleInvoiceDownload(transaction.invoice_pdf!);\n }}\n className=\"inline-flex items-center justify-center p-0 text-blue-600 hover:text-blue-800 transition-colors border-0 bg-transparent focus:outline-none focus:ring-0 focus-visible:outline-none active:outline-none\"\n title=\"Download Invoice\"\n aria-label=\"Download Invoice\"\n >\n <DownloadIcon className=\"w-4 h-4\" />\n \n </button>\n )}\n </div>\n </div>\n {showFields.coupon && transaction.coupon && (\n <div className=\"mt-2\">\n <span className=\"inline-flex items-center px-2 py-1 rounded-md text-xs font-medium bg-purple-100 text-purple-800\">\n Coupon: {transaction.coupon}\n </span>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n};\n\nexport default TransactionItem;\n","import React from 'react';\n\nexport interface TransactionLoadingStateProps {\n message?: string;\n className?: string;\n showSpinner?: boolean;\n rows?: number;\n}\n\nexport const TransactionLoadingState: React.FC<TransactionLoadingStateProps> = ({\n message = \"Loading transactions...\",\n className = '',\n showSpinner = true,\n rows = 5,\n}) => {\n if (showSpinner) {\n return (\n <div className={`flex items-center justify-center py-8 ${className}`}>\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\n <span className=\"ml-2 text-gray-600\">{message}</span>\n </div>\n );\n }\n\n // Skeleton loading state\n return (\n <div className={`bg-white shadow overflow-hidden sm:rounded-md ${className}`}>\n <ul className=\"divide-y divide-gray-200\">\n {Array.from({ length: rows }).map((_, index) => (\n <li key={index} className=\"px-6 py-4 animate-pulse\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-gray-200 rounded w-48\"></div>\n <div className=\"h-3 bg-gray-200 rounded w-32\"></div>\n </div>\n <div className=\"flex items-center space-x-4\">\n <div className=\"text-right space-y-2\">\n <div className=\"h-4 bg-gray-200 rounded w-20\"></div>\n </div>\n <div className=\"h-6 bg-gray-200 rounded-full w-16\"></div>\n <div className=\"h-4 bg-gray-200 rounded w-12\"></div>\n </div>\n </div>\n </div>\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default TransactionLoadingState;\n","import React from 'react';\n\nexport interface TransactionErrorStateProps {\n error: string;\n title?: string;\n onRetry?: () => void;\n className?: string;\n showRetryButton?: boolean;\n}\n\nexport const TransactionErrorState: React.FC<TransactionErrorStateProps> = ({\n error,\n title = \"Error loading transactions\",\n onRetry,\n className = '',\n showRetryButton = true,\n}) => {\n return (\n <div className={`bg-red-50 border border-red-200 rounded-md p-4 ${className}`}>\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-red-800\">{title}</h3>\n <div className=\"mt-2 text-sm text-red-700\">{error}</div>\n {showRetryButton && onRetry && (\n <div className=\"mt-4\">\n <button\n onClick={onRetry}\n className=\"bg-red-100 hover:bg-red-200 text-red-800 font-medium py-2 px-4 rounded text-sm transition-colors duration-200\"\n >\n Try Again\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default TransactionErrorState;\n","import React from 'react';\n\nexport interface TransactionEmptyStateProps {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n className?: string;\n}\n\nexport const TransactionEmptyState: React.FC<TransactionEmptyStateProps> = ({\n title = \"No transactions found\",\n description = \"There are no transactions to display.\",\n icon,\n action,\n className = '',\n}) => {\n const defaultIcon = (\n <svg\n className=\"mx-auto h-12 w-12 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n 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 />\n </svg>\n );\n\n return (\n <div className={`text-center py-8 ${className}`}>\n {icon || defaultIcon}\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">{title}</h3>\n <p className=\"mt-1 text-sm text-gray-500\">{description}</p>\n {action && (\n <div className=\"mt-4\">\n {action}\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionEmptyState;\n","import React from 'react';\nimport type { Transaction } from '../../types';\nimport { TransactionItem } from './TransactionItem';\nimport { TransactionLoadingState } from './TransactionLoadingState';\nimport { TransactionErrorState } from './TransactionErrorState';\nimport { TransactionEmptyState } from './TransactionEmptyState';\n\nexport interface TransactionListProps {\n transactions: Transaction[];\n loading?: boolean;\n error?: string | null;\n onRetry?: () => void;\n className?: string;\n showInvoiceButton?: boolean;\n customStatusColors?: Record<string, string>;\n emptyStateProps?: {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n };\n loadingStateProps?: {\n message?: string;\n showSpinner?: boolean;\n rows?: number;\n };\n}\n\nexport const TransactionList: React.FC<TransactionListProps> = ({\n transactions,\n loading = false,\n error = null,\n onRetry,\n className = '',\n showInvoiceButton = true,\n customStatusColors,\n emptyStateProps,\n loadingStateProps,\n}) => {\n\n if (loading) {\n return (\n <TransactionLoadingState \n className={className}\n {...loadingStateProps}\n />\n );\n }\n\n if (error) {\n return (\n <TransactionErrorState \n error={error}\n onRetry={onRetry}\n className={className}\n />\n );\n }\n\n if (transactions.length === 0) {\n return (\n <TransactionEmptyState \n className={className}\n {...emptyStateProps}\n />\n );\n }\n\n return (\n <div className={`bg-white shadow overflow-hidden sm:rounded-md ${className}`}>\n <ul className=\"divide-y divide-gray-200\">\n {transactions.map((transaction) => (\n <TransactionItem\n key={transaction.id}\n transaction={transaction}\n showInvoiceButton={showInvoiceButton}\n customStatusColors={customStatusColors}\n metaFields={['CANDIDATES']}\n />\n ))}\n </ul>\n </div>\n );\n};\n\n","import React from 'react';\n\nexport interface TransactionStatusFilterProps {\n selectedStatus?: string;\n onStatusChange: (status: string) => void;\n className?: string;\n showAllOption?: boolean;\n customStatuses?: Array<{ value: string; label: string; color?: string }>;\n}\n\nconst defaultStatuses = [\n { value: '', label: 'All Statuses', color: 'bg-blue-600 text-white' },\n { value: 'pending', label: 'Pending', color: 'bg-yellow-100 text-yellow-800' },\n { value: 'succeeded', label: 'Succeeded', color: 'bg-green-100 text-green-800' },\n { value: 'payment_failed', label: 'Payment Failed', color: 'bg-red-100 text-red-800' },\n];\n\nexport const TransactionStatusFilter: React.FC<TransactionStatusFilterProps> = ({\n selectedStatus = '',\n onStatusChange,\n className = '',\n showAllOption = true,\n customStatuses,\n}) => {\n const statuses = customStatuses || defaultStatuses;\n const statusesToShow = showAllOption ? statuses : statuses.filter(s => s.value !== '');\n\n return (\n <div className={`flex flex-wrap gap-2 ${className}`}>\n {statusesToShow.map((status) => (\n <button\n key={status.value}\n onClick={() => onStatusChange(status.value)}\n className={`\n px-3 py-1 rounded-full text-sm font-medium transition-all duration-200\n ${selectedStatus === status.value \n ? (status.color || 'text-white')\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'}\n `}\n >\n {status.label}\n </button>\n ))}\n </div>\n );\n};\n\nexport default TransactionStatusFilter;\n","import React from 'react';\nimport { TransactionStatusFilter } from './TransactionStatusFilter';\nimport type { TransactionFilters } from '../../types';\n\nexport interface TransactionFilterProps {\n filters: TransactionFilters;\n onFiltersChange: (filters: TransactionFilters) => void;\n className?: string;\n showStatusFilter?: boolean;\n showDateFilter?: boolean;\n showSearchFilter?: boolean;\n showClearFilters?: boolean;\n customStatusOptions?: Array<{ value: string; label: string; color?: string }>;\n}\n\nexport const TransactionFilter: React.FC<TransactionFilterProps> = ({\n filters,\n onFiltersChange,\n className = '',\n showStatusFilter = true,\n showDateFilter = true,\n showSearchFilter = true,\n showClearFilters = true,\n customStatusOptions,\n}) => {\n const handleFilterChange = (key: keyof TransactionFilters, value: string | number | undefined) => {\n onFiltersChange({\n ...filters,\n [key]: value,\n page: 1, // Reset to first page when filters change\n });\n };\n\n const clearFilters = () => {\n onFiltersChange({\n page: 1,\n limit: filters.limit || 10,\n });\n };\n\n const hasActiveFilters = filters.status || filters.startDate || filters.endDate;\n\n return (\n <div className={`space-y-4 ${className}`}>\n {/* Search Filter */}\n {showSearchFilter && (\n <div className=\"flex items-center space-x-2\">\n <div className=\"relative flex-1 max-w-md\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg className=\"h-5 w-5 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n <input\n type=\"text\"\n placeholder=\"Search transactions...\"\n className=\"block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-blue-500 focus:border-blue-500 sm:text-sm\"\n onChange={(e) => handleFilterChange('search' as keyof TransactionFilters, e.target.value)}\n />\n </div>\n </div>\n )}\n\n {/* Date Range Filter */}\n {showDateFilter && (\n <div className=\"flex flex-wrap items-center gap-4\">\n <div className=\"flex items-center space-x-2\">\n <label className=\"text-sm font-medium text-gray-700\">From:</label>\n <input\n type=\"date\"\n value={filters.startDate || ''}\n onChange={(e) => handleFilterChange('startDate', e.target.value)}\n className=\"px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n <div className=\"flex items-center space-x-2\">\n <label className=\"text-sm font-medium text-gray-700\">To:</label>\n <input\n type=\"date\"\n value={filters.endDate || ''}\n onChange={(e) => handleFilterChange('endDate', e.target.value)}\n className=\"px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n )}\n\n {/* Status Filter */}\n {showStatusFilter && (\n <div className=\"space-y-2\">\n {/* <label className=\"text-sm font-medium text-gray-700\">Status:</label> */}\n <TransactionStatusFilter\n selectedStatus={filters.status}\n onStatusChange={(status) => handleFilterChange('status', status)}\n customStatuses={customStatusOptions}\n />\n </div>\n )}\n\n {/* Clear Filters */}\n {hasActiveFilters && showClearFilters && (\n <div className=\"flex justify-end\">\n <button\n onClick={clearFilters}\n className=\"text-sm text-blue-600 hover:text-blue-800 font-medium\"\n >\n Clear all filters\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default TransactionFilter;\n","import React from 'react';\nimport type { PaginationMeta } from '../../types';\n\nexport interface TransactionPaginationProps {\n pagination: PaginationMeta;\n onPageChange: (page: number) => void;\n onLimitChange?: (limit: number) => void;\n className?: string;\n showPageSizeSelector?: boolean;\n pageSizeOptions?: number[];\n showInfo?: boolean;\n}\n\nexport const TransactionPagination: React.FC<TransactionPaginationProps> = ({\n pagination,\n onPageChange,\n onLimitChange,\n className = '',\n showPageSizeSelector = true,\n pageSizeOptions = [10, 25, 50, 100],\n showInfo = true,\n}) => {\n const { currentPage, totalPages, totalItems, itemsPerPage, hasNextPage, hasPreviousPage } = pagination;\n\n const getVisiblePages = () => {\n // If there's only one page, just return [1]\n if (totalPages <= 1) {\n return [1];\n }\n \n const delta = 2;\n const range = [];\n const rangeWithDots = [];\n\n for (let i = Math.max(2, currentPage - delta); i <= Math.min(totalPages - 1, currentPage + delta); i++) {\n range.push(i);\n }\n\n if (currentPage - delta > 2) {\n rangeWithDots.push(1, '...');\n } else {\n rangeWithDots.push(1);\n }\n\n rangeWithDots.push(...range);\n\n if (currentPage + delta < totalPages - 1) {\n rangeWithDots.push('...', totalPages);\n } else if (totalPages > 1) {\n rangeWithDots.push(totalPages);\n }\n\n return rangeWithDots;\n };\n\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n // Always show pagination controls, even with one page\n // This allows users to change the page size even when all data fits on one page\n\n return (\n <div className={`flex flex-col sm:flex-row items-center justify-between space-y-3 sm:space-y-0 ${className}`}>\n {/* Info and Page Size Selector */}\n <div className=\"flex flex-col sm:flex-row items-center space-y-2 sm:space-y-0 sm:space-x-4\">\n {showInfo && (\n <div className=\"text-sm text-gray-700\">\n Showing <span className=\"font-medium\">{startItem}</span> to{' '}\n <span className=\"font-medium\">{endItem}</span> of{' '}\n <span className=\"font-medium\">{totalItems}</span> results\n </div>\n )}\n\n {showPageSizeSelector && onLimitChange && (\n <div className=\"flex items-center space-x-2\">\n <label className=\"text-sm text-gray-700\">Show:</label>\n <select\n value={itemsPerPage}\n onChange={(e) => onLimitChange(Number(e.target.value))}\n className=\"px-2 py-1 border border-gray-300 rounded text-sm focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n <span className=\"text-sm text-gray-700\">per page</span>\n </div>\n )}\n </div>\n\n {/* Pagination Controls */}\n <div className=\"flex items-center space-x-1\">\n {/* Previous Button */}\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={!hasPreviousPage || totalPages <= 1}\n className={`\n px-3 py-2 text-sm font-medium rounded-md\n ${hasPreviousPage && totalPages > 1\n ? 'text-gray-500 bg-white border border-gray-300 hover:bg-gray-50 hover:text-gray-700'\n : 'text-gray-300 bg-white border border-gray-300 cursor-not-allowed'\n }\n `}\n >\n Previous\n </button>\n\n {/* Page Numbers */}\n <div className=\"flex items-center space-x-1\">\n {getVisiblePages().map((page, index) => (\n <React.Fragment key={index}>\n {page === '...' ? (\n <span className=\"px-3 py-2 text-sm text-gray-500\">...</span>\n ) : (\n <button\n onClick={() => onPageChange(page as number)}\n className={`\n px-3 py-2 text-sm font-medium rounded-md\n ${currentPage === page\n ? 'bg-blue-600 text-white border border-blue-600'\n : 'text-gray-500 bg-white border border-gray-300 hover:bg-gray-50 hover:text-gray-700'\n }\n `}\n >\n {page}\n </button>\n )}\n </React.Fragment>\n ))}\n </div>\n\n {/* Next Button */}\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={!hasNextPage || totalPages <= 1}\n className={`\n px-3 py-2 text-sm font-medium rounded-md\n ${hasNextPage && totalPages > 1\n ? 'text-gray-500 bg-white border border-gray-300 hover:bg-gray-50 hover:text-gray-700'\n : 'text-gray-300 bg-white border border-gray-300 cursor-not-allowed'\n }\n `}\n >\n Next\n </button>\n </div>\n </div>\n );\n};\n\nexport default TransactionPagination;\n","import React, { useEffect } from 'react';\nimport { TransactionList, TransactionFilter, TransactionPagination } from './index';\nimport { useTransactions } from '../../hooks/useTransactions';\nimport type { TransactionFilters } from '../../types';\n\nexport interface TransactionModalProps {\n isOpen: boolean;\n onClose: () => void;\n externalId: string;\n title?: string;\n}\n\nexport const TransactionModal: React.FC<TransactionModalProps> = ({\n isOpen,\n onClose,\n externalId,\n title = 'Transaction History',\n}) => {\n const {\n transactions,\n loading,\n error,\n filters,\n meta,\n updateFilters,\n fetchTransactions,\n } = useTransactions({\n externalId,\n initialFilters: { page: 1, limit: 10 },\n autoFetch: true, // Enable auto-fetch so it works when modal opens\n });\n\n // Fetch transactions when modal opens\n useEffect(() => {\n if (isOpen && externalId) {\n fetchTransactions();\n }\n }, [isOpen, externalId, fetchTransactions]);\n\n const handlePageChange = (page: number) => {\n updateFilters({ page });\n };\n\n const handleLimitChange = (limit: number) => {\n updateFilters({ limit, page: 1 });\n };\n\n const handleFiltersChange = (newFilters: TransactionFilters) => {\n updateFilters(newFilters);\n };\n\n if (!isOpen) return null;\n\n\n return (\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n {/* Background overlay */}\n <div\n className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity z-0\"\n onClick={onClose}\n />\n\n {/* Modal panel */}\n <div className=\"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-4xl sm:w-full relative z-10\">\n {/* Header */}\n <div className=\"bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4\">\n <div className=\"flex items-center justify-between mb-4\">\n {/* <h3 className=\"text-lg leading-6 font-medium text-gray-900\">\n {title}\n </h3> */}\n <button\n onClick={onClose}\n className=\"bg-white rounded-md text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary\"\n >\n <span className=\"sr-only\">Close</span>\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {/* Filters */}\n <TransactionFilter\n filters={filters}\n onFiltersChange={handleFiltersChange}\n className=\"mb-4\"\n showSearchFilter={false}\n />\n </div>\n\n {/* Content */}\n <div className=\"px-4 pb-4 sm:px-6 sm:pb-6\">\n <TransactionList\n transactions={transactions}\n loading={loading}\n error={error}\n className=\"mb-4\"\n />\n\n {/* Pagination */}\n {meta && (\n <TransactionPagination\n pagination={meta}\n onPageChange={handlePageChange}\n onLimitChange={handleLimitChange}\n pageSizeOptions={[5, 10, 20, 25, 50]}\n />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-primary text-base font-medium text-white hover:bg-primary-dark focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary sm:ml-3 sm:w-auto sm:text-sm\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { Subscription } from '../../types';\nimport { formatDate } from '../../utils/planUtils';\n\nexport interface InfoField {\n key: string;\n label: string;\n getValue: (subscription: Subscription | null) => string | React.ReactNode;\n className?: string;\n}\n\nexport interface SubscriptionInfoGridProps {\n subscription: Subscription | null;\n fields?: InfoField[];\n className?: string;\n gridCols?: 1 | 2 | 3 | 4 | 5;\n showDefaultFields?: boolean;\n loading?: boolean;\n}\n\nconst defaultFields: InfoField[] = [\n {\n key: 'planName',\n label: 'Active Subscription',\n getValue: (subscription) => subscription?.plan?.name || 'N/A',\n },\n {\n key: 'planInterval',\n label: 'Subscription Type',\n getValue: (subscription) => {\n const interval = subscription?.plan?.interval || 'N/A';\n return interval !== 'N/A'\n ? interval.charAt(0) + interval.slice(1).toLowerCase()\n : interval;\n },\n },\n {\n key: 'expiryDate',\n label: 'Subscription Renews on',\n getValue: (subscription) => subscription?.expiryDate ? formatDate(subscription.expiryDate) : 'N/A',\n },\n];\n\nexport const SubscriptionInfoGrid: React.FC<SubscriptionInfoGridProps> = ({\n subscription,\n fields,\n className = '',\n gridCols = 3,\n showDefaultFields = true,\n loading = false,\n}) => {\n const displayFields = fields || (showDefaultFields ? defaultFields : []);\n\n if (displayFields.length === 0) {\n return null;\n }\n\n const getGridClass = () => {\n switch (gridCols) {\n case 1: return 'grid-cols-1';\n case 2: return 'grid-cols-1 md:grid-cols-2';\n case 3: return 'grid-cols-1 md:grid-cols-3';\n case 4: return 'grid-cols-2 md:grid-cols-4';\n case 5: return 'grid-cols-2 md:grid-cols-5';\n default: return 'grid-cols-1 md:grid-cols-3';\n }\n };\n\n\n return (\n <div className={`grid ${getGridClass()} gap-4 ${className}`}>\n {displayFields.map((field) => (\n <div key={field.key} className={`p-4 border border-gray-200 rounded-lg bg-white ${field.className || ''}`}>\n <p \n className=\"text-sm text-gray-500\" \n style={{\n fontSize: 'var(--subos-font-size-subscription-label, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-subscription-label, 400)',\n color: 'var(--subos-color-subscription-label, #6c757d)'\n }}\n >\n {field.key === 'expiryDate' && (subscription?.plan?.canceledOn || subscription?.plan?.name === 'Trial') ? 'Subscription Expires on' : field.label}\n </p>\n <div \n className=\"font-medium\"\n style={{\n fontSize: 'var(--subos-font-size-subscription-value, 1rem)',\n fontWeight: 'var(--subos-font-weight-subscription-value, 500)',\n color: 'var(--subos-color-subscription-value, inherit)'\n }}\n >\n {loading ? 'N/A' : (field.getValue(subscription) || 'N/A')}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nexport default SubscriptionInfoGrid;\n","import React from 'react';\nimport type { Subscription } from '../../types';\n\nexport interface UsageMetric {\n key: string;\n label: string;\n showProgress?: boolean;\n formatValue?: (used: number, total: number) => string;\n}\n\nexport interface SubscriptionUsageDisplayProps {\n subscription: Subscription | null;\n usageMetrics: UsageMetric[];\n className?: string;\n gridCols?: 1 | 2 | 3 | 4 | 5;\n showProgressBars?: boolean;\n loading?: boolean;\n}\n\nexport const SubscriptionUsageDisplay: React.FC<SubscriptionUsageDisplayProps> = ({\n subscription,\n usageMetrics,\n className = '',\n gridCols = 3,\n showProgressBars = false,\n loading = false,\n}) => {\n if (usageMetrics.length === 0) {\n return null;\n }\n\n const getGridClass = () => {\n switch (gridCols) {\n case 1: return 'grid-cols-1';\n case 2: return 'grid-cols-1 md:grid-cols-2';\n case 3: return 'grid-cols-1 md:grid-cols-3';\n case 4: return 'grid-cols-2 md:grid-cols-4';\n case 5: return 'grid-cols-2 md:grid-cols-5';\n default: return 'grid-cols-1 md:grid-cols-3';\n }\n };\n\n const formatDefaultValue = (used: number, total: number) => {\n return `${used}/${total}`;\n };\n\n const getProgressPercentage = (used: number, total: number) => {\n if (total === 0) return 0;\n return Math.min((used / total) * 100, 100);\n };\n\n const getProgressColor = (percentage: number) => {\n if (percentage >= 90) return 'bg-red-500';\n if (percentage >= 75) return 'bg-yellow-500';\n return 'bg-green-500';\n };\n\n\n return (\n <div className={`grid ${getGridClass()} gap-4 ${className}`}>\n {usageMetrics.map((metric) => {\n const used = subscription?.usage?.[metric.key] ?? 0;\n const total = subscription?.meta?.[metric.key] ?? 0;\n \n const displayValue = loading ? 'N/A' : (metric.formatValue \n ? metric.formatValue(used, total)\n : formatDefaultValue(used, total));\n \n const percentage = getProgressPercentage(used, total);\n const shouldShowProgress = showProgressBars || metric.showProgress;\n\n return (\n <div key={metric.key} className=\"p-4 border border-gray-200 rounded-lg bg-white space-y-1\">\n <p \n className=\"text-sm text-gray-500\" \n style={{\n fontSize: 'var(--subos-font-size-subscription-label, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-subscription-label, 400)',\n color: 'var(--subos-color-subscription-label, #6c757d)'\n }}\n >\n {metric.label}\n </p>\n <p \n className=\"font-medium\"\n style={{\n fontSize: 'var(--subos-font-size-subscription-value, 1rem)',\n fontWeight: 'var(--subos-font-weight-subscription-value, 500)',\n color: 'var(--subos-color-subscription-value, inherit)'\n }}\n >\n {displayValue}\n </p>\n {shouldShowProgress && total > 0 && (\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className={`h-2 rounded-full transition-all duration-300 ${getProgressColor(percentage)}`}\n style={{ width: `${percentage}%` }}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default SubscriptionUsageDisplay;\n","import React from 'react';\n\nexport interface SubscriptionTransactionButtonProps {\n onClick: () => void;\n className?: string;\n children?: React.ReactNode;\n disabled?: boolean;\n variant?: 'text' | 'button';\n}\n\nexport const SubscriptionTransactionButton: React.FC<SubscriptionTransactionButtonProps> = ({\n onClick,\n className = '',\n children = 'Transactions',\n disabled = false,\n variant = 'text',\n}) => {\n const baseClasses = variant === 'text'\n ? 'transition-colors duration-200 disabled:cursor-not-allowed'\n : 'px-4 py-2 text-white rounded-md transition-colors duration-200 disabled:cursor-not-allowed';\n\n const getStyles = () => {\n const baseStyles = {\n fontSize: 'var(--subos-font-size-button-text, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-button-text, 500)',\n };\n\n if (variant === 'text') {\n return {\n ...baseStyles,\n color: disabled \n ? 'var(--subos-muted-foreground, #64748b)' \n : 'var(--subos-color-button-text, var(--subos-primary-600, #2563eb))',\n textDecoration: 'none',\n };\n } else {\n return {\n ...baseStyles,\n backgroundColor: disabled \n ? 'var(--subos-muted, #f1f5f9)' \n : 'var(--subos-primary-500, #3f51b5)',\n color: disabled ? 'var(--subos-muted-foreground, #64748b)' : 'white',\n };\n }\n };\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`${baseClasses} ${className}`}\n style={getStyles()}\n onMouseEnter={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-primary-700, #1d4ed8)';\n e.currentTarget.style.textDecoration = 'underline';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-600, #2563eb)';\n } : undefined}\n onMouseLeave={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = 'var(--subos-primary-600, #2563eb)';\n e.currentTarget.style.textDecoration = 'none';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #3f51b5)';\n } : undefined}\n >\n {children}\n </button>\n );\n};\n\nexport default SubscriptionTransactionButton;\n","import React from 'react';\n\nexport interface SubscriptionCancelButtonProps {\n onClick: () => void;\n className?: string;\n children?: React.ReactNode;\n disabled?: boolean;\n variant?: 'text' | 'button';\n title?: string;\n}\n\nexport const SubscriptionCancelButton: React.FC<SubscriptionCancelButtonProps> = ({\n onClick,\n className = '',\n children = 'Cancel Renewal',\n disabled = false,\n variant = 'text',\n title,\n}) => {\n const baseClasses = variant === 'text'\n ? 'transition-colors duration-200 disabled:cursor-not-allowed'\n : 'px-4 py-2 text-white rounded-md transition-colors duration-200 disabled:cursor-not-allowed';\n\n const getStyles = () => {\n const baseStyles = {\n fontSize: 'var(--subos-font-size-button-text, 0.875rem)',\n fontWeight: 'var(--subos-font-weight-button-text, 500)',\n };\n\n if (variant === 'text') {\n return {\n ...baseStyles,\n color: disabled \n ? 'var(--subos-muted-foreground, #64748b)' \n : '#dc2626', // Keep red for cancel action\n textDecoration: 'none',\n };\n } else {\n return {\n ...baseStyles,\n backgroundColor: disabled \n ? 'var(--subos-muted, #f1f5f9)' \n : '#dc2626', // Keep red for cancel action\n color: disabled ? 'var(--subos-muted-foreground, #64748b)' : 'white',\n };\n }\n };\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`${baseClasses} ${className}`}\n style={getStyles()}\n title={title}\n onMouseEnter={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = '#b91c1c';\n e.currentTarget.style.textDecoration = 'underline';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = '#b91c1c';\n } : undefined}\n onMouseLeave={!disabled && variant === 'text' ? (e) => {\n e.currentTarget.style.color = '#dc2626';\n e.currentTarget.style.textDecoration = 'none';\n } : !disabled && variant === 'button' ? (e) => {\n e.currentTarget.style.backgroundColor = '#dc2626';\n } : undefined}\n >\n {children}\n </button>\n );\n};\n\nexport default SubscriptionCancelButton;\n","import React from 'react';\nimport { SubscriptionTransactionButton } from './SubscriptionTransactionButton';\nimport { SubscriptionCancelButton } from './SubscriptionCancelButton';\nimport type { Subscription } from '../../types';\n\nexport interface ActionButton {\n key: string;\n component: React.ReactNode;\n show?: boolean;\n}\n\nexport interface SubscriptionActionButtonsProps {\n onTransactionClick?: () => void;\n onCancelClick?: () => void;\n customActions?: ActionButton[];\n showTransactionButton?: boolean;\n showCancelButton?: boolean;\n className?: string;\n layout?: 'horizontal' | 'vertical';\n spacing?: 'tight' | 'normal' | 'loose';\n subscription?: Subscription | null;\n}\n\nexport const SubscriptionActionButtons: React.FC<SubscriptionActionButtonsProps> = ({\n onTransactionClick,\n onCancelClick,\n customActions = [],\n showTransactionButton = true,\n showCancelButton = true,\n className = '',\n layout = 'horizontal',\n spacing = 'normal',\n subscription,\n}) => {\n const getSpacingClass = () => {\n const isVertical = layout === 'vertical';\n switch (spacing) {\n case 'tight':\n return isVertical ? 'space-y-1' : 'space-x-1'; // Made tighter\n case 'normal':\n return isVertical ? 'space-y-2' : 'space-x-3'; // Reduced spacing\n case 'loose':\n return isVertical ? 'space-y-4' : 'space-x-8';\n default:\n return isVertical ? 'space-y-2' : 'space-x-3'; // Reduced spacing\n }\n };\n\n const containerClass = layout === 'vertical' \n ? `flex flex-col ${getSpacingClass()}`\n : `flex items-center ${getSpacingClass()}`; // Added items-center for better alignment\n\n // Determine if cancel button should be disabled and the tooltip message\n const getCancelButtonState = () => {\n if (!subscription) {\n return { disabled: false, tooltip: undefined };\n }\n\n const canceledOn = subscription.plan?.canceledOn;\n\n // Check if already canceled\n if (canceledOn) {\n return {\n disabled: true,\n tooltip: 'Renewal already canceled — it will end after this billing cycle.',\n };\n }\n\n // Check if plan is Starter or Trail (case-insensitive)\n if (subscription.plan?.fixedCost === 0) {\n return {\n disabled: true,\n tooltip: 'You’re on a starter/free-trial plan — there’s no active renewal to cancel.',\n };\n }\n\n return { disabled: false, tooltip: undefined };\n };\n\n const cancelButtonState = getCancelButtonState();\n\n const defaultActions: ActionButton[] = [\n {\n key: 'transaction',\n component: onTransactionClick && (\n <SubscriptionTransactionButton onClick={onTransactionClick} />\n ),\n show: showTransactionButton && !!onTransactionClick,\n },\n {\n key: 'cancel',\n component: onCancelClick && (\n <SubscriptionCancelButton \n onClick={onCancelClick} \n disabled={cancelButtonState.disabled}\n title={cancelButtonState.tooltip}\n />\n ),\n show: showCancelButton && !!onCancelClick,\n },\n ];\n\n const allActions = [...defaultActions, ...customActions];\n const visibleActions = allActions.filter(action => action.show !== false && action.component);\n\n if (visibleActions.length === 0) {\n return null;\n }\n\n return (\n <div className={`${containerClass} ${className}`}>\n {visibleActions.map((action) => (\n <div key={action.key}>\n {action.component}\n </div>\n ))}\n </div>\n );\n};\n\nexport default SubscriptionActionButtons;\n","import React from 'react';\n\nexport interface CancelOptions {\n cancellationMode?: 'immediate' | 'endOfPeriod';\n cancellationReason?: string;\n}\n\nexport interface SubscriptionCancelModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: (options: CancelOptions) => Promise<void>;\n loading?: boolean;\n title?: string;\n description?: string;\n buttonText?: string;\n subscription?: any; // Add subscription prop to avoid prop errors\n}\n\n\nexport const SubscriptionCancelModal: React.FC<SubscriptionCancelModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n loading = false,\n title = 'Cancel Subscription',\n description = 'Are you sure you want to cancel your subscription? This action cannot be undone.',\n buttonText = 'Cancel Renewal',\n subscription: _subscription, // Accept subscription prop but don't use it\n ..._props // Capture any other props to avoid React warnings\n}) => {\n // Static values as requested\n const cancellationMode = 'endOfPeriod';\n const cancellationReason = 'subscription_user_canceled_request';\n\n const handleConfirm = async () => {\n await onConfirm({\n cancellationMode,\n cancellationReason,\n });\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n {/* Background overlay */}\n <div\n className=\"fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity\"\n onClick={onClose}\n />\n\n {/* Modal panel */}\n <div className=\"relative bg-white rounded-2xl shadow-xl w-[560px] max-w-[90vw] z-10\">\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"absolute top-4 right-4 text-gray-400 focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors z-20\"\n style={{\n // default color stays gray; hover handled below to mirror theme usage in other components\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = 'var(--subos-primary-600, #303f9f)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = '';\n }}\n onFocus={(e) => {\n // emulate themed ring color if Tailwind var ring color isn't applied\n e.currentTarget.style.setProperty('--tw-ring-color', 'var(--subos-primary-500, #3f51b5)');\n }}\n >\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n {/* Header */}\n <div className=\"bg-white px-6 pt-3 pb-0 sm:px-8 sm:pt-4 sm:pb-0 rounded-t-2xl\">\n <div className=\"flex flex-col items-center text-center\">\n <div className=\"flex items-center justify-center h-12 w-12 rounded-xl bg-yellow-100\">\n <svg className=\"h-6 w-6 text-yellow-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <h3 className=\"mt-4 text-xl font-semibold text-gray-900\">\n {title}\n </h3>\n <p className=\"mt-2 mb-4 text-sm text-gray-500\">\n {description}\n </p>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 pt-1 pb-5 sm:px-8 flex justify-center rounded-b-2xl\">\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={loading}\n className=\"inline-flex justify-center rounded-md border border-transparent shadow-sm px-6 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:text-sm disabled:bg-red-300 disabled:cursor-not-allowed relative z-10\"\n style={{ minHeight: '40px' }}\n >\n {loading ? 'Cancelling...' : buttonText}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default SubscriptionCancelModal;\n","import { WarningIcon } from '../icons/CommonIcons';\nimport type { Subscription } from '../../types';\n\nexport interface ScheduledPlanNotificationProps {\n subscription: Subscription | null;\n className?: string;\n}\n\nexport const ScheduledPlanNotification: React.FC<ScheduledPlanNotificationProps> = ({\n subscription,\n className = '',\n}) => {\n if (!subscription?.nextMembership) {\n return null;\n }\n\n const formatInterval = (interval: string | undefined) => {\n if (!interval) return '';\n return interval.charAt(0).toUpperCase() + interval.slice(1).toLowerCase();\n };\n\n const nextPlan = subscription.nextMembership.plan;\n \n // Return null if plan details are missing (e.g., nextMembership.plan is an empty object)\n if (!nextPlan || !nextPlan.name) {\n return null;\n }\n\n const metrics = nextPlan.charges && Array.isArray(nextPlan.charges) && nextPlan.charges.length > 0\n ? `(${nextPlan.charges.map(charge => \n `${charge.billableMetric?.name || 'Metric'}: ${charge.properties?.units?.toLocaleString() || 0}`\n ).join(', ')}) `\n : '';\n\n return (\n <div className={`mb-4 p-4 bg-yellow-50 border border-yellow-200 rounded-md flex items-start gap-3 ${className}`}>\n <div className=\"text-yellow-600 mt-0.5\">\n <WarningIcon className=\"w-5 h-5\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm text-yellow-800\">\n Your subscription will change to{' '}\n <span className=\"font-semibold\">\n {nextPlan.name} {formatInterval(nextPlan.interval)} {metrics}\n </span>\n plan on{' '}\n <span className=\"font-semibold\">\n {new Date(subscription.nextMembership.membershipDate).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })}\n </span>\n </p>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { Subscription } from '../../types';\nimport { formatDate } from '../../utils/planUtils';\n\nexport interface GracePeriodNotificationProps {\n subscription: Subscription | null;\n className?: string;\n}\n\nexport const GracePeriodNotification: React.FC<GracePeriodNotificationProps> = ({\n subscription,\n className = '',\n}) => {\n if (!subscription?.meta?.isGracePeriod) {\n return null;\n }\n\n const startDate = subscription.meta.gracePeriodStart;\n const endDate = subscription.meta.gracePeriodEnd;\n \n // Calculate remaining days if endDate is available\n let remainingDays = subscription.remainingGracePeriodDays ?? 0;\n if (endDate) {\n const end = new Date(endDate).getTime();\n const now = new Date().getTime();\n const diff = end - now;\n remainingDays = Math.max(0, Math.ceil(diff / (1000 * 60 * 60 * 24)));\n }\n\n return (\n <div className={`mb-4 p-4 bg-orange-50 border border-orange-200 rounded-lg flex items-start gap-3 ${className}`}>\n <div className=\"text-orange-500 mt-0.5\">\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-bold text-orange-900 mb-1\">Grace Period Active</h3>\n <p className=\"text-sm text-orange-800\">\n Your <span className=\"font-bold\">7-day</span> grace period started on{' '}\n <span className=\"font-bold\">{startDate ? formatDate(startDate) : 'N/A'}</span>.\n You have <span className=\"font-bold text-orange-900 text-base\">{remainingDays} days remaining</span> to update your payment method to continue your subscription without interruption.\n </p>\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { clearSelectedPlan } from '../../utils/upgradeUtils';\nimport type { Subscription } from '../../types';\nimport { TransactionModal } from '../transaction/TransactionModal';\nimport { useCancelSubscription } from '../../hooks/useCancelSubscription';\nimport { ChangeCardButton } from '../payments/ChangeCardButton';\nimport { SubscriptionInfoGrid } from './SubscriptionInfoGrid';\nimport { SubscriptionUsageDisplay, type UsageMetric } from './SubscriptionUsageDisplay';\nimport { SubscriptionActionButtons } from './SubscriptionActionButtons';\nimport { SubscriptionCancelModal, type CancelOptions } from './SubscriptionCancelModal';\nimport { ScheduledPlanNotification } from './ScheduledPlanNotification';\nimport { GracePeriodNotification } from './GracePeriodNotification';\n\nexport interface SubscriptionDetailsProps {\n subscription: Subscription | null;\n externalId: string;\n onSubscriptionCancelled?: () => void;\n usageMetrics?: UsageMetric[];\n showTransactionButton?: boolean;\n showCancelButton?: boolean;\n showChangeCardButton?: boolean;\n customActions?: React.ReactNode[];\n className?: string;\n loading?: boolean;\n}\n\nexport const SubscriptionDetails: React.FC<SubscriptionDetailsProps> = ({\n subscription,\n externalId,\n onSubscriptionCancelled,\n usageMetrics = [\n { key: 'ACTIVE_JOBS', label: 'Active Jobs' },\n { key: 'CANDIDATES', label: 'Candidates' },\n ],\n showTransactionButton = true,\n showCancelButton = true,\n showChangeCardButton = true,\n customActions = [],\n className = '',\n loading = false,\n}) => {\n const [isTransactionModalOpen, setIsTransactionModalOpen] = useState(false);\n const [showCancelConfirmation, setShowCancelConfirmation] = useState(false);\n\n const [localSubscription, setLocalSubscription] = useState<Subscription | null>(subscription);\n\n useEffect(() => {\n setLocalSubscription(subscription);\n }, [subscription]);\n\n const { cancelSubscription, loading: cancelLoading } = useCancelSubscription({\n onSuccess: () => {\n setShowCancelConfirmation(false);\n\n // Optimistically mark the subscription as canceled locally so UI updates immediately\n setLocalSubscription((prev) => {\n if (!prev) return prev;\n return {\n ...prev,\n plan: prev.plan\n ? {\n ...prev.plan,\n canceledOn: prev.plan.canceledOn || new Date().toISOString(),\n }\n : prev.plan,\n };\n });\n\n onSubscriptionCancelled?.();\n // Show success message or notification here\n alert('Subscription cancelled successfully');\n },\n onError: (error) => {\n // Show error message or notification here\n alert(`Failed to cancel subscription: ${error}`);\n },\n });\n\n const handleTransactionClick = () => {\n // Hide upgrade summary selection when navigating to transactions\n clearSelectedPlan();\n setIsTransactionModalOpen(true);\n };\n\n const handleCancelClick = () => {\n // Hide upgrade summary selection when initiating cancellation flow\n clearSelectedPlan();\n setShowCancelConfirmation(true);\n };\n\n const handleConfirmCancel = async (options: CancelOptions) => {\n await cancelSubscription(externalId, {\n cancellationMode: options.cancellationMode || 'endOfPeriod',\n cancellationReason: options.cancellationReason || 'subscription_user_canceled_request'\n });\n };\n\n const handleCancelModalClose = () => {\n setShowCancelConfirmation(false);\n };\n return (\n <>\n {/* Email summary and change button */}\n\n {/* Subscription Details Header */}\n <div className={`mb-6 ${className}`}>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold\">Subscription Details</h2>\n <div className=\"flex gap-4\">\n <SubscriptionActionButtons\n onTransactionClick={showTransactionButton ? handleTransactionClick : undefined}\n onCancelClick={showCancelButton ? handleCancelClick : undefined}\n showTransactionButton={showTransactionButton}\n showCancelButton={showCancelButton}\n subscription={localSubscription}\n customActions={[\n ...(showChangeCardButton ? [{\n key: 'changeCard',\n component: (\n <ChangeCardButton\n externalId={externalId}\n onSuccess={() => {\n // Optional: Show success message or refresh data\n }}\n onError={(error) => {\n // Optional: Show error message\n alert(`Failed to open payment portal: ${error}`);\n }}\n >\n Manage Billing\n </ChangeCardButton>\n ),\n show: true,\n }] : []),\n ...customActions.map((action, index) => ({\n key: `custom-${index}`,\n component: action,\n show: true,\n })),\n ]}\n />\n </div>\n </div>\n\n {/* Scheduled Plan Notification */}\n <ScheduledPlanNotification subscription={localSubscription} />\n \n {/* Grace Period Notification */}\n <GracePeriodNotification subscription={localSubscription} />\n \n {/* Info + Usage in one row with equal spacing */}\n <div className=\"grid grid-cols-1 md:grid-cols-5 gap-4\">\n {/* Subscription Info Grid */}\n <SubscriptionInfoGrid\n subscription={localSubscription}\n loading={loading}\n className=\"!contents\"\n gridCols={usageMetrics.length > 0 ? 3 : 5}\n />\n\n {/* Usage Display */}\n {usageMetrics.length > 0 && (\n <SubscriptionUsageDisplay\n subscription={localSubscription}\n loading={loading}\n usageMetrics={usageMetrics}\n gridCols={Math.min(usageMetrics.length, 3) as 1 | 2 | 3}\n className=\"!contents\"\n />\n )}\n </div>\n </div>\n\n {/* Transaction Modal */}\n <TransactionModal\n isOpen={isTransactionModalOpen}\n onClose={() => setIsTransactionModalOpen(false)}\n externalId={externalId}\n />\n\n {/* Cancellation Confirmation Modal */}\n <SubscriptionCancelModal\n isOpen={showCancelConfirmation}\n onClose={handleCancelModalClose}\n onConfirm={handleConfirmCancel}\n loading={cancelLoading}\n />\n </>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport type { Plan } from '../../types';\nimport { subscriptionApi } from '../../api/client';\nimport { getCurrencySymbol, formatCurrencyAmount } from '../../utils/currency';\nimport { useCurrency } from '../../contexts';\n\ninterface CheckoutInfo {\n planName: string;\n planPrice: number;\n planInterval: string;\n proration: number;\n planCode: string;\n planCurrency: string;\n contactSupport?: boolean;\n}\n\nexport interface UpgradeSummaryProps {\n selectedPlan: Plan | null;\n currentPlan?: Plan | null;\n externalId: string;\n onUpgrade: () => void;\n isVisible?: boolean;\n billableMetricCode?: string;\n}\n\nexport const UpgradeSummary: React.FC<UpgradeSummaryProps> = ({\n selectedPlan,\n currentPlan,\n externalId,\n onUpgrade,\n isVisible = true,\n billableMetricCode,\n}) => {\n const { currency } = useCurrency();\n const [checkoutInfo, setCheckoutInfo] = useState<CheckoutInfo | null>(null);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n // Determine which plan to display - selected plan takes priority, then current plan\n const planToDisplay = selectedPlan || currentPlan;\n \n if (!planToDisplay || !isVisible || Number(planToDisplay.fixedCost) === 0) {\n setCheckoutInfo(null);\n return;\n }\n\n // If showing current plan (no selected plan), create mock checkout info\n if (!selectedPlan && currentPlan) {\n const mockCheckoutInfo: CheckoutInfo = {\n planName: currentPlan.name,\n planPrice: currentPlan.fixedCost,\n planInterval: currentPlan.interval,\n proration: 0, // No proration for current plan\n planCode: currentPlan.code,\n planCurrency: currentPlan.currency,\n contactSupport: false,\n };\n setCheckoutInfo(mockCheckoutInfo);\n return;\n }\n\n // Fetch checkout info for selected plan (upgrade scenario)\n const fetchCheckoutInfo = async () => {\n setLoading(true);\n try {\n const response = await subscriptionApi.checkoutInfo(selectedPlan!.code, externalId, {\n billableMetricCode,\n currency\n });\n const dataWrapper = (response as { data?: { success?: boolean; data?: CheckoutInfo } })?.data;\n if (dataWrapper?.success && dataWrapper?.data) {\n setCheckoutInfo(dataWrapper.data as CheckoutInfo);\n }\n } catch (error) {\n console.error('Failed to fetch checkout info:', error);\n } finally {\n setLoading(false);\n }\n };\n\n fetchCheckoutInfo();\n }, [selectedPlan, currentPlan, externalId, isVisible, billableMetricCode, currency]);\n\n // Determine which plan to display - selected plan takes priority, then current plan\n const planToDisplay = selectedPlan || currentPlan;\n const isShowingCurrentPlan = !selectedPlan && currentPlan;\n \n if (!planToDisplay || !isVisible || Number(planToDisplay.fixedCost) === 0 || loading || !checkoutInfo) {\n return null;\n }\n const displayInfo = checkoutInfo;\n\n const intervalDisplay = displayInfo.planInterval === 'MONTHLY' ? 'Mo' : 'Yr';\n const dueToday = displayInfo.proration > 0 ? displayInfo.proration : displayInfo.planPrice;\n const shouldContactSupport = !!displayInfo.contactSupport;\n const currencyCode = displayInfo.planCurrency || currentPlan?.currency || currency;\n const currencySymbol = getCurrencySymbol(currencyCode);\n\n return (\n <div className='w-full'>\n <div className='w-full'>\n <div \n className='shadow-xl rounded-md border px-4 py-3 backdrop-blur-md'\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n borderColor: 'var(--subos-border, #e2e8f0)',\n boxShadow: 'var(--subos-shadow-card-hover, 0 8px 24px rgba(0,0,0,0.15))'\n }}\n >\n <div className='flex items-center justify-between'>\n <div>\n <p \n className='text-sm'\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n Summary\n </p>\n <h2 \n className='text-sm font-medium'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n {displayInfo.planName}\n </h2>\n </div>\n <div className='flex items-center gap-6'>\n <div className='text-right'>\n <h3 \n className='text-2xl font-semibold'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n {currencySymbol}{formatCurrencyAmount(displayInfo?.planPrice || 0, currencyCode)}/{intervalDisplay}\n </h3>\n <p \n className='text-sm font-semibold mt-0.5'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n (Inclusive Tax)\n </p>\n </div>\n <div className='flex items-center gap-4'>\n <div className='text-right'>\n <p \n className='text-sm'\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n {isShowingCurrentPlan ? 'Current Cost' : 'Due Today'}\n </p>\n <p \n className='text-xl font-semibold'\n style={{ color: 'var(--subos-foreground, #1e293b)' }}\n >\n {currencySymbol}{formatCurrencyAmount(dueToday || 0, currencyCode)}\n </p>\n {displayInfo.proration > 0 && !isShowingCurrentPlan && (\n <p \n className='text-xs mt-1'\n style={{ color: 'var(--subos-muted-foreground, #64748b)' }}\n >\n (Includes prorated discount for unused days of your current plan)\n </p>\n )}\n {shouldContactSupport && (\n <p className='text-sm mt-2' style={{ color: '#dc2626' }}>\n You are choosing to switch from a yearly to monthly plan. Please contact our support team for assistance.\n </p>\n )}\n </div>\n <button\n onClick={isShowingCurrentPlan || shouldContactSupport ? undefined : onUpgrade}\n disabled={loading || !!isShowingCurrentPlan || shouldContactSupport}\n className='text-white px-8 py-3 rounded-lg font-medium transition-all duration-200 text-sm disabled:opacity-50 shadow-md'\n style={{\n backgroundColor: loading || isShowingCurrentPlan || shouldContactSupport\n ? 'var(--subos-muted, #f1f5f9)' \n : 'var(--subos-primary-500, #ef4444)',\n color: loading || isShowingCurrentPlan || shouldContactSupport ? 'var(--subos-muted-foreground, #64748b)' : 'white',\n border: isShowingCurrentPlan || shouldContactSupport\n ? '1px solid var(--subos-border, #e2e8f0)'\n : 'none',\n boxShadow: loading || isShowingCurrentPlan || shouldContactSupport ? 'none' : '0 4px 12px rgba(239, 68, 68, 0.3)',\n cursor: isShowingCurrentPlan || shouldContactSupport ? 'not-allowed' : 'pointer'\n }}\n onMouseEnter={!loading && !isShowingCurrentPlan && !shouldContactSupport ? (e) => {\n e.currentTarget.style.backgroundColor = '#dc2626';\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = '0 6px 16px rgba(239, 68, 68, 0.4)';\n } : undefined}\n onMouseLeave={!loading && !isShowingCurrentPlan && !shouldContactSupport ? (e) => {\n e.currentTarget.style.backgroundColor = 'var(--subos-primary-500, #ef4444)';\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(239, 68, 68, 0.3)';\n } : undefined}\n title={isShowingCurrentPlan ? 'This is your current active plan' : shouldContactSupport ? 'Please contact support for this change' : undefined}\n >\n {loading ? 'Loading...' : isShowingCurrentPlan ? 'Current Plan' : (checkoutInfo?.proration === 0 && currentPlan?.fixedCost !== 0 ? 'Confirm Changes' : 'Upgrade Now')}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n","import React, { createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\n\nexport interface SubOSTheme {\n // Primary colors\n primaryColors?: {\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n };\n \n // Secondary colors\n secondaryColors?: {\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n };\n \n // Neutral colors\n background?: string;\n foreground?: string;\n muted?: string;\n mutedForeground?: string;\n border?: string;\n accent?: string;\n accentForeground?: string;\n \n // Typography\n fontFamily?: string;\n \n // Font sizes for specific elements\n fontSizes?: {\n subscriptionLabel?: string;\n subscriptionValue?: string;\n buttonText?: string;\n planTitle?: string;\n planDescription?: string;\n planCardTitle?: string;\n planCardDescription?: string;\n planCardInfo?: string;\n planCardFeature?: string;\n };\n \n // Font weights for specific elements\n fontWeights?: {\n subscriptionLabel?: number | string;\n subscriptionValue?: number | string;\n buttonText?: number | string;\n planTitle?: number | string;\n planDescription?: number | string;\n planCardTitle?: number | string;\n planCardDescription?: number | string;\n planCardInfo?: number | string;\n planCardFeature?: number | string;\n };\n \n // Font colors for specific elements\n fontColors?: {\n subscriptionLabel?: string;\n subscriptionValue?: string;\n buttonText?: string;\n planTitle?: string;\n planDescription?: string;\n planCardTitle?: string;\n planCardDescription?: string;\n planCardInfo?: string;\n planCardFeature?: string;\n };\n \n // Layout\n borderRadius?: string;\n \n // Shadows\n shadowCard?: string;\n shadowCardHover?: string;\n}\n\ninterface SubOSThemeContextType {\n theme: SubOSTheme;\n setTheme: (theme: SubOSTheme) => void;\n}\n\nconst SubOSThemeContext = createContext<SubOSThemeContextType | undefined>(undefined);\n\nexport const useSubOSTheme = () => {\n const context = useContext(SubOSThemeContext);\n if (!context) {\n throw new Error('useSubOSTheme must be used within a SubOSThemeProvider');\n }\n return context;\n};\n\ninterface SubOSThemeProviderProps {\n children: ReactNode;\n theme?: SubOSTheme;\n className?: string;\n}\n\nexport const SubOSThemeProvider: React.FC<SubOSThemeProviderProps> = ({ \n children, \n theme = {},\n className = ''\n}) => {\n const [currentTheme, setCurrentTheme] = React.useState<SubOSTheme>(theme);\n \n // Generate CSS custom properties from theme\n const cssVariables = React.useMemo(() => {\n const vars: Record<string, string> = {};\n \n // Primary colors\n if (currentTheme.primaryColors) {\n Object.entries(currentTheme.primaryColors).forEach(([key, value]) => {\n if (value) vars[`--subos-primary-${key}`] = value;\n });\n }\n \n // Secondary colors\n if (currentTheme.secondaryColors) {\n Object.entries(currentTheme.secondaryColors).forEach(([key, value]) => {\n if (value) vars[`--subos-secondary-${key}`] = value;\n });\n }\n \n // Neutral colors\n if (currentTheme.background) vars['--subos-background'] = currentTheme.background;\n if (currentTheme.foreground) vars['--subos-foreground'] = currentTheme.foreground;\n if (currentTheme.muted) vars['--subos-muted'] = currentTheme.muted;\n if (currentTheme.mutedForeground) vars['--subos-muted-foreground'] = currentTheme.mutedForeground;\n if (currentTheme.border) vars['--subos-border'] = currentTheme.border;\n if (currentTheme.accent) vars['--subos-accent'] = currentTheme.accent;\n if (currentTheme.accentForeground) vars['--subos-accent-foreground'] = currentTheme.accentForeground;\n \n // Typography\n if (currentTheme.fontFamily) vars['--subos-font-family'] = currentTheme.fontFamily;\n \n // Font sizes\n if (currentTheme.fontSizes) {\n Object.entries(currentTheme.fontSizes).forEach(([key, value]) => {\n if (value) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars[`--subos-font-size-${cssKey}`] = value;\n }\n });\n }\n \n // Font weights\n if (currentTheme.fontWeights) {\n Object.entries(currentTheme.fontWeights).forEach(([key, value]) => {\n if (value !== undefined) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars[`--subos-font-weight-${cssKey}`] = String(value);\n }\n });\n }\n \n // Font colors\n if (currentTheme.fontColors) {\n Object.entries(currentTheme.fontColors).forEach(([key, value]) => {\n if (value) {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n vars[`--subos-color-${cssKey}`] = value;\n }\n });\n }\n \n // Layout\n if (currentTheme.borderRadius) vars['--subos-border-radius'] = currentTheme.borderRadius;\n \n // Shadows\n if (currentTheme.shadowCard) vars['--subos-shadow-card'] = currentTheme.shadowCard;\n if (currentTheme.shadowCardHover) vars['--subos-shadow-card-hover'] = currentTheme.shadowCardHover;\n \n return vars;\n }, [currentTheme]);\n \n const contextValue = React.useMemo(() => ({\n theme: currentTheme,\n setTheme: setCurrentTheme,\n }), [currentTheme]);\n \n return (\n <SubOSThemeContext.Provider value={contextValue}>\n <div \n className={`subos-container ${className}`}\n style={cssVariables}\n >\n {children}\n </div>\n </SubOSThemeContext.Provider>\n );\n};\n\n// Hook to easily apply theme from host application\nexport const useApplyHostTheme = (hostTheme?: Partial<SubOSTheme>) => {\n const { setTheme } = useSubOSTheme();\n \n React.useEffect(() => {\n if (hostTheme) {\n setTheme(hostTheme);\n }\n }, [hostTheme, setTheme]);\n};\n","import React from 'react';\nimport type { PaginationMeta } from '../../types';\n\nexport interface PaginationProps {\n meta: PaginationMeta;\n onPageChange: (page: number) => void;\n onLimitChange?: (limit: number) => void;\n showLimitSelector?: boolean;\n limitOptions?: number[];\n className?: string;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n meta,\n onPageChange,\n onLimitChange,\n showLimitSelector = true,\n limitOptions = [10, 25, 50, 100],\n className = '',\n}) => {\n const { currentPage, totalPages, totalItems, itemsPerPage, hasNextPage, hasPreviousPage } = meta;\n\n // Generate page numbers to display\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisiblePages = 7;\n \n if (totalPages <= maxVisiblePages) {\n // Show all pages if total pages is small\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Show first page\n pages.push(1);\n \n if (currentPage > 4) {\n pages.push('...');\n }\n \n // Show pages around current page\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n \n for (let i = start; i <= end; i++) {\n if (i !== 1 && i !== totalPages) {\n pages.push(i);\n }\n }\n \n if (currentPage < totalPages - 3) {\n pages.push('...');\n }\n \n // Show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n \n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n const startItem = (currentPage - 1) * itemsPerPage + 1;\n const endItem = Math.min(currentPage * itemsPerPage, totalItems);\n\n return (\n <div className={`flex flex-col sm:flex-row items-center justify-between gap-4 ${className}`}>\n {/* Items info */}\n <div className=\"text-sm text-gray-700\">\n Showing {startItem} to {endItem} of {totalItems} results\n </div>\n\n <div className=\"flex items-center gap-4\">\n {/* Limit selector */}\n {showLimitSelector && onLimitChange && (\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"limit-select\" className=\"text-sm text-gray-700\">\n Show:\n </label>\n <select\n id=\"limit-select\"\n value={itemsPerPage}\n onChange={(e) => onLimitChange(Number(e.target.value))}\n className=\"border border-gray-300 rounded px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent\"\n >\n {limitOptions.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Pagination controls */}\n <div className=\"flex items-center gap-1\">\n {/* Previous button */}\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={!hasPreviousPage}\n className=\"px-3 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-l-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n\n {/* Page numbers */}\n {pageNumbers.map((page, index) => (\n <React.Fragment key={index}>\n {page === '...' ? (\n <span className=\"px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300\">\n ...\n </span>\n ) : (\n <button\n onClick={() => onPageChange(page as number)}\n className={`px-3 py-2 text-sm font-medium border ${\n currentPage === page\n ? 'bg-primary text-white border-primary'\n : 'text-gray-700 bg-white border-gray-300 hover:bg-gray-50'\n }`}\n >\n {page}\n </button>\n )}\n </React.Fragment>\n ))}\n\n {/* Next button */}\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={!hasNextPage}\n className=\"px-3 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-r-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { Layout } from '../components/common/Layout';\nimport { useSubscription } from '../hooks/useSubscription';\nimport { usePlans } from '../hooks/usePlans';\nimport { SubscriptionDetails } from '../components/subscription/SubscriptionDetails';\nimport { PlanSelector } from '../components/plans/PlanSelector';\nimport { UpgradeSummary } from '../components/upgrade/UpgradeSummary';\nimport { UpgradeProvider, useCurrency } from '../contexts';\nimport { registerClearSelectedPlan, unregisterClearSelectedPlan } from '../utils/upgradeUtils';\n\nexport interface DashboardPageProps {\n externalId: string;\n}\n\nexport const DashboardPage: React.FC<DashboardPageProps> = ({ \n externalId, \n}) => {\n // Custom hooks\n const subscription = useSubscription();\n const plans = usePlans();\n const { currency, isLoading: isCurrencyLoading } = useCurrency();\n \n // Track the last loaded externalId to prevent unnecessary re-fetches\n const lastLoadedIdRef = useRef<string | null>(null);\n\n // Load dashboard data on mount or when externalId/currency changes\n useEffect(() => {\n // Wait for currency detection to complete before fetching\n if (isCurrencyLoading) return;\n \n const cacheKey = `${externalId}-${currency}`;\n if (lastLoadedIdRef.current !== cacheKey) {\n subscription.fetchSubscription(externalId);\n plans.fetchPlans();\n lastLoadedIdRef.current = cacheKey;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalId, currency, isCurrencyLoading]); // Re-fetch when currency changes\n\n // Register the clear function for global access\n useEffect(() => {\n registerClearSelectedPlan(plans.clearSelectedPlan);\n return () => {\n unregisterClearSelectedPlan();\n };\n }, [plans.clearSelectedPlan]);\n\n // Handle upgrade\n const handleUpgrade = () => {\n plans.handleUpgrade(externalId);\n };\n\n return (\n <UpgradeProvider>\n <Layout>\n <div className=\"max-w-7xl mx-auto w-full h-full py-8 px-4 pb-24\">\n <SubscriptionDetails\n subscription={subscription.subscription}\n loading={subscription.loading}\n externalId={externalId}\n onSubscriptionCancelled={() => {\n // Refresh subscription data after cancellation\n subscription.fetchSubscription(externalId);\n // Clear selected plan when subscription is cancelled\n plans.clearSelectedPlan();\n }}\n />\n\n <PlanSelector\n plans={plans.filteredPlans}\n selectedPlan={plans.selectedPlan}\n tierFilter={plans.tierFilter}\n billingCycle={plans.billingCycle}\n loading={plans.loading}\n error={plans.error}\n dropdownOptions={plans.dropdownOptions}\n currentSelectionText={plans.currentSelectionText}\n onPlanSelect={plans.handlePlanSelect}\n onTierFilterChange={plans.setTierFilter}\n onBillingCycleChange={plans.setBillingCycle}\n activePlanCode={subscription.subscription?.plan.code}\n nextMembershipPlanId={subscription.subscription?.nextMembership?.planId}\n />\n\n <UpgradeSummary\n selectedPlan={plans.selectedPlan}\n currentPlan={subscription.subscription?.plan ? {\n id: subscription.subscription.plan.code,\n name: subscription.subscription.plan.name,\n code: subscription.subscription.plan.code,\n fixedCost: subscription.subscription.plan.fixedCost,\n paymentMode: subscription.subscription.plan.paymentMode,\n interval: subscription.subscription.plan.interval,\n successRedirectUrl: '',\n order: 0,\n isDefault: false,\n intervalCount: 1,\n projectId: '',\n charges: subscription.subscription.plan.charges || [],\n currency: subscription.subscription?.currency\n } : null}\n externalId={externalId}\n onUpgrade={handleUpgrade}\n isVisible={!!plans.selectedPlan || !!subscription.subscription?.plan}\n />\n </div>\n </Layout>\n </UpgradeProvider>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { getApiBaseUrl, getHeaders } from '../../api/config';\nimport type { PaymentParams } from './usePaymentParams';\n\ninterface CancelHookResult {\n loading: boolean;\n error: string | null;\n}\n\nexport const useProcessPaymentCancel = (params: PaymentParams): CancelHookResult => {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const run = async () => {\n try {\n const qs = new URLSearchParams({\n ...(params.gateway ? { gateway: params.gateway } : {}),\n ...(params.sessionId ? { session_id: params.sessionId } : {}),\n ...(params.paymentId ? { payment_id: params.paymentId } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n }).toString();\n\n const url = `${getApiBaseUrl()}/api/payments/cancel?${qs}`;\n await fetch(url, {\n headers: getHeaders(),\n credentials: 'include',\n });\n } catch (err: any) {\n setError(err?.message || 'Failed to process cancellation');\n } finally {\n setLoading(false);\n }\n };\n\n run();\n // run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return { loading, error };\n};\n","import React from 'react';\nimport { Layout } from '../components/common/Layout';\nimport { usePaymentParams } from '../hooks/payments/usePaymentParams';\nimport { useProcessPaymentCancel } from '../hooks/payments/useProcessPaymentCancel';\nimport PaymentCancelView from '../components/payments/PaymentCancelView';\n\nconst PaymentCancelPage: React.FC = () => {\n const details = usePaymentParams();\n const { loading } = useProcessPaymentCancel(details);\n\n if (loading) {\n return (\n <Layout>\n <div className=\"container mx-auto p-4\">\n <div className=\"max-w-md mx-auto bg-white rounded-lg shadow-md p-6\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-orange-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">Processing cancellation...</p>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout>\n <div className=\"container mx-auto p-4\">\n <PaymentCancelView details={details} />\n </div>\n </Layout>\n );\n};\n\nexport default PaymentCancelPage;\n","import { DashboardPage } from './pages/DashboardPage';\nimport PaymentSuccessPage from './pages/PaymentSuccessPage';\nimport PaymentCancelPage from './pages/PaymentCancelPage';\nimport { CurrencyProvider } from './context/CurrencyContext';\nimport { NavigationProvider, useNavigation } from './context/NavigationContext';\nimport { SubscriptionProvider } from './context/SubscriptionContext';\n\nexport interface AppProps {\n externalId: string;\n initialPage?: 'dashboard' | 'payment-success' | 'payment-cancel';\n}\n\n// Helper function to detect initial page from URL\nconst getInitialPageFromURL = (): 'dashboard' | 'payment-success' | 'payment-cancel' => {\n if (typeof window === 'undefined') return 'dashboard';\n \n const urlParams = new URLSearchParams(window.location.search);\n const pathname = window.location.pathname;\n \n // Check URL path\n if (pathname.includes('payment-success')) return 'payment-success';\n if (pathname.includes('payment-cancel')) return 'payment-cancel';\n \n // Check URL parameters\n if (urlParams.has('payment-success') || urlParams.get('status') === 'success') {\n return 'payment-success';\n }\n if (urlParams.has('payment-cancel') || urlParams.get('status') === 'cancel') {\n return 'payment-cancel';\n }\n \n return 'dashboard';\n};\n\nconst AppContent = ({ externalId }: AppProps) => {\n const { currentPage } = useNavigation();\n\n return (\n <>\n <style>\n {`\n :root {\n --primary-light: #3f51b5;\n --primary-dark: #3f51b5;\n }\n `}\n </style>\n {currentPage === 'dashboard' && <DashboardPage externalId={externalId} />}\n {currentPage === 'payment-success' && <PaymentSuccessPage />}\n {currentPage === 'payment-cancel' && <PaymentCancelPage />}\n </>\n );\n};\n\nexport const App = function App({ externalId, initialPage }: AppProps) {\n // Use provided initialPage or detect from URL\n const detectedPage = initialPage || getInitialPageFromURL();\n \n return (\n <CurrencyProvider>\n <SubscriptionProvider>\n <NavigationProvider initialPage={detectedPage}>\n <AppContent externalId={externalId} />\n </NavigationProvider>\n </SubscriptionProvider>\n </CurrencyProvider>\n );\n}\n"]}
|