@bloonio/lokotro-pay 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +585 -0
- package/fesm2022/bloonio-lokotro-pay.mjs +5387 -0
- package/fesm2022/bloonio-lokotro-pay.mjs.map +1 -0
- package/index.d.ts +1640 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bloonio-lokotro-pay.mjs","sources":["../../../projects/lokotro-pay/src/lib/constants/environment.ts","../../../projects/lokotro-pay/src/lib/enums/index.ts","../../../projects/lokotro-pay/src/lib/services/lokotro-localization.service.ts","../../../projects/lokotro-pay/src/lib/components/payment-method-selection/payment-method-selection.component.ts","../../../projects/lokotro-pay/src/lib/models/country.ts","../../../projects/lokotro-pay/src/lib/services/lokotro-http-client.service.ts","../../../projects/lokotro-pay/src/lib/services/lokotro-country.service.ts","../../../projects/lokotro-pay/src/lib/components/mobile-money-phone-input/mobile-money-phone-input.component.ts","../../../projects/lokotro-pay/src/lib/components/payment-form/payment-form.component.ts","../../../projects/lokotro-pay/src/lib/services/lokotro-payment.service.ts","../../../projects/lokotro-pay/src/lib/components/bank-transfer-form/bank-transfer-form.component.ts","../../../projects/lokotro-pay/src/lib/components/otp-verification/otp-verification.component.ts","../../../projects/lokotro-pay/src/lib/components/processing/processing.component.ts","../../../projects/lokotro-pay/src/lib/components/result/result.component.ts","../../../projects/lokotro-pay/src/lib/components/loading/loading.component.ts","../../../projects/lokotro-pay/src/lib/components/checkout/checkout.component.ts","../../../projects/lokotro-pay/src/lib/lokotro-pay.module.ts","../../../projects/lokotro-pay/src/lib/models/index.ts","../../../projects/lokotro-pay/src/lib/constants/colors.ts","../../../projects/lokotro-pay/src/lib/components/payment-status/payment-status.component.ts","../../../projects/lokotro-pay/src/public-api.ts","../../../projects/lokotro-pay/src/bloonio-lokotro-pay.ts"],"sourcesContent":["/**\n * Lokotro Pay - Environment Configuration\n * Angular version of the Flutter Lokotro Pay plugin environment\n */\n\nexport interface LokotroPayEnvironment {\n environment: 'development' | 'production';\n apiBaseUrl: string;\n paymentApiVersion: string;\n debugMode: boolean;\n logLevel: 'debug' | 'info' | 'warn' | 'error';\n timeoutSeconds: number;\n}\n\n/**\n * Development environment configuration\n */\nexport const LOKOTRO_DEV_ENV: LokotroPayEnvironment = {\n environment: 'development',\n apiBaseUrl: 'https://dev.apps.api.bloonio.com',\n paymentApiVersion: 'v1',\n debugMode: true,\n logLevel: 'debug',\n timeoutSeconds: 30\n};\n\n/**\n * Production environment configuration\n */\nexport const LOKOTRO_PROD_ENV: LokotroPayEnvironment = {\n environment: 'production',\n apiBaseUrl: 'https://apps.api.bloonio.com',\n paymentApiVersion: 'v1',\n debugMode: false,\n logLevel: 'error',\n timeoutSeconds: 30\n};\n\n/**\n * Environment configuration helper\n */\nexport class LokotroPayEnv {\n private static _config: LokotroPayEnvironment = LOKOTRO_DEV_ENV;\n private static _isInitialized = false;\n private static _customApiUrl?: string;\n\n /**\n * Initialize the environment configuration\n */\n static initialize(isProduction: boolean = false, customApiUrl?: string): void {\n this._config = isProduction ? LOKOTRO_PROD_ENV : LOKOTRO_DEV_ENV;\n this._customApiUrl = customApiUrl;\n this._isInitialized = true;\n }\n\n /**\n * Get current environment\n */\n static get environment(): string {\n return this._config.environment;\n }\n\n /**\n * Check if running in production\n */\n static get isProduction(): boolean {\n return this._config.environment === 'production';\n }\n\n /**\n * Check if running in development\n */\n static get isDevelopment(): boolean {\n return this._config.environment === 'development';\n }\n\n /**\n * Get API base URL\n */\n static get apiBaseUrl(): string {\n return this._customApiUrl || this._config.apiBaseUrl;\n }\n\n /**\n * Get payment API version\n */\n static get paymentApiVersion(): string {\n return this._config.paymentApiVersion;\n }\n\n /**\n * Get full payment API URL\n */\n static get paymentApiUrl(): string {\n let baseUrl = this.apiBaseUrl;\n // Remove trailing slash if present\n if (baseUrl.endsWith('/')) {\n baseUrl = baseUrl.slice(0, -1);\n }\n\n const versionPath = `/api/${this.paymentApiVersion}`;\n\n // Avoid double /api/v1 if custom URL already includes it\n if (baseUrl.endsWith(versionPath)) {\n return baseUrl;\n }\n\n return `${baseUrl}${versionPath}`;\n }\n\n /**\n * Check if debug mode is enabled\n */\n static get debugMode(): boolean {\n return this._config.debugMode;\n }\n\n /**\n * Get log level\n */\n static get logLevel(): string {\n return this._config.logLevel;\n }\n\n /**\n * Get request timeout in seconds\n */\n static get timeoutSeconds(): number {\n return this._config.timeoutSeconds;\n }\n\n /**\n * Get request timeout in milliseconds\n */\n static get timeoutMs(): number {\n return this._config.timeoutSeconds * 1000;\n }\n\n /**\n * API endpoints\n */\n static get endpoints() {\n return {\n collect: '/payments/collect',\n transaction: '/payments/transaction',\n submit: '/payments/submit',\n verifyOtp: '/payments/verify-otp',\n resendOtp: '/payments/resend-otp',\n fetchPaymentInfo: '/fetch-payment-info',\n processPayment: '/process-payment',\n verifyPayment: '/verify-payment',\n cancelPayment: '/cancel-payment'\n };\n }\n\n /**\n * Build full endpoint URL\n */\n static buildEndpoint(endpoint: string): string {\n return `${this.paymentApiUrl}${endpoint}`;\n }\n\n /**\n * Default headers for API requests\n */\n static get defaultHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-API-Version': this.paymentApiVersion,\n 'X-Client': 'lokotro-pay-angular'\n };\n }\n\n /**\n * Build headers with authorization token\n */\n static buildAuthHeaders(token: string): Record<string, string> {\n return {\n ...this.defaultHeaders,\n 'Authorization': `Bearer ${token}`\n };\n }\n\n /**\n * Validate environment configuration\n */\n static validateConfiguration(): boolean {\n if (!this._isInitialized) return false;\n return this.apiBaseUrl.length > 0 && this.paymentApiVersion.length > 0;\n }\n\n /**\n * Get configuration summary for debugging\n */\n static getConfigSummary(): Record<string, unknown> {\n return {\n environment: this.environment,\n isProduction: this.isProduction,\n apiBaseUrl: this.apiBaseUrl,\n paymentApiVersion: this.paymentApiVersion,\n debugMode: this.debugMode,\n logLevel: this.logLevel,\n timeoutSeconds: this.timeoutSeconds,\n isInitialized: this._isInitialized,\n isValid: this.validateConfiguration()\n };\n }\n\n /**\n * Reset configuration\n */\n static reset(): void {\n this._config = LOKOTRO_DEV_ENV;\n this._customApiUrl = undefined;\n this._isInitialized = false;\n }\n}\n","/**\n * Lokotro Pay - Enums\n * Angular version of the Flutter Lokotro Pay plugin enums\n */\n\n/**\n * Payment channel types supported by Lokotro Pay\n */\nexport enum LokotroPayChannel {\n None = 'none',\n All = 'all',\n EFlash = 'eflash',\n EWallet = 'ewallet',\n Card = 'card',\n MobileMoney = 'mobileMoney',\n EWalletOtp = 'ewalletOtp',\n LokotroWallet = 'lokotroWallet',\n VirtualCard = 'virtualCard',\n BankTransfer = 'bankTransfer'\n}\n\n/**\n * Payment channel display names and icons\n */\nexport const LokotroPayChannelInfo: Record<LokotroPayChannel, { displayName: string; iconPath: string }> = {\n [LokotroPayChannel.None]: { displayName: 'None', iconPath: 'assets/icons/none.svg' },\n [LokotroPayChannel.All]: { displayName: 'All Methods', iconPath: 'assets/icons/all_methods.svg' },\n [LokotroPayChannel.EFlash]: { displayName: 'E-Flash', iconPath: 'assets/icons/eflash.svg' },\n [LokotroPayChannel.EWallet]: { displayName: 'E-Wallet', iconPath: 'assets/icons/ewallet.svg' },\n [LokotroPayChannel.Card]: { displayName: 'Payment Card', iconPath: 'assets/icons/card.svg' },\n [LokotroPayChannel.MobileMoney]: { displayName: 'Mobile Money', iconPath: 'assets/icons/mobile_money.svg' },\n [LokotroPayChannel.EWalletOtp]: { displayName: 'E-Wallet OTP', iconPath: 'assets/icons/ewallet_otp.svg' },\n [LokotroPayChannel.LokotroWallet]: { displayName: 'Lokotro Wallet', iconPath: 'assets/icons/lokotro_wallet.svg' },\n [LokotroPayChannel.VirtualCard]: { displayName: 'Virtual Card', iconPath: 'assets/icons/virtual_card.svg' },\n [LokotroPayChannel.BankTransfer]: { displayName: 'Bank Transfer', iconPath: 'assets/icons/bank_transfer.svg' }\n};\n\n/**\n * Form filling information status\n */\nexport enum LokotroPayFillingInfo {\n None = 'none',\n Full = 'full',\n Partial = 'partial'\n}\n\n/**\n * Local screen navigation states for enhanced UI flow\n */\nexport enum LokotroPayScreenNavigation {\n DefaultScreen = 'defaultScreen',\n LoadingScreen = 'loadingScreen',\n PaymentMethodSelectionScreen = 'paymentMethodSelectionScreen',\n PaymentFormScreen = 'paymentFormScreen',\n EWalletFormScreen = 'ewalletFormScreen',\n MobileMoneyFormScreen = 'mobilemoneyFormScreen',\n CardFormScreen = 'cardFormScreen',\n BankTransferFormScreen = 'bankTransferFormScreen',\n FlashFormScreen = 'flashFormScreen',\n PaymentConfirmationScreen = 'paymentConfirmationScreen',\n ProcessingScreen = 'processingScreen',\n MobileMoneyProcessingScreen = 'mobileMoneyProcessingScreen',\n EWalletOtpScreen = 'ewalletOtpScreen',\n SuccessScreen = 'successScreen',\n ErrorScreen = 'errorScreen',\n WarningScreen = 'warningScreen',\n InfoScreen = 'infoScreen'\n}\n\n/**\n * Screen navigation display names\n */\nexport const LokotroPayScreenNavigationInfo: Record<LokotroPayScreenNavigation, string> = {\n [LokotroPayScreenNavigation.DefaultScreen]: 'Default',\n [LokotroPayScreenNavigation.LoadingScreen]: 'Loading',\n [LokotroPayScreenNavigation.PaymentMethodSelectionScreen]: 'Payment Method Selection',\n [LokotroPayScreenNavigation.PaymentFormScreen]: 'Payment Form',\n [LokotroPayScreenNavigation.EWalletFormScreen]: 'E-Wallet Form',\n [LokotroPayScreenNavigation.MobileMoneyFormScreen]: 'Mobile Money Form',\n [LokotroPayScreenNavigation.CardFormScreen]: 'Card Form',\n [LokotroPayScreenNavigation.BankTransferFormScreen]: 'Bank Transfer Form',\n [LokotroPayScreenNavigation.FlashFormScreen]: 'Flash Form',\n [LokotroPayScreenNavigation.PaymentConfirmationScreen]: 'Payment Confirmation',\n [LokotroPayScreenNavigation.ProcessingScreen]: 'Processing',\n [LokotroPayScreenNavigation.MobileMoneyProcessingScreen]: 'Mobile Money Processing',\n [LokotroPayScreenNavigation.EWalletOtpScreen]: 'E-Wallet OTP',\n [LokotroPayScreenNavigation.SuccessScreen]: 'Success',\n [LokotroPayScreenNavigation.ErrorScreen]: 'Error',\n [LokotroPayScreenNavigation.WarningScreen]: 'Warning',\n [LokotroPayScreenNavigation.InfoScreen]: 'Information'\n};\n\n/**\n * API result processing screen types\n */\nexport enum LokotroPayResultScreen {\n SuccessScreen = 'successScreen',\n ErrorScreen = 'errorScreen',\n WarningScreen = 'warningScreen',\n InfoScreen = 'infoScreen'\n}\n\n/**\n * Payment status enumeration\n */\nexport enum LokotroPaymentStatus {\n Pending = 'pending',\n Processing = 'processing',\n Approved = 'approved',\n Declined = 'declined',\n Failed = 'failed',\n Cancelled = 'cancelled',\n Expired = 'expired',\n Refunded = 'refunded',\n PendingBankProofUpload = 'pending_bank_proof_upload'\n}\n\n/**\n * Payment status helper functions\n */\nexport const LokotroPaymentStatusInfo = {\n getDisplayName(status: LokotroPaymentStatus): string {\n const names: Record<LokotroPaymentStatus, string> = {\n [LokotroPaymentStatus.Pending]: 'Pending',\n [LokotroPaymentStatus.Processing]: 'Processing',\n [LokotroPaymentStatus.Approved]: 'Approved',\n [LokotroPaymentStatus.Declined]: 'Declined',\n [LokotroPaymentStatus.Failed]: 'Failed',\n [LokotroPaymentStatus.Cancelled]: 'Cancelled',\n [LokotroPaymentStatus.Expired]: 'Expired',\n [LokotroPaymentStatus.Refunded]: 'Refunded',\n [LokotroPaymentStatus.PendingBankProofUpload]: 'Pending Proof Upload'\n };\n return names[status] || 'Unknown';\n },\n\n isSuccess(status: LokotroPaymentStatus): boolean {\n return status === LokotroPaymentStatus.Approved;\n },\n\n isFailure(status: LokotroPaymentStatus): boolean {\n return [\n LokotroPaymentStatus.Declined,\n LokotroPaymentStatus.Failed,\n LokotroPaymentStatus.Cancelled,\n LokotroPaymentStatus.Expired\n ].includes(status);\n },\n\n isPending(status: LokotroPaymentStatus): boolean {\n return [\n LokotroPaymentStatus.Pending,\n LokotroPaymentStatus.Processing,\n LokotroPaymentStatus.PendingBankProofUpload\n ].includes(status);\n },\n\n fromString(status: string): LokotroPaymentStatus {\n const normalizedStatus = status.toLowerCase();\n switch (normalizedStatus) {\n case 'pending':\n case 'pending_otp_verification':\n case 'pending_validation':\n case 'waiting':\n return LokotroPaymentStatus.Pending;\n case 'processing':\n case 'initiated':\n return LokotroPaymentStatus.Processing;\n case 'approved':\n case 'success':\n case 'successful':\n case 'completed':\n return LokotroPaymentStatus.Approved;\n case 'declined':\n return LokotroPaymentStatus.Declined;\n case 'failed':\n case 'fail':\n case 'error':\n return LokotroPaymentStatus.Failed;\n case 'cancelled':\n case 'canceled':\n return LokotroPaymentStatus.Cancelled;\n case 'expired':\n return LokotroPaymentStatus.Expired;\n case 'refunded':\n return LokotroPaymentStatus.Refunded;\n case 'pending_bank_proof_upload':\n return LokotroPaymentStatus.PendingBankProofUpload;\n default:\n // If status contains \"pending\", assume pending\n if (normalizedStatus.includes('pending')) {\n return LokotroPaymentStatus.Pending;\n }\n return LokotroPaymentStatus.Failed;\n }\n }\n};\n\n/**\n * API response status codes\n */\nexport enum LokotroPayApiResponseCode {\n LOK000 = 'LOK000', // Success\n LOK001 = 'LOK001', // General error\n LOK002 = 'LOK002', // Invalid parameters\n LOK003 = 'LOK003', // Authentication failed\n LOK004 = 'LOK004', // Payment method not available\n LOK005 = 'LOK005', // Insufficient funds\n LOK006 = 'LOK006', // Transaction limit exceeded\n LOK007 = 'LOK007', // Network error\n LOK008 = 'LOK008', // Timeout\n LOK009 = 'LOK009' // Service unavailable\n}\n\n/**\n * API response code helper functions\n */\nexport const LokotroPayApiResponseCodeInfo = {\n getMessage(code: LokotroPayApiResponseCode): string {\n const messages: Record<LokotroPayApiResponseCode, string> = {\n [LokotroPayApiResponseCode.LOK000]: 'Success',\n [LokotroPayApiResponseCode.LOK001]: 'General error occurred',\n [LokotroPayApiResponseCode.LOK002]: 'Invalid parameters provided',\n [LokotroPayApiResponseCode.LOK003]: 'Authentication failed',\n [LokotroPayApiResponseCode.LOK004]: 'Payment method not available',\n [LokotroPayApiResponseCode.LOK005]: 'Insufficient funds',\n [LokotroPayApiResponseCode.LOK006]: 'Transaction limit exceeded',\n [LokotroPayApiResponseCode.LOK007]: 'Network error',\n [LokotroPayApiResponseCode.LOK008]: 'Request timeout',\n [LokotroPayApiResponseCode.LOK009]: 'Service unavailable'\n };\n return messages[code] || 'Unknown error';\n },\n\n isSuccess(code: LokotroPayApiResponseCode): boolean {\n return code === LokotroPayApiResponseCode.LOK000;\n },\n\n fromString(code: string): LokotroPayApiResponseCode {\n const normalizedCode = code.toUpperCase();\n switch (normalizedCode) {\n case 'LOK000':\n return LokotroPayApiResponseCode.LOK000;\n case 'LOK001':\n return LokotroPayApiResponseCode.LOK001;\n case 'LOK002':\n return LokotroPayApiResponseCode.LOK002;\n case 'LOK003':\n return LokotroPayApiResponseCode.LOK003;\n case 'LOK004':\n return LokotroPayApiResponseCode.LOK004;\n case 'LOK005':\n return LokotroPayApiResponseCode.LOK005;\n case 'LOK006':\n return LokotroPayApiResponseCode.LOK006;\n case 'LOK007':\n return LokotroPayApiResponseCode.LOK007;\n case 'LOK008':\n return LokotroPayApiResponseCode.LOK008;\n case 'LOK009':\n return LokotroPayApiResponseCode.LOK009;\n default:\n return LokotroPayApiResponseCode.LOK001;\n }\n }\n};\n\n/**\n * Supported languages for Lokotro Pay\n */\nexport enum LokotroPayLanguage {\n English = 'en',\n French = 'fr',\n German = 'de',\n Spanish = 'es',\n Italian = 'it',\n Russian = 'ru',\n Hindi = 'hi',\n Japanese = 'ja',\n Chinese = 'zh',\n Lingala = 'ln'\n}\n\n/**\n * Language info with display names and flag assets\n */\nexport const LokotroPayLanguageInfo: Record<LokotroPayLanguage, { displayName: string; nativeName: string; flagAsset: string }> = {\n [LokotroPayLanguage.English]: { displayName: 'English', nativeName: 'English', flagAsset: 'assets/flags/england.svg' },\n [LokotroPayLanguage.French]: { displayName: 'French', nativeName: 'Français', flagAsset: 'assets/flags/france.svg' },\n [LokotroPayLanguage.German]: { displayName: 'German', nativeName: 'Deutsch', flagAsset: 'assets/flags/german.svg' },\n [LokotroPayLanguage.Spanish]: { displayName: 'Spanish', nativeName: 'Español', flagAsset: 'assets/flags/spain.svg' },\n [LokotroPayLanguage.Italian]: { displayName: 'Italian', nativeName: 'Italiano', flagAsset: 'assets/flags/italy.svg' },\n [LokotroPayLanguage.Russian]: { displayName: 'Russian', nativeName: 'Русский', flagAsset: 'assets/flags/russia.svg' },\n [LokotroPayLanguage.Hindi]: { displayName: 'Hindi', nativeName: 'हिंदी', flagAsset: 'assets/flags/india.svg' },\n [LokotroPayLanguage.Japanese]: { displayName: 'Japanese', nativeName: '日本語', flagAsset: 'assets/flags/japanese.svg' },\n [LokotroPayLanguage.Chinese]: { displayName: 'Chinese', nativeName: '中文(普通话)', flagAsset: 'assets/flags/china.svg' },\n [LokotroPayLanguage.Lingala]: { displayName: 'Lingala', nativeName: 'Lingala', flagAsset: 'assets/flags/drc.svg' }\n};\n\n/**\n * Language helper functions\n */\nexport const LokotroPayLanguageHelper = {\n fromCode(code: string): LokotroPayLanguage | null {\n const languageMap: Record<string, LokotroPayLanguage> = {\n 'en': LokotroPayLanguage.English,\n 'fr': LokotroPayLanguage.French,\n 'de': LokotroPayLanguage.German,\n 'es': LokotroPayLanguage.Spanish,\n 'it': LokotroPayLanguage.Italian,\n 'ru': LokotroPayLanguage.Russian,\n 'hi': LokotroPayLanguage.Hindi,\n 'ja': LokotroPayLanguage.Japanese,\n 'zh': LokotroPayLanguage.Chinese,\n 'ln': LokotroPayLanguage.Lingala\n };\n return languageMap[code.toLowerCase()] || null;\n },\n\n getSupportedLocales(): string[] {\n return Object.values(LokotroPayLanguage);\n },\n\n getAllLanguages(): Array<{ code: string; label: string; flag: string }> {\n return Object.entries(LokotroPayLanguageInfo).map(([code, info]) => ({\n code,\n label: info.nativeName,\n flag: info.flagAsset\n }));\n }\n};\n\n/**\n * Printer types (for receipt printing)\n */\nexport enum LokotroPrinterType {\n Bluetooth = 'bluetooth',\n USB = 'usb',\n Network = 'network',\n Thermal = 'thermal'\n}\n\n/**\n * Theme mode\n */\nexport enum LokotroPayThemeMode {\n Light = 'light',\n Dark = 'dark',\n System = 'system'\n}\n","/**\n * Lokotro Pay - Localization Service\n * Multi-language support for Lokotro Pay\n */\n\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { LokotroPayLanguage, LokotroPayLanguageInfo } from '../enums';\n\n/**\n * Translation keys interface\n */\nexport interface LokotroTranslations {\n // Common\n loading: string;\n error: string;\n success: string;\n cancel: string;\n confirm: string;\n continue: string;\n back: string;\n close: string;\n retry: string;\n done: string;\n\n // Payment flow\n selectPaymentMethod: string;\n paymentDetails: string;\n confirmPayment: string;\n processing: string;\n paymentSuccessful: string;\n paymentFailed: string;\n\n // Payment methods\n card: string;\n mobileMoneyPayment: string;\n eWallet: string;\n lokotroWallet: string;\n bankTransfer: string;\n eFlash: string;\n virtualCard: string;\n\n // Form labels\n cardNumber: string;\n cardHolderName: string;\n expiryDate: string;\n cvv: string;\n phoneNumber: string;\n walletNumber: string;\n pin: string;\n email: string;\n firstName: string;\n lastName: string;\n\n // Validation\n required: string;\n invalidCardNumber: string;\n invalidExpiryDate: string;\n invalidCvv: string;\n invalidPhoneNumber: string;\n invalidEmail: string;\n\n // OTP\n enterOtp: string;\n otpSentTo: string;\n resendOtp: string;\n verifyOtp: string;\n otpVerificationFailed: string;\n\n // Status messages\n paymentPending: string;\n paymentProcessing: string;\n paymentApproved: string;\n paymentDeclined: string;\n paymentCancelled: string;\n paymentExpired: string;\n\n // Payment Status Component\n paymentStatus: string;\n checkingPaymentStatus: string;\n paymentPendingMessage: string;\n paymentSuccessMessage: string;\n paymentFailedMessage: string;\n paymentCancelledMessage: string;\n paymentExpiredMessage: string;\n checkingForUpdates: string;\n paymentId: string;\n\n // Error messages (sanitized - user-friendly)\n networkError: string;\n timeoutError: string;\n serverError: string;\n paymentNotFound: string;\n authenticationError: string;\n invalidRequest: string;\n\n // Amount\n amount: string;\n fee: string;\n total: string;\n currency: string;\n\n // Country/Phone\n selectCountry: string;\n invalidPhonePrefix: string;\n phoneTooShort: string;\n phoneTooLong: string;\n validPrefixes: string;\n more: string;\n\n // User info form\n personalInfo: string;\n personalPhone: string;\n mobileMoneyPhone: string;\n mobileMoneyDetails: string;\n\n\n // Bank Transfer\n bankDetails: string;\n selectCity: string;\n selectBank: string;\n selectBankAccount: string;\n bankAccountSummary: string;\n accountLabel: string;\n bankTransferProofInstructions: string;\n confirmBankTransfer: string;\n}\n\n/**\n * Default English translations\n */\nconst EN_TRANSLATIONS: LokotroTranslations = {\n // Common\n loading: 'Loading...',\n error: 'Error',\n success: 'Success',\n cancel: 'Cancel',\n confirm: 'Confirm',\n continue: 'Continue',\n back: 'Back',\n close: 'Close',\n retry: 'Retry',\n done: 'Done',\n\n // Payment flow\n selectPaymentMethod: 'Select Payment Method',\n paymentDetails: 'Payment Details',\n confirmPayment: 'Confirm Payment',\n processing: 'Processing your payment...',\n paymentSuccessful: 'Payment Successful',\n paymentFailed: 'Payment Failed',\n\n // Payment methods\n card: 'Payment Card',\n mobileMoneyPayment: 'Mobile Money',\n eWallet: 'E-Wallet',\n lokotroWallet: 'Lokotro Wallet',\n bankTransfer: 'Bank Transfer',\n eFlash: 'E-Flash',\n virtualCard: 'Virtual Card',\n\n // Form labels\n cardNumber: 'Card Number',\n cardHolderName: 'Card Holder Name',\n expiryDate: 'Expiry Date',\n cvv: 'CVV',\n phoneNumber: 'Phone Number',\n walletNumber: 'Wallet Number',\n pin: 'PIN',\n email: 'Email',\n firstName: 'First Name',\n lastName: 'Last Name',\n\n // Validation\n required: 'This field is required',\n invalidCardNumber: 'Invalid card number',\n invalidExpiryDate: 'Invalid expiry date',\n invalidCvv: 'Invalid CVV',\n invalidPhoneNumber: 'Invalid phone number',\n invalidEmail: 'Invalid email address',\n\n // OTP\n enterOtp: 'Enter OTP',\n otpSentTo: 'OTP sent to',\n resendOtp: 'Resend OTP',\n verifyOtp: 'Verify OTP',\n otpVerificationFailed: 'OTP verification failed. Please try again.',\n\n // Status messages\n paymentPending: 'Payment is pending',\n paymentProcessing: 'Payment is being processed',\n paymentApproved: 'Payment approved',\n paymentDeclined: 'Payment declined',\n paymentCancelled: 'Payment cancelled',\n paymentExpired: 'Payment expired',\n\n // Payment Status Component\n paymentStatus: 'Payment Status',\n checkingPaymentStatus: 'Checking payment status...',\n paymentPendingMessage: 'Your payment is awaiting confirmation. Please wait...',\n paymentSuccessMessage: 'Your payment has been completed successfully.',\n paymentFailedMessage: 'There was an error processing your payment.',\n paymentCancelledMessage: 'This payment has been cancelled.',\n paymentExpiredMessage: 'This payment session has expired.',\n checkingForUpdates: 'Checking for updates...',\n paymentId: 'Payment ID',\n\n // Error messages (sanitized - user-friendly)\n networkError: 'Unable to connect. Please check your internet connection and try again.',\n timeoutError: 'The request timed out. Please try again.',\n serverError: 'Our servers are temporarily unavailable. Please try again later.',\n paymentNotFound: 'Payment not found. Please verify your payment ID.',\n authenticationError: 'Authentication failed. Please contact support.',\n invalidRequest: 'Invalid request. Please verify your payment details.',\n\n // Amount\n amount: 'Amount',\n fee: 'Fee',\n total: 'Total',\n currency: 'Currency',\n\n // Country/Phone\n selectCountry: 'Select Country',\n invalidPhonePrefix: 'Invalid phone prefix for this country',\n phoneTooShort: 'Phone number is too short',\n phoneTooLong: 'Phone number is too long',\n validPrefixes: 'Valid prefixes:',\n more: 'more',\n\n // User info form\n personalInfo: 'Personal Information',\n personalPhone: 'Contact Phone',\n mobileMoneyPhone: 'Mobile Money Phone',\n mobileMoneyDetails: 'Mobile Money Details',\n\n // Bank Transfer\n bankDetails: 'Bank Details',\n selectCity: 'Select City',\n selectBank: 'Select Bank',\n selectBankAccount: 'Select Account',\n bankAccountSummary: 'Account Details',\n accountLabel: 'Account Label',\n bankTransferProofInstructions: 'A payment link will be sent to your email to upload the proof of transfer.',\n confirmBankTransfer: 'Confirm Transfer'\n};\n\n/**\n * French translations\n */\nconst FR_TRANSLATIONS: LokotroTranslations = {\n // Common\n loading: 'Chargement...',\n error: 'Erreur',\n success: 'Succès',\n cancel: 'Annuler',\n confirm: 'Confirmer',\n continue: 'Continuer',\n back: 'Retour',\n close: 'Fermer',\n retry: 'Réessayer',\n done: 'Terminé',\n\n // Payment flow\n selectPaymentMethod: 'Sélectionner le mode de paiement',\n paymentDetails: 'Détails du paiement',\n confirmPayment: 'Confirmer le paiement',\n processing: 'Traitement de votre paiement...',\n paymentSuccessful: 'Paiement réussi',\n paymentFailed: 'Échec du paiement',\n\n // Payment methods\n card: 'Carte de paiement',\n mobileMoneyPayment: 'Mobile Money',\n eWallet: 'Portefeuille électronique',\n lokotroWallet: 'Portefeuille Lokotro',\n bankTransfer: 'Virement bancaire',\n eFlash: 'E-Flash',\n virtualCard: 'Carte virtuelle',\n\n // Form labels\n cardNumber: 'Numéro de carte',\n cardHolderName: 'Nom du titulaire',\n expiryDate: 'Date d\\'expiration',\n cvv: 'CVV',\n phoneNumber: 'Numéro de téléphone',\n walletNumber: 'Numéro de portefeuille',\n pin: 'Code PIN',\n email: 'E-mail',\n firstName: 'Prénom',\n lastName: 'Nom',\n\n // Validation\n required: 'Ce champ est obligatoire',\n invalidCardNumber: 'Numéro de carte invalide',\n invalidExpiryDate: 'Date d\\'expiration invalide',\n invalidCvv: 'CVV invalide',\n invalidPhoneNumber: 'Numéro de téléphone invalide',\n invalidEmail: 'Adresse e-mail invalide',\n\n // OTP\n enterOtp: 'Entrez le code OTP',\n otpSentTo: 'Code OTP envoyé à',\n resendOtp: 'Renvoyer le code OTP',\n verifyOtp: 'Vérifier le code OTP',\n otpVerificationFailed: 'La vérification OTP a échoué. Veuillez réessayer.',\n\n // Status messages\n paymentPending: 'Paiement en attente',\n paymentProcessing: 'Paiement en cours de traitement',\n paymentApproved: 'Paiement approuvé',\n paymentDeclined: 'Paiement refusé',\n paymentCancelled: 'Paiement annulé',\n paymentExpired: 'Paiement expiré',\n\n // Payment Status Component\n paymentStatus: 'Statut du paiement',\n checkingPaymentStatus: 'Vérification du statut du paiement...',\n paymentPendingMessage: 'Votre paiement est en attente de confirmation. Veuillez patienter...',\n paymentSuccessMessage: 'Votre paiement a été effectué avec succès.',\n paymentFailedMessage: 'Une erreur s\\'est produite lors du traitement de votre paiement.',\n paymentCancelledMessage: 'Ce paiement a été annulé.',\n paymentExpiredMessage: 'Cette session de paiement a expiré.',\n checkingForUpdates: 'Recherche de mises à jour...',\n paymentId: 'ID de paiement',\n\n // Amount\n amount: 'Montant',\n fee: 'Frais',\n total: 'Total',\n currency: 'Devise',\n\n // Country/Phone\n selectCountry: 'Sélectionner le pays',\n invalidPhonePrefix: 'Préfixe téléphonique invalide pour ce pays',\n phoneTooShort: 'Le numéro est trop court',\n phoneTooLong: 'Le numéro est trop long',\n validPrefixes: 'Préfixes valides:',\n more: 'de plus',\n\n // User info form\n personalInfo: 'Informations personnelles',\n personalPhone: 'Téléphone de contact',\n mobileMoneyPhone: 'Téléphone Mobile Money',\n mobileMoneyDetails: 'Détails Mobile Money',\n\n // Error messages (sanitized)\n networkError: 'Erreur de connexion. Veuillez vérifier votre connexion internet.',\n timeoutError: 'La requête a expiré. Veuillez réessayer.',\n serverError: 'Une erreur serveur s\\'est produite. Veuillez réessayer plus tard.',\n paymentNotFound: 'Paiement introuvable. Veuillez vérifier l\\'identifiant.',\n authenticationError: 'Erreur d\\'authentification. Veuillez vous reconnecter.',\n invalidRequest: 'Requête invalide. Veuillez réessayer.',\n\n\n // Bank Transfer\n bankDetails: 'Détails bancaires',\n selectCity: 'Sélectionner la ville',\n selectBank: 'Sélectionner la banque',\n selectBankAccount: 'Sélectionner le compte',\n bankAccountSummary: 'Détails du compte',\n accountLabel: 'Libellé du compte',\n bankTransferProofInstructions: 'Un lien de paiement sera envoyé à votre adresse e-mail pour télécharger la preuve de virement.',\n confirmBankTransfer: 'Confirmer le virement'\n};\n\n/**\n * Spanish translations\n */\nconst ES_TRANSLATIONS: LokotroTranslations = {\n // Common\n loading: 'Cargando...',\n error: 'Error',\n success: 'Éxito',\n cancel: 'Cancelar',\n confirm: 'Confirmar',\n continue: 'Continuar',\n back: 'Atrás',\n close: 'Cerrar',\n retry: 'Reintentar',\n done: 'Hecho',\n\n // Payment flow\n selectPaymentMethod: 'Seleccionar método de pago',\n paymentDetails: 'Detalles del pago',\n confirmPayment: 'Confirmar pago',\n processing: 'Procesando su pago...',\n paymentSuccessful: 'Pago exitoso',\n paymentFailed: 'Pago fallido',\n\n // Payment methods\n card: 'Tarjeta de pago',\n mobileMoneyPayment: 'Dinero móvil',\n eWallet: 'Billetera electrónica',\n lokotroWallet: 'Billetera Lokotro',\n bankTransfer: 'Transferencia bancaria',\n eFlash: 'E-Flash',\n virtualCard: 'Tarjeta virtual',\n\n // Form labels\n cardNumber: 'Número de tarjeta',\n cardHolderName: 'Nombre del titular',\n expiryDate: 'Fecha de vencimiento',\n cvv: 'CVV',\n phoneNumber: 'Número de teléfono',\n walletNumber: 'Número de billetera',\n pin: 'PIN',\n email: 'Correo electrónico',\n firstName: 'Nombre',\n lastName: 'Apellido',\n\n // Validation\n required: 'Este campo es obligatorio',\n invalidCardNumber: 'Número de tarjeta inválido',\n invalidExpiryDate: 'Fecha de vencimiento inválida',\n invalidCvv: 'CVV inválido',\n invalidPhoneNumber: 'Número de teléfono inválido',\n invalidEmail: 'Correo electrónico inválido',\n\n // OTP\n enterOtp: 'Ingrese el código OTP',\n otpSentTo: 'Código OTP enviado a',\n resendOtp: 'Reenviar OTP',\n verifyOtp: 'Verificar OTP',\n otpVerificationFailed: 'La verificación OTP falló. Por favor intente de nuevo.',\n\n // Status messages\n paymentPending: 'Pago pendiente',\n paymentProcessing: 'Pago en proceso',\n paymentApproved: 'Pago aprobado',\n paymentDeclined: 'Pago rechazado',\n paymentCancelled: 'Pago cancelado',\n paymentExpired: 'Pago expirado',\n\n // Payment Status Component\n paymentStatus: 'Estado del pago',\n checkingPaymentStatus: 'Verificando estado del pago...',\n paymentPendingMessage: 'Su pago está en espera de confirmación. Por favor espere...',\n paymentSuccessMessage: 'Su pago se ha completado exitosamente.',\n paymentFailedMessage: 'Hubo un error al procesar su pago.',\n paymentCancelledMessage: 'Este pago ha sido cancelado.',\n paymentExpiredMessage: 'Esta sesión de pago ha expirado.',\n checkingForUpdates: 'Buscando actualizaciones...',\n paymentId: 'ID de pago',\n\n // Amount\n amount: 'Monto',\n fee: 'Comisión',\n total: 'Total',\n currency: 'Moneda',\n\n // Country/Phone\n selectCountry: 'Seleccionar país',\n invalidPhonePrefix: 'Prefijo de teléfono no válido para este país',\n phoneTooShort: 'El número es demasiado corto',\n phoneTooLong: 'El número es demasiado largo',\n validPrefixes: 'Prefijos válidos:',\n more: 'más',\n\n // User info form\n personalInfo: 'Información personal',\n personalPhone: 'Teléfono de contacto',\n mobileMoneyPhone: 'Teléfono Mobile Money',\n mobileMoneyDetails: 'Detalles de Mobile Money',\n\n // Error messages (sanitized)\n networkError: 'Error de conexión. Por favor verifique su conexión a internet.',\n timeoutError: 'La solicitud ha expirado. Por favor intente de nuevo.',\n serverError: 'Ocurrió un error del servidor. Por favor intente más tarde.',\n paymentNotFound: 'Pago no encontrado. Por favor verifique el identificador.',\n authenticationError: 'Error de autenticación. Por favor vuelva a iniciar sesión.',\n invalidRequest: 'Solicitud inválida. Por favor intente de nuevo.',\n\n // Bank Transfer\n bankDetails: 'Detalles bancarios',\n selectCity: 'Seleccionar ciudad',\n selectBank: 'Seleccionar banco',\n selectBankAccount: 'Seleccionar cuenta',\n bankAccountSummary: 'Detalles de la cuenta',\n accountLabel: 'Etiqueta de la cuenta',\n bankTransferProofInstructions: 'Se enviará un enlace de pago a su correo electrónico para cargar el comprobante de transferencia.',\n confirmBankTransfer: 'Confirmar transferencia'\n};\n\n/**\n * All translations map\n */\nconst TRANSLATIONS: Record<LokotroPayLanguage, LokotroTranslations> = {\n [LokotroPayLanguage.English]: EN_TRANSLATIONS,\n [LokotroPayLanguage.French]: FR_TRANSLATIONS,\n [LokotroPayLanguage.Spanish]: ES_TRANSLATIONS,\n [LokotroPayLanguage.German]: EN_TRANSLATIONS, // Fallback to English\n [LokotroPayLanguage.Italian]: EN_TRANSLATIONS, // Fallback to English\n [LokotroPayLanguage.Russian]: EN_TRANSLATIONS, // Fallback to English\n [LokotroPayLanguage.Hindi]: EN_TRANSLATIONS, // Fallback to English\n [LokotroPayLanguage.Japanese]: EN_TRANSLATIONS, // Fallback to English\n [LokotroPayLanguage.Chinese]: EN_TRANSLATIONS, // Fallback to English\n [LokotroPayLanguage.Lingala]: FR_TRANSLATIONS // Fallback to French\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LokotroLocalizationService {\n private currentLanguageSubject = new BehaviorSubject<LokotroPayLanguage>(LokotroPayLanguage.English);\n private translationsSubject = new BehaviorSubject<LokotroTranslations>(EN_TRANSLATIONS);\n\n /**\n * Current language observable\n */\n currentLanguage$: Observable<LokotroPayLanguage> = this.currentLanguageSubject.asObservable();\n\n /**\n * Current translations observable\n */\n translations$: Observable<LokotroTranslations> = this.translationsSubject.asObservable();\n\n /**\n * Get current language\n */\n get currentLanguage(): LokotroPayLanguage {\n return this.currentLanguageSubject.value;\n }\n\n /**\n * Get current translations\n */\n get translations(): LokotroTranslations {\n return this.translationsSubject.value;\n }\n\n /**\n * Set language\n */\n setLanguage(language: LokotroPayLanguage): void {\n this.currentLanguageSubject.next(language);\n this.translationsSubject.next(TRANSLATIONS[language] || EN_TRANSLATIONS);\n }\n\n /**\n * Set language by code\n */\n setLanguageByCode(code: string): void {\n const language = Object.values(LokotroPayLanguage).find(lang => lang === code);\n if (language) {\n this.setLanguage(language);\n }\n }\n\n /**\n * Get translation by key\n */\n translate(key: keyof LokotroTranslations): string {\n return this.translations[key] || key;\n }\n\n /**\n * Get all supported languages\n */\n getSupportedLanguages(): Array<{ code: LokotroPayLanguage; name: string; nativeName: string }> {\n return Object.entries(LokotroPayLanguageInfo).map(([code, info]) => ({\n code: code as LokotroPayLanguage,\n name: info.displayName,\n nativeName: info.nativeName\n }));\n }\n\n /**\n * Detect browser language and set if supported\n */\n detectAndSetLanguage(): void {\n const browserLang = navigator.language.split('-')[0];\n const supportedLang = Object.values(LokotroPayLanguage).find(lang => lang === browserLang);\n if (supportedLang) {\n this.setLanguage(supportedLang);\n }\n }\n\n /**\n * Add custom translations\n */\n addTranslations(language: LokotroPayLanguage, translations: Partial<LokotroTranslations>): void {\n TRANSLATIONS[language] = {\n ...TRANSLATIONS[language],\n ...translations\n };\n\n // Update if current language\n if (this.currentLanguage === language) {\n this.translationsSubject.next(TRANSLATIONS[language]);\n }\n }\n}\n","/**\n * Lokotro Pay - Payment Method Selection Component\n */\n\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LokotroPaymentMethod } from '../../models';\nimport { LokotroPayChannel, LokotroPayChannelInfo } from '../../enums';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\n\n@Component({\n selector: 'lokotro-payment-method-selection',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"lokotro-method-selection\">\n <h3 class=\"lokotro-section-title\">{{ localization.translate('selectPaymentMethod') }}</h3>\n \n <div class=\"lokotro-methods-grid\">\n <button\n *ngFor=\"let method of paymentMethods\"\n class=\"lokotro-method-card\"\n [class.selected]=\"selectedMethod?.id === method.id\"\n [class.disabled]=\"!method.isEnabled\"\n [disabled]=\"!method.isEnabled\"\n (click)=\"selectMethod(method)\">\n \n <div class=\"lokotro-method-icon\">\n <img \n *ngIf=\"method.iconUrl\" \n [src]=\"method.iconUrl\" \n [alt]=\"method.displayName\"\n (error)=\"onImageError($event, method.channel)\">\n <div *ngIf=\"!method.iconUrl\" class=\"lokotro-method-icon-placeholder\">\n {{ getMethodIcon(method.channel) }}\n </div>\n </div>\n \n <div class=\"lokotro-method-info\">\n <span class=\"lokotro-method-name\">{{ method.displayName }}</span>\n <span class=\"lokotro-method-description\" *ngIf=\"getMethodDescription(method.channel)\">\n {{ getMethodDescription(method.channel) }}\n </span>\n </div>\n \n <div class=\"lokotro-method-check\" *ngIf=\"selectedMethod?.id === method.id\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M20 6L9 17l-5-5\"/>\n </svg>\n </div>\n </button>\n </div>\n\n <button \n class=\"lokotro-continue-btn\"\n [disabled]=\"!selectedMethod\"\n (click)=\"onContinue()\">\n {{ localization.translate('continue') }}\n </button>\n </div>\n `,\n styles: [`\n .lokotro-method-selection {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n .lokotro-section-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n text-align: center;\n }\n\n .lokotro-methods-grid {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .lokotro-method-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 16px;\n background: var(--lokotro-card, #3A4840);\n border: 2px solid var(--lokotro-border, #3A473F);\n border-radius: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n }\n\n .lokotro-method-card:hover:not(.disabled) {\n border-color: var(--lokotro-accent, #3BFBDA);\n transform: translateY(-2px);\n }\n\n .lokotro-method-card.selected {\n border-color: var(--lokotro-accent, #3BFBDA);\n background: linear-gradient(135deg, var(--lokotro-card, #3A4840), var(--lokotro-surface, #2A3832));\n }\n\n .lokotro-method-card.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .lokotro-method-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--lokotro-surface, #2A3832);\n border-radius: 12px;\n overflow: hidden;\n }\n\n .lokotro-method-icon img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n .lokotro-method-icon-placeholder {\n font-size: 24px;\n }\n\n .lokotro-method-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .lokotro-method-name {\n font-size: 16px;\n font-weight: 600;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-method-description {\n font-size: 13px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n .lokotro-method-check {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-continue-btn {\n width: 100%;\n padding: 16px;\n background: linear-gradient(135deg, var(--lokotro-primary, #5A5E39), var(--lokotro-secondary, #6E7346));\n color: var(--lokotro-text-primary, #F2F0D5);\n border: none;\n border-radius: 12px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .lokotro-continue-btn:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);\n }\n\n .lokotro-continue-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `]\n})\nexport class LokotroPaymentMethodSelectionComponent {\n @Input() paymentMethods: LokotroPaymentMethod[] = [];\n @Input() selectedMethod?: LokotroPaymentMethod;\n @Output() methodSelected = new EventEmitter<LokotroPaymentMethod>();\n\n constructor(public localization: LokotroLocalizationService) {}\n\n selectMethod(method: LokotroPaymentMethod): void {\n if (method.isEnabled) {\n this.selectedMethod = method;\n }\n }\n\n onContinue(): void {\n if (this.selectedMethod) {\n this.methodSelected.emit(this.selectedMethod);\n }\n }\n\n getMethodIcon(channel: LokotroPayChannel): string {\n const icons: Record<LokotroPayChannel, string> = {\n [LokotroPayChannel.None]: '❓',\n [LokotroPayChannel.All]: '💳',\n [LokotroPayChannel.EFlash]: '⚡',\n [LokotroPayChannel.EWallet]: '💰',\n [LokotroPayChannel.Card]: '💳',\n [LokotroPayChannel.MobileMoney]: '📱',\n [LokotroPayChannel.EWalletOtp]: '🔐',\n [LokotroPayChannel.LokotroWallet]: '🎯',\n [LokotroPayChannel.VirtualCard]: '💎',\n [LokotroPayChannel.BankTransfer]: '🏦'\n };\n return icons[channel] || '💳';\n }\n\n getMethodDescription(channel: LokotroPayChannel): string {\n const descriptions: Partial<Record<LokotroPayChannel, string>> = {\n [LokotroPayChannel.Card]: 'Visa, Mastercard, American Express',\n [LokotroPayChannel.MobileMoney]: 'M-Pesa, Orange Money, Airtel Money',\n [LokotroPayChannel.EWallet]: 'Digital wallet solutions',\n [LokotroPayChannel.BankTransfer]: 'Direct bank transfer',\n [LokotroPayChannel.LokotroWallet]: 'Pay with your Lokotro balance'\n };\n return descriptions[channel] || '';\n }\n\n onImageError(event: Event, channel: LokotroPayChannel): void {\n const target = event.target as HTMLImageElement;\n target.style.display = 'none';\n const parent = target.parentElement;\n if (parent) {\n const placeholder = document.createElement('div');\n placeholder.className = 'lokotro-method-icon-placeholder';\n placeholder.textContent = this.getMethodIcon(channel);\n parent.appendChild(placeholder);\n }\n }\n}\n","/**\n * Lokotro Pay - Country Models\n * Models for country data and phone number validation\n */\n\n/**\n * Phone number prefix model\n */\nexport interface LokotroPhonePrefix {\n id: string;\n prefix: string;\n}\n\n/**\n * Country code model\n */\nexport interface LokotroCountryCode {\n id: string;\n countryCode: string;\n}\n\n/**\n * Reference country model with flag and phone constraints\n */\nexport interface LokotroRefCountry {\n id: string;\n name: string;\n countryFlag: string;\n minPhoneNumberChars: number;\n maxPhoneNumberChars: number;\n}\n\n/**\n * Complete country model with all related data\n */\nexport interface LokotroCountry {\n refCountry: LokotroRefCountry;\n countryCodes: LokotroCountryCode[];\n phoneNumberPrefixes: LokotroPhonePrefix[];\n}\n\n/**\n * Country helper utilities\n */\nexport class LokotroCountryUtils {\n /**\n * Get the primary country code (first in the list)\n */\n static getPrimaryCountryCode(country: LokotroCountry): string {\n return country.countryCodes.length > 0 \n ? country.countryCodes[0].countryCode \n : '';\n }\n\n /**\n * Get the country flag emoji\n */\n static getFlag(country: LokotroCountry): string {\n return country.refCountry.countryFlag || '🏳️';\n }\n\n /**\n * Get all valid phone prefixes as strings\n */\n static getValidPrefixes(country: LokotroCountry): string[] {\n return country.phoneNumberPrefixes.map(p => p.prefix);\n }\n\n /**\n * Get min phone chars\n */\n static getMinPhoneChars(country: LokotroCountry): number {\n return country.refCountry.minPhoneNumberChars;\n }\n\n /**\n * Get max phone chars\n */\n static getMaxPhoneChars(country: LokotroCountry): number {\n return country.refCountry.maxPhoneNumberChars;\n }\n\n /**\n * Check if a phone number has a valid prefix for this country\n */\n static hasValidPrefix(country: LokotroCountry, phoneNumber: string): boolean {\n if (!phoneNumber || phoneNumber.length === 0) return true; // Empty is valid (for form start)\n \n const prefixes = LokotroCountryUtils.getValidPrefixes(country);\n if (prefixes.length === 0) return true; // No prefix constraints\n \n // Clean the number\n const cleanNumber = phoneNumber.replace(/[\\s\\-]/g, '');\n \n // Check if starts with any valid prefix\n return prefixes.some(prefix => cleanNumber.startsWith(prefix));\n }\n\n /**\n * Check if phone number length is valid\n */\n static isValidPhoneLength(country: LokotroCountry, phoneNumber: string): boolean {\n const cleanNumber = phoneNumber.replace(/[\\s\\-]/g, '');\n const length = cleanNumber.length;\n return length >= country.refCountry.minPhoneNumberChars && \n length <= country.refCountry.maxPhoneNumberChars;\n }\n\n /**\n * Validate phone number completely\n */\n static validatePhoneNumber(country: LokotroCountry, phoneNumber: string): {\n isValid: boolean;\n errorType?: 'empty' | 'invalidPrefix' | 'tooShort' | 'tooLong';\n } {\n if (!phoneNumber || phoneNumber.length === 0) {\n return { isValid: false, errorType: 'empty' };\n }\n\n const cleanNumber = phoneNumber.replace(/[\\s\\-]/g, '');\n\n if (!LokotroCountryUtils.hasValidPrefix(country, cleanNumber)) {\n return { isValid: false, errorType: 'invalidPrefix' };\n }\n\n if (cleanNumber.length < country.refCountry.minPhoneNumberChars) {\n return { isValid: false, errorType: 'tooShort' };\n }\n\n if (cleanNumber.length > country.refCountry.maxPhoneNumberChars) {\n return { isValid: false, errorType: 'tooLong' };\n }\n\n return { isValid: true };\n }\n\n /**\n * Parse country from API response\n */\n static fromJson(json: Record<string, unknown>): LokotroCountry {\n const refCountryJson = (json['ref_country'] as Record<string, unknown>) || {};\n const countryCodesJson = (json['country_codes'] as Record<string, unknown>[]) || [];\n const prefixesJson = (json['phone_number_prefixes'] as Record<string, unknown>[]) || [];\n\n return {\n refCountry: {\n id: (refCountryJson['id'] as string) || '',\n name: (refCountryJson['name'] as string) || '',\n countryFlag: (refCountryJson['country_flag'] as string) || '🏳️',\n minPhoneNumberChars: (refCountryJson['min_phone_number_chars'] as number) || 9,\n maxPhoneNumberChars: (refCountryJson['max_phone_number_chars'] as number) || 15,\n },\n countryCodes: countryCodesJson.map(cc => ({\n id: (cc['id'] as string) || '',\n countryCode: (cc['country_code'] as string) || '',\n })),\n phoneNumberPrefixes: prefixesJson.map(p => ({\n id: (p['id'] as string) || '',\n prefix: (p['prefix'] as string) || '',\n })),\n };\n }\n}\n\n/**\n * API response for countries list\n */\nexport interface LokotroCountriesResponse {\n success: boolean;\n message: string;\n data: LokotroCountry[];\n}\n","/**\n * Lokotro Pay - HTTP Client Service\n * Angular version of the Flutter Lokotro Pay HTTP client\n */\n\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError, of } from 'rxjs';\nimport { catchError, map, timeout } from 'rxjs/operators';\nimport { LokotroPayEnv } from '../constants/environment';\nimport { LokotroHttpResponse } from '../models';\nimport { LokotroPayApiResponseCode, LokotroPayApiResponseCodeInfo } from '../enums';\n\n/**\n * HTTP Client configuration\n */\nexport interface LokotroHttpClientConfig {\n appKey?: string;\n acceptLanguage?: string;\n customHeaders?: Record<string, string>;\n}\n\n/**\n * Enhanced HTTP client for Lokotro Pay with modern error handling and logging\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class LokotroHttpClientService {\n private appKey?: string;\n private acceptLanguage: string = 'fr';\n private customHeaders: Record<string, string> = {};\n\n constructor(private http: HttpClient) {}\n\n /**\n * Configure the HTTP client\n */\n configure(config: LokotroHttpClientConfig): void {\n if (config.appKey) {\n this.appKey = config.appKey;\n }\n if (config.acceptLanguage) {\n this.acceptLanguage = config.acceptLanguage;\n }\n if (config.customHeaders) {\n this.customHeaders = { ...this.customHeaders, ...config.customHeaders };\n }\n }\n\n /**\n * Set app-key for Lokotro Gateway authentication\n */\n setAppKey(appKey: string): void {\n this.appKey = appKey;\n }\n\n /**\n * Remove app-key\n */\n clearAppKey(): void {\n this.appKey = undefined;\n }\n\n /**\n * Set accept-language header\n */\n setAcceptLanguage(language: string): void {\n this.acceptLanguage = language || 'fr';\n }\n\n /**\n * Clear accept-language header\n */\n clearAcceptLanguage(): void {\n this.acceptLanguage = 'fr';\n }\n\n /**\n * Build request headers\n */\n private buildHeaders(): HttpHeaders {\n let headers = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-API-Version': LokotroPayEnv.paymentApiVersion,\n 'X-Client': 'lokotro-pay-angular',\n 'Accept-Language': this.acceptLanguage\n });\n\n if (this.appKey) {\n headers = headers.set('app-key', this.appKey);\n }\n\n // Add custom headers\n Object.entries(this.customHeaders).forEach(([key, value]) => {\n headers = headers.set(key, value);\n });\n\n return headers;\n }\n\n /**\n * Build full URL\n */\n private buildUrl(path: string): string {\n const baseUrl = LokotroPayEnv.paymentApiUrl;\n return path.startsWith('/') ? `${baseUrl}${path}` : `${baseUrl}/${path}`;\n }\n\n /**\n * GET request with enhanced error handling\n */\n get<T>(path: string, queryParams?: Record<string, string>): Observable<LokotroHttpResponse<T>> {\n const url = this.buildUrl(path);\n const headers = this.buildHeaders();\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Pay HTTP] GET', url, queryParams);\n }\n\n return this.http.get<T>(url, { \n headers, \n params: queryParams \n }).pipe(\n timeout(LokotroPayEnv.timeoutMs),\n map(data => this.handleSuccess<T>(data)),\n catchError(error => this.handleError<T>(error))\n );\n }\n\n /**\n * POST request with enhanced error handling\n */\n post<T>(path: string, data?: unknown, queryParams?: Record<string, string>): Observable<LokotroHttpResponse<T>> {\n const url = this.buildUrl(path);\n const headers = this.buildHeaders();\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Pay HTTP] POST', url, data);\n }\n\n return this.http.post<T>(url, data, { \n headers, \n params: queryParams \n }).pipe(\n timeout(LokotroPayEnv.timeoutMs),\n map(responseData => this.handleSuccess<T>(responseData)),\n catchError(error => this.handleError<T>(error))\n );\n }\n\n /**\n * PUT request with enhanced error handling\n */\n put<T>(path: string, data?: unknown, queryParams?: Record<string, string>): Observable<LokotroHttpResponse<T>> {\n const url = this.buildUrl(path);\n const headers = this.buildHeaders();\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Pay HTTP] PUT', url, data);\n }\n\n return this.http.put<T>(url, data, { \n headers, \n params: queryParams \n }).pipe(\n timeout(LokotroPayEnv.timeoutMs),\n map(responseData => this.handleSuccess<T>(responseData)),\n catchError(error => this.handleError<T>(error))\n );\n }\n\n /**\n * DELETE request with enhanced error handling\n */\n delete<T>(path: string, queryParams?: Record<string, string>): Observable<LokotroHttpResponse<T>> {\n const url = this.buildUrl(path);\n const headers = this.buildHeaders();\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Pay HTTP] DELETE', url);\n }\n\n return this.http.delete<T>(url, { \n headers, \n params: queryParams \n }).pipe(\n timeout(LokotroPayEnv.timeoutMs),\n map(data => this.handleSuccess<T>(data)),\n catchError(error => this.handleError<T>(error))\n );\n }\n\n /**\n * Handle successful response\n */\n private handleSuccess<T>(data: T): LokotroHttpResponse<T> {\n const response = data as Record<string, unknown>;\n \n return {\n data,\n message: (response['message'] as string) || 'Success',\n statusCode: 200,\n isSuccess: true,\n apiResponseCode: response['api_response_code'] \n ? LokotroPayApiResponseCodeInfo.fromString(response['api_response_code'] as string)\n : LokotroPayApiResponseCode.LOK000,\n timestamp: new Date()\n };\n }\n\n /**\n * Handle error response\n */\n private handleError<T>(error: HttpErrorResponse | Error): Observable<LokotroHttpResponse<T>> {\n if (LokotroPayEnv.debugMode) {\n console.error('[Lokotro Pay HTTP] Error:', error);\n }\n\n let errorResponse: LokotroHttpResponse<T>;\n\n if (error instanceof HttpErrorResponse) {\n // Server error\n const serverError = error.error as Record<string, unknown> | null;\n errorResponse = {\n data: undefined,\n message: (serverError?.['message'] as string) || error.message || 'An error occurred',\n statusCode: error.status,\n isSuccess: false,\n apiResponseCode: serverError?.['api_response_code']\n ? LokotroPayApiResponseCodeInfo.fromString(serverError['api_response_code'] as string)\n : this.getApiResponseCodeFromStatus(error.status),\n timestamp: new Date()\n };\n } else if (error.name === 'TimeoutError') {\n // Timeout error\n errorResponse = {\n data: undefined,\n message: 'Request timeout',\n statusCode: 408,\n isSuccess: false,\n apiResponseCode: LokotroPayApiResponseCode.LOK008,\n timestamp: new Date()\n };\n } else {\n // Unknown error\n errorResponse = {\n data: undefined,\n message: error.message || 'An unexpected error occurred',\n statusCode: 0,\n isSuccess: false,\n apiResponseCode: LokotroPayApiResponseCode.LOK001,\n timestamp: new Date()\n };\n }\n\n return of(errorResponse);\n }\n\n /**\n * Map HTTP status code to API response code\n */\n private getApiResponseCodeFromStatus(status: number): LokotroPayApiResponseCode {\n switch (status) {\n case 400:\n return LokotroPayApiResponseCode.LOK002; // Invalid parameters\n case 401:\n case 403:\n return LokotroPayApiResponseCode.LOK003; // Authentication failed\n case 404:\n return LokotroPayApiResponseCode.LOK004; // Not found\n case 408:\n return LokotroPayApiResponseCode.LOK008; // Timeout\n case 500:\n case 502:\n case 503:\n return LokotroPayApiResponseCode.LOK009; // Service unavailable\n default:\n return LokotroPayApiResponseCode.LOK001; // General error\n }\n }\n}\n","/**\n * Lokotro Pay - Country Service\n * Service for fetching and managing country data for phone validation\n */\n\nimport { Injectable } from '@angular/core';\nimport { Observable, BehaviorSubject, of, throwError } from 'rxjs';\nimport { map, catchError, tap, shareReplay } from 'rxjs/operators';\nimport { LokotroHttpClientService } from './lokotro-http-client.service';\nimport { LokotroPayEnv } from '../constants/environment';\nimport { LokotroCountry, LokotroCountryUtils } from '../models/country';\n\n/**\n * Cache entry with timestamp\n */\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\n/**\n * Service for fetching and caching country data\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class LokotroCountryService {\n private countriesCache?: CacheEntry<LokotroCountry[]>;\n private countriesSubject = new BehaviorSubject<LokotroCountry[]>([]);\n private loadingRequest?: Observable<LokotroCountry[]>;\n \n /** Cache validity duration: 30 minutes */\n private readonly cacheValidityMs = 30 * 60 * 1000;\n\n /** Observable of countries list */\n public countries$ = this.countriesSubject.asObservable();\n\n constructor(private httpClient: LokotroHttpClientService) {}\n\n /**\n * Fetch countries from API with caching\n */\n fetchCountries(forceRefresh: boolean = false): Observable<LokotroCountry[]> {\n // Check cache first\n if (!forceRefresh && this.isCacheValid()) {\n return of(this.countriesCache!.data);\n }\n\n // Return existing request if in progress\n if (this.loadingRequest) {\n return this.loadingRequest;\n }\n\n // Fetch from API\n this.loadingRequest = this.httpClient.get<CountriesApiResponse>(\n '/payments/countries/fetch/countries-available'\n ).pipe(\n map(response => {\n if (response.isSuccess && response.data) {\n const data = response.data.data || response.data;\n const countriesArray = Array.isArray(data) ? data : [];\n return countriesArray.map((c: Record<string, unknown>) => LokotroCountryUtils.fromJson(c));\n }\n return [];\n }),\n tap(countries => {\n this.countriesCache = {\n data: countries,\n timestamp: Date.now()\n };\n this.countriesSubject.next(countries);\n this.loadingRequest = undefined;\n }),\n catchError(error => {\n this.loadingRequest = undefined;\n \n // Return stale cache if available\n if (this.countriesCache) {\n console.warn('[Lokotro Country] Using stale cache due to error:', error);\n return of(this.countriesCache.data);\n }\n \n console.error('[Lokotro Country] Failed to fetch countries:', error);\n return of([]);\n }),\n shareReplay(1)\n );\n\n return this.loadingRequest;\n }\n\n /**\n * Check if cache is still valid\n */\n private isCacheValid(): boolean {\n if (!this.countriesCache) return false;\n const age = Date.now() - this.countriesCache.timestamp;\n return age < this.cacheValidityMs;\n }\n\n /**\n * Get cached countries synchronously\n */\n getCachedCountries(): LokotroCountry[] {\n return this.countriesCache?.data || [];\n }\n\n /**\n * Get country by country code (e.g., \"243\")\n */\n getCountryByCode(countryCode: string): LokotroCountry | undefined {\n const countries = this.getCachedCountries();\n return countries.find(c => \n c.countryCodes.some(cc => cc.countryCode === countryCode)\n );\n }\n\n /**\n * Get country by ID\n */\n getCountryById(id: string): LokotroCountry | undefined {\n const countries = this.getCachedCountries();\n return countries.find(c => c.refCountry.id === id);\n }\n\n /**\n * Get default country (DRC or first available)\n */\n getDefaultCountry(): LokotroCountry | undefined {\n const countries = this.getCachedCountries();\n if (countries.length === 0) return undefined;\n\n // Try to find DRC first\n const drc = countries.find(c => \n c.countryCodes.some(cc => cc.countryCode === '243')\n );\n \n return drc || countries[0];\n }\n\n /**\n * Clear the cache\n */\n clearCache(): void {\n this.countriesCache = undefined;\n this.countriesSubject.next([]);\n }\n}\n\n/**\n * API response interface for countries\n */\ninterface CountriesApiResponse {\n success?: boolean;\n message?: string;\n data?: Record<string, unknown>[] | { data: Record<string, unknown>[] };\n}\n","/**\n * Lokotro Pay - Mobile Money Phone Input Component\n * Phone input with country code selector and prefix validation\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy, forwardRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { LokotroCountryService } from '../../services/lokotro-country.service';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\nimport { LokotroCountry, LokotroCountryUtils } from '../../models/country';\n\n@Component({\n selector: 'lokotro-mobile-money-phone-input',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => LokotroMobileMoneyPhoneInputComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => LokotroMobileMoneyPhoneInputComponent),\n multi: true\n }\n ],\n template: `\n <div class=\"lokotro-phone-input-container\">\n <!-- Label -->\n <label class=\"lokotro-label\" *ngIf=\"label\">{{ label }}</label>\n \n <!-- Input Row -->\n <div class=\"lokotro-phone-input-row\">\n <!-- Country Selector -->\n <button \n type=\"button\"\n class=\"lokotro-country-selector\"\n [disabled]=\"disabled || isLoading\"\n (click)=\"toggleCountryPicker()\">\n <span class=\"lokotro-flag\" *ngIf=\"selectedCountry && !isLoading\">\n {{ getFlag(selectedCountry) }}\n </span>\n <span class=\"lokotro-loading-spinner\" *ngIf=\"isLoading\"></span>\n <span class=\"lokotro-country-code\" *ngIf=\"selectedCountry\">\n +{{ getPrimaryCode(selectedCountry) }}\n </span>\n <span class=\"lokotro-dropdown-arrow\">▼</span>\n </button>\n\n <!-- Phone Input -->\n <input\n type=\"tel\"\n class=\"lokotro-phone-input\"\n [class.error]=\"hasError\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [value]=\"phoneNumber\"\n [attr.maxlength]=\"selectedCountry ? getMaxChars(selectedCountry) : 15\"\n (input)=\"onPhoneInput($event)\"\n (blur)=\"onTouched()\">\n </div>\n\n <!-- Prefix Error -->\n <div class=\"lokotro-prefix-error\" *ngIf=\"prefixError\">\n {{ prefixError }}\n </div>\n\n <!-- Valid Prefixes Hint -->\n <div class=\"lokotro-prefix-hints\" *ngIf=\"selectedCountry && showPrefixHints\">\n <span class=\"lokotro-hint-label\">{{ localization.translate('validPrefixes') }}</span>\n <span \n class=\"lokotro-prefix-chip\" \n *ngFor=\"let prefix of getVisiblePrefixes(selectedCountry)\">\n {{ prefix }}\n </span>\n <span \n class=\"lokotro-more-prefixes\" \n *ngIf=\"getValidPrefixes(selectedCountry).length > 6\">\n +{{ getValidPrefixes(selectedCountry).length - 6 }} {{ localization.translate('more') }}\n </span>\n </div>\n\n <!-- Country Picker Dropdown -->\n <div class=\"lokotro-country-picker\" *ngIf=\"showCountryPicker\">\n <div class=\"lokotro-picker-header\">\n <span class=\"lokotro-picker-title\">{{ localization.translate('selectCountry') }}</span>\n <button type=\"button\" class=\"lokotro-picker-close\" (click)=\"closeCountryPicker()\">×</button>\n </div>\n <div class=\"lokotro-picker-list\">\n <button\n type=\"button\"\n class=\"lokotro-country-option\"\n *ngFor=\"let country of countries\"\n [class.selected]=\"selectedCountry?.refCountry?.id === country.refCountry.id\"\n (click)=\"selectCountry(country)\">\n <span class=\"lokotro-option-flag\">{{ getFlag(country) }}</span>\n <span class=\"lokotro-option-name\">{{ country.refCountry.name | uppercase }}</span>\n <span class=\"lokotro-option-code\">+{{ getPrimaryCode(country) }}</span>\n <span class=\"lokotro-option-check\" *ngIf=\"selectedCountry?.refCountry?.id === country.refCountry.id\">✓</span>\n </button>\n </div>\n </div>\n\n <!-- Backdrop for picker -->\n <div \n class=\"lokotro-picker-backdrop\" \n *ngIf=\"showCountryPicker\"\n (click)=\"closeCountryPicker()\">\n </div>\n </div>\n `,\n styles: [`\n .lokotro-phone-input-container {\n position: relative;\n width: 100%;\n }\n\n .lokotro-label {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n .lokotro-phone-input-row {\n display: flex;\n gap: 12px;\n align-items: stretch;\n }\n\n .lokotro-country-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n background: var(--lokotro-card, #3A4840);\n border: 2px solid var(--lokotro-border, #3A473F);\n border-radius: 12px;\n color: var(--lokotro-text-primary, #F2F0D5);\n cursor: pointer;\n transition: border-color 0.2s;\n white-space: nowrap;\n }\n\n .lokotro-country-selector:hover:not(:disabled) {\n border-color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-country-selector:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .lokotro-flag {\n font-size: 24px;\n line-height: 1;\n }\n\n .lokotro-country-code {\n font-size: 16px;\n font-weight: 600;\n }\n\n .lokotro-dropdown-arrow {\n font-size: 10px;\n opacity: 0.6;\n }\n\n .lokotro-loading-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid var(--lokotro-border, #3A473F);\n border-top-color: var(--lokotro-accent, #3BFBDA);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .lokotro-phone-input {\n flex: 1;\n padding: 14px 16px;\n background: var(--lokotro-card, #3A4840);\n border: 2px solid var(--lokotro-border, #3A473F);\n border-radius: 12px;\n color: var(--lokotro-text-primary, #F2F0D5);\n font-size: 16px;\n transition: border-color 0.2s;\n min-width: 0;\n }\n\n .lokotro-phone-input:focus {\n outline: none;\n border-color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-phone-input.error {\n border-color: var(--lokotro-error, #D97652);\n }\n\n .lokotro-phone-input::placeholder {\n color: var(--lokotro-text-secondary, #D5D3B8);\n opacity: 0.6;\n }\n\n .lokotro-phone-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .lokotro-prefix-error {\n margin-top: 6px;\n font-size: 12px;\n color: var(--lokotro-error, #D97652);\n }\n\n .lokotro-prefix-hints {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n }\n\n .lokotro-hint-label {\n font-size: 12px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n .lokotro-prefix-chip {\n padding: 2px 8px;\n background: rgba(59, 251, 218, 0.1);\n border-radius: 4px;\n font-size: 12px;\n font-weight: 600;\n color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-more-prefixes {\n font-size: 12px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n /* Country Picker Dropdown */\n .lokotro-country-picker {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n max-height: 300px;\n background: var(--lokotro-card, #3A4840);\n border: 2px solid var(--lokotro-border, #3A473F);\n border-radius: 12px;\n margin-top: 4px;\n z-index: 1000;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .lokotro-picker-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--lokotro-border, #3A473F);\n }\n\n .lokotro-picker-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-picker-close {\n background: none;\n border: none;\n font-size: 24px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n cursor: pointer;\n padding: 0;\n line-height: 1;\n }\n\n .lokotro-picker-list {\n overflow-y: auto;\n max-height: 250px;\n }\n\n .lokotro-country-option {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n padding: 12px 16px;\n background: none;\n border: none;\n color: var(--lokotro-text-primary, #F2F0D5);\n cursor: pointer;\n text-align: left;\n transition: background-color 0.2s;\n }\n\n .lokotro-country-option:hover {\n background: var(--lokotro-surface, #2A3832);\n }\n\n .lokotro-country-option.selected {\n background: rgba(59, 251, 218, 0.1);\n }\n\n .lokotro-option-flag {\n font-size: 28px;\n }\n\n .lokotro-option-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n }\n\n .lokotro-option-code {\n font-size: 12px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n .lokotro-option-check {\n color: var(--lokotro-accent, #3BFBDA);\n font-weight: bold;\n }\n\n .lokotro-picker-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n `]\n})\nexport class LokotroMobileMoneyPhoneInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {\n @Input() label?: string;\n @Input() placeholder: string = 'XXX XXX XXX';\n @Input() initialCountryCode: string = '243';\n @Input() showPrefixHints: boolean = true;\n @Input() disabled: boolean = false;\n\n @Output() countryChanged = new EventEmitter<LokotroCountry>();\n @Output() phoneChanged = new EventEmitter<{ phoneNumber: string; fullNumber: string; country: LokotroCountry | null }>();\n\n countries: LokotroCountry[] = [];\n selectedCountry?: LokotroCountry;\n phoneNumber: string = '';\n isLoading: boolean = true;\n showCountryPicker: boolean = false;\n prefixError?: string;\n hasError: boolean = false;\n\n private subscription?: Subscription;\n private onChange: (value: string) => void = () => {};\n onTouched: () => void = () => {};\n\n constructor(\n private countryService: LokotroCountryService,\n public localization: LokotroLocalizationService\n ) {}\n\n ngOnInit(): void {\n this.loadCountries();\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n }\n\n private loadCountries(): void {\n this.isLoading = true;\n this.subscription = this.countryService.fetchCountries().subscribe({\n next: (countries) => {\n this.countries = countries;\n this.isLoading = false;\n\n // Set initial country\n if (countries.length > 0) {\n const initial = countries.find(c => \n c.countryCodes.some(cc => cc.countryCode === this.initialCountryCode)\n ) || countries[0];\n this.selectCountry(initial, false);\n }\n },\n error: () => {\n this.isLoading = false;\n }\n });\n }\n\n // Helper methods using LokotroCountryUtils\n getFlag(country: LokotroCountry): string {\n return LokotroCountryUtils.getFlag(country);\n }\n\n getPrimaryCode(country: LokotroCountry): string {\n return LokotroCountryUtils.getPrimaryCountryCode(country);\n }\n\n getValidPrefixes(country: LokotroCountry): string[] {\n return LokotroCountryUtils.getValidPrefixes(country);\n }\n\n getVisiblePrefixes(country: LokotroCountry): string[] {\n return this.getValidPrefixes(country).slice(0, 6);\n }\n\n getMaxChars(country: LokotroCountry): number {\n return LokotroCountryUtils.getMaxPhoneChars(country);\n }\n\n toggleCountryPicker(): void {\n if (!this.disabled && !this.isLoading) {\n this.showCountryPicker = !this.showCountryPicker;\n }\n }\n\n closeCountryPicker(): void {\n this.showCountryPicker = false;\n }\n\n selectCountry(country: LokotroCountry, emitChange: boolean = true): void {\n this.selectedCountry = country;\n this.closeCountryPicker();\n this.validatePhoneNumber();\n \n if (emitChange) {\n this.countryChanged.emit(country);\n this.emitPhoneChange();\n }\n }\n\n onPhoneInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n // Only allow digits\n const value = input.value.replace(/\\D/g, '');\n this.phoneNumber = value;\n input.value = value;\n \n this.validatePhoneNumber();\n this.emitPhoneChange();\n this.onChange(this.getFullPhoneNumber());\n }\n\n private validatePhoneNumber(): void {\n if (!this.selectedCountry || !this.phoneNumber) {\n this.prefixError = undefined;\n this.hasError = false;\n return;\n }\n\n const validation = LokotroCountryUtils.validatePhoneNumber(this.selectedCountry, this.phoneNumber);\n \n if (!validation.isValid && validation.errorType === 'invalidPrefix') {\n this.prefixError = this.localization.translate('invalidPhonePrefix');\n this.hasError = true;\n } else {\n this.prefixError = undefined;\n this.hasError = false;\n }\n }\n\n private emitPhoneChange(): void {\n this.phoneChanged.emit({\n phoneNumber: this.phoneNumber,\n fullNumber: this.getFullPhoneNumber(),\n country: this.selectedCountry || null\n });\n }\n\n getFullPhoneNumber(): string {\n if (!this.selectedCountry || !this.phoneNumber) {\n return this.phoneNumber;\n }\n const countryCode = LokotroCountryUtils.getPrimaryCountryCode(this.selectedCountry);\n return `${countryCode}${this.phoneNumber}`;\n }\n\n // ControlValueAccessor implementation\n writeValue(value: string): void {\n this.phoneNumber = value || '';\n this.validatePhoneNumber();\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n if (!this.phoneNumber) {\n return { required: true };\n }\n\n if (!this.selectedCountry) {\n return null;\n }\n\n const validation = LokotroCountryUtils.validatePhoneNumber(this.selectedCountry, this.phoneNumber);\n \n if (!validation.isValid) {\n switch (validation.errorType) {\n case 'invalidPrefix':\n return { invalidPrefix: true };\n case 'tooShort':\n return { tooShort: { min: this.selectedCountry.refCountry.minPhoneNumberChars } };\n case 'tooLong':\n return { tooLong: { max: this.selectedCountry.refCountry.maxPhoneNumberChars } };\n default:\n return { invalid: true };\n }\n }\n\n return null;\n }\n}\n","/**\n * Lokotro Pay - Payment Form Component\n * Handles different payment form types based on channel\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { LokotroPayChannel } from '../../enums';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\nimport { LokotroMobileMoneyPhoneInputComponent } from '../mobile-money-phone-input/mobile-money-phone-input.component';\nimport { LokotroCountry, LokotroCountryUtils } from '../../models/country';\n\n@Component({\n selector: 'lokotro-payment-form',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule, LokotroMobileMoneyPhoneInputComponent],\n template: `\n <div class=\"lokotro-payment-form\">\n <!-- E-Wallet Form -->\n <form *ngIf=\"isEWalletForm\" [formGroup]=\"ewalletForm\" (ngSubmit)=\"submitEWalletForm()\">\n <h3 class=\"lokotro-form-title\">{{ localization.translate('eWallet') }}</h3>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('walletNumber') }}</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"walletNumber\"\n placeholder=\"Enter wallet number\">\n <span class=\"lokotro-error\" *ngIf=\"ewalletForm.get('walletNumber')?.touched && ewalletForm.get('walletNumber')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('pin') }}</label>\n <input \n type=\"password\" \n class=\"lokotro-input\" \n formControlName=\"walletPin\"\n placeholder=\"Enter PIN\"\n maxlength=\"6\">\n <span class=\"lokotro-error\" *ngIf=\"ewalletForm.get('walletPin')?.touched && ewalletForm.get('walletPin')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-actions\">\n <button type=\"button\" class=\"lokotro-btn-secondary\" (click)=\"onCancel()\">\n {{ localization.translate('cancel') }}\n </button>\n <button type=\"submit\" class=\"lokotro-btn-primary\" [disabled]=\"ewalletForm.invalid\">\n {{ localization.translate('confirm') }}\n </button>\n </div>\n </form>\n\n <!-- Mobile Money Form -->\n <form *ngIf=\"isMobileMoneyForm\" [formGroup]=\"mobileMoneyForm\" (ngSubmit)=\"submitMobileMoneyForm()\">\n <h3 class=\"lokotro-form-title\">{{ localization.translate('mobileMoneyPayment') }}</h3>\n \n <!-- Personal Information Section - shown when showUserInfoForm is true -->\n <div class=\"lokotro-user-info-section\" *ngIf=\"showUserInfoForm\">\n <h4 class=\"lokotro-section-subtitle\">{{ localization.translate('personalInfo') }}</h4>\n \n <div class=\"lokotro-form-row\">\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('firstName') }}</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"firstName\"\n placeholder=\"John\">\n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('firstName')?.touched && mobileMoneyForm.get('firstName')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('lastName') }}</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"lastName\"\n placeholder=\"Doe\">\n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('lastName')?.touched && mobileMoneyForm.get('lastName')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n </div>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('email') }}</label>\n <input \n type=\"email\" \n class=\"lokotro-input\" \n formControlName=\"email\"\n placeholder=\"john.doe@example.com\">\n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('email')?.touched && mobileMoneyForm.get('email')?.invalid\">\n {{ localization.translate('invalidEmail') }}\n </span>\n </div>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('phoneNumber') }} ({{ localization.translate('personalPhone') }})</label>\n <input \n type=\"tel\" \n class=\"lokotro-input\" \n formControlName=\"personalPhone\"\n placeholder=\"+243 XXX XXX XXX\">\n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('personalPhone')?.touched && mobileMoneyForm.get('personalPhone')?.invalid\">\n {{ localization.translate('invalidPhoneNumber') }}\n </span>\n </div>\n \n <hr class=\"lokotro-divider\">\n </div>\n \n <!-- Mobile Money Phone Input -->\n <h4 class=\"lokotro-section-subtitle\" *ngIf=\"showUserInfoForm\">{{ localization.translate('mobileMoneyDetails') }}</h4>\n \n <lokotro-mobile-money-phone-input\n [label]=\"localization.translate('mobileMoneyPhone')\"\n [initialCountryCode]=\"'243'\"\n [showPrefixHints]=\"true\"\n (countryChanged)=\"onCountryChanged($event)\"\n (phoneChanged)=\"onPhoneChanged($event)\"\n formControlName=\"phoneNumber\">\n </lokotro-mobile-money-phone-input>\n \n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('phoneNumber')?.touched && mobileMoneyForm.get('phoneNumber')?.hasError('invalidPrefix')\">\n {{ localization.translate('invalidPhonePrefix') }}\n </span>\n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('phoneNumber')?.touched && mobileMoneyForm.get('phoneNumber')?.hasError('tooShort')\">\n {{ localization.translate('phoneTooShort') }}\n </span>\n <span class=\"lokotro-error\" *ngIf=\"mobileMoneyForm.get('phoneNumber')?.touched && mobileMoneyForm.get('phoneNumber')?.hasError('tooLong')\">\n {{ localization.translate('phoneTooLong') }}\n </span>\n\n <div class=\"lokotro-form-actions\">\n <button type=\"button\" class=\"lokotro-btn-secondary\" (click)=\"onCancel()\">\n {{ localization.translate('cancel') }}\n </button>\n <button type=\"submit\" class=\"lokotro-btn-primary\" [disabled]=\"mobileMoneyForm.invalid\">\n {{ localization.translate('confirm') }}\n </button>\n </div>\n </form>\n\n <!-- Card Form -->\n <form *ngIf=\"isCardForm\" [formGroup]=\"cardForm\" (ngSubmit)=\"submitCardForm()\">\n <h3 class=\"lokotro-form-title\">{{ localization.translate('card') }}</h3>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('cardNumber') }}</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"cardNumber\"\n placeholder=\"1234 5678 9012 3456\"\n maxlength=\"19\"\n (input)=\"formatCardNumber($event)\">\n <span class=\"lokotro-error\" *ngIf=\"cardForm.get('cardNumber')?.touched && cardForm.get('cardNumber')?.invalid\">\n {{ localization.translate('invalidCardNumber') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('cardHolderName') }}</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"cardHolderName\"\n placeholder=\"John Doe\">\n <span class=\"lokotro-error\" *ngIf=\"cardForm.get('cardHolderName')?.touched && cardForm.get('cardHolderName')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-row\">\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('expiryDate') }}</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"expiryDate\"\n placeholder=\"MM/YY\"\n maxlength=\"5\"\n (input)=\"formatExpiryDate($event)\">\n <span class=\"lokotro-error\" *ngIf=\"cardForm.get('expiryDate')?.touched && cardForm.get('expiryDate')?.invalid\">\n {{ localization.translate('invalidExpiryDate') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('cvv') }}</label>\n <input \n type=\"password\" \n class=\"lokotro-input\" \n formControlName=\"cvv\"\n placeholder=\"123\"\n maxlength=\"4\">\n <span class=\"lokotro-error\" *ngIf=\"cardForm.get('cvv')?.touched && cardForm.get('cvv')?.invalid\">\n {{ localization.translate('invalidCvv') }}\n </span>\n </div>\n </div>\n\n <div class=\"lokotro-form-actions\">\n <button type=\"button\" class=\"lokotro-btn-secondary\" (click)=\"onCancel()\">\n {{ localization.translate('cancel') }}\n </button>\n <button type=\"submit\" class=\"lokotro-btn-primary\" [disabled]=\"cardForm.invalid\">\n {{ localization.translate('confirm') }}\n </button>\n </div>\n </form>\n\n <!-- Flash Form -->\n <form *ngIf=\"isFlashForm\" [formGroup]=\"flashForm\" (ngSubmit)=\"submitFlashForm()\">\n <h3 class=\"lokotro-form-title\">{{ localization.translate('eFlash') }}</h3>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">Flash Number</label>\n <input \n type=\"text\" \n class=\"lokotro-input\" \n formControlName=\"flashNumber\"\n placeholder=\"Enter flash number\">\n <span class=\"lokotro-error\" *ngIf=\"flashForm.get('flashNumber')?.touched && flashForm.get('flashNumber')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('pin') }}</label>\n <input \n type=\"password\" \n class=\"lokotro-input\" \n formControlName=\"flashPin\"\n placeholder=\"Enter PIN\"\n maxlength=\"6\">\n <span class=\"lokotro-error\" *ngIf=\"flashForm.get('flashPin')?.touched && flashForm.get('flashPin')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n\n <div class=\"lokotro-form-actions\">\n <button type=\"button\" class=\"lokotro-btn-secondary\" (click)=\"onCancel()\">\n {{ localization.translate('cancel') }}\n </button>\n <button type=\"submit\" class=\"lokotro-btn-primary\" [disabled]=\"flashForm.invalid\">\n {{ localization.translate('confirm') }}\n </button>\n </div>\n </form>\n </div>\n `,\n styles: [`\n .lokotro-payment-form {\n width: 100%;\n }\n\n .lokotro-form-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 24px 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n text-align: center;\n }\n\n .lokotro-form-group {\n margin-bottom: 20px;\n }\n\n .lokotro-form-row {\n display: flex;\n gap: 16px;\n }\n\n .lokotro-form-row .lokotro-form-group {\n flex: 1;\n }\n\n .lokotro-label {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n .lokotro-input {\n width: 100%;\n padding: 14px 16px;\n background: var(--lokotro-card, #3A4840);\n border: 2px solid var(--lokotro-border, #3A473F);\n border-radius: 12px;\n color: var(--lokotro-text-primary, #F2F0D5);\n font-size: 16px;\n transition: border-color 0.2s;\n box-sizing: border-box;\n }\n\n .lokotro-input:focus {\n outline: none;\n border-color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-input::placeholder {\n color: var(--lokotro-text-secondary, #D5D3B8);\n opacity: 0.6;\n }\n\n .lokotro-error {\n display: block;\n margin-top: 6px;\n font-size: 12px;\n color: var(--lokotro-error, #D97652);\n }\n\n .lokotro-user-info-section {\n margin-bottom: 24px;\n }\n\n .lokotro-section-subtitle {\n font-size: 16px;\n font-weight: 600;\n margin: 0 0 16px 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-divider {\n border: none;\n border-top: 1px solid var(--lokotro-border, #3A473F);\n margin: 24px 0;\n }\n\n .lokotro-form-actions {\n display: flex;\n gap: 12px;\n margin-top: 32px;\n }\n\n .lokotro-btn-primary,\n .lokotro-btn-secondary {\n flex: 1;\n padding: 14px 24px;\n border-radius: 12px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .lokotro-btn-primary {\n background: linear-gradient(135deg, var(--lokotro-primary, #5A5E39), var(--lokotro-secondary, #6E7346));\n color: var(--lokotro-text-primary, #F2F0D5);\n border: none;\n }\n\n .lokotro-btn-primary:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);\n }\n\n .lokotro-btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .lokotro-btn-secondary {\n background: transparent;\n color: var(--lokotro-text-primary, #F2F0D5);\n border: 2px solid var(--lokotro-border, #3A473F);\n }\n\n .lokotro-btn-secondary:hover {\n border-color: var(--lokotro-text-secondary, #D5D3B8);\n }\n `]\n})\nexport class LokotroPaymentFormComponent implements OnInit {\n @Input() channel?: LokotroPayChannel;\n @Input() transactionId?: string;\n @Input() showUserInfoForm: boolean = false; // Show user info form when filling_info is 'none'\n @Output() formSubmitted = new EventEmitter<Record<string, unknown>>();\n @Output() cancel = new EventEmitter<void>();\n\n ewalletForm!: FormGroup;\n mobileMoneyForm!: FormGroup;\n cardForm!: FormGroup;\n flashForm!: FormGroup;\n\n // Mobile money country tracking\n selectedMobileMoneyCountry?: LokotroCountry;\n fullMobileMoneyPhoneNumber: string = '';\n\n constructor(\n private fb: FormBuilder,\n public localization: LokotroLocalizationService\n ) {}\n\n ngOnInit(): void {\n this.initializeForms();\n }\n\n private initializeForms(): void {\n this.ewalletForm = this.fb.group({\n walletNumber: ['', [Validators.required]],\n walletPin: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(6)]]\n });\n\n // Mobile money form with optional user info fields\n const mobileMoneyFormConfig: Record<string, any> = {\n phoneNumber: ['', [Validators.required]]\n };\n \n // Add user info fields if showUserInfoForm is true\n if (this.showUserInfoForm) {\n mobileMoneyFormConfig['firstName'] = ['', [Validators.required]];\n mobileMoneyFormConfig['lastName'] = ['', [Validators.required]];\n mobileMoneyFormConfig['email'] = ['', [Validators.required, Validators.email]];\n mobileMoneyFormConfig['personalPhone'] = ['', [Validators.required]];\n }\n \n this.mobileMoneyForm = this.fb.group(mobileMoneyFormConfig);\n\n this.cardForm = this.fb.group({\n cardNumber: ['', [Validators.required, Validators.pattern(/^[0-9\\s]{16,19}$/)]],\n cardHolderName: ['', [Validators.required]],\n expiryDate: ['', [Validators.required, Validators.pattern(/^(0[1-9]|1[0-2])\\/([0-9]{2})$/)]],\n cvv: ['', [Validators.required, Validators.pattern(/^[0-9]{3,4}$/)]]\n });\n\n this.flashForm = this.fb.group({\n flashNumber: ['', [Validators.required]],\n flashPin: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(6)]]\n });\n }\n\n get isEWalletForm(): boolean {\n return this.channel === LokotroPayChannel.EWallet || \n this.channel === LokotroPayChannel.LokotroWallet;\n }\n\n get isMobileMoneyForm(): boolean {\n return this.channel === LokotroPayChannel.MobileMoney;\n }\n\n get isCardForm(): boolean {\n return this.channel === LokotroPayChannel.Card || \n this.channel === LokotroPayChannel.VirtualCard;\n }\n\n get isFlashForm(): boolean {\n return this.channel === LokotroPayChannel.EFlash;\n }\n\n formatCardNumber(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value.replace(/\\s/g, '').replace(/\\D/g, '');\n value = value.replace(/(.{4})/g, '$1 ').trim();\n input.value = value;\n this.cardForm.patchValue({ cardNumber: value });\n }\n\n formatExpiryDate(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value.replace(/\\D/g, '');\n if (value.length >= 2) {\n value = value.slice(0, 2) + '/' + value.slice(2);\n }\n input.value = value;\n this.cardForm.patchValue({ expiryDate: value });\n }\n\n submitEWalletForm(): void {\n if (this.ewalletForm.valid) {\n this.formSubmitted.emit({\n walletNumber: this.ewalletForm.value.walletNumber,\n walletPin: this.ewalletForm.value.walletPin\n });\n }\n }\n\n submitMobileMoneyForm(): void {\n if (this.mobileMoneyForm.valid) {\n // Build submission data\n const submitData: Record<string, unknown> = {\n mobileMoneyPhoneNumber: this.fullMobileMoneyPhoneNumber || this.mobileMoneyForm.value.phoneNumber\n };\n \n // Add user info if form is shown\n if (this.showUserInfoForm) {\n submitData['firstName'] = this.mobileMoneyForm.value.firstName;\n submitData['lastName'] = this.mobileMoneyForm.value.lastName;\n submitData['email'] = this.mobileMoneyForm.value.email;\n submitData['phoneNumber'] = this.mobileMoneyForm.value.personalPhone;\n }\n \n this.formSubmitted.emit(submitData);\n }\n }\n\n // Country changed handler for mobile money\n onCountryChanged(country: LokotroCountry): void {\n this.selectedMobileMoneyCountry = country;\n }\n\n // Phone changed handler for mobile money\n onPhoneChanged(event: { phoneNumber: string; fullNumber: string; country: LokotroCountry | null }): void {\n this.fullMobileMoneyPhoneNumber = event.fullNumber;\n }\n\n submitCardForm(): void {\n if (this.cardForm.valid) {\n const cardNumber = this.cardForm.value.cardNumber.replace(/\\s/g, '');\n this.formSubmitted.emit({\n cardNumber,\n cardHolderName: this.cardForm.value.cardHolderName,\n cardExpiryDate: this.cardForm.value.expiryDate,\n cardCvv: this.cardForm.value.cvv\n });\n }\n }\n\n submitFlashForm(): void {\n if (this.flashForm.valid) {\n this.formSubmitted.emit({\n flashNumber: this.flashForm.value.flashNumber,\n flashPin: this.flashForm.value.flashPin\n });\n }\n }\n\n onCancel(): void {\n this.cancel.emit();\n }\n}\n","/**\n * Lokotro Pay - Payment Service\n * Main payment service that follows the Lokotro Gateway API flow\n */\n\nimport { Injectable } from '@angular/core';\nimport { Observable, BehaviorSubject, throwError } from 'rxjs';\nimport { map, catchError, tap } from 'rxjs/operators';\nimport { LokotroHttpClientService } from './lokotro-http-client.service';\nimport { LokotroPayEnv } from '../constants/environment';\nimport {\n LokotroPaymentBody,\n LokotroPayResponse,\n LokotroPayError,\n LokotroPaymentInfo,\n LokotroPaymentMethod,\n LokotroTransactionDetails,\n LokotroPaymentSubmitRequest,\n LokotroPaymentSubmitResponse,\n LokotroOtpVerifyRequest,\n LokotroOtpVerifyResponse,\n LokotroOtpResendRequest,\n LokotroOtpResendResponse,\n LokotroHttpResponse,\n LokotroBank,\n LokotroBankEntity,\n LokotroBankAccount,\n LokotroBankCurrency\n} from '../models';\nimport {\n LokotroPayChannel,\n LokotroPaymentStatus,\n LokotroPayApiResponseCode,\n LokotroPaymentStatusInfo,\n LokotroPayApiResponseCodeInfo,\n LokotroPayScreenNavigation\n} from '../enums';\n\n/**\n * Payment state for reactive updates\n */\nexport interface LokotroPaymentState {\n isLoading: boolean;\n currentScreen: LokotroPayScreenNavigation;\n transactionId?: string;\n paymentInfo?: LokotroPaymentInfo;\n selectedPaymentMethod?: LokotroPaymentMethod;\n error?: LokotroPayError;\n response?: LokotroPayResponse;\n}\n\n/**\n * Initial payment state\n */\nconst initialState: LokotroPaymentState = {\n isLoading: false,\n currentScreen: LokotroPayScreenNavigation.LoadingScreen\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LokotroPaymentService {\n private stateSubject = new BehaviorSubject<LokotroPaymentState>(initialState);\n public state$ = this.stateSubject.asObservable();\n\n constructor(private httpClient: LokotroHttpClientService) { }\n\n /**\n * Get current state\n */\n get currentState(): LokotroPaymentState {\n return this.stateSubject.value;\n }\n\n /**\n * Update state\n */\n private updateState(partialState: Partial<LokotroPaymentState>): void {\n this.stateSubject.next({\n ...this.currentState,\n ...partialState\n });\n }\n\n /**\n * Reset state to initial\n */\n resetState(): void {\n this.stateSubject.next(initialState);\n }\n\n /**\n * Set app-key for authentication\n */\n setAppKey(appKey: string): void {\n this.httpClient.setAppKey(appKey);\n }\n\n /**\n * Set accept language\n */\n setAcceptLanguage(language: string): void {\n this.httpClient.setAcceptLanguage(language);\n }\n\n /**\n * Step 1: Create payment transaction\n * POST /payments/collect\n */\n createPayment(paymentBody: LokotroPaymentBody): Observable<LokotroHttpResponse<CreatePaymentResponse>> {\n this.updateState({ isLoading: true });\n\n const requestData = this.convertPaymentBodyToRequest(paymentBody);\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Creating payment:', requestData);\n }\n\n return this.httpClient.post<CreatePaymentResponse>(\n LokotroPayEnv.endpoints.collect,\n requestData\n ).pipe(\n tap(response => {\n if (response.isSuccess && response.data) {\n const paymentInfo = this.parsePaymentInfo(response.data);\n this.updateState({\n isLoading: false,\n transactionId: response.data.transaction_id,\n paymentInfo,\n currentScreen: paymentInfo.showPaymentMethodForm\n ? LokotroPayScreenNavigation.PaymentMethodSelectionScreen\n : LokotroPayScreenNavigation.PaymentFormScreen\n });\n } else {\n this.updateState({\n isLoading: false,\n error: {\n message: response.message,\n title: 'Payment Creation Failed',\n errorCode: response.apiResponseCode,\n timestamp: new Date()\n },\n currentScreen: LokotroPayScreenNavigation.ErrorScreen\n });\n }\n }),\n catchError(error => {\n this.updateState({\n isLoading: false,\n error: {\n message: error.message || 'Failed to create payment',\n title: 'Error',\n timestamp: new Date()\n },\n currentScreen: LokotroPayScreenNavigation.ErrorScreen\n });\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Step 2: Get transaction details\n * GET /payments/transaction/{transaction_id}\n */\n getTransactionDetails(transactionId: string): Observable<LokotroHttpResponse<TransactionDetailsResponse>> {\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Getting transaction details:', transactionId);\n }\n\n return this.httpClient.get<TransactionDetailsResponse>(\n `${LokotroPayEnv.endpoints.transaction}/${transactionId}`\n ).pipe(\n tap(response => {\n if (response.isSuccess && response.data) {\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Transaction details:', response.data);\n }\n }\n })\n );\n }\n\n /**\n * Step 3: Submit payment details\n * POST /payments/submit\n */\n submitPaymentDetails(request: LokotroPaymentSubmitRequest): Observable<LokotroHttpResponse<PaymentSubmitResponse>> {\n this.updateState({\n isLoading: true,\n currentScreen: LokotroPayScreenNavigation.ProcessingScreen\n });\n\n const requestData = this.convertSubmitRequestToData(request);\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Submitting payment details:', requestData);\n }\n\n return this.httpClient.post<PaymentSubmitResponse>(\n LokotroPayEnv.endpoints.submit,\n requestData\n ).pipe(\n tap(response => {\n if (response.isSuccess && response.data) {\n const submitResponse = this.parseSubmitResponse(response.data);\n\n if (submitResponse.requiresOtp) {\n this.updateState({\n isLoading: false,\n currentScreen: LokotroPayScreenNavigation.EWalletOtpScreen\n });\n } else if (submitResponse.redirectUrl) {\n // Handle redirect for hosted checkout\n window.location.href = submitResponse.redirectUrl;\n } else if (LokotroPaymentStatusInfo.isSuccess(submitResponse.status)) {\n this.handlePaymentSuccess(response.data);\n } else if (LokotroPaymentStatusInfo.isPending(submitResponse.status)) {\n this.updateState({\n isLoading: false,\n currentScreen: LokotroPayScreenNavigation.MobileMoneyProcessingScreen\n });\n } else {\n this.handlePaymentFailure(response.message, response.apiResponseCode);\n }\n } else {\n this.handlePaymentFailure(response.message, response.apiResponseCode);\n }\n }),\n catchError(error => {\n this.handlePaymentFailure(error.message);\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Step 4: Verify OTP (for e-wallet and flash payments)\n * POST /payments/verify-otp\n */\n verifyOtp(request: LokotroOtpVerifyRequest): Observable<LokotroHttpResponse<OtpVerifyResponse>> {\n this.updateState({ isLoading: true });\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Verifying OTP:', request.transactionId);\n }\n\n return this.httpClient.post<OtpVerifyResponse>(\n LokotroPayEnv.endpoints.verifyOtp,\n {\n transaction_id: request.transactionId,\n otp: request.otp\n }\n ).pipe(\n tap(response => {\n if (response.isSuccess && response.data) {\n const status = LokotroPaymentStatusInfo.fromString(response.data.status || '');\n\n if (LokotroPaymentStatusInfo.isSuccess(status)) {\n this.handlePaymentSuccess(response.data);\n } else {\n this.handlePaymentFailure(response.message, response.apiResponseCode);\n }\n } else {\n this.updateState({\n isLoading: false,\n error: {\n message: response.message || 'OTP verification failed',\n title: 'Verification Failed',\n errorCode: response.apiResponseCode,\n timestamp: new Date()\n }\n });\n }\n }),\n catchError(error => {\n this.updateState({\n isLoading: false,\n error: {\n message: error.message || 'OTP verification failed',\n title: 'Error',\n timestamp: new Date()\n }\n });\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Step 5: Resend OTP (if needed)\n * POST /payments/resend-otp\n */\n resendOtp(request: LokotroOtpResendRequest): Observable<LokotroHttpResponse<OtpResendResponse>> {\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Resending OTP:', request.transactionId);\n }\n\n return this.httpClient.post<OtpResendResponse>(\n LokotroPayEnv.endpoints.resendOtp,\n { transaction_id: request.transactionId }\n );\n }\n\n /**\n * Fetch available banks configuration\n * GET /payments/get-config-bank\n */\n fetchAvailableBanks(): Observable<LokotroHttpResponse<LokotroBank[]>> {\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Fetching available banks');\n }\n\n return this.httpClient.get<Record<string, unknown>>(\n '/payments/get-config-bank'\n ).pipe(\n map(response => {\n const banksData = (response.data?.['data'] as Record<string, unknown>[]) || [];\n const banks = banksData.map(b => this.parseBank(b));\n\n return {\n ...response,\n data: banks\n } as LokotroHttpResponse<LokotroBank[]>;\n }),\n tap(response => {\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment] Banks fetched:', response.data?.length);\n }\n })\n );\n }\n\n /**\n * Select payment method\n */\n selectPaymentMethod(method: LokotroPaymentMethod): void {\n this.updateState({\n selectedPaymentMethod: method,\n currentScreen: this.getFormScreenForChannel(method.channel)\n });\n }\n\n /**\n * Navigate to screen\n */\n navigateToScreen(screen: LokotroPayScreenNavigation): void {\n this.updateState({ currentScreen: screen });\n }\n\n /**\n * Handle payment success\n */\n private handlePaymentSuccess(data: Record<string, unknown> | LokotroPaymentSubmitResponse): void {\n const response: LokotroPayResponse = {\n message: (data as Record<string, unknown>)['message'] as string || 'Payment successful',\n title: (data as Record<string, unknown>)['title'] as string || 'Success',\n customRef: (data as Record<string, unknown>)['custom_ref'] as string || (data as Record<string, unknown>)['customer_reference'] as string || '',\n amount: parseFloat(((data as Record<string, unknown>)['amount'] as string) || '0'),\n apiResponseCode: LokotroPayApiResponseCode.LOK000,\n currency: (data as Record<string, unknown>)['currency'] as string || '',\n paymentStatus: LokotroPaymentStatus.Approved,\n systemRef: (data as Record<string, unknown>)['system_ref'] as string || (data as Record<string, unknown>)['transaction_id'] as string || '',\n transactionId: (data as Record<string, unknown>)['transaction_id'] as string,\n timestamp: new Date()\n };\n\n this.updateState({\n isLoading: false,\n response,\n currentScreen: LokotroPayScreenNavigation.SuccessScreen\n });\n }\n\n /**\n * Handle payment failure\n */\n private handlePaymentFailure(message: string, errorCode?: LokotroPayApiResponseCode): void {\n this.updateState({\n isLoading: false,\n error: {\n message: message || 'Payment failed',\n title: 'Payment Failed',\n errorCode,\n timestamp: new Date()\n },\n currentScreen: LokotroPayScreenNavigation.ErrorScreen\n });\n }\n\n /**\n * Get form screen for payment channel\n */\n private getFormScreenForChannel(channel: LokotroPayChannel): LokotroPayScreenNavigation {\n switch (channel) {\n case LokotroPayChannel.EWallet:\n case LokotroPayChannel.LokotroWallet:\n return LokotroPayScreenNavigation.EWalletFormScreen;\n case LokotroPayChannel.MobileMoney:\n return LokotroPayScreenNavigation.MobileMoneyFormScreen;\n case LokotroPayChannel.Card:\n case LokotroPayChannel.VirtualCard:\n return LokotroPayScreenNavigation.CardFormScreen;\n case LokotroPayChannel.EFlash:\n return LokotroPayScreenNavigation.FlashFormScreen;\n case LokotroPayChannel.BankTransfer:\n return LokotroPayScreenNavigation.BankTransferFormScreen;\n default:\n return LokotroPayScreenNavigation.PaymentFormScreen;\n }\n }\n\n /**\n * Convert payment body to API request format\n */\n private convertPaymentBodyToRequest(body: LokotroPaymentBody): Record<string, unknown> {\n const request: Record<string, unknown> = {\n customer_reference: body.customerReference,\n amount: body.amount,\n currency: body.currency.toLowerCase(),\n payment_method: body.paymentMethod || 'wallet',\n user_info: body.userInfo || 'full',\n payment_method_info: body.paymentMethodInfo || 'full',\n fee_covered_by: body.feeCoveredBy || 'buyer',\n delivery_behaviour: body.deliveryBehaviour || 'direct_delivery'\n };\n\n // Add optional URLs\n if (body.notifyUrl) request['notify_url'] = body.notifyUrl;\n if (body.successRedirectUrl) request['success_redirect_url'] = body.successRedirectUrl;\n if (body.failRedirectUrl) request['fail_redirect_url'] = body.failRedirectUrl;\n\n // Add user information\n if (body.userInfo === 'full') {\n if (body.firstName) request['first_name'] = body.firstName;\n if (body.lastName) request['last_name'] = body.lastName;\n if (body.phoneNumber) request['phone_number'] = body.phoneNumber;\n if (body.email) request['email'] = body.email;\n }\n\n // Add payment method specific fields\n if (body.paymentMethodInfo === 'full') {\n if (body.walletNumber) request['wallet_number'] = body.walletNumber;\n if (body.walletPin) request['wallet_pin'] = body.walletPin;\n if (body.mobileMoneyPhoneNumber) request['mobile_money_phone_number'] = body.mobileMoneyPhoneNumber;\n if (body.flashNumber) request['flash_number'] = body.flashNumber;\n if (body.flashPin) request['flash_pin'] = body.flashPin;\n if (body.cardNumber) request['card_number'] = body.cardNumber;\n if (body.cardExpiryDate) request['card_expiry_date'] = body.cardExpiryDate;\n if (body.cardCvv) request['card_cvv'] = body.cardCvv;\n if (body.cardHolderName) request['card_holder_name'] = body.cardHolderName;\n }\n\n // Add merchant information\n if (body.merchant) {\n request['merchant'] = {\n id: body.merchant.id,\n name: body.merchant.name,\n logo_url: body.merchant.logoUrl,\n website: body.merchant.website,\n description: body.merchant.description\n };\n }\n\n // Add mastercard payment method\n if (body.mastercardPaymentMethod) {\n request['mastercard_payment_method'] = body.mastercardPaymentMethod;\n }\n\n // Add metadata\n if (body.metadata) {\n request['metadata'] = body.metadata;\n }\n\n return request;\n }\n\n /**\n * Convert submit request to API format\n */\n private convertSubmitRequestToData(request: LokotroPaymentSubmitRequest): Record<string, unknown> {\n const data: Record<string, unknown> = {\n transaction_id: request.transactionId,\n payment_method: request.paymentMethod\n };\n\n if (request.walletNumber) data['wallet_number'] = request.walletNumber;\n if (request.walletPin) data['wallet_pin'] = request.walletPin;\n if (request.mobileMoneyPhoneNumber) data['mobile_money_phone_number'] = request.mobileMoneyPhoneNumber;\n if (request.flashNumber) data['flash_number'] = request.flashNumber;\n if (request.flashPin) data['flash_pin'] = request.flashPin;\n if (request.cardNumber) data['card_number'] = request.cardNumber;\n if (request.cardExpiryDate) data['card_expiry_date'] = request.cardExpiryDate;\n if (request.cardCvv) data['card_cvv'] = request.cardCvv;\n if (request.cardHolderName) data['card_holder_name'] = request.cardHolderName;\n if (request.bankTransferAccountId) data['bank_transfer_account_id'] = request.bankTransferAccountId;\n\n return data;\n }\n\n /**\n * Parse payment info from API response\n */\n private parsePaymentInfo(data: CreatePaymentResponse): LokotroPaymentInfo {\n return {\n id: data.transaction_id || '',\n amount: parseFloat(data.amount || '0'),\n currency: data.currency || 'USD',\n description: data.description || '',\n merchantName: data.merchant_name || '',\n merchantId: data.merchant_id || '',\n availablePaymentMethods: (data.available_payment_methods || []).map(this.parsePaymentMethod),\n createdAt: new Date(data.created_at || Date.now()),\n expiresAt: data.expires_at ? new Date(data.expires_at) : undefined,\n metadata: data.metadata,\n paymentUrl: data.payment_url,\n showUserInfoForm: data.show_user_info_form || false,\n showPaymentMethodForm: data.show_payment_method_form || false,\n fillingInfo: data.filling_info\n };\n }\n\n /**\n * Parse payment method from API response\n */\n private parsePaymentMethod(data: Record<string, unknown>): LokotroPaymentMethod {\n return {\n id: (data['id'] as string) || '',\n name: (data['name'] as string) || '',\n displayName: (data['display_name'] as string) || '',\n channel: (data['channel'] as LokotroPayChannel) || LokotroPayChannel.None,\n iconUrl: (data['icon_url'] as string) || (data['icon'] as string) || '',\n isEnabled: (data['is_enabled'] as boolean) ?? true,\n configuration: data['configuration'] as Record<string, unknown>,\n supportedCurrencies: data['supported_currencies'] as string[]\n };\n }\n\n /**\n * Parse submit response from API\n */\n private parseSubmitResponse(data: PaymentSubmitResponse): LokotroPaymentSubmitResponse {\n return {\n success: data.success || false,\n message: data.message || '',\n transactionId: data.transaction_id || '',\n status: LokotroPaymentStatusInfo.fromString(data.status || ''),\n requiresOtp: data.requires_otp || false,\n otpDestination: data.otp_destination,\n redirectUrl: data.redirect_url\n };\n }\n\n /**\n * Parse bank from API response\n */\n private parseBank(data: Record<string, unknown>): LokotroBank {\n return {\n id: (data['id'] as string) || '',\n name: (data['name'] as string) || '',\n abreviation: (data['abreviation'] as string) || '',\n bankLogoUrl: (data['bank_logo_url'] as string) || '',\n hasRibNomenclatureConstraint: (data['has_rib_nomenclature_constraint'] as boolean) || false,\n ribAccountNumberFormatStr: (data['rib_account_number_format_str'] as string) || '',\n bankAccounts: ((data['bank_accounts'] as Record<string, unknown>[]) || []).map(a => this.parseBankAccount(a)),\n entityAvailables: ((data['entity_availables'] as Record<string, unknown>[]) || []).map(e => this.parseBankEntity(e))\n };\n }\n\n /**\n * Parse bank account\n */\n private parseBankAccount(data: Record<string, unknown>): LokotroBankAccount {\n return {\n id: (data['id'] as string) || '',\n identifier: (data['identifier'] as string) || '',\n accountNumber: (data['account_number'] as string) || '',\n accountLabel: (data['account_label'] as string) || '',\n // createdAt: (data['created_at'] as string), // Removed undefined field\n refBank: data['ref_bank'] ? this.parseBank(data['ref_bank'] as Record<string, unknown>) : undefined,\n refCurrency: data['ref_currency'] ? this.parseBankCurrency(data['ref_currency'] as Record<string, unknown>) : undefined\n };\n }\n\n /**\n * Parse bank entity\n */\n private parseBankEntity(data: Record<string, unknown>): LokotroBankEntity {\n return {\n id: (data['id'] as string) || '',\n name: (data['name'] as string) || '',\n countryFlag: (data['country_flag'] as string)\n };\n }\n\n /**\n * Parse bank currency\n */\n private parseBankCurrency(data: Record<string, unknown>): LokotroBankCurrency {\n return {\n id: (data['id'] as string) || '',\n name: (data['name'] as string) || '',\n code: (data['code'] as string) || '',\n symbol: (data['symbol'] as string)\n };\n }\n}\n\n// API Response interfaces\ninterface CreatePaymentResponse {\n transaction_id?: string;\n amount?: string;\n currency?: string;\n description?: string;\n merchant_name?: string;\n merchant_id?: string;\n available_payment_methods?: Record<string, unknown>[];\n created_at?: string;\n expires_at?: string;\n metadata?: Record<string, unknown>;\n payment_url?: string;\n show_user_info_form?: boolean;\n show_payment_method_form?: boolean;\n filling_info?: string;\n}\n\ninterface TransactionDetailsResponse {\n identifier?: string;\n transaction_id?: string;\n amount?: number | string;\n currency_str?: string;\n currency?: string;\n status?: string;\n payment_method?: string;\n customer_reference?: string;\n system_reference?: string;\n created_at?: string;\n updated_at?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface PaymentSubmitResponse {\n success?: boolean;\n message?: string;\n transaction_id?: string;\n status?: string;\n requires_otp?: boolean;\n otp_destination?: string;\n redirect_url?: string;\n [key: string]: unknown;\n}\n\ninterface OtpVerifyResponse {\n success?: boolean;\n message?: string;\n transaction_id?: string;\n status?: string;\n [key: string]: unknown;\n}\n\ninterface OtpResendResponse {\n success?: boolean;\n message?: string;\n otp_destination?: string;\n}\n","/**\n * Lokotro Pay - Bank Transfer Form Component\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\nimport { LokotroPaymentService } from '../../services/lokotro-payment.service';\nimport { LokotroBank, LokotroBankEntity, LokotroBankAccount } from '../../models/bank-transfer';\n\n@Component({\n selector: 'lokotro-bank-transfer-form',\n standalone: true,\n imports: [CommonModule, FormsModule, ReactiveFormsModule],\n template: `\n <div class=\"lokotro-bank-transfer-form\">\n <form [formGroup]=\"bankTransferForm\" (ngSubmit)=\"onSubmit()\">\n <h3 class=\"lokotro-form-title\">{{ localization.translate('bankTransfer') || 'Bank Transfer' }}</h3>\n\n <!-- Personal Information Section -->\n <div class=\"lokotro-user-info-section\" *ngIf=\"showUserInfoForm\">\n <h4 class=\"lokotro-section-subtitle\">{{ localization.translate('personalInfo') }}</h4>\n \n <div class=\"lokotro-form-row\">\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('firstName') }}</label>\n <input type=\"text\" class=\"lokotro-input\" formControlName=\"firstName\" placeholder=\"John\">\n <span class=\"lokotro-error\" *ngIf=\"bankTransferForm.get('firstName')?.touched && bankTransferForm.get('firstName')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('lastName') }}</label>\n <input type=\"text\" class=\"lokotro-input\" formControlName=\"lastName\" placeholder=\"Doe\">\n <span class=\"lokotro-error\" *ngIf=\"bankTransferForm.get('lastName')?.touched && bankTransferForm.get('lastName')?.invalid\">\n {{ localization.translate('required') }}\n </span>\n </div>\n </div>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('email') }}</label>\n <input type=\"email\" class=\"lokotro-input\" formControlName=\"email\" placeholder=\"john.doe@example.com\">\n <span class=\"lokotro-error\" *ngIf=\"bankTransferForm.get('email')?.touched && bankTransferForm.get('email')?.invalid\">\n {{ localization.translate('invalidEmail') }}\n </span>\n </div>\n \n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('phoneNumber') }}</label>\n <input type=\"tel\" class=\"lokotro-input\" formControlName=\"personalPhone\" placeholder=\"+243 XXX XXX XXX\">\n <span class=\"lokotro-error\" *ngIf=\"bankTransferForm.get('personalPhone')?.touched && bankTransferForm.get('personalPhone')?.invalid\">\n {{ localization.translate('invalidPhoneNumber') }}\n </span>\n </div>\n \n <hr class=\"lokotro-divider\">\n </div>\n\n <!-- Bank Selection Section -->\n <h4 class=\"lokotro-section-subtitle\" *ngIf=\"showUserInfoForm\">{{ localization.translate('bankDetails') || 'Bank Details' }}</h4>\n \n <!-- Loading State -->\n <div *ngIf=\"isLoading\" class=\"lokotro-loading-text\">\n {{ localization.translate('loading') || 'Loading...' }}\n </div>\n\n <div *ngIf=\"!isLoading\">\n <!-- City Selection -->\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('selectCity') || 'Select City' }}</label>\n <select class=\"lokotro-input\" formControlName=\"city\" (change)=\"onCityChange()\">\n <option value=\"\">{{ localization.translate('selectCity') || 'Select City' }}</option>\n <option *ngFor=\"let city of cities\" [value]=\"city.id\">{{ city.name }}</option>\n </select>\n </div>\n\n <!-- Bank Selection -->\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('selectBank') || 'Select Bank' }}</label>\n <select class=\"lokotro-input\" formControlName=\"bank\" (change)=\"onBankChange()\">\n <option value=\"\">{{ localization.translate('selectBank') || 'Select Bank' }}</option>\n <option *ngFor=\"let bank of filteredBanks\" [value]=\"bank.id\">{{ bank.name }}</option>\n </select>\n </div>\n\n <!-- Account Selection -->\n <div class=\"lokotro-form-group\">\n <label class=\"lokotro-label\">{{ localization.translate('selectBankAccount') || 'Select Account' }}</label>\n <select class=\"lokotro-input\" formControlName=\"account\" (change)=\"onAccountChange()\">\n <option value=\"\">{{ localization.translate('selectBankAccount') || 'Select Account' }}</option>\n <option *ngFor=\"let account of accounts\" [value]=\"account.id\">{{ account.accountLabel }} ({{ account.accountNumber }})</option>\n </select>\n </div>\n </div>\n\n <!-- Selected Account Summary -->\n <div class=\"lokotro-account-summary\" *ngIf=\"selectedAccount\">\n <div class=\"lokotro-info-box\">\n <p><strong>{{ localization.translate('bankAccountSummary') || 'Account Number' }}:</strong> {{ selectedAccount.accountNumber }}</p>\n <p><strong>{{ localization.translate('accountLabel') || 'Label' }}:</strong> {{ selectedAccount.accountLabel }}</p>\n <p class=\"lokotro-info-text\">\n {{ localization.translate('bankTransferProofInstructions') || 'A payment link will be sent to your email to upload the proof of transfer.' }}\n </p>\n </div>\n </div>\n\n <div class=\"lokotro-form-actions\">\n <button type=\"button\" class=\"lokotro-btn-secondary\" (click)=\"onCancel()\">\n {{ localization.translate('cancel') }}\n </button>\n <button type=\"submit\" class=\"lokotro-btn-primary\" [disabled]=\"bankTransferForm.invalid || isLoading\">\n {{ localization.translate('confirmBankTransfer') || 'Confirm Transfer' }}\n </button>\n </div>\n </form>\n </div>\n `,\n styles: [`\n .lokotro-bank-transfer-form { width: 100%; }\n .lokotro-form-title { font-size: 20px; font-weight: 600; margin: 0 0 24px 0; color: var(--lokotro-text-primary, #F2F0D5); text-align: center; }\n .lokotro-form-group { margin-bottom: 20px; }\n .lokotro-form-row { display: flex; gap: 16px; }\n .lokotro-form-row .lokotro-form-group { flex: 1; }\n .lokotro-label { display: block; margin-bottom: 8px; font-size: 14px; font-weight: 500; color: var(--lokotro-text-secondary, #D5D3B8); }\n .lokotro-input { width: 100%; padding: 14px 16px; background: var(--lokotro-card, #3A4840); border: 2px solid var(--lokotro-border, #3A473F); border-radius: 12px; color: var(--lokotro-text-primary, #F2F0D5); font-size: 16px; transition: border-color 0.2s; box-sizing: border-box; }\n .lokotro-input:focus { outline: none; border-color: var(--lokotro-accent, #3BFBDA); }\n .lokotro-error { display: block; margin-top: 6px; font-size: 12px; color: var(--lokotro-error, #D97652); }\n .lokotro-user-info-section { margin-bottom: 24px; }\n .lokotro-section-subtitle { font-size: 16px; font-weight: 600; margin: 0 0 16px 0; color: var(--lokotro-text-primary, #F2F0D5); }\n .lokotro-divider { border: none; border-top: 1px solid var(--lokotro-border, #3A473F); margin: 24px 0; }\n .lokotro-form-actions { display: flex; gap: 12px; margin-top: 32px; }\n .lokotro-btn-primary, .lokotro-btn-secondary { flex: 1; padding: 14px 24px; border-radius: 12px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; }\n .lokotro-btn-primary { background: linear-gradient(135deg, var(--lokotro-primary, #5A5E39), var(--lokotro-secondary, #6E7346)); color: var(--lokotro-text-primary, #F2F0D5); border: none; }\n .lokotro-btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); }\n .lokotro-btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }\n .lokotro-btn-secondary { background: transparent; color: var(--lokotro-text-primary, #F2F0D5); border: 2px solid var(--lokotro-border, #3A473F); }\n .lokotro-btn-secondary:hover { border-color: var(--lokotro-text-secondary, #D5D3B8); }\n .lokotro-loading-text { text-align: center; color: var(--lokotro-text-secondary, #D5D3B8); padding: 20px; }\n .lokotro-account-summary { margin-top: 20px; padding: 16px; background: rgba(58, 72, 64, 0.5); border-radius: 12px; border: 1px solid var(--lokotro-border, #3A473F); }\n .lokotro-info-box p { margin: 8px 0; color: var(--lokotro-text-primary, #F2F0D5); }\n .lokotro-info-text { font-style: italic; color: var(--lokotro-text-secondary, #D5D3B8); font-size: 14px; margin-top: 12px !important; }\n `]\n})\nexport class LokotroBankTransferFormComponent implements OnInit {\n @Input() showUserInfoForm: boolean = false;\n @Output() formSubmitted = new EventEmitter<Record<string, unknown>>();\n @Output() cancel = new EventEmitter<void>();\n\n bankTransferForm!: FormGroup;\n isLoading = true;\n\n allBanks: LokotroBank[] = [];\n cities: LokotroBankEntity[] = [];\n filteredBanks: LokotroBank[] = [];\n accounts: LokotroBankAccount[] = [];\n\n selectedCity: LokotroBankEntity | null = null;\n selectedBank: LokotroBank | null = null;\n selectedAccount: LokotroBankAccount | null = null;\n\n constructor(\n private fb: FormBuilder,\n public localization: LokotroLocalizationService,\n private paymentService: LokotroPaymentService\n ) { }\n\n ngOnInit(): void {\n this.initForm();\n this.fetchBanks();\n }\n\n private initForm(): void {\n const config: Record<string, any> = {\n city: ['', Validators.required],\n bank: [{ value: '', disabled: true }, Validators.required],\n account: [{ value: '', disabled: true }, Validators.required]\n };\n\n if (this.showUserInfoForm) {\n config['firstName'] = ['', Validators.required];\n config['lastName'] = ['', Validators.required];\n config['email'] = ['', [Validators.required, Validators.email]];\n config['personalPhone'] = ['', Validators.required];\n }\n\n this.bankTransferForm = this.fb.group(config);\n }\n\n private fetchBanks(): void {\n this.isLoading = true;\n this.paymentService.fetchAvailableBanks().subscribe({\n next: (response) => {\n if (response.isSuccess && response.data) {\n this.allBanks = response.data;\n this.extractCities();\n }\n this.isLoading = false;\n },\n error: (err) => {\n console.error('Failed to fetch banks', err);\n this.isLoading = false;\n }\n });\n }\n\n private extractCities(): void {\n const cityMap = new Map<string, LokotroBankEntity>();\n this.allBanks.forEach(bank => {\n bank.entityAvailables.forEach(city => {\n if (!cityMap.has(city.id)) {\n cityMap.set(city.id, city);\n }\n });\n });\n this.cities = Array.from(cityMap.values());\n }\n\n onCityChange(): void {\n const cityId = this.bankTransferForm.get('city')?.value;\n const bankControl = this.bankTransferForm.get('bank');\n const accountControl = this.bankTransferForm.get('account');\n\n bankControl?.reset('');\n bankControl?.disable();\n accountControl?.reset('');\n accountControl?.disable();\n this.filteredBanks = [];\n this.accounts = [];\n this.selectedAccount = null;\n\n if (cityId) {\n this.selectedCity = this.cities.find(c => c.id === cityId) || null;\n this.filteredBanks = this.allBanks.filter(bank =>\n bank.entityAvailables.some(e => e.id === cityId)\n );\n bankControl?.enable();\n }\n }\n\n onBankChange(): void {\n const bankId = this.bankTransferForm.get('bank')?.value;\n const accountControl = this.bankTransferForm.get('account');\n\n accountControl?.reset('');\n accountControl?.disable();\n this.accounts = [];\n this.selectedAccount = null;\n\n if (bankId) {\n this.selectedBank = this.filteredBanks.find(b => b.id === bankId) || null;\n if (this.selectedBank) {\n this.accounts = this.selectedBank.bankAccounts;\n accountControl?.enable();\n }\n }\n }\n\n onAccountChange(): void {\n const accountId = this.bankTransferForm.get('account')?.value;\n if (accountId) {\n this.selectedAccount = this.accounts.find(a => a.id === accountId) || null;\n } else {\n this.selectedAccount = null;\n }\n }\n\n onSubmit(): void {\n if (this.bankTransferForm.valid && this.selectedAccount) {\n const submitData: Record<string, unknown> = {\n bankTransferAccountId: this.selectedAccount.id\n };\n\n if (this.showUserInfoForm) {\n submitData['firstName'] = this.bankTransferForm.value.firstName;\n submitData['lastName'] = this.bankTransferForm.value.lastName;\n submitData['email'] = this.bankTransferForm.value.email;\n submitData['phoneNumber'] = this.bankTransferForm.value.personalPhone;\n }\n\n this.formSubmitted.emit(submitData);\n }\n }\n\n onCancel(): void {\n this.cancel.emit();\n }\n}\n","/**\n * Lokotro Pay - OTP Verification Component\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\n\n@Component({\n selector: 'lokotro-otp-verification',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"lokotro-otp-verification\">\n <div class=\"lokotro-otp-icon\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n </div>\n\n <h3 class=\"lokotro-otp-title\">{{ localization.translate('enterOtp') }}</h3>\n <p class=\"lokotro-otp-subtitle\" *ngIf=\"otpDestination\">\n {{ localization.translate('otpSentTo') }} {{ otpDestination }}\n </p>\n\n <div class=\"lokotro-otp-inputs\">\n <input\n *ngFor=\"let digit of otpDigits; let i = index\"\n type=\"text\"\n class=\"lokotro-otp-input\"\n maxlength=\"1\"\n [value]=\"otpDigits[i]\"\n (input)=\"onOtpInput($event, i)\"\n (keydown)=\"onOtpKeydown($event, i)\"\n (paste)=\"onOtpPaste($event)\"\n #otpInput>\n </div>\n\n <div class=\"lokotro-otp-timer\" *ngIf=\"resendTimer > 0\">\n Resend OTP in {{ resendTimer }}s\n </div>\n\n <button \n class=\"lokotro-resend-btn\" \n *ngIf=\"resendTimer === 0\"\n (click)=\"onResend()\">\n {{ localization.translate('resendOtp') }}\n </button>\n\n <div class=\"lokotro-form-actions\">\n <button type=\"button\" class=\"lokotro-btn-secondary\" (click)=\"onCancelClick()\">\n {{ localization.translate('cancel') }}\n </button>\n <button \n type=\"button\" \n class=\"lokotro-btn-primary\" \n [disabled]=\"!isOtpComplete\"\n (click)=\"onVerify()\">\n {{ localization.translate('verifyOtp') }}\n </button>\n </div>\n </div>\n `,\n styles: [`\n .lokotro-otp-verification {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 24px 0;\n }\n\n .lokotro-otp-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--lokotro-card, #3A4840);\n border-radius: 50%;\n margin-bottom: 24px;\n color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-otp-title {\n font-size: 24px;\n font-weight: 600;\n margin: 0 0 8px 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-otp-subtitle {\n font-size: 14px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n margin: 0 0 32px 0;\n }\n\n .lokotro-otp-inputs {\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n }\n\n .lokotro-otp-input {\n width: 50px;\n height: 56px;\n text-align: center;\n font-size: 24px;\n font-weight: 600;\n background: var(--lokotro-card, #3A4840);\n border: 2px solid var(--lokotro-border, #3A473F);\n border-radius: 12px;\n color: var(--lokotro-text-primary, #F2F0D5);\n transition: border-color 0.2s;\n }\n\n .lokotro-otp-input:focus {\n outline: none;\n border-color: var(--lokotro-accent, #3BFBDA);\n }\n\n .lokotro-otp-timer {\n font-size: 14px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n margin-bottom: 24px;\n }\n\n .lokotro-resend-btn {\n background: none;\n border: none;\n color: var(--lokotro-accent, #3BFBDA);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n margin-bottom: 24px;\n text-decoration: underline;\n }\n\n .lokotro-resend-btn:hover {\n opacity: 0.8;\n }\n\n .lokotro-form-actions {\n display: flex;\n gap: 12px;\n width: 100%;\n }\n\n .lokotro-btn-primary,\n .lokotro-btn-secondary {\n flex: 1;\n padding: 14px 24px;\n border-radius: 12px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .lokotro-btn-primary {\n background: linear-gradient(135deg, var(--lokotro-primary, #5A5E39), var(--lokotro-secondary, #6E7346));\n color: var(--lokotro-text-primary, #F2F0D5);\n border: none;\n }\n\n .lokotro-btn-primary:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);\n }\n\n .lokotro-btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .lokotro-btn-secondary {\n background: transparent;\n color: var(--lokotro-text-primary, #F2F0D5);\n border: 2px solid var(--lokotro-border, #3A473F);\n }\n\n .lokotro-btn-secondary:hover {\n border-color: var(--lokotro-text-secondary, #D5D3B8);\n }\n `]\n})\nexport class LokotroOtpVerificationComponent implements OnInit, OnDestroy {\n @Input() transactionId?: string;\n @Input() otpDestination?: string;\n @Input() otpLength: number = 6;\n @Output() otpVerified = new EventEmitter<string>();\n @Output() resendOtp = new EventEmitter<void>();\n @Output() cancel = new EventEmitter<void>();\n\n otpDigits: string[] = [];\n resendTimer: number = 60;\n private timerInterval?: ReturnType<typeof setInterval>;\n\n constructor(public localization: LokotroLocalizationService) {}\n\n ngOnInit(): void {\n this.otpDigits = new Array(this.otpLength).fill('');\n this.startResendTimer();\n }\n\n ngOnDestroy(): void {\n if (this.timerInterval) {\n clearInterval(this.timerInterval);\n }\n }\n\n get isOtpComplete(): boolean {\n return this.otpDigits.every(digit => digit !== '');\n }\n\n get otpValue(): string {\n return this.otpDigits.join('');\n }\n\n private startResendTimer(): void {\n this.resendTimer = 60;\n this.timerInterval = setInterval(() => {\n this.resendTimer--;\n if (this.resendTimer <= 0) {\n clearInterval(this.timerInterval);\n }\n }, 1000);\n }\n\n onOtpInput(event: Event, index: number): void {\n const input = event.target as HTMLInputElement;\n const value = input.value.replace(/\\D/g, '');\n \n if (value) {\n this.otpDigits[index] = value[0];\n input.value = value[0];\n \n // Focus next input\n if (index < this.otpLength - 1) {\n const inputs = document.querySelectorAll('.lokotro-otp-input');\n (inputs[index + 1] as HTMLInputElement)?.focus();\n }\n } else {\n this.otpDigits[index] = '';\n }\n }\n\n onOtpKeydown(event: KeyboardEvent, index: number): void {\n if (event.key === 'Backspace' && !this.otpDigits[index] && index > 0) {\n const inputs = document.querySelectorAll('.lokotro-otp-input');\n (inputs[index - 1] as HTMLInputElement)?.focus();\n }\n }\n\n onOtpPaste(event: ClipboardEvent): void {\n event.preventDefault();\n const pastedData = event.clipboardData?.getData('text').replace(/\\D/g, '');\n \n if (pastedData) {\n for (let i = 0; i < Math.min(pastedData.length, this.otpLength); i++) {\n this.otpDigits[i] = pastedData[i];\n }\n \n const inputs = document.querySelectorAll('.lokotro-otp-input');\n inputs.forEach((input, i) => {\n (input as HTMLInputElement).value = this.otpDigits[i] || '';\n });\n \n // Focus last filled input or first empty\n const focusIndex = Math.min(pastedData.length, this.otpLength - 1);\n (inputs[focusIndex] as HTMLInputElement)?.focus();\n }\n }\n\n onVerify(): void {\n if (this.isOtpComplete) {\n this.otpVerified.emit(this.otpValue);\n }\n }\n\n onResend(): void {\n this.otpDigits = new Array(this.otpLength).fill('');\n this.startResendTimer();\n this.resendOtp.emit();\n }\n\n onCancelClick(): void {\n this.cancel.emit();\n }\n}\n","/**\n * Lokotro Pay - Processing Component\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\n\n@Component({\n selector: 'lokotro-processing',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"lokotro-processing\">\n <div class=\"lokotro-processing-spinner\">\n <div class=\"lokotro-spinner-ring\"></div>\n <div class=\"lokotro-spinner-ring\"></div>\n <div class=\"lokotro-spinner-ring\"></div>\n </div>\n\n <h3 class=\"lokotro-processing-title\">{{ message || localization.translate('processing') }}</h3>\n \n <p class=\"lokotro-processing-subtitle\" *ngIf=\"type === 'mobileMoney'\">\n Please confirm the payment on your mobile device\n </p>\n\n <div class=\"lokotro-processing-steps\" *ngIf=\"type === 'mobileMoney'\">\n <div class=\"lokotro-step\" [class.active]=\"currentStep >= 1\">\n <div class=\"lokotro-step-icon\">📱</div>\n <span>Check your phone</span>\n </div>\n <div class=\"lokotro-step\" [class.active]=\"currentStep >= 2\">\n <div class=\"lokotro-step-icon\">🔐</div>\n <span>Enter your PIN</span>\n </div>\n <div class=\"lokotro-step\" [class.active]=\"currentStep >= 3\">\n <div class=\"lokotro-step-icon\">✅</div>\n <span>Confirm payment</span>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .lokotro-processing {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 48px 24px;\n min-height: 300px;\n }\n\n .lokotro-processing-spinner {\n position: relative;\n width: 80px;\n height: 80px;\n margin-bottom: 32px;\n }\n\n .lokotro-spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: lokotro-spin 1.5s linear infinite;\n }\n\n .lokotro-spinner-ring:nth-child(1) {\n border-top-color: var(--lokotro-accent, #3BFBDA);\n animation-delay: 0s;\n }\n\n .lokotro-spinner-ring:nth-child(2) {\n border-right-color: var(--lokotro-primary, #5A5E39);\n animation-delay: 0.15s;\n width: 70%;\n height: 70%;\n top: 15%;\n left: 15%;\n }\n\n .lokotro-spinner-ring:nth-child(3) {\n border-bottom-color: var(--lokotro-secondary, #6E7346);\n animation-delay: 0.3s;\n width: 50%;\n height: 50%;\n top: 25%;\n left: 25%;\n }\n\n @keyframes lokotro-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n\n .lokotro-processing-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0 0 8px 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-processing-subtitle {\n font-size: 14px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n margin: 0 0 32px 0;\n }\n\n .lokotro-processing-steps {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n max-width: 280px;\n }\n\n .lokotro-step {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--lokotro-card, #3A4840);\n border-radius: 12px;\n opacity: 0.5;\n transition: opacity 0.3s;\n }\n\n .lokotro-step.active {\n opacity: 1;\n }\n\n .lokotro-step-icon {\n font-size: 20px;\n }\n\n .lokotro-step span {\n font-size: 14px;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n `]\n})\nexport class LokotroProcessingComponent {\n @Input() type: 'default' | 'mobileMoney' = 'default';\n @Input() message?: string;\n \n currentStep: number = 1;\n\n constructor(public localization: LokotroLocalizationService) {\n // Simulate step progression for mobile money\n if (this.type === 'mobileMoney') {\n setTimeout(() => this.currentStep = 2, 3000);\n setTimeout(() => this.currentStep = 3, 6000);\n }\n }\n}\n","/**\n * Lokotro Pay - Result Component\n * Success, Error, Warning, Info screens\n */\n\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\n\nexport type ResultType = 'success' | 'error' | 'warning' | 'info';\n\n@Component({\n selector: 'lokotro-result',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"lokotro-result\" [class]=\"'lokotro-result-' + type\">\n <!-- Animated Icon -->\n <div class=\"lokotro-result-icon\" [class]=\"'lokotro-icon-' + type\">\n <!-- Success Icon -->\n <svg *ngIf=\"type === 'success'\" class=\"lokotro-checkmark\" viewBox=\"0 0 52 52\">\n <circle class=\"lokotro-checkmark-circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\"/>\n <path class=\"lokotro-checkmark-check\" fill=\"none\" d=\"M14.1 27.2l7.1 7.2 16.7-16.8\"/>\n </svg>\n\n <!-- Error Icon -->\n <svg *ngIf=\"type === 'error'\" class=\"lokotro-error-icon\" viewBox=\"0 0 52 52\">\n <circle class=\"lokotro-error-circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\"/>\n <path class=\"lokotro-error-x\" fill=\"none\" d=\"M16 16l20 20M36 16l-20 20\"/>\n </svg>\n\n <!-- Warning Icon -->\n <svg *ngIf=\"type === 'warning'\" class=\"lokotro-warning-icon\" viewBox=\"0 0 52 52\">\n <circle class=\"lokotro-warning-circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\"/>\n <path class=\"lokotro-warning-exclaim\" fill=\"none\" d=\"M26 15v15M26 37v1\"/>\n </svg>\n\n <!-- Info Icon -->\n <svg *ngIf=\"type === 'info'\" class=\"lokotro-info-icon\" viewBox=\"0 0 52 52\">\n <circle class=\"lokotro-info-circle\" cx=\"26\" cy=\"26\" r=\"25\" fill=\"none\"/>\n <path class=\"lokotro-info-i\" fill=\"none\" d=\"M26 22v15M26 15v1\"/>\n </svg>\n </div>\n\n <!-- Title -->\n <h2 class=\"lokotro-result-title\">{{ title }}</h2>\n\n <!-- Message -->\n <p class=\"lokotro-result-message\" *ngIf=\"message\">{{ message }}</p>\n\n <!-- Transaction Details -->\n <div class=\"lokotro-result-details\" *ngIf=\"type === 'success' && (amount || transactionId)\">\n <div class=\"lokotro-detail-row\" *ngIf=\"amount\">\n <span class=\"lokotro-detail-label\">{{ localization.translate('amount') }}</span>\n <span class=\"lokotro-detail-value\">{{ formatAmount(amount, currency) }}</span>\n </div>\n <div class=\"lokotro-detail-row\" *ngIf=\"transactionId\">\n <span class=\"lokotro-detail-label\">Transaction ID</span>\n <span class=\"lokotro-detail-value lokotro-mono\">{{ transactionId }}</span>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"lokotro-result-actions\">\n <button \n *ngIf=\"primaryActionLabel\" \n class=\"lokotro-btn-primary\"\n (click)=\"onPrimaryClick()\">\n {{ primaryActionLabel }}\n </button>\n <button \n *ngIf=\"secondaryActionLabel\" \n class=\"lokotro-btn-secondary\"\n (click)=\"onSecondaryClick()\">\n {{ secondaryActionLabel }}\n </button>\n </div>\n </div>\n `,\n styles: [`\n .lokotro-result {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 48px 24px;\n }\n\n .lokotro-result-icon {\n width: 80px;\n height: 80px;\n margin-bottom: 24px;\n }\n\n /* Success Animation */\n .lokotro-checkmark {\n width: 100%;\n height: 100%;\n stroke-width: 3;\n }\n\n .lokotro-checkmark-circle {\n stroke: var(--lokotro-success, #3BFBDA);\n stroke-dasharray: 166;\n stroke-dashoffset: 166;\n animation: lokotro-stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;\n }\n\n .lokotro-checkmark-check {\n stroke: var(--lokotro-success, #3BFBDA);\n stroke-width: 3;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 48;\n stroke-dashoffset: 48;\n animation: lokotro-stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards;\n }\n\n /* Error Animation */\n .lokotro-error-icon {\n width: 100%;\n height: 100%;\n stroke-width: 3;\n }\n\n .lokotro-error-circle {\n stroke: var(--lokotro-error, #D97652);\n stroke-dasharray: 166;\n stroke-dashoffset: 166;\n animation: lokotro-stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;\n }\n\n .lokotro-error-x {\n stroke: var(--lokotro-error, #D97652);\n stroke-width: 3;\n stroke-linecap: round;\n stroke-dasharray: 28;\n stroke-dashoffset: 28;\n animation: lokotro-stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards;\n }\n\n /* Warning Animation */\n .lokotro-warning-icon {\n width: 100%;\n height: 100%;\n stroke-width: 3;\n }\n\n .lokotro-warning-circle {\n stroke: var(--lokotro-warning, #D97652);\n stroke-dasharray: 166;\n stroke-dashoffset: 166;\n animation: lokotro-stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;\n }\n\n .lokotro-warning-exclaim {\n stroke: var(--lokotro-warning, #D97652);\n stroke-width: 3;\n stroke-linecap: round;\n stroke-dasharray: 20;\n stroke-dashoffset: 20;\n animation: lokotro-stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards;\n }\n\n /* Info Animation */\n .lokotro-info-icon {\n width: 100%;\n height: 100%;\n stroke-width: 3;\n }\n\n .lokotro-info-circle {\n stroke: var(--lokotro-info, #3B82F6);\n stroke-dasharray: 166;\n stroke-dashoffset: 166;\n animation: lokotro-stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;\n }\n\n .lokotro-info-i {\n stroke: var(--lokotro-info, #3B82F6);\n stroke-width: 3;\n stroke-linecap: round;\n stroke-dasharray: 20;\n stroke-dashoffset: 20;\n animation: lokotro-stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards;\n }\n\n @keyframes lokotro-stroke {\n 100% {\n stroke-dashoffset: 0;\n }\n }\n\n .lokotro-result-title {\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 12px 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-result-success .lokotro-result-title {\n color: var(--lokotro-success, #3BFBDA);\n }\n\n .lokotro-result-error .lokotro-result-title {\n color: var(--lokotro-error, #D97652);\n }\n\n .lokotro-result-message {\n font-size: 14px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n margin: 0 0 24px 0;\n line-height: 1.5;\n }\n\n .lokotro-result-details {\n width: 100%;\n max-width: 320px;\n background: var(--lokotro-card, #3A4840);\n border-radius: 16px;\n padding: 16px;\n margin-bottom: 32px;\n }\n\n .lokotro-detail-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n }\n\n .lokotro-detail-row:not(:last-child) {\n border-bottom: 1px solid var(--lokotro-border, #3A473F);\n }\n\n .lokotro-detail-label {\n font-size: 14px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n }\n\n .lokotro-detail-value {\n font-size: 14px;\n font-weight: 600;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-mono {\n font-family: 'Courier New', monospace;\n font-size: 12px;\n }\n\n .lokotro-result-actions {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n max-width: 320px;\n }\n\n .lokotro-btn-primary,\n .lokotro-btn-secondary {\n width: 100%;\n padding: 14px 24px;\n border-radius: 12px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .lokotro-btn-primary {\n background: linear-gradient(135deg, var(--lokotro-primary, #5A5E39), var(--lokotro-secondary, #6E7346));\n color: var(--lokotro-text-primary, #F2F0D5);\n border: none;\n }\n\n .lokotro-result-success .lokotro-btn-primary {\n background: linear-gradient(135deg, var(--lokotro-success, #3BFBDA), var(--lokotro-success-dark, #27D4B6));\n color: var(--lokotro-background-dark, #1C2621);\n }\n\n .lokotro-btn-primary:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);\n }\n\n .lokotro-btn-secondary {\n background: transparent;\n color: var(--lokotro-text-primary, #F2F0D5);\n border: 2px solid var(--lokotro-border, #3A473F);\n }\n\n .lokotro-btn-secondary:hover {\n border-color: var(--lokotro-text-secondary, #D5D3B8);\n }\n `]\n})\nexport class LokotroResultComponent {\n @Input() type: ResultType = 'success';\n @Input() title: string = '';\n @Input() message?: string;\n @Input() amount?: number;\n @Input() currency?: string;\n @Input() transactionId?: string;\n @Input() primaryActionLabel?: string;\n @Input() secondaryActionLabel?: string;\n\n @Output() primaryAction = new EventEmitter<void>();\n @Output() secondaryAction = new EventEmitter<void>();\n\n constructor(public localization: LokotroLocalizationService) {}\n\n formatAmount(amount: number, currency?: string): string {\n const formatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency || 'USD',\n minimumFractionDigits: 2\n });\n return formatter.format(amount);\n }\n\n onPrimaryClick(): void {\n this.primaryAction.emit();\n }\n\n onSecondaryClick(): void {\n this.secondaryAction.emit();\n }\n}\n","/**\n * Lokotro Pay - Loading Component\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'lokotro-loading',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"lokotro-loading\">\n <div class=\"lokotro-loading-spinner\">\n <div class=\"lokotro-pulse-ring\"></div>\n <div class=\"lokotro-pulse-ring\"></div>\n <div class=\"lokotro-pulse-dot\"></div>\n </div>\n <p class=\"lokotro-loading-message\" *ngIf=\"message\">{{ message }}</p>\n </div>\n `,\n styles: [`\n .lokotro-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 300px;\n padding: 24px;\n }\n\n .lokotro-loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n margin-bottom: 24px;\n }\n\n .lokotro-pulse-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid var(--lokotro-accent, #3BFBDA);\n border-radius: 50%;\n opacity: 0;\n animation: lokotro-pulse 2s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;\n }\n\n .lokotro-pulse-ring:nth-child(2) {\n animation-delay: 0.5s;\n }\n\n .lokotro-pulse-dot {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 16px;\n height: 16px;\n background: var(--lokotro-accent, #3BFBDA);\n border-radius: 50%;\n animation: lokotro-dot-pulse 2s ease-in-out infinite;\n }\n\n @keyframes lokotro-pulse {\n 0% {\n transform: scale(0.5);\n opacity: 0.8;\n }\n 100% {\n transform: scale(1.5);\n opacity: 0;\n }\n }\n\n @keyframes lokotro-dot-pulse {\n 0%, 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n 50% {\n transform: translate(-50%, -50%) scale(1.2);\n }\n }\n\n .lokotro-loading-message {\n font-size: 16px;\n color: var(--lokotro-text-secondary, #D5D3B8);\n margin: 0;\n }\n `]\n})\nexport class LokotroLoadingComponent {\n @Input() message?: string;\n}\n","/**\n * Lokotro Pay - Checkout Component\n * Main checkout widget with clean, theme-based design\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { LokotroPaymentService, LokotroPaymentState } from '../../services/lokotro-payment.service';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\nimport { LokotroPayEnv } from '../../constants/environment';\nimport {\n LokotroPayConfig,\n LokotroPaymentBody,\n LokotroPayOnResponse,\n LokotroPayOnError,\n LokotroPayThemeConfig\n} from '../../models';\nimport { LokotroPayScreenNavigation, LokotroPayLanguage } from '../../enums';\n\n// Import child components\nimport { LokotroPaymentMethodSelectionComponent } from '../payment-method-selection/payment-method-selection.component';\nimport { LokotroPaymentFormComponent } from '../payment-form/payment-form.component';\nimport { LokotroBankTransferFormComponent } from '../bank-transfer-form/bank-transfer-form.component';\nimport { LokotroOtpVerificationComponent } from '../otp-verification/otp-verification.component';\nimport { LokotroProcessingComponent } from '../processing/processing.component';\nimport { LokotroResultComponent } from '../result/result.component';\nimport { LokotroLoadingComponent } from '../loading/loading.component';\n\n@Component({\n selector: 'lokotro-pay-checkout',\n standalone: true,\n imports: [\n CommonModule,\n LokotroPaymentMethodSelectionComponent,\n LokotroPaymentFormComponent,\n LokotroBankTransferFormComponent,\n LokotroOtpVerificationComponent,\n LokotroProcessingComponent,\n LokotroResultComponent,\n LokotroLoadingComponent\n ],\n template: `\n <div class=\"lokotro-checkout\" [class.lokotro-dark]=\"isDarkTheme\" [style]=\"containerStyle\">\n <!-- Header -->\n <div class=\"lokotro-checkout-header\" *ngIf=\"title\" [style.background-color]=\"titleBackgroundColor\">\n <button class=\"lokotro-back-btn\" (click)=\"onBack()\" *ngIf=\"canGoBack\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 12H5M12 19l-7-7 7-7\"/>\n </svg>\n </button>\n <h2 class=\"lokotro-title\" [style]=\"titleStyleString\">{{ title }}</h2>\n <button class=\"lokotro-close-btn\" (click)=\"onClose()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"lokotro-checkout-content\">\n <!-- Loading Screen -->\n <lokotro-loading \n *ngIf=\"currentScreen === 'loadingScreen'\"\n [message]=\"localization.translate('loading')\">\n </lokotro-loading>\n\n <!-- Payment Method Selection Screen -->\n <lokotro-payment-method-selection\n *ngIf=\"currentScreen === 'paymentMethodSelectionScreen'\"\n [paymentMethods]=\"state?.paymentInfo?.availablePaymentMethods || []\"\n [selectedMethod]=\"state?.selectedPaymentMethod\"\n (methodSelected)=\"onPaymentMethodSelected($event)\">\n </lokotro-payment-method-selection>\n\n <!-- Payment Form Screens -->\n <lokotro-payment-form\n *ngIf=\"isPaymentFormScreen\"\n [channel]=\"state?.selectedPaymentMethod?.channel\"\n [transactionId]=\"state?.transactionId\"\n [showUserInfoForm]=\"state?.paymentInfo?.showUserInfoForm || false\"\n (formSubmitted)=\"onFormSubmitted($event)\"\n (cancel)=\"onCancel()\">\n </lokotro-payment-form>\n\n <!-- Bank Transfer Form Screen -->\n <lokotro-bank-transfer-form\n *ngIf=\"currentScreen === 'bankTransferFormScreen'\"\n [showUserInfoForm]=\"state?.paymentInfo?.showUserInfoForm || false\"\n (formSubmitted)=\"onFormSubmitted($event)\"\n (cancel)=\"onCancel()\">\n </lokotro-bank-transfer-form>\n\n <!-- OTP Verification Screen -->\n <lokotro-otp-verification\n *ngIf=\"currentScreen === 'ewalletOtpScreen'\"\n [transactionId]=\"state?.transactionId\"\n (otpVerified)=\"onOtpVerified($event)\"\n (resendOtp)=\"onResendOtp()\"\n (cancel)=\"onCancel()\">\n </lokotro-otp-verification>\n\n <!-- Processing Screens -->\n <lokotro-processing\n *ngIf=\"isProcessingScreen\"\n [type]=\"currentScreen === 'mobileMoneyProcessingScreen' ? 'mobileMoney' : 'default'\"\n [message]=\"localization.translate('processing')\">\n </lokotro-processing>\n\n <!-- Success Screen -->\n <lokotro-result\n *ngIf=\"currentScreen === 'successScreen'\"\n type=\"success\"\n [title]=\"state?.response?.title || localization.translate('paymentSuccessful')\"\n [message]=\"state?.response?.message || ''\"\n [amount]=\"state?.response?.amount\"\n [currency]=\"state?.response?.currency\"\n [transactionId]=\"state?.response?.transactionId\"\n (primaryAction)=\"onDone()\"\n [primaryActionLabel]=\"localization.translate('done')\">\n </lokotro-result>\n\n <!-- Error Screen -->\n <lokotro-result\n *ngIf=\"currentScreen === 'errorScreen'\"\n type=\"error\"\n [title]=\"state?.error?.title || localization.translate('paymentFailed')\"\n [message]=\"state?.error?.message || ''\"\n (primaryAction)=\"onRetry()\"\n [primaryActionLabel]=\"localization.translate('retry')\"\n (secondaryAction)=\"onClose()\"\n [secondaryActionLabel]=\"localization.translate('close')\">\n </lokotro-result>\n\n <!-- Warning Screen -->\n <lokotro-result\n *ngIf=\"currentScreen === 'warningScreen'\"\n type=\"warning\"\n [title]=\"'Warning'\"\n [message]=\"state?.error?.message || ''\"\n (primaryAction)=\"onContinue()\"\n [primaryActionLabel]=\"localization.translate('continue')\">\n </lokotro-result>\n\n <!-- Info Screen -->\n <lokotro-result\n *ngIf=\"currentScreen === 'infoScreen'\"\n type=\"info\"\n [title]=\"'Information'\"\n [message]=\"state?.error?.message || ''\"\n (primaryAction)=\"onClose()\"\n [primaryActionLabel]=\"localization.translate('close')\">\n </lokotro-result>\n </div>\n </div>\n `,\n styles: [`\n .lokotro-checkout {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n background: var(--lokotro-background, #1C2621);\n color: var(--lokotro-text-primary, #F2F0D5);\n font-family: var(--lokotro-font-family, 'Comfortaa', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);\n }\n\n .lokotro-checkout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n background: var(--lokotro-surface, #2A3832);\n border-bottom: 1px solid var(--lokotro-border, #3A473F);\n }\n\n .lokotro-title {\n flex: 1;\n text-align: center;\n font-size: 18px;\n font-weight: 600;\n margin: 0;\n color: var(--lokotro-text-primary, #F2F0D5);\n }\n\n .lokotro-back-btn,\n .lokotro-close-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--lokotro-text-primary, #F2F0D5);\n border-radius: 8px;\n transition: background-color 0.2s;\n }\n\n .lokotro-back-btn:hover,\n .lokotro-close-btn:hover {\n background: var(--lokotro-glass-light, rgba(255, 255, 255, 0.1));\n }\n\n .lokotro-checkout-content {\n flex: 1;\n padding: 16px;\n overflow-y: auto;\n }\n\n .lokotro-dark {\n --lokotro-background: #1C2621;\n --lokotro-surface: #2A3832;\n --lokotro-text-primary: #F2F0D5;\n --lokotro-text-secondary: #D5D3B8;\n }\n `]\n})\nexport class LokotroPayCheckoutComponent implements OnInit, OnDestroy {\n @Input() title?: string;\n @Input() titleStyle?: Record<string, string>;\n @Input() titleBackgroundColor?: string;\n @Input() configs!: LokotroPayConfig;\n @Input() paymentBody!: LokotroPaymentBody;\n @Input() enableHapticFeedback: boolean = true;\n @Input() backgroundColor?: string;\n @Input() padding?: string;\n @Input() themeConfig?: LokotroPayThemeConfig;\n @Input() language?: string;\n\n @Output() response = new EventEmitter<LokotroPayOnResponse>();\n @Output() error = new EventEmitter<LokotroPayOnError>();\n @Output() closed = new EventEmitter<void>();\n\n state?: LokotroPaymentState;\n isDarkTheme: boolean = true;\n\n private stateSubscription?: Subscription;\n\n constructor(\n private paymentService: LokotroPaymentService,\n public localization: LokotroLocalizationService\n ) { }\n\n ngOnInit(): void {\n this.initializeEnvironment();\n this.initializeLocalization();\n this.subscribeToState();\n this.initializePayment();\n }\n\n ngOnDestroy(): void {\n this.stateSubscription?.unsubscribe();\n this.paymentService.resetState();\n }\n\n private initializeEnvironment(): void {\n LokotroPayEnv.initialize(\n this.configs.isProduction ?? false,\n this.configs.customApiUrl\n );\n\n this.paymentService.setAppKey(this.configs.token);\n\n if (this.configs.acceptLanguage) {\n this.paymentService.setAcceptLanguage(this.configs.acceptLanguage);\n }\n }\n\n private initializeLocalization(): void {\n if (this.language) {\n this.localization.setLanguageByCode(this.language);\n } else {\n this.localization.detectAndSetLanguage();\n }\n }\n\n private subscribeToState(): void {\n this.stateSubscription = this.paymentService.state$.subscribe(state => {\n this.state = state;\n\n // Emit events based on state changes\n if (state.currentScreen === LokotroPayScreenNavigation.SuccessScreen && state.response) {\n this.response.emit({\n message: state.response.message,\n title: state.response.title,\n customRef: state.response.customRef,\n amount: state.response.amount,\n apiResponseCode: state.response.apiResponseCode,\n currency: state.response.currency,\n paymentStatus: state.response.paymentStatus,\n systemRef: state.response.systemRef,\n transactionId: state.response.transactionId,\n timestamp: state.response.timestamp || new Date()\n });\n }\n\n if (state.currentScreen === LokotroPayScreenNavigation.ErrorScreen && state.error) {\n this.error.emit({\n message: state.error.message,\n title: state.error.title,\n errorCode: state.error.errorCode,\n timestamp: state.error.timestamp\n });\n }\n });\n }\n\n private initializePayment(): void {\n this.paymentService.createPayment(this.paymentBody).subscribe({\n error: (err) => {\n console.error('[Lokotro Pay] Payment initialization error:', err);\n }\n });\n }\n\n get currentScreen(): string {\n return this.state?.currentScreen || LokotroPayScreenNavigation.LoadingScreen;\n }\n\n get isPaymentFormScreen(): boolean {\n const formScreens = [\n LokotroPayScreenNavigation.PaymentFormScreen,\n LokotroPayScreenNavigation.EWalletFormScreen,\n LokotroPayScreenNavigation.MobileMoneyFormScreen,\n LokotroPayScreenNavigation.CardFormScreen,\n LokotroPayScreenNavigation.FlashFormScreen\n ];\n return formScreens.includes(this.currentScreen as LokotroPayScreenNavigation);\n }\n\n get isProcessingScreen(): boolean {\n return [\n LokotroPayScreenNavigation.ProcessingScreen,\n LokotroPayScreenNavigation.MobileMoneyProcessingScreen\n ].includes(this.currentScreen as LokotroPayScreenNavigation);\n }\n\n get canGoBack(): boolean {\n const noBackScreens = [\n LokotroPayScreenNavigation.LoadingScreen,\n LokotroPayScreenNavigation.ProcessingScreen,\n LokotroPayScreenNavigation.MobileMoneyProcessingScreen,\n LokotroPayScreenNavigation.SuccessScreen\n ];\n return !noBackScreens.includes(this.currentScreen as LokotroPayScreenNavigation);\n }\n\n get containerStyle(): string {\n let style = '';\n if (this.backgroundColor) {\n style += `background-color: ${this.backgroundColor};`;\n }\n if (this.padding) {\n style += `padding: ${this.padding};`;\n }\n return style;\n }\n\n get titleStyleString(): string {\n if (!this.titleStyle) return '';\n return Object.entries(this.titleStyle)\n .map(([key, value]) => `${this.camelToKebab(key)}: ${value}`)\n .join('; ');\n }\n\n private camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n }\n\n onPaymentMethodSelected(method: any): void {\n this.paymentService.selectPaymentMethod(method);\n if (this.enableHapticFeedback && 'vibrate' in navigator) {\n navigator.vibrate(10);\n }\n }\n\n onFormSubmitted(formData: any): void {\n const submitRequest = {\n transactionId: this.state?.transactionId || '',\n paymentMethod: this.state?.selectedPaymentMethod?.name || '',\n ...formData\n };\n\n this.paymentService.submitPaymentDetails(submitRequest).subscribe({\n error: (err) => {\n console.error('[Lokotro Pay] Form submission error:', err);\n }\n });\n }\n\n onOtpVerified(otp: string): void {\n if (!this.state?.transactionId) return;\n\n this.paymentService.verifyOtp({\n transactionId: this.state.transactionId,\n otp\n }).subscribe({\n error: (err) => {\n console.error('[Lokotro Pay] OTP verification error:', err);\n }\n });\n }\n\n onResendOtp(): void {\n if (!this.state?.transactionId) return;\n\n this.paymentService.resendOtp({\n transactionId: this.state.transactionId\n }).subscribe({\n error: (err) => {\n console.error('[Lokotro Pay] OTP resend error:', err);\n }\n });\n }\n\n onBack(): void {\n const currentScreen = this.currentScreen as LokotroPayScreenNavigation;\n\n // Navigate back based on current screen\n if (this.isPaymentFormScreen || currentScreen === LokotroPayScreenNavigation.BankTransferFormScreen) {\n this.paymentService.navigateToScreen(LokotroPayScreenNavigation.PaymentMethodSelectionScreen);\n } else if (currentScreen === LokotroPayScreenNavigation.EWalletOtpScreen) {\n this.paymentService.navigateToScreen(LokotroPayScreenNavigation.EWalletFormScreen);\n }\n }\n\n onCancel(): void {\n this.closed.emit();\n }\n\n onClose(): void {\n this.closed.emit();\n }\n\n onRetry(): void {\n this.paymentService.resetState();\n this.initializePayment();\n }\n\n onDone(): void {\n this.closed.emit();\n }\n\n onContinue(): void {\n // Continue from warning screen\n this.paymentService.navigateToScreen(LokotroPayScreenNavigation.PaymentMethodSelectionScreen);\n }\n}\n","import { NgModule, ModuleWithProviders, InjectionToken } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\n\n// Components\nimport { LokotroPayCheckoutComponent } from './components/checkout/checkout.component';\nimport { LokotroPaymentMethodSelectionComponent } from './components/payment-method-selection/payment-method-selection.component';\nimport { LokotroPaymentFormComponent } from './components/payment-form/payment-form.component';\nimport { LokotroOtpVerificationComponent } from './components/otp-verification/otp-verification.component';\nimport { LokotroProcessingComponent } from './components/processing/processing.component';\nimport { LokotroResultComponent } from './components/result/result.component';\nimport { LokotroLoadingComponent } from './components/loading/loading.component';\nimport { LokotroMobileMoneyPhoneInputComponent } from './components/mobile-money-phone-input/mobile-money-phone-input.component';\nimport { LokotroBankTransferFormComponent } from './components/bank-transfer-form/bank-transfer-form.component';\n\n// Services\nimport { LokotroHttpClientService } from './services/lokotro-http-client.service';\nimport { LokotroPaymentService } from './services/lokotro-payment.service';\nimport { LokotroLocalizationService } from './services/lokotro-localization.service';\nimport { LokotroCountryService } from './services/lokotro-country.service';\n\n// Models\nimport { LokotroPayConfig } from './models';\n\n/**\n * Environment configuration interface\n */\nexport interface LokotroEnvConfig {\n baseUrl: string;\n appKey: string;\n}\n\n/**\n * Configuration tokens for Lokotro Pay\n */\nexport const LOKOTRO_PAY_CONFIG = new InjectionToken<LokotroPayConfig>('LOKOTRO_PAY_CONFIG');\nexport const LOKOTRO_ENV_CONFIG = new InjectionToken<LokotroEnvConfig>('LOKOTRO_ENV_CONFIG');\n\n/**\n * LokotroPayModule - Main module for the Lokotro Pay Angular library\n * \n * This module can be used in two ways:\n * \n * 1. Import individual standalone components directly in your components\n * 2. Import this module in your app module for non-standalone applications\n * \n * @example\n * // Using standalone components (recommended for Angular 17+)\n * import { LokotroCheckoutComponent } from '@lokotro/pay';\n * \n * @Component({\n * standalone: true,\n * imports: [LokotroCheckoutComponent],\n * template: `<lokotro-checkout [config]=\"config\" (paymentComplete)=\"onComplete($event)\" />`\n * })\n * export class MyComponent {}\n * \n * @example\n * // Using module import\n * import { LokotroPayModule } from '@lokotro/pay';\n * \n * @NgModule({\n * imports: [LokotroPayModule.forRoot({\n * env: { baseUrl: 'https://api.lokotro.com', appKey: 'your-key' }\n * })]\n * })\n * export class AppModule {}\n */\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n ReactiveFormsModule,\n FormsModule,\n // Standalone components\n LokotroPayCheckoutComponent,\n LokotroPaymentMethodSelectionComponent,\n LokotroPaymentFormComponent,\n LokotroOtpVerificationComponent,\n LokotroProcessingComponent,\n LokotroResultComponent,\n LokotroLoadingComponent,\n LokotroMobileMoneyPhoneInputComponent,\n LokotroBankTransferFormComponent,\n ],\n exports: [\n LokotroPayCheckoutComponent,\n LokotroPaymentMethodSelectionComponent,\n LokotroPaymentFormComponent,\n LokotroOtpVerificationComponent,\n LokotroProcessingComponent,\n LokotroResultComponent,\n LokotroLoadingComponent,\n LokotroMobileMoneyPhoneInputComponent,\n LokotroBankTransferFormComponent,\n ],\n})\nexport class LokotroPayModule {\n /**\n * Configure the Lokotro Pay module with environment and default settings\n * \n * @param config - Configuration object containing environment settings\n * @returns ModuleWithProviders for the configured module\n */\n static forRoot(config?: Partial<{\n env: LokotroEnvConfig;\n defaultConfig: Partial<LokotroPayConfig>;\n }>): ModuleWithProviders<LokotroPayModule> {\n return {\n ngModule: LokotroPayModule,\n providers: [\n LokotroHttpClientService,\n LokotroPaymentService,\n LokotroLocalizationService,\n LokotroCountryService,\n {\n provide: LOKOTRO_ENV_CONFIG,\n useValue: config?.env ?? null,\n },\n {\n provide: LOKOTRO_PAY_CONFIG,\n useValue: config?.defaultConfig ?? null,\n },\n ],\n };\n }\n}\n","/**\n * Lokotro Pay - Core Models and Interfaces\n * Angular version of the Flutter Lokotro Pay plugin\n */\n\nimport { LokotroPayChannel, LokotroPaymentStatus, LokotroPayApiResponseCode } from '../enums';\n\n// Re-export country models\nexport * from './country';\n// Re-export bank transfer models\nexport * from './bank-transfer';\n\n/**\n * Configuration for Lokotro Pay\n */\nexport interface LokotroPayConfig {\n /** API authentication token (app-key) */\n token: string;\n /** Whether to use production environment */\n isProduction?: boolean;\n /** Custom API URL (optional) */\n customApiUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Accept-Language header for API requests */\n acceptLanguage?: string;\n}\n\n/**\n * Payment body for Lokotro Pay - All-in-one request\n */\nexport interface LokotroPaymentBody {\n // Basic payment info\n customerReference: string;\n amount: string;\n currency: string;\n paymentMethod?: string;\n userInfo?: 'full' | 'partial' | 'none';\n paymentMethodInfo?: 'full' | 'partial' | 'none';\n feeCoveredBy?: 'buyer' | 'seller';\n deliveryBehaviour?: 'direct_delivery' | 'escrow';\n notifyUrl?: string;\n successRedirectUrl?: string;\n failRedirectUrl?: string;\n\n // User information (when userInfo = \"full\")\n firstName?: string;\n lastName?: string;\n phoneNumber?: string;\n email?: string;\n\n // E-wallet fields\n walletNumber?: string;\n walletPin?: string;\n\n // Mobile money fields\n mobileMoneyPhoneNumber?: string;\n\n // Flash fields\n flashNumber?: string;\n flashPin?: string;\n\n // Card fields\n cardNumber?: string;\n cardExpiryDate?: string;\n cardCvv?: string;\n cardHolderName?: string;\n\n // Merchant information\n merchant?: LokotroMerchantInfo;\n\n // Mastercard payment method\n mastercardPaymentMethod?: 'HOSTED_SESSION' | 'DIRECT_CAPTURE';\n\n // Additional metadata\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Merchant information\n */\nexport interface LokotroMerchantInfo {\n id: string;\n name: string;\n logoUrl?: string;\n website?: string;\n description?: string;\n}\n\n/**\n * Main payment response model\n */\nexport interface LokotroPayResponse {\n message: string;\n title: string;\n customRef: string;\n amount: number;\n apiResponseCode: LokotroPayApiResponseCode;\n currency: string;\n paymentStatus: LokotroPaymentStatus;\n systemRef: string;\n transactionId?: string;\n identifier?: string;\n successRedirectUrl?: string;\n failRedirectUrl?: string;\n timestamp?: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Error response model\n */\nexport interface LokotroPayError {\n message: string;\n title: string;\n errorCode?: LokotroPayApiResponseCode;\n details?: string;\n successRedirectUrl?: string;\n failRedirectUrl?: string;\n timestamp: Date;\n}\n\n/**\n * Payment information model\n */\nexport interface LokotroPaymentInfo {\n id: string;\n amount: number;\n currency: string;\n description: string;\n merchantName: string;\n merchantId: string;\n availablePaymentMethods: LokotroPaymentMethod[];\n createdAt: Date;\n expiresAt?: Date;\n metadata?: Record<string, unknown>;\n paymentUrl?: string;\n showUserInfoForm: boolean;\n showPaymentMethodForm: boolean;\n fillingInfo?: string;\n}\n\n/**\n * Payment method model\n */\nexport interface LokotroPaymentMethod {\n id: string;\n name: string;\n displayName: string;\n channel: LokotroPayChannel;\n iconUrl: string;\n isEnabled: boolean;\n configuration?: Record<string, unknown>;\n supportedCurrencies?: string[];\n}\n\n/**\n * Payment method list item for UI display\n */\nexport interface LokotroPaymentMethodListItem {\n id: string;\n name: string;\n displayName: string;\n channel: LokotroPayChannel;\n iconUrl: string;\n isEnabled: boolean;\n isSelected: boolean;\n configuration?: Record<string, unknown>;\n}\n\n/**\n * E-wallet selection type\n */\nexport interface LokotroEWalletSelectionType {\n id: string;\n name: string;\n displayName: string;\n iconUrl: string;\n requiresOtp: boolean;\n configuration?: Record<string, unknown>;\n}\n\n/**\n * Payment form data model\n */\nexport interface LokotroPaymentFormData {\n paymentMethodId: string;\n channel: LokotroPayChannel;\n formData: Record<string, unknown>;\n timestamp: Date;\n}\n\n/**\n * Response callback for successful payments\n */\nexport interface LokotroPayOnResponse {\n message: string;\n title: string;\n customRef: string;\n customerReference?: string;\n amount: number;\n apiResponseCode: LokotroPayApiResponseCode;\n currency: string;\n paymentStatus: LokotroPaymentStatus;\n systemRef: string;\n transactionId?: string;\n identifier?: string;\n successRedirectUrl?: string;\n failRedirectUrl?: string;\n timestamp: Date;\n}\n\n/**\n * Error callback for failed payments\n */\nexport interface LokotroPayOnError {\n message: string;\n title: string;\n errorCode?: LokotroPayApiResponseCode;\n identifier?: string;\n customerReference?: string;\n systemReference?: string;\n amount?: number;\n currency?: string;\n successRedirectUrl?: string;\n failRedirectUrl?: string;\n timestamp: Date;\n}\n\n/**\n * HTTP Response wrapper\n */\nexport interface LokotroHttpResponse<T> {\n data?: T;\n message: string;\n statusCode: number;\n isSuccess: boolean;\n apiResponseCode?: LokotroPayApiResponseCode;\n timestamp: Date;\n}\n\n/**\n * Transaction details model\n */\nexport interface LokotroTransactionDetails {\n transactionId: string;\n amount: number;\n currency: string;\n status: LokotroPaymentStatus;\n paymentMethod: string;\n customerReference: string;\n systemReference: string;\n createdAt: Date;\n updatedAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Payment submit request\n */\nexport interface LokotroPaymentSubmitRequest {\n transactionId: string;\n paymentMethod: string;\n // E-wallet fields\n walletNumber?: string;\n walletPin?: string;\n // Mobile money fields\n mobileMoneyPhoneNumber?: string;\n // Flash fields\n flashNumber?: string;\n flashPin?: string;\n // Card fields\n cardNumber?: string;\n cardExpiryDate?: string;\n cardCvv?: string;\n cardHolderName?: string;\n // Bank Transfer\n bankTransferAccountId?: string;\n}\n\n/**\n * Payment submit response\n */\nexport interface LokotroPaymentSubmitResponse {\n success: boolean;\n message: string;\n transactionId: string;\n status: LokotroPaymentStatus;\n requiresOtp: boolean;\n otpDestination?: string;\n redirectUrl?: string;\n}\n\n/**\n * OTP verification request\n */\nexport interface LokotroOtpVerifyRequest {\n transactionId: string;\n otp: string;\n}\n\n/**\n * OTP verification response\n */\nexport interface LokotroOtpVerifyResponse {\n success: boolean;\n message: string;\n transactionId: string;\n status: LokotroPaymentStatus;\n}\n\n/**\n * OTP resend request\n */\nexport interface LokotroOtpResendRequest {\n transactionId: string;\n}\n\n/**\n * OTP resend response\n */\nexport interface LokotroOtpResendResponse {\n success: boolean;\n message: string;\n otpDestination?: string;\n}\n\n/**\n * Response message for UI feedback\n */\nexport interface LokotroPayResponseMessage {\n message: string;\n title: string;\n screenType: 'success' | 'error' | 'warning' | 'info';\n timestamp: Date;\n}\n\n/**\n * Theme configuration\n */\nexport interface LokotroPayThemeConfig {\n primaryColor?: string;\n secondaryColor?: string;\n accentColor?: string;\n backgroundColor?: string;\n textColor?: string;\n errorColor?: string;\n successColor?: string;\n warningColor?: string;\n borderRadius?: string;\n fontFamily?: string;\n}\n\n/**\n * Checkout component input configuration\n */\nexport interface LokotroCheckoutConfig {\n title?: string;\n titleStyle?: Record<string, string>;\n titleBackgroundColor?: string;\n configs: LokotroPayConfig;\n paymentBody: LokotroPaymentBody;\n enableHapticFeedback?: boolean;\n backgroundColor?: string;\n padding?: string;\n themeConfig?: LokotroPayThemeConfig;\n language?: string;\n}\n","/**\n * Lokotro Pay - Color Constants\n * Angular version of the Flutter Lokotro Pay plugin colors\n */\n\n/**\n * Color scheme for Lokotro Pay - matching Lokotroo App design\n */\nexport const LokotroPayColors = {\n // Primary Brand Colors - Dark Green Theme\n primary: '#5A5E39',\n primaryDark: '#151E1A',\n primaryLight: '#2A3832',\n primaryVariant: '#121917',\n\n // Secondary Colors - Olive Green\n secondary: '#6E7346',\n secondaryDark: '#5A5E39',\n secondaryLight: '#868B57',\n secondaryVariant: '#4D5131',\n\n // Accent Colors - Turquoise for contrast\n accent: '#3BFBDA',\n accentDark: '#27D4B6',\n accentLight: '#65FCE3',\n\n // Success Colors - Enhanced Turquoise\n success: '#3BFBDA',\n successDark: '#27D4B6',\n successLight: '#65FCE3',\n\n // Error Colors - Terracotta\n error: '#D97652',\n errorDark: '#B15F41',\n errorLight: '#E48F6F',\n\n // Warning Colors - Terracotta\n warning: '#D97652',\n warningDark: '#B15F41',\n warningLight: '#E48F6F',\n\n // Info Colors\n info: '#3B82F6',\n infoDark: '#2563EB',\n infoLight: '#60A5FA',\n\n // Neutral Colors\n white: '#FFFFFF',\n black: '#000000',\n grey: '#9E9E9E',\n greyLight: '#E0E0E0',\n greyDark: '#424242',\n\n // Text Colors - Light Theme (Cream tints)\n textPrimaryLight: '#1C2621',\n textSecondaryLight: '#6E7346',\n textTertiaryLight: '#8F9367',\n textDisabledLight: '#BDBDBD',\n\n // Text Colors - Dark Theme (Green tints)\n textPrimaryDark: '#F2F0D5',\n textSecondaryDark: '#D5D3B8',\n textTertiaryDark: '#B1AF97',\n textDisabledDark: '#666666',\n\n // Background Colors - Light Theme (Cream)\n backgroundLight: '#F2F0D5',\n surfaceLight: '#F8F7E8',\n cardLight: '#FFFFFA',\n\n // Background Colors - Dark Theme (Green tints)\n backgroundDark: '#1C2621',\n surfaceDark: '#2A3832',\n cardDark: '#3A4840',\n\n // Glassmorphism Colors\n glassLight: 'rgba(255, 255, 255, 0.1)',\n glassDark: 'rgba(0, 0, 0, 0.1)',\n glassBlur: 'rgba(0, 0, 0, 0.5)',\n\n // Border Colors\n borderLight: '#E5E2C0',\n borderDark: '#3A473F',\n\n // Divider Colors\n dividerLight: '#ECEAD7',\n dividerDark: '#2E3933',\n\n // Shadow Colors\n shadowLight: 'rgba(0, 0, 0, 0.1)',\n shadowMedium: 'rgba(0, 0, 0, 0.2)',\n shadowDark: 'rgba(0, 0, 0, 0.3)',\n\n // Overlay Colors\n overlayLight: 'rgba(255, 255, 255, 0.5)',\n overlayDark: 'rgba(0, 0, 0, 0.5)',\n\n // Transaction Type Colors\n transactionSent: '#D97652',\n transactionReceived: '#3BFBDA',\n transactionPending: '#6E7346',\n transactionFailed: '#3A4840'\n};\n\n/**\n * CSS Gradient definitions\n */\nexport const LokotroPayGradients = {\n primary: `linear-gradient(135deg, ${LokotroPayColors.primary}, ${LokotroPayColors.secondary})`,\n secondary: `linear-gradient(135deg, ${LokotroPayColors.secondary}, ${LokotroPayColors.secondaryLight})`,\n accent: `linear-gradient(135deg, ${LokotroPayColors.accent}, ${LokotroPayColors.accentLight})`,\n success: `linear-gradient(135deg, ${LokotroPayColors.success}, ${LokotroPayColors.successDark})`,\n error: `linear-gradient(135deg, ${LokotroPayColors.error}, ${LokotroPayColors.errorDark})`,\n warning: `linear-gradient(135deg, ${LokotroPayColors.warning}, ${LokotroPayColors.warningDark})`,\n info: `linear-gradient(135deg, ${LokotroPayColors.info}, ${LokotroPayColors.infoLight})`,\n card: `linear-gradient(135deg, ${LokotroPayColors.backgroundDark}, ${LokotroPayColors.secondary})`\n};\n\n/**\n * Default theme configuration\n */\nexport const LokotroPayDefaultTheme = {\n light: {\n '--lokotro-primary': LokotroPayColors.primary,\n '--lokotro-secondary': LokotroPayColors.secondary,\n '--lokotro-accent': LokotroPayColors.accent,\n '--lokotro-background': LokotroPayColors.backgroundLight,\n '--lokotro-surface': LokotroPayColors.surfaceLight,\n '--lokotro-card': LokotroPayColors.cardLight,\n '--lokotro-text-primary': LokotroPayColors.textPrimaryLight,\n '--lokotro-text-secondary': LokotroPayColors.textSecondaryLight,\n '--lokotro-border': LokotroPayColors.borderLight,\n '--lokotro-divider': LokotroPayColors.dividerLight,\n '--lokotro-error': LokotroPayColors.error,\n '--lokotro-success': LokotroPayColors.success,\n '--lokotro-warning': LokotroPayColors.warning,\n '--lokotro-info': LokotroPayColors.info\n },\n dark: {\n '--lokotro-primary': LokotroPayColors.primary,\n '--lokotro-secondary': LokotroPayColors.secondary,\n '--lokotro-accent': LokotroPayColors.accent,\n '--lokotro-background': LokotroPayColors.backgroundDark,\n '--lokotro-surface': LokotroPayColors.surfaceDark,\n '--lokotro-card': LokotroPayColors.cardDark,\n '--lokotro-text-primary': LokotroPayColors.textPrimaryDark,\n '--lokotro-text-secondary': LokotroPayColors.textSecondaryDark,\n '--lokotro-border': LokotroPayColors.borderDark,\n '--lokotro-divider': LokotroPayColors.dividerDark,\n '--lokotro-error': LokotroPayColors.error,\n '--lokotro-success': LokotroPayColors.success,\n '--lokotro-warning': LokotroPayColors.warning,\n '--lokotro-info': LokotroPayColors.info\n }\n};\n","/**\n * Lokotro Pay - Payment Status Component\n * Entry point for tracking payment status by payment ID only\n * This component is used when payment was already initiated and we need to track its status\n */\n\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject, interval, Subscription } from 'rxjs';\nimport { takeUntil, switchMap, catchError } from 'rxjs/operators';\nimport { LokotroPaymentService } from '../../services/lokotro-payment.service';\nimport { LokotroLocalizationService } from '../../services/lokotro-localization.service';\nimport { LokotroHttpClientService } from '../../services/lokotro-http-client.service';\nimport { LokotroPayEnv } from '../../constants/environment';\nimport { LokotroLoadingComponent } from '../loading/loading.component';\nimport { LokotroResultComponent } from '../result/result.component';\nimport { LokotroProcessingComponent } from '../processing/processing.component';\nimport { LokotroOtpVerificationComponent } from '../otp-verification/otp-verification.component';\nimport { LokotroPayResponse, LokotroPayError, LokotroPayConfig } from '../../models';\nimport { LokotroPaymentStatus, LokotroPaymentStatusInfo, LokotroPayApiResponseCode, LokotroPayLanguage } from '../../enums';\n\n/**\n * Configuration for payment status tracking\n */\nexport interface LokotroPaymentStatusConfig {\n /** Payment ID to track */\n paymentId: string;\n /** API configuration */\n config: LokotroPayConfig;\n /** Polling interval in milliseconds (default: 5000) */\n pollingInterval?: number;\n /** Maximum polling attempts (default: 60 = 5 minutes with 5s interval) */\n maxPollingAttempts?: number;\n /** Language for translations */\n language?: LokotroPayLanguage;\n /** Auto-start polling on init (default: true) */\n autoStart?: boolean;\n}\n\n/**\n * Payment status response from API\n */\nexport interface LokotroPaymentStatusResponse {\n code: number;\n message: string;\n paymentId: string;\n transactionId?: string;\n status: LokotroPaymentStatus;\n amount?: number;\n currency?: string;\n merchantReference?: string;\n customerReference?: string;\n completedAt?: string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n // Redirect URLs\n successRedirectUrl?: string;\n failRedirectUrl?: string;\n notifyUrl?: string;\n}\n\n/**\n * Internal screen states\n */\ntype PaymentStatusScreen = 'loading' | 'pending' | 'processing' | 'otp' | 'success' | 'error' | 'cancelled' | 'expired';\n\n@Component({\n selector: 'lokotro-payment-status',\n standalone: true,\n imports: [CommonModule, LokotroLoadingComponent, LokotroResultComponent, LokotroProcessingComponent, LokotroOtpVerificationComponent],\n template: `\n <div class=\"lokotro-payment-status-container\">\n <!-- Header -->\n <div class=\"lokotro-status-header\" *ngIf=\"showHeader\">\n <h2 class=\"lokotro-status-title\">{{ localization.translate('paymentStatus') }}</h2>\n <button class=\"lokotro-close-btn\" (click)=\"onClose.emit()\" *ngIf=\"showCloseButton\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"lokotro-status-content\">\n <!-- Loading State -->\n <lokotro-loading \n *ngIf=\"currentScreen === 'loading'\"\n [message]=\"localization.translate('checkingPaymentStatus')\">\n </lokotro-loading>\n\n <!-- Pending State -->\n <div *ngIf=\"currentScreen === 'pending'\" class=\"status-section pending\">\n <div class=\"status-icon pending-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <polyline points=\"12 6 12 12 16 14\"/>\n </svg>\n </div>\n <h3 class=\"status-title\">{{ localization.translate('paymentPending') }}</h3>\n <p class=\"status-message\">{{ localization.translate('paymentPendingMessage') }}</p>\n <div class=\"payment-info\" *ngIf=\"paymentDetails\">\n <div class=\"info-row\">\n <span class=\"info-label\">{{ localization.translate('paymentId') }}:</span>\n <span class=\"info-value\">{{ paymentDetails.paymentId }}</span>\n </div>\n <div class=\"info-row\" *ngIf=\"paymentDetails.amount\">\n <span class=\"info-label\">{{ localization.translate('amount') }}:</span>\n <span class=\"info-value\">{{ paymentDetails.amount }} {{ paymentDetails.currency }}</span>\n </div>\n </div>\n <div class=\"polling-indicator\">\n <span class=\"pulse\"></span>\n <span>{{ localization.translate('checkingForUpdates') }}</span>\n </div>\n </div>\n\n <!-- Processing State -->\n <lokotro-processing\n *ngIf=\"currentScreen === 'processing'\"\n type=\"default\"\n [message]=\"localization.translate('paymentProcessing')\">\n </lokotro-processing>\n\n <!-- OTP Verification State -->\n <lokotro-otp-verification\n *ngIf=\"currentScreen === 'otp'\"\n [transactionId]=\"statusConfig?.paymentId\"\n [otpDestination]=\"otpDestination\"\n [otpLength]=\"6\"\n (otpVerified)=\"onOtpVerified($event)\"\n (resendOtp)=\"onResendOtp()\"\n (cancel)=\"onOtpCancel()\">\n </lokotro-otp-verification>\n\n <!-- Success State -->\n <lokotro-result\n *ngIf=\"currentScreen === 'success'\"\n type=\"success\"\n [title]=\"localization.translate('paymentSuccessful')\"\n [message]=\"paymentDetails?.message || localization.translate('paymentSuccessMessage')\"\n [amount]=\"paymentDetails?.amount\"\n [currency]=\"paymentDetails?.currency\"\n [transactionId]=\"paymentDetails?.transactionId\"\n (primaryAction)=\"onDone()\"\n [primaryActionLabel]=\"localization.translate('done')\">\n </lokotro-result>\n\n <!-- Error State -->\n <lokotro-result\n *ngIf=\"currentScreen === 'error'\"\n type=\"error\"\n [title]=\"localization.translate('paymentFailed')\"\n [message]=\"errorMessage || localization.translate('paymentFailedMessage')\"\n (primaryAction)=\"retryCheck()\"\n [primaryActionLabel]=\"localization.translate('retry')\"\n (secondaryAction)=\"onClose.emit()\"\n [secondaryActionLabel]=\"localization.translate('close')\">\n </lokotro-result>\n\n <!-- Cancelled State -->\n <lokotro-result\n *ngIf=\"currentScreen === 'cancelled'\"\n type=\"error\"\n [title]=\"localization.translate('paymentCancelled')\"\n [message]=\"localization.translate('paymentCancelledMessage')\"\n (primaryAction)=\"onClose.emit()\"\n [primaryActionLabel]=\"localization.translate('close')\">\n </lokotro-result>\n\n <!-- Expired State -->\n <lokotro-result\n *ngIf=\"currentScreen === 'expired'\"\n type=\"warning\"\n [title]=\"localization.translate('paymentExpired')\"\n [message]=\"localization.translate('paymentExpiredMessage')\"\n (primaryAction)=\"onClose.emit()\"\n [primaryActionLabel]=\"localization.translate('close')\">\n </lokotro-result>\n </div>\n </div>\n `,\n styles: [`\n .lokotro-payment-status-container {\n min-height: 300px;\n display: flex;\n flex-direction: column;\n background: var(--lokotro-background, #1C2621);\n border-radius: 16px;\n border: 1px solid var(--lokotro-border, rgba(59, 251, 218, 0.1));\n overflow: hidden;\n font-family: var(--lokotro-font-family, 'Comfortaa', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);\n }\n\n .lokotro-status-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--lokotro-surface, #2A3832);\n border-bottom: 1px solid var(--lokotro-border, rgba(59, 251, 218, 0.1));\n }\n\n .lokotro-status-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--lokotro-text-primary, #F2F0D5);\n margin: 0;\n }\n\n .lokotro-close-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--lokotro-text-primary, #F2F0D5);\n border-radius: 8px;\n transition: background-color 0.2s;\n }\n\n .lokotro-close-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n\n .lokotro-status-content {\n flex: 1;\n padding: 24px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .status-section {\n text-align: center;\n width: 100%;\n max-width: 400px;\n }\n\n .status-icon {\n width: 80px;\n height: 80px;\n margin: 0 auto 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n }\n\n .pending-icon {\n background: rgba(251, 191, 36, 0.1);\n color: #FBBF24;\n }\n\n .status-title {\n font-size: 22px;\n font-weight: 600;\n color: var(--lokotro-text-primary, #F2F0D5);\n margin: 0 0 12px;\n }\n\n .status-message {\n font-size: 14px;\n color: var(--lokotro-text-secondary, rgba(242, 240, 213, 0.7));\n margin: 0 0 24px;\n line-height: 1.5;\n }\n\n .payment-info {\n background: rgba(90, 94, 57, 0.2);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 24px;\n }\n\n .info-row {\n display: flex;\n justify-content: space-between;\n padding: 8px 0;\n border-bottom: 1px solid rgba(242, 240, 213, 0.1);\n }\n\n .info-row:last-child {\n border-bottom: none;\n }\n\n .info-label {\n color: var(--lokotro-text-secondary, rgba(242, 240, 213, 0.6));\n font-size: 14px;\n }\n\n .info-value {\n color: var(--lokotro-text-primary, #F2F0D5);\n font-size: 14px;\n font-weight: 500;\n }\n\n .polling-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-size: 12px;\n color: var(--lokotro-text-secondary, rgba(242, 240, 213, 0.5));\n }\n\n .pulse {\n width: 8px;\n height: 8px;\n background: var(--lokotro-primary, #3BFBDA);\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(1.2); }\n }\n `]\n})\nexport class LokotroPaymentStatusComponent implements OnInit, OnDestroy {\n /**\n * Payment status configuration\n */\n @Input() statusConfig!: LokotroPaymentStatusConfig;\n\n /**\n * Show header with title\n */\n @Input() showHeader: boolean = true;\n\n /**\n * Show close button in header\n */\n @Input() showCloseButton: boolean = true;\n\n /**\n * Emitted when payment status changes\n */\n @Output() statusChange = new EventEmitter<LokotroPaymentStatusResponse>();\n\n /**\n * Emitted when payment is completed successfully\n */\n @Output() paymentComplete = new EventEmitter<LokotroPaymentStatusResponse>();\n\n /**\n * Emitted when payment fails\n */\n @Output() paymentFailed = new EventEmitter<LokotroPaymentStatusResponse>();\n\n /**\n * Emitted when close button is clicked or done is pressed\n */\n @Output() onClose = new EventEmitter<void>();\n\n /**\n * Emitted when user clicks done after successful payment\n */\n @Output() onDoneEvent = new EventEmitter<LokotroPaymentStatusResponse>();\n\n currentScreen: PaymentStatusScreen = 'loading';\n paymentDetails: LokotroPaymentStatusResponse | null = null;\n errorMessage: string = '';\n \n /** OTP verification state */\n otpDestination: string = '';\n rawStatus: string = '';\n isVerifyingOtp: boolean = false;\n\n private destroy$ = new Subject<void>();\n private pollingSubscription?: Subscription;\n private pollingAttempts = 0;\n\n constructor(\n private paymentService: LokotroPaymentService,\n public localization: LokotroLocalizationService,\n private httpClient: LokotroHttpClientService\n ) {}\n\n ngOnInit(): void {\n this.initializeService();\n \n if (this.statusConfig?.autoStart !== false) {\n this.startStatusCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.stopPolling();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Initialize the service with configuration\n */\n private initializeService(): void {\n if (this.statusConfig?.config) {\n this.httpClient.setAppKey(this.statusConfig.config.token);\n \n // Initialize environment\n LokotroPayEnv.initialize(\n this.statusConfig.config.isProduction || false,\n this.statusConfig.config.customApiUrl\n );\n }\n\n if (this.statusConfig?.language) {\n this.localization.setLanguage(this.statusConfig.language);\n }\n }\n\n /**\n * Start checking payment status\n */\n startStatusCheck(): void {\n this.currentScreen = 'loading';\n this.pollingAttempts = 0;\n this.errorMessage = '';\n\n // Initial check\n this.checkPaymentStatus();\n\n // Start polling\n const pollingInterval = this.statusConfig?.pollingInterval || 5000;\n const maxAttempts = this.statusConfig?.maxPollingAttempts || 60;\n\n this.pollingSubscription = interval(pollingInterval)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.pollingAttempts >= maxAttempts) {\n this.handleMaxAttemptsReached();\n return;\n }\n\n // Only poll if still in pending/processing state\n if (this.currentScreen === 'pending' || this.currentScreen === 'processing') {\n this.checkPaymentStatus();\n }\n });\n }\n\n /**\n * Stop polling\n */\n stopPolling(): void {\n if (this.pollingSubscription) {\n this.pollingSubscription.unsubscribe();\n this.pollingSubscription = undefined;\n }\n }\n\n /**\n * Check payment status via API\n */\n private checkPaymentStatus(): void {\n this.pollingAttempts++;\n\n const endpoint = `${LokotroPayEnv.endpoints.transaction}/${this.statusConfig.paymentId}`;\n\n this.httpClient.get<WrappedApiResponse<PaymentStatusApiResponse>>(endpoint)\n .pipe(\n catchError(error => {\n console.error('[Lokotro Payment Status] Error checking status:', error);\n // Sanitize error message - don't expose technical details\n this.errorMessage = this.getSanitizedErrorMessage(error);\n this.currentScreen = 'error';\n throw error;\n })\n )\n .subscribe(response => {\n // DEBUG: Always log for troubleshooting\n console.log('[DEBUG] ====== RAW HTTP RESPONSE ======');\n console.log('[DEBUG] response:', response);\n console.log('[DEBUG] response.data:', response.data);\n console.log('[DEBUG] response.data type:', typeof response.data);\n console.log('[DEBUG] response.data keys:', response.data ? Object.keys(response.data) : 'null');\n \n if (response.isSuccess && response.data) {\n // Unwrap the nested API response structure\n // API returns: { status_code, message, data: { ...actual transaction details } }\n const apiResponse = response.data as WrappedApiResponse<PaymentStatusApiResponse>;\n \n console.log('[DEBUG] apiResponse:', apiResponse);\n console.log('[DEBUG] apiResponse.data:', apiResponse.data);\n console.log('[DEBUG] apiResponse.status_code:', apiResponse.status_code);\n \n const transactionData = apiResponse.data || response.data as unknown as PaymentStatusApiResponse;\n \n console.log('[DEBUG] ====== TRANSACTION DATA ======');\n console.log('[DEBUG] transactionData:', transactionData);\n console.log('[DEBUG] transactionData.status:', transactionData.status);\n console.log('[DEBUG] transactionData.amount:', transactionData.amount);\n console.log('[DEBUG] transactionData.transactional_amount:', transactionData.transactional_amount);\n \n this.handleStatusResponse(transactionData);\n } else {\n // Sanitize error message from response\n this.errorMessage = this.getSanitizedErrorMessage(response);\n this.currentScreen = 'error';\n }\n });\n }\n\n /**\n * Sanitize error message to not expose sensitive information\n * like URLs, internal codes, or technical details\n */\n private getSanitizedErrorMessage(error: unknown): string {\n // Default user-friendly message based on language\n const defaultMessage = this.localization.translate('paymentFailedMessage');\n\n if (!error) {\n return defaultMessage;\n }\n\n // Cast to access error properties safely\n const errorObj = error as any;\n \n // 1. Extract Status Code safely\n let statusCode = 0;\n if (errorObj.status !== undefined && errorObj.status !== null) {\n const parsed = parseInt(errorObj.status, 10);\n if (!isNaN(parsed)) {\n statusCode = parsed;\n }\n }\n \n // 2. Extract Raw Message from multiple possible locations\n let rawMessage = '';\n \n // Try error.error.message (API error body)\n if (errorObj.error && typeof errorObj.error === 'object' && errorObj.error.message) {\n rawMessage = errorObj.error.message;\n } \n // Try error.message (Http failure response...)\n else if (errorObj.message) {\n rawMessage = errorObj.message;\n }\n // Try error.statusText\n else if (errorObj.statusText) {\n rawMessage = errorObj.statusText;\n }\n\n // 3. Check for specific conditions\n \n // Network / Unknown Error (status 0 or specific text)\n if (statusCode === 0 || \n rawMessage.includes('Unknown Error') || \n rawMessage.includes('NetworkError') ||\n rawMessage.includes('Failed to fetch') ||\n rawMessage.includes('net::')) {\n return this.localization.translate('networkError');\n }\n\n // Timeout\n if (statusCode === 408 || \n rawMessage.toLowerCase().includes('timeout')) {\n return this.localization.translate('timeoutError');\n }\n\n // Server Error (5xx)\n if (statusCode >= 500 && statusCode < 600) {\n return this.localization.translate('serverError');\n }\n\n // Not Found (404)\n if (statusCode === 404) {\n return this.localization.translate('paymentNotFound');\n }\n\n // Auth (401/403)\n if (statusCode === 401 || statusCode === 403) {\n return this.localization.translate('authenticationError');\n }\n\n // Bad Request (400)\n if (statusCode === 400) {\n return this.localization.translate('invalidRequest');\n }\n\n // 4. Final Sanitization Check\n // If the message looks technical (contains URL, \"Http failure\", etc), return default\n if (rawMessage.includes('http://') || \n rawMessage.includes('https://') || \n rawMessage.includes('localhost') || \n rawMessage.includes('api/') ||\n rawMessage.includes('Error:') ||\n rawMessage.includes('Http failure') ||\n rawMessage.includes('failure response')) {\n return defaultMessage;\n }\n\n // If message is short and clean, return it\n if (rawMessage && rawMessage.length < 100) {\n return rawMessage;\n }\n\n // Default fallback\n return defaultMessage;\n }\n\n /**\n * Handle status response from API\n */\n private handleStatusResponse(data: PaymentStatusApiResponse): void {\n if (!data) return;\n\n if (LokotroPayEnv.debugMode) {\n console.log('[Lokotro Payment Status] Raw response data:', data);\n }\n\n // Store raw status for OTP detection\n const statusStr = data.status || '';\n this.rawStatus = statusStr.toLowerCase();\n \n // Map status string to enum\n const status = LokotroPaymentStatusInfo.fromString(statusStr);\n\n // Resolve amount (try multiple fields)\n let amount: number | undefined;\n if (data.amount !== undefined && data.amount !== null) {\n amount = typeof data.amount === 'string' ? parseFloat(data.amount) : data.amount;\n } else if (data.transactional_amount !== undefined && data.transactional_amount !== null) {\n amount = typeof data.transactional_amount === 'string' ? parseFloat(data.transactional_amount) : data.transactional_amount;\n }\n\n // Resolve currency\n const currency = data.currency_str || data.transactional_currency || data.currency;\n\n // Resolve payment ID\n const paymentId = data.identifier || data.payment_id || data.transaction_id || this.statusConfig.paymentId;\n \n // Get OTP destination if available\n if (data.otp_sent_to) {\n this.otpDestination = data.otp_sent_to;\n } else if (data.customer_email) {\n this.otpDestination = data.customer_email;\n }\n\n console.log('[DEBUG] Mapping response. Redirects:', {\n rawSuccess: data.success_redirect_url,\n rawFail: data.fail_redirect_url,\n rawNotify: data.notify_url\n });\n\n const statusResponse: LokotroPaymentStatusResponse = {\n code: 0,\n message: data.message || '',\n paymentId: paymentId,\n transactionId: data.identifier || data.transaction_id,\n status: status,\n amount: amount,\n currency: currency,\n merchantReference: data.merchant_reference,\n customerReference: data.customer_reference,\n completedAt: data.completed_at,\n createdAt: data.created_at,\n metadata: data.metadata,\n // Redirect URLs\n successRedirectUrl: data.success_redirect_url,\n failRedirectUrl: data.fail_redirect_url,\n notifyUrl: data.notify_url\n };\n\n console.log('[DEBUG] Mapped statusResponse:', statusResponse);\n\n this.paymentDetails = statusResponse;\n this.statusChange.emit(statusResponse);\n\n // Check for OTP verification status FIRST (before generic pending handling)\n if (this.rawStatus === 'pending_otp' || this.rawStatus === 'pending_otp_verification') {\n console.log('[Lokotro Payment Status] OTP verification required, showing OTP screen');\n this.currentScreen = 'otp';\n this.stopPolling(); // Stop polling while user enters OTP\n return;\n }\n\n switch (statusResponse.status) {\n case LokotroPaymentStatus.Pending:\n this.currentScreen = 'pending';\n break;\n\n case LokotroPaymentStatus.Processing:\n this.currentScreen = 'processing';\n break;\n\n case LokotroPaymentStatus.PendingBankProofUpload:\n // Bank transfer pending proof upload - show pending screen\n this.currentScreen = 'pending';\n break;\n\n case LokotroPaymentStatus.Approved:\n // Emit event and let parent handle screen transition\n // Keep showing processing until parent navigates\n this.currentScreen = 'processing';\n this.paymentComplete.emit(statusResponse);\n this.stopPolling();\n break;\n\n case LokotroPaymentStatus.Failed:\n case LokotroPaymentStatus.Declined:\n // Emit event and let parent handle screen transition\n this.errorMessage = statusResponse.message;\n this.paymentFailed.emit(statusResponse);\n this.stopPolling();\n break;\n\n case LokotroPaymentStatus.Cancelled:\n this.paymentFailed.emit(statusResponse);\n this.stopPolling();\n break;\n\n case LokotroPaymentStatus.Expired:\n this.paymentFailed.emit(statusResponse);\n this.stopPolling();\n break;\n\n default:\n // Unknown status, keep polling\n if (this.currentScreen === 'loading') {\n this.currentScreen = 'pending';\n }\n break;\n }\n }\n\n /**\n * Handle max polling attempts reached\n */\n private handleMaxAttemptsReached(): void {\n this.stopPolling();\n this.currentScreen = 'expired';\n \n const expiredResponse: LokotroPaymentStatusResponse = {\n code: -1,\n message: 'Payment status check timed out',\n paymentId: this.statusConfig.paymentId,\n status: LokotroPaymentStatus.Expired\n };\n \n this.paymentFailed.emit(expiredResponse);\n }\n\n /**\n * Retry checking status\n */\n retryCheck(): void {\n this.stopPolling();\n this.startStatusCheck();\n }\n\n /**\n * Handle done button click\n */\n onDone(): void {\n if (this.paymentDetails) {\n this.onDoneEvent.emit(this.paymentDetails);\n }\n this.onClose.emit();\n }\n\n /**\n * Handle OTP verification\n */\n onOtpVerified(otp: string): void {\n console.log('[Lokotro Payment Status] Verifying OTP:', otp);\n this.isVerifyingOtp = true;\n this.currentScreen = 'processing';\n\n const verifyPayload = {\n payment_id: this.statusConfig.paymentId,\n otp_code: otp\n };\n\n this.httpClient.post<WrappedApiResponse<OtpVerifyApiResponse>>(\n LokotroPayEnv.endpoints.verifyOtp,\n verifyPayload\n ).subscribe({\n next: (response) => {\n console.log('[Lokotro Payment Status] OTP verify response:', response);\n this.isVerifyingOtp = false;\n\n if (response.isSuccess && response.data) {\n const apiResponse = response.data as WrappedApiResponse<OtpVerifyApiResponse>;\n const verifyData = apiResponse.data || response.data as unknown as OtpVerifyApiResponse;\n \n const verifyStatus = (verifyData.status || '').toLowerCase();\n \n if (verifyStatus === 'completed' || verifyStatus === 'approved' || verifyStatus === 'success') {\n // Payment successful - emit event and let parent handle screen transition\n // Keep showing processing screen until parent navigates away\n if (this.paymentDetails) {\n this.paymentDetails.status = LokotroPaymentStatus.Approved;\n this.paymentComplete.emit(this.paymentDetails);\n }\n // Don't set currentScreen = 'success' - let parent handle\n } else if (verifyStatus === 'failed' || verifyStatus === 'declined') {\n // OTP verification failed - emit event and let parent handle\n this.errorMessage = verifyData.message || this.localization.translate('otpVerificationFailed');\n if (this.paymentDetails) {\n this.paymentDetails.status = LokotroPaymentStatus.Failed;\n this.paymentFailed.emit(this.paymentDetails);\n }\n // Don't set currentScreen = 'error' - let parent handle\n } else {\n // Still processing, restart polling\n this.startStatusCheck();\n }\n } else {\n this.errorMessage = this.getSanitizedErrorMessage(response);\n if (this.paymentDetails) {\n this.paymentDetails.status = LokotroPaymentStatus.Failed;\n this.paymentFailed.emit(this.paymentDetails);\n }\n }\n },\n error: (error) => {\n console.error('[Lokotro Payment Status] OTP verify error:', error);\n this.isVerifyingOtp = false;\n this.errorMessage = this.getSanitizedErrorMessage(error);\n if (this.paymentDetails) {\n this.paymentDetails.status = LokotroPaymentStatus.Failed;\n this.paymentFailed.emit(this.paymentDetails);\n }\n }\n });\n }\n\n /**\n * Handle OTP resend\n */\n onResendOtp(): void {\n console.log('[Lokotro Payment Status] Resending OTP');\n \n const resendPayload = {\n payment_id: this.statusConfig.paymentId\n };\n\n this.httpClient.post<WrappedApiResponse<OtpResendApiResponse>>(\n LokotroPayEnv.endpoints.resendOtp,\n resendPayload\n ).subscribe({\n next: (response) => {\n console.log('[Lokotro Payment Status] OTP resend response:', response);\n if (response.isSuccess && response.data) {\n const apiResponse = response.data as WrappedApiResponse<OtpResendApiResponse>;\n const resendData = apiResponse.data || response.data as unknown as OtpResendApiResponse;\n if (resendData.otp_sent_to) {\n this.otpDestination = resendData.otp_sent_to;\n }\n }\n },\n error: (error) => {\n console.error('[Lokotro Payment Status] OTP resend error:', error);\n }\n });\n }\n\n /**\n * Handle OTP cancellation\n */\n onOtpCancel(): void {\n console.log('[Lokotro Payment Status] OTP cancelled');\n this.onClose.emit();\n }\n}\n\n/**\n * Wrapped API response structure from Lokotro Gateway\n * The gateway wraps all responses in: { status_code, message, data: {...} }\n */\ninterface WrappedApiResponse<T> {\n status_code?: number;\n message?: string;\n data?: T;\n}\n\n/**\n * OTP verify API response\n */\ninterface OtpVerifyApiResponse {\n status?: string;\n message?: string;\n transaction_id?: string;\n}\n\n/**\n * OTP resend API response\n */\ninterface OtpResendApiResponse {\n message?: string;\n otp_sent_to?: string;\n}\n\n/**\n * API Response interface for payment status\n */\ninterface PaymentStatusApiResponse {\n identifier?: string;\n payment_id?: string;\n transaction_id?: string;\n status?: string;\n amount?: number | string;\n transactional_amount?: number | string;\n currency_str?: string;\n transactional_currency?: string;\n currency?: string;\n merchant_reference?: string;\n customer_reference?: string;\n completed_at?: string;\n created_at?: string;\n message?: string;\n metadata?: Record<string, unknown>;\n otp_sent_to?: string;\n customer_email?: string;\n // Redirect URLs\n success_redirect_url?: string;\n fail_redirect_url?: string;\n notify_url?: string;\n}\n","/*\n * Public API Surface of lokotro-pay\n * @lokotro/pay - Angular Payment SDK\n */\n\n// Module\nexport { LokotroPayModule, LOKOTRO_PAY_CONFIG, LOKOTRO_ENV_CONFIG } from './lib/lokotro-pay.module';\n\n// Models\nexport {\n LokotroPayConfig,\n LokotroPaymentBody,\n LokotroPayResponse,\n LokotroPayError,\n LokotroPaymentInfo,\n LokotroPaymentMethod,\n LokotroPaymentMethodListItem,\n LokotroPaymentFormData,\n LokotroPayOnResponse,\n LokotroPayOnError,\n LokotroHttpResponse,\n LokotroTransactionDetails,\n LokotroPaymentSubmitRequest,\n LokotroPaymentSubmitResponse,\n LokotroOtpVerifyRequest,\n LokotroOtpVerifyResponse,\n LokotroPayThemeConfig,\n LokotroCheckoutConfig,\n LokotroMerchantInfo,\n LokotroCountry,\n LokotroRefCountry,\n LokotroCountryCode,\n LokotroPhonePrefix,\n LokotroCountryUtils,\n} from './lib/models';\n\n// Enums\nexport {\n LokotroPayChannel,\n LokotroPayChannelInfo,\n LokotroPayFillingInfo,\n LokotroPayScreenNavigation,\n LokotroPayScreenNavigationInfo,\n LokotroPayResultScreen,\n LokotroPaymentStatus,\n LokotroPayApiResponseCode,\n LokotroPayApiResponseCodeInfo,\n LokotroPayLanguage,\n LokotroPayLanguageInfo,\n} from './lib/enums';\n\n// Constants\nexport { LokotroPayColors } from './lib/constants/colors';\nexport { LokotroPayEnv } from './lib/constants/environment';\n\n// Services\nexport { LokotroHttpClientService } from './lib/services/lokotro-http-client.service';\nexport { LokotroPaymentService } from './lib/services/lokotro-payment.service';\nexport { LokotroLocalizationService } from './lib/services/lokotro-localization.service';\nexport { LokotroCountryService } from './lib/services/lokotro-country.service';\n\n// Components\nexport { LokotroPayCheckoutComponent } from './lib/components/checkout/checkout.component';\nexport { LokotroPaymentMethodSelectionComponent } from './lib/components/payment-method-selection/payment-method-selection.component';\nexport { LokotroPaymentFormComponent } from './lib/components/payment-form/payment-form.component';\nexport { LokotroMobileMoneyPhoneInputComponent } from './lib/components/mobile-money-phone-input/mobile-money-phone-input.component';\nexport { LokotroOtpVerificationComponent } from './lib/components/otp-verification/otp-verification.component';\nexport { LokotroProcessingComponent } from './lib/components/processing/processing.component';\nexport { LokotroResultComponent } from './lib/components/result/result.component';\nexport { LokotroLoadingComponent } from './lib/components/loading/loading.component';\nexport { LokotroBankTransferFormComponent } from './lib/components/bank-transfer-form/bank-transfer-form.component';\n\n// Payment Status Component (Entry point for tracking payment status by ID only)\nexport {\n LokotroPaymentStatusComponent,\n LokotroPaymentStatusConfig,\n LokotroPaymentStatusResponse\n} from './lib/components/payment-status/payment-status.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.LokotroLocalizationService","i1.LokotroHttpClientService","i1.LokotroCountryService","i2.LokotroLocalizationService","i3","i1","i3.LokotroPaymentService","i4","i1.LokotroPaymentService","i3.LokotroHttpClientService"],"mappings":"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"}
|