{"version":3,"sources":["../src/hooks/useReevit.ts","../src/utils/index.ts","../src/components/MobileMoneyForm.tsx","../src/components/LoadingState.tsx","../src/bridges/PaystackBridge.tsx","../src/api/client.ts","../src/bridges/HubtelBridge.tsx","../src/bridges/FlutterwaveBridge.tsx","../src/bridges/MonnifyBridge.tsx","../src/bridges/MPesaBridge.tsx","../src/bridges/StripeBridge.tsx","../src/components/ReevitCheckout.tsx","../src/components/PaymentMethodSelector.tsx"],"names":["options","result","useEffect","useCallback","jsxs","jsx","useRef","ReevitAPIClient","useState","Fragment","mpesa_default","psp","error"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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  ReevitTheme,\n  CheckoutProviderOption,\n} from '../types';\nimport {\n  ReevitAPIClient,\n  cacheIntentPromise,\n  cacheIntentResponse,\n  clearIntentCacheEntry,\n  resolveIntentIdentity,\n  type PaymentIntentResponse,\n} from '@reevit/core';\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\nconst DEFAULT_PUBLIC_API_BASE_URL = 'https://api.reevit.io';\n\nfunction buildPaymentLinkError(response: Response, data: any): PaymentError {\n  return {\n    code: data?.code || 'payment_link_error',\n    message: data?.message || 'Payment link request failed',\n    recoverable: true,\n    details: {\n      httpStatus: response.status,\n      ...(data?.details || {}),\n    },\n  };\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\ninterface CheckoutSessionResponse {\n  id: string;\n  client_secret: string;\n  session_secret: string;\n  payment_intent: PaymentIntentResponse;\n  expires_at?: 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\nfunction normalizeBranding(branding?: Record<string, unknown>): ReevitTheme {\n  if (!branding) {\n    return {};\n  }\n\n  const raw = branding as Record<string, unknown>;\n  const theme: Record<string, unknown> = { ...raw };\n  const getString = (value: unknown) => (typeof value === 'string' ? value : undefined);\n  const getBoolean = (value: unknown) => (typeof value === 'boolean' ? value : undefined);\n\n  const setIf = (key: string, value: unknown) => {\n    if (value !== undefined) {\n      theme[key] = value;\n    }\n  };\n\n  setIf('logoUrl', getString(raw.logoUrl ?? raw.logo_url));\n  setIf('companyName', getString(raw.companyName ?? raw.company_name));\n  setIf('primaryColor', getString(raw.primaryColor ?? raw.primary_color));\n  setIf('primaryForegroundColor', getString(raw.primaryForegroundColor ?? raw.primary_foreground_color));\n  setIf('backgroundColor', getString(raw.backgroundColor ?? raw.background_color));\n  setIf('surfaceColor', getString(raw.surfaceColor ?? raw.surface_color));\n  setIf('textColor', getString(raw.textColor ?? raw.text_color));\n  setIf('mutedTextColor', getString(raw.mutedTextColor ?? raw.muted_text_color));\n  setIf('borderRadius', getString(raw.borderRadius ?? raw.border_radius));\n  setIf('fontFamily', getString(raw.fontFamily ?? raw.font_family));\n  setIf('darkMode', getBoolean(raw.darkMode ?? raw.dark_mode));\n  setIf('pspSelectorBgColor', getString(raw.pspSelectorBgColor ?? raw.psp_selector_bg_color));\n  setIf('pspSelectorTextColor', getString(raw.pspSelectorTextColor ?? raw.psp_selector_text_color));\n  setIf('pspSelectorBorderColor', getString(raw.pspSelectorBorderColor ?? raw.psp_selector_border_color));\n  setIf('pspSelectorUseBorder', getBoolean(raw.pspSelectorUseBorder ?? raw.psp_selector_use_border));\n  setIf('selectedBackgroundColor', getString(raw.selectedBackgroundColor ?? raw.selected_background_color));\n  setIf('selectedTextColor', getString(raw.selectedTextColor ?? raw.selected_text_color));\n  setIf('selectedDescriptionColor', getString(raw.selectedDescriptionColor ?? raw.selected_description_color));\n  setIf('selectedBorderColor', getString(raw.selectedBorderColor ?? raw.selected_border_color));\n\n  return theme as ReevitTheme;\n}\n\nfunction isPaymentError(error: unknown): error is PaymentError {\n  return typeof error === 'object' && error !== null && 'code' in error && 'message' in error;\n}\n\nasync function getCheckoutSession(\n  apiClient: ReevitAPIClient,\n  sessionSecret: string,\n  apiBaseUrl?: string\n): Promise<{ data?: CheckoutSessionResponse; error?: PaymentError }> {\n  const clientWithSessions = apiClient as ReevitAPIClient & {\n    getCheckoutSession?: (secret: string) => Promise<{ data?: CheckoutSessionResponse; error?: PaymentError }>;\n  };\n\n  if (typeof clientWithSessions.getCheckoutSession === 'function') {\n    return clientWithSessions.getCheckoutSession(sessionSecret);\n  }\n\n  const response = await fetch(\n    `${apiBaseUrl || DEFAULT_PUBLIC_API_BASE_URL}/v1/checkout/sessions/${encodeURIComponent(sessionSecret)}`\n  );\n  const responseData = await response.json().catch(() => ({}));\n  if (!response.ok) {\n    return {\n      error: {\n        code: responseData?.code || 'checkout_session_error',\n        message: responseData?.message || 'Checkout session request failed',\n        recoverable: response.status >= 500,\n        details: {\n          httpStatus: response.status,\n          ...(responseData?.details || {}),\n        },\n      },\n    };\n  }\n\n  return { data: responseData as CheckoutSessionResponse };\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    pspCredentials: response.psp_credentials,\n    amount: response.amount,\n    currency: response.currency,\n    status: response.status as 'pending' | 'requires_action' | 'processing' | 'succeeded' | 'failed' | 'canceled' | 'cancelled',\n    recommendedPsp: mapProviderToPsp(response.provider),\n    availableMethods: config.paymentMethods || ['card', 'mobile_money'],\n    providerRefId: response.provider_ref_id,\n    reference: response.reference || response.provider_ref_id || response.id, // Use backend reference or fallback to provider ref then ID\n    orgId: response.org_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: normalizeBranding(response.branding as Record<string, unknown> | undefined),\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  const stateRef = useRef<ReevitState>(state);\n  useEffect(() => {\n    stateRef.current = state;\n  }, [state]);\n\n  // Track the current intent identity to allow re-init when it changes\n  const currentIntentKeyRef = useRef<string | null>(\n    config.initialPaymentIntent ? `initial:${config.initialPaymentIntent.id}` : null\n  );\n  const initRequestIdRef = useRef(0);\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        currentIntentKeyRef.current = `initial:${config.initialPaymentIntent.id}`;\n      }\n    } else if (currentIntentKeyRef.current?.startsWith('initial:')) {\n      currentIntentKeyRef.current = null;\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      if (config.initialPaymentIntent) {\n        return;\n      }\n\n      let requestId = 0;\n      let intentKey: string | null = null;\n\n      try {\n        const apiClient = apiClientRef.current;\n        if (!apiClient) {\n          throw new Error('API client not initialized');\n        }\n\n        // Determine country from currency (can be enhanced with IP detection)\n        const country = detectCountryFromCurrency(config.currency || 'GHS');\n\n        // Select payment method to send to backend\n        const defaultMethod =\n          config.paymentMethods && config.paymentMethods.length === 1\n            ? config.paymentMethods[0]\n            : undefined;\n        const paymentMethod = method ?? defaultMethod;\n\n        const identity = resolveIntentIdentity({\n          config: config as any,\n          method: paymentMethod as any,\n          preferredProvider: options?.preferredProvider,\n          allowedProviders: options?.allowedProviders,\n          publicKey: config.publicKey,\n        });\n        const { idempotencyKey, reference, cacheEntry } = identity;\n        intentKey = idempotencyKey;\n\n        if (currentIntentKeyRef.current === idempotencyKey && stateRef.current.paymentIntent) {\n          return;\n        }\n\n        currentIntentKeyRef.current = idempotencyKey;\n        requestId = ++initRequestIdRef.current;\n\n        if (stateRef.current.status !== 'loading') {\n          dispatch({ type: 'INIT_START' });\n        }\n\n        const requestIntent = async (): Promise<PaymentIntentResponse> => {\n          if (config.sessionSecret) {\n            const result = await getCheckoutSession(apiClient, config.sessionSecret, apiBaseUrl);\n\n            if (result.error) {\n              throw result.error;\n            }\n\n            if (!result.data) {\n              throw {\n                code: 'INIT_FAILED',\n                message: 'No checkout session data received from API',\n                recoverable: true,\n              } as PaymentError;\n            }\n\n            return result.data.payment_intent;\n          }\n\n          if (config.paymentLinkCode) {\n            const response = await fetch(\n              `${apiBaseUrl || DEFAULT_PUBLIC_API_BASE_URL}/v1/pay/${config.paymentLinkCode}/pay`,\n              {\n                method: 'POST',\n                headers: {\n                  'Content-Type': 'application/json',\n                  'Idempotency-Key': idempotencyKey,\n                },\n                body: JSON.stringify({\n                  amount: config.amount,\n                  email: config.email || '',\n                  name: config.customerName || '',\n                  phone: config.phone || '',\n                  method: paymentMethod,\n                  country,\n                  provider: options?.preferredProvider || options?.allowedProviders?.[0],\n                  custom_fields: config.customFields,\n                }),\n              }\n            );\n\n            const responseData = await response.json().catch(() => ({}));\n            if (!response.ok) {\n              throw buildPaymentLinkError(response, responseData);\n            }\n            return responseData as PaymentIntentResponse;\n          }\n\n          const result = await apiClient.createPaymentIntent(\n            { ...config, reference, idempotencyKey } as any,\n            paymentMethod,\n            country,\n            {\n              preferredProviders: options?.preferredProvider ? [options.preferredProvider] : undefined,\n              allowedProviders: options?.allowedProviders,\n            }\n          );\n\n          if (result.error) {\n            throw result.error;\n          }\n\n          if (!result.data) {\n            throw {\n              code: 'INIT_FAILED',\n              message: 'No data received from API',\n              recoverable: true,\n            } as PaymentError;\n          }\n\n          return result.data;\n        };\n\n        let data: PaymentIntentResponse;\n        if (cacheEntry?.response) {\n          data = cacheEntry.response;\n        } else {\n          let intentPromise = cacheEntry?.promise;\n          if (!intentPromise) {\n            intentPromise = requestIntent();\n            cacheIntentPromise(idempotencyKey, intentPromise);\n          }\n          data = await intentPromise;\n          cacheIntentResponse(idempotencyKey, data);\n        }\n\n        if (requestId !== initRequestIdRef.current) {\n          return;\n        }\n\n        // Map response to PaymentIntent\n        const paymentIntent = mapToPaymentIntent(data, { ...config, reference, idempotencyKey });\n\n        dispatch({ type: 'INIT_SUCCESS', payload: paymentIntent });\n      } catch (err) {\n        if (intentKey) {\n          clearIntentCacheEntry(intentKey);\n        }\n\n        if (requestId !== initRequestIdRef.current) {\n          return;\n        }\n        const error: PaymentError = isPaymentError(err)\n          ? err\n          : {\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      }\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(async () => {\n    // Cancel the existing 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    currentIntentKeyRef.current = null;\n    initRequestIdRef.current += 1;\n    dispatch({ type: 'RESET' });\n  }, [state.paymentIntent, state.status]);\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 * Utility functions for the Reevit React SDK\n */\n\nimport airteltigoLogo from '../assets/methods/airteltigo.png';\nimport applePayLogo from '../assets/methods/apple-pay.png';\nimport googlePayLogo from '../assets/methods/google-pay.png';\nimport mastercardLogo from '../assets/methods/mastercard.png';\nimport mpesaLogo from '../assets/methods/mpesa.png';\nimport mtnLogo from '../assets/methods/mtn.png';\nimport telecelLogo from '../assets/methods/telecel.png';\nimport visaLogo from '../assets/methods/visa.png';\n\nexport type AssetSource = string | { src: string };\n\nexport function resolveAssetSrc(asset?: AssetSource | null): string | undefined {\n  if (!asset) return undefined;\n  if (typeof asset === 'string') return asset;\n  if (typeof asset === 'object' && 'src' in asset && typeof asset.src === 'string') {\n    return asset.src;\n  }\n  return undefined;\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    telecel: /^(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 a Ghana phone number.\n * Accepts local (0XXXXXXXXX) and international (233… / +233…) formats,\n * then matches the two-digit operator code.\n */\nexport function detectNetwork(phone: string): string | null {\n  let cleaned = phone.replace(/[\\s-]/g, '');\n\n  // Normalise any supported format to local 0XXXXXXXXX form.\n  if (cleaned.startsWith('+233')) {\n    cleaned = '0' + cleaned.slice(4);\n  } else if (cleaned.startsWith('233')) {\n    cleaned = '0' + cleaned.slice(3);\n  }\n\n  if (!cleaned.startsWith('0') || cleaned.length < 3) {\n    return null;\n  }\n\n  // The operator code is the two digits after the leading 0.\n  const code = cleaned.slice(1, 3);\n\n  // Operator codes kept in sync with @reevit/core's detectNetwork.\n  const operatorCodes: Record<string, string[]> = {\n    mtn: ['24', '25', '53', '54', '55', '59'],\n    telecel: ['20', '50'],\n    airteltigo: ['26', '27', '56', '57'],\n  };\n\n  for (const [network, codes] of Object.entries(operatorCodes)) {\n    if (codes.includes(code)) {\n      return network;\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/**\n * Get default brand colors for a PSP\n */\nexport function getPspBrandColors(provider: string): { backgroundColor: string; primaryColor: string; primaryForegroundColor: string } {\n  const p = provider.toLowerCase();\n\n  const brandColors: Record<string, { backgroundColor: string; primaryColor: string; primaryForegroundColor: string }> = {\n    paystack: {\n      backgroundColor: '#E8F5F0',\n      primaryColor: '#00C3A0',\n      primaryForegroundColor: '#FFFFFF',\n    },\n    hubtel: {\n      backgroundColor: '#E8F5EC',\n      primaryColor: '#00A651',\n      primaryForegroundColor: '#FFFFFF',\n    },\n    flutterwave: {\n      backgroundColor: '#FFF5E6',\n      primaryColor: '#F5A623',\n      primaryForegroundColor: '#000000',\n    },\n    stripe: {\n      backgroundColor: '#EEF0FF',\n      primaryColor: '#635BFF',\n      primaryForegroundColor: '#FFFFFF',\n    },\n    monnify: {\n      backgroundColor: '#FFF0E6',\n      primaryColor: '#FF6B00',\n      primaryForegroundColor: '#FFFFFF',\n    },\n    mpesa: {\n      backgroundColor: '#E8F5E9',\n      primaryColor: '#4CAF50',\n      primaryForegroundColor: '#FFFFFF',\n    },\n  };\n\n  return brandColors[p] || {\n    backgroundColor: '#F5F5F5',\n    primaryColor: '#333333',\n    primaryForegroundColor: '#FFFFFF',\n  };\n}\n\n/**\n * Get country code from currency\n */\nexport function getCountryFromCurrency(currency: string): string {\n  const currencyToCountry: Record<string, string> = {\n    GHS: 'GH',\n    NGN: 'NG',\n    KES: 'KE',\n    ZAR: 'ZA',\n    USD: 'US',\n    GBP: 'GB',\n    EUR: 'EU',\n  };\n  return currencyToCountry[currency.toUpperCase()] || 'GH';\n}\n\n/**\n * Get dynamic payment method logos based on country and method\n * Returns URLs to logo images that should be displayed for the payment method\n */\nexport function getMethodLogos(country: string, method: string): string[] {\n  const c = country.toUpperCase();\n\n  const LOGOS = {\n    visa: resolveAssetSrc(visaLogo),\n    mastercard: resolveAssetSrc(mastercardLogo),\n    apple_pay: resolveAssetSrc(applePayLogo),\n    google_pay: resolveAssetSrc(googlePayLogo),\n    mtn: resolveAssetSrc(mtnLogo),\n    telecel: resolveAssetSrc(telecelLogo),\n    airteltigo: resolveAssetSrc(airteltigoLogo),\n    mpesa: resolveAssetSrc(mpesaLogo),\n  };\n\n  if (method === 'card') {\n    return [LOGOS.visa, LOGOS.mastercard].filter(Boolean) as string[];\n  }\n\n  if (method === 'apple_pay') return [LOGOS.apple_pay].filter(Boolean) as string[];\n  if (method === 'google_pay') return [LOGOS.google_pay].filter(Boolean) as string[];\n\n  if (method === 'mobile_money') {\n    if (c === 'GH') return [LOGOS.mtn, LOGOS.telecel, LOGOS.airteltigo].filter(Boolean) as string[];\n    if (c === 'KE') return [LOGOS.mpesa].filter(Boolean) as string[];\n    if (c === 'NG') return [LOGOS.mtn].filter(Boolean) as string[];\n    return [LOGOS.mtn].filter(Boolean) as string[];\n  }\n\n  return [];\n}\n","/**\n * MobileMoneyForm Component\n * Collects the mobile money phone number and network. The network is\n * auto-selected from the number's prefix as the user types, and can also\n * be picked manually.\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  hideCancel?: boolean;\n}\n\nconst networks: { id: MobileMoneyNetwork; name: string }[] = [\n  { id: 'mtn', name: 'MTN' },\n  { id: 'telecel', name: 'Telecel' },\n  { id: 'airteltigo', name: 'AirtelTigo' },\n];\n\nexport function MobileMoneyForm({\n  onSubmit,\n  onCancel,\n  isLoading = false,\n  initialPhone = '',\n  hideCancel = false,\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-select the network that matches the number's prefix as it's typed.\n  // The user can still override by tapping a network button.\n  useEffect(() => {\n    const detected = detectNetwork(phone) as MobileMoneyNetwork | null;\n    if (detected) {\n      setNetwork(detected);\n    }\n  }, [phone]);\n\n  useEffect(() => {\n    if (touched && phone) {\n      if (!validatePhone(phone)) {\n        setError('Enter a valid mobile money 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 || !validatePhone(phone)) {\n        setError('Enter a valid mobile money number');\n        return;\n      }\n\n      if (!network) {\n        setError('Select your mobile money network');\n        return;\n      }\n\n      if (!validatePhone(phone, network)) {\n        setError(\"This number doesn't match the 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-brut__momo\" onSubmit={handleSubmit}>\n      <div className=\"reevit-brut__field\">\n        <label htmlFor=\"reevit-phone\" className=\"reevit-brut__field-label\">\n          Phone number\n        </label>\n        <input\n          id=\"reevit-phone\"\n          type=\"tel\"\n          className={cn('reevit-brut__input', !!error && 'reevit-brut__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-brut__input-note\">{formatPhone(phone)}</div>\n        )}\n        {error && <div className=\"reevit-brut__input-error\">{error}</div>}\n      </div>\n\n      <div className=\"reevit-brut__field\">\n        <span className=\"reevit-brut__field-label\">Select network</span>\n        <div className=\"reevit-brut__networks\">\n          {networks.map((n) => (\n            <button\n              key={n.id}\n              type=\"button\"\n              className=\"reevit-brut__network\"\n              data-selected={network === n.id}\n              onClick={() => setNetwork(n.id)}\n              disabled={isLoading}\n            >\n              {n.name}\n            </button>\n          ))}\n        </div>\n      </div>\n\n      <div className=\"reevit-brut__momo-actions\">\n        {!hideCancel && (\n          <button\n            type=\"button\"\n            className=\"reevit-brut__cta reevit-brut__cta--ghost\"\n            onClick={onCancel}\n            disabled={isLoading}\n          >\n            <span>BACK</span>\n          </button>\n        )}\n        <button\n          type=\"submit\"\n          className=\"reevit-brut__cta\"\n          disabled={!isValid || isLoading}\n        >\n          {isLoading ? (\n            <span>PLEASE WAIT</span>\n          ) : (\n            <>\n              <span>CONTINUE</span>\n              <span>&rarr;</span>\n            </>\n          )}\n        </button>\n      </div>\n\n      <p className=\"reevit-brut__momo-hint\">\n        You will receive a USSD prompt on your phone to authorize the payment.\n      </p>\n    </form>\n  );\n}\n","/**\n * LoadingState Component\n * The single brutalist loading screen used for every loading state across\n * the checkout — server connection, PSP connection, payment processing.\n */\n\ninterface LoadingStateProps {\n  /** Small status tag above the bars (e.g. \"CONNECTING\", \"PROCESSING\"). */\n  marker?: string;\n  /** Headline. */\n  title?: string;\n  /** Sub-line beneath the headline. */\n  message?: string;\n}\n\nexport function LoadingState({\n  marker = 'PROCESSING',\n  title = 'Please wait',\n  message = 'Do not close this window',\n}: LoadingStateProps) {\n  return (\n    <div className=\"reevit-brut__state\">\n      <span className=\"reevit-brut__state-marker\">{marker}</span>\n      <div className=\"reevit-brut__bars\">\n        <span /><span /><span /><span /><span />\n      </div>\n      <h3 className=\"reevit-brut__state-title\">{title}</h3>\n      <p className=\"reevit-brut__state-sub\">{message}</p>\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';\nimport { LoadingState } from '../components/LoadingState';\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 <LoadingState marker=\"PAYMENT GATEWAY\" title=\"Connecting to Paystack\" />;\n}\n\n// Export utility for manual initialization\nexport { loadPaystackScript };","/**\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  org_id?: string;\n  connection_id: string;\n  provider: string;\n  provider_ref_id?: string;\n  status: string;\n  client_secret: string;\n  session_secret?: string;\n  psp_public_key?: string;\n  psp_credentials?: {\n    merchantAccount?: string | number;\n    basicAuth?: string;\n    [key: string]: unknown;\n  };\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\nexport interface CheckoutSessionResponse {\n  id: string;\n  client_secret: string;\n  session_secret: string;\n  payment_intent: PaymentIntentResponse;\n  expires_at?: 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  /** Base64 basic auth for Hubtel checkout (exposes credentials) */\n  basicAuth?: 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 DEFAULT_TIMEOUT = 30000; // 30 seconds\nlet hasWarnedAboutLiveBrowserIntents = false;\n\n/**\n * Determines if a public key is for sandbox mode\n */\nfunction isSandboxKey(publicKey: string): boolean {\n  return publicKey.startsWith('pfk_test_');\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 * Generates a deterministic idempotency key based on input parameters\n * Uses a simple hash function suitable for browser environments\n * Exported for use by SDK hooks (e.g., payment link flows)\n */\nexport function generateIdempotencyKey(params: Record<string, unknown>): string {\n  // Create a stable string representation of the parameters\n  const sortedKeys = Object.keys(params).sort();\n  const stableString = sortedKeys\n    .map(key => `${key}:${JSON.stringify(params[key])}`)\n    .join('|');\n\n  // Simple hash function (djb2 algorithm)\n  let hash = 5381;\n  for (let i = 0; i < stableString.length; i++) {\n    hash = ((hash << 5) + hash) + stableString.charCodeAt(i);\n    hash = hash & hash; // Convert to 32-bit integer\n  }\n\n  // Convert to positive hex string\n  const hashHex = (hash >>> 0).toString(16);\n\n  // Add a time bucket (5-minute windows) to allow retries within a reasonable window\n  // but prevent keys from being reused across completely different sessions\n  const timeBucket = Math.floor(Date.now() / (5 * 60 * 1000));\n\n  return `reevit_${timeBucket}_${hashHex}`;\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 || API_BASE_URL_PRODUCTION;\n    this.timeout = config.timeout || DEFAULT_TIMEOUT;\n  }\n\n  /**\n   * Makes an authenticated API request\n   * @param idempotencyKey Optional deterministic idempotency key for the request\n   */\n  private async request<T>(\n    method: string,\n    path: string,\n    body?: unknown,\n    idempotencyKey?: string\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-Client': '@reevit/react',\n      'X-Reevit-Client-Version': '0.9.0',\n    };\n    if (this.publicKey) {\n      headers['X-Reevit-Key'] = this.publicKey;\n    }\n\n    // Add idempotency key for mutating requests\n    if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n      // Use provided deterministic key, or generate one based on request body\n      headers['Idempotency-Key'] = idempotencyKey ||\n        (body ? generateIdempotencyKey(body as Record<string, unknown>) : `${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    if (\n      this.publicKey.startsWith('pfk_live_') &&\n      !hasWarnedAboutLiveBrowserIntents &&\n      typeof console !== 'undefined'\n    ) {\n      hasWarnedAboutLiveBrowserIntents = true;\n      console.warn(\n        'Creating live payment intents from the browser is deprecated. Create a checkout session on your server and pass sessionSecret to the browser SDK instead.'\n      );\n    }\n\n    if (typeof config.amount !== 'number' || !config.currency) {\n      return {\n        error: {\n          code: 'invalid_checkout_config',\n          message: 'amount and currency are required when creating a payment intent in the browser.',\n          recoverable: false,\n        },\n      };\n    }\n\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      country,\n      customer_id: config.email || (config.metadata?.customerId as string | undefined),\n      phone: config.phone,\n      metadata,\n    };\n\n    if (method) {\n      request.method = this.mapPaymentMethod(method);\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    // Generate a deterministic idempotency key based on payment parameters\n    // This ensures that duplicate requests for the same payment return the same intent\n    const idempotencyKey = config.idempotencyKey || generateIdempotencyKey({\n      amount: config.amount,\n      currency: config.currency,\n      customer: config.email || config.metadata?.customerId || '',\n      reference: config.reference || '',\n      method: method || '',\n      provider: options?.preferredProviders?.[0] || options?.allowedProviders?.[0] || '',\n      publicKey: this.publicKey,\n    });\n\n    return this.request<PaymentIntentResponse>('POST', '/v1/payments/intents', request, idempotencyKey);\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   * Retrieves a server-created checkout session using its public session secret.\n   */\n  async getCheckoutSession(sessionSecret: string): Promise<{ data?: CheckoutSessionResponse; error?: PaymentError }> {\n    return this.request<CheckoutSessionResponse>(\n      'GET',\n      `/v1/checkout/sessions/${encodeURIComponent(sessionSecret)}`\n    );\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>(\n      'POST',\n      `/v1/payments/${paymentId}/confirm-intent?client_secret=${encodeURIComponent(clientSecret)}`\n    );\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(\n    paymentId: string,\n    clientSecret?: string\n  ): Promise<{ data?: HubtelSessionResponse; error?: PaymentError }> {\n    const query = clientSecret ? `?client_secret=${encodeURIComponent(clientSecret)}` : '';\n    return this.request<HubtelSessionResponse>('POST', `/v1/payments/hubtel/sessions/${paymentId}${query}`);\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 * Hubtel Bridge\n * Handles integration with Hubtel payment using @hubteljs/checkout npm package\n *\n * Supports two authentication methods:\n * 1. Session (recommended): Fetches base64 basicAuth from the backend session endpoint\n * 2. Basic Auth (legacy): Pass basicAuth directly (deprecated - credentials exposed)\n */\n\nimport { useEffect, useCallback, useRef, useState } from 'react';\nimport CheckoutSdk from '@hubteljs/checkout';\nimport type { PaymentMethod, PaymentResult, PaymentError } from '../types';\nimport { createReevitClient } from '../api/client';\nimport { LoadingState } from '../components/LoadingState';\n\nconst DEFAULT_REEVIT_API_BASE_URL = 'https://api.reevit.io';\n\nfunction getHubtelCallbackURL(apiBaseUrl?: string): string {\n  return `${apiBaseUrl || DEFAULT_REEVIT_API_BASE_URL}/v1/webhooks/incoming/hubtel`;\n}\n\nfunction parseHubtelCallbackPayload(input: unknown): Record<string, unknown> {\n  if (!input || typeof input !== 'object') {\n    return {};\n  }\n\n  const raw = input as Record<string, unknown>;\n  const nested = raw.data;\n  if (typeof nested === 'string') {\n    try {\n      const parsed = JSON.parse(nested) as unknown;\n      if (parsed && typeof parsed === 'object') {\n        return { ...raw, ...(parsed as Record<string, unknown>) };\n      }\n    } catch {\n      // Ignore parsing errors and fall back to raw payload.\n    }\n  } else if (nested && typeof nested === 'object') {\n    return { ...raw, ...(nested as Record<string, unknown>) };\n  }\n\n  return raw;\n}\n\nfunction readHubtelField(payload: Record<string, unknown>, keys: string[]): string {\n  for (const key of keys) {\n    const value = payload[key];\n    if (typeof value === 'string' && value.trim().length > 0) {\n      return value.trim();\n    }\n  }\n\n  return '';\n}\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  apiBaseUrl?: string;\n  clientSecret?: string;\n  /** Session token from server (triggers session fetch) */\n  hubtelSessionToken?: string;\n  /** Base64 basic auth credential (legacy - credentials exposed) */\n  basicAuth?: string;\n  preferredMethod?: PaymentMethod;\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  currency,\n  reference,\n  email,\n  phone,\n  description = 'Payment',\n  callbackUrl,\n  apiBaseUrl,\n  clientSecret,\n  hubtelSessionToken,\n  basicAuth,\n  preferredMethod,\n  onSuccess,\n  onError,\n  onClose,\n  autoStart = true,\n}: HubtelBridgeProps) {\n  const initialized = useRef(false);\n  const [authValue, setAuthValue] = useState<string>('');\n  const [isLoading, setIsLoading] = useState<boolean>(false);\n  const [resolvedMerchantAccount, setResolvedMerchantAccount] = useState<string | number>(merchantAccount);\n\n  useEffect(() => {\n    setResolvedMerchantAccount(merchantAccount);\n  }, [merchantAccount]);\n\n  // Fetch basicAuth if session trigger is provided, otherwise use legacy basicAuth\n  useEffect(() => {\n    const fetchAuth = async () => {\n      if (hubtelSessionToken) {\n        setIsLoading(true);\n        try {\n          const client = createReevitClient({ publicKey, baseUrl: apiBaseUrl });\n          const { data, error } = await client.createHubtelSession(paymentId, clientSecret);\n          if (error || !data?.basicAuth) {\n            onError({\n              code: 'SESSION_ERROR',\n              message: error?.message || 'Failed to create Hubtel session',\n              recoverable: true,\n            });\n            return;\n          }\n          setAuthValue(data.basicAuth);\n          if (data.merchantAccount) {\n            setResolvedMerchantAccount(data.merchantAccount);\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        setAuthValue(basicAuth);\n      }\n    };\n\n    fetchAuth();\n  }, [paymentId, publicKey, apiBaseUrl, clientSecret, hubtelSessionToken, basicAuth, onError]);\n\n  const startPayment = useCallback(async () => {\n    if (isLoading || !authValue) {\n      return;\n    }\n\n    try {\n      const checkout = new CheckoutSdk();\n\n      const methodPreference =\n        preferredMethod === 'mobile_money' ? 'momo' : preferredMethod === 'card' ? 'card' : undefined;\n\n      const purchaseInfo = {\n        amount: amount / 100, // Convert from minor to major units\n        purchaseDescription: description,\n        customerPhoneNumber: phone || '',\n        ...(email ? { customerEmail: email } : {}),\n        clientReference: reference || paymentId || `hubtel_${Date.now()}`,\n        ...(methodPreference ? { paymentMethod: methodPreference } : {}),\n      };\n\n      const config = {\n        branding: 'enabled' as const,\n        callbackUrl: callbackUrl || getHubtelCallbackURL(apiBaseUrl),\n        merchantAccount: typeof resolvedMerchantAccount === 'string'\n          ? parseInt(resolvedMerchantAccount, 10)\n          : resolvedMerchantAccount,\n        basicAuth: authValue || '',\n        ...(methodPreference ? { paymentMethod: methodPreference } : {}),\n      };\n\n      checkout.openModal({\n        purchaseInfo,\n        config,\n        callBacks: {\n          onInit: () => console.log('Hubtel checkout initialized'),\n          onPaymentSuccess: (data: any) => {\n            const payload = parseHubtelCallbackPayload(data);\n            const transactionReference = readHubtelField(payload, [\n              'transactionId',\n              'transaction_id',\n              'transactionReference',\n              'paymentReference',\n              'checkoutId',\n            ]);\n            const clientReference = readHubtelField(payload, ['clientReference', 'client_reference']);\n            const result: PaymentResult = {\n              paymentId: paymentId,\n              reference: clientReference || reference || paymentId,\n              amount: amount,\n              currency: currency || 'GHS',\n              paymentMethod: preferredMethod || 'mobile_money',\n              psp: 'hubtel',\n              pspReference: transactionReference || paymentId,\n              status: 'success',\n              metadata: {\n                hubtel_payload: payload,\n                hubtel_raw: data,\n              },\n            };\n            onSuccess(result);\n            checkout.closePopUp();\n          },\n          onPaymentFailure: (data: any) => {\n            const payload = parseHubtelCallbackPayload(data);\n            const error: PaymentError = {\n              code: 'PAYMENT_FAILED',\n              message:\n                readHubtelField(payload, ['message', 'error', 'reason']) ||\n                'Payment failed',\n              recoverable: true,\n              details: {\n                hubtel_payload: payload,\n              },\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  }, [\n    amount,\n    reference,\n    phone,\n    description,\n    callbackUrl,\n    paymentId,\n    apiBaseUrl,\n    authValue,\n    isLoading,\n    preferredMethod,\n    onSuccess,\n    onError,\n    onClose,\n    resolvedMerchantAccount,\n    currency,\n  ]);\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 <LoadingState marker=\"PAYMENT GATEWAY\" title=\"Connecting to Hubtel\" />;\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  apiBaseUrl?: string;\n  customerPhoneNumber?: string;\n  basicAuth?: string;\n  preferredMethod?: PaymentMethod;\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 methodPreference =\n    config.preferredMethod === 'mobile_money' ? 'momo' : config.preferredMethod === 'card' ? 'card' : undefined;\n\n  const purchaseInfo = {\n    amount: config.amount,\n    purchaseDescription: config.description,\n    customerPhoneNumber: config.customerPhoneNumber || '',\n    clientReference: config.clientReference || `hubtel_${Date.now()}`,\n    ...(methodPreference ? { paymentMethod: methodPreference } : {}),\n  };\n\n  const checkoutConfig = {\n    branding: 'enabled' as const,\n    callbackUrl: config.callbackUrl || getHubtelCallbackURL(config.apiBaseUrl),\n    merchantAccount: typeof config.merchantAccount === 'string'\n      ? parseInt(config.merchantAccount, 10)\n      : config.merchantAccount,\n    basicAuth: config.basicAuth || '',\n    ...(methodPreference ? { paymentMethod: methodPreference } : {}),\n  };\n\n  checkout.openModal({\n    purchaseInfo,\n    config: checkoutConfig,\n    callBacks: {\n      onPaymentSuccess: (data: any) => {\n        config.onSuccess?.(parseHubtelCallbackPayload(data));\n        checkout.closePopUp();\n      },\n      onPaymentFailure: (data: any) => {\n        config.onError?.(parseHubtelCallbackPayload(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';\nimport { LoadingState } from '../components/LoadingState';\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 <LoadingState marker=\"PAYMENT GATEWAY\" title=\"Connecting to Flutterwave\" />;\n}\n\nexport { loadFlutterwaveScript };\n","/**\n * MonnifyBridge.tsx\n * React component for Monnify payment integration (Nigeria)\n */\n\nimport { useEffect, useCallback, useState } from 'react';\nimport { LoadingState } from '../components/LoadingState';\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 <LoadingState marker=\"PAYMENT GATEWAY\" title=\"Connecting to Monnify\" />;\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';\nimport { LoadingState } from '../components/LoadingState';\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-brut__state\">\n        <span className=\"reevit-brut__state-marker\">PAYMENT GATEWAY</span>\n        <div className=\"reevit-brut__icon-box\">\n          <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n            <rect x=\"6\" y=\"2.5\" width=\"12\" height=\"19\" rx=\"2.5\" />\n            <path d=\"M10.5 18.5h3\" />\n          </svg>\n        </div>\n        <h3 className=\"reevit-brut__state-title\">Pay with M-Pesa</h3>\n        <p className=\"reevit-brut__state-sub\">\n          You'll get a prompt on your phone to authorize the payment\n        </p>\n        <div className=\"reevit-brut__phone\">{phoneNumber}</div>\n        <button type=\"button\" className=\"reevit-brut__cta\" onClick={initiateSTKPush}>\n          <span>SEND PAYMENT REQUEST</span>\n          <span>&rarr;</span>\n        </button>\n      </div>\n    );\n  }\n\n  // Initiating state - show loading\n  if (state === 'initiating') {\n    return (\n      <LoadingState\n        marker=\"PAYMENT GATEWAY\"\n        title=\"Connecting to M-Pesa\"\n        message=\"Sending a payment request to your phone\"\n      />\n    );\n  }\n\n  // Waiting state - customer should check their phone\n  if (state === 'waiting') {\n    return (\n      <div className=\"reevit-brut__state\">\n        <span className=\"reevit-brut__state-marker\">AWAITING CONFIRMATION</span>\n        <div className=\"reevit-brut__bars\">\n          <span /><span /><span /><span /><span />\n        </div>\n        <h3 className=\"reevit-brut__state-title\">Check your phone</h3>\n        <p className=\"reevit-brut__state-sub\">\n          A payment request was sent to {phoneNumber}\n        </p>\n        <ol className=\"reevit-brut__steps\">\n          <li>Open 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        {checkoutRequestId && (\n          <div className=\"reevit-brut__phone\">REF: {checkoutRequestId}</div>\n        )}\n      </div>\n    );\n  }\n\n  // Failed state - show error and retry\n  if (state === 'failed') {\n    return (\n      <div className=\"reevit-brut__state\">\n        <span className=\"reevit-brut__state-marker\">DECLINED</span>\n        <div className=\"reevit-brut__error-block\">\n          <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\">\n            <path d=\"M18 6L6 18M6 6l12 12\" />\n          </svg>\n        </div>\n        <h3 className=\"reevit-brut__state-title\">Payment request failed</h3>\n        <p className=\"reevit-brut__state-sub\">\n          {error || 'Something went wrong. Please try again.'}\n        </p>\n        <button\n          type=\"button\"\n          className=\"reevit-brut__cta\"\n          style={{ maxWidth: 260 }}\n          onClick={handleRetry}\n        >\n          <span>TRY AGAIN</span>\n          <span>&#8635;</span>\n        </button>\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';\nimport { LoadingState } from '../components/LoadingState';\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        <LoadingState\n          marker=\"PAYMENT GATEWAY\"\n          title=\"Connecting to Stripe\"\n          message=\"Loading the secure payment form\"\n        />\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, useRef, createContext, useContext } from 'react';\nimport type { ReevitCheckoutProps, PaymentMethod, MobileMoneyFormData, PaymentError, CheckoutProviderOption } from '../types';\nimport { useReevit } from '../hooks/useReevit';\nimport { MobileMoneyForm } from './MobileMoneyForm';\nimport { LoadingState } from './LoadingState';\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, cn, resolveAssetSrc } 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\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\n/** PSP brand logos, keyed by provider id. */\nconst PROVIDER_LOGOS: Record<string, string | undefined> = {\n  paystack: resolveAssetSrc(paystackLogo),\n  hubtel: resolveAssetSrc(hubtelLogo),\n  flutterwave: resolveAssetSrc(flutterwaveLogo),\n  monnify: resolveAssetSrc(monnifyLogo),\n  mpesa: resolveAssetSrc(mpesaLogo),\n  stripe: resolveAssetSrc(stripeLogo),\n};\n\n/** Short terminal-style code per payment method, used in the `NN / CODE` id line. */\nconst METHOD_CODE: Record<PaymentMethod, string> = {\n  card: 'CARD',\n  mobile_money: 'MOMO',\n  bank_transfer: 'BANK',\n  apple_pay: 'APAY',\n  google_pay: 'GPAY',\n};\n\nconst METHOD_NAME: Record<PaymentMethod, string> = {\n  card: 'CARD',\n  mobile_money: 'MOBILE MONEY',\n  bank_transfer: 'BANK TRANSFER',\n  apple_pay: 'APPLE PAY',\n  google_pay: 'GOOGLE PAY',\n};\n\nexport function ReevitCheckout({\n  // Config\n  publicKey,\n  sessionSecret,\n  amount,\n  currency,\n  email = '',\n  phone = '',\n  customerName,\n  reference,\n  metadata,\n  customFields,\n  paymentLinkCode,\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  successDelayMs = 5000,\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  const successTimeoutRef = useRef<ReturnType<typeof setTimeout> | 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      sessionSecret,\n      amount,\n      currency,\n      email,\n      phone,\n      customerName,\n      reference,\n      metadata,\n      customFields,\n      paymentLinkCode,\n      paymentMethods,\n      initialPaymentIntent,\n    },\n    apiBaseUrl,\n    onSuccess: (result) => {\n      if (successTimeoutRef.current) {\n        clearTimeout(successTimeoutRef.current);\n        successTimeoutRef.current = null;\n      }\n\n      if (successDelayMs > 0) {\n        successTimeoutRef.current = setTimeout(() => {\n          onSuccess?.(result);\n          setIsOpen(false);\n          successTimeoutRef.current = null;\n        }, successDelayMs);\n        return;\n      }\n\n      onSuccess?.(result);\n      setIsOpen(false);\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 sanitizedMethods = provider.provider.toLowerCase().includes('hubtel')\n          ? methods.filter((method) => method === 'card' || method === 'mobile_money')\n          : methods;\n        const filteredMethods = sanitizedMethods.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 displayAmount = paymentIntent?.amount ?? amount ?? 0;\n  const displayCurrency = paymentIntent?.currency ?? currency ?? 'GHS';\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 we have a selected provider that's still valid, keep it\n    if (selectedProvider && providerOptions.some((provider) => provider.provider === selectedProvider)) {\n      return;\n    }\n\n    // Only auto-select if there's exactly one provider (no choice needed)\n    // IMPORTANT: Just set the state directly - do NOT call handleProviderSelect\n    // which would reset and re-initialize, causing duplicate payments\n    if (providerOptions.length === 1) {\n      setSelectedProvider(providerOptions[0].provider);\n    }\n    // Otherwise, don't auto-select - let user choose\n  }, [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  // NOTE: Auto-advance logic removed to allow users to see and select payment methods\n  // Users must explicitly click a \"Pay\" button to proceed to the PSP bridge\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    if (successTimeoutRef.current) {\n      clearTimeout(successTimeoutRef.current);\n      successTimeoutRef.current = null;\n    }\n    closeCheckout();\n    setIsOpen(false);\n    setShowPSPBridge(false);\n    setMomoData(null);\n    setSelectedProvider(null);\n  }, [closeCheckout, setIsOpen]);\n\n  useEffect(() => {\n    return () => {\n      if (successTimeoutRef.current) {\n        clearTimeout(successTimeoutRef.current);\n        successTimeoutRef.current = null;\n      }\n    };\n  }, []);\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    async (provider: string) => {\n      // Toggle behavior - clicking same PSP collapses it\n      if (provider === selectedProvider) {\n        setSelectedProvider(null);\n        setShowPSPBridge(false);\n        setMomoData(null);\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      setShowPSPBridge(false);\n      setMomoData(null);\n\n      // Select the appropriate method for this provider\n      // No need to re-initialize - we already have the payment intent with available_psps\n      // Re-initializing would create a duplicate payment\n      if (methodForInit) {\n        selectMethod(methodForInit);\n      }\n    },\n    [paymentMethods, providerOptions, selectMethod, 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    } else if (selectedMethod === 'mobile_money') {\n      const psp = (selectedProvider || paymentIntent?.recommendedPsp || 'paystack').toLowerCase();\n      const needsPhone = psp.includes('mpesa');\n\n      if (!needsPhone || (momoData?.phone || phone)) {\n        setShowPSPBridge(true);\n      }\n    } else {\n      // bank_transfer and any other method route through the PSP bridge\n      setShowPSPBridge(true);\n    }\n  }, [selectedMethod, selectedProvider, paymentIntent, momoData, phone]);\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(async () => {\n    await 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 = useMemo(() => {\n    if (!resolvedTheme) return {};\n    const vars: Record<string, string> = {};\n\n    // The brutalist palette is intentionally fixed, but a merchant-supplied\n    // button colour still drives the EXECUTE PAYMENT action surface.\n    if (resolvedTheme.buttonBackgroundColor) {\n      vars['--rb-accent'] = resolvedTheme.buttonBackgroundColor;\n    }\n    if (resolvedTheme.buttonTextColor) {\n      vars['--rb-accent-text'] = resolvedTheme.buttonTextColor;\n    }\n\n    return vars;\n  }, [resolvedTheme]);\n  const brandName = resolvedTheme?.companyName;\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  const isControlled = controlledIsOpen !== undefined;\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(displayAmount, displayCurrency)}\n    </button>\n  ) : null;\n\n  const activeProviderId = activeProvider?.provider;\n  const psp = (selectedProvider || paymentIntent?.recommendedPsp || 'paystack');\n  const pspLower = psp.toLowerCase();\n\n  // Render content based on state\n  const renderContent = () => {\n    // Loading / processing — shared brutalist loading screen\n    if (status === 'loading') {\n      return (\n        <LoadingState\n          marker=\"PREPARING\"\n          title=\"Setting up checkout\"\n          message=\"This will only take a moment\"\n        />\n      );\n    }\n    if (status === 'processing') {\n      return <LoadingState marker=\"PROCESSING\" title=\"Confirming your payment\" />;\n    }\n\n    // Success\n    if (status === 'success' && result) {\n      return (\n        <div className=\"reevit-brut__state\">\n          <span className=\"reevit-brut__state-marker\">SUCCESS</span>\n          <div className=\"reevit-brut__check-block\">\n            <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n              <path d=\"M5 12l5 5L20 7\" />\n            </svg>\n          </div>\n          <h3 className=\"reevit-brut__state-title\">PAYMENT CAPTURED</h3>\n          <p className=\"reevit-brut__state-sub\">\n            {formatAmount(displayAmount, displayCurrency)}<br />\n            REF: {result.reference}\n          </p>\n          <div\n            className=\"reevit-brut__countdown\"\n            style={{ animationDuration: `${successDelayMs}ms` }}\n          />\n        </div>\n      );\n    }\n\n    // Error — non-recoverable\n    if (status === 'failed' && error && !error.recoverable) {\n      return (\n        <div className=\"reevit-brut__state\">\n          <span className=\"reevit-brut__state-marker\">DECLINED</span>\n          <div className=\"reevit-brut__error-block\">\n            <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\">\n              <path d=\"M18 6L6 18M6 6l12 12\" />\n            </svg>\n          </div>\n          <h3 className=\"reevit-brut__state-title\">PAYMENT FAILED</h3>\n          <p className=\"reevit-brut__state-sub\">{error.message}</p>\n          <button className=\"reevit-brut__cta\" style={{ maxWidth: 260 }} onClick={handleBack}>\n            <span>RETRY</span><span>&#8635;</span>\n          </button>\n        </div>\n      );\n    }\n\n    // PSP Bridge — bridges keep their own UI, hosted inside the brutalist shell\n    if (showPSPBridge) {\n      const pspKey = paymentIntent?.pspPublicKey || publicKey || '';\n      const bridgeMetadata = {\n        ...metadata,\n        org_id: paymentIntent?.orgId ?? (metadata?.org_id as string),\n        payment_id: paymentIntent?.id,\n        connection_id: paymentIntent?.connectionId ?? (metadata?.connection_id as string),\n        customer_phone: momoData?.phone || phone,\n      };\n\n      let bridgeEl: JSX.Element;\n      switch (pspLower) {\n        case 'paystack':\n          bridgeEl = (\n            <PaystackBridge\n              publicKey={pspKey}\n              email={email}\n              phone={momoData?.phone || phone}\n              amount={displayAmount}\n              currency={displayCurrency}\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          break;\n        case 'hubtel':\n          bridgeEl = (\n            <HubtelBridge\n              paymentId={paymentIntent?.id || ''}\n              publicKey={publicKey}\n              merchantAccount={paymentIntent?.pspCredentials?.merchantAccount || ''}\n              amount={displayAmount}\n              currency={displayCurrency}\n              reference={paymentIntent?.providerRefId || paymentIntent?.reference || reference}\n              email={email}\n              phone={momoData?.phone || phone}\n              description={`Payment ${paymentIntent?.reference || reference || ''}`}\n              callbackUrl={`${apiBaseUrl || 'https://api.reevit.io'}/v1/webhooks/incoming/hubtel`}\n              hubtelSessionToken={paymentIntent?.id ? paymentIntent.id : undefined}\n              clientSecret={paymentIntent?.clientSecret}\n              apiBaseUrl={apiBaseUrl}\n              preferredMethod={selectedMethod || undefined}\n              onSuccess={handlePSPSuccess}\n              onError={(err: PaymentError) => handlePSPError(err)}\n              onClose={handlePSPClose}\n            />\n          );\n          break;\n        case 'flutterwave':\n          bridgeEl = (\n            <FlutterwaveBridge\n              publicKey={pspKey}\n              amount={displayAmount}\n              currency={displayCurrency}\n              reference={paymentIntent?.reference || reference}\n              email={email}\n              phone={momoData?.phone || phone}\n              metadata={bridgeMetadata}\n              onSuccess={handlePSPSuccess}\n              onError={handlePSPError}\n              onClose={handlePSPClose}\n            />\n          );\n          break;\n        case 'monnify':\n          bridgeEl = (\n            <MonnifyBridge\n              apiKey={pspKey}\n              contractCode={(metadata?.contract_code as string) || pspKey}\n              amount={displayAmount}\n              currency={displayCurrency}\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={(res) => handlePSPSuccess({ ...res, psp: 'monnify' })}\n              onError={handlePSPError}\n              onClose={handlePSPClose}\n            />\n          );\n          break;\n        case 'mpesa':\n          bridgeEl = (\n            <MPesaBridge\n              apiEndpoint={`${apiBaseUrl || 'https://api.reevit.io'}/v1/payments/${paymentIntent?.id}/mpesa`}\n              phoneNumber={momoData?.phone || phone || ''}\n              amount={displayAmount}\n              currency={displayCurrency}\n              reference={paymentIntent?.reference || reference || `mpesa_${Date.now()}`}\n              description={`Payment ${paymentIntent?.reference || reference || ''}`}\n              headers={{ 'x-reevit-public-key': publicKey || '' }}\n              onSuccess={handlePSPSuccess}\n              onError={handlePSPError}\n            />\n          );\n          break;\n        case 'stripe':\n          bridgeEl = (\n            <StripeBridge\n              publishableKey={pspKey}\n              clientSecret={paymentIntent?.clientSecret || ''}\n              amount={displayAmount}\n              currency={displayCurrency}\n              onSuccess={handlePSPSuccess}\n              onError={handlePSPError}\n              onCancel={handlePSPClose}\n            />\n          );\n          break;\n        default:\n          bridgeEl = (\n            <div className=\"reevit-brut__state\">\n              <span className=\"reevit-brut__state-marker\">UNAVAILABLE</span>\n              <div className=\"reevit-brut__error-block\">\n                <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n                  <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n                  <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n                  <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n                </svg>\n              </div>\n              <h3 className=\"reevit-brut__state-title\">PROVIDER NOT SUPPORTED</h3>\n              <p className=\"reevit-brut__state-sub\">{psp} is not supported</p>\n              <button className=\"reevit-brut__cta\" style={{ maxWidth: 260 }} onClick={handleBack}>\n                <span>GO BACK</span><span>&#8635;</span>\n              </button>\n            </div>\n          );\n          break;\n      }\n\n      return <div className=\"reevit-brut__bridge\">{bridgeEl}</div>;\n    }\n\n    // SELECT — processor grid + method grid + action\n    const needsMomoForm = selectedMethod === 'mobile_money' && pspLower.includes('mpesa') && !phone;\n\n    return (\n      <>\n        <div className=\"reevit-brut__body\">\n          <div>\n            <div className=\"reevit-brut__section-label\">PROCESSOR</div>\n            {providerOptions.length === 0 ? (\n              <div className=\"reevit-brut__methods-empty\">&gt; NO PROCESSORS AVAILABLE</div>\n            ) : (\n              <div className=\"reevit-brut__providers\">\n                {providerOptions.map((provider) => {\n                  const logo = PROVIDER_LOGOS[provider.provider.toLowerCase()];\n                  return (\n                    <button\n                      key={provider.provider}\n                      type=\"button\"\n                      className=\"reevit-brut__provider\"\n                      data-selected={activeProviderId === provider.provider}\n                      disabled={isLoading}\n                      onClick={() => {\n                        if (provider.provider !== selectedProvider) {\n                          handleProviderSelect(provider.provider);\n                        }\n                      }}\n                    >\n                      {logo ? (\n                        <img className=\"reevit-brut__provider-logo\" src={logo} alt=\"\" />\n                      ) : (\n                        <span className=\"reevit-brut__provider-fallback\">\n                          {provider.name.charAt(0).toUpperCase()}\n                        </span>\n                      )}\n                      <span className=\"reevit-brut__provider-name\">{provider.name}</span>\n                    </button>\n                  );\n                })}\n              </div>\n            )}\n          </div>\n\n          <div>\n            <div className=\"reevit-brut__section-label\">SELECT_METHOD</div>\n            {!activeProvider || availableMethods.length === 0 ? (\n              <div className=\"reevit-brut__methods-empty\">&gt; SELECT A PROCESSOR ABOVE</div>\n            ) : (\n              <div className=\"reevit-brut__methods\">\n                {availableMethods.map((method, index) => (\n                  <button\n                    key={method}\n                    type=\"button\"\n                    className={cn(\n                      'reevit-brut__method',\n                      availableMethods.length === 1 && 'reevit-brut__method--full'\n                    )}\n                    data-selected={selectedMethod === method}\n                    disabled={isLoading}\n                    onClick={() => handleMethodSelect(method)}\n                  >\n                    <span className=\"reevit-brut__method-id\">\n                      {String(index + 1).padStart(2, '0')} / {METHOD_CODE[method]}\n                    </span>\n                    <span className=\"reevit-brut__method-name\">{METHOD_NAME[method]}</span>\n                  </button>\n                ))}\n              </div>\n            )}\n          </div>\n\n          {selectedMethod && needsMomoForm ? (\n            <MobileMoneyForm\n              onSubmit={handleMomoSubmit}\n              onCancel={handleBack}\n              isLoading={isLoading}\n              initialPhone={phone}\n              hideCancel\n            />\n          ) : (\n            <button\n              type=\"button\"\n              className=\"reevit-brut__cta\"\n              onClick={handleContinue}\n              disabled={!activeProvider || !selectedMethod || isLoading}\n            >\n              <span>MAKE PAYMENT</span>\n              <span>&rarr;</span>\n            </button>\n          )}\n        </div>\n\n        <div className=\"reevit-brut__footer\">\n          <span>Secured by Reevit</span>\n        </div>\n      </>\n    );\n  };\n\n  return (\n    <ReevitContext.Provider value={{ publicKey: publicKey || '', amount: displayAmount, currency: displayCurrency }}>\n      {trigger}\n\n      {isOpen && (\n        <div className=\"reevit-brut-overlay\" onClick={handleClose}>\n          <div\n            className={cn('reevit-brut__modal', isComplete && 'reevit-brut__modal--success')}\n            style={themeStyles}\n            data-reevit-theme={dataTheme}\n            onClick={(e) => e.stopPropagation()}\n            role=\"dialog\"\n            aria-modal=\"true\"\n          >\n            <div className=\"reevit-brut__topbar\">\n              <div className=\"reevit-brut__topbar-left\">\n                <span className=\"reevit-brut__dot\" />\n                <span>Reevit Checkout</span>\n              </div>\n              <button className=\"reevit-brut__close\" onClick={handleClose} aria-label=\"Close\">\n                [ESC]\n              </button>\n            </div>\n\n            <div className=\"reevit-brut__header\">\n              <div className=\"reevit-brut__brand-line\">\n                {resolvedTheme?.logoUrl ? (\n                  <img\n                    src={resolvedTheme.logoUrl}\n                    alt=\"\"\n                    className=\"reevit-brut__brand-logo\"\n                  />\n                ) : brandName ? (\n                  <span className=\"reevit-brut__brand-fallback\">{brandName.charAt(0)}</span>\n                ) : null}\n                <span>MERCHANT: {(brandName || 'CHECKOUT').toUpperCase()}</span>\n              </div>\n              <div className=\"reevit-brut__amount-row\">\n                <div className=\"reevit-brut__amount\">\n                  <span className=\"reevit-brut__amount-bracket\">[</span>\n                  {formatAmount(displayAmount, displayCurrency)}\n                  <span className=\"reevit-brut__amount-bracket\">]</span>\n                </div>\n                <span className=\"reevit-brut__amount-tag\">DUE NOW</span>\n              </div>\n            </div>\n\n            {renderContent()}\n          </div>\n        </div>\n      )}\n    </ReevitContext.Provider>\n  );\n}\n","/**\n * PaymentMethodSelector Component\n * Displays available payment methods for user selection\n */\n\nimport type { PaymentMethod } from \"../types\";\nimport { cn, getMethodLogos } from \"../utils\";\n\ninterface PaymentMethodSelectorProps {\n  methods: PaymentMethod[];\n  selectedMethod: PaymentMethod | null;\n  onSelect: (method: PaymentMethod) => void;\n  disabled?: boolean;\n  provider?: string;\n  layout?: 'grid' | 'list';\n  showLabel?: boolean;\n  /** Country code for dynamic logos (e.g., 'GH', 'NG', 'KE') */\n  country?: string;\n  /** Selected theme colors for method items */\n  selectedTheme?: {\n    backgroundColor?: string;\n    textColor?: string;\n    descriptionColor?: string;\n    borderColor?: string;\n  };\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// Inline SVG icons — consistent across all platforms, themeable via currentColor\nconst MethodIcons: Record<PaymentMethod, () => JSX.Element> = {\n  card: () => (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <rect x=\"1\" y=\"4\" width=\"22\" height=\"16\" rx=\"3\" />\n      <line x1=\"1\" y1=\"10\" x2=\"23\" y2=\"10\" />\n      <line x1=\"5\" y1=\"15\" x2=\"9\" y2=\"15\" />\n    </svg>\n  ),\n  mobile_money: () => (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"3\" />\n      <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n    </svg>\n  ),\n  bank_transfer: () => (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M3 21h18\" />\n      <path d=\"M3 10h18\" />\n      <path d=\"M12 3l9 7H3l9-7z\" />\n      <path d=\"M6 10v8\" />\n      <path d=\"M10 10v8\" />\n      <path d=\"M14 10v8\" />\n      <path d=\"M18 10v8\" />\n    </svg>\n  ),\n  apple_pay: () => (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n      <path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.53 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n    </svg>\n  ),\n  google_pay: () => (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n      <path d=\"M12.24 10.285V14.4h6.806c-.275 1.765-2.056 5.174-6.806 5.174-4.095 0-7.439-3.389-7.439-7.574s3.345-7.574 7.439-7.574c2.33 0 3.891.989 4.785 1.849l3.254-3.138C18.189 1.186 15.479 0 12.24 0c-6.635 0-12 5.365-12 12s5.365 12 12 12c6.926 0 11.52-4.869 11.52-11.726 0-.788-.085-1.39-.189-1.989H12.24z\" fill=\"currentColor\" />\n    </svg>\n  ),\n};\n\n// Payment method configuration\nconst methodConfig: Record<\n  PaymentMethod,\n  { label: string; description: string }\n> = {\n  card: {\n    label: \"Card\",\n    description: \"Pay with Visa, Mastercard, or other cards\",\n  },\n  mobile_money: {\n    label: \"Mobile Money\",\n    description: \"MTN, Telecel, AirtelTigo Money\",\n  },\n  bank_transfer: {\n    label: \"Bank Transfer\",\n    description: \"Pay directly from your bank account\",\n  },\n  apple_pay: {\n    label: \"Apple Pay\",\n    description: \"Pay with Apple Pay\",\n  },\n  google_pay: {\n    label: \"Google Pay\",\n    description: \"Pay with Google Pay\",\n  },\n};\n\nexport function PaymentMethodSelector({\n  methods,\n  selectedMethod,\n  onSelect,\n  disabled = false,\n  provider,\n  layout = 'list',\n  showLabel = true,\n  country = 'GH',\n  selectedTheme,\n}: PaymentMethodSelectorProps) {\n  const getMethodLabel = (method: PaymentMethod, psp?: string): string => {\n    const config = methodConfig[method];\n    return config.label;\n  };\n\n  const getMethodDescription = (method: PaymentMethod, psp?: string, countryCode?: string): string => {\n    const c = (countryCode || country).toUpperCase();\n\n    if (method === 'mobile_money') {\n      const mobileMoneyDescriptions: Record<string, string> = {\n        GH: 'MTN, Telecel, AirtelTigo Money',\n        KE: 'M-Pesa, Airtel Money',\n        NG: 'MTN MoMo, Airtel Money',\n        ZA: 'Mobile Money',\n      };\n      return mobileMoneyDescriptions[c] || 'Mobile Money';\n    }\n\n    if (method === 'card') {\n      return 'Pay with Visa, Mastercard, or other cards';\n    }\n\n    if (method === 'bank_transfer') {\n      return 'Pay directly from your bank account';\n    }\n\n    return '';\n  };\n\n  const isGrid = layout === 'grid';\n\n  return (\n    <div className={cn(\"reevit-method-selector\", isGrid && \"reevit-method-selector--grid\")}>\n      {showLabel && <div className=\"reevit-method-selector__label\">Select payment method</div>}\n      <div\n        className={cn(\n          \"reevit-method-selector__options\",\n          isGrid ? \"reevit-method-selector__options--grid\" : \"reevit-method-selector__options--list\"\n        )}\n        style={selectedTheme?.backgroundColor ? { backgroundColor: selectedTheme.backgroundColor } : undefined}\n      >\n        {methods.map((method, index) => {\n          const config = methodConfig[method];\n          const isSelected = selectedMethod === method;\n          const methodLabel = getMethodLabel(method, provider);\n          const methodDescription = getMethodDescription(method, provider);\n          const logos = getMethodLogos(country, method);\n\n          return (\n            <button\n              key={method}\n              type=\"button\"\n              className={cn(\n                \"reevit-method-option\",\n                isGrid ? \"reevit-method-option--grid\" : \"reevit-method-option--list\",\n                isSelected && \"reevit-method-option--selected\",\n                disabled && \"reevit-method-option--disabled\",\n              )}\n              style={{\n                animationDelay: `${index * 0.05}s`,\n                borderBottomColor: selectedTheme?.borderColor,\n              }}\n              onClick={() => onSelect(method)}\n              disabled={disabled}\n              aria-pressed={isSelected}\n            >\n              <span className=\"reevit-method-option__icon-wrapper\">\n                {logos.length > 0 ? (\n                  <span className=\"reevit-method-option__logos\">\n                    {logos.slice(0, 3).map((logo, i) => (\n                      <img\n                        key={i}\n                        src={logo}\n                        alt=\"\"\n                        className=\"reevit-method-option__logo-img\"\n                      />\n                    ))}\n                  </span>\n                ) : (\n                  <span className=\"reevit-method-option__icon\">\n                    {MethodIcons[method]()}\n                  </span>\n                )}\n              </span>\n              <div className=\"reevit-method-option__content\">\n                <span className=\"reevit-method-option__label\" style={selectedTheme?.textColor ? { color: selectedTheme.textColor } : undefined}>\n                  {methodLabel}\n                </span>\n                {!isGrid && (\n                  <span className=\"reevit-method-option__description\" style={selectedTheme?.descriptionColor ? { color: selectedTheme.descriptionColor } : undefined}>\n                    {methodDescription}\n                  </span>\n                )}\n              </div>\n              {!isGrid && isSelected && (\n                <span className=\"reevit-method-option__check\">\n                  <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n                    <polyline points=\"20 6 9 17 4 12\"></polyline>\n                  </svg>\n                </span>\n              )}\n              {!isGrid && !isSelected && (\n                <span className=\"reevit-method-option__chevron\">\n                  <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n                    <polyline points=\"9 18 15 12 9 6\"></polyline>\n                  </svg>\n                </span>\n              )}\n            </button>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n"]}