@reevit/react 0.4.1 → 0.4.2
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.d.mts +31 -2
- package/dist/index.d.ts +31 -2
- package/dist/index.js +243 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +244 -10
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +212 -82
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/index.ts","../src/api/client.ts","../src/hooks/useReevit.ts","../src/components/PaymentMethodSelector.tsx","../src/components/MobileMoneyForm.tsx","../src/bridges/PaystackBridge.tsx","../src/bridges/HubtelBridge.tsx","../src/bridges/FlutterwaveBridge.tsx","../src/bridges/MonnifyBridge.tsx","../src/bridges/MPesaBridge.tsx","../src/bridges/StripeBridge.tsx","../src/components/ReevitCheckout.tsx"],"names":["useEffect","useCallback","jsxs","jsx","useRef","useState","result","error"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Utility functions for the Reevit React SDK\n */\n\n/**\n * Format amount for display\n */\nexport function formatAmount(amount: number, currency: string): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n minimumFractionDigits: 2,\n });\n\n // Amount is in smallest unit (pesewas, kobo, cents)\n return formatter.format(amount / 100);\n}\n\n/**\n * Generate a unique reference if not provided\n */\nexport function generateReference(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `reevit_${timestamp}_${random}`;\n}\n\n/**\n * Validate phone number for mobile money\n */\nexport function validatePhone(phone: string, network?: string): boolean {\n // Remove spaces and dashes\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Check for valid Ghana phone number formats\n const patterns = {\n mtn: /^(0|233|\\+233)?(24|54|55|59)\\d{7}$/,\n vodafone: /^(0|233|\\+233)?(20|50)\\d{7}$/,\n airteltigo: /^(0|233|\\+233)?(26|27|56|57)\\d{7}$/,\n };\n\n if (network && patterns[network as keyof typeof patterns]) {\n return patterns[network as keyof typeof patterns].test(cleaned);\n }\n\n // If no network specified, check all patterns\n return Object.values(patterns).some((pattern) => pattern.test(cleaned));\n}\n\n/**\n * Format phone number for display\n */\nexport function formatPhone(phone: string): string {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Format as 0XX XXX XXXX\n if (cleaned.startsWith('0') && cleaned.length === 10) {\n return `${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6)}`;\n }\n\n // Format +233 XX XXX XXXX\n if (cleaned.startsWith('+233') && cleaned.length === 13) {\n return `${cleaned.slice(0, 4)} ${cleaned.slice(4, 6)} ${cleaned.slice(6, 9)} ${cleaned.slice(9)}`;\n }\n\n return phone;\n}\n\n/**\n * Detect mobile money network from phone number\n */\nexport function detectNetwork(phone: string): string | null {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n const prefixes: Record<string, string[]> = {\n mtn: ['024', '054', '055', '059', '23324', '23354', '23355', '23359'],\n vodafone: ['020', '050', '23320', '23350'],\n airteltigo: ['026', '027', '056', '057', '23326', '23327', '23356', '23357'],\n };\n\n for (const [network, networkPrefixes] of Object.entries(prefixes)) {\n for (const prefix of networkPrefixes) {\n if (cleaned.startsWith(prefix) || cleaned.startsWith('0' + prefix.slice(3))) {\n return network;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Create CSS variables from theme\n */\nexport function createThemeVariables(theme: Record<string, string | undefined>): Record<string, string> {\n const variables: Record<string, string> = {};\n\n if (theme.primaryColor) {\n variables['--reevit-primary'] = theme.primaryColor;\n }\n if (theme.backgroundColor) {\n variables['--reevit-background'] = theme.backgroundColor;\n }\n if (theme.textColor) {\n variables['--reevit-text'] = theme.textColor;\n }\n if (theme.borderRadius) {\n variables['--reevit-radius'] = theme.borderRadius;\n }\n if (theme.fontFamily) {\n variables['--reevit-font'] = theme.fontFamily;\n }\n\n return variables;\n}\n\n/**\n * Merge class names\n */\nexport function cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Reevit API Client\n * \n * Handles communication with the Reevit backend for payment operations.\n */\n\nimport type { PaymentMethod, ReevitCheckoutConfig, PaymentError } from '../types';\n\n// API Response Types (matching backend handlers_payments.go)\nexport interface CreatePaymentIntentRequest {\n amount: number;\n currency: string;\n method: string;\n country: string;\n customer_id?: string;\n phone?: string;\n metadata?: Record<string, unknown>;\n description?: string;\n policy?: {\n prefer?: string[];\n max_amount?: number;\n blocked_bins?: string[];\n allowed_bins?: string[];\n velocity_max_per_minute?: number;\n };\n}\n\nexport interface PaymentIntentResponse {\n id: string;\n connection_id: string;\n provider: string;\n status: string;\n client_secret: string;\n psp_public_key?: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n reference?: string;\n}\n\n/**\n * Response from creating a Hubtel session token.\n * The token provides secure, short-lived access to Hubtel checkout without exposing credentials.\n */\nexport interface HubtelSessionResponse {\n /** Short-lived session token for Hubtel checkout */\n token: string;\n /** Hubtel merchant account number */\n merchantAccount: string;\n /** Token expiry time in seconds */\n expiresInSeconds: number;\n /** Unix timestamp when the token expires */\n expiresAt: number;\n}\n\nexport interface ConfirmPaymentRequest {\n provider_ref_id: string;\n provider_data?: Record<string, unknown>;\n}\n\nexport interface PaymentDetailResponse {\n id: string;\n connection_id: string;\n provider: string;\n method: string;\n status: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n customer_id?: string;\n client_secret: string;\n provider_ref_id?: string;\n metadata?: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n /** Payment source type (payment_link, api, subscription) */\n source?: 'payment_link' | 'api' | 'subscription';\n /** ID of the source (payment link ID, subscription ID, etc.) */\n source_id?: string;\n /** Human-readable description of the source (e.g., payment link name) */\n source_description?: string;\n}\n\nexport interface APIErrorResponse {\n code: string;\n message: string;\n details?: Record<string, string>;\n}\n\n// API Client configuration\nexport interface ReevitAPIClientConfig {\n /** Your Reevit public key */\n publicKey: string;\n /** Base URL for the Reevit API (defaults to production) */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n// Default API base URLs\nconst API_BASE_URL_PRODUCTION = 'https://api.reevit.io';\nconst API_BASE_URL_SANDBOX = 'https://sandbox-api.reevit.io';\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\n\n/**\n * Determines if a public key is for sandbox mode\n */\nfunction isSandboxKey(publicKey: string): boolean {\n // Support various test/sandbox key prefixes\n return publicKey.startsWith('pk_test_') ||\n publicKey.startsWith('pk_sandbox_') ||\n publicKey.startsWith('pfk_test_') ||\n publicKey.startsWith('pfk_sandbox_');\n}\n\n/**\n * Creates a PaymentError from an API error response\n */\nfunction createPaymentError(response: Response, errorData: APIErrorResponse): PaymentError {\n return {\n code: errorData.code || 'api_error',\n message: errorData.message || 'An unexpected error occurred',\n details: {\n httpStatus: response.status,\n ...errorData.details,\n },\n };\n}\n\n/**\n * Reevit API Client\n */\nexport class ReevitAPIClient {\n private readonly publicKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(config: ReevitAPIClientConfig) {\n this.publicKey = config.publicKey;\n this.baseUrl = config.baseUrl || (isSandboxKey(config.publicKey)\n ? API_BASE_URL_SANDBOX\n : API_BASE_URL_PRODUCTION);\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Makes an authenticated API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<{ data?: T; error?: PaymentError }> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Generate idempotency key for POST requests\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Reevit-Key': this.publicKey,\n 'X-Reevit-Client': '@reevit/react',\n 'X-Reevit-Client-Version': '0.3.2',\n };\n\n // Add idempotency key for mutating requests\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n headers['Idempotency-Key'] = `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseData = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n return {\n error: createPaymentError(response, responseData as APIErrorResponse),\n };\n }\n\n return { data: responseData as T };\n } catch (err) {\n clearTimeout(timeoutId);\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return {\n error: {\n code: 'request_timeout',\n message: 'The request timed out. Please try again.',\n },\n };\n }\n\n if (err.message.includes('Failed to fetch') || err.message.includes('NetworkError')) {\n return {\n error: {\n code: 'network_error',\n message: 'Unable to connect to Reevit. Please check your internet connection.',\n },\n };\n }\n }\n\n return {\n error: {\n code: 'unknown_error',\n message: 'An unexpected error occurred. Please try again.',\n },\n };\n }\n }\n\n /**\n * Creates a payment intent\n */\n async createPaymentIntent(\n config: ReevitCheckoutConfig,\n method: PaymentMethod,\n country: string = 'GH'\n ): Promise<{ data?: PaymentIntentResponse; error?: PaymentError }> {\n // Build metadata with customer_email for PSP providers that require it\n const metadata: Record<string, unknown> = { ...config.metadata };\n if (config.email) {\n metadata.customer_email = config.email;\n }\n if (config.phone) {\n metadata.customer_phone = config.phone;\n }\n\n const request: CreatePaymentIntentRequest = {\n amount: config.amount,\n currency: config.currency,\n method: this.mapPaymentMethod(method),\n country,\n customer_id: config.email || (config.metadata?.customerId as string | undefined),\n phone: config.phone,\n metadata,\n };\n\n return this.request<PaymentIntentResponse>('POST', '/v1/payments/intents', request);\n }\n\n /**\n * Retrieves a payment intent by ID\n */\n async getPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('GET', `/v1/payments/${paymentId}`);\n }\n\n /**\n * Confirms a payment intent after PSP callback (public endpoint)\n */\n async confirmPaymentIntent(paymentId: string, clientSecret: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/confirm-intent?client_secret=${clientSecret}`);\n }\n\n /**\n * Confirms a payment after PSP callback (authenticated endpoint)\n */\n async confirmPayment(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/confirm`);\n }\n\n /**\n * Cancels a payment intent\n */\n async cancelPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/cancel`);\n }\n\n /**\n * Creates a Hubtel session token for secure checkout.\n * This endpoint generates a short-lived token that maps to Hubtel credentials server-side,\n * avoiding exposure of sensitive credentials to the client.\n *\n * @param paymentId - The payment intent ID for Hubtel checkout\n * @returns Hubtel session with token, merchant account, and expiry information\n */\n async createHubtelSession(paymentId: string): Promise<{ data?: HubtelSessionResponse; error?: PaymentError }> {\n return this.request<HubtelSessionResponse>('POST', `/v1/payments/hubtel/sessions/${paymentId}`);\n }\n\n /**\n * Maps SDK payment method to backend format\n */\n private mapPaymentMethod(method: PaymentMethod): string {\n switch (method) {\n case 'card':\n return 'card';\n case 'mobile_money':\n return 'mobile_money';\n case 'bank_transfer':\n return 'bank_transfer';\n default:\n return method;\n }\n }\n}\n\n/**\n * Creates a new Reevit API client instance\n */\nexport function createReevitClient(config: ReevitAPIClientConfig): ReevitAPIClient {\n return new ReevitAPIClient(config);\n}\n","/**\n * useReevit hook\n * Core hook for managing Reevit checkout state and API interactions\n */\n\nimport { useCallback, useReducer, useEffect, useRef } from 'react';\nimport type {\n ReevitCheckoutConfig,\n CheckoutState,\n PaymentMethod,\n PaymentResult,\n PaymentError,\n PaymentIntent,\n} from '../types';\nimport { generateReference } from '../utils';\nimport { ReevitAPIClient, type PaymentIntentResponse } from '../api';\n\n// State shape\ninterface ReevitState {\n status: CheckoutState;\n paymentIntent: PaymentIntent | null;\n selectedMethod: PaymentMethod | null;\n error: PaymentError | null;\n result: PaymentResult | null;\n}\n\n// Actions\ntype ReevitAction =\n | { type: 'INIT_START' }\n | { type: 'INIT_SUCCESS'; payload: PaymentIntent }\n | { type: 'INIT_ERROR'; payload: PaymentError }\n | { type: 'SELECT_METHOD'; payload: PaymentMethod }\n | { type: 'PROCESS_START' }\n | { type: 'PROCESS_SUCCESS'; payload: PaymentResult }\n | { type: 'PROCESS_ERROR'; payload: PaymentError }\n | { type: 'RESET' }\n | { type: 'CLOSE' };\n\n// Initial state\nconst initialState: ReevitState = {\n status: 'idle',\n paymentIntent: null,\n selectedMethod: null,\n error: null,\n result: null,\n};\n\n// Reducer\nfunction reevitReducer(state: ReevitState, action: ReevitAction): ReevitState {\n switch (action.type) {\n case 'INIT_START':\n return { ...state, status: 'loading', error: null };\n case 'INIT_SUCCESS':\n return {\n ...state,\n status: 'ready',\n paymentIntent: action.payload,\n selectedMethod:\n action.payload.availableMethods?.length === 1 ? action.payload.availableMethods[0] : null,\n };\n case 'INIT_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'SELECT_METHOD':\n return { ...state, status: 'method_selected', selectedMethod: action.payload };\n case 'PROCESS_START':\n return { ...state, status: 'processing', error: null };\n case 'PROCESS_SUCCESS':\n return { ...state, status: 'success', result: action.payload };\n case 'PROCESS_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'RESET':\n return { ...initialState, status: 'ready', paymentIntent: state.paymentIntent };\n case 'CLOSE':\n return { ...state, status: 'closed' };\n default:\n return state;\n }\n}\n\ninterface UseReevitOptions {\n config: ReevitCheckoutConfig;\n onSuccess?: (result: PaymentResult) => void;\n onError?: (error: PaymentError) => void;\n onClose?: () => void;\n onStateChange?: (state: CheckoutState) => void;\n /** Custom API base URL (for testing or self-hosted deployments) */\n apiBaseUrl?: string;\n}\n\n/**\n * Maps PSP provider names from backend to PSP type used by bridges\n */\nfunction mapProviderToPsp(provider: string): 'paystack' | 'hubtel' | 'flutterwave' | 'monnify' | 'mpesa' | 'stripe' {\n const providerLower = provider.toLowerCase();\n if (providerLower.includes('paystack')) return 'paystack';\n if (providerLower.includes('hubtel')) return 'hubtel';\n if (providerLower.includes('flutterwave')) return 'flutterwave';\n if (providerLower.includes('monnify')) return 'monnify';\n if (providerLower.includes('mpesa') || providerLower.includes('m-pesa')) return 'mpesa';\n if (providerLower.includes('stripe')) return 'stripe';\n // Default to paystack if unknown\n return 'paystack';\n}\n\n\n/**\n * Maps backend payment intent response to SDK PaymentIntent type\n */\nfunction mapToPaymentIntent(\n response: PaymentIntentResponse,\n config: ReevitCheckoutConfig\n): PaymentIntent {\n return {\n id: response.id,\n clientSecret: response.client_secret,\n pspPublicKey: response.psp_public_key,\n amount: response.amount,\n currency: response.currency,\n status: response.status as 'pending' | 'processing' | 'succeeded' | 'failed' | 'cancelled',\n recommendedPsp: mapProviderToPsp(response.provider),\n availableMethods: config.paymentMethods || ['card', 'mobile_money'],\n reference: response.reference || response.id, // Use backend reference or fallback to ID\n connectionId: response.connection_id,\n provider: response.provider,\n feeAmount: response.fee_amount,\n feeCurrency: response.fee_currency,\n netAmount: response.net_amount,\n metadata: config.metadata,\n };\n}\n\nexport function useReevit(options: UseReevitOptions) {\n const { config, onSuccess, onError, onClose, onStateChange, apiBaseUrl } = options;\n const [state, dispatch] = useReducer(reevitReducer, {\n ...initialState,\n status: config.initialPaymentIntent ? 'ready' : 'idle',\n paymentIntent: config.initialPaymentIntent || null,\n selectedMethod:\n config.initialPaymentIntent?.availableMethods?.length === 1\n ? config.initialPaymentIntent.availableMethods[0]\n : null,\n });\n\n // Create API client ref (stable across re-renders)\n const apiClientRef = useRef<ReevitAPIClient | null>(null);\n\n // Guard against duplicate initialize() calls (React StrictMode)\n const initializingRef = useRef(!!config.initialPaymentIntent);\n\n // Update state if config.initialPaymentIntent changes\n useEffect(() => {\n if (config.initialPaymentIntent) {\n if (!state.paymentIntent || state.paymentIntent.id !== config.initialPaymentIntent.id) {\n dispatch({ type: 'INIT_SUCCESS', payload: config.initialPaymentIntent });\n initializingRef.current = true;\n }\n }\n }, [config.initialPaymentIntent, state.paymentIntent?.id]);\n\n // Initialize API client\n if (!apiClientRef.current) {\n apiClientRef.current = new ReevitAPIClient({\n publicKey: config.publicKey,\n baseUrl: apiBaseUrl,\n });\n }\n\n // Notify on state changes\n useEffect(() => {\n onStateChange?.(state.status);\n }, [state.status, onStateChange]);\n\n // Initialize payment intent\n const initialize = useCallback(\n async (method?: PaymentMethod) => {\n // Guard against duplicate calls (especially in React StrictMode)\n if (initializingRef.current) {\n return;\n }\n initializingRef.current = true;\n\n dispatch({ type: 'INIT_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n initializingRef.current = false;\n throw new Error('API client not initialized');\n }\n\n // Generate reference if not provided\n const reference = config.reference || generateReference();\n\n // Determine country from currency (can be enhanced with IP detection)\n const country = detectCountryFromCurrency(config.currency);\n\n // Select payment method to send to backend\n const paymentMethod = method || config.paymentMethods?.[0] || 'card';\n\n // Call the Reevit API to create a payment intent\n const { data, error } = await apiClient.createPaymentIntent(\n { ...config, reference },\n paymentMethod,\n country\n );\n\n if (error) {\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n if (!data) {\n const noDataError: PaymentError = {\n code: 'INIT_FAILED',\n message: 'No data received from API',\n recoverable: true,\n };\n dispatch({ type: 'INIT_ERROR', payload: noDataError });\n onError?.(noDataError);\n initializingRef.current = false;\n return;\n }\n\n // Map response to PaymentIntent\n const paymentIntent = mapToPaymentIntent(data, { ...config, reference });\n\n dispatch({ type: 'INIT_SUCCESS', payload: paymentIntent });\n // Don't reset initializingRef here - once initialized, stay initialized until reset()\n } catch (err) {\n const error: PaymentError = {\n code: 'INIT_FAILED',\n message: err instanceof Error ? err.message : 'Failed to initialize checkout',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n initializingRef.current = false;\n }\n },\n [config, onError, apiBaseUrl]\n );\n\n // Select payment method\n const selectMethod = useCallback((method: PaymentMethod) => {\n dispatch({ type: 'SELECT_METHOD', payload: method });\n }, []);\n\n // Process payment - called after PSP bridge returns success\n const processPayment = useCallback(\n async (paymentData: Record<string, unknown>) => {\n if (!state.paymentIntent || !state.selectedMethod) {\n return;\n }\n\n dispatch({ type: 'PROCESS_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n throw new Error('API client not initialized');\n }\n\n // Confirm the payment with the backend\n // If we have a clientSecret, use the public confirm-intent endpoint\n const clientSecret = state.paymentIntent.clientSecret;\n const { data, error } = clientSecret\n ? await apiClient.confirmPaymentIntent(state.paymentIntent.id, clientSecret)\n : await apiClient.confirmPayment(state.paymentIntent.id);\n\n if (error) {\n console.error('[useReevit] Confirmation error:', error);\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n // Build successful payment result\n const result: PaymentResult = {\n paymentId: state.paymentIntent.id,\n reference: (paymentData.reference as string) ||\n (state.paymentIntent.metadata?.reference as string) || '',\n amount: state.paymentIntent.amount,\n currency: state.paymentIntent.currency,\n paymentMethod: state.selectedMethod,\n psp: state.paymentIntent.recommendedPsp,\n pspReference: (paymentData.pspReference as string) ||\n (data?.provider_ref_id as string) || '',\n status: data?.status === 'succeeded' ? 'success' : 'pending',\n metadata: { ...paymentData, backend_status: data?.status },\n };\n\n console.log('[useReevit] Process result:', result);\n\n if (result.status === 'success') {\n dispatch({ type: 'PROCESS_SUCCESS', payload: result });\n onSuccess?.(result);\n } else {\n // If still pending but PSP reported success, we treat it as success for the UI\n // but we can pass the real status in metadata\n dispatch({ type: 'PROCESS_SUCCESS', payload: result });\n onSuccess?.(result);\n }\n } catch (err) {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: err instanceof Error ? err.message : 'Payment failed. Please try again.',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n }\n },\n [state.paymentIntent, state.selectedMethod, onSuccess, onError]\n );\n\n // Handle PSP bridge success (called by PSP bridge components)\n const handlePspSuccess = useCallback(\n async (pspData: Record<string, unknown>) => {\n await processPayment(pspData);\n },\n [processPayment]\n );\n\n // Handle PSP bridge failure\n const handlePspError = useCallback(\n (error: PaymentError) => {\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n },\n [onError]\n );\n\n // Reset checkout\n const reset = useCallback(() => {\n initializingRef.current = false;\n dispatch({ type: 'RESET' });\n }, []);\n\n // Close checkout\n const close = useCallback(async () => {\n // Cancel the payment intent if it exists and is still pending\n if (state.paymentIntent && state.status !== 'success') {\n try {\n const apiClient = apiClientRef.current;\n if (apiClient) {\n await apiClient.cancelPaymentIntent(state.paymentIntent.id);\n }\n } catch {\n // Silently ignore cancel errors\n }\n }\n\n dispatch({ type: 'CLOSE' });\n onClose?.();\n }, [onClose, state.paymentIntent, state.status]);\n\n return {\n // State\n status: state.status,\n paymentIntent: state.paymentIntent,\n selectedMethod: state.selectedMethod,\n error: state.error,\n result: state.result,\n\n // Actions\n initialize,\n selectMethod,\n processPayment,\n handlePspSuccess,\n handlePspError,\n reset,\n close,\n\n // Computed\n isLoading: state.status === 'loading' || state.status === 'processing',\n isReady: state.status === 'ready' || state.status === 'method_selected',\n isComplete: state.status === 'success',\n canRetry: state.error?.recoverable ?? false,\n };\n}\n\n/**\n * Detects country code from currency\n * This is a simple heuristic; in production, you might use IP geolocation\n */\nfunction detectCountryFromCurrency(currency: string): string {\n const currencyToCountry: Record<string, string> = {\n GHS: 'GH', // Ghana\n NGN: 'NG', // Nigeria\n KES: 'KE', // Kenya\n UGX: 'UG', // Uganda\n TZS: 'TZ', // Tanzania\n ZAR: 'ZA', // South Africa\n XOF: 'CI', // Côte d'Ivoire (CFA)\n XAF: 'CM', // Cameroon (CFA)\n USD: 'US', // United States\n EUR: 'DE', // Europe (default to Germany)\n GBP: 'GB', // United Kingdom\n };\n\n return currencyToCountry[currency.toUpperCase()] || 'GH';\n}\n","/**\n * PaymentMethodSelector Component\n * Displays available payment methods for user selection\n */\n\nimport type { PaymentMethod } from \"../types\";\nimport { cn } from \"../utils\";\n\ninterface PaymentMethodSelectorProps {\n methods: PaymentMethod[];\n selectedMethod: PaymentMethod | null;\n onSelect: (method: PaymentMethod) => void;\n disabled?: boolean;\n provider?: string;\n}\n\n// Human-readable PSP names\nconst pspNames: Record<string, string> = {\n hubtel: \"Hubtel\",\n paystack: \"Paystack\",\n flutterwave: \"Flutterwave\",\n monnify: \"Monnify\",\n mpesa: \"M-Pesa\",\n stripe: \"Stripe\",\n};\n\n// Payment method configuration\nconst methodConfig: Record<\n PaymentMethod,\n { label: string; icon: string; description: string }\n> = {\n card: {\n label: \"Card\",\n icon: \"💳\",\n description: \"Pay with Visa, Mastercard, or other cards\",\n },\n mobile_money: {\n label: \"Mobile Money\",\n icon: \"📱\",\n description: \"MTN, Vodafone Cash, AirtelTigo Money\",\n },\n bank_transfer: {\n label: \"Bank Transfer\",\n icon: \"🏦\",\n description: \"Pay directly from your bank account\",\n },\n};\n\nexport function PaymentMethodSelector({\n methods,\n selectedMethod,\n onSelect,\n disabled = false,\n provider,\n}: PaymentMethodSelectorProps) {\n const getMethodLabel = (method: PaymentMethod, psp?: string): string => {\n const config = methodConfig[method];\n\n // For Hubtel, show \"Pay with Hubtel\" instead of card/mobile_money options\n if (psp?.toLowerCase().includes(\"hubtel\") && method === \"mobile_money\") {\n return `Pay with ${pspNames[psp.toLowerCase()] || \"Hubtel\"}`;\n }\n\n return config.label;\n };\n\n const getMethodDescription = (method: PaymentMethod, psp?: string): string => {\n const config = methodConfig[method];\n\n // Hubtel handles everything internally, no need for extra description\n if (psp?.toLowerCase().includes(\"hubtel\")) {\n return \"Card, Mobile Money, and Bank Transfer\";\n }\n\n return config.description;\n };\n\n return (\n <div className=\"reevit-method-selector\">\n <div className=\"reevit-method-selector__label\">Select payment method</div>\n <div className=\"reevit-method-selector__options\">\n {methods.map((method) => {\n const config = methodConfig[method];\n const isSelected = selectedMethod === method;\n const methodLabel = getMethodLabel(method, provider);\n const methodDescription = getMethodDescription(method, provider);\n\n return (\n <button\n key={method}\n type=\"button\"\n className={cn(\n \"reevit-method-option\",\n isSelected && \"reevit-method-option--selected\",\n disabled && \"reevit-method-option--disabled\",\n )}\n onClick={() => onSelect(method)}\n disabled={disabled}\n aria-pressed={isSelected}\n >\n <span className=\"reevit-method-option__icon\">{config.icon}</span>\n <div className=\"reevit-method-option__content\">\n <span className=\"reevit-method-option__label\">{methodLabel}</span>\n <span className=\"reevit-method-option__description\">\n {methodDescription}\n </span>\n </div>\n {isSelected && (\n <span className=\"reevit-method-option__check\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M16.667 5L7.5 14.167 3.333 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * MobileMoneyForm Component\n * Form for collecting mobile money payment details\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { MobileMoneyNetwork, MobileMoneyFormData } from '../types';\nimport { validatePhone, detectNetwork, formatPhone, cn } from '../utils';\n\ninterface MobileMoneyFormProps {\n onSubmit: (data: MobileMoneyFormData) => void;\n onCancel: () => void;\n isLoading?: boolean;\n initialPhone?: string;\n}\n\nconst networks: { id: MobileMoneyNetwork; name: string; color: string }[] = [\n { id: 'mtn', name: 'MTN', color: '#FFCC00' },\n { id: 'vodafone', name: 'Vodafone', color: '#E60000' },\n { id: 'airteltigo', name: 'AirtelTigo', color: '#E4002B' },\n];\n\nexport function MobileMoneyForm({\n onSubmit,\n onCancel,\n isLoading = false,\n initialPhone = '',\n}: MobileMoneyFormProps) {\n const [phone, setPhone] = useState(initialPhone);\n const [network, setNetwork] = useState<MobileMoneyNetwork | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [touched, setTouched] = useState(false);\n\n // Auto-detect network from phone number\n useEffect(() => {\n if (phone.length >= 3) {\n const detected = detectNetwork(phone);\n if (detected) {\n setNetwork(detected as MobileMoneyNetwork);\n }\n }\n }, [phone]);\n\n // Validate on change\n useEffect(() => {\n if (touched && phone) {\n if (!validatePhone(phone)) {\n setError('Please enter a valid Ghana phone number');\n } else if (network && !validatePhone(phone, network)) {\n setError(`This number doesn't match the selected network`);\n } else {\n setError(null);\n }\n }\n }, [phone, network, touched]);\n\n const handlePhoneChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^0-9+]/g, '');\n setPhone(value);\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n setTouched(true);\n\n if (!phone || !network) {\n setError('Please enter your phone number and select a network');\n return;\n }\n\n if (!validatePhone(phone, network)) {\n setError('Invalid phone number for selected network');\n return;\n }\n\n onSubmit({ phone, network });\n },\n [phone, network, onSubmit]\n );\n\n const isValid = phone && network && validatePhone(phone, network);\n\n return (\n <form className=\"reevit-momo-form\" onSubmit={handleSubmit}>\n <div className=\"reevit-momo-form__field\">\n <label htmlFor=\"reevit-phone\" className=\"reevit-momo-form__label\">\n Phone Number\n </label>\n <input\n id=\"reevit-phone\"\n type=\"tel\"\n className={cn('reevit-momo-form__input', !!error && 'reevit-momo-form__input--error')}\n placeholder=\"024 XXX XXXX\"\n value={phone}\n onChange={handlePhoneChange}\n onBlur={() => setTouched(true)}\n disabled={isLoading}\n autoComplete=\"tel\"\n />\n {phone && !error && (\n <div className=\"reevit-momo-form__formatted\">{formatPhone(phone)}</div>\n )}\n {error && <div className=\"reevit-momo-form__error\">{error}</div>}\n </div>\n\n <div className=\"reevit-momo-form__field\">\n <label className=\"reevit-momo-form__label\">Select Network</label>\n <div className=\"reevit-momo-form__networks\">\n {networks.map((n) => (\n <button\n key={n.id}\n type=\"button\"\n className={cn(\n 'reevit-network-btn',\n network === n.id && 'reevit-network-btn--selected'\n )}\n style={{ '--network-color': n.color } as React.CSSProperties}\n onClick={() => setNetwork(n.id)}\n disabled={isLoading}\n >\n {n.name}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"reevit-momo-form__actions\">\n <button\n type=\"button\"\n className=\"reevit-btn reevit-btn--secondary\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"reevit-btn reevit-btn--primary\"\n disabled={!isValid || isLoading}\n >\n {isLoading ? (\n <span className=\"reevit-spinner\" />\n ) : (\n 'Continue'\n )}\n </button>\n </div>\n\n <p className=\"reevit-momo-form__hint\">\n You will receive a USSD prompt on your phone to authorize the payment.\n </p>\n </form>\n );\n}\n","/**\n * Paystack Bridge\n * Handles integration with Paystack popup checkout\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n PaystackPop?: PaystackPopupInterface;\n }\n}\n\ninterface PaystackPopupInterface {\n setup: (config: PaystackConfig) => { openIframe: () => void };\n}\n\ninterface PaystackConfig {\n key: string;\n email: string;\n phone?: string;\n amount?: number;\n currency?: string;\n ref?: string;\n access_code?: string;\n metadata?: Record<string, unknown>;\n channels?: string[];\n callback: (response: PaystackResponse) => void;\n onClose: () => void;\n}\n\ninterface PaystackResponse {\n reference: string;\n trans: string;\n status: string;\n message: string;\n transaction: string;\n trxref: string;\n}\n\ninterface PaystackBridgeProps {\n publicKey: string;\n email: string;\n phone?: string;\n amount: number;\n currency?: string;\n reference?: string;\n accessCode?: string;\n metadata?: Record<string, unknown>;\n channels?: ('card' | 'bank' | 'ussd' | 'qr' | 'mobile_money' | 'bank_transfer')[];\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Paystack script\nfunction loadPaystackScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.PaystackPop) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://js.paystack.co/v2/inline.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Paystack script'));\n document.head.appendChild(script);\n });\n}\n\nexport function PaystackBridge({\n publicKey,\n email,\n phone,\n amount,\n currency = 'GHS',\n reference,\n accessCode,\n metadata,\n channels = ['card', 'mobile_money'],\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: PaystackBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n console.log('[PaystackBridge] Starting payment', {\n hasPublicKey: !!publicKey,\n email,\n amount,\n reference,\n hasAccessCode: !!accessCode,\n });\n\n // Validate required parameters before attempting to load Paystack\n if (!publicKey) {\n throw new Error('Paystack public key is required but was empty');\n }\n if (!email && !accessCode) {\n throw new Error('Email is required for Paystack payments when no access code is provided');\n }\n if (!amount && !accessCode) {\n throw new Error('Valid amount is required for Paystack payments when no access code is provided');\n }\n\n await loadPaystackScript();\n\n if (!window.PaystackPop) {\n throw new Error('Paystack script loaded but PaystackPop not available');\n }\n\n const setupConfig: PaystackConfig = {\n key: publicKey,\n email,\n phone,\n amount,\n currency,\n ref: reference,\n access_code: accessCode,\n metadata,\n channels,\n callback: (response: PaystackResponse) => {\n console.log('[PaystackBridge] Callback received', response);\n // Determine the payment method used\n let usedMethod: any = 'card';\n if (channels && channels.length === 1) {\n usedMethod = channels[0];\n } else if (response.message?.toLowerCase().includes('mobile money')) {\n usedMethod = 'mobile_money';\n }\n\n const result: PaymentResult = {\n paymentId: response.reference, // Use the reference as paymentId because we set it to Reevit's UUID\n reference: response.reference,\n amount,\n currency,\n paymentMethod: usedMethod,\n psp: 'paystack',\n pspReference: response.transaction, // Paystack's internal transaction ID\n status: response.status === 'success' ? 'success' : 'pending',\n metadata: {\n ...response,\n trxref: response.trxref,\n paystack_transaction_id: response.transaction,\n paystack_trans: response.trans\n },\n };\n onSuccess(result);\n },\n onClose: () => {\n console.log('[PaystackBridge] Modal closed');\n onClose();\n },\n };\n\n const handler = window.PaystackPop.setup(setupConfig);\n\n handler.openIframe();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to initialize Paystack';\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: errorMessage,\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [publicKey, email, amount, currency, reference, accessCode, metadata, channels, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--paystack\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Paystack...</p>\n </div>\n </div>\n );\n}\n\n// Export utility for manual initialization\nexport { loadPaystackScript };","/**\n * Hubtel Bridge\n * Handles integration with Hubtel payment using @hubteljs/checkout npm package\n *\n * Supports two authentication methods:\n * 1. Session Token (recommended): Pass hubtelSessionToken to use secure, short-lived tokens\n * 2. Basic Auth (legacy): Pass basicAuth for direct credential authentication\n */\n\nimport { useEffect, useCallback, useRef, useState } from 'react';\nimport CheckoutSdk from '@hubteljs/checkout';\nimport type { PaymentResult, PaymentError } from '../types';\nimport { createReevitClient } from '../api/client';\n\ninterface HubtelBridgeProps {\n paymentId: string;\n publicKey: string;\n merchantAccount: string | number;\n amount: number;\n currency?: string;\n reference?: string;\n email?: string;\n phone?: string;\n description?: string;\n callbackUrl?: string;\n /** Session token from server (recommended - credentials never exposed to client) */\n hubtelSessionToken?: string;\n /** Basic auth credential (legacy - credentials exposed to client, deprecated) */\n basicAuth?: string;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\nexport function HubtelBridge({\n paymentId,\n publicKey,\n merchantAccount,\n amount,\n reference,\n phone,\n description = 'Payment',\n callbackUrl,\n hubtelSessionToken,\n basicAuth,\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: HubtelBridgeProps) {\n const initialized = useRef(false);\n const checkoutRef = useRef<InstanceType<typeof CheckoutSdk> | null>(null);\n const [authValue, setAuthValue] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n // Fetch session token if provided, otherwise use basicAuth\n useEffect(() => {\n const fetchAuth = async () => {\n // If session token is provided, fetch the session from the server\n if (hubtelSessionToken) {\n setIsLoading(true);\n try {\n const client = createReevitClient({ publicKey });\n const { data, error } = await client.createHubtelSession(paymentId);\n if (error) {\n onError({\n code: 'SESSION_ERROR',\n message: error.message || 'Failed to create Hubtel session',\n recoverable: true,\n });\n return;\n }\n if (data) {\n // The session response contains basicAuth encoded in the token\n // We need to use it with the Hubtel SDK\n setAuthValue(data.token);\n }\n } catch (err) {\n onError({\n code: 'SESSION_ERROR',\n message: 'Failed to create Hubtel session',\n recoverable: true,\n originalError: err,\n });\n } finally {\n setIsLoading(false);\n }\n } else if (basicAuth) {\n // Legacy: Use basicAuth directly (deprecated - credentials exposed)\n setAuthValue(basicAuth);\n }\n };\n\n fetchAuth();\n }, [paymentId, publicKey, hubtelSessionToken, basicAuth, onError]);\n\n const startPayment = useCallback(async () => {\n // Wait for auth to be loaded\n if (isLoading || !authValue) {\n return;\n }\n\n try {\n // Initialize the Checkout SDK\n const checkout = new CheckoutSdk();\n checkoutRef.current = checkout;\n\n const purchaseInfo = {\n amount: amount / 100, // Convert from minor to major units\n purchaseDescription: description,\n customerPhoneNumber: phone || '',\n clientReference: reference || `hubtel_${Date.now()}`,\n };\n\n const config = {\n branding: 'enabled' as const,\n callbackUrl: callbackUrl || window.location.href,\n merchantAccount: typeof merchantAccount === 'string' ? parseInt(merchantAccount, 10) : merchantAccount,\n // Use session token or basicAuth for authentication\n // Session tokens are base64-encoded credentials fetched securely from the server\n basicAuth: authValue || '',\n };\n\n checkout.openModal({\n purchaseInfo,\n config,\n callBacks: {\n onInit: () => console.log('Hubtel checkout initialized'),\n onPaymentSuccess: (data: any) => {\n const result: PaymentResult = {\n paymentId: (data.transactionId as string) || reference || '',\n reference: (data.clientReference as string) || reference || '',\n amount: amount,\n currency: 'GHS',\n paymentMethod: 'mobile_money',\n psp: 'hubtel',\n pspReference: (data.transactionId as string) || '',\n status: 'success',\n };\n onSuccess(result);\n checkout.closePopUp();\n },\n onPaymentFailure: (data: any) => {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: (data.message as string) || 'Payment failed',\n recoverable: true,\n };\n onError(error);\n },\n onLoad: () => console.log('Hubtel checkout loaded'),\n onClose: () => {\n onClose();\n },\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Hubtel',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [merchantAccount, amount, reference, phone, description, callbackUrl, authValue, isLoading, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current && !isLoading && authValue) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment, isLoading, authValue]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--hubtel\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Hubtel...</p>\n </div>\n </div>\n );\n}\n\n/**\n * Opens Hubtel checkout modal directly\n * Uses the @hubteljs/checkout npm package\n */\nexport function openHubtelPopup(config: {\n merchantAccount: string | number;\n description: string;\n amount: number;\n clientReference?: string;\n callbackUrl?: string;\n customerPhoneNumber?: string;\n basicAuth?: string;\n onSuccess?: (data: Record<string, unknown>) => void;\n onError?: (data: Record<string, unknown>) => void;\n onClose?: () => void;\n}): void {\n const checkout = new CheckoutSdk();\n\n const purchaseInfo = {\n amount: config.amount,\n purchaseDescription: config.description,\n customerPhoneNumber: config.customerPhoneNumber || '',\n clientReference: config.clientReference || `hubtel_${Date.now()}`,\n };\n\n const checkoutConfig = {\n branding: 'enabled' as const,\n callbackUrl: config.callbackUrl || window.location.href,\n merchantAccount: typeof config.merchantAccount === 'string'\n ? parseInt(config.merchantAccount, 10)\n : config.merchantAccount,\n basicAuth: config.basicAuth || '',\n };\n\n checkout.openModal({\n purchaseInfo,\n config: checkoutConfig,\n callBacks: {\n onPaymentSuccess: (data: any) => {\n config.onSuccess?.(data);\n checkout.closePopUp();\n },\n onPaymentFailure: (data: any) => {\n config.onError?.(data);\n },\n onClose: () => {\n config.onClose?.();\n },\n },\n });\n}\n","/**\n * Flutterwave Bridge\n * Handles integration with Flutterwave payment modal\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n FlutterwaveCheckout?: (config: FlutterwaveConfig) => void;\n }\n}\n\ninterface FlutterwaveConfig {\n public_key: string;\n tx_ref: string;\n amount: number;\n currency: string;\n payment_options?: string;\n customer: {\n email: string;\n phone_number?: string;\n name?: string;\n };\n customizations?: {\n title?: string;\n description?: string;\n logo?: string;\n };\n meta?: Record<string, unknown>;\n callback: (response: FlutterwaveResponse) => void;\n onclose: () => void;\n}\n\ninterface FlutterwaveResponse {\n status: 'successful' | 'failed' | 'cancelled';\n transaction_id: number;\n tx_ref: string;\n flw_ref: string;\n amount: number;\n currency: string;\n charged_amount: number;\n payment_type: string;\n}\n\ninterface FlutterwaveBridgeProps {\n publicKey: string;\n amount: number;\n currency?: string;\n reference?: string;\n email: string;\n phone?: string;\n name?: string;\n paymentOptions?: string;\n title?: string;\n description?: string;\n logo?: string;\n metadata?: Record<string, unknown>;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Flutterwave script\nfunction loadFlutterwaveScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.FlutterwaveCheckout) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://checkout.flutterwave.com/v3.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Flutterwave script'));\n document.head.appendChild(script);\n });\n}\n\nexport function FlutterwaveBridge({\n publicKey,\n amount,\n currency = 'GHS',\n reference,\n email,\n phone,\n name,\n paymentOptions = 'card,mobilemoney,ussd',\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: FlutterwaveBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n await loadFlutterwaveScript();\n\n if (!window.FlutterwaveCheckout) {\n throw new Error('Flutterwave checkout not available');\n }\n\n const txRef = reference || `flw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n window.FlutterwaveCheckout({\n public_key: publicKey,\n tx_ref: txRef,\n amount: amount / 100, // Flutterwave expects amount in major units\n currency,\n payment_options: paymentOptions,\n customer: {\n email,\n phone_number: phone,\n name,\n },\n customizations: {\n title,\n description,\n logo,\n },\n meta: metadata,\n callback: (response: FlutterwaveResponse) => {\n if (response.status === 'successful') {\n const result: PaymentResult = {\n paymentId: response.transaction_id.toString(),\n reference: response.tx_ref,\n amount: Math.round(response.amount * 100),\n currency: response.currency,\n paymentMethod: response.payment_type === 'mobilemoney' ? 'mobile_money' : 'card',\n psp: 'flutterwave',\n pspReference: response.flw_ref,\n status: 'success',\n metadata: {\n charged_amount: response.charged_amount,\n payment_type: response.payment_type,\n },\n };\n onSuccess(result);\n } else {\n const error: PaymentError = {\n code: response.status === 'cancelled' ? 'CANCELLED' : 'PAYMENT_FAILED',\n message: response.status === 'cancelled' ? 'Payment was cancelled' : 'Payment failed',\n recoverable: true,\n };\n onError(error);\n }\n },\n onclose: () => {\n onClose();\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Flutterwave',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [\n publicKey,\n amount,\n currency,\n reference,\n email,\n phone,\n name,\n paymentOptions,\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n ]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--flutterwave\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Flutterwave...</p>\n </div>\n </div>\n );\n}\n\nexport { loadFlutterwaveScript };\n","/**\n * MonnifyBridge.tsx\n * React component for Monnify payment integration (Nigeria)\n */\n\nimport { useEffect, useCallback, useState } from 'react';\n\ndeclare global {\n interface Window {\n MonnifySDK?: {\n initialize: (config: MonnifyConfig) => void;\n };\n }\n}\n\ninterface MonnifyConfig {\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerMobileNumber?: string;\n apiKey: string;\n contractCode: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n onComplete: (response: MonnifyResponse) => void;\n onClose: () => void;\n}\n\ninterface MonnifyResponse {\n status: 'SUCCESS' | 'FAILED' | 'PENDING';\n message: string;\n transactionReference: string;\n paymentReference: string;\n authorizedAmount?: number;\n paymentStatus?: string;\n}\n\nexport interface MonnifyBridgeProps {\n apiKey: string;\n contractCode: string;\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerPhone?: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n autoOpen?: boolean;\n onSuccess: (result: {\n transactionReference: string;\n paymentReference: string;\n amount: number;\n }) => void;\n onError: (error: { code: string; message: string }) => void;\n onClose?: () => void;\n}\n\nconst MONNIFY_SCRIPT_URL = 'https://sdk.monnify.com/plugin/monnify.js';\nlet monnifyScriptPromise: Promise<void> | null = null;\n\nexport function loadMonnifyScript(): Promise<void> {\n if (monnifyScriptPromise) return monnifyScriptPromise;\n\n if (document.getElementById('monnify-sdk-script')) {\n monnifyScriptPromise = Promise.resolve();\n return monnifyScriptPromise;\n }\n\n monnifyScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'monnify-sdk-script';\n script.src = MONNIFY_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Monnify SDK'));\n document.head.appendChild(script);\n });\n\n return monnifyScriptPromise;\n}\n\nexport function MonnifyBridge({\n apiKey,\n contractCode,\n amount,\n currency,\n reference,\n customerName,\n customerEmail,\n customerPhone,\n paymentDescription,\n isTestMode = false,\n metadata,\n autoOpen = true,\n onSuccess,\n onError,\n onClose,\n}: MonnifyBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isReady, setIsReady] = useState(false);\n\n const openMonnify = useCallback(async () => {\n try {\n await loadMonnifyScript();\n\n if (!window.MonnifySDK) {\n throw new Error('Monnify SDK not available');\n }\n\n window.MonnifySDK.initialize({\n amount,\n currency: currency || 'NGN',\n reference,\n customerName,\n customerEmail,\n customerMobileNumber: customerPhone,\n apiKey,\n contractCode,\n paymentDescription: paymentDescription || 'Payment',\n isTestMode,\n metadata,\n onComplete: (response: MonnifyResponse) => {\n if (response.status === 'SUCCESS') {\n onSuccess({\n transactionReference: response.transactionReference,\n paymentReference: response.paymentReference,\n amount: response.authorizedAmount || amount,\n });\n } else {\n onError({\n code: 'MONNIFY_PAYMENT_FAILED',\n message: response.message || 'Payment was not successful',\n });\n }\n },\n onClose: () => {\n onClose?.();\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to open Monnify';\n onError({ code: 'MONNIFY_INIT_ERROR', message });\n }\n }, [\n amount, currency, reference, customerName, customerEmail, customerPhone,\n apiKey, contractCode, paymentDescription, isTestMode, metadata,\n onSuccess, onError, onClose\n ]);\n\n useEffect(() => {\n const init = async () => {\n try {\n await loadMonnifyScript();\n setIsReady(true);\n setIsLoading(false);\n\n if (autoOpen) {\n openMonnify();\n }\n } catch (err) {\n setIsLoading(false);\n const message = err instanceof Error ? err.message : 'Failed to load Monnify';\n onError({ code: 'MONNIFY_LOAD_ERROR', message });\n }\n };\n\n init();\n }, [autoOpen, openMonnify, onError]);\n\n if (isLoading) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <div className=\"reevit-monnify-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading Monnify checkout...</p>\n </div>\n </div>\n );\n }\n\n if (!autoOpen && isReady) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={openMonnify}\n >\n Pay with Monnify\n </button>\n </div>\n );\n }\n\n return null;\n}\n","/**\n * MPesaBridge.tsx\n * React component for M-Pesa STK Push integration (Kenya/Tanzania)\n * \n * Note: M-Pesa uses server-to-server STK Push initiated by the backend.\n * This component handles the UI flow while the customer approves on their phone.\n */\n\nimport { useState, useCallback } from 'react';\n\nexport interface MPesaBridgeProps {\n /** API endpoint to initiate STK Push (your backend) */\n apiEndpoint: string;\n /** Customer phone number in format 254XXXXXXXXX */\n phoneNumber: string;\n /** Amount to charge */\n amount: number;\n /** Currency (KES or TZS) */\n currency: string;\n /** Unique transaction reference */\n reference: string;\n /** Payment description */\n description?: string;\n /** Called when STK Push is successfully sent */\n onInitiated?: (checkoutRequestId: string) => void;\n /** Called when payment is confirmed (via webhook/polling) */\n onSuccess: (result: { transactionId: string; reference: string }) => void;\n /** Called on error */\n onError: (error: { code: string; message: string }) => void;\n /** Custom headers for API calls (e.g., authorization) */\n headers?: Record<string, string>;\n}\n\ntype MPesaState = 'idle' | 'initiating' | 'waiting' | 'success' | 'failed';\n\nexport function MPesaBridge({\n apiEndpoint,\n phoneNumber,\n amount,\n currency,\n reference,\n description,\n onInitiated,\n onSuccess,\n onError,\n headers = {},\n}: MPesaBridgeProps) {\n const [state, setState] = useState<MPesaState>('idle');\n const [error, setError] = useState<string | null>(null);\n const [checkoutRequestId, setCheckoutRequestId] = useState<string | null>(null);\n\n const initiateSTKPush = useCallback(async () => {\n setState('initiating');\n setError(null);\n\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n phone_number: phoneNumber,\n amount,\n currency,\n reference,\n description: description || `Payment ${reference}`,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n const data = await response.json();\n const requestId = data.checkout_request_id || data.checkoutRequestId || data.transaction_id;\n\n setCheckoutRequestId(requestId);\n setState('waiting');\n onInitiated?.(requestId);\n\n // Note: Success will come via webhook or polling on parent component\n // This bridge just handles the UI for initiating the push\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to initiate M-Pesa payment';\n setError(message);\n setState('failed');\n onError({ code: 'MPESA_INIT_ERROR', message });\n }\n }, [apiEndpoint, phoneNumber, amount, currency, reference, description, headers, onInitiated, onError]);\n\n const handleRetry = useCallback(() => {\n setState('idle');\n setError(null);\n initiateSTKPush();\n }, [initiateSTKPush]);\n\n // Idle state - show initiate button\n if (state === 'idle') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-info\">\n <div className=\"reevit-mpesa-icon\">📱</div>\n <h3>Pay with M-Pesa</h3>\n <p>You will receive a prompt on your phone to complete the payment.</p>\n <p className=\"reevit-mpesa-phone\">Phone: {phoneNumber}</p>\n </div>\n <button\n type=\"button\"\n className=\"reevit-submit-btn reevit-mpesa-btn\"\n onClick={initiateSTKPush}\n >\n Send Payment Request\n </button>\n </div>\n );\n }\n\n // Initiating state - show loading\n if (state === 'initiating') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-loading\">\n <div className=\"reevit-spinner reevit-spinner--large\" />\n <p>Sending payment request to your phone...</p>\n </div>\n </div>\n );\n }\n\n // Waiting state - customer should check their phone\n if (state === 'waiting') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-waiting\">\n <div className=\"reevit-mpesa-phone-icon\">📲</div>\n <h3>Check Your Phone</h3>\n <p>\n An M-Pesa payment request has been sent to <strong>{phoneNumber}</strong>.\n </p>\n <ol className=\"reevit-mpesa-steps\">\n <li>Check for the M-Pesa prompt on your phone</li>\n <li>Enter your M-Pesa PIN to authorize</li>\n <li>Wait for confirmation</li>\n </ol>\n <div className=\"reevit-mpesa-waiting-indicator\">\n <div className=\"reevit-spinner\" />\n <span>Waiting for payment confirmation...</span>\n </div>\n {checkoutRequestId && (\n <p className=\"reevit-mpesa-ref\">Request ID: {checkoutRequestId}</p>\n )}\n </div>\n </div>\n );\n }\n\n // Failed state - show error and retry\n if (state === 'failed') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-error\">\n <div className=\"reevit-error-icon\">⚠️</div>\n <h3>Payment Request Failed</h3>\n <p>{error || 'Something went wrong. Please try again.'}</p>\n <button\n type=\"button\"\n className=\"reevit-retry-btn\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Hook for M-Pesa payment status polling\n * Use this to check payment status after STK Push is initiated\n */\nexport function useMPesaStatusPolling(\n statusEndpoint: string,\n checkoutRequestId: string | null,\n options: {\n interval?: number;\n maxAttempts?: number;\n headers?: Record<string, string>;\n onSuccess: (result: { transactionId: string }) => void;\n onFailed: (error: { message: string }) => void;\n onTimeout: () => void;\n }\n) {\n const { interval = 5000, maxAttempts = 24, headers = {}, onSuccess, onFailed, onTimeout } = options;\n\n const startPolling = useCallback(async () => {\n if (!checkoutRequestId) return;\n\n let attempts = 0;\n\n const poll = async () => {\n if (attempts >= maxAttempts) {\n onTimeout();\n return;\n }\n\n try {\n const response = await fetch(`${statusEndpoint}?checkout_request_id=${checkoutRequestId}`, {\n headers,\n });\n\n if (!response.ok) {\n attempts++;\n setTimeout(poll, interval);\n return;\n }\n\n const data = await response.json();\n\n if (data.status === 'success' || data.status === 'completed') {\n onSuccess({ transactionId: data.transaction_id || data.mpesa_receipt });\n } else if (data.status === 'failed' || data.status === 'cancelled') {\n onFailed({ message: data.message || 'Payment failed or was cancelled' });\n } else {\n // Still pending, continue polling\n attempts++;\n setTimeout(poll, interval);\n }\n } catch {\n attempts++;\n setTimeout(poll, interval);\n }\n };\n\n poll();\n }, [checkoutRequestId, statusEndpoint, interval, maxAttempts, headers, onSuccess, onFailed, onTimeout]);\n\n return { startPolling };\n}\n","/**\n * StripeBridge.tsx\n * React component for Stripe payment integration\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\n\ndeclare global {\n interface Window {\n Stripe?: (publishableKey: string) => StripeInstance;\n }\n}\n\ninterface StripeInstance {\n elements: (options?: { clientSecret: string; appearance?: StripeAppearance }) => StripeElements;\n confirmPayment: (options: {\n elements: StripeElements;\n confirmParams?: { return_url?: string };\n redirect?: 'if_required';\n }) => Promise<{ error?: StripeError; paymentIntent?: { id: string; status: string } }>;\n}\n\ninterface StripeElements {\n create: (type: 'payment' | 'card', options?: Record<string, unknown>) => StripeElement;\n getElement: (type: string) => StripeElement | null;\n submit: () => Promise<{ error?: StripeError }>;\n}\n\ninterface StripeElement {\n mount: (selector: string | HTMLElement) => void;\n unmount: () => void;\n on: (event: string, handler: (e: any) => void) => void;\n destroy: () => void;\n}\n\ninterface StripeError {\n type: string;\n message: string;\n code?: string;\n}\n\ninterface StripeAppearance {\n theme?: 'stripe' | 'night' | 'flat';\n variables?: Record<string, string>;\n rules?: Record<string, Record<string, string>>;\n}\n\nexport interface StripeBridgeProps {\n publishableKey: string;\n clientSecret: string;\n amount: number;\n currency: string;\n appearance?: StripeAppearance;\n onSuccess: (result: { paymentIntentId: string; status: string }) => void;\n onError: (error: { code: string; message: string }) => void;\n onReady?: () => void;\n onCancel?: () => void;\n}\n\nconst STRIPE_SCRIPT_URL = 'https://js.stripe.com/v3/';\nlet stripeScriptPromise: Promise<void> | null = null;\n\nexport function loadStripeScript(): Promise<void> {\n if (stripeScriptPromise) return stripeScriptPromise;\n\n if (document.getElementById('stripe-js-script')) {\n stripeScriptPromise = Promise.resolve();\n return stripeScriptPromise;\n }\n\n stripeScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'stripe-js-script';\n script.src = STRIPE_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Stripe.js'));\n document.head.appendChild(script);\n });\n\n return stripeScriptPromise;\n}\n\n// Default Reevit-themed appearance for Stripe Elements\nconst getReevitStripeAppearance = (): StripeAppearance => {\n // Check if we're in dark mode\n const isDarkMode = typeof window !== 'undefined' && \n window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n \n return {\n theme: isDarkMode ? 'night' : 'stripe',\n variables: {\n colorPrimary: isDarkMode ? '#fafafa' : '#171717',\n colorBackground: isDarkMode ? '#171717' : '#ffffff',\n colorText: isDarkMode ? '#fafafa' : '#171717',\n colorTextSecondary: isDarkMode ? '#a3a3a3' : '#737373',\n colorTextPlaceholder: isDarkMode ? '#737373' : '#a3a3a3',\n colorDanger: '#dc2626',\n fontFamily: '\"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n fontSizeBase: '14px',\n fontSizeSm: '12px',\n fontSizeLg: '16px',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightBold: '600',\n borderRadius: '10px',\n spacingUnit: '4px',\n spacingGridRow: '16px',\n spacingGridColumn: '16px',\n },\n rules: {\n '.Input': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n boxShadow: 'none',\n padding: '12px 14px',\n fontSize: '14px',\n backgroundColor: isDarkMode ? '#262626' : '#ffffff',\n },\n '.Input:focus': {\n border: isDarkMode ? '1px solid #a3a3a3' : '1px solid #737373',\n boxShadow: 'none',\n backgroundColor: isDarkMode ? '#262626' : '#fafafa',\n },\n '.Input--invalid': {\n border: '1px solid #dc2626',\n boxShadow: 'none',\n },\n '.Label': {\n fontSize: '12px',\n fontWeight: '500',\n marginBottom: '6px',\n color: isDarkMode ? '#a3a3a3' : '#737373',\n textTransform: 'none',\n letterSpacing: '0.02em',\n },\n '.Tab': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n backgroundColor: 'transparent',\n borderRadius: '10px',\n padding: '12px 14px',\n },\n '.Tab:hover': {\n border: isDarkMode ? '1px solid #a3a3a3' : '1px solid #737373',\n backgroundColor: isDarkMode ? '#262626' : '#fafafa',\n },\n '.Tab--selected': {\n border: isDarkMode ? '1px solid #fafafa' : '1px solid #171717',\n backgroundColor: isDarkMode ? '#262626' : '#fafafa',\n },\n '.TabIcon': {\n marginRight: '8px',\n },\n '.Block': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n borderRadius: '10px',\n backgroundColor: isDarkMode ? '#262626' : '#ffffff',\n padding: '12px 14px',\n },\n '.CheckboxInput': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n },\n '.CheckboxInput--checked': {\n backgroundColor: isDarkMode ? '#fafafa' : '#171717',\n borderColor: isDarkMode ? '#fafafa' : '#171717',\n },\n },\n };\n};\n\nexport function StripeBridge({\n publishableKey,\n clientSecret,\n amount,\n currency,\n appearance,\n onSuccess,\n onError,\n onReady,\n onCancel,\n}: StripeBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const stripeRef = useRef<StripeInstance | null>(null);\n const elementsRef = useRef<StripeElements | null>(null);\n const paymentElementRef = useRef<StripeElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let mounted = true;\n\n const initStripe = async () => {\n try {\n await loadStripeScript();\n\n if (!mounted || !window.Stripe) {\n throw new Error('Stripe not available');\n }\n\n stripeRef.current = window.Stripe(publishableKey);\n\n // Use provided appearance or fall back to Reevit default theme\n const stripeAppearance = appearance || getReevitStripeAppearance();\n\n elementsRef.current = stripeRef.current.elements({\n clientSecret,\n appearance: stripeAppearance,\n });\n\n paymentElementRef.current = elementsRef.current.create('payment');\n\n if (containerRef.current) {\n paymentElementRef.current.mount(containerRef.current);\n }\n\n paymentElementRef.current.on('ready', () => {\n if (mounted) {\n setIsLoading(false);\n onReady?.();\n }\n });\n\n paymentElementRef.current.on('change', (event: any) => {\n if (event.error) {\n setError(event.error.message);\n } else {\n setError(null);\n }\n });\n } catch (err) {\n if (mounted) {\n const message = err instanceof Error ? err.message : 'Failed to initialize Stripe';\n setError(message);\n setIsLoading(false);\n onError({ code: 'STRIPE_INIT_ERROR', message });\n }\n }\n };\n\n initStripe();\n\n return () => {\n mounted = false;\n paymentElementRef.current?.destroy();\n };\n }, [publishableKey, clientSecret, appearance, onReady, onError]);\n\n const handleSubmit = useCallback(async () => {\n if (!stripeRef.current || !elementsRef.current) {\n onError({ code: 'NOT_INITIALIZED', message: 'Stripe not initialized' });\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n // Validate the form first\n const { error: submitError } = await elementsRef.current.submit();\n if (submitError) {\n setError(submitError.message);\n onError({ code: submitError.code || 'VALIDATION_ERROR', message: submitError.message });\n setIsSubmitting(false);\n return;\n }\n\n // Confirm the payment\n const { error: confirmError, paymentIntent } = await stripeRef.current.confirmPayment({\n elements: elementsRef.current,\n redirect: 'if_required',\n });\n\n if (confirmError) {\n setError(confirmError.message);\n onError({ code: confirmError.code || 'PAYMENT_ERROR', message: confirmError.message });\n } else if (paymentIntent) {\n onSuccess({\n paymentIntentId: paymentIntent.id,\n status: paymentIntent.status,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Payment failed';\n setError(message);\n onError({ code: 'UNKNOWN_ERROR', message });\n } finally {\n setIsSubmitting(false);\n }\n }, [onSuccess, onError]);\n\n // Format the amount for display\n const formattedAmount = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency.toUpperCase(),\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount / 100);\n\n return (\n <div className=\"reevit-stripe-bridge\">\n {isLoading && (\n <div className=\"reevit-stripe-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading secure payment form...</p>\n </div>\n )}\n\n <div\n ref={containerRef}\n className=\"reevit-stripe-element\"\n style={{ display: isLoading ? 'none' : 'block', minHeight: '200px' }}\n />\n\n {error && !isLoading && (\n <div className=\"reevit-stripe-error\">\n <p>{error}</p>\n </div>\n )}\n\n {!isLoading && (\n <div className=\"reevit-stripe-actions\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={handleSubmit}\n disabled={isLoading || isSubmitting}\n >\n {isSubmitting ? (\n <>\n <span className=\"reevit-spinner\" style={{ width: '16px', height: '16px' }} />\n <span>Processing...</span>\n </>\n ) : (\n <>Pay {formattedAmount}</>\n )}\n </button>\n\n {onCancel && (\n <button\n type=\"button\"\n className=\"reevit-cancel-btn\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n Cancel\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * ReevitCheckout Component\n * Main checkout component that orchestrates the payment flow\n */\n\nimport { useEffect, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReevitCheckoutProps, PaymentMethod, MobileMoneyFormData, PaymentError, PaymentResult } from '../types';\nimport { useReevit } from '../hooks/useReevit';\nimport { PaymentMethodSelector } from './PaymentMethodSelector';\nimport { MobileMoneyForm } from './MobileMoneyForm';\nimport { PaystackBridge } from '../bridges/PaystackBridge';\nimport { HubtelBridge } from '../bridges/HubtelBridge';\nimport { FlutterwaveBridge } from '../bridges/FlutterwaveBridge';\nimport { MonnifyBridge } from '../bridges/MonnifyBridge';\nimport { MPesaBridge } from '../bridges/MPesaBridge';\nimport { StripeBridge } from '../bridges/StripeBridge';\nimport { formatAmount, createThemeVariables, cn } from '../utils';\n\n\n// Context for nested components\ninterface ReevitContextValue {\n publicKey: string;\n amount: number;\n currency: string;\n}\n\nconst ReevitContext = createContext<ReevitContextValue | null>(null);\n\nexport function useReevitContext() {\n const context = useContext(ReevitContext);\n if (!context) {\n throw new Error('useReevitContext must be used within ReevitCheckout');\n }\n return context;\n}\n\nexport function ReevitCheckout({\n // Config\n publicKey,\n amount,\n currency,\n email = '',\n phone = '',\n reference,\n metadata,\n paymentMethods = ['card', 'mobile_money'],\n initialPaymentIntent,\n // Callbacks\n onSuccess,\n onError,\n onClose,\n onStateChange,\n // UI\n children,\n autoOpen = false,\n isOpen: controlledIsOpen,\n onOpenChange,\n theme,\n apiBaseUrl,\n}: ReevitCheckoutProps) {\n const [internalIsOpen, setInternalIsOpen] = useState(autoOpen);\n const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;\n\n const setIsOpen = useCallback(\n (value: boolean) => {\n if (onOpenChange) {\n onOpenChange(value);\n } else {\n setInternalIsOpen(value);\n }\n },\n [onOpenChange]\n );\n\n const [showPSPBridge, setShowPSPBridge] = useState(false);\n const [momoData, setMomoData] = useState<MobileMoneyFormData | null>(null);\n\n const {\n status,\n paymentIntent,\n selectedMethod,\n error,\n result,\n initialize,\n selectMethod,\n processPayment,\n reset,\n close: closeCheckout,\n isLoading,\n isComplete,\n } = useReevit({\n config: {\n publicKey,\n amount,\n currency,\n email,\n phone,\n reference,\n metadata,\n paymentMethods,\n initialPaymentIntent,\n },\n apiBaseUrl,\n onSuccess: (result) => {\n onSuccess?.(result);\n // Keep modal open briefly to show success\n setTimeout(() => {\n setIsOpen(false);\n }, 2000);\n },\n onError,\n onClose: () => {\n setIsOpen(false);\n onClose?.();\n },\n onStateChange,\n });\n\n // Initialize when opened\n useEffect(() => {\n // Only initialize if opened and NOT in controlled mode with an initial intent\n if (isOpen && status === 'idle' && !initialPaymentIntent) {\n initialize();\n }\n }, [isOpen, status, initialize, initialPaymentIntent]);\n\n // Handle auto-advance logic\n useEffect(() => {\n // Only auto-advance if we have a selected method AND an intent\n if (isOpen && selectedMethod && paymentIntent && !showPSPBridge) {\n // For card, auto-advance if we have an intent\n if (selectedMethod === 'card') {\n setShowPSPBridge(true);\n }\n // For MoMo, auto-advance only if we have an intent AND a phone number\n else if (selectedMethod === 'mobile_money' && (momoData?.phone || phone)) {\n setShowPSPBridge(true);\n }\n }\n }, [isOpen, selectedMethod, showPSPBridge, paymentIntent, momoData, phone]);\n\n // Open modal\n const handleOpen = useCallback(() => {\n if (controlledIsOpen !== undefined) return; // Don't auto-open if controlled\n setIsOpen(true);\n setShowPSPBridge(false);\n setMomoData(null);\n }, [controlledIsOpen, setIsOpen]);\n\n // Close modal\n const handleClose = useCallback(() => {\n closeCheckout();\n setIsOpen(false);\n setShowPSPBridge(false);\n setMomoData(null);\n }, [closeCheckout, setIsOpen]);\n\n // Handle payment method selection\n const handleMethodSelect = useCallback(\n (method: PaymentMethod) => {\n selectMethod(method);\n },\n [selectMethod]\n );\n\n // Handle continue after method selection\n const handleContinue = useCallback(() => {\n if (!selectedMethod) return;\n\n if (selectedMethod === 'card') {\n // For card payments, show PSP bridge (Paystack popup)\n setShowPSPBridge(true);\n }\n // Mobile money form is already shown when selected\n }, [selectedMethod]);\n\n // Handle mobile money form submission\n const handleMomoSubmit = useCallback(\n (data: MobileMoneyFormData) => {\n setMomoData(data);\n setShowPSPBridge(true);\n },\n []\n );\n\n // Handle PSP callback\n const handlePSPSuccess = useCallback(\n (pspResult: any) => {\n processPayment({ ...pspResult, momoData });\n },\n [processPayment, momoData]\n );\n\n const handlePSPError = useCallback(\n (error: any) => {\n setShowPSPBridge(false);\n onError?.(error);\n },\n [onError]\n );\n\n const handlePSPClose = useCallback(() => {\n setShowPSPBridge(false);\n }, []);\n\n // Back button handler\n const handleBack = useCallback(() => {\n reset();\n setMomoData(null);\n setShowPSPBridge(false);\n }, [reset]);\n\n // Theme styles\n const themeStyles = theme ? createThemeVariables(theme as unknown as Record<string, string | undefined>) : {};\n\n // Render trigger\n // If in controlled mode (isOpen is provided), we don't attach an onClick to children\n // because the parent controls when the modal opens (usually after an API call).\n const isControlled = controlledIsOpen !== undefined;\n\n const trigger = children ? (\n <span onClick={isControlled ? undefined : handleOpen} role={isControlled ? undefined : \"button\"} tabIndex={isControlled ? undefined : 0}>\n {children}\n </span>\n ) : !isControlled ? (\n <button className=\"reevit-trigger-btn\" onClick={handleOpen}>\n Pay {formatAmount(amount, currency)}\n </button>\n ) : null;\n\n // Render content based on state\n const renderContent = () => {\n // Loading state\n if (status === 'loading' || status === 'processing') {\n return (\n <div className=\"reevit-loading\">\n <div className=\"reevit-spinner\" />\n <p>{status === 'loading' ? 'Preparing checkout...' : 'Processing payment...'}</p>\n </div>\n );\n }\n\n // Success state\n if (status === 'success' && result) {\n return (\n <div className=\"reevit-success\">\n <div className=\"reevit-success__icon\">✓</div>\n <h3>Payment Successful</h3>\n <p>Reference: {result.reference}</p>\n </div>\n );\n }\n\n // Error state (only if not recoverable)\n if (status === 'failed' && error && !error.recoverable) {\n return (\n <div className=\"reevit-error\">\n <div className=\"reevit-error__icon\">✕</div>\n <h3>Payment Failed</h3>\n <p>{error.message}</p>\n <button className=\"reevit-btn reevit-btn--primary\" onClick={handleBack}>\n Try Again\n </button>\n </div>\n );\n }\n\n // Determine PSP from payment intent or use default\n const psp = paymentIntent?.recommendedPsp || 'paystack';\n\n // PSP Bridge - dynamically route to the correct bridge based on provider\n if (showPSPBridge) {\n // Use PSP public key from payment intent if available, otherwise fall back to Reevit public key\n const pspKey = paymentIntent?.pspPublicKey || publicKey;\n\n // Common props for bridges that support them\n const bridgeMetadata = {\n ...metadata,\n // Override with correct payment intent ID for webhook routing\n // This ensures webhook includes the correct ID to find the payment\n payment_id: paymentIntent?.id,\n connection_id: paymentIntent?.connectionId ?? (metadata?.connection_id as string),\n customer_phone: momoData?.phone || phone,\n };\n\n // Route to the correct PSP bridge\n switch (psp) {\n case 'paystack':\n return (\n <PaystackBridge\n publicKey={pspKey}\n email={email}\n phone={momoData?.phone || phone}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={reference}\n accessCode={paymentIntent?.clientSecret}\n metadata={bridgeMetadata}\n channels={selectedMethod === 'mobile_money' ? ['mobile_money'] : ['card']}\n onSuccess={handlePSPSuccess}\n onError={handlePSPError}\n onClose={handlePSPClose}\n />\n );\n\n case 'hubtel':\n return (\n <HubtelBridge\n paymentId={paymentIntent?.id || ''}\n publicKey={publicKey}\n merchantAccount={pspKey}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference}\n email={email}\n phone={momoData?.phone || phone}\n description={`Payment ${paymentIntent?.reference || reference || ''}`}\n hubtelSessionToken={paymentIntent?.id ? paymentIntent.id : undefined}\n onSuccess={handlePSPSuccess}\n onError={(err: PaymentError) => handlePSPError(err)}\n onClose={handlePSPClose}\n />\n );\n\n case 'flutterwave':\n return (\n <FlutterwaveBridge\n publicKey={pspKey}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference}\n email={email}\n phone={momoData?.phone || phone}\n metadata={bridgeMetadata}\n onSuccess={handlePSPSuccess}\n onError={(err: PaymentError) => handlePSPError(err)}\n onClose={handlePSPClose}\n />\n );\n\n case 'monnify':\n // Monnify requires contractCode which should be in pspPublicKey or metadata\n return (\n <MonnifyBridge\n apiKey={pspKey}\n contractCode={(metadata?.contract_code as string) || pspKey}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference || `monnify_${Date.now()}`}\n customerName={(metadata?.customer_name as string) || email}\n customerEmail={email}\n customerPhone={momoData?.phone || phone}\n metadata={bridgeMetadata}\n onSuccess={(result) => handlePSPSuccess({\n paymentId: result.transactionReference,\n reference: result.paymentReference,\n amount: result.amount,\n currency: paymentIntent?.currency ?? currency,\n paymentMethod: selectedMethod || 'card',\n psp: 'monnify',\n pspReference: result.transactionReference,\n status: 'success',\n })}\n onError={(err) => handlePSPError({\n code: err.code,\n message: err.message,\n recoverable: true\n })}\n onClose={handlePSPClose}\n />\n );\n\n case 'mpesa':\n // M-Pesa uses STK Push via API endpoint\n return (\n <MPesaBridge\n apiEndpoint={`${apiBaseUrl || 'https://api.reevit.io'}/v1/payments/${paymentIntent?.id}/mpesa`}\n phoneNumber={momoData?.phone || phone || ''}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference || `mpesa_${Date.now()}`}\n description={`Payment ${paymentIntent?.reference || reference || ''}`}\n headers={{ 'x-reevit-public-key': publicKey }}\n onSuccess={(result) => handlePSPSuccess({\n paymentId: result.transactionId,\n reference: result.reference,\n amount: paymentIntent?.amount ?? amount,\n currency: paymentIntent?.currency ?? currency,\n paymentMethod: 'mobile_money',\n psp: 'mpesa',\n pspReference: result.transactionId,\n status: 'success',\n })}\n onError={(err) => handlePSPError({\n code: err.code,\n message: err.message,\n recoverable: true\n })}\n />\n );\n\n case 'stripe':\n return (\n <StripeBridge\n publishableKey={pspKey}\n clientSecret={paymentIntent?.clientSecret || ''}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n onSuccess={(result) => handlePSPSuccess({\n paymentId: result.paymentIntentId,\n reference: paymentIntent?.reference || reference || result.paymentIntentId,\n amount: paymentIntent?.amount ?? amount,\n currency: paymentIntent?.currency ?? currency,\n paymentMethod: selectedMethod || 'card',\n psp: 'stripe',\n pspReference: result.paymentIntentId,\n status: result.status === 'succeeded' ? 'success' : 'pending',\n })}\n onError={(err) => handlePSPError({\n code: err.code,\n message: err.message,\n recoverable: true\n })}\n onCancel={handlePSPClose}\n />\n );\n\n default:\n // Unsupported PSP - show error with option to retry\n return (\n <div className=\"reevit-error\">\n <div className=\"reevit-error__icon\">⚠️</div>\n <h3>Payment Provider Not Supported</h3>\n <p>The selected payment provider ({psp}) is not currently supported in this checkout.</p>\n <button className=\"reevit-btn reevit-btn--primary\" onClick={handleBack}>\n Go Back\n </button>\n </div>\n );\n }\n }\n\n\n // Mobile money form\n if (selectedMethod === 'mobile_money' && !showPSPBridge) {\n return (\n <MobileMoneyForm\n onSubmit={handleMomoSubmit}\n onCancel={handleBack}\n isLoading={isLoading}\n initialPhone={phone}\n />\n );\n }\n\n // Method selection\n return (\n <div className=\"reevit-method-step\">\n <PaymentMethodSelector\n methods={paymentMethods}\n selectedMethod={selectedMethod}\n onSelect={handleMethodSelect}\n disabled={isLoading}\n provider={psp}\n />\n\n {selectedMethod && selectedMethod !== 'mobile_money' && (\n <div className=\"reevit-method-step__actions\">\n <button\n className=\"reevit-btn reevit-btn--primary\"\n onClick={handleContinue}\n disabled={isLoading}\n >\n Continue\n </button>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <ReevitContext.Provider value={{ publicKey, amount, currency }}>\n {trigger}\n\n {isOpen && (\n <div className=\"reevit-overlay\" onClick={handleClose}>\n <div\n className={cn('reevit-modal', isComplete && 'reevit-modal--success')}\n style={themeStyles}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Header */}\n <div className=\"reevit-modal__header\">\n <div className=\"reevit-modal__branding\">\n <img\n src=\"https://i.imgur.com/bzUR5Lm.png\"\n alt=\"Reevit\"\n className=\"reevit-modal__logo\"\n />\n </div>\n <button\n className=\"reevit-modal__close\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n {/* Amount display */}\n <div className=\"reevit-modal__amount\">\n <span className=\"reevit-modal__amount-label\">Amount</span>\n <span className=\"reevit-modal__amount-value\">\n {formatAmount(amount, currency)}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"reevit-modal__content\">\n {renderContent()}\n </div>\n\n {/* Footer */}\n <div className=\"reevit-modal__footer\">\n <span className=\"reevit-modal__secured\">\n 🔒 Secured by Reevit\n </span>\n </div>\n </div>\n </div>\n )}\n </ReevitContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/index.ts","../src/api/client.ts","../src/hooks/useReevit.ts","../src/components/PaymentMethodSelector.tsx","../src/components/MobileMoneyForm.tsx","../src/components/ProviderSelector.tsx","../src/bridges/PaystackBridge.tsx","../src/bridges/HubtelBridge.tsx","../src/bridges/FlutterwaveBridge.tsx","../src/bridges/MonnifyBridge.tsx","../src/bridges/MPesaBridge.tsx","../src/bridges/StripeBridge.tsx","../src/components/ReevitCheckout.tsx"],"names":["options","useEffect","useCallback","jsxs","jsx","useRef","useState","result","error"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Utility functions for the Reevit React SDK\n */\n\n/**\n * Format amount for display\n */\nexport function formatAmount(amount: number, currency: string): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency,\n minimumFractionDigits: 2,\n });\n\n // Amount is in smallest unit (pesewas, kobo, cents)\n return formatter.format(amount / 100);\n}\n\n/**\n * Generate a unique reference if not provided\n */\nexport function generateReference(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `reevit_${timestamp}_${random}`;\n}\n\n/**\n * Validate phone number for mobile money\n */\nexport function validatePhone(phone: string, network?: string): boolean {\n // Remove spaces and dashes\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Check for valid Ghana phone number formats\n const patterns = {\n mtn: /^(0|233|\\+233)?(24|54|55|59)\\d{7}$/,\n vodafone: /^(0|233|\\+233)?(20|50)\\d{7}$/,\n airteltigo: /^(0|233|\\+233)?(26|27|56|57)\\d{7}$/,\n };\n\n if (network && patterns[network as keyof typeof patterns]) {\n return patterns[network as keyof typeof patterns].test(cleaned);\n }\n\n // If no network specified, check all patterns\n return Object.values(patterns).some((pattern) => pattern.test(cleaned));\n}\n\n/**\n * Format phone number for display\n */\nexport function formatPhone(phone: string): string {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n // Format as 0XX XXX XXXX\n if (cleaned.startsWith('0') && cleaned.length === 10) {\n return `${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6)}`;\n }\n\n // Format +233 XX XXX XXXX\n if (cleaned.startsWith('+233') && cleaned.length === 13) {\n return `${cleaned.slice(0, 4)} ${cleaned.slice(4, 6)} ${cleaned.slice(6, 9)} ${cleaned.slice(9)}`;\n }\n\n return phone;\n}\n\n/**\n * Detect mobile money network from phone number\n */\nexport function detectNetwork(phone: string): string | null {\n const cleaned = phone.replace(/[\\s-]/g, '');\n\n const prefixes: Record<string, string[]> = {\n mtn: ['024', '054', '055', '059', '23324', '23354', '23355', '23359'],\n vodafone: ['020', '050', '23320', '23350'],\n airteltigo: ['026', '027', '056', '057', '23326', '23327', '23356', '23357'],\n };\n\n for (const [network, networkPrefixes] of Object.entries(prefixes)) {\n for (const prefix of networkPrefixes) {\n if (cleaned.startsWith(prefix) || cleaned.startsWith('0' + prefix.slice(3))) {\n return network;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Create CSS variables from theme\n */\nexport function createThemeVariables(theme: Record<string, string | undefined>): Record<string, string> {\n const variables: Record<string, string> = {};\n\n if (theme.primaryColor) {\n variables['--reevit-primary'] = theme.primaryColor;\n if (theme.primaryForegroundColor) {\n variables['--reevit-primary-foreground'] = theme.primaryForegroundColor;\n } else {\n const contrast = getContrastingColor(theme.primaryColor);\n if (contrast) {\n variables['--reevit-primary-foreground'] = contrast;\n }\n }\n }\n if (theme.backgroundColor) {\n variables['--reevit-background'] = theme.backgroundColor;\n }\n if (theme.surfaceColor) {\n variables['--reevit-surface'] = theme.surfaceColor;\n }\n if (theme.textColor) {\n variables['--reevit-text'] = theme.textColor;\n }\n if (theme.mutedTextColor) {\n variables['--reevit-text-secondary'] = theme.mutedTextColor;\n }\n if (theme.borderRadius) {\n variables['--reevit-radius'] = theme.borderRadius;\n variables['--reevit-radius-sm'] = theme.borderRadius;\n variables['--reevit-radius-lg'] = theme.borderRadius;\n }\n if (theme.fontFamily) {\n variables['--reevit-font'] = theme.fontFamily;\n }\n\n return variables;\n}\n\nfunction getContrastingColor(color: string): string | null {\n const hex = color.trim();\n if (!hex.startsWith('#')) {\n return null;\n }\n\n const normalized = hex.length === 4\n ? `#${hex[1]}${hex[1]}${hex[2]}${hex[2]}${hex[3]}${hex[3]}`\n : hex;\n\n if (normalized.length !== 7) {\n return null;\n }\n\n const r = parseInt(normalized.slice(1, 3), 16);\n const g = parseInt(normalized.slice(3, 5), 16);\n const b = parseInt(normalized.slice(5, 7), 16);\n\n if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) {\n return null;\n }\n\n const brightness = (r * 299 + g * 587 + b * 114) / 1000;\n return brightness >= 140 ? '#0b1120' : '#ffffff';\n}\n\n/**\n * Merge class names\n */\nexport function cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","/**\n * Reevit API Client\n * \n * Handles communication with the Reevit backend for payment operations.\n */\n\nimport type { PaymentMethod, ReevitCheckoutConfig, PaymentError } from '../types';\n\n// API Response Types (matching backend handlers_payments.go)\nexport interface CreatePaymentIntentRequest {\n amount: number;\n currency: string;\n method: string;\n country: string;\n customer_id?: string;\n phone?: string;\n metadata?: Record<string, unknown>;\n description?: string;\n policy?: {\n prefer?: string[];\n allowed_providers?: string[];\n max_amount?: number;\n blocked_bins?: string[];\n allowed_bins?: string[];\n velocity_max_per_minute?: number;\n };\n}\n\nexport interface PaymentIntentResponse {\n id: string;\n connection_id: string;\n provider: string;\n status: string;\n client_secret: string;\n psp_public_key?: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n reference?: string;\n available_psps?: Array<{\n provider: string;\n name: string;\n methods: string[];\n countries?: string[];\n }>;\n branding?: Record<string, unknown>;\n}\n\n/**\n * Response from creating a Hubtel session token.\n * The token provides secure, short-lived access to Hubtel checkout without exposing credentials.\n */\nexport interface HubtelSessionResponse {\n /** Short-lived session token for Hubtel checkout */\n token: string;\n /** Hubtel merchant account number */\n merchantAccount: string;\n /** Token expiry time in seconds */\n expiresInSeconds: number;\n /** Unix timestamp when the token expires */\n expiresAt: number;\n}\n\nexport interface ConfirmPaymentRequest {\n provider_ref_id: string;\n provider_data?: Record<string, unknown>;\n}\n\nexport interface PaymentDetailResponse {\n id: string;\n connection_id: string;\n provider: string;\n method: string;\n status: string;\n amount: number;\n currency: string;\n fee_amount: number;\n fee_currency: string;\n net_amount: number;\n customer_id?: string;\n client_secret: string;\n provider_ref_id?: string;\n metadata?: Record<string, unknown>;\n created_at: string;\n updated_at: string;\n /** Payment source type (payment_link, api, subscription) */\n source?: 'payment_link' | 'api' | 'subscription';\n /** ID of the source (payment link ID, subscription ID, etc.) */\n source_id?: string;\n /** Human-readable description of the source (e.g., payment link name) */\n source_description?: string;\n}\n\nexport interface APIErrorResponse {\n code: string;\n message: string;\n details?: Record<string, string>;\n}\n\n// API Client configuration\nexport interface ReevitAPIClientConfig {\n /** Your Reevit public key */\n publicKey: string;\n /** Base URL for the Reevit API (defaults to production) */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n// Default API base URLs\nconst API_BASE_URL_PRODUCTION = 'https://api.reevit.io';\nconst API_BASE_URL_SANDBOX = 'https://sandbox-api.reevit.io';\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\n\n/**\n * Determines if a public key is for sandbox mode\n */\nfunction isSandboxKey(publicKey: string): boolean {\n // Support various test/sandbox key prefixes\n return publicKey.startsWith('pk_test_') ||\n publicKey.startsWith('pk_sandbox_') ||\n publicKey.startsWith('pfk_test_') ||\n publicKey.startsWith('pfk_sandbox_');\n}\n\n/**\n * Creates a PaymentError from an API error response\n */\nfunction createPaymentError(response: Response, errorData: APIErrorResponse): PaymentError {\n return {\n code: errorData.code || 'api_error',\n message: errorData.message || 'An unexpected error occurred',\n details: {\n httpStatus: response.status,\n ...errorData.details,\n },\n };\n}\n\n/**\n * Reevit API Client\n */\nexport class ReevitAPIClient {\n private readonly publicKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(config: ReevitAPIClientConfig) {\n this.publicKey = config.publicKey;\n this.baseUrl = config.baseUrl || (isSandboxKey(config.publicKey)\n ? API_BASE_URL_SANDBOX\n : API_BASE_URL_PRODUCTION);\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Makes an authenticated API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<{ data?: T; error?: PaymentError }> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n // Generate idempotency key for POST requests\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Reevit-Key': this.publicKey,\n 'X-Reevit-Client': '@reevit/react',\n 'X-Reevit-Client-Version': '0.3.2',\n };\n\n // Add idempotency key for mutating requests\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n headers['Idempotency-Key'] = `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseData = await response.json().catch(() => ({}));\n\n if (!response.ok) {\n return {\n error: createPaymentError(response, responseData as APIErrorResponse),\n };\n }\n\n return { data: responseData as T };\n } catch (err) {\n clearTimeout(timeoutId);\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return {\n error: {\n code: 'request_timeout',\n message: 'The request timed out. Please try again.',\n },\n };\n }\n\n if (err.message.includes('Failed to fetch') || err.message.includes('NetworkError')) {\n return {\n error: {\n code: 'network_error',\n message: 'Unable to connect to Reevit. Please check your internet connection.',\n },\n };\n }\n }\n\n return {\n error: {\n code: 'unknown_error',\n message: 'An unexpected error occurred. Please try again.',\n },\n };\n }\n }\n\n /**\n * Creates a payment intent\n */\n async createPaymentIntent(\n config: ReevitCheckoutConfig,\n method: PaymentMethod,\n country: string = 'GH',\n options?: { preferredProviders?: string[]; allowedProviders?: string[] }\n ): Promise<{ data?: PaymentIntentResponse; error?: PaymentError }> {\n // Build metadata with customer_email for PSP providers that require it\n const metadata: Record<string, unknown> = { ...config.metadata };\n if (config.email) {\n metadata.customer_email = config.email;\n }\n if (config.phone) {\n metadata.customer_phone = config.phone;\n }\n\n const request: CreatePaymentIntentRequest = {\n amount: config.amount,\n currency: config.currency,\n method: this.mapPaymentMethod(method),\n country,\n customer_id: config.email || (config.metadata?.customerId as string | undefined),\n phone: config.phone,\n metadata,\n };\n\n if (options?.preferredProviders?.length || options?.allowedProviders?.length) {\n request.policy = {\n prefer: options?.preferredProviders,\n allowed_providers: options?.allowedProviders,\n };\n }\n\n return this.request<PaymentIntentResponse>('POST', '/v1/payments/intents', request);\n }\n\n /**\n * Retrieves a payment intent by ID\n */\n async getPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('GET', `/v1/payments/${paymentId}`);\n }\n\n /**\n * Confirms a payment intent after PSP callback (public endpoint)\n */\n async confirmPaymentIntent(paymentId: string, clientSecret: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/confirm-intent?client_secret=${clientSecret}`);\n }\n\n /**\n * Confirms a payment after PSP callback (authenticated endpoint)\n */\n async confirmPayment(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/confirm`);\n }\n\n /**\n * Cancels a payment intent\n */\n async cancelPaymentIntent(paymentId: string): Promise<{ data?: PaymentDetailResponse; error?: PaymentError }> {\n return this.request<PaymentDetailResponse>('POST', `/v1/payments/${paymentId}/cancel`);\n }\n\n /**\n * Creates a Hubtel session token for secure checkout.\n * This endpoint generates a short-lived token that maps to Hubtel credentials server-side,\n * avoiding exposure of sensitive credentials to the client.\n *\n * @param paymentId - The payment intent ID for Hubtel checkout\n * @returns Hubtel session with token, merchant account, and expiry information\n */\n async createHubtelSession(paymentId: string): Promise<{ data?: HubtelSessionResponse; error?: PaymentError }> {\n return this.request<HubtelSessionResponse>('POST', `/v1/payments/hubtel/sessions/${paymentId}`);\n }\n\n /**\n * Maps SDK payment method to backend format\n */\n private mapPaymentMethod(method: PaymentMethod): string {\n switch (method) {\n case 'card':\n return 'card';\n case 'mobile_money':\n return 'mobile_money';\n case 'bank_transfer':\n return 'bank_transfer';\n default:\n return method;\n }\n }\n}\n\n/**\n * Creates a new Reevit API client instance\n */\nexport function createReevitClient(config: ReevitAPIClientConfig): ReevitAPIClient {\n return new ReevitAPIClient(config);\n}\n","/**\n * useReevit hook\n * Core hook for managing Reevit checkout state and API interactions\n */\n\nimport { useCallback, useReducer, useEffect, useRef } from 'react';\nimport type {\n ReevitCheckoutConfig,\n CheckoutState,\n PaymentMethod,\n PaymentResult,\n PaymentError,\n PaymentIntent,\n CheckoutProviderOption,\n} from '../types';\nimport { generateReference } from '../utils';\nimport { ReevitAPIClient, type PaymentIntentResponse } from '../api';\n\n// State shape\ninterface ReevitState {\n status: CheckoutState;\n paymentIntent: PaymentIntent | null;\n selectedMethod: PaymentMethod | null;\n error: PaymentError | null;\n result: PaymentResult | null;\n}\n\n// Actions\ntype ReevitAction =\n | { type: 'INIT_START' }\n | { type: 'INIT_SUCCESS'; payload: PaymentIntent }\n | { type: 'INIT_ERROR'; payload: PaymentError }\n | { type: 'SELECT_METHOD'; payload: PaymentMethod }\n | { type: 'PROCESS_START' }\n | { type: 'PROCESS_SUCCESS'; payload: PaymentResult }\n | { type: 'PROCESS_ERROR'; payload: PaymentError }\n | { type: 'RESET' }\n | { type: 'CLOSE' };\n\n// Initial state\nconst initialState: ReevitState = {\n status: 'idle',\n paymentIntent: null,\n selectedMethod: null,\n error: null,\n result: null,\n};\n\n// Reducer\nfunction reevitReducer(state: ReevitState, action: ReevitAction): ReevitState {\n switch (action.type) {\n case 'INIT_START':\n return { ...state, status: 'loading', error: null };\n case 'INIT_SUCCESS':\n return {\n ...state,\n status: 'ready',\n paymentIntent: action.payload,\n selectedMethod:\n action.payload.availableMethods?.length === 1 ? action.payload.availableMethods[0] : null,\n };\n case 'INIT_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'SELECT_METHOD':\n return { ...state, status: 'method_selected', selectedMethod: action.payload };\n case 'PROCESS_START':\n return { ...state, status: 'processing', error: null };\n case 'PROCESS_SUCCESS':\n return { ...state, status: 'success', result: action.payload };\n case 'PROCESS_ERROR':\n return { ...state, status: 'failed', error: action.payload };\n case 'RESET':\n return { ...initialState, status: 'ready', paymentIntent: state.paymentIntent };\n case 'CLOSE':\n return { ...state, status: 'closed' };\n default:\n return state;\n }\n}\n\ninterface UseReevitOptions {\n config: ReevitCheckoutConfig;\n onSuccess?: (result: PaymentResult) => void;\n onError?: (error: PaymentError) => void;\n onClose?: () => void;\n onStateChange?: (state: CheckoutState) => void;\n /** Custom API base URL (for testing or self-hosted deployments) */\n apiBaseUrl?: string;\n}\n\n/**\n * Maps PSP provider names from backend to PSP type used by bridges\n */\nfunction mapProviderToPsp(provider: string): 'paystack' | 'hubtel' | 'flutterwave' | 'monnify' | 'mpesa' | 'stripe' {\n const providerLower = provider.toLowerCase();\n if (providerLower.includes('paystack')) return 'paystack';\n if (providerLower.includes('hubtel')) return 'hubtel';\n if (providerLower.includes('flutterwave')) return 'flutterwave';\n if (providerLower.includes('monnify')) return 'monnify';\n if (providerLower.includes('mpesa') || providerLower.includes('m-pesa')) return 'mpesa';\n if (providerLower.includes('stripe')) return 'stripe';\n // Default to paystack if unknown\n return 'paystack';\n}\n\nfunction normalizeProviderMethod(method: string): PaymentMethod | null {\n const normalized = method.toLowerCase().trim();\n if (normalized === 'card') return 'card';\n if (normalized === 'mobile_money' || normalized === 'momo' || normalized === 'mobilemoney') return 'mobile_money';\n if (normalized === 'bank' || normalized === 'bank_transfer' || normalized === 'transfer') return 'bank_transfer';\n return null;\n}\n\nfunction mapAvailableProviders(\n providers?: Array<{ provider: string; name: string; methods: string[]; countries?: string[] }>\n): CheckoutProviderOption[] | undefined {\n if (!providers || providers.length === 0) return undefined;\n\n return providers\n .map((provider) => {\n const methods = provider.methods\n .map((method) => normalizeProviderMethod(method))\n .filter(Boolean) as PaymentMethod[];\n\n return {\n provider: provider.provider,\n name: provider.name,\n methods,\n countries: provider.countries,\n };\n })\n .filter((provider) => provider.methods.length > 0);\n}\n\n\n/**\n * Maps backend payment intent response to SDK PaymentIntent type\n */\nfunction mapToPaymentIntent(\n response: PaymentIntentResponse,\n config: ReevitCheckoutConfig\n): PaymentIntent {\n return {\n id: response.id,\n clientSecret: response.client_secret,\n pspPublicKey: response.psp_public_key,\n amount: response.amount,\n currency: response.currency,\n status: response.status as 'pending' | 'processing' | 'succeeded' | 'failed' | 'cancelled',\n recommendedPsp: mapProviderToPsp(response.provider),\n availableMethods: config.paymentMethods || ['card', 'mobile_money'],\n reference: response.reference || response.id, // Use backend reference or fallback to ID\n connectionId: response.connection_id,\n provider: response.provider,\n feeAmount: response.fee_amount,\n feeCurrency: response.fee_currency,\n netAmount: response.net_amount,\n metadata: config.metadata,\n availableProviders: mapAvailableProviders(response.available_psps),\n branding: response.branding as PaymentIntent['branding'],\n };\n}\n\nexport function useReevit(options: UseReevitOptions) {\n const { config, onSuccess, onError, onClose, onStateChange, apiBaseUrl } = options;\n const [state, dispatch] = useReducer(reevitReducer, {\n ...initialState,\n status: config.initialPaymentIntent ? 'ready' : 'idle',\n paymentIntent: config.initialPaymentIntent || null,\n selectedMethod:\n config.initialPaymentIntent?.availableMethods?.length === 1\n ? config.initialPaymentIntent.availableMethods[0]\n : null,\n });\n\n // Create API client ref (stable across re-renders)\n const apiClientRef = useRef<ReevitAPIClient | null>(null);\n\n // Guard against duplicate initialize() calls (React StrictMode)\n const initializingRef = useRef(!!config.initialPaymentIntent);\n\n // Update state if config.initialPaymentIntent changes\n useEffect(() => {\n if (config.initialPaymentIntent) {\n if (!state.paymentIntent || state.paymentIntent.id !== config.initialPaymentIntent.id) {\n dispatch({ type: 'INIT_SUCCESS', payload: config.initialPaymentIntent });\n initializingRef.current = true;\n }\n }\n }, [config.initialPaymentIntent, state.paymentIntent?.id]);\n\n // Initialize API client\n if (!apiClientRef.current) {\n apiClientRef.current = new ReevitAPIClient({\n publicKey: config.publicKey,\n baseUrl: apiBaseUrl,\n });\n }\n\n // Notify on state changes\n useEffect(() => {\n onStateChange?.(state.status);\n }, [state.status, onStateChange]);\n\n // Initialize payment intent\n const initialize = useCallback(\n async (\n method?: PaymentMethod,\n options?: { preferredProvider?: string; allowedProviders?: string[] }\n ) => {\n // Guard against duplicate calls (especially in React StrictMode)\n if (initializingRef.current) {\n return;\n }\n initializingRef.current = true;\n\n dispatch({ type: 'INIT_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n initializingRef.current = false;\n throw new Error('API client not initialized');\n }\n\n // Generate reference if not provided\n const reference = config.reference || generateReference();\n\n // Determine country from currency (can be enhanced with IP detection)\n const country = detectCountryFromCurrency(config.currency);\n\n // Select payment method to send to backend\n const paymentMethod = method || config.paymentMethods?.[0] || 'card';\n\n // Call the Reevit API to create a payment intent\n const { data, error } = await apiClient.createPaymentIntent(\n { ...config, reference },\n paymentMethod,\n country,\n {\n preferredProviders: options?.preferredProvider ? [options.preferredProvider] : undefined,\n allowedProviders: options?.allowedProviders,\n }\n );\n\n if (error) {\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n if (!data) {\n const noDataError: PaymentError = {\n code: 'INIT_FAILED',\n message: 'No data received from API',\n recoverable: true,\n };\n dispatch({ type: 'INIT_ERROR', payload: noDataError });\n onError?.(noDataError);\n initializingRef.current = false;\n return;\n }\n\n // Map response to PaymentIntent\n const paymentIntent = mapToPaymentIntent(data, { ...config, reference });\n\n dispatch({ type: 'INIT_SUCCESS', payload: paymentIntent });\n // Don't reset initializingRef here - once initialized, stay initialized until reset()\n } catch (err) {\n const error: PaymentError = {\n code: 'INIT_FAILED',\n message: err instanceof Error ? err.message : 'Failed to initialize checkout',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'INIT_ERROR', payload: error });\n onError?.(error);\n initializingRef.current = false;\n }\n },\n [config, onError, apiBaseUrl]\n );\n\n // Select payment method\n const selectMethod = useCallback((method: PaymentMethod) => {\n dispatch({ type: 'SELECT_METHOD', payload: method });\n }, []);\n\n // Process payment - called after PSP bridge returns success\n const processPayment = useCallback(\n async (paymentData: Record<string, unknown>) => {\n if (!state.paymentIntent || !state.selectedMethod) {\n return;\n }\n\n dispatch({ type: 'PROCESS_START' });\n\n try {\n const apiClient = apiClientRef.current;\n if (!apiClient) {\n throw new Error('API client not initialized');\n }\n\n // Confirm the payment with the backend\n // If we have a clientSecret, use the public confirm-intent endpoint\n const clientSecret = state.paymentIntent.clientSecret;\n const { data, error } = clientSecret\n ? await apiClient.confirmPaymentIntent(state.paymentIntent.id, clientSecret)\n : await apiClient.confirmPayment(state.paymentIntent.id);\n\n if (error) {\n console.error('[useReevit] Confirmation error:', error);\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n return;\n }\n\n // Build successful payment result\n const result: PaymentResult = {\n paymentId: state.paymentIntent.id,\n reference: (paymentData.reference as string) ||\n (state.paymentIntent.metadata?.reference as string) || '',\n amount: state.paymentIntent.amount,\n currency: state.paymentIntent.currency,\n paymentMethod: state.selectedMethod,\n psp: state.paymentIntent.recommendedPsp,\n pspReference: (paymentData.pspReference as string) ||\n (data?.provider_ref_id as string) || '',\n status: data?.status === 'succeeded' ? 'success' : 'pending',\n metadata: { ...paymentData, backend_status: data?.status },\n };\n\n if (result.status === 'success') {\n dispatch({ type: 'PROCESS_SUCCESS', payload: result });\n onSuccess?.(result);\n } else {\n // If still pending but PSP reported success, we treat it as success for the UI\n // but we can pass the real status in metadata\n dispatch({ type: 'PROCESS_SUCCESS', payload: result });\n onSuccess?.(result);\n }\n } catch (err) {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: err instanceof Error ? err.message : 'Payment failed. Please try again.',\n recoverable: true,\n originalError: err,\n };\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n }\n },\n [state.paymentIntent, state.selectedMethod, onSuccess, onError]\n );\n\n // Handle PSP bridge success (called by PSP bridge components)\n const handlePspSuccess = useCallback(\n async (pspData: Record<string, unknown>) => {\n await processPayment(pspData);\n },\n [processPayment]\n );\n\n // Handle PSP bridge failure\n const handlePspError = useCallback(\n (error: PaymentError) => {\n dispatch({ type: 'PROCESS_ERROR', payload: error });\n onError?.(error);\n },\n [onError]\n );\n\n // Reset checkout\n const reset = useCallback(() => {\n initializingRef.current = false;\n dispatch({ type: 'RESET' });\n }, []);\n\n // Close checkout\n const close = useCallback(async () => {\n // Cancel the payment intent if it exists and is still pending\n if (state.paymentIntent && state.status !== 'success') {\n try {\n const apiClient = apiClientRef.current;\n if (apiClient) {\n await apiClient.cancelPaymentIntent(state.paymentIntent.id);\n }\n } catch {\n // Silently ignore cancel errors\n }\n }\n\n dispatch({ type: 'CLOSE' });\n onClose?.();\n }, [onClose, state.paymentIntent, state.status]);\n\n return {\n // State\n status: state.status,\n paymentIntent: state.paymentIntent,\n selectedMethod: state.selectedMethod,\n error: state.error,\n result: state.result,\n\n // Actions\n initialize,\n selectMethod,\n processPayment,\n handlePspSuccess,\n handlePspError,\n reset,\n close,\n\n // Computed\n isLoading: state.status === 'loading' || state.status === 'processing',\n isReady: state.status === 'ready' || state.status === 'method_selected',\n isComplete: state.status === 'success',\n canRetry: state.error?.recoverable ?? false,\n };\n}\n\n/**\n * Detects country code from currency\n * This is a simple heuristic; in production, you might use IP geolocation\n */\nfunction detectCountryFromCurrency(currency: string): string {\n const currencyToCountry: Record<string, string> = {\n GHS: 'GH', // Ghana\n NGN: 'NG', // Nigeria\n KES: 'KE', // Kenya\n UGX: 'UG', // Uganda\n TZS: 'TZ', // Tanzania\n ZAR: 'ZA', // South Africa\n XOF: 'CI', // Côte d'Ivoire (CFA)\n XAF: 'CM', // Cameroon (CFA)\n USD: 'US', // United States\n EUR: 'DE', // Europe (default to Germany)\n GBP: 'GB', // United Kingdom\n };\n\n return currencyToCountry[currency.toUpperCase()] || 'GH';\n}\n","/**\n * PaymentMethodSelector Component\n * Displays available payment methods for user selection\n */\n\nimport type { PaymentMethod } from \"../types\";\nimport { cn } from \"../utils\";\n\ninterface PaymentMethodSelectorProps {\n methods: PaymentMethod[];\n selectedMethod: PaymentMethod | null;\n onSelect: (method: PaymentMethod) => void;\n disabled?: boolean;\n provider?: string;\n}\n\n// Human-readable PSP names\nconst pspNames: Record<string, string> = {\n hubtel: \"Hubtel\",\n paystack: \"Paystack\",\n flutterwave: \"Flutterwave\",\n monnify: \"Monnify\",\n mpesa: \"M-Pesa\",\n stripe: \"Stripe\",\n};\n\n// Payment method configuration\nconst methodConfig: Record<\n PaymentMethod,\n { label: string; icon: string; description: string }\n> = {\n card: {\n label: \"Card\",\n icon: \"💳\",\n description: \"Pay with Visa, Mastercard, or other cards\",\n },\n mobile_money: {\n label: \"Mobile Money\",\n icon: \"📱\",\n description: \"MTN, Vodafone Cash, AirtelTigo Money\",\n },\n bank_transfer: {\n label: \"Bank Transfer\",\n icon: \"🏦\",\n description: \"Pay directly from your bank account\",\n },\n};\n\nexport function PaymentMethodSelector({\n methods,\n selectedMethod,\n onSelect,\n disabled = false,\n provider,\n}: PaymentMethodSelectorProps) {\n const getMethodLabel = (method: PaymentMethod, psp?: string): string => {\n const config = methodConfig[method];\n\n // For Hubtel, show \"Pay with Hubtel\" instead of card/mobile_money options\n if (psp?.toLowerCase().includes(\"hubtel\") && method === \"mobile_money\") {\n return `Pay with ${pspNames[psp.toLowerCase()] || \"Hubtel\"}`;\n }\n\n return config.label;\n };\n\n const getMethodDescription = (method: PaymentMethod, psp?: string): string => {\n const config = methodConfig[method];\n\n // Hubtel handles everything internally, no need for extra description\n if (psp?.toLowerCase().includes(\"hubtel\")) {\n return \"Card, Mobile Money, and Bank Transfer\";\n }\n\n return config.description;\n };\n\n return (\n <div className=\"reevit-method-selector\">\n <div className=\"reevit-method-selector__label\">Select payment method</div>\n <div className=\"reevit-method-selector__options\">\n {methods.map((method) => {\n const config = methodConfig[method];\n const isSelected = selectedMethod === method;\n const methodLabel = getMethodLabel(method, provider);\n const methodDescription = getMethodDescription(method, provider);\n\n return (\n <button\n key={method}\n type=\"button\"\n className={cn(\n \"reevit-method-option\",\n isSelected && \"reevit-method-option--selected\",\n disabled && \"reevit-method-option--disabled\",\n )}\n onClick={() => onSelect(method)}\n disabled={disabled}\n aria-pressed={isSelected}\n >\n <span className=\"reevit-method-option__icon\">{config.icon}</span>\n <div className=\"reevit-method-option__content\">\n <span className=\"reevit-method-option__label\">{methodLabel}</span>\n <span className=\"reevit-method-option__description\">\n {methodDescription}\n </span>\n </div>\n {isSelected && (\n <span className=\"reevit-method-option__check\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M16.667 5L7.5 14.167 3.333 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * MobileMoneyForm Component\n * Form for collecting mobile money payment details\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { MobileMoneyNetwork, MobileMoneyFormData } from '../types';\nimport { validatePhone, detectNetwork, formatPhone, cn } from '../utils';\n\ninterface MobileMoneyFormProps {\n onSubmit: (data: MobileMoneyFormData) => void;\n onCancel: () => void;\n isLoading?: boolean;\n initialPhone?: string;\n}\n\nconst networks: { id: MobileMoneyNetwork; name: string; color: string }[] = [\n { id: 'mtn', name: 'MTN', color: '#FFCC00' },\n { id: 'vodafone', name: 'Vodafone', color: '#E60000' },\n { id: 'airteltigo', name: 'AirtelTigo', color: '#E4002B' },\n];\n\nexport function MobileMoneyForm({\n onSubmit,\n onCancel,\n isLoading = false,\n initialPhone = '',\n}: MobileMoneyFormProps) {\n const [phone, setPhone] = useState(initialPhone);\n const [network, setNetwork] = useState<MobileMoneyNetwork | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [touched, setTouched] = useState(false);\n\n // Auto-detect network from phone number\n useEffect(() => {\n if (phone.length >= 3) {\n const detected = detectNetwork(phone);\n if (detected) {\n setNetwork(detected as MobileMoneyNetwork);\n }\n }\n }, [phone]);\n\n // Validate on change\n useEffect(() => {\n if (touched && phone) {\n if (!validatePhone(phone)) {\n setError('Please enter a valid Ghana phone number');\n } else if (network && !validatePhone(phone, network)) {\n setError(`This number doesn't match the selected network`);\n } else {\n setError(null);\n }\n }\n }, [phone, network, touched]);\n\n const handlePhoneChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^0-9+]/g, '');\n setPhone(value);\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n setTouched(true);\n\n if (!phone || !network) {\n setError('Please enter your phone number and select a network');\n return;\n }\n\n if (!validatePhone(phone, network)) {\n setError('Invalid phone number for selected network');\n return;\n }\n\n onSubmit({ phone, network });\n },\n [phone, network, onSubmit]\n );\n\n const isValid = phone && network && validatePhone(phone, network);\n\n return (\n <form className=\"reevit-momo-form\" onSubmit={handleSubmit}>\n <div className=\"reevit-momo-form__field\">\n <label htmlFor=\"reevit-phone\" className=\"reevit-momo-form__label\">\n Phone Number\n </label>\n <input\n id=\"reevit-phone\"\n type=\"tel\"\n className={cn('reevit-momo-form__input', !!error && 'reevit-momo-form__input--error')}\n placeholder=\"024 XXX XXXX\"\n value={phone}\n onChange={handlePhoneChange}\n onBlur={() => setTouched(true)}\n disabled={isLoading}\n autoComplete=\"tel\"\n />\n {phone && !error && (\n <div className=\"reevit-momo-form__formatted\">{formatPhone(phone)}</div>\n )}\n {error && <div className=\"reevit-momo-form__error\">{error}</div>}\n </div>\n\n <div className=\"reevit-momo-form__field\">\n <label className=\"reevit-momo-form__label\">Select Network</label>\n <div className=\"reevit-momo-form__networks\">\n {networks.map((n) => (\n <button\n key={n.id}\n type=\"button\"\n className={cn(\n 'reevit-network-btn',\n network === n.id && 'reevit-network-btn--selected'\n )}\n style={{ '--network-color': n.color } as React.CSSProperties}\n onClick={() => setNetwork(n.id)}\n disabled={isLoading}\n >\n {n.name}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"reevit-momo-form__actions\">\n <button\n type=\"button\"\n className=\"reevit-btn reevit-btn--secondary\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Back\n </button>\n <button\n type=\"submit\"\n className=\"reevit-btn reevit-btn--primary\"\n disabled={!isValid || isLoading}\n >\n {isLoading ? (\n <span className=\"reevit-spinner\" />\n ) : (\n 'Continue'\n )}\n </button>\n </div>\n\n <p className=\"reevit-momo-form__hint\">\n You will receive a USSD prompt on your phone to authorize the payment.\n </p>\n </form>\n );\n}\n","/**\n * ProviderSelector Component\n * Displays available PSPs for customer selection\n */\n\nimport type { CheckoutProviderOption, PaymentMethod } from \"../types\";\nimport { cn } from \"../utils\";\n\nimport flutterwaveLogo from \"../assets/providers/flutterwave.png\";\nimport hubtelLogo from \"../assets/providers/hubtel.png\";\nimport monnifyLogo from \"../assets/providers/monnify.png\";\nimport mpesaLogo from \"../assets/providers/mpesa.png\";\nimport paystackLogo from \"../assets/providers/paystack.png\";\nimport stripeLogo from \"../assets/providers/stripe.png\";\n\ninterface ProviderSelectorProps {\n providers: CheckoutProviderOption[];\n selectedProvider: string | null;\n onSelect: (provider: string) => void;\n disabled?: boolean;\n}\n\nconst providerMeta: Record<string, { logo?: string; hint: string }> = {\n paystack: { logo: paystackLogo, hint: \"Card & MoMo\" },\n stripe: { logo: stripeLogo, hint: \"Card payments\" },\n flutterwave: { logo: flutterwaveLogo, hint: \"Global methods\" },\n hubtel: { logo: hubtelLogo, hint: \"Mobile money\" },\n monnify: { logo: monnifyLogo, hint: \"Bank & card\" },\n mpesa: { logo: mpesaLogo, hint: \"M-Pesa\" },\n};\n\nconst methodLabels: Record<PaymentMethod, string> = {\n card: \"Card\",\n mobile_money: \"Mobile Money\",\n bank_transfer: \"Bank Transfer\",\n};\n\nfunction formatMethods(methods: PaymentMethod[]): string {\n if (!methods.length) return \"Payment methods\";\n return methods.map((method) => methodLabels[method]).join(\" • \");\n}\n\nexport function ProviderSelector({\n providers,\n selectedProvider,\n onSelect,\n disabled = false,\n}: ProviderSelectorProps) {\n return (\n <div className=\"reevit-psp-selector\">\n <div className=\"reevit-psp-selector__label\">Choose your payment provider</div>\n <div className=\"reevit-psp-selector__options\">\n {providers.map((provider) => {\n const meta = providerMeta[provider.provider] || {\n logo: undefined,\n hint: \"Payment methods\",\n };\n const isSelected = selectedProvider === provider.provider;\n const fallbackInitial = provider.name.slice(0, 1).toUpperCase();\n\n return (\n <button\n key={provider.provider}\n type=\"button\"\n className={cn(\n \"reevit-psp-option\",\n isSelected && \"reevit-psp-option--selected\",\n disabled && \"reevit-psp-option--disabled\",\n )}\n onClick={() => onSelect(provider.provider)}\n disabled={disabled}\n aria-pressed={isSelected}\n >\n <span className=\"reevit-psp-option__logo\" aria-hidden=\"true\">\n {meta.logo ? (\n <img\n src={meta.logo}\n alt=\"\"\n className=\"reevit-psp-option__logo-img\"\n loading=\"lazy\"\n />\n ) : (\n <span className=\"reevit-psp-option__logo-fallback\">{fallbackInitial}</span>\n )}\n </span>\n <div className=\"reevit-psp-option__content\">\n <span className=\"reevit-psp-option__name\">{provider.name}</span>\n <span className=\"reevit-psp-option__methods\">\n {formatMethods(provider.methods) || meta.hint}\n </span>\n </div>\n <span className=\"reevit-psp-option__check\" aria-hidden=\"true\">\n {isSelected ? \"Selected\" : \"Select\"}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * Paystack Bridge\n * Handles integration with Paystack popup checkout\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n PaystackPop?: PaystackPopupInterface;\n }\n}\n\ninterface PaystackPopupInterface {\n setup: (config: PaystackConfig) => { openIframe: () => void };\n}\n\ninterface PaystackConfig {\n key: string;\n email: string;\n phone?: string;\n amount?: number;\n currency?: string;\n ref?: string;\n access_code?: string;\n metadata?: Record<string, unknown>;\n channels?: string[];\n callback: (response: PaystackResponse) => void;\n onClose: () => void;\n}\n\ninterface PaystackResponse {\n reference: string;\n trans: string;\n status: string;\n message: string;\n transaction: string;\n trxref: string;\n}\n\ninterface PaystackBridgeProps {\n publicKey: string;\n email: string;\n phone?: string;\n amount: number;\n currency?: string;\n reference?: string;\n accessCode?: string;\n metadata?: Record<string, unknown>;\n channels?: ('card' | 'bank' | 'ussd' | 'qr' | 'mobile_money' | 'bank_transfer')[];\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Paystack script\nfunction loadPaystackScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.PaystackPop) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://js.paystack.co/v2/inline.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Paystack script'));\n document.head.appendChild(script);\n });\n}\n\nexport function PaystackBridge({\n publicKey,\n email,\n phone,\n amount,\n currency = 'GHS',\n reference,\n accessCode,\n metadata,\n channels = ['card', 'mobile_money'],\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: PaystackBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n console.log('[PaystackBridge] Starting payment', {\n hasPublicKey: !!publicKey,\n email,\n amount,\n reference,\n hasAccessCode: !!accessCode,\n });\n\n // Validate required parameters before attempting to load Paystack\n if (!publicKey) {\n throw new Error('Paystack public key is required but was empty');\n }\n if (!email && !accessCode) {\n throw new Error('Email is required for Paystack payments when no access code is provided');\n }\n if (!amount && !accessCode) {\n throw new Error('Valid amount is required for Paystack payments when no access code is provided');\n }\n\n await loadPaystackScript();\n\n if (!window.PaystackPop) {\n throw new Error('Paystack script loaded but PaystackPop not available');\n }\n\n const setupConfig: PaystackConfig = {\n key: publicKey,\n email,\n phone,\n amount,\n currency,\n ref: reference,\n access_code: accessCode,\n metadata,\n channels,\n callback: (response: PaystackResponse) => {\n console.log('[PaystackBridge] Callback received', response);\n // Determine the payment method used\n let usedMethod: any = 'card';\n if (channels && channels.length === 1) {\n usedMethod = channels[0];\n } else if (response.message?.toLowerCase().includes('mobile money')) {\n usedMethod = 'mobile_money';\n }\n\n const result: PaymentResult = {\n paymentId: response.reference, // Use the reference as paymentId because we set it to Reevit's UUID\n reference: response.reference,\n amount,\n currency,\n paymentMethod: usedMethod,\n psp: 'paystack',\n pspReference: response.transaction, // Paystack's internal transaction ID\n status: response.status === 'success' ? 'success' : 'pending',\n metadata: {\n ...response,\n trxref: response.trxref,\n paystack_transaction_id: response.transaction,\n paystack_trans: response.trans\n },\n };\n onSuccess(result);\n },\n onClose: () => {\n console.log('[PaystackBridge] Modal closed');\n onClose();\n },\n };\n\n const handler = window.PaystackPop.setup(setupConfig);\n\n handler.openIframe();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to initialize Paystack';\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: errorMessage,\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [publicKey, email, amount, currency, reference, accessCode, metadata, channels, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--paystack\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Paystack...</p>\n </div>\n </div>\n );\n}\n\n// Export utility for manual initialization\nexport { loadPaystackScript };","/**\n * Hubtel Bridge\n * Handles integration with Hubtel payment using @hubteljs/checkout npm package\n *\n * Supports two authentication methods:\n * 1. Session Token (recommended): Pass hubtelSessionToken to use secure, short-lived tokens\n * 2. Basic Auth (legacy): Pass basicAuth for direct credential authentication\n */\n\nimport { useEffect, useCallback, useRef, useState } from 'react';\nimport CheckoutSdk from '@hubteljs/checkout';\nimport type { PaymentResult, PaymentError } from '../types';\nimport { createReevitClient } from '../api/client';\n\ninterface HubtelBridgeProps {\n paymentId: string;\n publicKey: string;\n merchantAccount: string | number;\n amount: number;\n currency?: string;\n reference?: string;\n email?: string;\n phone?: string;\n description?: string;\n callbackUrl?: string;\n /** Session token from server (recommended - credentials never exposed to client) */\n hubtelSessionToken?: string;\n /** Basic auth credential (legacy - credentials exposed to client, deprecated) */\n basicAuth?: string;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\nexport function HubtelBridge({\n paymentId,\n publicKey,\n merchantAccount,\n amount,\n reference,\n phone,\n description = 'Payment',\n callbackUrl,\n hubtelSessionToken,\n basicAuth,\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: HubtelBridgeProps) {\n const initialized = useRef(false);\n const checkoutRef = useRef<InstanceType<typeof CheckoutSdk> | null>(null);\n const [authValue, setAuthValue] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n // Fetch session token if provided, otherwise use basicAuth\n useEffect(() => {\n const fetchAuth = async () => {\n // If session token is provided, fetch the session from the server\n if (hubtelSessionToken) {\n setIsLoading(true);\n try {\n const client = createReevitClient({ publicKey });\n const { data, error } = await client.createHubtelSession(paymentId);\n if (error) {\n onError({\n code: 'SESSION_ERROR',\n message: error.message || 'Failed to create Hubtel session',\n recoverable: true,\n });\n return;\n }\n if (data) {\n // The session response contains basicAuth encoded in the token\n // We need to use it with the Hubtel SDK\n setAuthValue(data.token);\n }\n } catch (err) {\n onError({\n code: 'SESSION_ERROR',\n message: 'Failed to create Hubtel session',\n recoverable: true,\n originalError: err,\n });\n } finally {\n setIsLoading(false);\n }\n } else if (basicAuth) {\n // Legacy: Use basicAuth directly (deprecated - credentials exposed)\n setAuthValue(basicAuth);\n }\n };\n\n fetchAuth();\n }, [paymentId, publicKey, hubtelSessionToken, basicAuth, onError]);\n\n const startPayment = useCallback(async () => {\n // Wait for auth to be loaded\n if (isLoading || !authValue) {\n return;\n }\n\n try {\n // Initialize the Checkout SDK\n const checkout = new CheckoutSdk();\n checkoutRef.current = checkout;\n\n const purchaseInfo = {\n amount: amount / 100, // Convert from minor to major units\n purchaseDescription: description,\n customerPhoneNumber: phone || '',\n clientReference: reference || `hubtel_${Date.now()}`,\n };\n\n const config = {\n branding: 'enabled' as const,\n callbackUrl: callbackUrl || window.location.href,\n merchantAccount: typeof merchantAccount === 'string' ? parseInt(merchantAccount, 10) : merchantAccount,\n // Use session token or basicAuth for authentication\n // Session tokens are base64-encoded credentials fetched securely from the server\n basicAuth: authValue || '',\n };\n\n checkout.openModal({\n purchaseInfo,\n config,\n callBacks: {\n onInit: () => console.log('Hubtel checkout initialized'),\n onPaymentSuccess: (data: any) => {\n const result: PaymentResult = {\n paymentId: (data.transactionId as string) || reference || '',\n reference: (data.clientReference as string) || reference || '',\n amount: amount,\n currency: 'GHS',\n paymentMethod: 'mobile_money',\n psp: 'hubtel',\n pspReference: (data.transactionId as string) || '',\n status: 'success',\n };\n onSuccess(result);\n checkout.closePopUp();\n },\n onPaymentFailure: (data: any) => {\n const error: PaymentError = {\n code: 'PAYMENT_FAILED',\n message: (data.message as string) || 'Payment failed',\n recoverable: true,\n };\n onError(error);\n },\n onLoad: () => console.log('Hubtel checkout loaded'),\n onClose: () => {\n onClose();\n },\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Hubtel',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [merchantAccount, amount, reference, phone, description, callbackUrl, authValue, isLoading, onSuccess, onError, onClose]);\n\n useEffect(() => {\n if (autoStart && !initialized.current && !isLoading && authValue) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment, isLoading, authValue]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--hubtel\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Hubtel...</p>\n </div>\n </div>\n );\n}\n\n/**\n * Opens Hubtel checkout modal directly\n * Uses the @hubteljs/checkout npm package\n */\nexport function openHubtelPopup(config: {\n merchantAccount: string | number;\n description: string;\n amount: number;\n clientReference?: string;\n callbackUrl?: string;\n customerPhoneNumber?: string;\n basicAuth?: string;\n onSuccess?: (data: Record<string, unknown>) => void;\n onError?: (data: Record<string, unknown>) => void;\n onClose?: () => void;\n}): void {\n const checkout = new CheckoutSdk();\n\n const purchaseInfo = {\n amount: config.amount,\n purchaseDescription: config.description,\n customerPhoneNumber: config.customerPhoneNumber || '',\n clientReference: config.clientReference || `hubtel_${Date.now()}`,\n };\n\n const checkoutConfig = {\n branding: 'enabled' as const,\n callbackUrl: config.callbackUrl || window.location.href,\n merchantAccount: typeof config.merchantAccount === 'string'\n ? parseInt(config.merchantAccount, 10)\n : config.merchantAccount,\n basicAuth: config.basicAuth || '',\n };\n\n checkout.openModal({\n purchaseInfo,\n config: checkoutConfig,\n callBacks: {\n onPaymentSuccess: (data: any) => {\n config.onSuccess?.(data);\n checkout.closePopUp();\n },\n onPaymentFailure: (data: any) => {\n config.onError?.(data);\n },\n onClose: () => {\n config.onClose?.();\n },\n },\n });\n}\n","/**\n * Flutterwave Bridge\n * Handles integration with Flutterwave payment modal\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { PaymentResult, PaymentError } from '../types';\n\ndeclare global {\n interface Window {\n FlutterwaveCheckout?: (config: FlutterwaveConfig) => void;\n }\n}\n\ninterface FlutterwaveConfig {\n public_key: string;\n tx_ref: string;\n amount: number;\n currency: string;\n payment_options?: string;\n customer: {\n email: string;\n phone_number?: string;\n name?: string;\n };\n customizations?: {\n title?: string;\n description?: string;\n logo?: string;\n };\n meta?: Record<string, unknown>;\n callback: (response: FlutterwaveResponse) => void;\n onclose: () => void;\n}\n\ninterface FlutterwaveResponse {\n status: 'successful' | 'failed' | 'cancelled';\n transaction_id: number;\n tx_ref: string;\n flw_ref: string;\n amount: number;\n currency: string;\n charged_amount: number;\n payment_type: string;\n}\n\ninterface FlutterwaveBridgeProps {\n publicKey: string;\n amount: number;\n currency?: string;\n reference?: string;\n email: string;\n phone?: string;\n name?: string;\n paymentOptions?: string;\n title?: string;\n description?: string;\n logo?: string;\n metadata?: Record<string, unknown>;\n onSuccess: (result: PaymentResult) => void;\n onError: (error: PaymentError) => void;\n onClose: () => void;\n autoStart?: boolean;\n}\n\n// Load Flutterwave script\nfunction loadFlutterwaveScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (window.FlutterwaveCheckout) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://checkout.flutterwave.com/v3.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Flutterwave script'));\n document.head.appendChild(script);\n });\n}\n\nexport function FlutterwaveBridge({\n publicKey,\n amount,\n currency = 'GHS',\n reference,\n email,\n phone,\n name,\n paymentOptions = 'card,mobilemoney,ussd',\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n autoStart = true,\n}: FlutterwaveBridgeProps) {\n const initialized = useRef(false);\n\n const startPayment = useCallback(async () => {\n try {\n await loadFlutterwaveScript();\n\n if (!window.FlutterwaveCheckout) {\n throw new Error('Flutterwave checkout not available');\n }\n\n const txRef = reference || `flw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n window.FlutterwaveCheckout({\n public_key: publicKey,\n tx_ref: txRef,\n amount: amount / 100, // Flutterwave expects amount in major units\n currency,\n payment_options: paymentOptions,\n customer: {\n email,\n phone_number: phone,\n name,\n },\n customizations: {\n title,\n description,\n logo,\n },\n meta: metadata,\n callback: (response: FlutterwaveResponse) => {\n if (response.status === 'successful') {\n const result: PaymentResult = {\n paymentId: response.transaction_id.toString(),\n reference: response.tx_ref,\n amount: Math.round(response.amount * 100),\n currency: response.currency,\n paymentMethod: response.payment_type === 'mobilemoney' ? 'mobile_money' : 'card',\n psp: 'flutterwave',\n pspReference: response.flw_ref,\n status: 'success',\n metadata: {\n charged_amount: response.charged_amount,\n payment_type: response.payment_type,\n },\n };\n onSuccess(result);\n } else {\n const error: PaymentError = {\n code: response.status === 'cancelled' ? 'CANCELLED' : 'PAYMENT_FAILED',\n message: response.status === 'cancelled' ? 'Payment was cancelled' : 'Payment failed',\n recoverable: true,\n };\n onError(error);\n }\n },\n onclose: () => {\n onClose();\n },\n });\n } catch (err) {\n const error: PaymentError = {\n code: 'PSP_ERROR',\n message: 'Failed to initialize Flutterwave',\n recoverable: true,\n originalError: err,\n };\n onError(error);\n }\n }, [\n publicKey,\n amount,\n currency,\n reference,\n email,\n phone,\n name,\n paymentOptions,\n title,\n description,\n logo,\n metadata,\n onSuccess,\n onError,\n onClose,\n ]);\n\n useEffect(() => {\n if (autoStart && !initialized.current) {\n initialized.current = true;\n startPayment();\n }\n }, [autoStart, startPayment]);\n\n return (\n <div className=\"reevit-psp-bridge reevit-psp-bridge--flutterwave\">\n <div className=\"reevit-psp-bridge__loading\">\n <div className=\"reevit-spinner\" />\n <p>Connecting to Flutterwave...</p>\n </div>\n </div>\n );\n}\n\nexport { loadFlutterwaveScript };\n","/**\n * MonnifyBridge.tsx\n * React component for Monnify payment integration (Nigeria)\n */\n\nimport { useEffect, useCallback, useState } from 'react';\n\ndeclare global {\n interface Window {\n MonnifySDK?: {\n initialize: (config: MonnifyConfig) => void;\n };\n }\n}\n\ninterface MonnifyConfig {\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerMobileNumber?: string;\n apiKey: string;\n contractCode: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n onComplete: (response: MonnifyResponse) => void;\n onClose: () => void;\n}\n\ninterface MonnifyResponse {\n status: 'SUCCESS' | 'FAILED' | 'PENDING';\n message: string;\n transactionReference: string;\n paymentReference: string;\n authorizedAmount?: number;\n paymentStatus?: string;\n}\n\nexport interface MonnifyBridgeProps {\n apiKey: string;\n contractCode: string;\n amount: number;\n currency: string;\n reference: string;\n customerName: string;\n customerEmail: string;\n customerPhone?: string;\n paymentDescription?: string;\n isTestMode?: boolean;\n metadata?: Record<string, unknown>;\n autoOpen?: boolean;\n onSuccess: (result: {\n transactionReference: string;\n paymentReference: string;\n amount: number;\n }) => void;\n onError: (error: { code: string; message: string }) => void;\n onClose?: () => void;\n}\n\nconst MONNIFY_SCRIPT_URL = 'https://sdk.monnify.com/plugin/monnify.js';\nlet monnifyScriptPromise: Promise<void> | null = null;\n\nexport function loadMonnifyScript(): Promise<void> {\n if (monnifyScriptPromise) return monnifyScriptPromise;\n\n if (document.getElementById('monnify-sdk-script')) {\n monnifyScriptPromise = Promise.resolve();\n return monnifyScriptPromise;\n }\n\n monnifyScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'monnify-sdk-script';\n script.src = MONNIFY_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Monnify SDK'));\n document.head.appendChild(script);\n });\n\n return monnifyScriptPromise;\n}\n\nexport function MonnifyBridge({\n apiKey,\n contractCode,\n amount,\n currency,\n reference,\n customerName,\n customerEmail,\n customerPhone,\n paymentDescription,\n isTestMode = false,\n metadata,\n autoOpen = true,\n onSuccess,\n onError,\n onClose,\n}: MonnifyBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isReady, setIsReady] = useState(false);\n\n const openMonnify = useCallback(async () => {\n try {\n await loadMonnifyScript();\n\n if (!window.MonnifySDK) {\n throw new Error('Monnify SDK not available');\n }\n\n window.MonnifySDK.initialize({\n amount,\n currency: currency || 'NGN',\n reference,\n customerName,\n customerEmail,\n customerMobileNumber: customerPhone,\n apiKey,\n contractCode,\n paymentDescription: paymentDescription || 'Payment',\n isTestMode,\n metadata,\n onComplete: (response: MonnifyResponse) => {\n if (response.status === 'SUCCESS') {\n onSuccess({\n transactionReference: response.transactionReference,\n paymentReference: response.paymentReference,\n amount: response.authorizedAmount || amount,\n });\n } else {\n onError({\n code: 'MONNIFY_PAYMENT_FAILED',\n message: response.message || 'Payment was not successful',\n });\n }\n },\n onClose: () => {\n onClose?.();\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to open Monnify';\n onError({ code: 'MONNIFY_INIT_ERROR', message });\n }\n }, [\n amount, currency, reference, customerName, customerEmail, customerPhone,\n apiKey, contractCode, paymentDescription, isTestMode, metadata,\n onSuccess, onError, onClose\n ]);\n\n useEffect(() => {\n const init = async () => {\n try {\n await loadMonnifyScript();\n setIsReady(true);\n setIsLoading(false);\n\n if (autoOpen) {\n openMonnify();\n }\n } catch (err) {\n setIsLoading(false);\n const message = err instanceof Error ? err.message : 'Failed to load Monnify';\n onError({ code: 'MONNIFY_LOAD_ERROR', message });\n }\n };\n\n init();\n }, [autoOpen, openMonnify, onError]);\n\n if (isLoading) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <div className=\"reevit-monnify-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading Monnify checkout...</p>\n </div>\n </div>\n );\n }\n\n if (!autoOpen && isReady) {\n return (\n <div className=\"reevit-monnify-bridge\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={openMonnify}\n >\n Pay with Monnify\n </button>\n </div>\n );\n }\n\n return null;\n}\n","/**\n * MPesaBridge.tsx\n * React component for M-Pesa STK Push integration (Kenya/Tanzania)\n * \n * Note: M-Pesa uses server-to-server STK Push initiated by the backend.\n * This component handles the UI flow while the customer approves on their phone.\n */\n\nimport { useState, useCallback } from 'react';\n\nexport interface MPesaBridgeProps {\n /** API endpoint to initiate STK Push (your backend) */\n apiEndpoint: string;\n /** Customer phone number in format 254XXXXXXXXX */\n phoneNumber: string;\n /** Amount to charge */\n amount: number;\n /** Currency (KES or TZS) */\n currency: string;\n /** Unique transaction reference */\n reference: string;\n /** Payment description */\n description?: string;\n /** Called when STK Push is successfully sent */\n onInitiated?: (checkoutRequestId: string) => void;\n /** Called when payment is confirmed (via webhook/polling) */\n onSuccess: (result: { transactionId: string; reference: string }) => void;\n /** Called on error */\n onError: (error: { code: string; message: string }) => void;\n /** Custom headers for API calls (e.g., authorization) */\n headers?: Record<string, string>;\n}\n\ntype MPesaState = 'idle' | 'initiating' | 'waiting' | 'success' | 'failed';\n\nexport function MPesaBridge({\n apiEndpoint,\n phoneNumber,\n amount,\n currency,\n reference,\n description,\n onInitiated,\n onSuccess,\n onError,\n headers = {},\n}: MPesaBridgeProps) {\n const [state, setState] = useState<MPesaState>('idle');\n const [error, setError] = useState<string | null>(null);\n const [checkoutRequestId, setCheckoutRequestId] = useState<string | null>(null);\n\n const initiateSTKPush = useCallback(async () => {\n setState('initiating');\n setError(null);\n\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n phone_number: phoneNumber,\n amount,\n currency,\n reference,\n description: description || `Payment ${reference}`,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || `Request failed: ${response.status}`);\n }\n\n const data = await response.json();\n const requestId = data.checkout_request_id || data.checkoutRequestId || data.transaction_id;\n\n setCheckoutRequestId(requestId);\n setState('waiting');\n onInitiated?.(requestId);\n\n // Note: Success will come via webhook or polling on parent component\n // This bridge just handles the UI for initiating the push\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to initiate M-Pesa payment';\n setError(message);\n setState('failed');\n onError({ code: 'MPESA_INIT_ERROR', message });\n }\n }, [apiEndpoint, phoneNumber, amount, currency, reference, description, headers, onInitiated, onError]);\n\n const handleRetry = useCallback(() => {\n setState('idle');\n setError(null);\n initiateSTKPush();\n }, [initiateSTKPush]);\n\n // Idle state - show initiate button\n if (state === 'idle') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-info\">\n <div className=\"reevit-mpesa-icon\">📱</div>\n <h3>Pay with M-Pesa</h3>\n <p>You will receive a prompt on your phone to complete the payment.</p>\n <p className=\"reevit-mpesa-phone\">Phone: {phoneNumber}</p>\n </div>\n <button\n type=\"button\"\n className=\"reevit-submit-btn reevit-mpesa-btn\"\n onClick={initiateSTKPush}\n >\n Send Payment Request\n </button>\n </div>\n );\n }\n\n // Initiating state - show loading\n if (state === 'initiating') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-loading\">\n <div className=\"reevit-spinner reevit-spinner--large\" />\n <p>Sending payment request to your phone...</p>\n </div>\n </div>\n );\n }\n\n // Waiting state - customer should check their phone\n if (state === 'waiting') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-waiting\">\n <div className=\"reevit-mpesa-phone-icon\">📲</div>\n <h3>Check Your Phone</h3>\n <p>\n An M-Pesa payment request has been sent to <strong>{phoneNumber}</strong>.\n </p>\n <ol className=\"reevit-mpesa-steps\">\n <li>Check for the M-Pesa prompt on your phone</li>\n <li>Enter your M-Pesa PIN to authorize</li>\n <li>Wait for confirmation</li>\n </ol>\n <div className=\"reevit-mpesa-waiting-indicator\">\n <div className=\"reevit-spinner\" />\n <span>Waiting for payment confirmation...</span>\n </div>\n {checkoutRequestId && (\n <p className=\"reevit-mpesa-ref\">Request ID: {checkoutRequestId}</p>\n )}\n </div>\n </div>\n );\n }\n\n // Failed state - show error and retry\n if (state === 'failed') {\n return (\n <div className=\"reevit-mpesa-bridge\">\n <div className=\"reevit-mpesa-error\">\n <div className=\"reevit-error-icon\">⚠️</div>\n <h3>Payment Request Failed</h3>\n <p>{error || 'Something went wrong. Please try again.'}</p>\n <button\n type=\"button\"\n className=\"reevit-retry-btn\"\n onClick={handleRetry}\n >\n Try Again\n </button>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n/**\n * Hook for M-Pesa payment status polling\n * Use this to check payment status after STK Push is initiated\n */\nexport function useMPesaStatusPolling(\n statusEndpoint: string,\n checkoutRequestId: string | null,\n options: {\n interval?: number;\n maxAttempts?: number;\n headers?: Record<string, string>;\n onSuccess: (result: { transactionId: string }) => void;\n onFailed: (error: { message: string }) => void;\n onTimeout: () => void;\n }\n) {\n const { interval = 5000, maxAttempts = 24, headers = {}, onSuccess, onFailed, onTimeout } = options;\n\n const startPolling = useCallback(async () => {\n if (!checkoutRequestId) return;\n\n let attempts = 0;\n\n const poll = async () => {\n if (attempts >= maxAttempts) {\n onTimeout();\n return;\n }\n\n try {\n const response = await fetch(`${statusEndpoint}?checkout_request_id=${checkoutRequestId}`, {\n headers,\n });\n\n if (!response.ok) {\n attempts++;\n setTimeout(poll, interval);\n return;\n }\n\n const data = await response.json();\n\n if (data.status === 'success' || data.status === 'completed') {\n onSuccess({ transactionId: data.transaction_id || data.mpesa_receipt });\n } else if (data.status === 'failed' || data.status === 'cancelled') {\n onFailed({ message: data.message || 'Payment failed or was cancelled' });\n } else {\n // Still pending, continue polling\n attempts++;\n setTimeout(poll, interval);\n }\n } catch {\n attempts++;\n setTimeout(poll, interval);\n }\n };\n\n poll();\n }, [checkoutRequestId, statusEndpoint, interval, maxAttempts, headers, onSuccess, onFailed, onTimeout]);\n\n return { startPolling };\n}\n","/**\n * StripeBridge.tsx\n * React component for Stripe payment integration\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\n\ndeclare global {\n interface Window {\n Stripe?: (publishableKey: string) => StripeInstance;\n }\n}\n\ninterface StripeInstance {\n elements: (options?: { clientSecret: string; appearance?: StripeAppearance }) => StripeElements;\n confirmPayment: (options: {\n elements: StripeElements;\n confirmParams?: { return_url?: string };\n redirect?: 'if_required';\n }) => Promise<{ error?: StripeError; paymentIntent?: { id: string; status: string } }>;\n}\n\ninterface StripeElements {\n create: (type: 'payment' | 'card', options?: Record<string, unknown>) => StripeElement;\n getElement: (type: string) => StripeElement | null;\n submit: () => Promise<{ error?: StripeError }>;\n}\n\ninterface StripeElement {\n mount: (selector: string | HTMLElement) => void;\n unmount: () => void;\n on: (event: string, handler: (e: any) => void) => void;\n destroy: () => void;\n}\n\ninterface StripeError {\n type: string;\n message: string;\n code?: string;\n}\n\ninterface StripeAppearance {\n theme?: 'stripe' | 'night' | 'flat';\n variables?: Record<string, string>;\n rules?: Record<string, Record<string, string>>;\n}\n\nexport interface StripeBridgeProps {\n publishableKey: string;\n clientSecret: string;\n amount: number;\n currency: string;\n appearance?: StripeAppearance;\n onSuccess: (result: { paymentIntentId: string; status: string }) => void;\n onError: (error: { code: string; message: string }) => void;\n onReady?: () => void;\n onCancel?: () => void;\n}\n\nconst STRIPE_SCRIPT_URL = 'https://js.stripe.com/v3/';\nlet stripeScriptPromise: Promise<void> | null = null;\n\nexport function loadStripeScript(): Promise<void> {\n if (stripeScriptPromise) return stripeScriptPromise;\n\n if (document.getElementById('stripe-js-script')) {\n stripeScriptPromise = Promise.resolve();\n return stripeScriptPromise;\n }\n\n stripeScriptPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.id = 'stripe-js-script';\n script.src = STRIPE_SCRIPT_URL;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Stripe.js'));\n document.head.appendChild(script);\n });\n\n return stripeScriptPromise;\n}\n\n// Default Reevit-themed appearance for Stripe Elements\nconst getReevitStripeAppearance = (): StripeAppearance => {\n // Check if we're in dark mode\n const isDarkMode = typeof window !== 'undefined' && \n window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n \n return {\n theme: isDarkMode ? 'night' : 'stripe',\n variables: {\n colorPrimary: isDarkMode ? '#fafafa' : '#171717',\n colorBackground: isDarkMode ? '#171717' : '#ffffff',\n colorText: isDarkMode ? '#fafafa' : '#171717',\n colorTextSecondary: isDarkMode ? '#a3a3a3' : '#737373',\n colorTextPlaceholder: isDarkMode ? '#737373' : '#a3a3a3',\n colorDanger: '#dc2626',\n fontFamily: '\"Geist Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n fontSizeBase: '14px',\n fontSizeSm: '12px',\n fontSizeLg: '16px',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightBold: '600',\n borderRadius: '10px',\n spacingUnit: '4px',\n spacingGridRow: '16px',\n spacingGridColumn: '16px',\n },\n rules: {\n '.Input': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n boxShadow: 'none',\n padding: '12px 14px',\n fontSize: '14px',\n backgroundColor: isDarkMode ? '#262626' : '#ffffff',\n },\n '.Input:focus': {\n border: isDarkMode ? '1px solid #a3a3a3' : '1px solid #737373',\n boxShadow: 'none',\n backgroundColor: isDarkMode ? '#262626' : '#fafafa',\n },\n '.Input--invalid': {\n border: '1px solid #dc2626',\n boxShadow: 'none',\n },\n '.Label': {\n fontSize: '12px',\n fontWeight: '500',\n marginBottom: '6px',\n color: isDarkMode ? '#a3a3a3' : '#737373',\n textTransform: 'none',\n letterSpacing: '0.02em',\n },\n '.Tab': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n backgroundColor: 'transparent',\n borderRadius: '10px',\n padding: '12px 14px',\n },\n '.Tab:hover': {\n border: isDarkMode ? '1px solid #a3a3a3' : '1px solid #737373',\n backgroundColor: isDarkMode ? '#262626' : '#fafafa',\n },\n '.Tab--selected': {\n border: isDarkMode ? '1px solid #fafafa' : '1px solid #171717',\n backgroundColor: isDarkMode ? '#262626' : '#fafafa',\n },\n '.TabIcon': {\n marginRight: '8px',\n },\n '.Block': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n borderRadius: '10px',\n backgroundColor: isDarkMode ? '#262626' : '#ffffff',\n padding: '12px 14px',\n },\n '.CheckboxInput': {\n border: isDarkMode ? '1px solid rgba(255, 255, 255, 0.1)' : '1px solid #e5e5e5',\n },\n '.CheckboxInput--checked': {\n backgroundColor: isDarkMode ? '#fafafa' : '#171717',\n borderColor: isDarkMode ? '#fafafa' : '#171717',\n },\n },\n };\n};\n\nexport function StripeBridge({\n publishableKey,\n clientSecret,\n amount,\n currency,\n appearance,\n onSuccess,\n onError,\n onReady,\n onCancel,\n}: StripeBridgeProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const stripeRef = useRef<StripeInstance | null>(null);\n const elementsRef = useRef<StripeElements | null>(null);\n const paymentElementRef = useRef<StripeElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n let mounted = true;\n\n const initStripe = async () => {\n try {\n await loadStripeScript();\n\n if (!mounted || !window.Stripe) {\n throw new Error('Stripe not available');\n }\n\n stripeRef.current = window.Stripe(publishableKey);\n\n // Use provided appearance or fall back to Reevit default theme\n const stripeAppearance = appearance || getReevitStripeAppearance();\n\n elementsRef.current = stripeRef.current.elements({\n clientSecret,\n appearance: stripeAppearance,\n });\n\n paymentElementRef.current = elementsRef.current.create('payment');\n\n if (containerRef.current) {\n paymentElementRef.current.mount(containerRef.current);\n }\n\n paymentElementRef.current.on('ready', () => {\n if (mounted) {\n setIsLoading(false);\n onReady?.();\n }\n });\n\n paymentElementRef.current.on('change', (event: any) => {\n if (event.error) {\n setError(event.error.message);\n } else {\n setError(null);\n }\n });\n } catch (err) {\n if (mounted) {\n const message = err instanceof Error ? err.message : 'Failed to initialize Stripe';\n setError(message);\n setIsLoading(false);\n onError({ code: 'STRIPE_INIT_ERROR', message });\n }\n }\n };\n\n initStripe();\n\n return () => {\n mounted = false;\n paymentElementRef.current?.destroy();\n };\n }, [publishableKey, clientSecret, appearance, onReady, onError]);\n\n const handleSubmit = useCallback(async () => {\n if (!stripeRef.current || !elementsRef.current) {\n onError({ code: 'NOT_INITIALIZED', message: 'Stripe not initialized' });\n return;\n }\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n // Validate the form first\n const { error: submitError } = await elementsRef.current.submit();\n if (submitError) {\n setError(submitError.message);\n onError({ code: submitError.code || 'VALIDATION_ERROR', message: submitError.message });\n setIsSubmitting(false);\n return;\n }\n\n // Confirm the payment\n const { error: confirmError, paymentIntent } = await stripeRef.current.confirmPayment({\n elements: elementsRef.current,\n redirect: 'if_required',\n });\n\n if (confirmError) {\n setError(confirmError.message);\n onError({ code: confirmError.code || 'PAYMENT_ERROR', message: confirmError.message });\n } else if (paymentIntent) {\n onSuccess({\n paymentIntentId: paymentIntent.id,\n status: paymentIntent.status,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Payment failed';\n setError(message);\n onError({ code: 'UNKNOWN_ERROR', message });\n } finally {\n setIsSubmitting(false);\n }\n }, [onSuccess, onError]);\n\n // Format the amount for display\n const formattedAmount = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency.toUpperCase(),\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount / 100);\n\n return (\n <div className=\"reevit-stripe-bridge\">\n {isLoading && (\n <div className=\"reevit-stripe-loading\">\n <div className=\"reevit-spinner\" />\n <p>Loading secure payment form...</p>\n </div>\n )}\n\n <div\n ref={containerRef}\n className=\"reevit-stripe-element\"\n style={{ display: isLoading ? 'none' : 'block', minHeight: '200px' }}\n />\n\n {error && !isLoading && (\n <div className=\"reevit-stripe-error\">\n <p>{error}</p>\n </div>\n )}\n\n {!isLoading && (\n <div className=\"reevit-stripe-actions\">\n <button\n type=\"button\"\n className=\"reevit-submit-btn\"\n onClick={handleSubmit}\n disabled={isLoading || isSubmitting}\n >\n {isSubmitting ? (\n <>\n <span className=\"reevit-spinner\" style={{ width: '16px', height: '16px' }} />\n <span>Processing...</span>\n </>\n ) : (\n <>Pay {formattedAmount}</>\n )}\n </button>\n\n {onCancel && (\n <button\n type=\"button\"\n className=\"reevit-cancel-btn\"\n onClick={onCancel}\n disabled={isSubmitting}\n >\n Cancel\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","/**\n * ReevitCheckout Component\n * Main checkout component that orchestrates the payment flow\n */\n\nimport { useEffect, useState, useCallback, useMemo, createContext, useContext } from 'react';\nimport type { ReevitCheckoutProps, PaymentMethod, MobileMoneyFormData, PaymentError, PaymentResult, CheckoutProviderOption } from '../types';\nimport { useReevit } from '../hooks/useReevit';\nimport { PaymentMethodSelector } from './PaymentMethodSelector';\nimport { MobileMoneyForm } from './MobileMoneyForm';\nimport { ProviderSelector } from './ProviderSelector';\nimport { PaystackBridge } from '../bridges/PaystackBridge';\nimport { HubtelBridge } from '../bridges/HubtelBridge';\nimport { FlutterwaveBridge } from '../bridges/FlutterwaveBridge';\nimport { MonnifyBridge } from '../bridges/MonnifyBridge';\nimport { MPesaBridge } from '../bridges/MPesaBridge';\nimport { StripeBridge } from '../bridges/StripeBridge';\nimport { formatAmount, createThemeVariables, cn } from '../utils';\n\n\n// Context for nested components\ninterface ReevitContextValue {\n publicKey: string;\n amount: number;\n currency: string;\n}\n\nconst ReevitContext = createContext<ReevitContextValue | null>(null);\n\nexport function useReevitContext() {\n const context = useContext(ReevitContext);\n if (!context) {\n throw new Error('useReevitContext must be used within ReevitCheckout');\n }\n return context;\n}\n\nexport function ReevitCheckout({\n // Config\n publicKey,\n amount,\n currency,\n email = '',\n phone = '',\n reference,\n metadata,\n paymentMethods = ['card', 'mobile_money'],\n initialPaymentIntent,\n // Callbacks\n onSuccess,\n onError,\n onClose,\n onStateChange,\n // UI\n children,\n autoOpen = false,\n isOpen: controlledIsOpen,\n onOpenChange,\n theme,\n apiBaseUrl,\n}: ReevitCheckoutProps) {\n const [internalIsOpen, setInternalIsOpen] = useState(autoOpen);\n const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;\n\n const setIsOpen = useCallback(\n (value: boolean) => {\n if (onOpenChange) {\n onOpenChange(value);\n } else {\n setInternalIsOpen(value);\n }\n },\n [onOpenChange]\n );\n\n const [showPSPBridge, setShowPSPBridge] = useState(false);\n const [momoData, setMomoData] = useState<MobileMoneyFormData | null>(null);\n const [selectedProvider, setSelectedProvider] = useState<string | null>(null);\n\n const {\n status,\n paymentIntent,\n selectedMethod,\n error,\n result,\n initialize,\n selectMethod,\n processPayment,\n reset,\n close: closeCheckout,\n isLoading,\n isComplete,\n } = useReevit({\n config: {\n publicKey,\n amount,\n currency,\n email,\n phone,\n reference,\n metadata,\n paymentMethods,\n initialPaymentIntent,\n },\n apiBaseUrl,\n onSuccess: (result) => {\n onSuccess?.(result);\n // Keep modal open briefly to show success\n setTimeout(() => {\n setIsOpen(false);\n }, 2000);\n },\n onError,\n onClose: () => {\n setIsOpen(false);\n onClose?.();\n },\n onStateChange,\n });\n\n const providerOptions = useMemo<CheckoutProviderOption[]>(() => {\n const available = paymentIntent?.availableProviders ?? [];\n const fallbackProvider = paymentIntent?.recommendedPsp\n ? [{\n provider: paymentIntent.recommendedPsp,\n name: paymentIntent.recommendedPsp.replace(/^\\w/, (c) => c.toUpperCase()),\n methods: paymentMethods,\n }]\n : [];\n const options = available.length > 0 ? available : fallbackProvider;\n\n return options\n .map((provider) => {\n const methods = provider.methods && provider.methods.length > 0 ? provider.methods : paymentMethods;\n const filteredMethods = methods.filter((method) => paymentMethods.includes(method));\n return {\n ...provider,\n methods: filteredMethods,\n };\n })\n .filter((provider) => provider.methods.length > 0);\n }, [paymentIntent, paymentMethods]);\n\n const activeProvider = providerOptions.find((provider) => provider.provider === selectedProvider) || providerOptions[0];\n const availableMethods = activeProvider?.methods && activeProvider.methods.length > 0\n ? activeProvider.methods\n : paymentMethods;\n\n // Initialize when opened\n useEffect(() => {\n // Only initialize if opened and NOT in controlled mode with an initial intent\n if (isOpen && status === 'idle' && !initialPaymentIntent) {\n initialize();\n }\n }, [isOpen, status, initialize, initialPaymentIntent]);\n\n useEffect(() => {\n if (providerOptions.length === 0) {\n return;\n }\n\n if (selectedProvider && providerOptions.some((provider) => provider.provider === selectedProvider)) {\n return;\n }\n\n const recommended = paymentIntent?.recommendedPsp;\n const resolved = providerOptions.find((provider) => provider.provider === recommended)?.provider || providerOptions[0].provider;\n setSelectedProvider(resolved);\n }, [paymentIntent?.recommendedPsp, providerOptions, selectedProvider]);\n\n useEffect(() => {\n if (!activeProvider || !selectedMethod) {\n return;\n }\n\n if (!activeProvider.methods.includes(selectedMethod)) {\n selectMethod(activeProvider.methods[0]);\n }\n }, [activeProvider, selectedMethod, selectMethod]);\n\n // Handle auto-advance logic\n useEffect(() => {\n // Only auto-advance if we have a selected method AND an intent\n if (isOpen && selectedMethod && paymentIntent && !showPSPBridge) {\n // For card, auto-advance if we have an intent\n if (selectedMethod === 'card') {\n setShowPSPBridge(true);\n }\n // For MoMo, auto-advance only if we have an intent AND a phone number\n else if (selectedMethod === 'mobile_money' && (momoData?.phone || phone)) {\n setShowPSPBridge(true);\n }\n }\n }, [isOpen, selectedMethod, showPSPBridge, paymentIntent, momoData, phone]);\n\n // Open modal\n const handleOpen = useCallback(() => {\n if (controlledIsOpen !== undefined) return; // Don't auto-open if controlled\n setIsOpen(true);\n setShowPSPBridge(false);\n setMomoData(null);\n setSelectedProvider(null);\n }, [controlledIsOpen, setIsOpen]);\n\n // Close modal\n const handleClose = useCallback(() => {\n closeCheckout();\n setIsOpen(false);\n setShowPSPBridge(false);\n setMomoData(null);\n setSelectedProvider(null);\n }, [closeCheckout, setIsOpen]);\n\n // Handle payment method selection\n const handleMethodSelect = useCallback(\n (method: PaymentMethod) => {\n selectMethod(method);\n },\n [selectMethod]\n );\n\n const handleProviderSelect = useCallback(\n (provider: string) => {\n if (provider === selectedProvider) {\n return;\n }\n\n const providerMethods =\n providerOptions.find((option) => option.provider === provider)?.methods || paymentMethods;\n const methodForInit = selectedMethod && providerMethods.includes(selectedMethod)\n ? selectedMethod\n : providerMethods[0] || paymentMethods[0];\n\n setSelectedProvider(provider);\n reset();\n setShowPSPBridge(false);\n setMomoData(null);\n initialize(methodForInit, { preferredProvider: provider, allowedProviders: [provider] });\n },\n [initialize, paymentMethods, providerOptions, reset, selectedMethod, selectedProvider]\n );\n\n // Handle continue after method selection\n const handleContinue = useCallback(() => {\n if (!selectedMethod) return;\n\n if (selectedMethod === 'card') {\n // For card payments, show PSP bridge (Paystack popup)\n setShowPSPBridge(true);\n }\n // Mobile money form is already shown when selected\n }, [selectedMethod]);\n\n // Handle mobile money form submission\n const handleMomoSubmit = useCallback(\n (data: MobileMoneyFormData) => {\n setMomoData(data);\n setShowPSPBridge(true);\n },\n []\n );\n\n // Handle PSP callback\n const handlePSPSuccess = useCallback(\n (pspResult: any) => {\n processPayment({ ...pspResult, momoData });\n },\n [processPayment, momoData]\n );\n\n const handlePSPError = useCallback(\n (error: any) => {\n setShowPSPBridge(false);\n onError?.(error);\n },\n [onError]\n );\n\n const handlePSPClose = useCallback(() => {\n setShowPSPBridge(false);\n }, []);\n\n // Back button handler\n const handleBack = useCallback(() => {\n reset();\n setMomoData(null);\n setShowPSPBridge(false);\n }, [reset]);\n\n // Theme styles\n const resolvedTheme = useMemo(() => {\n if (!theme && !paymentIntent?.branding) {\n return undefined;\n }\n return {\n ...(paymentIntent?.branding || {}),\n ...(theme || {}),\n };\n }, [paymentIntent?.branding, theme]);\n\n const themeStyles = resolvedTheme\n ? createThemeVariables(resolvedTheme as unknown as Record<string, string | undefined>)\n : {};\n const themeMode = resolvedTheme?.darkMode;\n const dataTheme = useMemo(() => {\n if (typeof themeMode === 'boolean') {\n return themeMode ? 'dark' : 'light';\n }\n if (typeof document !== 'undefined') {\n if (document.documentElement.classList.contains('dark')) return 'dark';\n if (document.documentElement.classList.contains('light')) return 'light';\n }\n return undefined;\n }, [themeMode]);\n\n // Render trigger\n // If in controlled mode (isOpen is provided), we don't attach an onClick to children\n // because the parent controls when the modal opens (usually after an API call).\n const isControlled = controlledIsOpen !== undefined;\n\n const trigger = children ? (\n <span onClick={isControlled ? undefined : handleOpen} role={isControlled ? undefined : \"button\"} tabIndex={isControlled ? undefined : 0}>\n {children}\n </span>\n ) : !isControlled ? (\n <button className=\"reevit-trigger-btn\" onClick={handleOpen}>\n Pay {formatAmount(amount, currency)}\n </button>\n ) : null;\n\n // Render content based on state\n const renderContent = () => {\n // Loading state\n if (status === 'loading' || status === 'processing') {\n return (\n <div className=\"reevit-loading\">\n <div className=\"reevit-spinner\" />\n <p>{status === 'loading' ? 'Preparing checkout...' : 'Processing payment...'}</p>\n </div>\n );\n }\n\n // Success state\n if (status === 'success' && result) {\n return (\n <div className=\"reevit-success\">\n <div className=\"reevit-success__icon\">✓</div>\n <h3>Payment Successful</h3>\n <p>Reference: {result.reference}</p>\n </div>\n );\n }\n\n // Error state (only if not recoverable)\n if (status === 'failed' && error && !error.recoverable) {\n return (\n <div className=\"reevit-error\">\n <div className=\"reevit-error__icon\">✕</div>\n <h3>Payment Failed</h3>\n <p>{error.message}</p>\n <button className=\"reevit-btn reevit-btn--primary\" onClick={handleBack}>\n Try Again\n </button>\n </div>\n );\n }\n\n // Determine PSP from payment intent or use default\n const psp = selectedProvider || paymentIntent?.recommendedPsp || 'paystack';\n\n // PSP Bridge - dynamically route to the correct bridge based on provider\n if (showPSPBridge) {\n // Use PSP public key from payment intent if available, otherwise fall back to Reevit public key\n const pspKey = paymentIntent?.pspPublicKey || publicKey;\n\n // Common props for bridges that support them\n const bridgeMetadata = {\n ...metadata,\n // Override with correct payment intent ID for webhook routing\n // This ensures webhook includes the correct ID to find the payment\n payment_id: paymentIntent?.id,\n connection_id: paymentIntent?.connectionId ?? (metadata?.connection_id as string),\n customer_phone: momoData?.phone || phone,\n };\n\n // Route to the correct PSP bridge\n switch (psp) {\n case 'paystack':\n return (\n <PaystackBridge\n publicKey={pspKey}\n email={email}\n phone={momoData?.phone || phone}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={reference}\n accessCode={paymentIntent?.clientSecret}\n metadata={bridgeMetadata}\n channels={selectedMethod === 'mobile_money' ? ['mobile_money'] : ['card']}\n onSuccess={handlePSPSuccess}\n onError={handlePSPError}\n onClose={handlePSPClose}\n />\n );\n\n case 'hubtel':\n return (\n <HubtelBridge\n paymentId={paymentIntent?.id || ''}\n publicKey={publicKey}\n merchantAccount={pspKey}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference}\n email={email}\n phone={momoData?.phone || phone}\n description={`Payment ${paymentIntent?.reference || reference || ''}`}\n hubtelSessionToken={paymentIntent?.id ? paymentIntent.id : undefined}\n onSuccess={handlePSPSuccess}\n onError={(err: PaymentError) => handlePSPError(err)}\n onClose={handlePSPClose}\n />\n );\n\n case 'flutterwave':\n return (\n <FlutterwaveBridge\n publicKey={pspKey}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference}\n email={email}\n phone={momoData?.phone || phone}\n metadata={bridgeMetadata}\n onSuccess={handlePSPSuccess}\n onError={(err: PaymentError) => handlePSPError(err)}\n onClose={handlePSPClose}\n />\n );\n\n case 'monnify':\n // Monnify requires contractCode which should be in pspPublicKey or metadata\n return (\n <MonnifyBridge\n apiKey={pspKey}\n contractCode={(metadata?.contract_code as string) || pspKey}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference || `monnify_${Date.now()}`}\n customerName={(metadata?.customer_name as string) || email}\n customerEmail={email}\n customerPhone={momoData?.phone || phone}\n metadata={bridgeMetadata}\n onSuccess={(result) => handlePSPSuccess({\n paymentId: result.transactionReference,\n reference: result.paymentReference,\n amount: result.amount,\n currency: paymentIntent?.currency ?? currency,\n paymentMethod: selectedMethod || 'card',\n psp: 'monnify',\n pspReference: result.transactionReference,\n status: 'success',\n })}\n onError={(err) => handlePSPError({\n code: err.code,\n message: err.message,\n recoverable: true\n })}\n onClose={handlePSPClose}\n />\n );\n\n case 'mpesa':\n // M-Pesa uses STK Push via API endpoint\n return (\n <MPesaBridge\n apiEndpoint={`${apiBaseUrl || 'https://api.reevit.io'}/v1/payments/${paymentIntent?.id}/mpesa`}\n phoneNumber={momoData?.phone || phone || ''}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n reference={paymentIntent?.reference || reference || `mpesa_${Date.now()}`}\n description={`Payment ${paymentIntent?.reference || reference || ''}`}\n headers={{ 'x-reevit-public-key': publicKey }}\n onSuccess={(result) => handlePSPSuccess({\n paymentId: result.transactionId,\n reference: result.reference,\n amount: paymentIntent?.amount ?? amount,\n currency: paymentIntent?.currency ?? currency,\n paymentMethod: 'mobile_money',\n psp: 'mpesa',\n pspReference: result.transactionId,\n status: 'success',\n })}\n onError={(err) => handlePSPError({\n code: err.code,\n message: err.message,\n recoverable: true\n })}\n />\n );\n\n case 'stripe':\n return (\n <StripeBridge\n publishableKey={pspKey}\n clientSecret={paymentIntent?.clientSecret || ''}\n amount={paymentIntent?.amount ?? amount}\n currency={paymentIntent?.currency ?? currency}\n onSuccess={(result) => handlePSPSuccess({\n paymentId: result.paymentIntentId,\n reference: paymentIntent?.reference || reference || result.paymentIntentId,\n amount: paymentIntent?.amount ?? amount,\n currency: paymentIntent?.currency ?? currency,\n paymentMethod: selectedMethod || 'card',\n psp: 'stripe',\n pspReference: result.paymentIntentId,\n status: result.status === 'succeeded' ? 'success' : 'pending',\n })}\n onError={(err) => handlePSPError({\n code: err.code,\n message: err.message,\n recoverable: true\n })}\n onCancel={handlePSPClose}\n />\n );\n\n default:\n // Unsupported PSP - show error with option to retry\n return (\n <div className=\"reevit-error\">\n <div className=\"reevit-error__icon\">⚠️</div>\n <h3>Payment Provider Not Supported</h3>\n <p>The selected payment provider ({psp}) is not currently supported in this checkout.</p>\n <button className=\"reevit-btn reevit-btn--primary\" onClick={handleBack}>\n Go Back\n </button>\n </div>\n );\n }\n }\n\n\n // Mobile money form\n if (selectedMethod === 'mobile_money' && !showPSPBridge) {\n return (\n <MobileMoneyForm\n onSubmit={handleMomoSubmit}\n onCancel={handleBack}\n isLoading={isLoading}\n initialPhone={phone}\n />\n );\n }\n\n // Method selection\n return (\n <div className=\"reevit-method-step\">\n {providerOptions.length > 1 && (\n <ProviderSelector\n providers={providerOptions}\n selectedProvider={selectedProvider}\n onSelect={handleProviderSelect}\n disabled={isLoading}\n />\n )}\n\n <PaymentMethodSelector\n methods={availableMethods}\n selectedMethod={selectedMethod}\n onSelect={handleMethodSelect}\n disabled={isLoading}\n provider={activeProvider?.provider || psp}\n />\n\n {selectedMethod && selectedMethod !== 'mobile_money' && (\n <div className=\"reevit-method-step__actions\">\n <button\n className=\"reevit-btn reevit-btn--primary\"\n onClick={handleContinue}\n disabled={isLoading}\n >\n Continue\n </button>\n </div>\n )}\n </div>\n );\n };\n\n return (\n <ReevitContext.Provider value={{ publicKey, amount, currency }}>\n {trigger}\n\n {isOpen && (\n <div className=\"reevit-overlay\" onClick={handleClose}>\n <div\n className={cn('reevit-modal', isComplete && 'reevit-modal--success')}\n style={themeStyles}\n data-reevit-theme={dataTheme}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Header */}\n <div className=\"reevit-modal__header\">\n <div className=\"reevit-modal__branding\">\n <img\n src=\"https://i.imgur.com/bzUR5Lm.png\"\n alt=\"Reevit\"\n className=\"reevit-modal__logo\"\n />\n </div>\n <button\n className=\"reevit-modal__close\"\n onClick={handleClose}\n aria-label=\"Close\"\n >\n ✕\n </button>\n </div>\n\n {/* Amount display */}\n <div className=\"reevit-modal__amount\">\n <span className=\"reevit-modal__amount-label\">Amount</span>\n <span className=\"reevit-modal__amount-value\">\n {formatAmount(amount, currency)}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"reevit-modal__content\">\n {renderContent()}\n </div>\n\n {/* Footer */}\n <div className=\"reevit-modal__footer\">\n <span className=\"reevit-modal__secured\">\n 🔒 Secured by Reevit\n </span>\n </div>\n </div>\n </div>\n )}\n </ReevitContext.Provider>\n );\n}\n"]}
|