{"version":3,"sources":["../src/native/components/CheckoutButton.tsx","../src/native/providers/PaymentsProvider.tsx","../src/native/hooks/usePayments.ts","../src/shared/types/errors.ts","../src/shared/constants.ts","../src/shared/utils/validation.ts","../src/native/components/PricingTable.tsx","../src/shared/utils/formatting.ts","../src/native/components/PaymentForm.tsx","../src/native/components/MobilePaymentSheet.tsx","../src/native/components/NativeSubscriptionView.tsx","../src/native/components/TouchIDPayment.tsx","../src/native/providers/StripeProvider.tsx","../src/native/hooks/useSubscription.ts","../src/native/hooks/useCheckout.ts","../src/native/hooks/useCustomer.ts","../src/native/utils/stripe-native.ts"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n  TouchableOpacity,\n  Text,\n  ActivityIndicator,\n  StyleSheet,\n  ViewStyle,\n  TextStyle,\n  Alert,\n} from 'react-native';\nimport { useStripe } from '@stripe/stripe-react-native';\nimport { usePaymentsContext } from '../providers/PaymentsProvider';\nimport { ERROR_MESSAGES } from '../../shared/constants';\nimport { validateStripeId } from '../../shared/utils/validation';\n\ninterface CheckoutButtonProps {\n  priceId: string;\n  customerId?: string;\n  customerEmail?: string;\n  children: React.ReactNode;\n  style?: ViewStyle | ViewStyle[];\n  textStyle?: TextStyle | TextStyle[];\n  disabled?: boolean;\n  metadata?: Record<string, string>;\n  trialPeriodDays?: number;\n  onSuccess?: () => void;\n  onError?: (error: string) => void;\n  onLoading?: (loading: boolean) => void;\n}\n\nexport const CheckoutButton: React.FC<CheckoutButtonProps> = ({\n  priceId,\n  customerId,\n  customerEmail,\n  children,\n  style,\n  textStyle,\n  disabled = false,\n  metadata,\n  trialPeriodDays,\n  onSuccess,\n  onError,\n  onLoading,\n}) => {\n  const { initPaymentSheet, presentPaymentSheet } = useStripe();\n  const { initialized } = usePaymentsContext();\n  const [loading, setLoading] = useState(false);\n\n  const handleError = (errorMessage: string) => {\n    onError?.(errorMessage);\n    Alert.alert('Payment Error', errorMessage);\n    console.error('Checkout error:', errorMessage);\n  };\n\n  const handleCheckout = async () => {\n    if (!initialized) {\n      handleError(ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED);\n      return;\n    }\n\n    if (!validateStripeId(priceId, 'price')) {\n      handleError(ERROR_MESSAGES.INVALID_PRICE_ID);\n      return;\n    }\n\n    if (customerId && !validateStripeId(customerId, 'customer')) {\n      handleError(ERROR_MESSAGES.INVALID_CUSTOMER_ID);\n      return;\n    }\n\n    setLoading(true);\n    onLoading?.(true);\n\n    try {\n      // Create subscription and setup intent on your server\n      const response = await fetch('/api/payments/create-subscription-setup', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          priceId,\n          customerId,\n          customerEmail,\n          metadata,\n          trialPeriodDays,\n        }),\n      });\n\n      if (!response.ok) {\n        const errorData = await response\n          .json()\n          .catch(() => ({ error: 'Network error' }));\n        throw new Error(errorData.error || ERROR_MESSAGES.CHECKOUT_FAILED);\n      }\n\n      const {\n        setupIntentClientSecret,\n        customerId: returnedCustomerId,\n        customerEphemeralKeySecret,\n      } = await response.json();\n\n      if (!setupIntentClientSecret) {\n        throw new Error('No setup intent client secret returned from server');\n      }\n\n      // Initialize the payment sheet\n      const { error: initError } = await initPaymentSheet({\n        setupIntentClientSecret,\n        customerId: returnedCustomerId,\n        customerEphemeralKeySecret,\n        merchantDisplayName: 'Your App Name', // TODO: Make this configurable\n        allowsDelayedPaymentMethods: true,\n      });\n\n      if (initError) {\n        throw new Error(\n          initError.message || 'Failed to initialize payment sheet'\n        );\n      }\n\n      // Present the payment sheet\n      const { error: presentError } = await presentPaymentSheet();\n\n      if (presentError) {\n        // User cancelled or error occurred\n        if (presentError.code !== 'Canceled') {\n          throw new Error(\n            presentError.message || ERROR_MESSAGES.PAYMENT_FAILED\n          );\n        }\n        return; // User cancelled, don't show error\n      }\n\n      // Payment successful\n      onSuccess?.();\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : ERROR_MESSAGES.CHECKOUT_FAILED;\n      handleError(errorMessage);\n    } finally {\n      setLoading(false);\n      onLoading?.(false);\n    }\n  };\n\n  const isDisabled = loading || disabled || !initialized;\n\n  return (\n    <TouchableOpacity\n      style={[styles.button, style, isDisabled && styles.disabled]}\n      onPress={handleCheckout}\n      disabled={isDisabled}\n      activeOpacity={0.8}\n    >\n      {loading ? (\n        <ActivityIndicator color=\"#ffffff\" size=\"small\" style={styles.loader} />\n      ) : null}\n      <Text\n        style={[styles.buttonText, textStyle, loading && styles.loadingText]}\n      >\n        {loading ? 'Processing...' : children}\n      </Text>\n    </TouchableOpacity>\n  );\n};\n\nconst styles = StyleSheet.create({\n  button: {\n    backgroundColor: '#007AFF',\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    borderRadius: 8,\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    minHeight: 48,\n  },\n  buttonText: {\n    color: '#ffffff',\n    fontSize: 16,\n    fontWeight: '600',\n    textAlign: 'center',\n  },\n  disabled: {\n    opacity: 0.5,\n  },\n  loader: {\n    marginRight: 8,\n  },\n  loadingText: {\n    marginLeft: 8,\n  },\n});\n\nexport default CheckoutButton;\n","import React, { useEffect, createContext, useContext, useRef } from 'react';\nimport { usePayments } from '../hooks/usePayments';\nimport { PaymentsConfig } from '../../shared/types/config';\nimport { PaymentEvent } from '../../shared/types/events';\nimport { PaymentError } from '../../shared/types/errors';\n\nimport { Customer, CustomerCreateParams } from '../../shared/types/customer';\nimport {\n  Subscription,\n  SubscriptionUpdateParams,\n  SubscriptionStatus,\n} from '../../shared/types/subscription';\nimport { CheckoutParams, CheckoutSession } from '../../shared/types/checkout';\n\n/**\n * Native-specific PaymentsProvider\n * This provider is designed for React Native applications and uses the native-specific usePayments hook\n * which makes server-side API calls instead of directly using the Node.js Stripe SDK\n */\n\ninterface PaymentsContextType {\n  config: PaymentsConfig | null;\n  initialized: boolean;\n  loading: boolean;\n  error: PaymentError | null;\n  customer: Customer | null;\n  subscriptions: Subscription[];\n  activeSubscription: Subscription | null;\n  createCustomer: (params: CustomerCreateParams) => Promise<Customer>;\n  createCheckoutSession: (params: CheckoutParams) => Promise<CheckoutSession>;\n  cancelSubscription: (subscriptionId: string) => Promise<void>;\n  reactivateSubscription: (subscriptionId: string) => Promise<void>;\n  updateSubscription: (\n    subscriptionId: string,\n    params: SubscriptionUpdateParams\n  ) => Promise<Subscription>;\n  refreshCustomer: (customerId: string) => Promise<void>;\n  refreshSubscriptions: (\n    customerId: string,\n    status?: SubscriptionStatus\n  ) => Promise<void>;\n  reset: () => void;\n}\n\nconst PaymentsContext = createContext<PaymentsContextType | undefined>(\n  undefined\n);\n\ninterface PaymentsProviderProps {\n  children: React.ReactNode;\n  config?: PaymentsConfig;\n  onPaymentSuccess?: (event: PaymentEvent) => void;\n  onPaymentError?: (error: PaymentError) => void;\n}\n\nexport const PaymentsProvider: React.FC<PaymentsProviderProps> = ({\n  children,\n  config,\n  onPaymentSuccess,\n  onPaymentError,\n}) => {\n  const store = usePayments();\n  const {\n    initialize,\n    initialized,\n    loading,\n    error,\n    customer,\n    subscriptions,\n    activeSubscription,\n  } = store;\n\n  const onPaymentSuccessRef = useRef(onPaymentSuccess);\n  const onPaymentErrorRef = useRef(onPaymentError);\n\n  useEffect(() => {\n    onPaymentSuccessRef.current = onPaymentSuccess;\n  }, [onPaymentSuccess]);\n\n  useEffect(() => {\n    onPaymentErrorRef.current = onPaymentError;\n  }, [onPaymentError]);\n\n  useEffect(() => {\n    if (!initialized && !loading && !error && config) {\n      initialize(config).catch(err => {\n        console.error('PaymentsProvider initialization failed:', err);\n        if (onPaymentErrorRef.current) {\n          onPaymentErrorRef.current(err);\n        }\n      });\n    }\n  }, [initialized, loading, error, config, initialize]);\n\n  const contextValue: PaymentsContextType = {\n    config: store.config,\n    initialized,\n    loading,\n    error,\n    customer,\n    subscriptions,\n    activeSubscription,\n    createCustomer: store.createCustomer,\n    createCheckoutSession: store.createCheckoutSession,\n    cancelSubscription: store.cancelSubscription,\n    reactivateSubscription: store.reactivateSubscription,\n    updateSubscription: store.updateSubscription,\n    refreshCustomer: store.refreshCustomer,\n    refreshSubscriptions: store.refreshSubscriptions,\n    reset: store.reset,\n  };\n\n  return (\n    <PaymentsContext.Provider value={contextValue}>\n      {children}\n    </PaymentsContext.Provider>\n  );\n};\n\nexport const usePaymentsContext = () => {\n  const context = useContext(PaymentsContext);\n  if (context === undefined) {\n    throw new Error(\n      'usePaymentsContext must be used within a PaymentsProvider'\n    );\n  }\n  return context;\n};\n","import { useState, useCallback } from 'react';\nimport {\n  Customer,\n  CustomerCreateParams,\n  Subscription,\n  SubscriptionUpdateParams,\n  SubscriptionStatus,\n  CheckoutParams,\n  CheckoutSession,\n} from '../../shared/types';\nimport { PaymentsConfig } from '../../shared/types/config';\nimport { PaymentsError, PaymentErrorType } from '../../shared/types/errors';\nimport { ERROR_MESSAGES } from '../../shared/constants';\n\n/**\n * Native-specific usePayments hook\n * This hook is designed for React Native applications and makes server-side API calls\n * instead of directly using the Node.js Stripe SDK\n */\n\ninterface UsePaymentsStore {\n  config: PaymentsConfig | null;\n  initialized: boolean;\n  loading: boolean;\n  error: PaymentsError | null;\n  // Backward compatibility getters\n  isLoading: boolean; // Maps to loading\n  isError: boolean; // Maps to !!error\n  customer: Customer | null;\n  subscriptions: Subscription[];\n  activeSubscription: Subscription | null;\n  initialize: (config?: PaymentsConfig) => Promise<void>;\n  createCustomer: (params: CustomerCreateParams) => Promise<Customer>;\n  retrieveCustomer: (customerId: string) => Promise<Customer | null>;\n  createCheckoutSession: (params: CheckoutParams) => Promise<CheckoutSession>;\n  retrieveCheckoutSession: (sessionId: string) => Promise<CheckoutSession>;\n  createSubscription: (params: {\n    priceId: string;\n    quantity?: number;\n  }) => Promise<Subscription>;\n  cancelSubscription: (subscriptionId: string) => Promise<void>;\n  reactivateSubscription: (subscriptionId: string) => Promise<void>;\n  listSubscriptions: (\n    customerId: string,\n    status?: SubscriptionStatus\n  ) => Promise<Subscription[]>;\n  retrieveSubscription: (\n    subscriptionId: string\n  ) => Promise<Subscription | null>;\n  updateSubscription: (\n    subscriptionId: string,\n    params: SubscriptionUpdateParams\n  ) => Promise<Subscription>;\n  refreshCustomer: (customerId: string) => Promise<void>;\n  refreshSubscriptions: (\n    customerId: string,\n    status?: SubscriptionStatus\n  ) => Promise<void>;\n  reset: () => void;\n}\n\nexport const usePayments = (): UsePaymentsStore => {\n  const [config, setConfig] = useState<PaymentsConfig | null>(null);\n  const [initialized, setInitialized] = useState(false);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<PaymentsError | null>(null);\n  const [customer, setCustomer] = useState<Customer | null>(null);\n  const [subscriptions, setSubscriptions] = useState<Subscription[]>([]);\n\n  const handleError = useCallback((err: PaymentsError | Error) => {\n    const paymentError =\n      err instanceof PaymentsError\n        ? err\n        : new PaymentsError(PaymentErrorType.UNKNOWN_ERROR, err.message);\n    setError(paymentError);\n    console.error('Payments error:', paymentError);\n  }, []);\n\n  const initialize = useCallback(\n    async (initialConfig?: PaymentsConfig) => {\n      setLoading(true);\n      setError(null);\n      try {\n        if (!initialConfig) {\n          throw new PaymentsError(\n            PaymentErrorType.CONFIGURATION_ERROR,\n            'Configuration is required for native initialization'\n          );\n        }\n\n        // For React Native, we just store the config\n        // No server-side Stripe SDK initialization needed\n        setConfig(initialConfig);\n        setInitialized(true);\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n      } finally {\n        setLoading(false);\n      }\n    },\n    [handleError]\n  );\n\n  const refreshSubscriptions = useCallback(\n    async (customerId: string, status?: SubscriptionStatus) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/subscriptions?customerId=${customerId}${status ? `&status=${status}` : ''}`,\n          {\n            method: 'GET',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to fetch subscriptions'\n          );\n        }\n\n        const fetchedSubscriptions = await response.json();\n        setSubscriptions(fetchedSubscriptions);\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const retrieveCustomer = useCallback(\n    async (customerId: string) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(`/api/payments/customers/${customerId}`, {\n          method: 'GET',\n          headers: { 'Content-Type': 'application/json' },\n        });\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to retrieve customer'\n          );\n        }\n\n        const newCustomer = await response.json();\n        setCustomer(newCustomer);\n        return newCustomer;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const createCustomer = useCallback(\n    async (params: CustomerCreateParams) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch('/api/payments/customers', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(params),\n        });\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to create customer'\n          );\n        }\n\n        const newCustomer = await response.json();\n        setCustomer(newCustomer);\n        return newCustomer;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const createSubscription = useCallback(\n    async (params: { priceId: string; quantity?: number }) => {\n      if (!initialized || !customer) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch('/api/payments/subscriptions', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            customerId: customer.id,\n            items: [{ priceId: params.priceId, quantity: params.quantity }],\n          }),\n        });\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to create subscription'\n          );\n        }\n\n        const newSubscription = await response.json();\n        await refreshSubscriptions(customer.id);\n        return newSubscription;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, customer, handleError, refreshSubscriptions]\n  );\n\n  const listSubscriptions = useCallback(\n    async (customerId: string, status?: SubscriptionStatus) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/subscriptions?customerId=${customerId}${status ? `&status=${status}` : ''}`,\n          {\n            method: 'GET',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to list subscriptions'\n          );\n        }\n\n        const subs = await response.json();\n        setSubscriptions(subs);\n        return subs;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const retrieveSubscription = useCallback(\n    async (subscriptionId: string) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/subscriptions/${subscriptionId}`,\n          {\n            method: 'GET',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to retrieve subscription'\n          );\n        }\n\n        const sub = await response.json();\n        if (customer?.id) {\n          await refreshSubscriptions(customer.id);\n        }\n        return sub;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, customer, handleError, refreshSubscriptions]\n  );\n\n  const createCheckoutSession = useCallback(\n    async (params: CheckoutParams) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch('/api/payments/checkout-sessions', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(params),\n        });\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to create checkout session'\n          );\n        }\n\n        const session = await response.json();\n        return session;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const retrieveCheckoutSession = useCallback(\n    async (sessionId: string) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/checkout-sessions/${sessionId}`,\n          {\n            method: 'GET',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to retrieve checkout session'\n          );\n        }\n\n        const session = await response.json();\n        return session;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const cancelSubscription = useCallback(\n    async (subscriptionId: string) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/subscriptions/${subscriptionId}/cancel`,\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to cancel subscription'\n          );\n        }\n\n        if (customer?.id) {\n          await refreshSubscriptions(customer.id);\n        }\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, customer, handleError, refreshSubscriptions]\n  );\n\n  const reactivateSubscription = useCallback(\n    async (subscriptionId: string) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/subscriptions/${subscriptionId}/reactivate`,\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to reactivate subscription'\n          );\n        }\n\n        if (customer?.id) {\n          await refreshSubscriptions(customer.id);\n        }\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, customer, handleError, refreshSubscriptions]\n  );\n\n  const updateSubscription = useCallback(\n    async (subscriptionId: string, params: SubscriptionUpdateParams) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(\n          `/api/payments/subscriptions/${subscriptionId}`,\n          {\n            method: 'PATCH',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(params),\n          }\n        );\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to update subscription'\n          );\n        }\n\n        const updatedSubscription = await response.json();\n        if (customer?.id) {\n          await refreshSubscriptions(customer.id);\n        }\n        return updatedSubscription;\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, customer, handleError, refreshSubscriptions]\n  );\n\n  const refreshCustomer = useCallback(\n    async (customerId: string) => {\n      if (!initialized) {\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED\n        );\n      }\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await fetch(`/api/payments/customers/${customerId}`, {\n          method: 'GET',\n          headers: { 'Content-Type': 'application/json' },\n        });\n\n        if (!response.ok) {\n          throw new PaymentsError(\n            PaymentErrorType.NETWORK_ERROR,\n            'Failed to refresh customer'\n          );\n        }\n\n        const fetchedCustomer = await response.json();\n        setCustomer(fetchedCustomer);\n      } catch (err: unknown) {\n        handleError(err as PaymentsError);\n        throw err;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [initialized, handleError]\n  );\n\n  const reset = useCallback(() => {\n    setConfig(null);\n    setInitialized(false);\n    setLoading(false);\n    setError(null);\n    setCustomer(null);\n    setSubscriptions([]);\n  }, []);\n\n  const activeSubscription =\n    subscriptions.find(s => s.status === 'active' || s.status === 'trialing') ||\n    null;\n\n  return {\n    config,\n    initialized,\n    loading,\n    error,\n    // Backward compatibility getters\n    isLoading: loading,\n    isError: !!error,\n    customer,\n    subscriptions,\n    activeSubscription,\n    initialize,\n    createCustomer,\n    retrieveCustomer,\n    createCheckoutSession,\n    retrieveCheckoutSession,\n    createSubscription,\n    cancelSubscription,\n    reactivateSubscription,\n    listSubscriptions,\n    retrieveSubscription,\n    updateSubscription,\n    refreshCustomer,\n    refreshSubscriptions,\n    reset,\n  };\n};\n","export enum PaymentErrorType {\n  CARD_DECLINED = 'CARD_DECLINED',\n  INSUFFICIENT_FUNDS = 'INSUFFICIENT_FUNDS',\n  CUSTOMER_NOT_FOUND = 'CUSTOMER_NOT_FOUND',\n  SUBSCRIPTION_NOT_FOUND = 'SUBSCRIPTION_NOT_FOUND',\n  NETWORK_ERROR = 'NETWORK_ERROR',\n  CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\n  WEBHOOK_ERROR = 'WEBHOOK_ERROR',\n  VALIDATION_ERROR = 'VALIDATION_ERROR',\n  PROVIDER_NOT_CONFIGURED = 'PROVIDER_NOT_CONFIGURED',\n  UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n  INITIALIZATION_ERROR = 'INITIALIZATION_ERROR',\n  AUTHENTICATION_ERROR = 'AUTHENTICATION_ERROR',\n  NOT_FOUND = 'NOT_FOUND',\n  INVALID_REQUEST = 'INVALID_REQUEST',\n  API_ERROR = 'API_ERROR',\n  PERMISSION_DENIED = 'PERMISSION_DENIED',\n  WEBHOOK_VERIFICATION_FAILED = 'WEBHOOK_VERIFICATION_FAILED',\n}\n\nexport interface PaymentError extends Error {\n  type: PaymentErrorType;\n  code?: string;\n  details?: Record<string, unknown>;\n}\n\nexport class PaymentsError extends Error implements PaymentError {\n  public type: PaymentErrorType;\n  public code?: string;\n  public details?: Record<string, unknown>;\n\n  constructor(\n    type: PaymentErrorType,\n    message: string,\n    code?: string,\n    details?: Record<string, unknown>\n  ) {\n    super(message);\n    this.name = 'PaymentsError';\n    this.type = type;\n    this.code = code;\n    this.details = details;\n    Object.setPrototypeOf(this, PaymentsError.prototype);\n  }\n}\n","export const STRIPE_API_VERSION = '2023-10-16';\n\nexport const PAYMENT_METHODS = {\n  CARD: 'card',\n  BANK_ACCOUNT: 'bank_account',\n  SEPA_DEBIT: 'sepa_debit',\n  IDEAL: 'ideal',\n  SOFORT: 'sofort',\n} as const;\n\nexport const SUBSCRIPTION_STATUS = {\n  ACTIVE: 'active',\n  CANCELED: 'canceled',\n  PAST_DUE: 'past_due',\n  UNPAID: 'unpaid',\n  INCOMPLETE: 'incomplete',\n  INCOMPLETE_EXPIRED: 'incomplete_expired',\n  TRIALING: 'trialing',\n} as const;\n\nexport const INVOICE_STATUS = {\n  DRAFT: 'draft',\n  OPEN: 'open',\n  PAID: 'paid',\n  UNCOLLECTIBLE: 'uncollectible',\n  VOID: 'void',\n} as const;\n\nexport const CHECKOUT_MODE = {\n  PAYMENT: 'payment',\n  SUBSCRIPTION: 'subscription',\n  SETUP: 'setup',\n} as const;\n\nexport const BILLING_INTERVALS = {\n  DAY: 'day',\n  WEEK: 'week',\n  MONTH: 'month',\n  YEAR: 'year',\n} as const;\n\nexport const CURRENCY_SYMBOLS = {\n  USD: '$',\n  EUR: '€',\n  GBP: '£',\n  JPY: '¥',\n  CAD: 'C$',\n  AUD: 'A$',\n  CHF: 'CHF',\n  CNY: '¥',\n  SEK: 'kr',\n  NZD: 'NZ$',\n} as const;\n\nexport const DEFAULT_CURRENCY = 'USD';\n\nexport const WEBHOOK_EVENTS = {\n  CUSTOMER_SUBSCRIPTION_CREATED: 'customer.subscription.created',\n  CUSTOMER_SUBSCRIPTION_UPDATED: 'customer.subscription.updated',\n  CUSTOMER_SUBSCRIPTION_DELETED: 'customer.subscription.deleted',\n  INVOICE_PAYMENT_SUCCEEDED: 'invoice.payment_succeeded',\n  INVOICE_PAYMENT_FAILED: 'invoice.payment_failed',\n  CHECKOUT_SESSION_COMPLETED: 'checkout.session.completed',\n  PAYMENT_INTENT_SUCCEEDED: 'payment_intent.succeeded',\n  PAYMENT_INTENT_PAYMENT_FAILED: 'payment_intent.payment_failed',\n} as const;\n\nexport const ERROR_MESSAGES = {\n  PROVIDER_NOT_CONFIGURED: 'Payments provider is not properly configured',\n  STRIPE_NOT_LOADED: 'Stripe has not been loaded yet',\n  INVALID_PRICE_ID: 'Invalid price ID provided',\n  INVALID_CUSTOMER_ID: 'Invalid customer ID provided',\n  CHECKOUT_FAILED: 'Checkout session creation failed',\n  PAYMENT_FAILED: 'Payment processing failed',\n  SUBSCRIPTION_NOT_FOUND: 'Subscription not found',\n  CUSTOMER_NOT_FOUND: 'Customer not found',\n} as const;\n","import { PaymentsConfig, PricingPlan } from '../types';\n\nexport const validateEmail = (email: string): boolean => {\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(email);\n};\n\nexport const validatePhoneNumber = (phone: string): boolean => {\n  // Basic phone number validation - can be enhanced based on requirements\n  const phoneRegex = /^\\+?[\\d\\s-()]{10,}$/;\n  return phoneRegex.test(phone);\n};\n\nexport const validatePaymentsConfig = (\n  config: PaymentsConfig\n): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  if (!config.publishableKey) {\n    errors.push('publishableKey is required');\n  }\n\n  if (!config.provider) {\n    errors.push('provider is required');\n  }\n\n  if (config.provider !== 'stripe') {\n    errors.push('Only stripe provider is currently supported');\n  }\n\n  if (!config.environment) {\n    errors.push('environment is required');\n  }\n\n  if (\n    config.environment &&\n    !['development', 'production'].includes(config.environment)\n  ) {\n    errors.push('environment must be either \"development\" or \"production\"');\n  }\n\n  if (config.publishableKey && !config.publishableKey.startsWith('pk_')) {\n    errors.push('publishableKey must start with \"pk_\"');\n  }\n\n  if (config.secretKey && !config.secretKey.startsWith('sk_')) {\n    errors.push('secretKey must start with \"sk_\"');\n  }\n\n  if (config.webhookSecret && !config.webhookSecret.startsWith('whsec_')) {\n    errors.push('webhookSecret must start with \"whsec_\"');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\nexport const validatePricingPlan = (\n  plan: PricingPlan\n): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  if (!plan.id) {\n    errors.push('id is required');\n  }\n\n  if (!plan.name) {\n    errors.push('name is required');\n  }\n\n  if (typeof plan.price !== 'number' || plan.price < 0) {\n    errors.push('price must be a non-negative number');\n  }\n\n  if (!plan.currency) {\n    errors.push('currency is required');\n  }\n\n  if (!plan.interval) {\n    errors.push('interval is required');\n  }\n\n  if (!['day', 'week', 'month', 'year'].includes(plan.interval)) {\n    errors.push('interval must be one of: day, week, month, year');\n  }\n\n  if (!plan.stripePriceId) {\n    errors.push('stripePriceId is required');\n  }\n\n  if (plan.stripePriceId && !plan.stripePriceId.startsWith('price_')) {\n    errors.push('stripePriceId must start with \"price_\"');\n  }\n\n  if (!Array.isArray(plan.features)) {\n    errors.push('features must be an array');\n  }\n\n  if (\n    plan.intervalCount &&\n    (typeof plan.intervalCount !== 'number' || plan.intervalCount < 1)\n  ) {\n    errors.push('intervalCount must be a positive number');\n  }\n\n  if (\n    plan.trialPeriodDays &&\n    (typeof plan.trialPeriodDays !== 'number' || plan.trialPeriodDays < 0)\n  ) {\n    errors.push('trialPeriodDays must be a non-negative number');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\nexport const validateStripeId = (\n  id: string,\n  type: 'customer' | 'subscription' | 'price' | 'product' | 'payment_intent'\n): boolean => {\n  const prefixes = {\n    customer: 'cus_',\n    subscription: 'sub_',\n    price: 'price_',\n    product: 'prod_',\n    payment_intent: 'pi_',\n  };\n\n  return id.startsWith(prefixes[type]);\n};\n\nexport const validateAmount = (\n  amount: number,\n  currency: string\n): { isValid: boolean; error?: string } => {\n  if (typeof amount !== 'number') {\n    return { isValid: false, error: 'Amount must be a number' };\n  }\n\n  if (amount < 0) {\n    return { isValid: false, error: 'Amount must be non-negative' };\n  }\n\n  // Stripe minimum amounts by currency\n  const minimumAmounts: Record<string, number> = {\n    USD: 50, // $0.50\n    EUR: 50, // €0.50\n    GBP: 30, // £0.30\n    JPY: 50, // ¥50\n    CAD: 50, // C$0.50\n    AUD: 50, // A$0.50\n  };\n\n  const minAmount = minimumAmounts[currency.toUpperCase()] || 50;\n\n  if (amount < minAmount) {\n    return {\n      isValid: false,\n      error: `Amount must be at least ${minAmount} ${currency.toLowerCase()} cents`,\n    };\n  }\n\n  return { isValid: true };\n};\n\nexport const validateCard = (cardDetails: {\n  number: string;\n  expMonth: number;\n  expYear: number;\n  cvc: string;\n}): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  // Validate card number (basic Luhn algorithm)\n  const cleanNumber = cardDetails.number.replace(/\\s/g, '');\n  if (!cleanNumber || cleanNumber.length < 13 || cleanNumber.length > 19) {\n    errors.push('Card number must be between 13 and 19 digits');\n  } else if (!luhnCheck(cleanNumber)) {\n    errors.push('Invalid card number');\n  }\n\n  // Validate expiration month\n  if (\n    !cardDetails.expMonth ||\n    cardDetails.expMonth < 1 ||\n    cardDetails.expMonth > 12\n  ) {\n    errors.push('Expiration month must be between 1 and 12');\n  }\n\n  // Validate expiration year\n  const currentYear = new Date().getFullYear();\n  if (\n    !cardDetails.expYear ||\n    cardDetails.expYear < currentYear ||\n    cardDetails.expYear > currentYear + 20\n  ) {\n    errors.push('Invalid expiration year');\n  }\n\n  // Check if card is expired\n  if (cardDetails.expMonth && cardDetails.expYear) {\n    const expirationDate = new Date(\n      cardDetails.expYear,\n      cardDetails.expMonth - 1,\n      1\n    );\n    const currentDate = new Date();\n    if (expirationDate < currentDate) {\n      errors.push('Card has expired');\n    }\n  }\n\n  // Validate CVC\n  if (\n    !cardDetails.cvc ||\n    cardDetails.cvc.length < 3 ||\n    cardDetails.cvc.length > 4\n  ) {\n    errors.push('CVC must be 3 or 4 digits');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\n// Luhn algorithm for credit card validation\nconst luhnCheck = (cardNumber: string): boolean => {\n  let sum = 0;\n  let alternate = false;\n\n  for (let i = cardNumber.length - 1; i >= 0; i--) {\n    let n = parseInt(cardNumber.charAt(i), 10);\n\n    if (alternate) {\n      n *= 2;\n      if (n > 9) {\n        n = (n % 10) + 1;\n      }\n    }\n\n    sum += n;\n    alternate = !alternate;\n  }\n\n  return sum % 10 === 0;\n};\n","import React from 'react';\nimport {\n  View,\n  Text,\n  ScrollView,\n  StyleSheet,\n  ViewStyle,\n  Dimensions,\n} from 'react-native';\nimport { PricingPlan } from '../../shared/types';\nimport {\n  formatPricingPlan,\n  formatTrialPeriod,\n} from '../../shared/utils/formatting';\nimport { CheckoutButton } from './CheckoutButton';\n\nconst { width: screenWidth } = Dimensions.get('window');\n\ninterface PricingTableProps {\n  plans: PricingPlan[];\n  customerId?: string;\n  customerEmail?: string;\n  onCheckoutSuccess?: (plan: PricingPlan) => void;\n  onCheckoutError?: (plan: PricingPlan, error: string) => void;\n  showFeatures?: boolean;\n  showTrialInfo?: boolean;\n  layout?: 'carousel' | 'list';\n  containerStyle?: ViewStyle;\n}\n\nexport const PricingTable: React.FC<PricingTableProps> = ({\n  plans,\n  customerId,\n  customerEmail,\n  onCheckoutSuccess,\n  onCheckoutError,\n  showFeatures = true,\n  showTrialInfo = true,\n  layout = 'carousel',\n  containerStyle,\n}) => {\n  if (!plans || plans.length === 0) {\n    return (\n      <View style={styles.emptyContainer}>\n        <Text style={styles.emptyText}>No pricing plans available</Text>\n      </View>\n    );\n  }\n\n  const renderPricingCard = (plan: PricingPlan) => (\n    <PricingCard\n      key={plan.id}\n      plan={plan}\n      customerId={customerId}\n      customerEmail={customerEmail}\n      onCheckoutSuccess={() => onCheckoutSuccess?.(plan)}\n      onCheckoutError={error => onCheckoutError?.(plan, error)}\n      showFeatures={showFeatures}\n      showTrialInfo={showTrialInfo}\n      style={layout === 'carousel' ? styles.carouselCard : styles.listCard}\n    />\n  );\n\n  if (layout === 'carousel') {\n    return (\n      <View style={[styles.container, containerStyle]}>\n        <ScrollView\n          horizontal\n          showsHorizontalScrollIndicator={false}\n          contentContainerStyle={styles.carouselContainer}\n          snapToInterval={screenWidth * 0.8 + 16}\n          decelerationRate=\"fast\"\n        >\n          {plans.map(renderPricingCard)}\n        </ScrollView>\n      </View>\n    );\n  }\n\n  return (\n    <ScrollView style={[styles.container, containerStyle]}>\n      <View style={styles.listContainer}>{plans.map(renderPricingCard)}</View>\n    </ScrollView>\n  );\n};\n\ninterface PricingCardProps {\n  plan: PricingPlan;\n  customerId?: string;\n  customerEmail?: string;\n  onCheckoutSuccess?: () => void;\n  onCheckoutError?: (error: string) => void;\n  showFeatures?: boolean;\n  showTrialInfo?: boolean;\n  style?: ViewStyle;\n}\n\nconst PricingCard: React.FC<PricingCardProps> = ({\n  plan,\n  customerId,\n  customerEmail,\n  onCheckoutSuccess,\n  onCheckoutError,\n  showFeatures = true,\n  showTrialInfo = true,\n  style,\n}) => {\n  const isPopular = plan.popular;\n\n  return (\n    <View style={[styles.card, isPopular && styles.popularCard, style]}>\n      {isPopular && (\n        <View style={styles.popularBadge}>\n          <Text style={styles.popularBadgeText}>Most Popular</Text>\n        </View>\n      )}\n\n      {/* Plan Header */}\n      <View style={styles.cardHeader}>\n        <Text style={styles.planName}>{plan.name}</Text>\n        {plan.description && (\n          <Text style={styles.planDescription}>{plan.description}</Text>\n        )}\n        <Text style={styles.planPrice}>{formatPricingPlan(plan)}</Text>\n        {showTrialInfo && plan.trialPeriodDays && plan.trialPeriodDays > 0 && (\n          <Text style={styles.trialInfo}>\n            {formatTrialPeriod(plan.trialPeriodDays)}\n          </Text>\n        )}\n      </View>\n\n      {/* Features List */}\n      {showFeatures && plan.features && plan.features.length > 0 && (\n        <View style={styles.featuresContainer}>\n          {plan.features.map((feature, index) => (\n            <View key={index} style={styles.featureItem}>\n              <Text style={styles.featureCheckmark}>✓</Text>\n              <Text style={styles.featureText}>{feature}</Text>\n            </View>\n          ))}\n        </View>\n      )}\n\n      {/* CTA Button */}\n      <View style={styles.buttonContainer}>\n        <CheckoutButton\n          priceId={plan.stripePriceId}\n          customerId={customerId}\n          customerEmail={customerEmail}\n          trialPeriodDays={plan.trialPeriodDays}\n          metadata={plan.metadata}\n          onSuccess={onCheckoutSuccess}\n          onError={onCheckoutError}\n          style={[\n            styles.ctaButton,\n            isPopular ? styles.popularButton : styles.regularButton,\n          ]}\n          textStyle={[\n            styles.ctaButtonText,\n            isPopular ? styles.popularButtonText : styles.regularButtonText,\n          ]}\n        >\n          Get Started\n        </CheckoutButton>\n      </View>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  emptyContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    padding: 20,\n  },\n  emptyText: {\n    fontSize: 16,\n    color: '#666',\n    textAlign: 'center',\n  },\n  carouselContainer: {\n    paddingHorizontal: 16,\n  },\n  listContainer: {\n    padding: 16,\n  },\n  carouselCard: {\n    width: screenWidth * 0.8,\n    marginRight: 16,\n  },\n  listCard: {\n    marginBottom: 16,\n  },\n  card: {\n    backgroundColor: '#ffffff',\n    borderRadius: 12,\n    padding: 20,\n    shadowColor: '#000',\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.1,\n    shadowRadius: 8,\n    elevation: 4,\n    borderWidth: 1,\n    borderColor: '#e0e0e0',\n  },\n  popularCard: {\n    borderColor: '#007AFF',\n    borderWidth: 2,\n  },\n  popularBadge: {\n    position: 'absolute',\n    top: -1,\n    left: -1,\n    right: -1,\n    backgroundColor: '#007AFF',\n    paddingVertical: 8,\n    borderTopLeftRadius: 12,\n    borderTopRightRadius: 12,\n    alignItems: 'center',\n  },\n  popularBadgeText: {\n    color: '#ffffff',\n    fontSize: 12,\n    fontWeight: '600',\n  },\n  cardHeader: {\n    alignItems: 'center',\n    marginBottom: 20,\n    marginTop: 20, // Extra space for popular badge\n  },\n  planName: {\n    fontSize: 20,\n    fontWeight: '700',\n    color: '#333',\n    marginBottom: 8,\n    textAlign: 'center',\n  },\n  planDescription: {\n    fontSize: 14,\n    color: '#666',\n    textAlign: 'center',\n    marginBottom: 16,\n    lineHeight: 20,\n  },\n  planPrice: {\n    fontSize: 28,\n    fontWeight: '800',\n    color: '#333',\n    marginBottom: 8,\n    textAlign: 'center',\n  },\n  trialInfo: {\n    fontSize: 12,\n    color: '#22c55e',\n    fontWeight: '600',\n    textAlign: 'center',\n  },\n  featuresContainer: {\n    marginBottom: 24,\n  },\n  featureItem: {\n    flexDirection: 'row',\n    alignItems: 'flex-start',\n    marginBottom: 12,\n  },\n  featureCheckmark: {\n    color: '#22c55e',\n    fontSize: 16,\n    fontWeight: '700',\n    marginRight: 12,\n    marginTop: 2,\n  },\n  featureText: {\n    flex: 1,\n    fontSize: 14,\n    color: '#555',\n    lineHeight: 20,\n  },\n  buttonContainer: {\n    marginTop: 'auto',\n  },\n  ctaButton: {\n    paddingVertical: 16,\n    borderRadius: 8,\n  },\n  ctaButtonText: {\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  popularButton: {\n    backgroundColor: '#007AFF',\n  },\n  popularButtonText: {\n    color: '#ffffff',\n  },\n  regularButton: {\n    backgroundColor: '#f8f9fa',\n    borderWidth: 1,\n    borderColor: '#e0e0e0',\n  },\n  regularButtonText: {\n    color: '#333',\n  },\n});\n\nexport default PricingTable;\n","import { CURRENCY_SYMBOLS, DEFAULT_CURRENCY } from '../constants';\nimport { PricingPlan, SubscriptionStatus } from '../types';\n\nexport const formatCurrency = (\n  amount: number,\n  currency: string = DEFAULT_CURRENCY,\n  options: {\n    showSymbol?: boolean;\n    showCents?: boolean;\n    locale?: string;\n  } = {}\n): string => {\n  const { showSymbol = true, showCents = true, locale = 'en-US' } = options;\n\n  const currencyCode = currency.toUpperCase();\n\n  // Convert from cents to dollars for most currencies\n  const isZeroDecimalCurrency = ['JPY', 'KRW', 'VND', 'CLP'].includes(\n    currencyCode\n  );\n  const displayAmount = isZeroDecimalCurrency ? amount : amount / 100;\n\n  if (showSymbol) {\n    try {\n      return new Intl.NumberFormat(locale, {\n        style: 'currency',\n        currency: currencyCode,\n        minimumFractionDigits: showCents && !isZeroDecimalCurrency ? 2 : 0,\n        maximumFractionDigits: showCents && !isZeroDecimalCurrency ? 2 : 0,\n      }).format(displayAmount);\n    } catch {\n      // Fallback to manual formatting if Intl.NumberFormat fails\n      const symbol =\n        CURRENCY_SYMBOLS[currencyCode as keyof typeof CURRENCY_SYMBOLS] ||\n        currencyCode;\n      const formattedAmount =\n        showCents && !isZeroDecimalCurrency\n          ? displayAmount.toFixed(2)\n          : Math.round(displayAmount).toString();\n      return `${symbol}${formattedAmount}`;\n    }\n  }\n\n  return showCents && !isZeroDecimalCurrency\n    ? displayAmount.toFixed(2)\n    : Math.round(displayAmount).toString();\n};\n\nexport const formatPricingPlan = (plan: PricingPlan): string => {\n  const price = formatCurrency(plan.price, plan.currency);\n  const interval =\n    plan.intervalCount && plan.intervalCount > 1\n      ? `${plan.intervalCount} ${plan.interval}s`\n      : plan.interval;\n\n  return `${price}/${interval}`;\n};\n\nexport const formatSubscriptionStatus = (\n  status: SubscriptionStatus\n): string => {\n  const statusMap: Record<SubscriptionStatus, string> = {\n    [SubscriptionStatus.ACTIVE]: 'Active',\n    [SubscriptionStatus.CANCELED]: 'Canceled',\n    [SubscriptionStatus.PAST_DUE]: 'Past Due',\n    [SubscriptionStatus.UNPAID]: 'Unpaid',\n    [SubscriptionStatus.INCOMPLETE]: 'Incomplete',\n    [SubscriptionStatus.INCOMPLETE_EXPIRED]: 'Incomplete (Expired)',\n    [SubscriptionStatus.TRIALING]: 'Trial',\n    [SubscriptionStatus.ENDED]: 'Ended',\n    [SubscriptionStatus.ALL]: 'All',\n  };\n\n  return statusMap[status] || status;\n};\n\nexport const formatDate = (\n  date: Date | string | number,\n  options: {\n    format?: 'short' | 'medium' | 'long' | 'full';\n    locale?: string;\n    timeZone?: string;\n  } = {}\n): string => {\n  const { format = 'medium', locale = 'en-US', timeZone } = options;\n\n  const dateObj =\n    typeof date === 'string' || typeof date === 'number'\n      ? new Date(date)\n      : date;\n\n  const formatOptions: Intl.DateTimeFormatOptions = {\n    timeZone,\n  };\n\n  switch (format) {\n    case 'short':\n      formatOptions.dateStyle = 'short';\n      break;\n    case 'medium':\n      formatOptions.dateStyle = 'medium';\n      break;\n    case 'long':\n      formatOptions.dateStyle = 'long';\n      break;\n    case 'full':\n      formatOptions.dateStyle = 'full';\n      break;\n  }\n\n  try {\n    return new Intl.DateTimeFormat(locale, formatOptions).format(dateObj);\n  } catch {\n    // Fallback to basic formatting\n    return dateObj.toLocaleDateString();\n  }\n};\n\nexport const formatRelativeTime = (\n  date: Date | string | number,\n  options: {\n    locale?: string;\n    numeric?: 'always' | 'auto';\n  } = {}\n): string => {\n  const { locale = 'en-US', numeric = 'auto' } = options;\n\n  const dateObj =\n    typeof date === 'string' || typeof date === 'number'\n      ? new Date(date)\n      : date;\n  const now = new Date();\n  const diffInSeconds = Math.floor((now.getTime() - dateObj.getTime()) / 1000);\n\n  try {\n    const rtf = new Intl.RelativeTimeFormat(locale, { numeric });\n\n    if (Math.abs(diffInSeconds) < 60) {\n      return rtf.format(-diffInSeconds, 'second');\n    } else if (Math.abs(diffInSeconds) < 3600) {\n      return rtf.format(-Math.floor(diffInSeconds / 60), 'minute');\n    } else if (Math.abs(diffInSeconds) < 86400) {\n      return rtf.format(-Math.floor(diffInSeconds / 3600), 'hour');\n    } else if (Math.abs(diffInSeconds) < 2592000) {\n      return rtf.format(-Math.floor(diffInSeconds / 86400), 'day');\n    } else if (Math.abs(diffInSeconds) < 31536000) {\n      return rtf.format(-Math.floor(diffInSeconds / 2592000), 'month');\n    } else {\n      return rtf.format(-Math.floor(diffInSeconds / 31536000), 'year');\n    }\n  } catch {\n    // Fallback to basic relative time\n    if (Math.abs(diffInSeconds) < 60) {\n      return 'just now';\n    } else if (Math.abs(diffInSeconds) < 3600) {\n      const minutes = Math.floor(Math.abs(diffInSeconds) / 60);\n      return diffInSeconds < 0\n        ? `in ${minutes} minutes`\n        : `${minutes} minutes ago`;\n    } else if (Math.abs(diffInSeconds) < 86400) {\n      const hours = Math.floor(Math.abs(diffInSeconds) / 3600);\n      return diffInSeconds < 0 ? `in ${hours} hours` : `${hours} hours ago`;\n    } else {\n      const days = Math.floor(Math.abs(diffInSeconds) / 86400);\n      return diffInSeconds < 0 ? `in ${days} days` : `${days} days ago`;\n    }\n  }\n};\n\nexport const formatBillingInterval = (\n  interval: string,\n  count: number = 1\n): string => {\n  const intervalMap: Record<string, string> = {\n    day: count === 1 ? 'daily' : `every ${count} days`,\n    week: count === 1 ? 'weekly' : `every ${count} weeks`,\n    month: count === 1 ? 'monthly' : `every ${count} months`,\n    year: count === 1 ? 'yearly' : `every ${count} years`,\n  };\n\n  return intervalMap[interval] || interval;\n};\n\nexport const formatTrialPeriod = (days: number): string => {\n  if (days === 0) return 'No trial';\n  if (days === 1) return '1 day trial';\n  if (days < 7) return `${days} days trial`;\n  if (days === 7) return '1 week trial';\n  if (days < 30) return `${Math.floor(days / 7)} weeks trial`;\n  if (days === 30) return '1 month trial';\n  return `${Math.floor(days / 30)} months trial`;\n};\n\nexport const truncateText = (text: string, maxLength: number): string => {\n  if (text.length <= maxLength) return text;\n  return `${text.substring(0, maxLength - 3)}...`;\n};\n\nexport const formatCardBrand = (brand: string): string => {\n  const brandMap: Record<string, string> = {\n    visa: 'Visa',\n    mastercard: 'Mastercard',\n    amex: 'American Express',\n    discover: 'Discover',\n    jcb: 'JCB',\n    diners: 'Diners Club',\n    unionpay: 'UnionPay',\n  };\n\n  return brandMap[brand.toLowerCase()] || brand;\n};\n\nexport const formatPaymentMethodDisplay = (paymentMethod: {\n  type: string;\n  card?: { brand: string; last4: string };\n  bankAccount?: { last4: string; bankName?: string };\n}): string => {\n  if (paymentMethod.type === 'card' && paymentMethod.card) {\n    return `${formatCardBrand(paymentMethod.card.brand)} •••• ${paymentMethod.card.last4}`;\n  }\n\n  if (paymentMethod.type === 'bank_account' && paymentMethod.bankAccount) {\n    const bankName = paymentMethod.bankAccount.bankName || 'Bank';\n    return `${bankName} •••• ${paymentMethod.bankAccount.last4}`;\n  }\n\n  return paymentMethod.type;\n};\n\nexport const calculateTax = (\n  amount: number,\n  taxRate: number,\n  options: {\n    inclusive?: boolean;\n    roundTo?: number;\n  } = {}\n): { subtotal: number; tax: number; total: number } => {\n  const { inclusive = false, roundTo = 2 } = options;\n\n  let subtotal: number;\n  let tax: number;\n  let total: number;\n\n  if (inclusive) {\n    // Tax is included in the amount\n    total = amount;\n    subtotal = amount / (1 + taxRate / 100);\n    tax = amount - subtotal;\n  } else {\n    // Tax is added to the amount\n    subtotal = amount;\n    tax = amount * (taxRate / 100);\n    total = amount + tax;\n  }\n\n  // Round to specified decimal places\n  const multiplier = Math.pow(10, roundTo);\n  return {\n    subtotal: Math.round(subtotal * multiplier) / multiplier,\n    tax: Math.round(tax * multiplier) / multiplier,\n    total: Math.round(total * multiplier) / multiplier,\n  };\n};\n\nexport const formatTaxRate = (rate: number): string => {\n  return `${rate.toFixed(2)}%`;\n};\n\nexport const formatAmountWithTax = (\n  amount: number,\n  taxRate: number,\n  currency: string = DEFAULT_CURRENCY,\n  options: {\n    inclusive?: boolean;\n    showBreakdown?: boolean;\n    locale?: string;\n  } = {}\n): string => {\n  const {\n    inclusive = false,\n    showBreakdown = false,\n    locale = 'en-US',\n  } = options;\n  const taxCalculation = calculateTax(amount, taxRate, { inclusive });\n\n  if (showBreakdown) {\n    const subtotalFormatted = formatCurrency(\n      taxCalculation.subtotal,\n      currency,\n      { locale }\n    );\n    const taxFormatted = formatCurrency(taxCalculation.tax, currency, {\n      locale,\n    });\n    const totalFormatted = formatCurrency(taxCalculation.total, currency, {\n      locale,\n    });\n\n    return `${subtotalFormatted} + ${taxFormatted} tax = ${totalFormatted}`;\n  }\n\n  return formatCurrency(taxCalculation.total, currency, { locale });\n};\n","import React, { useState } from 'react';\nimport {\n  View,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  StyleSheet,\n  Alert,\n  ActivityIndicator,\n  ViewStyle,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n} from 'react-native';\nimport {\n  useStripe,\n  CardField,\n  PaymentIntent,\n} from '@stripe/stripe-react-native';\nimport { usePaymentsContext } from '../providers/PaymentsProvider';\nimport { ERROR_MESSAGES } from '../../shared/constants';\nimport { validateEmail } from '../../shared/utils/validation';\n\ninterface PaymentFormProps {\n  clientSecret?: string;\n  customerId?: string;\n  customerEmail?: string;\n  amount?: number;\n  currency?: string;\n  description?: string;\n  metadata?: Record<string, string>;\n  onSuccess?: (paymentIntent: PaymentIntent.Result) => void;\n  onError?: (error: string) => void;\n  onLoading?: (loading: boolean) => void;\n  containerStyle?: ViewStyle;\n  showBillingDetails?: boolean;\n}\n\nexport const PaymentForm: React.FC<PaymentFormProps> = ({\n  clientSecret,\n  customerId,\n  customerEmail,\n  amount,\n  currency = 'usd',\n  description,\n  metadata,\n  onSuccess,\n  onError,\n  onLoading,\n  containerStyle,\n  showBillingDetails = true,\n}) => {\n  const { confirmPayment } = useStripe();\n  const { initialized } = usePaymentsContext();\n\n  const [loading, setLoading] = useState(false);\n  const [email, setEmail] = useState(customerEmail || '');\n  const [name, setName] = useState('');\n  const [phone, setPhone] = useState('');\n  const [cardComplete, setCardComplete] = useState(false);\n\n  const handleError = (errorMessage: string) => {\n    onError?.(errorMessage);\n    Alert.alert('Payment Error', errorMessage);\n    console.error('Payment error:', errorMessage);\n  };\n\n  const handlePayment = async () => {\n    if (!initialized) {\n      handleError(ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED);\n      return;\n    }\n\n    if (showBillingDetails && email && !validateEmail(email)) {\n      handleError('Please enter a valid email address');\n      return;\n    }\n\n    if (!cardComplete) {\n      handleError('Please complete your card information');\n      return;\n    }\n\n    let paymentClientSecret = clientSecret;\n\n    // If no client secret provided, create payment intent\n    if (!paymentClientSecret && amount) {\n      try {\n        const response = await fetch('/api/payments/create-payment-intent', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({\n            amount,\n            currency,\n            customerId,\n            description,\n            metadata,\n          }),\n        });\n\n        if (!response.ok) {\n          throw new Error('Failed to create payment intent');\n        }\n\n        const { client_secret } = await response.json();\n        paymentClientSecret = client_secret;\n      } catch {\n        handleError('Failed to initialize payment');\n        return;\n      }\n    }\n\n    if (!paymentClientSecret) {\n      handleError('Payment could not be initialized');\n      return;\n    }\n\n    setLoading(true);\n    onLoading?.(true);\n\n    try {\n      const billingDetails = showBillingDetails\n        ? {\n            email: email || undefined,\n            name: name || undefined,\n            phone: phone || undefined,\n          }\n        : undefined;\n\n      const { error: stripeError, paymentIntent } = await confirmPayment(\n        paymentClientSecret,\n        {\n          paymentMethodType: 'Card',\n          paymentMethodData: {\n            billingDetails,\n          },\n        }\n      );\n\n      if (stripeError) {\n        throw new Error(stripeError.message || ERROR_MESSAGES.PAYMENT_FAILED);\n      }\n\n      if (paymentIntent?.status === 'Succeeded') {\n        onSuccess?.(paymentIntent);\n        Alert.alert('Success', 'Payment completed successfully!');\n      } else {\n        throw new Error('Payment was not completed');\n      }\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : ERROR_MESSAGES.PAYMENT_FAILED;\n      handleError(errorMessage);\n    } finally {\n      setLoading(false);\n      onLoading?.(false);\n    }\n  };\n\n  return (\n    <KeyboardAvoidingView\n      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n      style={[styles.container, containerStyle]}\n    >\n      <ScrollView showsVerticalScrollIndicator={false}>\n        {showBillingDetails && (\n          <View style={styles.billingSection}>\n            <Text style={styles.sectionTitle}>Billing Information</Text>\n\n            <View style={styles.inputContainer}>\n              <Text style={styles.inputLabel}>Email *</Text>\n              <TextInput\n                style={styles.textInput}\n                value={email}\n                onChangeText={setEmail}\n                placeholder=\"your@email.com\"\n                keyboardType=\"email-address\"\n                autoCapitalize=\"none\"\n                autoCorrect={false}\n              />\n            </View>\n\n            <View style={styles.inputContainer}>\n              <Text style={styles.inputLabel}>Full Name</Text>\n              <TextInput\n                style={styles.textInput}\n                value={name}\n                onChangeText={setName}\n                placeholder=\"John Doe\"\n                autoCapitalize=\"words\"\n              />\n            </View>\n\n            <View style={styles.inputContainer}>\n              <Text style={styles.inputLabel}>Phone</Text>\n              <TextInput\n                style={styles.textInput}\n                value={phone}\n                onChangeText={setPhone}\n                placeholder=\"+1 (555) 123-4567\"\n                keyboardType=\"phone-pad\"\n              />\n            </View>\n          </View>\n        )}\n\n        <View style={styles.cardSection}>\n          <Text style={styles.sectionTitle}>Payment Information</Text>\n          <View style={styles.cardContainer}>\n            <CardField\n              postalCodeEnabled={true}\n              placeholders={{\n                number: '4242 4242 4242 4242',\n              }}\n              cardStyle={cardFieldStyle}\n              style={styles.cardFieldContainer}\n              onCardChange={cardDetails => {\n                setCardComplete(cardDetails.complete);\n              }}\n            />\n          </View>\n        </View>\n\n        <TouchableOpacity\n          style={[styles.payButton, loading && styles.payButtonDisabled]}\n          onPress={handlePayment}\n          disabled={loading || !cardComplete}\n          activeOpacity={0.8}\n        >\n          {loading ? (\n            <ActivityIndicator color=\"#ffffff\" size=\"small\" />\n          ) : (\n            <Text style={styles.payButtonText}>\n              Pay {amount ? `$${(amount / 100).toFixed(2)}` : ''}\n            </Text>\n          )}\n        </TouchableOpacity>\n      </ScrollView>\n    </KeyboardAvoidingView>\n  );\n};\n\nconst cardFieldStyle = {\n  backgroundColor: '#fafafa',\n  textColor: '#333',\n  fontSize: 16,\n  placeholderColor: '#999',\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    padding: 20,\n    backgroundColor: '#ffffff',\n  },\n  billingSection: {\n    marginBottom: 24,\n  },\n  cardSection: {\n    marginBottom: 32,\n  },\n  sectionTitle: {\n    fontSize: 18,\n    fontWeight: '600',\n    color: '#333',\n    marginBottom: 16,\n  },\n  inputContainer: {\n    marginBottom: 16,\n  },\n  inputLabel: {\n    fontSize: 14,\n    fontWeight: '500',\n    color: '#555',\n    marginBottom: 8,\n  },\n  textInput: {\n    borderWidth: 1,\n    borderColor: '#ddd',\n    borderRadius: 8,\n    paddingHorizontal: 12,\n    paddingVertical: 12,\n    fontSize: 16,\n    backgroundColor: '#fafafa',\n  },\n  cardContainer: {\n    borderWidth: 1,\n    borderColor: '#ddd',\n    borderRadius: 8,\n    backgroundColor: '#fafafa',\n  },\n  cardFieldContainer: {\n    width: '100%',\n    height: 50,\n  },\n  payButton: {\n    backgroundColor: '#007AFF',\n    paddingVertical: 16,\n    borderRadius: 8,\n    alignItems: 'center',\n    justifyContent: 'center',\n    minHeight: 52,\n  },\n  payButtonDisabled: {\n    opacity: 0.5,\n  },\n  payButtonText: {\n    color: '#ffffff',\n    fontSize: 18,\n    fontWeight: '600',\n  },\n});\n\nexport default PaymentForm;\n","import React from 'react';\nimport { useStripe } from '@stripe/stripe-react-native';\nimport { View, StyleSheet, Alert } from 'react-native';\nimport { usePaymentsContext } from '../providers/PaymentsProvider';\n\nexport interface MobilePaymentSheetProps {\n  customerId?: string;\n  amount: number;\n  currency?: string;\n  paymentIntentClientSecret?: string;\n  onSuccess?: (paymentIntent: any) => void;\n  onError?: (error: string) => void;\n  children?: React.ReactNode;\n}\n\nexport const MobilePaymentSheet: React.FC<MobilePaymentSheetProps> = ({\n  customerId,\n  amount,\n  currency = 'usd',\n  paymentIntentClientSecret,\n  onSuccess,\n  onError,\n  children,\n}) => {\n  const { presentPaymentSheet, initPaymentSheet } = useStripe();\n  const { initialized } = usePaymentsContext();\n\n  const openPaymentSheet = async () => {\n    if (!initialized) {\n      const error = 'Payment provider not initialized';\n      onError?.(error);\n      return;\n    }\n\n    try {\n      // Initialize the payment sheet\n      if (paymentIntentClientSecret) {\n        const { error } = await initPaymentSheet({\n          merchantDisplayName: 'Your App Name',\n          paymentIntentClientSecret,\n          defaultBillingDetails: {\n            name: '',\n          },\n          allowsDelayedPaymentMethods: true,\n        });\n\n        if (error) {\n          throw new Error(error.message);\n        }\n      }\n\n      // Present the payment sheet\n      const { error } = await presentPaymentSheet();\n\n      if (error) {\n        if (error.code === 'Canceled') {\n          // User canceled - don't show error\n          return;\n        }\n        throw new Error(error.message);\n      }\n\n      // Payment succeeded\n      onSuccess?.({ status: 'succeeded' });\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Payment failed';\n      onError?.(errorMessage);\n      Alert.alert('Payment Error', errorMessage);\n    }\n  };\n\n  return <View style={styles.container}>{children}</View>;\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n});\n\nexport default MobilePaymentSheet;\n","import React, { useState, useEffect } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  TouchableOpacity,\n  ScrollView,\n  Alert,\n} from 'react-native';\nimport { usePaymentsContext } from '../providers/PaymentsProvider';\nimport { Subscription, SubscriptionStatus } from '../../shared/types';\nimport { formatCurrency, formatDate } from '../../shared/utils/formatting';\n\nexport interface NativeSubscriptionViewProps {\n  subscription?: Subscription;\n  onCancel?: (subscriptionId: string) => void;\n  onReactivate?: (subscriptionId: string) => void;\n  onUpdate?: (subscriptionId: string) => void;\n  style?: any;\n}\n\nexport const NativeSubscriptionView: React.FC<NativeSubscriptionViewProps> = ({\n  subscription,\n  onCancel,\n  onReactivate,\n  onUpdate,\n  style,\n}) => {\n  const { activeSubscription, loading, error } = usePaymentsContext();\n  const [currentSubscription, setCurrentSubscription] =\n    useState<Subscription | null>(null);\n\n  useEffect(() => {\n    setCurrentSubscription(subscription || activeSubscription);\n  }, [subscription, activeSubscription]);\n\n  const handleCancel = () => {\n    if (!currentSubscription) return;\n\n    Alert.alert(\n      'Cancel Subscription',\n      'Are you sure you want to cancel your subscription? You will retain access until the end of your current billing period.',\n      [\n        { text: 'Keep Subscription', style: 'cancel' },\n        {\n          text: 'Cancel',\n          style: 'destructive',\n          onPress: () => onCancel?.(currentSubscription.id),\n        },\n      ]\n    );\n  };\n\n  const handleReactivate = () => {\n    if (!currentSubscription) return;\n\n    Alert.alert(\n      'Reactivate Subscription',\n      'Would you like to reactivate your subscription?',\n      [\n        { text: 'No', style: 'cancel' },\n        {\n          text: 'Reactivate',\n          onPress: () => onReactivate?.(currentSubscription.id),\n        },\n      ]\n    );\n  };\n\n  const getStatusColor = (status: SubscriptionStatus): string => {\n    switch (status) {\n      case SubscriptionStatus.ACTIVE:\n        return '#10B981';\n      case SubscriptionStatus.TRIALING:\n        return '#3B82F6';\n      case SubscriptionStatus.PAST_DUE:\n        return '#F59E0B';\n      case SubscriptionStatus.CANCELED:\n        return '#EF4444';\n      default:\n        return '#6B7280';\n    }\n  };\n\n  const getStatusText = (status: SubscriptionStatus): string => {\n    switch (status) {\n      case SubscriptionStatus.ACTIVE:\n        return 'Active';\n      case SubscriptionStatus.TRIALING:\n        return 'Trial';\n      case SubscriptionStatus.PAST_DUE:\n        return 'Past Due';\n      case SubscriptionStatus.CANCELED:\n        return 'Canceled';\n      default:\n        return status;\n    }\n  };\n\n  if (loading) {\n    return (\n      <View style={[styles.container, style]}>\n        <Text style={styles.loadingText}>Loading subscription...</Text>\n      </View>\n    );\n  }\n\n  if (error) {\n    return (\n      <View style={[styles.container, style]}>\n        <Text style={styles.errorText}>Error: {error.message}</Text>\n      </View>\n    );\n  }\n\n  if (!currentSubscription) {\n    return (\n      <View style={[styles.container, style]}>\n        <Text style={styles.noSubscriptionText}>No active subscription</Text>\n      </View>\n    );\n  }\n\n  const isActive =\n    currentSubscription.status === SubscriptionStatus.ACTIVE ||\n    currentSubscription.status === SubscriptionStatus.TRIALING;\n  const isCanceled = currentSubscription.status === SubscriptionStatus.CANCELED;\n\n  return (\n    <ScrollView style={[styles.container, style]}>\n      <View style={styles.header}>\n        <Text style={styles.title}>Subscription Details</Text>\n        <View\n          style={[\n            styles.statusBadge,\n            { backgroundColor: getStatusColor(currentSubscription.status) },\n          ]}\n        >\n          <Text style={styles.statusText}>\n            {getStatusText(currentSubscription.status)}\n          </Text>\n        </View>\n      </View>\n\n      <View style={styles.detailsContainer}>\n        <View style={styles.detailRow}>\n          <Text style={styles.detailLabel}>Amount:</Text>\n          <Text style={styles.detailValue}>\n            {formatCurrency(\n              currentSubscription.amount || 0,\n              currentSubscription.currency\n            )}\n          </Text>\n        </View>\n\n        <View style={styles.detailRow}>\n          <Text style={styles.detailLabel}>Billing Interval:</Text>\n          <Text style={styles.detailValue}>{currentSubscription.interval}</Text>\n        </View>\n\n        <View style={styles.detailRow}>\n          <Text style={styles.detailLabel}>Current Period:</Text>\n          <Text style={styles.detailValue}>\n            {formatDate(currentSubscription.currentPeriodStart)} -{' '}\n            {formatDate(currentSubscription.currentPeriodEnd)}\n          </Text>\n        </View>\n\n        {currentSubscription.trialEnd && (\n          <View style={styles.detailRow}>\n            <Text style={styles.detailLabel}>Trial Ends:</Text>\n            <Text style={styles.detailValue}>\n              {formatDate(currentSubscription.trialEnd)}\n            </Text>\n          </View>\n        )}\n\n        {currentSubscription.cancelAtPeriodEnd && (\n          <View style={styles.warningContainer}>\n            <Text style={styles.warningText}>\n              Your subscription will cancel on{' '}\n              {formatDate(currentSubscription.currentPeriodEnd)}\n            </Text>\n          </View>\n        )}\n      </View>\n\n      <View style={styles.actionsContainer}>\n        {isActive && !currentSubscription.cancelAtPeriodEnd && (\n          <>\n            <TouchableOpacity\n              style={styles.primaryButton}\n              onPress={() => onUpdate?.(currentSubscription.id)}\n            >\n              <Text style={styles.primaryButtonText}>Update Plan</Text>\n            </TouchableOpacity>\n\n            <TouchableOpacity\n              style={styles.dangerButton}\n              onPress={handleCancel}\n            >\n              <Text style={styles.dangerButtonText}>Cancel Subscription</Text>\n            </TouchableOpacity>\n          </>\n        )}\n\n        {currentSubscription.cancelAtPeriodEnd && (\n          <TouchableOpacity\n            style={styles.primaryButton}\n            onPress={handleReactivate}\n          >\n            <Text style={styles.primaryButtonText}>\n              Reactivate Subscription\n            </Text>\n          </TouchableOpacity>\n        )}\n\n        {isCanceled && (\n          <TouchableOpacity\n            style={styles.primaryButton}\n            onPress={() => onUpdate?.(currentSubscription.id)}\n          >\n            <Text style={styles.primaryButtonText}>Subscribe Again</Text>\n          </TouchableOpacity>\n        )}\n      </View>\n    </ScrollView>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n    padding: 16,\n  },\n  header: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    marginBottom: 24,\n  },\n  title: {\n    fontSize: 24,\n    fontWeight: 'bold',\n    color: '#1F2937',\n  },\n  statusBadge: {\n    paddingHorizontal: 12,\n    paddingVertical: 6,\n    borderRadius: 16,\n  },\n  statusText: {\n    color: '#FFFFFF',\n    fontSize: 12,\n    fontWeight: '600',\n  },\n  detailsContainer: {\n    backgroundColor: '#F9FAFB',\n    borderRadius: 8,\n    padding: 16,\n    marginBottom: 24,\n  },\n  detailRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    paddingVertical: 8,\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E7EB',\n  },\n  detailLabel: {\n    fontSize: 14,\n    color: '#6B7280',\n    fontWeight: '500',\n  },\n  detailValue: {\n    fontSize: 14,\n    color: '#1F2937',\n    fontWeight: '600',\n  },\n  warningContainer: {\n    backgroundColor: '#FEF3C7',\n    borderRadius: 8,\n    padding: 12,\n    marginTop: 16,\n  },\n  warningText: {\n    color: '#92400E',\n    fontSize: 14,\n    textAlign: 'center',\n  },\n  actionsContainer: {\n    gap: 12,\n  },\n  primaryButton: {\n    backgroundColor: '#3B82F6',\n    borderRadius: 8,\n    padding: 16,\n    alignItems: 'center',\n  },\n  primaryButtonText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  dangerButton: {\n    backgroundColor: '#EF4444',\n    borderRadius: 8,\n    padding: 16,\n    alignItems: 'center',\n  },\n  dangerButtonText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  loadingText: {\n    textAlign: 'center',\n    color: '#6B7280',\n    fontSize: 16,\n  },\n  errorText: {\n    textAlign: 'center',\n    color: '#EF4444',\n    fontSize: 16,\n  },\n  noSubscriptionText: {\n    textAlign: 'center',\n    color: '#6B7280',\n    fontSize: 16,\n  },\n});\n\nexport default NativeSubscriptionView;\n","import React, { useState } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  TouchableOpacity,\n  Alert,\n  Platform,\n} from 'react-native';\n// Optional import for TouchID - requires react-native-touch-id package\nlet TouchID: any = null;\ntry {\n  TouchID = require('react-native-touch-id');\n} catch (error) {\n  // TouchID not available - component will show error\n}\nimport { useStripe } from '@stripe/stripe-react-native';\n\nexport interface TouchIDPaymentProps {\n  amount: number;\n  currency?: string;\n  paymentMethodId?: string;\n  clientSecret?: string;\n  onSuccess?: (result: any) => void;\n  onError?: (error: string) => void;\n  onCancel?: () => void;\n  title?: string;\n  subtitle?: string;\n  style?: any;\n}\n\nconst touchIDConfig = {\n  title: 'Authentication Required',\n  imageColor: '#e00606',\n  sensorDescription: 'Touch sensor',\n  sensorErrorDescription: 'Failed',\n  cancelText: 'Cancel',\n  fallbackLabel: 'Show Passcode',\n  unifiedErrors: false,\n  passcodeFallback: false,\n};\n\nexport const TouchIDPayment: React.FC<TouchIDPaymentProps> = ({\n  amount,\n  currency = 'USD',\n  paymentMethodId,\n  clientSecret,\n  onSuccess,\n  onError,\n  onCancel,\n  title = 'Authorize Payment',\n  subtitle,\n  style,\n}) => {\n  const [isAuthenticating, setIsAuthenticating] = useState(false);\n  const [isProcessing, setIsProcessing] = useState(false);\n  const { confirmPayment } = useStripe();\n\n  const checkBiometricSupport = async (): Promise<boolean> => {\n    try {\n      const biometryType = await TouchID.isSupported();\n      return biometryType !== false;\n    } catch (error) {\n      return false;\n    }\n  };\n\n  const authenticateWithBiometrics = async (): Promise<boolean> => {\n    try {\n      await TouchID.authenticate(\n        'Authenticate to complete your payment',\n        touchIDConfig\n      );\n      return true;\n    } catch (error: any) {\n      if (error.name === 'UserCancel' || error.name === 'UserFallback') {\n        onCancel?.();\n      } else {\n        onError?.(`Authentication failed: ${error.message}`);\n      }\n      return false;\n    }\n  };\n\n  const processPayment = async () => {\n    if (!clientSecret) {\n      onError?.('Payment configuration is missing');\n      return;\n    }\n\n    setIsProcessing(true);\n\n    try {\n      const { error, paymentIntent } = await confirmPayment(clientSecret, {\n        paymentMethodType: 'Card',\n      });\n\n      if (error) {\n        throw new Error(error.message);\n      }\n\n      onSuccess?.(paymentIntent);\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Payment failed';\n      onError?.(errorMessage);\n    } finally {\n      setIsProcessing(false);\n    }\n  };\n\n  const handlePayment = async () => {\n    setIsAuthenticating(true);\n\n    try {\n      // Check if biometric authentication is supported\n      const isBiometricSupported = await checkBiometricSupport();\n\n      if (!isBiometricSupported) {\n        Alert.alert(\n          'Biometric Authentication Not Available',\n          'Your device does not support biometric authentication. Please use an alternative payment method.',\n          [{ text: 'OK', onPress: onCancel }]\n        );\n        return;\n      }\n\n      // Authenticate with biometrics\n      const isAuthenticated = await authenticateWithBiometrics();\n\n      if (isAuthenticated) {\n        await processPayment();\n      }\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Authentication failed';\n      onError?.(errorMessage);\n    } finally {\n      setIsAuthenticating(false);\n    }\n  };\n\n  const formatAmount = (amount: number, currency: string): string => {\n    return new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: currency.toUpperCase(),\n    }).format(amount / 100);\n  };\n\n  const getBiometricIcon = () => {\n    if (Platform.OS === 'ios') {\n      return '👆'; // Touch ID / Face ID icon\n    }\n    return '🔒'; // Generic biometric icon for Android\n  };\n\n  return (\n    <View style={[styles.container, style]}>\n      <View style={styles.content}>\n        <Text style={styles.title}>{title}</Text>\n\n        {subtitle && <Text style={styles.subtitle}>{subtitle}</Text>}\n\n        <View style={styles.amountContainer}>\n          <Text style={styles.amountLabel}>Amount</Text>\n          <Text style={styles.amount}>{formatAmount(amount, currency)}</Text>\n        </View>\n\n        <TouchableOpacity\n          style={[\n            styles.payButton,\n            (isAuthenticating || isProcessing) && styles.payButtonDisabled,\n          ]}\n          onPress={handlePayment}\n          disabled={isAuthenticating || isProcessing}\n        >\n          <Text style={styles.biometricIcon}>{getBiometricIcon()}</Text>\n          <Text style={styles.payButtonText}>\n            {isAuthenticating\n              ? 'Authenticating...'\n              : isProcessing\n                ? 'Processing...'\n                : `Pay with ${Platform.OS === 'ios' ? 'Touch ID' : 'Biometrics'}`}\n          </Text>\n        </TouchableOpacity>\n\n        <Text style={styles.securityNote}>\n          Your payment information is secured with biometric authentication\n        </Text>\n      </View>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    backgroundColor: '#FFFFFF',\n    borderRadius: 12,\n    padding: 20,\n    margin: 16,\n    shadowColor: '#000',\n    shadowOffset: {\n      width: 0,\n      height: 2,\n    },\n    shadowOpacity: 0.1,\n    shadowRadius: 3.84,\n    elevation: 5,\n  },\n  content: {\n    alignItems: 'center',\n  },\n  title: {\n    fontSize: 20,\n    fontWeight: 'bold',\n    color: '#1F2937',\n    marginBottom: 8,\n    textAlign: 'center',\n  },\n  subtitle: {\n    fontSize: 14,\n    color: '#6B7280',\n    marginBottom: 20,\n    textAlign: 'center',\n  },\n  amountContainer: {\n    backgroundColor: '#F9FAFB',\n    borderRadius: 8,\n    padding: 16,\n    marginBottom: 24,\n    minWidth: 200,\n    alignItems: 'center',\n  },\n  amountLabel: {\n    fontSize: 12,\n    color: '#6B7280',\n    marginBottom: 4,\n  },\n  amount: {\n    fontSize: 24,\n    fontWeight: 'bold',\n    color: '#1F2937',\n  },\n  payButton: {\n    backgroundColor: '#3B82F6',\n    borderRadius: 8,\n    paddingVertical: 16,\n    paddingHorizontal: 32,\n    flexDirection: 'row',\n    alignItems: 'center',\n    marginBottom: 12,\n  },\n  payButtonDisabled: {\n    backgroundColor: '#9CA3AF',\n  },\n  biometricIcon: {\n    fontSize: 20,\n    marginRight: 8,\n  },\n  payButtonText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  securityNote: {\n    fontSize: 12,\n    color: '#6B7280',\n    textAlign: 'center',\n    marginTop: 8,\n  },\n});\n\nexport default TouchIDPayment;\n","import React from 'react';\nimport { StripeProvider as RNStripeProvider } from '@stripe/stripe-react-native';\nimport { usePaymentsContext } from './PaymentsProvider';\nimport { ERROR_MESSAGES } from '../../shared/constants';\nimport { View, Text, StyleSheet } from 'react-native';\n\ninterface StripeProviderProps {\n  children: React.ReactElement | React.ReactElement[];\n  merchantIdentifier?: string;\n  urlScheme?: string;\n  publishableKey?: string;\n  setReturnUrlSchemeOnAndroid?: boolean;\n}\n\nexport const StripeProvider: React.FC<StripeProviderProps> = ({\n  children,\n  merchantIdentifier,\n  urlScheme,\n  publishableKey,\n  setReturnUrlSchemeOnAndroid = false,\n}) => {\n  const { config, initialized } = usePaymentsContext();\n\n  if (!initialized) {\n    if (config?.environment === 'development') {\n      return (\n        <View style={styles.errorContainer}>\n          <Text style={styles.errorTitle}>Payments Provider Error</Text>\n          <Text style={styles.errorMessage}>\n            {ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED}\n          </Text>\n          <Text style={styles.errorSubtext}>\n            Please check your PaymentsProvider configuration.\n          </Text>\n        </View>\n      );\n    }\n    return null;\n  }\n\n  const finalPublishableKey = publishableKey || config?.publishableKey;\n\n  if (!finalPublishableKey) {\n    return null;\n  }\n\n  return (\n    <RNStripeProvider\n      publishableKey={finalPublishableKey}\n      merchantIdentifier={merchantIdentifier}\n      urlScheme={urlScheme}\n      setReturnUrlSchemeOnAndroid={setReturnUrlSchemeOnAndroid}\n    >\n      {children}\n    </RNStripeProvider>\n  );\n};\n\nconst styles = StyleSheet.create({\n  errorContainer: {\n    padding: 20,\n    backgroundColor: '#fee',\n    borderColor: '#fcc',\n    borderWidth: 1,\n    borderRadius: 4,\n    margin: 10,\n  },\n  errorTitle: {\n    fontWeight: 'bold',\n    fontSize: 16,\n    color: '#c53030',\n    marginBottom: 8,\n  },\n  errorMessage: {\n    fontSize: 14,\n    color: '#c53030',\n    marginBottom: 4,\n  },\n  errorSubtext: {\n    fontSize: 12,\n    color: '#a0a0a0',\n  },\n});\n\nexport default StripeProvider;\n","import { useState, useEffect, useCallback } from 'react';\nimport { Alert } from 'react-native';\nimport { Subscription } from '../../shared/types';\nimport { ERROR_MESSAGES } from '../../shared/constants';\nimport { validateStripeId } from '../../shared/utils/validation';\n\ninterface UseSubscriptionOptions {\n  customerId?: string;\n  subscriptionId?: string;\n  autoFetch?: boolean;\n  onError?: (error: string) => void;\n  showErrorAlert?: boolean;\n}\n\ninterface UseSubscriptionReturn {\n  subscription: Subscription | null;\n  subscriptions: Subscription[];\n  loading: boolean;\n  error: string | null;\n  // Backward compatibility getters\n  isLoading: boolean; // Maps to loading\n  isError: boolean; // Maps to !!error\n  refetch: () => Promise<void>;\n  cancel: (subscriptionId?: string) => Promise<boolean>;\n  reactivate: (subscriptionId?: string) => Promise<boolean>;\n  updatePaymentMethod: (\n    subscriptionId: string,\n    paymentMethodId: string\n  ) => Promise<boolean>;\n}\n\nexport const useSubscription = (\n  options: UseSubscriptionOptions = {}\n): UseSubscriptionReturn => {\n  const {\n    customerId,\n    subscriptionId,\n    autoFetch = true,\n    onError,\n    showErrorAlert = true,\n  } = options;\n\n  const [subscription, setSubscription] = useState<Subscription | null>(null);\n  const [subscriptions, setSubscriptions] = useState<Subscription[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const handleError = useCallback(\n    (errorMessage: string) => {\n      setError(errorMessage);\n      onError?.(errorMessage);\n\n      if (showErrorAlert) {\n        Alert.alert('Subscription Error', errorMessage);\n      }\n\n      console.error('Subscription error:', errorMessage);\n    },\n    [onError, showErrorAlert]\n  );\n\n  const fetchSubscription = useCallback(\n    async (id: string) => {\n      if (!validateStripeId(id, 'subscription')) {\n        handleError('Invalid subscription ID');\n        return null;\n      }\n\n      try {\n        const response = await fetch(`/api/payments/subscription/${id}`);\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(\n            errorData.error || ERROR_MESSAGES.SUBSCRIPTION_NOT_FOUND\n          );\n        }\n\n        const data = await response.json();\n        return data;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : ERROR_MESSAGES.SUBSCRIPTION_NOT_FOUND;\n        handleError(errorMessage);\n        return null;\n      }\n    },\n    [handleError]\n  );\n\n  const fetchCustomerSubscriptions = useCallback(\n    async (id: string) => {\n      if (!validateStripeId(id, 'customer')) {\n        handleError('Invalid customer ID');\n        return [];\n      }\n\n      try {\n        const response = await fetch(\n          `/api/payments/customer/${id}/subscriptions`\n        );\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || ERROR_MESSAGES.CUSTOMER_NOT_FOUND);\n        }\n\n        const data = await response.json();\n        return data.subscriptions || [];\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : ERROR_MESSAGES.CUSTOMER_NOT_FOUND;\n        handleError(errorMessage);\n        return [];\n      }\n    },\n    [handleError]\n  );\n\n  const refetch = useCallback(async () => {\n    if (!customerId && !subscriptionId) {\n      handleError('Either customerId or subscriptionId is required');\n      return;\n    }\n\n    setLoading(true);\n    setError(null);\n\n    try {\n      if (subscriptionId) {\n        const sub = await fetchSubscription(subscriptionId);\n        setSubscription(sub);\n      }\n\n      if (customerId) {\n        const subs = await fetchCustomerSubscriptions(customerId);\n        setSubscriptions(subs);\n\n        // If no specific subscription ID, set the first active subscription\n        if (!subscriptionId && subs.length > 0) {\n          const activeSub =\n            subs.find((s: Subscription) => s.status === 'active') || subs[0];\n          setSubscription(activeSub);\n        }\n      }\n    } finally {\n      setLoading(false);\n    }\n  }, [\n    customerId,\n    subscriptionId,\n    fetchSubscription,\n    fetchCustomerSubscriptions,\n    handleError,\n  ]);\n\n  const cancel = useCallback(\n    async (targetSubscriptionId?: string): Promise<boolean> => {\n      const idToCancel = targetSubscriptionId || subscriptionId;\n\n      if (!idToCancel) {\n        handleError('Subscription ID is required to cancel');\n        return false;\n      }\n\n      if (!validateStripeId(idToCancel, 'subscription')) {\n        handleError('Invalid subscription ID');\n        return false;\n      }\n\n      return new Promise(resolve => {\n        Alert.alert(\n          'Cancel Subscription',\n          'Are you sure you want to cancel your subscription? It will remain active until the end of your current billing period.',\n          [\n            {\n              text: 'Keep Subscription',\n              style: 'cancel',\n              onPress: () => resolve(false),\n            },\n            {\n              text: 'Cancel Subscription',\n              style: 'destructive',\n              onPress: async () => {\n                try {\n                  const response = await fetch(\n                    `/api/payments/subscription/${idToCancel}/cancel`,\n                    {\n                      method: 'POST',\n                      headers: { 'Content-Type': 'application/json' },\n                    }\n                  );\n\n                  if (!response.ok) {\n                    const errorData = await response\n                      .json()\n                      .catch(() => ({ error: 'Network error' }));\n                    throw new Error(\n                      errorData.error || 'Failed to cancel subscription'\n                    );\n                  }\n\n                  await refetch(); // Refresh data\n                  Alert.alert(\n                    'Success',\n                    'Your subscription has been cancelled and will end at the end of your current billing period.'\n                  );\n                  resolve(true);\n                } catch (err) {\n                  const errorMessage =\n                    err instanceof Error\n                      ? err.message\n                      : 'Failed to cancel subscription';\n                  handleError(errorMessage);\n                  resolve(false);\n                }\n              },\n            },\n          ]\n        );\n      });\n    },\n    [subscriptionId, refetch, handleError]\n  );\n\n  const reactivate = useCallback(\n    async (targetSubscriptionId?: string): Promise<boolean> => {\n      const idToReactivate = targetSubscriptionId || subscriptionId;\n\n      if (!idToReactivate) {\n        handleError('Subscription ID is required to reactivate');\n        return false;\n      }\n\n      if (!validateStripeId(idToReactivate, 'subscription')) {\n        handleError('Invalid subscription ID');\n        return false;\n      }\n\n      try {\n        const response = await fetch(\n          `/api/payments/subscription/${idToReactivate}/reactivate`,\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n          }\n        );\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(\n            errorData.error || 'Failed to reactivate subscription'\n          );\n        }\n\n        await refetch(); // Refresh data\n        Alert.alert('Success', 'Your subscription has been reactivated!');\n        return true;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : 'Failed to reactivate subscription';\n        handleError(errorMessage);\n        return false;\n      }\n    },\n    [subscriptionId, refetch, handleError]\n  );\n\n  const updatePaymentMethod = useCallback(\n    async (\n      targetSubscriptionId: string,\n      paymentMethodId: string\n    ): Promise<boolean> => {\n      if (!validateStripeId(targetSubscriptionId, 'subscription')) {\n        handleError('Invalid subscription ID');\n        return false;\n      }\n\n      try {\n        const response = await fetch(\n          `/api/payments/subscription/${targetSubscriptionId}/payment-method`,\n          {\n            method: 'PUT',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ paymentMethodId }),\n          }\n        );\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || 'Failed to update payment method');\n        }\n\n        await refetch(); // Refresh data\n        Alert.alert('Success', 'Payment method updated successfully!');\n        return true;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : 'Failed to update payment method';\n        handleError(errorMessage);\n        return false;\n      }\n    },\n    [refetch, handleError]\n  );\n\n  useEffect(() => {\n    if (autoFetch && (customerId || subscriptionId)) {\n      refetch();\n    }\n  }, [autoFetch, customerId, subscriptionId, refetch]);\n\n  return {\n    subscription,\n    subscriptions,\n    loading,\n    error,\n    // Backward compatibility getters\n    isLoading: loading,\n    isError: !!error,\n    refetch,\n    cancel,\n    reactivate,\n    updatePaymentMethod,\n  };\n};\n","import { useState, useCallback } from 'react';\nimport { Alert } from 'react-native';\nimport { useStripe } from '@stripe/stripe-react-native';\nimport { usePaymentsContext } from '../providers/PaymentsProvider';\nimport { ERROR_MESSAGES } from '../../shared/constants';\nimport { validateStripeId, validateEmail } from '../../shared/utils/validation';\nimport { PaymentIntent } from '@stripe/stripe-react-native';\n\ntype CheckoutResult =\n  | { type: 'subscription'; customerId: string }\n  | { type: 'payment'; paymentIntent: PaymentIntent.Result };\n\ninterface UseCheckoutOptions {\n  onSuccess?: (result: CheckoutResult) => void;\n  onError?: (error: string) => void;\n  onLoading?: (loading: boolean) => void;\n  showErrorAlert?: boolean;\n  showSuccessAlert?: boolean;\n}\n\ninterface UseCheckoutReturn {\n  loading: boolean;\n  error: string | null;\n  // Backward compatibility getters\n  isLoading: boolean; // Maps to loading\n  isError: boolean; // Maps to !!error\n  createSubscription: (params: {\n    priceId: string;\n    customerId?: string;\n    customerEmail?: string;\n    metadata?: Record<string, string>;\n    trialPeriodDays?: number;\n  }) => Promise<boolean>;\n  createPaymentIntent: (params: {\n    amount: number;\n    currency: string;\n    customerId?: string;\n    description?: string;\n    metadata?: Record<string, string>;\n  }) => Promise<string | null>;\n  processPayment: (\n    clientSecret: string,\n    billingDetails?: {\n      email?: string;\n      name?: string;\n      phone?: string;\n    }\n  ) => Promise<boolean>;\n}\n\nexport const useCheckout = (\n  options: UseCheckoutOptions = {}\n): UseCheckoutReturn => {\n  const {\n    onSuccess,\n    onError,\n    onLoading,\n    showErrorAlert = true,\n    showSuccessAlert = true,\n  } = options;\n\n  const { initPaymentSheet, presentPaymentSheet, confirmPayment } = useStripe();\n  const { initialized } = usePaymentsContext();\n\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const handleError = useCallback(\n    (errorMessage: string) => {\n      setError(errorMessage);\n      onError?.(errorMessage);\n\n      if (showErrorAlert) {\n        Alert.alert('Payment Error', errorMessage);\n      }\n\n      console.error('Checkout error:', errorMessage);\n    },\n    [onError, showErrorAlert]\n  );\n\n  const handleSuccess = useCallback(\n    (result: CheckoutResult) => {\n      onSuccess?.(result);\n\n      if (showSuccessAlert) {\n        Alert.alert('Success', 'Payment completed successfully!');\n      }\n    },\n    [onSuccess, showSuccessAlert]\n  );\n\n  const createSubscription = useCallback(\n    async (params: {\n      priceId: string;\n      customerId?: string;\n      customerEmail?: string;\n      metadata?: Record<string, string>;\n      trialPeriodDays?: number;\n    }): Promise<boolean> => {\n      if (!initialized) {\n        handleError(ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED);\n        return false;\n      }\n\n      if (!validateStripeId(params.priceId, 'price')) {\n        handleError(ERROR_MESSAGES.INVALID_PRICE_ID);\n        return false;\n      }\n\n      if (\n        params.customerId &&\n        !validateStripeId(params.customerId, 'customer')\n      ) {\n        handleError(ERROR_MESSAGES.INVALID_CUSTOMER_ID);\n        return false;\n      }\n\n      if (params.customerEmail && !validateEmail(params.customerEmail)) {\n        handleError('Invalid customer email');\n        return false;\n      }\n\n      setLoading(true);\n      setError(null);\n      onLoading?.(true);\n\n      try {\n        // Create subscription setup on server\n        const response = await fetch(\n          '/api/payments/create-subscription-setup',\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(params),\n          }\n        );\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(\n            errorData.error || 'Failed to create subscription setup'\n          );\n        }\n\n        const {\n          setupIntentClientSecret,\n          customerId: returnedCustomerId,\n          customerEphemeralKeySecret,\n        } = await response.json();\n\n        if (!setupIntentClientSecret) {\n          throw new Error('No setup intent client secret returned from server');\n        }\n\n        // Initialize the payment sheet\n        const { error: initError } = await initPaymentSheet({\n          setupIntentClientSecret,\n          customerId: returnedCustomerId,\n          customerEphemeralKeySecret,\n          merchantDisplayName: 'Your App Name', // TODO: Make this configurable\n          allowsDelayedPaymentMethods: true,\n        });\n\n        if (initError) {\n          throw new Error(\n            initError.message || 'Failed to initialize payment sheet'\n          );\n        }\n\n        // Present the payment sheet\n        const { error: presentError } = await presentPaymentSheet();\n\n        if (presentError) {\n          // User cancelled or error occurred\n          if (presentError.code === 'Canceled') {\n            return false; // User cancelled, don't show error\n          }\n          throw new Error(\n            presentError.message || ERROR_MESSAGES.PAYMENT_FAILED\n          );\n        }\n\n        // Payment successful\n        handleSuccess({ type: 'subscription', customerId: returnedCustomerId });\n        return true;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error ? err.message : 'Failed to create subscription';\n        handleError(errorMessage);\n        return false;\n      } finally {\n        setLoading(false);\n        onLoading?.(false);\n      }\n    },\n    [\n      initialized,\n      initPaymentSheet,\n      presentPaymentSheet,\n      handleError,\n      handleSuccess,\n      onLoading,\n    ]\n  );\n\n  const createPaymentIntent = useCallback(\n    async (params: {\n      amount: number;\n      currency: string;\n      customerId?: string;\n      description?: string;\n      metadata?: Record<string, string>;\n    }): Promise<string | null> => {\n      if (!initialized) {\n        handleError(ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED);\n        return null;\n      }\n\n      if (params.amount <= 0) {\n        handleError('Amount must be greater than 0');\n        return null;\n      }\n\n      if (\n        params.customerId &&\n        !validateStripeId(params.customerId, 'customer')\n      ) {\n        handleError(ERROR_MESSAGES.INVALID_CUSTOMER_ID);\n        return null;\n      }\n\n      setLoading(true);\n      setError(null);\n      onLoading?.(true);\n\n      try {\n        const response = await fetch('/api/payments/create-payment-intent', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(params),\n        });\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || 'Failed to create payment intent');\n        }\n\n        const { client_secret } = await response.json();\n\n        if (!client_secret) {\n          throw new Error('No client secret returned from server');\n        }\n\n        return client_secret;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : 'Failed to create payment intent';\n        handleError(errorMessage);\n        return null;\n      } finally {\n        setLoading(false);\n        onLoading?.(false);\n      }\n    },\n    [initialized, handleError, onLoading]\n  );\n\n  const processPayment = useCallback(\n    async (\n      clientSecret: string,\n      billingDetails?: {\n        email?: string;\n        name?: string;\n        phone?: string;\n      }\n    ): Promise<boolean> => {\n      if (!initialized) {\n        handleError(ERROR_MESSAGES.PROVIDER_NOT_CONFIGURED);\n        return false;\n      }\n\n      if (billingDetails?.email && !validateEmail(billingDetails.email)) {\n        handleError('Invalid email address');\n        return false;\n      }\n\n      setLoading(true);\n      setError(null);\n      onLoading?.(true);\n\n      try {\n        const { error, paymentIntent } = await confirmPayment(clientSecret, {\n          paymentMethodType: 'Card',\n          paymentMethodData: {\n            billingDetails,\n          },\n        });\n\n        if (error) {\n          throw new Error(error.message || ERROR_MESSAGES.PAYMENT_FAILED);\n        }\n\n        if (paymentIntent?.status === 'Succeeded') {\n          handleSuccess({ type: 'payment', paymentIntent });\n          return true;\n        } else {\n          throw new Error('Payment was not completed');\n        }\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error ? err.message : ERROR_MESSAGES.PAYMENT_FAILED;\n        handleError(errorMessage);\n        return false;\n      } finally {\n        setLoading(false);\n        onLoading?.(false);\n      }\n    },\n    [initialized, confirmPayment, handleError, handleSuccess, onLoading]\n  );\n\n  return {\n    loading,\n    error,\n    // Backward compatibility getters\n    isLoading: loading,\n    isError: !!error,\n    createSubscription,\n    createPaymentIntent,\n    processPayment,\n  };\n};\n","import { useState, useEffect, useCallback } from 'react';\nimport { Alert } from 'react-native';\nimport { Customer, PaymentMethod } from '../../shared/types';\nimport { ERROR_MESSAGES } from '../../shared/constants';\nimport { validateStripeId, validateEmail } from '../../shared/utils/validation';\n\ninterface UseCustomerOptions {\n  customerId?: string;\n  autoFetch?: boolean;\n  onError?: (error: string) => void;\n  showErrorAlert?: boolean;\n  showSuccessAlert?: boolean;\n}\n\ninterface UseCustomerReturn {\n  customer: Customer | null;\n  paymentMethods: PaymentMethod[];\n  loading: boolean;\n  error: string | null;\n  // Backward compatibility getters\n  isLoading: boolean; // Maps to loading\n  isError: boolean; // Maps to !!error\n  refetch: () => Promise<void>;\n  createCustomer: (params: {\n    email: string;\n    name?: string;\n    phone?: string;\n    metadata?: Record<string, string>;\n  }) => Promise<Customer | null>;\n  updateCustomer: (params: {\n    email?: string;\n    name?: string;\n    phone?: string;\n    metadata?: Record<string, string>;\n  }) => Promise<boolean>;\n  deleteCustomer: () => Promise<boolean>;\n  fetchPaymentMethods: () => Promise<PaymentMethod[]>;\n  addPaymentMethod: (paymentMethodId: string) => Promise<boolean>;\n  removePaymentMethod: (paymentMethodId: string) => Promise<boolean>;\n  setDefaultPaymentMethod: (paymentMethodId: string) => Promise<boolean>;\n}\n\nexport const useCustomer = (\n  options: UseCustomerOptions = {}\n): UseCustomerReturn => {\n  const {\n    customerId,\n    autoFetch = true,\n    onError,\n    showErrorAlert = true,\n    showSuccessAlert = true,\n  } = options;\n\n  const [customer, setCustomer] = useState<Customer | null>(null);\n  const [paymentMethods, setPaymentMethods] = useState<PaymentMethod[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const handleError = useCallback(\n    (errorMessage: string) => {\n      setError(errorMessage);\n      onError?.(errorMessage);\n\n      if (showErrorAlert) {\n        Alert.alert('Customer Error', errorMessage);\n      }\n\n      console.error('Customer error:', errorMessage);\n    },\n    [onError, showErrorAlert]\n  );\n\n  const handleSuccess = useCallback(\n    (message: string) => {\n      if (showSuccessAlert) {\n        Alert.alert('Success', message);\n      }\n    },\n    [showSuccessAlert]\n  );\n\n  const fetchCustomer = useCallback(\n    async (id: string) => {\n      if (!validateStripeId(id, 'customer')) {\n        handleError('Invalid customer ID');\n        return null;\n      }\n\n      try {\n        const response = await fetch(`/api/payments/customer/${id}`);\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || ERROR_MESSAGES.CUSTOMER_NOT_FOUND);\n        }\n\n        const data = await response.json();\n        return data;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : ERROR_MESSAGES.CUSTOMER_NOT_FOUND;\n        handleError(errorMessage);\n        return null;\n      }\n    },\n    [handleError]\n  );\n\n  const refetch = useCallback(async () => {\n    if (!customerId) {\n      handleError('Customer ID is required');\n      return;\n    }\n\n    setLoading(true);\n    setError(null);\n\n    try {\n      const customerData = await fetchCustomer(customerId);\n      setCustomer(customerData);\n    } finally {\n      setLoading(false);\n    }\n  }, [customerId, fetchCustomer, handleError]);\n\n  const createCustomer = useCallback(\n    async (params: {\n      email: string;\n      name?: string;\n      phone?: string;\n      metadata?: Record<string, string>;\n    }): Promise<Customer | null> => {\n      if (!validateEmail(params.email)) {\n        handleError('Invalid email address');\n        return null;\n      }\n\n      setLoading(true);\n      setError(null);\n\n      try {\n        const response = await fetch('/api/payments/customer', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(params),\n        });\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || 'Failed to create customer');\n        }\n\n        const customerData = await response.json();\n        setCustomer(customerData);\n        handleSuccess('Customer created successfully!');\n        return customerData;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error ? err.message : 'Failed to create customer';\n        handleError(errorMessage);\n        return null;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [handleError, handleSuccess]\n  );\n\n  const updateCustomer = useCallback(\n    async (params: {\n      email?: string;\n      name?: string;\n      phone?: string;\n      metadata?: Record<string, string>;\n    }): Promise<boolean> => {\n      if (!customerId) {\n        handleError('Customer ID is required');\n        return false;\n      }\n\n      if (params.email && !validateEmail(params.email)) {\n        handleError('Invalid email address');\n        return false;\n      }\n\n      setLoading(true);\n      setError(null);\n\n      try {\n        const response = await fetch(`/api/payments/customer/${customerId}`, {\n          method: 'PUT',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(params),\n        });\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || 'Failed to update customer');\n        }\n\n        await refetch(); // Refresh customer data\n        handleSuccess('Customer updated successfully!');\n        return true;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error ? err.message : 'Failed to update customer';\n        handleError(errorMessage);\n        return false;\n      } finally {\n        setLoading(false);\n      }\n    },\n    [customerId, refetch, handleError, handleSuccess]\n  );\n\n  const deleteCustomer = useCallback(async (): Promise<boolean> => {\n    if (!customerId) {\n      handleError('Customer ID is required');\n      return false;\n    }\n\n    return new Promise(resolve => {\n      Alert.alert(\n        'Delete Customer',\n        'Are you sure you want to delete this customer? This action cannot be undone.',\n        [\n          {\n            text: 'Cancel',\n            style: 'cancel',\n            onPress: () => resolve(false),\n          },\n          {\n            text: 'Delete',\n            style: 'destructive',\n            onPress: async () => {\n              setLoading(true);\n              setError(null);\n\n              try {\n                const response = await fetch(\n                  `/api/payments/customer/${customerId}`,\n                  {\n                    method: 'DELETE',\n                  }\n                );\n\n                if (!response.ok) {\n                  const errorData = await response\n                    .json()\n                    .catch(() => ({ error: 'Network error' }));\n                  throw new Error(\n                    errorData.error || 'Failed to delete customer'\n                  );\n                }\n\n                setCustomer(null);\n                setPaymentMethods([]);\n                handleSuccess('Customer deleted successfully!');\n                resolve(true);\n              } catch (err) {\n                const errorMessage =\n                  err instanceof Error\n                    ? err.message\n                    : 'Failed to delete customer';\n                handleError(errorMessage);\n                resolve(false);\n              } finally {\n                setLoading(false);\n              }\n            },\n          },\n        ]\n      );\n    });\n  }, [customerId, handleError, handleSuccess]);\n\n  const fetchPaymentMethods = useCallback(async (): Promise<\n    PaymentMethod[]\n  > => {\n    if (!customerId) {\n      handleError('Customer ID is required');\n      return [];\n    }\n\n    try {\n      const response = await fetch(\n        `/api/payments/customer/${customerId}/payment-methods`\n      );\n\n      if (!response.ok) {\n        const errorData = await response\n          .json()\n          .catch(() => ({ error: 'Network error' }));\n        throw new Error(errorData.error || 'Failed to fetch payment methods');\n      }\n\n      const data = await response.json();\n      const methods = data.paymentMethods || [];\n      setPaymentMethods(methods);\n      return methods;\n    } catch (err) {\n      const errorMessage =\n        err instanceof Error ? err.message : 'Failed to fetch payment methods';\n      handleError(errorMessage);\n      return [];\n    }\n  }, [customerId, handleError]);\n\n  const addPaymentMethod = useCallback(\n    async (paymentMethodId: string): Promise<boolean> => {\n      if (!customerId) {\n        handleError('Customer ID is required');\n        return false;\n      }\n\n      try {\n        const response = await fetch(\n          `/api/payments/customer/${customerId}/payment-methods`,\n          {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ paymentMethodId }),\n          }\n        );\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(errorData.error || 'Failed to add payment method');\n        }\n\n        await fetchPaymentMethods(); // Refresh payment methods\n        handleSuccess('Payment method added successfully!');\n        return true;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error ? err.message : 'Failed to add payment method';\n        handleError(errorMessage);\n        return false;\n      }\n    },\n    [customerId, fetchPaymentMethods, handleError, handleSuccess]\n  );\n\n  const removePaymentMethod = useCallback(\n    async (paymentMethodId: string): Promise<boolean> => {\n      if (!customerId) {\n        handleError('Customer ID is required');\n        return false;\n      }\n\n      return new Promise(resolve => {\n        Alert.alert(\n          'Remove Payment Method',\n          'Are you sure you want to remove this payment method?',\n          [\n            {\n              text: 'Cancel',\n              style: 'cancel',\n              onPress: () => resolve(false),\n            },\n            {\n              text: 'Remove',\n              style: 'destructive',\n              onPress: async () => {\n                try {\n                  const response = await fetch(\n                    `/api/payments/customer/${customerId}/payment-methods/${paymentMethodId}`,\n                    {\n                      method: 'DELETE',\n                    }\n                  );\n\n                  if (!response.ok) {\n                    const errorData = await response\n                      .json()\n                      .catch(() => ({ error: 'Network error' }));\n                    throw new Error(\n                      errorData.error || 'Failed to remove payment method'\n                    );\n                  }\n\n                  await fetchPaymentMethods(); // Refresh payment methods\n                  handleSuccess('Payment method removed successfully!');\n                  resolve(true);\n                } catch (err) {\n                  const errorMessage =\n                    err instanceof Error\n                      ? err.message\n                      : 'Failed to remove payment method';\n                  handleError(errorMessage);\n                  resolve(false);\n                }\n              },\n            },\n          ]\n        );\n      });\n    },\n    [customerId, fetchPaymentMethods, handleError, handleSuccess]\n  );\n\n  const setDefaultPaymentMethod = useCallback(\n    async (paymentMethodId: string): Promise<boolean> => {\n      if (!customerId) {\n        handleError('Customer ID is required');\n        return false;\n      }\n\n      try {\n        const response = await fetch(\n          `/api/payments/customer/${customerId}/default-payment-method`,\n          {\n            method: 'PUT',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ paymentMethodId }),\n          }\n        );\n\n        if (!response.ok) {\n          const errorData = await response\n            .json()\n            .catch(() => ({ error: 'Network error' }));\n          throw new Error(\n            errorData.error || 'Failed to set default payment method'\n          );\n        }\n\n        await Promise.all([refetch(), fetchPaymentMethods()]); // Refresh both customer and payment methods\n        handleSuccess('Default payment method updated successfully!');\n        return true;\n      } catch (err) {\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : 'Failed to set default payment method';\n        handleError(errorMessage);\n        return false;\n      }\n    },\n    [customerId, refetch, fetchPaymentMethods, handleError, handleSuccess]\n  );\n\n  useEffect(() => {\n    if (autoFetch && customerId) {\n      refetch();\n      fetchPaymentMethods();\n    }\n  }, [autoFetch, customerId, refetch, fetchPaymentMethods]);\n\n  return {\n    customer,\n    paymentMethods,\n    loading,\n    error,\n    // Backward compatibility getters\n    isLoading: loading,\n    isError: !!error,\n    refetch,\n    createCustomer,\n    updateCustomer,\n    deleteCustomer,\n    fetchPaymentMethods,\n    addPaymentMethod,\n    removePaymentMethod,\n    setDefaultPaymentMethod,\n  };\n};\n","import { PaymentsConfig, Customer, Subscription } from '../../shared/types';\nimport { ERROR_MESSAGES } from '../../shared/constants';\n\nexport const createSubscriptionSetup = async (params: {\n  priceId: string;\n  customerId?: string;\n  customerEmail?: string;\n  metadata?: Record<string, string>;\n  trialPeriodDays?: number;\n}): Promise<\n  | {\n      setupIntentClientSecret: string;\n      customerId: string;\n      customerEphemeralKeySecret: string;\n    }\n  | { error: string }\n> => {\n  try {\n    const response = await fetch('/api/payments/create-subscription-setup', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(params),\n    });\n\n    if (!response.ok) {\n      const errorData = await response\n        .json()\n        .catch(() => ({ error: 'Network error' }));\n      return {\n        error: errorData.error || 'Failed to create subscription setup',\n      };\n    }\n\n    const data = await response.json();\n    return {\n      setupIntentClientSecret: data.setupIntentClientSecret,\n      customerId: data.customerId,\n      customerEphemeralKeySecret: data.customerEphemeralKeySecret,\n    };\n  } catch (error) {\n    return {\n      error:\n        error instanceof Error\n          ? error.message\n          : 'Failed to create subscription setup',\n    };\n  }\n};\n\nexport const createPaymentIntent = async (params: {\n  amount: number;\n  currency: string;\n  customerId?: string;\n  description?: string;\n  metadata?: Record<string, string>;\n}): Promise<{ clientSecret: string } | { error: string }> => {\n  try {\n    const response = await fetch('/api/payments/create-payment-intent', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(params),\n    });\n\n    if (!response.ok) {\n      const errorData = await response\n        .json()\n        .catch(() => ({ error: 'Network error' }));\n      return { error: errorData.error || 'Failed to create payment intent' };\n    }\n\n    const data = await response.json();\n    return { clientSecret: data.client_secret };\n  } catch (error) {\n    return {\n      error:\n        error instanceof Error\n          ? error.message\n          : 'Failed to create payment intent',\n    };\n  }\n};\n\nexport const validatePaymentsConfig = (\n  config: PaymentsConfig\n): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  if (!config.publishableKey) {\n    errors.push('publishableKey is required');\n  }\n\n  if (!config.provider) {\n    errors.push('provider is required');\n  }\n\n  if (config.provider !== 'stripe') {\n    errors.push('Only stripe provider is currently supported');\n  }\n\n  if (!config.environment) {\n    errors.push('environment is required');\n  }\n\n  if (\n    config.environment &&\n    !['development', 'production'].includes(config.environment)\n  ) {\n    errors.push('environment must be either \"development\" or \"production\"');\n  }\n\n  if (config.publishableKey && !config.publishableKey.startsWith('pk_')) {\n    errors.push('publishableKey must start with \"pk_\"');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\nexport const formatStripeError = (error: unknown): string => {\n  if (typeof error === 'string') {\n    return error;\n  }\n\n  if (typeof error === 'object' && error !== null) {\n    if (\n      'message' in error &&\n      typeof (error as { message: unknown }).message === 'string'\n    ) {\n      return (error as { message: string }).message;\n    }\n\n    if (\n      'code' in error &&\n      typeof (error as { code: unknown }).code === 'string'\n    ) {\n      const code = (error as { code: string }).code;\n      const errorMessages: Record<string, string> = {\n        Canceled: 'Payment was cancelled',\n        Failed: 'Payment failed',\n        card_declined: 'Your card was declined.',\n        expired_card: 'Your card has expired.',\n        incorrect_cvc: \"Your card's security code is incorrect.\",\n        processing_error: 'An error occurred while processing your card.',\n        incorrect_number: 'Your card number is incorrect.',\n      };\n      return errorMessages[code] || `Payment failed: ${code}`;\n    }\n  }\n\n  return 'An unexpected error occurred.';\n};\n\nexport const createCustomer = async (params: {\n  email: string;\n  name?: string;\n  phone?: string;\n  metadata?: Record<string, string>;\n}): Promise<{ customer: Customer } | { error: string }> => {\n  try {\n    const response = await fetch('/api/payments/customer', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(params),\n    });\n\n    if (!response.ok) {\n      const errorData = await response\n        .json()\n        .catch(() => ({ error: 'Network error' }));\n      return { error: errorData.error || 'Failed to create customer' };\n    }\n\n    const customer = await response.json();\n    return { customer };\n  } catch (error) {\n    return {\n      error:\n        error instanceof Error ? error.message : 'Failed to create customer',\n    };\n  }\n};\n\nexport const fetchSubscription = async (\n  subscriptionId: string\n): Promise<{ subscription: Subscription } | { error: string }> => {\n  try {\n    const response = await fetch(\n      `/api/payments/subscription/${subscriptionId}`\n    );\n\n    if (!response.ok) {\n      const errorData = await response\n        .json()\n        .catch(() => ({ error: 'Network error' }));\n      return {\n        error: errorData.error || ERROR_MESSAGES.SUBSCRIPTION_NOT_FOUND,\n      };\n    }\n\n    const subscription = await response.json();\n    return { subscription };\n  } catch (error) {\n    return {\n      error:\n        error instanceof Error\n          ? error.message\n          : ERROR_MESSAGES.SUBSCRIPTION_NOT_FOUND,\n    };\n  }\n};\n\nexport const fetchCustomerSubscriptions = async (\n  customerId: string\n): Promise<{ subscriptions: Subscription[] } | { error: string }> => {\n  try {\n    const response = await fetch(\n      `/api/payments/customer/${customerId}/subscriptions`\n    );\n\n    if (!response.ok) {\n      const errorData = await response\n        .json()\n        .catch(() => ({ error: 'Network error' }));\n      return { error: errorData.error || ERROR_MESSAGES.CUSTOMER_NOT_FOUND };\n    }\n\n    const data = await response.json();\n    return { subscriptions: data.subscriptions || [] };\n  } catch (error) {\n    return {\n      error:\n        error instanceof Error\n          ? error.message\n          : ERROR_MESSAGES.CUSTOMER_NOT_FOUND,\n    };\n  }\n};\n\nexport const cancelSubscription = async (\n  subscriptionId: string\n): Promise<{ success: boolean; error?: string }> => {\n  try {\n    const response = await fetch(\n      `/api/payments/subscription/${subscriptionId}/cancel`,\n      {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n      }\n    );\n\n    if (!response.ok) {\n      const errorData = await response\n        .json()\n        .catch(() => ({ error: 'Network error' }));\n      return {\n        success: false,\n        error: errorData.error || 'Failed to cancel subscription',\n      };\n    }\n\n    return { success: true };\n  } catch (error) {\n    return {\n      success: false,\n      error:\n        error instanceof Error\n          ? error.message\n          : 'Failed to cancel subscription',\n    };\n  }\n};\n"],"mappings":"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","names":["useState","createCustomer","cancelSubscription","jsx","useState","Text","StyleSheet","jsx","jsxs","styles","Text","StyleSheet","useState","View","Text","TouchableOpacity","StyleSheet","Alert","ActivityIndicator","ScrollView","useStripe","jsx","jsxs","useStripe","useState","Alert","styles","ScrollView","View","Text","TouchableOpacity","ActivityIndicator","StyleSheet","useStripe","View","StyleSheet","Alert","jsx","useStripe","error","Alert","View","styles","StyleSheet","useState","useEffect","View","Text","StyleSheet","TouchableOpacity","ScrollView","Alert","jsx","jsxs","useState","useEffect","Alert","View","styles","Text","ScrollView","TouchableOpacity","StyleSheet","useState","View","Text","StyleSheet","TouchableOpacity","Alert","Platform","useStripe","jsx","jsxs","amount","currency","styles","View","Text","StyleSheet","jsx","jsxs","styles","useState","useEffect","useCallback","Alert","useState","useCallback","Alert","fetchSubscription","fetchCustomerSubscriptions","useEffect","useState","useCallback","Alert","useStripe","useStripe","useState","useCallback","Alert","createPaymentIntent","error","useState","useEffect","useCallback","Alert","useState","useCallback","Alert","createCustomer","useEffect"]}