spaark-payapi-sdk 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/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/index.d.mts +505 -0
- package/dist/index.d.ts +505 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react-pjDvSSJA.d.mts +164 -0
- package/dist/react-pjDvSSJA.d.ts +164 -0
- package/dist/react.d.mts +2 -0
- package/dist/react.d.ts +2 -0
- package/dist/react.js +7 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +7 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/config.ts","../src/constants/errors.ts","../src/core/errors.ts","../src/config.ts","../src/core/retry.ts","../src/core/http-client.ts","../src/core/logger.ts","../src/constants/correspondents.ts","../src/modules/transactions.ts","../src/modules/products.ts","../src/modules/webhooks.ts","../src/modules/utils.ts","../src/modules/finances.ts","../src/sdk.ts","../src/react.tsx"],"names":["DEFAULT_CONFIG","ERROR_CODES","ERROR_MAPPINGS","getErrorMapping","pawapayCode","m","PawapayError","_PawapayError","message","code","statusCode","options","originalError","mapping","configSchema","z","resolveConfig","config","result","errors","e","validated","baseUrl","getConfigFromEnv","env","envValue","timeout","retries","level","DEFAULT_RETRY_CONFIG","sleep","ms","resolve","calculateDelay","attempt","delay","jitter","withRetry","operation","logger","resolvedConfig","lastError","error","isNetworkError","msg","HttpClient","_HttpClient","axios","response","status","data","errorData","url","LOG_LEVELS","Logger","prefix","item","sanitized","sensitiveKeys","key","value","sk","formatted","CORRESPONDENTS","CORRESPONDENT_INFO","DEFAULT_LIMITS","depositRequestSchema","payoutRequestSchema","paymentPageRequestSchema","refundRequestSchema","TransactionsModule","httpClient","request","pawapayRequest","depositId","payoutId","transactionId","err","interval","maxAttempts","onStatusChange","lastStatus","filters","params","deposit","payout","productCreateSchema","domainAddSchema","ProductsModule","id","now","product","productId","p","updates","updatedProduct","domain","domainIndex","stored","WebhooksModule","secret","payload","signature","expectedSignature","createHmac","signatureBuffer","expectedBuffer","timingSafeEqual","event","eventType","UtilsModule","uuidv4","uuidValidate","uuidVersion","phoneNumber","correspondent","country","provider","currency","defaults","availability","depositStatus","op","payoutStatus","isOperational","isDelayed","isClosed","phone","countryCode","cleaned","info","statementRequestSchema","FinancesModule","statementId","SpaarkPayApiSdk","mergedConfig","createMockDepositResponse","txId","createMockPayoutResponse","createMockStatusResponse","createMockAvailabilityResponse","createMockPredictResponse","createMockActiveConfigResponse","createMockWalletBalancesResponse","createMockPublicKeysResponse","simulateDelay","generateUUID","c","r","PROVIDER_OPTIONS","CURRENCY_OPTIONS","PawapayTestDashboard","initialApiKey","initialEnvironment","className","initialDemoMode","apiBasePath","onDepositComplete","onPayoutComplete","onError","apiKey","setApiKey","useState","environment","setEnvironment","isConfigured","setIsConfigured","isDemoMode","setIsDemoMode","activeTab","setActiveTab","setPhoneNumber","amount","setAmount","setCurrency","setProvider","description","setDescription","setTransactionId","results","setResults","currentStatus","setCurrentStatus","addResult","useCallback","prev","handleConfigure","handleDemoMode","handleDeposit","res","handlePayout","handleCheckStatus","handleGetAvailability","handlePredictProvider","handleGetActiveConfig","handleGetPublicKeys","handleGetWalletBalances","copyToClipboard","text","jsxs","jsx","SettingsIcon","WalletIcon","PhoneIcon","RefreshIcon","ToolkitIcon","ChartIcon","LoaderIcon","PlayIcon","CopyIcon","SearchIcon","SignalIcon","KeyIcon","CheckIcon","XIcon","BeakerIcon"],"mappings":"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","file":"index.mjs","sourcesContent":["export type Environment = 'sandbox' | 'production';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nexport interface SpaarkPayApiSdkConfig {\n apiKey: string;\n environment: Environment;\n baseUrl?: string;\n callbackUrl?: string;\n timeout?: number;\n retries?: number;\n retryDelay?: number;\n logLevel?: LogLevel;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n environment: Environment;\n baseUrl: string;\n callbackUrl?: string;\n timeout: number;\n retries: number;\n retryDelay: number;\n logLevel: LogLevel;\n}\n\nexport const DEFAULT_CONFIG = {\n timeout: 30000,\n retries: 3,\n retryDelay: 1000,\n logLevel: 'info' as LogLevel,\n sandboxUrl: 'https://api.sandbox.pawapay.io',\n productionUrl: 'https://api.pawapay.io',\n} as const;\n","export const ERROR_CODES = {\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INVALID_PHONE: 'INVALID_PHONE',\n INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',\n AMOUNT_TOO_LOW: 'AMOUNT_TOO_LOW',\n AMOUNT_TOO_HIGH: 'AMOUNT_TOO_HIGH',\n LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',\n DUPLICATE: 'DUPLICATE',\n MMO_UNAVAILABLE: 'MMO_UNAVAILABLE',\n TIMEOUT: 'TIMEOUT',\n UNAUTHORIZED: 'UNAUTHORIZED',\n RATE_LIMITED: 'RATE_LIMITED',\n SERVER_ERROR: 'SERVER_ERROR',\n NETWORK_ERROR: 'NETWORK_ERROR',\n NOT_FOUND: 'NOT_FOUND',\n REFUND_NOT_ALLOWED: 'REFUND_NOT_ALLOWED',\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport interface ErrorMapping {\n pawapayCode: string;\n sdkCode: ErrorCode;\n httpStatus: number;\n retryable: boolean;\n message: string;\n}\n\nexport const ERROR_MAPPINGS: ErrorMapping[] = [\n {\n pawapayCode: 'INVALID_PHONE_NUMBER',\n sdkCode: ERROR_CODES.INVALID_PHONE,\n httpStatus: 400,\n retryable: false,\n message: 'Invalid phone number format',\n },\n {\n pawapayCode: 'INSUFFICIENT_FUNDS',\n sdkCode: ERROR_CODES.INSUFFICIENT_FUNDS,\n httpStatus: 402,\n retryable: false,\n message: 'Insufficient funds in account',\n },\n {\n pawapayCode: 'AMOUNT_TOO_LOW',\n sdkCode: ERROR_CODES.AMOUNT_TOO_LOW,\n httpStatus: 400,\n retryable: false,\n message: 'Amount below minimum',\n },\n {\n pawapayCode: 'AMOUNT_TOO_HIGH',\n sdkCode: ERROR_CODES.AMOUNT_TOO_HIGH,\n httpStatus: 400,\n retryable: false,\n message: 'Amount exceeds maximum',\n },\n {\n pawapayCode: 'TRANSACTION_LIMIT_EXCEEDED',\n sdkCode: ERROR_CODES.LIMIT_EXCEEDED,\n httpStatus: 400,\n retryable: false,\n message: 'Daily or monthly limit exceeded',\n },\n {\n pawapayCode: 'DUPLICATE_TRANSACTION',\n sdkCode: ERROR_CODES.DUPLICATE,\n httpStatus: 409,\n retryable: false,\n message: 'Transaction ID already used',\n },\n {\n pawapayCode: 'CORRESPONDENT_UNAVAILABLE',\n sdkCode: ERROR_CODES.MMO_UNAVAILABLE,\n httpStatus: 503,\n retryable: true,\n message: 'Mobile Money operator temporarily unavailable',\n },\n {\n pawapayCode: 'CORRESPONDENT_TEMPORARILY_UNAVAILABLE',\n sdkCode: ERROR_CODES.MMO_UNAVAILABLE,\n httpStatus: 503,\n retryable: true,\n message: 'Mobile Money operator temporarily unavailable',\n },\n {\n pawapayCode: 'TIMEOUT',\n sdkCode: ERROR_CODES.TIMEOUT,\n httpStatus: 408,\n retryable: true,\n message: 'Transaction timed out',\n },\n {\n pawapayCode: 'INVALID_API_KEY',\n sdkCode: ERROR_CODES.UNAUTHORIZED,\n httpStatus: 401,\n retryable: false,\n message: 'Invalid or expired API key',\n },\n {\n pawapayCode: 'RATE_LIMIT_EXCEEDED',\n sdkCode: ERROR_CODES.RATE_LIMITED,\n httpStatus: 429,\n retryable: true,\n message: 'Too many requests',\n },\n {\n pawapayCode: 'INTERNAL_ERROR',\n sdkCode: ERROR_CODES.SERVER_ERROR,\n httpStatus: 500,\n retryable: true,\n message: 'Pawapay internal error',\n },\n {\n pawapayCode: 'REFUND_NOT_ALLOWED',\n sdkCode: ERROR_CODES.REFUND_NOT_ALLOWED,\n httpStatus: 400,\n retryable: false,\n message: 'Refund not allowed for this transaction',\n },\n];\n\nexport function getErrorMapping(pawapayCode: string): ErrorMapping | undefined {\n return ERROR_MAPPINGS.find((m) => m.pawapayCode === pawapayCode);\n}\n","import type { FailureReason } from '../types/transactions';\nimport { ERROR_CODES, type ErrorCode, getErrorMapping } from '../constants/errors';\n\nexport class PawapayError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly failureReason?: FailureReason;\n readonly retryable: boolean;\n readonly originalError?: Error;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number,\n options?: {\n failureReason?: FailureReason;\n retryable?: boolean;\n originalError?: Error;\n }\n ) {\n super(message);\n this.name = 'PawapayError';\n this.code = code;\n this.statusCode = statusCode;\n this.failureReason = options?.failureReason;\n this.retryable = options?.retryable ?? false;\n this.originalError = options?.originalError;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, PawapayError);\n }\n }\n\n static fromPawapayResponse(\n pawapayCode: string,\n message?: string,\n originalError?: Error\n ): PawapayError {\n const mapping = getErrorMapping(pawapayCode);\n\n if (mapping) {\n return new PawapayError(\n message ?? mapping.message,\n mapping.sdkCode,\n mapping.httpStatus,\n {\n retryable: mapping.retryable,\n originalError,\n }\n );\n }\n\n return new PawapayError(\n message ?? 'Unknown error occurred',\n ERROR_CODES.SERVER_ERROR,\n 500,\n {\n retryable: false,\n originalError,\n }\n );\n }\n\n static validation(message: string): PawapayError {\n return new PawapayError(message, ERROR_CODES.VALIDATION_ERROR, 400, {\n retryable: false,\n });\n }\n\n static network(message: string, originalError?: Error): PawapayError {\n return new PawapayError(message, ERROR_CODES.NETWORK_ERROR, 0, {\n retryable: true,\n originalError,\n });\n }\n\n static timeout(message: string = 'Request timed out'): PawapayError {\n return new PawapayError(message, ERROR_CODES.TIMEOUT, 408, {\n retryable: true,\n });\n }\n\n static unauthorized(message: string = 'Invalid or expired API key'): PawapayError {\n return new PawapayError(message, ERROR_CODES.UNAUTHORIZED, 401, {\n retryable: false,\n });\n }\n\n static notFound(message: string = 'Resource not found'): PawapayError {\n return new PawapayError(message, ERROR_CODES.NOT_FOUND, 404, {\n retryable: false,\n });\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n failureReason: this.failureReason,\n retryable: this.retryable,\n };\n }\n}\n","import { z } from 'zod';\nimport type { SpaarkPayApiSdkConfig, ResolvedConfig, LogLevel } from './types/config';\nimport { DEFAULT_CONFIG } from './types/config';\nimport { PawapayError } from './core/errors';\n\nconst configSchema = z.object({\n apiKey: z.string().min(1, 'API key is required'),\n environment: z.enum(['sandbox', 'production']),\n baseUrl: z.string().url().optional(),\n callbackUrl: z.string().url().optional(),\n timeout: z.number().positive().max(600000).optional(),\n retries: z.number().int().min(0).max(10).optional(),\n retryDelay: z.number().positive().max(60000).optional(),\n logLevel: z.enum(['debug', 'info', 'warn', 'error', 'none']).optional(),\n});\n\nexport function resolveConfig(config: SpaarkPayApiSdkConfig): ResolvedConfig {\n const result = configSchema.safeParse(config);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`);\n throw PawapayError.validation(`Invalid SDK configuration: ${errors.join(', ')}`);\n }\n\n const validated = result.data;\n\n const baseUrl =\n validated.baseUrl ??\n (validated.environment === 'production'\n ? DEFAULT_CONFIG.productionUrl\n : DEFAULT_CONFIG.sandboxUrl);\n\n return {\n apiKey: validated.apiKey,\n environment: validated.environment,\n baseUrl,\n callbackUrl: validated.callbackUrl,\n timeout: validated.timeout ?? DEFAULT_CONFIG.timeout,\n retries: validated.retries ?? DEFAULT_CONFIG.retries,\n retryDelay: validated.retryDelay ?? DEFAULT_CONFIG.retryDelay,\n logLevel: validated.logLevel ?? DEFAULT_CONFIG.logLevel,\n };\n}\n\nexport function getConfigFromEnv(): Partial<SpaarkPayApiSdkConfig> {\n const env = typeof process !== 'undefined' ? process.env : {};\n\n const config: Partial<SpaarkPayApiSdkConfig> = {};\n\n if (env['PAWAPAY_API_KEY']) {\n config.apiKey = env['PAWAPAY_API_KEY'];\n }\n\n if (env['PAWAPAY_ENVIRONMENT']) {\n const envValue = env['PAWAPAY_ENVIRONMENT'].toLowerCase();\n if (envValue === 'production' || envValue === 'sandbox') {\n config.environment = envValue;\n }\n }\n\n if (env['PAWAPAY_BASE_URL']) {\n config.baseUrl = env['PAWAPAY_BASE_URL'];\n }\n\n if (env['PAWAPAY_CALLBACK_URL']) {\n config.callbackUrl = env['PAWAPAY_CALLBACK_URL'];\n }\n\n if (env['PAWAPAY_TIMEOUT']) {\n const timeout = parseInt(env['PAWAPAY_TIMEOUT'], 10);\n if (!isNaN(timeout)) {\n config.timeout = timeout;\n }\n }\n\n if (env['PAWAPAY_RETRIES']) {\n const retries = parseInt(env['PAWAPAY_RETRIES'], 10);\n if (!isNaN(retries)) {\n config.retries = retries;\n }\n }\n\n if (env['PAWAPAY_LOG_LEVEL']) {\n const level = env['PAWAPAY_LOG_LEVEL'].toLowerCase() as LogLevel;\n if (['debug', 'info', 'warn', 'error', 'none'].includes(level)) {\n config.logLevel = level;\n }\n }\n\n return config;\n}\n","import { Logger } from './logger';\nimport { PawapayError } from './errors';\n\nexport interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay?: number;\n backoffMultiplier?: number;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<RetryConfig> = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction calculateDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = config.initialDelay * Math.pow(config.backoffMultiplier, attempt - 1);\n const jitter = Math.random() * 0.3 * delay;\n return Math.min(delay + jitter, config.maxDelay);\n}\n\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {},\n logger?: Logger\n): Promise<T> {\n const resolvedConfig: Required<RetryConfig> = {\n ...DEFAULT_RETRY_CONFIG,\n ...config,\n };\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= resolvedConfig.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n const isRetryable =\n error instanceof PawapayError\n ? error.retryable\n : isNetworkError(error);\n\n if (!isRetryable || attempt === resolvedConfig.maxAttempts) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, resolvedConfig);\n\n logger?.warn(\n `Attempt ${attempt}/${resolvedConfig.maxAttempts} failed, retrying in ${Math.round(delay)}ms`,\n { error: lastError.message }\n );\n\n await sleep(delay);\n }\n }\n\n throw lastError ?? new Error('Retry failed without error');\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (error instanceof PawapayError) {\n return error.retryable;\n }\n\n if (error instanceof Error) {\n const networkErrorMessages = [\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'Network Error',\n 'timeout',\n 'socket hang up',\n ];\n\n return networkErrorMessages.some(\n (msg) =>\n error.message.includes(msg) ||\n (error as NodeJS.ErrnoException).code === msg\n );\n }\n\n return false;\n}\n","import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport axios from 'axios';\nimport type { ResolvedConfig } from '../types/config';\nimport { PawapayError } from './errors';\nimport { Logger } from './logger';\nimport { withRetry } from './retry';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retries: number;\n retryDelay: number;\n logger: Logger;\n}\n\ninterface PawapayErrorResponse {\n errorId?: string;\n errorCode?: string;\n errorMessage?: string;\n rejectionReason?: {\n rejectionCode?: string;\n rejectionMessage?: string;\n };\n}\n\nexport class HttpClient {\n private readonly client: AxiosInstance;\n private readonly logger: Logger;\n private readonly retries: number;\n private readonly retryDelay: number;\n\n constructor(config: HttpClientConfig) {\n this.logger = config.logger;\n this.retries = config.retries;\n this.retryDelay = config.retryDelay;\n\n this.client = axios.create({\n baseURL: config.baseUrl,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.apiKey}`,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n this.client.interceptors.request.use(\n (config) => {\n this.logger.debug(`${config.method?.toUpperCase()} ${config.url}`, {\n params: config.params,\n });\n return config;\n },\n (error: unknown) => {\n this.logger.error('Request error', error);\n return Promise.reject(error);\n }\n );\n\n this.client.interceptors.response.use(\n (response) => {\n this.logger.debug(\n `${response.config.method?.toUpperCase()} ${response.config.url} -> ${response.status}`,\n { data: response.data }\n );\n return response;\n },\n (error: unknown) => {\n if (axios.isAxiosError(error)) {\n this.logger.error(\n `Request failed: ${error.config?.method?.toUpperCase()} ${error.config?.url}`,\n {\n status: error.response?.status,\n data: error.response?.data,\n }\n );\n }\n return Promise.reject(error);\n }\n );\n }\n\n private handleError(error: unknown): never {\n if (axios.isAxiosError(error)) {\n if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {\n throw PawapayError.timeout();\n }\n\n if (!error.response) {\n throw PawapayError.network(\n error.message || 'Network error',\n error\n );\n }\n\n const { status, data } = error.response;\n const errorData = data as PawapayErrorResponse | undefined;\n\n if (status === 401) {\n throw PawapayError.unauthorized();\n }\n\n if (status === 404) {\n throw PawapayError.notFound();\n }\n\n const pawapayCode =\n errorData?.errorCode ??\n errorData?.rejectionReason?.rejectionCode;\n\n if (pawapayCode) {\n throw PawapayError.fromPawapayResponse(\n pawapayCode,\n errorData?.errorMessage ?? errorData?.rejectionReason?.rejectionMessage,\n error\n );\n }\n\n throw new PawapayError(\n errorData?.errorMessage ?? `HTTP error ${status}`,\n 'SERVER_ERROR',\n status,\n {\n retryable: status >= 500,\n originalError: error,\n }\n );\n }\n\n if (error instanceof PawapayError) {\n throw error;\n }\n\n throw PawapayError.network(\n error instanceof Error ? error.message : 'Unknown error',\n error instanceof Error ? error : undefined\n );\n }\n\n async get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.get(url, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async post<T, D = unknown>(url: string, data?: D, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.post(url, data, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async put<T, D = unknown>(url: string, data?: D, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.put(url, data, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n return withRetry(\n async () => {\n try {\n const response: AxiosResponse<T> = await this.client.delete(url, config);\n return response.data;\n } catch (error) {\n this.handleError(error);\n }\n },\n { maxAttempts: this.retries, initialDelay: this.retryDelay },\n this.logger\n );\n }\n\n static fromConfig(config: ResolvedConfig, logger: Logger): HttpClient {\n return new HttpClient({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n timeout: config.timeout,\n retries: config.retries,\n retryDelay: config.retryDelay,\n logger,\n });\n }\n}\n","import type { LogLevel } from '../types/config';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nexport class Logger {\n private readonly prefix: string;\n private level: LogLevel;\n\n constructor(prefix: string, level: LogLevel = 'info') {\n this.prefix = prefix;\n this.level = level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\n }\n\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `[${timestamp}] ${level.toUpperCase().padEnd(5)} [${this.prefix}] ${message}`;\n }\n\n private sanitize(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (typeof data === 'string') {\n return data;\n }\n\n if (typeof data !== 'object') {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((item) => this.sanitize(item));\n }\n\n const sanitized: Record<string, unknown> = {};\n const sensitiveKeys = ['apiKey', 'api_key', 'authorization', 'password', 'secret', 'token'];\n\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (sensitiveKeys.some((sk) => key.toLowerCase().includes(sk))) {\n sanitized[key] = '[REDACTED]';\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitize(value);\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n }\n\n debug(message: string, data?: unknown): void {\n if (this.shouldLog('debug')) {\n const formatted = this.formatMessage('debug', message);\n if (data !== undefined) {\n console.debug(formatted, this.sanitize(data));\n } else {\n console.debug(formatted);\n }\n }\n }\n\n info(message: string, data?: unknown): void {\n if (this.shouldLog('info')) {\n const formatted = this.formatMessage('info', message);\n if (data !== undefined) {\n console.info(formatted, this.sanitize(data));\n } else {\n console.info(formatted);\n }\n }\n }\n\n warn(message: string, data?: unknown): void {\n if (this.shouldLog('warn')) {\n const formatted = this.formatMessage('warn', message);\n if (data !== undefined) {\n console.warn(formatted, this.sanitize(data));\n } else {\n console.warn(formatted);\n }\n }\n }\n\n error(message: string, error?: Error | unknown): void {\n if (this.shouldLog('error')) {\n const formatted = this.formatMessage('error', message);\n if (error !== undefined) {\n console.error(formatted, this.sanitize(error));\n } else {\n console.error(formatted);\n }\n }\n }\n}\n","export type Correspondent =\n | 'MTN_MOMO_CMR'\n | 'ORANGE_CMR'\n | 'MTN_MOMO_COG'\n | 'AIRTEL_COG'\n | 'MTN_MOMO_GAB'\n | 'AIRTEL_GAB';\n\nexport const CORRESPONDENTS = [\n 'MTN_MOMO_CMR',\n 'ORANGE_CMR',\n 'MTN_MOMO_COG',\n 'AIRTEL_COG',\n 'MTN_MOMO_GAB',\n 'AIRTEL_GAB',\n] as const;\n\nexport type CorrespondentFeature = 'deposit' | 'payout' | 'refund';\n\nexport interface CorrespondentInfo {\n correspondent: Correspondent;\n name: string;\n country: string;\n countryCode: string;\n currency: string;\n features: CorrespondentFeature[];\n phoneRegex: RegExp;\n}\n\nexport const CORRESPONDENT_INFO: Record<Correspondent, CorrespondentInfo> = {\n MTN_MOMO_CMR: {\n correspondent: 'MTN_MOMO_CMR',\n name: 'MTN Mobile Money',\n country: 'Cameroon',\n countryCode: 'CMR',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^237(67|68|65[0-4])\\d{6}$/,\n },\n ORANGE_CMR: {\n correspondent: 'ORANGE_CMR',\n name: 'Orange Money',\n country: 'Cameroon',\n countryCode: 'CMR',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^237(69|65[5-9])\\d{6}$/,\n },\n MTN_MOMO_COG: {\n correspondent: 'MTN_MOMO_COG',\n name: 'MTN Mobile Money',\n country: 'Congo',\n countryCode: 'COG',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^242(04|05|06)\\d{7}$/,\n },\n AIRTEL_COG: {\n correspondent: 'AIRTEL_COG',\n name: 'Airtel Money',\n country: 'Congo',\n countryCode: 'COG',\n currency: 'XAF',\n features: ['deposit', 'payout'],\n phoneRegex: /^242(01|02|03)\\d{7}$/,\n },\n MTN_MOMO_GAB: {\n correspondent: 'MTN_MOMO_GAB',\n name: 'MTN Mobile Money',\n country: 'Gabon',\n countryCode: 'GAB',\n currency: 'XAF',\n features: ['deposit', 'payout', 'refund'],\n phoneRegex: /^241(06|07)\\d{6}$/,\n },\n AIRTEL_GAB: {\n correspondent: 'AIRTEL_GAB',\n name: 'Airtel Money',\n country: 'Gabon',\n countryCode: 'GAB',\n currency: 'XAF',\n features: ['deposit', 'payout'],\n phoneRegex: /^241(04|05)\\d{6}$/,\n },\n};\n\nexport interface TransactionLimits {\n minDeposit: number;\n maxDeposit: number;\n minPayout: number;\n maxPayout: number;\n currency: string;\n dailyLimit?: number;\n monthlyLimit?: number;\n}\n\nexport const DEFAULT_LIMITS: Record<Correspondent, TransactionLimits> = {\n MTN_MOMO_CMR: {\n minDeposit: 100,\n maxDeposit: 1_000_000,\n minPayout: 500,\n maxPayout: 500_000,\n currency: 'XAF',\n dailyLimit: 2_000_000,\n },\n ORANGE_CMR: {\n minDeposit: 100,\n maxDeposit: 1_000_000,\n minPayout: 500,\n maxPayout: 500_000,\n currency: 'XAF',\n dailyLimit: 2_000_000,\n },\n MTN_MOMO_COG: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n AIRTEL_COG: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n MTN_MOMO_GAB: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n AIRTEL_GAB: {\n minDeposit: 100,\n maxDeposit: 500_000,\n minPayout: 500,\n maxPayout: 300_000,\n currency: 'XAF',\n dailyLimit: 1_000_000,\n },\n};\n","import { z } from 'zod';\nimport { CORRESPONDENTS } from '../constants/correspondents';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n DepositRequest,\n DepositResponse,\n PayoutRequest,\n PayoutResponse,\n RefundRequest,\n RefundResponse,\n TransactionStatusResponse,\n TransactionStatus,\n PollOptions,\n TransactionFilters,\n PaymentPageRequest,\n PaymentPageResponse,\n ActionResponse,\n} from '../types/transactions';\n\n// V2 API validation schemas\nconst depositRequestSchema = z.object({\n amount: z.number().positive('Amount must be positive').max(10_000_000),\n currency: z.string().min(3).max(3),\n provider: z.enum(CORRESPONDENTS),\n phoneNumber: z.string().regex(/^[0-9]{9,15}$/, 'Phone number must be 9-15 digits'),\n transactionId: z.string().uuid(),\n preAuthorisationCode: z.string().optional(),\n clientReferenceId: z.string().optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst payoutRequestSchema = z.object({\n amount: z.number().positive('Amount must be positive').max(10_000_000),\n currency: z.string().min(3).max(3),\n provider: z.enum(CORRESPONDENTS),\n phoneNumber: z.string().regex(/^[0-9]{9,15}$/, 'Phone number must be 9-15 digits'),\n transactionId: z.string().uuid(),\n clientReferenceId: z.string().optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst paymentPageRequestSchema = z.object({\n depositId: z.string().uuid(),\n returnUrl: z.string().url(),\n phoneNumber: z.string().optional(),\n amountDetails: z.object({\n amount: z.number().positive(),\n currency: z.string().length(3),\n }).optional(),\n language: z.enum(['EN', 'FR']).optional(),\n country: z.string().length(3).optional(),\n reason: z.string().max(50).optional(),\n customerMessage: z.string().min(4).max(22).optional(),\n metadata: z.array(z.record(z.unknown())).max(10).optional(),\n});\n\nconst refundRequestSchema = z.object({\n depositId: z.string().uuid(),\n amount: z.number().positive('Amount must be positive'),\n transactionId: z.string().uuid(),\n});\n\n// V2 Pawapay API request/response interfaces\ninterface PawapayV2DepositRequest {\n depositId: string;\n amount: string;\n currency: string;\n payer: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n preAuthorisationCode?: string;\n clientReferenceId?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2PayoutRequest {\n payoutId: string;\n amount: string;\n currency: string;\n recipient: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n clientReferenceId?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2PaymentPageRequest {\n depositId: string;\n returnUrl: string;\n phoneNumber?: string;\n amountDetails?: {\n amount: string;\n currency: string;\n };\n language?: 'EN' | 'FR';\n country?: string;\n reason?: string;\n customerMessage?: string;\n metadata?: Array<Record<string, unknown>>;\n}\n\ninterface PawapayV2DepositResponse {\n depositId: string;\n status: string;\n created?: string;\n nextStep?: string;\n redirectUrl?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\ninterface PawapayV2PayoutResponse {\n payoutId: string;\n status: string;\n created?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\ninterface PawapayV2PaymentPageResponse {\n redirectUrl: string;\n}\n\ninterface PawapayRefundRequest {\n refundId: string;\n depositId: string;\n amount?: string;\n}\n\ninterface PawapayRefundResponse {\n refundId: string;\n status: string;\n created?: string;\n rejectionReason?: {\n rejectionCode: string;\n rejectionMessage: string;\n };\n}\n\n// V2 Status check response wrapper\ninterface PawapayV2StatusWrapper {\n status: 'FOUND' | 'NOT_FOUND';\n data?: PawapayV2StatusData;\n}\n\ninterface PawapayV2StatusData {\n depositId?: string;\n payoutId?: string;\n status: string;\n amount: string;\n currency: string;\n country: string;\n created: string;\n customerMessage?: string;\n clientReferenceId?: string;\n providerTransactionId?: string;\n payer?: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n recipient?: {\n type: 'MMO';\n accountDetails: {\n phoneNumber: string;\n provider: string;\n };\n };\n failureReason?: {\n failureCode: string;\n failureMessage?: string;\n };\n metadata?: Record<string, string>;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class TransactionsModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n /**\n * Initiate a deposit (collect payment from mobile money user) - V2 API\n */\n async initiateDeposit(request: DepositRequest): Promise<DepositResponse> {\n const validated = depositRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2DepositRequest = {\n depositId: validated.transactionId,\n amount: validated.amount.toString(),\n currency: validated.currency,\n payer: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: validated.phoneNumber,\n provider: validated.provider,\n },\n },\n preAuthorisationCode: validated.preAuthorisationCode,\n clientReferenceId: validated.clientReferenceId,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Initiating V2 deposit ${validated.transactionId}`, {\n amount: validated.amount,\n currency: validated.currency,\n provider: validated.provider,\n });\n\n const response = await this.httpClient.post<PawapayV2DepositResponse>(\n '/v2/deposits',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Deposit ${response.depositId} status: ${response.status}`);\n\n return {\n depositId: response.depositId,\n status: response.status as TransactionStatus,\n created: response.created ?? new Date().toISOString(),\n nextStep: response.nextStep as DepositResponse['nextStep'],\n redirectUrl: response.redirectUrl,\n };\n }\n\n /**\n * Initiate a payout (send money to mobile money user) - V2 API\n */\n async initiatePayout(request: PayoutRequest): Promise<PayoutResponse> {\n const validated = payoutRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2PayoutRequest = {\n payoutId: validated.transactionId,\n amount: validated.amount.toString(),\n currency: validated.currency,\n recipient: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: validated.phoneNumber,\n provider: validated.provider,\n },\n },\n clientReferenceId: validated.clientReferenceId,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Initiating V2 payout ${validated.transactionId}`, {\n amount: validated.amount,\n currency: validated.currency,\n provider: validated.provider,\n });\n\n const response = await this.httpClient.post<PawapayV2PayoutResponse>(\n '/v2/payouts',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Payout ${response.payoutId} status: ${response.status}`);\n\n return {\n payoutId: response.payoutId,\n status: response.status as TransactionStatus,\n created: response.created ?? new Date().toISOString(),\n };\n }\n\n /**\n * Create a hosted payment page - V2 API\n */\n async createPaymentPage(request: PaymentPageRequest): Promise<PaymentPageResponse> {\n const validated = paymentPageRequestSchema.parse(request);\n\n const pawapayRequest: PawapayV2PaymentPageRequest = {\n depositId: validated.depositId,\n returnUrl: validated.returnUrl,\n phoneNumber: validated.phoneNumber,\n amountDetails: validated.amountDetails\n ? {\n amount: validated.amountDetails.amount.toString(),\n currency: validated.amountDetails.currency,\n }\n : undefined,\n language: validated.language,\n country: validated.country,\n reason: validated.reason,\n customerMessage: validated.customerMessage,\n metadata: validated.metadata,\n };\n\n this.logger.info(`Creating payment page for deposit ${validated.depositId}`);\n\n const response = await this.httpClient.post<PawapayV2PaymentPageResponse>(\n '/v2/paymentpage',\n pawapayRequest\n );\n\n this.logger.info(`Payment page created: ${response.redirectUrl}`);\n\n return {\n redirectUrl: response.redirectUrl,\n };\n }\n\n /**\n * Refund a deposit\n */\n async refund(request: RefundRequest): Promise<RefundResponse> {\n const validated = refundRequestSchema.parse(request);\n\n const pawapayRequest: PawapayRefundRequest = {\n refundId: validated.transactionId,\n depositId: validated.depositId,\n amount: validated.amount.toString(),\n };\n\n this.logger.info(`Initiating refund ${validated.transactionId}`, {\n depositId: validated.depositId,\n amount: validated.amount,\n });\n\n const response = await this.httpClient.post<PawapayRefundResponse>(\n '/refunds',\n pawapayRequest\n );\n\n if (response.status === 'REJECTED' && response.rejectionReason) {\n throw PawapayError.fromPawapayResponse(\n response.rejectionReason.rejectionCode,\n response.rejectionReason.rejectionMessage\n );\n }\n\n this.logger.info(`Refund ${response.refundId} status: ${response.status}`);\n\n return {\n refundId: response.refundId,\n depositId: validated.depositId,\n status: response.status as TransactionStatus,\n amount: validated.amount,\n created: response.created ?? new Date().toISOString(),\n };\n }\n\n /**\n * Check deposit status - V2 API\n */\n async checkDepositStatus(depositId: string): Promise<TransactionStatusResponse> {\n if (!z.string().uuid().safeParse(depositId).success) {\n throw PawapayError.validation('Invalid deposit ID format');\n }\n\n const response = await this.httpClient.get<PawapayV2StatusWrapper>(\n `/v2/deposits/${depositId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Deposit ${depositId} not found`);\n }\n\n const data = response.data;\n return {\n depositId: data.depositId,\n status: data.status as TransactionStatus,\n amount: data.amount,\n currency: data.currency,\n country: data.country,\n payer: data.payer as TransactionStatusResponse['payer'],\n created: data.created,\n customerMessage: data.customerMessage,\n clientReferenceId: data.clientReferenceId,\n providerTransactionId: data.providerTransactionId,\n failureReason: data.failureReason as TransactionStatusResponse['failureReason'],\n metadata: data.metadata,\n };\n }\n\n /**\n * Check payout status - V2 API\n */\n async checkPayoutStatus(payoutId: string): Promise<TransactionStatusResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n const response = await this.httpClient.get<PawapayV2StatusWrapper>(\n `/v2/payouts/${payoutId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Payout ${payoutId} not found`);\n }\n\n const data = response.data;\n return {\n payoutId: data.payoutId,\n status: data.status as TransactionStatus,\n amount: data.amount,\n currency: data.currency,\n country: data.country,\n recipient: data.recipient as TransactionStatusResponse['recipient'],\n created: data.created,\n customerMessage: data.customerMessage,\n clientReferenceId: data.clientReferenceId,\n providerTransactionId: data.providerTransactionId,\n failureReason: data.failureReason as TransactionStatusResponse['failureReason'],\n metadata: data.metadata,\n };\n }\n\n /**\n * Check transaction status (tries deposit first, then payout) - V2 API\n */\n async checkStatus(transactionId: string): Promise<TransactionStatusResponse> {\n // Try deposit first\n try {\n return await this.checkDepositStatus(transactionId);\n } catch (err) {\n // If not found as deposit, try payout\n if (err instanceof PawapayError && err.code === 'NOT_FOUND') {\n return await this.checkPayoutStatus(transactionId);\n }\n throw err;\n }\n }\n\n /**\n * Poll until transaction reaches final status\n */\n async pollUntilComplete(\n transactionId: string,\n options: PollOptions = {}\n ): Promise<TransactionStatusResponse> {\n const {\n interval = 5000,\n maxAttempts = 12,\n onStatusChange,\n } = options;\n\n let lastStatus: TransactionStatus | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const status = await this.checkStatus(transactionId);\n\n if (status.status !== lastStatus) {\n lastStatus = status.status;\n onStatusChange?.(status.status);\n }\n\n if (status.status === 'COMPLETED' || status.status === 'FAILED') {\n return status;\n }\n\n if (attempt < maxAttempts) {\n await sleep(interval);\n }\n }\n\n const finalStatus = await this.checkStatus(transactionId);\n return finalStatus;\n }\n\n /**\n * List deposits with filters\n */\n async listDeposits(filters?: TransactionFilters): Promise<DepositResponse[]> {\n const params: Record<string, string> = {};\n\n if (filters?.from) params.from = filters.from;\n if (filters?.to) params.to = filters.to;\n if (filters?.status) params.status = filters.status;\n if (filters?.provider) params.provider = filters.provider;\n if (filters?.limit) params.limit = String(filters.limit);\n if (filters?.offset) params.offset = String(filters.offset);\n\n const response = await this.httpClient.get<PawapayV2StatusData[]>('/v2/deposits', {\n params,\n });\n\n return response.map((deposit): DepositResponse => ({\n depositId: deposit.depositId ?? '',\n status: deposit.status as TransactionStatus,\n created: deposit.created,\n }));\n }\n\n /**\n * List payouts with filters\n */\n async listPayouts(filters?: TransactionFilters): Promise<PayoutResponse[]> {\n const params: Record<string, string> = {};\n\n if (filters?.from) params.from = filters.from;\n if (filters?.to) params.to = filters.to;\n if (filters?.status) params.status = filters.status;\n if (filters?.provider) params.provider = filters.provider;\n if (filters?.limit) params.limit = String(filters.limit);\n if (filters?.offset) params.offset = String(filters.offset);\n\n const response = await this.httpClient.get<PawapayV2StatusData[]>('/v2/payouts', {\n params,\n });\n\n return response.map((payout): PayoutResponse => ({\n payoutId: payout.payoutId ?? '',\n status: payout.status as TransactionStatus,\n created: payout.created,\n }));\n }\n\n /**\n * Resend deposit callback - V2 API\n * Triggers a new callback for a deposit transaction\n */\n async resendDepositCallback(depositId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(depositId).success) {\n throw PawapayError.validation('Invalid deposit ID format');\n }\n\n this.logger.info(`Resending callback for deposit ${depositId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/deposits/${depositId}/resend-callback`,\n {}\n );\n\n this.logger.info(`Resend callback for deposit ${depositId}: ${response.status}`);\n\n return response;\n }\n\n /**\n * Resend payout callback - V2 API\n * Triggers a new callback for a payout transaction\n */\n async resendPayoutCallback(payoutId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n this.logger.info(`Resending callback for payout ${payoutId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/payouts/${payoutId}/resend-callback`,\n {}\n );\n\n this.logger.info(`Resend callback for payout ${payoutId}: ${response.status}`);\n\n return response;\n }\n\n /**\n * Cancel enqueued payout - V2 API\n * Cancels a payout that is still in ENQUEUED status\n */\n async cancelEnqueuedPayout(payoutId: string): Promise<ActionResponse> {\n if (!z.string().uuid().safeParse(payoutId).success) {\n throw PawapayError.validation('Invalid payout ID format');\n }\n\n this.logger.info(`Cancelling enqueued payout ${payoutId}`);\n\n const response = await this.httpClient.post<ActionResponse>(\n `/v2/payouts/${payoutId}/cancel`,\n {}\n );\n\n this.logger.info(`Cancel payout ${payoutId}: ${response.status}`);\n\n return response;\n }\n}\n","import { z } from 'zod';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n Product,\n ProductCreateRequest,\n DomainAddRequest,\n} from '../types/products';\n\nconst productCreateSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n price: z.number().positive(),\n currency: z.enum(['XAF', 'XOF', 'USD']),\n metadata: z.record(z.unknown()).optional(),\n});\n\nconst domainAddSchema = z.object({\n productId: z.string().uuid(),\n domain: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]?\\.[a-zA-Z]{2,}$/),\n});\n\ninterface StoredProduct extends Product {\n metadata?: Record<string, unknown>;\n}\n\nexport class ProductsModule {\n private products: Map<string, StoredProduct> = new Map();\n\n constructor(private readonly logger: Logger) {}\n\n async create(request: ProductCreateRequest): Promise<Product> {\n const validated = productCreateSchema.parse(request);\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const product: StoredProduct = {\n id,\n name: validated.name,\n description: validated.description,\n price: validated.price,\n currency: validated.currency,\n domains: [],\n created: now,\n updated: now,\n metadata: validated.metadata,\n };\n\n this.products.set(id, product);\n\n this.logger.info(`Created product ${id}`, { name: validated.name });\n\n return this.toProduct(product);\n }\n\n async get(productId: string): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n return this.toProduct(product);\n }\n\n async list(): Promise<Product[]> {\n return Array.from(this.products.values()).map((p) => this.toProduct(p));\n }\n\n async update(\n productId: string,\n updates: Partial<ProductCreateRequest>\n ): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n const validated = productCreateSchema.partial().parse(updates);\n\n const updatedProduct: StoredProduct = {\n ...product,\n ...validated,\n updated: new Date().toISOString(),\n };\n\n this.products.set(productId, updatedProduct);\n\n this.logger.info(`Updated product ${productId}`);\n\n return this.toProduct(updatedProduct);\n }\n\n async delete(productId: string): Promise<void> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n this.products.delete(productId);\n\n this.logger.info(`Deleted product ${productId}`);\n }\n\n async addDomain(request: DomainAddRequest): Promise<Product> {\n const validated = domainAddSchema.parse(request);\n\n const product = this.products.get(validated.productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${validated.productId} not found`);\n }\n\n if (product.domains.includes(validated.domain)) {\n throw PawapayError.validation(`Domain ${validated.domain} already added to product`);\n }\n\n product.domains.push(validated.domain);\n product.updated = new Date().toISOString();\n\n this.logger.info(`Added domain ${validated.domain} to product ${validated.productId}`);\n\n return this.toProduct(product);\n }\n\n async removeDomain(productId: string, domain: string): Promise<Product> {\n const product = this.products.get(productId);\n\n if (!product) {\n throw PawapayError.notFound(`Product ${productId} not found`);\n }\n\n const domainIndex = product.domains.indexOf(domain);\n\n if (domainIndex === -1) {\n throw PawapayError.notFound(`Domain ${domain} not found in product`);\n }\n\n product.domains.splice(domainIndex, 1);\n product.updated = new Date().toISOString();\n\n this.logger.info(`Removed domain ${domain} from product ${productId}`);\n\n return this.toProduct(product);\n }\n\n private toProduct(stored: StoredProduct): Product {\n return {\n id: stored.id,\n name: stored.name,\n description: stored.description,\n price: stored.price,\n currency: stored.currency,\n domains: [...stored.domains],\n created: stored.created,\n updated: stored.updated,\n };\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type { PawapayWebhookEvent, WebhookEventType } from '../types/webhooks';\n\nexport interface WebhooksConfig {\n webhookSecret?: string;\n}\n\nexport class WebhooksModule {\n private webhookSecret?: string;\n\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger,\n config?: WebhooksConfig\n ) {\n this.webhookSecret = config?.webhookSecret;\n }\n\n setWebhookSecret(secret: string): void {\n this.webhookSecret = secret;\n }\n\n verifySignature(payload: string, signature: string): boolean {\n if (!this.webhookSecret) {\n this.logger.warn('Webhook secret not configured, skipping signature verification');\n return true;\n }\n\n if (!signature) {\n this.logger.warn('No signature provided in webhook request');\n return false;\n }\n\n try {\n const expectedSignature = createHmac('sha256', this.webhookSecret)\n .update(payload, 'utf8')\n .digest('hex');\n\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n } catch (error) {\n this.logger.error('Error verifying webhook signature', error);\n return false;\n }\n }\n\n parseEvent<T = unknown>(payload: string): PawapayWebhookEvent<T> {\n try {\n const event = JSON.parse(payload) as PawapayWebhookEvent<T>;\n\n if (!event.eventId || !event.eventType || !event.timestamp) {\n throw new Error('Invalid webhook event structure');\n }\n\n return event;\n } catch (error) {\n throw PawapayError.validation(\n `Failed to parse webhook event: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n constructEvent<T = unknown>(\n payload: string,\n signature: string\n ): PawapayWebhookEvent<T> {\n if (!this.verifySignature(payload, signature)) {\n throw PawapayError.unauthorized('Invalid webhook signature');\n }\n\n return this.parseEvent<T>(payload);\n }\n\n async registerCallback(url: string): Promise<void> {\n this.logger.info(`Registering callback URL: ${url}`);\n\n await this.httpClient.post('/webhooks', { url });\n\n this.logger.info('Callback URL registered successfully');\n }\n\n async unregisterCallback(): Promise<void> {\n this.logger.info('Unregistering callback URL');\n\n await this.httpClient.delete('/webhooks');\n\n this.logger.info('Callback URL unregistered successfully');\n }\n\n isDepositEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('deposit.');\n }\n\n isPayoutEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('payout.');\n }\n\n isRefundEvent(eventType: WebhookEventType): boolean {\n return eventType.startsWith('refund.');\n }\n\n isSuccessEvent(eventType: WebhookEventType): boolean {\n return eventType.endsWith('.completed');\n }\n\n isFailureEvent(eventType: WebhookEventType): boolean {\n return eventType.endsWith('.failed');\n }\n}\n","import { v4 as uuidv4, validate as uuidValidate, version as uuidVersion } from 'uuid';\nimport {\n CORRESPONDENTS,\n CORRESPONDENT_INFO,\n DEFAULT_LIMITS,\n type Correspondent,\n type CorrespondentInfo,\n type TransactionLimits,\n} from '../constants/correspondents';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport type {\n CountryAvailability,\n PredictProviderResponse,\n ActiveConfigResponse,\n PublicKeyResponse,\n OperationType,\n} from '../types/toolkit';\n\nexport interface MMOAvailability {\n correspondent: Correspondent;\n available: boolean;\n degraded: boolean;\n estimatedRecovery?: string;\n message?: string;\n}\n\nexport class UtilsModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n generateTransactionId(): string {\n return uuidv4();\n }\n\n validateTransactionId(id: string): boolean {\n return uuidValidate(id) && uuidVersion(id) === 4;\n }\n\n /**\n * Get active configuration - V2 API\n * Returns your account configuration including countries, providers, and limits\n */\n async getActiveConfiguration(options?: {\n country?: string;\n operationType?: OperationType;\n }): Promise<ActiveConfigResponse> {\n const params: Record<string, string> = {};\n if (options?.country) params.country = options.country;\n if (options?.operationType) params.operationType = options.operationType;\n\n this.logger.info('Fetching active configuration', options);\n\n const response = await this.httpClient.get<ActiveConfigResponse>('/v2/active-conf', {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n\n this.logger.info(`Retrieved configuration for ${response.countries.length} countries`);\n\n return response;\n }\n\n /**\n * Get provider availability - V2 API\n * Returns current processing status for all providers\n */\n async getProviderAvailability(options?: {\n country?: string;\n operationType?: OperationType;\n }): Promise<CountryAvailability[]> {\n const params: Record<string, string> = {};\n if (options?.country) params.country = options.country;\n if (options?.operationType) params.operationType = options.operationType;\n\n this.logger.info('Fetching provider availability', options);\n\n const response = await this.httpClient.get<CountryAvailability[]>('/v2/availability', {\n params: Object.keys(params).length > 0 ? params : undefined,\n });\n\n return response;\n }\n\n /**\n * Predict provider from phone number - V2 API\n * Returns the predicted provider and sanitized phone number\n */\n async predictProvider(phoneNumber: string): Promise<PredictProviderResponse> {\n this.logger.info('Predicting provider for phone number');\n\n const response = await this.httpClient.post<PredictProviderResponse>(\n '/v2/predict-provider',\n { phoneNumber }\n );\n\n this.logger.info(`Predicted provider: ${response.provider} (${response.country})`);\n\n return response;\n }\n\n /**\n * Get public keys for callback verification - V2 API\n */\n async getPublicKeys(): Promise<PublicKeyResponse[]> {\n this.logger.info('Fetching public keys');\n\n const response = await this.httpClient.get<PublicKeyResponse[]>('/v2/public-key/http');\n\n this.logger.info(`Retrieved ${response.length} public keys`);\n\n return response;\n }\n\n async getTransactionLimits(correspondent: Correspondent): Promise<TransactionLimits> {\n try {\n const config = await this.getActiveConfiguration();\n\n for (const country of config.countries) {\n for (const provider of country.providers) {\n if (provider.provider === correspondent) {\n const currency = provider.currencies[0];\n if (currency?.operationTypes) {\n const deposit = currency.operationTypes.DEPOSIT;\n const payout = currency.operationTypes.PAYOUT;\n const defaults = DEFAULT_LIMITS[correspondent];\n\n return {\n minDeposit: deposit?.minAmount ? parseFloat(deposit.minAmount) : defaults.minDeposit,\n maxDeposit: deposit?.maxAmount ? parseFloat(deposit.maxAmount) : defaults.maxDeposit,\n minPayout: payout?.minAmount ? parseFloat(payout.minAmount) : defaults.minPayout,\n maxPayout: payout?.maxAmount ? parseFloat(payout.maxAmount) : defaults.maxPayout,\n currency: currency.currency,\n dailyLimit: defaults.dailyLimit,\n };\n }\n }\n }\n }\n } catch (error) {\n this.logger.warn(`Failed to fetch live limits for ${correspondent}, using defaults`, error);\n }\n\n return DEFAULT_LIMITS[correspondent];\n }\n\n async checkMMOAvailability(correspondent: Correspondent): Promise<MMOAvailability> {\n try {\n const availability = await this.getProviderAvailability();\n\n for (const country of availability) {\n const provider = country.providers.find((p) => p.provider === correspondent);\n if (provider) {\n const depositStatus = provider.operationTypes.find((op) => op.operationType === 'DEPOSIT');\n const payoutStatus = provider.operationTypes.find((op) => op.operationType === 'PAYOUT');\n\n const isOperational =\n depositStatus?.status === 'OPERATIONAL' ||\n payoutStatus?.status === 'OPERATIONAL';\n const isDelayed =\n depositStatus?.status === 'DELAYED' ||\n payoutStatus?.status === 'DELAYED';\n const isClosed =\n depositStatus?.status === 'CLOSED' &&\n payoutStatus?.status === 'CLOSED';\n\n return {\n correspondent,\n available: isOperational || isDelayed,\n degraded: isDelayed,\n message: isClosed ? 'Provider is currently closed' : undefined,\n };\n }\n }\n\n return {\n correspondent,\n available: false,\n degraded: false,\n message: 'Correspondent not found in availability list',\n };\n } catch (error) {\n this.logger.warn(`Failed to check MMO availability for ${correspondent}`, error);\n\n return {\n correspondent,\n available: false,\n degraded: true,\n message: 'Unable to verify availability',\n };\n }\n }\n\n formatPhoneNumber(phone: string, countryCode: string): string {\n let cleaned = phone.replace(/\\D/g, '');\n\n if (cleaned.startsWith('00')) {\n cleaned = cleaned.slice(2);\n }\n\n const countryPrefixes: Record<string, string> = {\n CMR: '237',\n COG: '242',\n GAB: '241',\n ZMB: '260',\n GHA: '233',\n KEN: '254',\n TZA: '255',\n UGA: '256',\n RWA: '250',\n BEN: '229',\n CIV: '225',\n SEN: '221',\n };\n\n const prefix = countryPrefixes[countryCode.toUpperCase()];\n\n if (prefix && !cleaned.startsWith(prefix)) {\n if (cleaned.startsWith('0')) {\n cleaned = cleaned.slice(1);\n }\n cleaned = prefix + cleaned;\n }\n\n return cleaned;\n }\n\n validatePhoneNumber(phone: string, correspondent: Correspondent): boolean {\n const info = CORRESPONDENT_INFO[correspondent];\n if (!info) {\n return false;\n }\n\n const cleaned = phone.replace(/\\D/g, '');\n return info.phoneRegex.test(cleaned);\n }\n\n getSupportedCorrespondents(): readonly Correspondent[] {\n return CORRESPONDENTS;\n }\n\n getCorrespondentInfo(correspondent: Correspondent): CorrespondentInfo {\n return CORRESPONDENT_INFO[correspondent];\n }\n\n getAllCorrespondentsInfo(): CorrespondentInfo[] {\n return Object.values(CORRESPONDENT_INFO);\n }\n\n detectCorrespondent(phone: string): Correspondent | null {\n const cleaned = phone.replace(/\\D/g, '');\n\n for (const [correspondent, info] of Object.entries(CORRESPONDENT_INFO)) {\n if (info.phoneRegex.test(cleaned)) {\n return correspondent as Correspondent;\n }\n }\n\n return null;\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../core/http-client';\nimport type { Logger } from '../core/logger';\nimport { PawapayError } from '../core/errors';\nimport type {\n WalletBalance,\n WalletBalancesResponse,\n StatementRequest,\n StatementResponse,\n StatementStatusResponse,\n StatementData,\n} from '../types/finances';\n\nconst statementRequestSchema = z.object({\n wallet: z.object({\n country: z.string().length(3),\n currency: z.string().length(3),\n provider: z.string().optional(),\n }),\n callbackUrl: z.string().url(),\n startDate: z.string(),\n endDate: z.string(),\n compressed: z.boolean().optional(),\n});\n\nexport class FinancesModule {\n constructor(\n private readonly httpClient: HttpClient,\n private readonly logger: Logger\n ) {}\n\n /**\n * Get wallet balances - V2 API\n * Returns balances for all wallets configured on your account\n */\n async getWalletBalances(): Promise<WalletBalance[]> {\n this.logger.info('Fetching wallet balances');\n\n const response = await this.httpClient.get<WalletBalancesResponse>(\n '/v2/wallets/balances'\n );\n\n this.logger.info(`Retrieved ${response.balances.length} wallet balances`);\n\n return response.balances;\n }\n\n /**\n * Generate a statement for a wallet - V2 API\n * The statement can be downloaded from the callback URL or checked via status endpoint\n */\n async generateStatement(request: StatementRequest): Promise<StatementResponse> {\n const validated = statementRequestSchema.parse(request);\n\n this.logger.info('Generating statement', {\n wallet: validated.wallet,\n startDate: validated.startDate,\n endDate: validated.endDate,\n });\n\n const response = await this.httpClient.post<StatementResponse>(\n '/v2/statements',\n validated\n );\n\n if (response.status === 'REJECTED' && response.failureReason) {\n throw PawapayError.fromPawapayResponse(\n response.failureReason.failureCode,\n response.failureReason.failureMessage\n );\n }\n\n this.logger.info(`Statement ${response.statementId} status: ${response.status}`);\n\n return response;\n }\n\n /**\n * Check statement status - V2 API\n */\n async checkStatementStatus(statementId: string): Promise<StatementData> {\n if (!z.string().uuid().safeParse(statementId).success) {\n throw PawapayError.validation('Invalid statement ID format');\n }\n\n const response = await this.httpClient.get<StatementStatusResponse>(\n `/v2/statements/${statementId}`\n );\n\n if (response.status === 'NOT_FOUND' || !response.data) {\n throw PawapayError.notFound(`Statement ${statementId} not found`);\n }\n\n this.logger.info(`Statement ${statementId} status: ${response.data.status}`);\n\n return response.data;\n }\n\n /**\n * Poll until statement is ready\n */\n async pollStatementUntilComplete(\n statementId: string,\n options: { interval?: number; maxAttempts?: number } = {}\n ): Promise<StatementData> {\n const { interval = 5000, maxAttempts = 24 } = options;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const status = await this.checkStatementStatus(statementId);\n\n if (status.status === 'COMPLETED' || status.status === 'FAILED') {\n return status;\n }\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n return this.checkStatementStatus(statementId);\n }\n}\n","import type { SpaarkPayApiSdkConfig, ResolvedConfig, LogLevel } from './types/config';\nimport { resolveConfig, getConfigFromEnv } from './config';\nimport { HttpClient } from './core/http-client';\nimport { Logger } from './core/logger';\nimport { TransactionsModule } from './modules/transactions';\nimport { ProductsModule } from './modules/products';\nimport { WebhooksModule } from './modules/webhooks';\nimport { UtilsModule } from './modules/utils';\nimport { FinancesModule } from './modules/finances';\n\nexport class SpaarkPayApiSdk {\n private readonly config: ResolvedConfig;\n private readonly logger: Logger;\n private readonly httpClient: HttpClient;\n\n readonly transactions: TransactionsModule;\n readonly products: ProductsModule;\n readonly webhooks: WebhooksModule;\n readonly utils: UtilsModule;\n readonly finances: FinancesModule;\n\n constructor(config: SpaarkPayApiSdkConfig) {\n const envConfig = getConfigFromEnv();\n const mergedConfig: SpaarkPayApiSdkConfig = {\n ...envConfig,\n ...config,\n };\n\n this.config = resolveConfig(mergedConfig);\n this.logger = new Logger('SpaarkPayApiSdk', this.config.logLevel);\n this.httpClient = HttpClient.fromConfig(this.config, this.logger);\n\n this.transactions = new TransactionsModule(this.httpClient, this.logger);\n this.products = new ProductsModule(this.logger);\n this.webhooks = new WebhooksModule(this.httpClient, this.logger, {\n webhookSecret: this.getWebhookSecretFromEnv(),\n });\n this.utils = new UtilsModule(this.httpClient, this.logger);\n this.finances = new FinancesModule(this.httpClient, this.logger);\n\n this.logger.info(`SpaarkPayApiSdk initialized`, {\n environment: this.config.environment,\n baseUrl: this.config.baseUrl,\n });\n }\n\n private getWebhookSecretFromEnv(): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env['PAWAPAY_WEBHOOK_SECRET'];\n }\n return undefined;\n }\n\n getConfig(): Readonly<ResolvedConfig> {\n return { ...this.config };\n }\n\n setLogLevel(level: LogLevel): void {\n this.logger.setLevel(level);\n }\n\n setWebhookSecret(secret: string): void {\n this.webhooks.setWebhookSecret(secret);\n }\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\nimport type { Correspondent } from './constants/correspondents';\nimport type { DepositResponse, PayoutResponse } from './types/transactions';\n\ntype OperationStatus = 'idle' | 'loading' | 'success' | 'error';\ntype TabType = 'deposit' | 'payout' | 'status' | 'toolkit' | 'finances';\n\ninterface TestResult {\n id: string;\n operation: string;\n status: OperationStatus;\n response?: unknown;\n error?: string;\n timestamp: string;\n}\n\nexport interface PawapayTestDashboardProps {\n apiKey?: string;\n environment?: 'sandbox' | 'production';\n className?: string;\n demoMode?: boolean;\n /** Base path for API routes (e.g., '/api/pawapay'). When set, requests go through your server instead of directly to Pawapay. */\n apiBasePath?: string;\n onDepositComplete?: (response: DepositResponse) => void;\n onPayoutComplete?: (response: PayoutResponse) => void;\n onError?: (error: Error) => void;\n}\n\n// Mock response generators for demo mode (V2 API format)\nconst createMockDepositResponse = (txId: string): DepositResponse => ({\n depositId: txId,\n status: 'ACCEPTED',\n created: new Date().toISOString(),\n nextStep: 'FINAL_STATUS',\n});\n\nconst createMockPayoutResponse = (txId: string): PayoutResponse => ({\n payoutId: txId,\n status: 'ACCEPTED',\n created: new Date().toISOString(),\n});\n\nconst createMockStatusResponse = (txId: string) => ({\n depositId: txId,\n status: ['COMPLETED', 'ACCEPTED', 'PROCESSING', 'ENQUEUED'][Math.floor(Math.random() * 4)],\n created: new Date(Date.now() - 60000).toISOString(),\n amount: '5000',\n currency: 'XAF',\n country: 'CMR',\n payer: {\n type: 'MMO',\n accountDetails: {\n phoneNumber: '237670000000',\n provider: 'MTN_MOMO_CMR',\n },\n },\n});\n\nconst createMockAvailabilityResponse = () => [\n {\n country: 'CMR',\n providers: [\n {\n provider: 'MTN_MOMO_CMR',\n operationTypes: [\n { operationType: 'DEPOSIT', status: 'OPERATIONAL' },\n { operationType: 'PAYOUT', status: 'OPERATIONAL' },\n ],\n },\n {\n provider: 'ORANGE_CMR',\n operationTypes: [\n { operationType: 'DEPOSIT', status: 'OPERATIONAL' },\n { operationType: 'PAYOUT', status: 'DELAYED' },\n ],\n },\n ],\n },\n];\n\nconst createMockPredictResponse = (phone: string) => ({\n country: 'CMR',\n provider: phone.startsWith('23767') ? 'MTN_MOMO_CMR' : 'ORANGE_CMR',\n phoneNumber: phone.replace(/\\D/g, ''),\n});\n\nconst createMockActiveConfigResponse = () => ({\n companyName: 'Demo Company',\n signatureConfiguration: {\n signedRequestsOnly: false,\n signedCallbacks: true,\n },\n countries: [\n {\n country: 'CMR',\n displayName: { en: 'Cameroon', fr: 'Cameroun' },\n prefix: '237',\n flag: 'https://cdn.pawapay.io/flags/cmr.svg',\n providers: [\n {\n provider: 'MTN_MOMO_CMR',\n displayName: 'MTN Mobile Money',\n nameDisplayedToCustomer: 'MTN MoMo',\n currencies: [\n {\n currency: 'XAF',\n displayName: 'CFA Franc',\n operationTypes: {\n DEPOSIT: { minAmount: '100', maxAmount: '1000000', status: 'OPERATIONAL' },\n PAYOUT: { minAmount: '100', maxAmount: '500000', status: 'OPERATIONAL' },\n },\n },\n ],\n },\n ],\n },\n ],\n});\n\nconst createMockWalletBalancesResponse = () => ({\n balances: [\n { country: 'CMR', currency: 'XAF', balance: '1250000.00' },\n { country: 'COG', currency: 'XAF', balance: '450000.00' },\n { country: 'GAB', currency: 'XAF', balance: '780000.00' },\n ],\n});\n\nconst createMockPublicKeysResponse = () => [\n {\n id: 'key-001',\n key: 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...',\n },\n];\n\nconst simulateDelay = (ms: number = 800) => new Promise(resolve => setTimeout(resolve, ms + Math.random() * 400));\n\nconst generateUUID = (): string => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\n\nconst PROVIDER_OPTIONS: Array<{ value: Correspondent; label: string; country: string }> = [\n { value: 'MTN_MOMO_CMR', label: 'MTN Mobile Money', country: 'Cameroun' },\n { value: 'ORANGE_CMR', label: 'Orange Money', country: 'Cameroun' },\n { value: 'MTN_MOMO_COG', label: 'MTN Mobile Money', country: 'Congo' },\n { value: 'AIRTEL_COG', label: 'Airtel Money', country: 'Congo' },\n { value: 'MTN_MOMO_GAB', label: 'MTN Mobile Money', country: 'Gabon' },\n { value: 'AIRTEL_GAB', label: 'Airtel Money', country: 'Gabon' },\n];\n\nconst CURRENCY_OPTIONS = [\n { value: 'XAF', label: 'XAF (CFA Franc BEAC)' },\n { value: 'XOF', label: 'XOF (CFA Franc BCEAO)' },\n { value: 'GHS', label: 'GHS (Ghana Cedi)' },\n { value: 'KES', label: 'KES (Kenyan Shilling)' },\n { value: 'RWF', label: 'RWF (Rwandan Franc)' },\n { value: 'TZS', label: 'TZS (Tanzanian Shilling)' },\n { value: 'UGX', label: 'UGX (Ugandan Shilling)' },\n { value: 'ZMW', label: 'ZMW (Zambian Kwacha)' },\n];\n\nexport function PawapayTestDashboard({\n apiKey: initialApiKey = '',\n environment: initialEnvironment = 'sandbox',\n className = '',\n demoMode: initialDemoMode = false,\n apiBasePath = '/api/pawapay',\n onDepositComplete,\n onPayoutComplete,\n onError,\n}: PawapayTestDashboardProps) {\n const [apiKey, setApiKey] = useState(initialApiKey);\n const [environment, setEnvironment] = useState<'sandbox' | 'production'>(initialEnvironment);\n const [isConfigured, setIsConfigured] = useState(!!initialApiKey || initialDemoMode);\n const [isDemoMode, setIsDemoMode] = useState(initialDemoMode);\n\n const [activeTab, setActiveTab] = useState<TabType>('deposit');\n const [phoneNumber, setPhoneNumber] = useState('237670000000');\n const [amount, setAmount] = useState('5000');\n const [currency, setCurrency] = useState('XAF');\n const [provider, setProvider] = useState<Correspondent>('MTN_MOMO_CMR');\n const [description, setDescription] = useState('Test Payment');\n const [transactionId, setTransactionId] = useState('');\n\n const [results, setResults] = useState<TestResult[]>([]);\n const [currentStatus, setCurrentStatus] = useState<OperationStatus>('idle');\n\n const addResult = useCallback((operation: string, status: OperationStatus, response?: unknown, error?: string) => {\n const result: TestResult = {\n id: generateUUID(),\n operation,\n status,\n response,\n error,\n timestamp: new Date().toLocaleTimeString(),\n };\n setResults((prev) => [result, ...prev].slice(0, 20));\n }, []);\n\n const handleConfigure = useCallback(() => {\n if (!apiKey.trim()) {\n addResult('Configuration', 'error', undefined, 'API Key is required');\n return;\n }\n setIsConfigured(true);\n setIsDemoMode(false);\n addResult('Configuration', 'success', { environment, configured: true, apiBasePath });\n }, [apiKey, environment, apiBasePath, addResult]);\n\n const handleDemoMode = useCallback(() => {\n setIsDemoMode(true);\n setIsConfigured(true);\n addResult('Configuration', 'success', { mode: 'demo', message: 'Demo mode activated - responses are simulated' });\n }, [addResult]);\n\n const handleDeposit = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n const txId = generateUUID();\n setTransactionId(txId);\n\n let response: DepositResponse;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockDepositResponse(txId);\n } else {\n const res = await fetch(`${apiBasePath}/deposit`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n apiKey,\n environment,\n amount: parseFloat(amount),\n currency,\n provider,\n phoneNumber,\n customerMessage: description.slice(0, 22),\n transactionId: txId,\n }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Deposit failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Deposit', 'success', response);\n onDepositComplete?.(response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Deposit failed';\n addResult('Deposit', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, amount, currency, provider, phoneNumber, description, addResult, onDepositComplete, onError]);\n\n const handlePayout = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n const txId = generateUUID();\n setTransactionId(txId);\n\n let response: PayoutResponse;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPayoutResponse(txId);\n } else {\n const res = await fetch(`${apiBasePath}/payout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n apiKey,\n environment,\n amount: parseFloat(amount),\n currency,\n provider,\n phoneNumber,\n transactionId: txId,\n }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Payout failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Payout', 'success', response);\n onPayoutComplete?.(response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Payout failed';\n addResult('Payout', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, amount, currency, provider, phoneNumber, addResult, onPayoutComplete, onError]);\n\n const handleCheckStatus = useCallback(async () => {\n if ((!apiKey && !isDemoMode) || !transactionId) {\n addResult('Check Status', 'error', undefined, 'No transaction ID');\n return;\n }\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockStatusResponse(transactionId);\n } else {\n const res = await fetch(`${apiBasePath}/status`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment, transactionId }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Status check failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Check Status', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Status check failed';\n addResult('Check Status', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, transactionId, addResult, onError]);\n\n const handleGetAvailability = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockAvailabilityResponse();\n } else {\n const res = await fetch(`${apiBasePath}/availability`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Availability check failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Provider Availability', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Availability check failed';\n addResult('Provider Availability', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handlePredictProvider = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPredictResponse(phoneNumber);\n } else {\n const res = await fetch(`${apiBasePath}/predict-provider`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment, phoneNumber }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Prediction failed');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Predict Provider', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Prediction failed';\n addResult('Predict Provider', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, phoneNumber, addResult, onError]);\n\n const handleGetActiveConfig = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockActiveConfigResponse();\n } else {\n const res = await fetch(`${apiBasePath}/active-config`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get config');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Active Configuration', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get config';\n addResult('Active Configuration', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handleGetPublicKeys = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockPublicKeysResponse();\n } else {\n const res = await fetch(`${apiBasePath}/public-keys`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get public keys');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Public Keys', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get public keys';\n addResult('Public Keys', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const handleGetWalletBalances = useCallback(async () => {\n if (!apiKey && !isDemoMode) return;\n setCurrentStatus('loading');\n\n try {\n let response;\n\n if (isDemoMode) {\n await simulateDelay();\n response = createMockWalletBalancesResponse();\n } else {\n const res = await fetch(`${apiBasePath}/wallet-balances`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ apiKey, environment }),\n });\n\n const data = await res.json();\n if (!res.ok) throw new Error(data.error || 'Failed to get balances');\n response = data;\n }\n\n setCurrentStatus('success');\n addResult('Wallet Balances', 'success', response);\n } catch (err) {\n setCurrentStatus('error');\n const message = err instanceof Error ? err.message : 'Failed to get balances';\n addResult('Wallet Balances', 'error', undefined, message);\n onError?.(err instanceof Error ? err : new Error(message));\n }\n }, [apiKey, apiBasePath, environment, isDemoMode, addResult, onError]);\n\n const copyToClipboard = useCallback((text: string) => {\n navigator.clipboard.writeText(text);\n }, []);\n\n if (!isConfigured) {\n return (\n <div className={`space-y-8 ${className}`}>\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight\">SDK Test Console</h1>\n <p className=\"text-muted-foreground mt-1\">\n Configure your Pawapay SDK credentials to start testing\n </p>\n </div>\n\n <div className=\"border border-border bg-background p-6 max-w-md space-y-6\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-10 h-10 bg-muted flex items-center justify-center\">\n <SettingsIcon />\n </div>\n <div>\n <h2 className=\"font-semibold\">SDK Configuration</h2>\n <p className=\"text-xs text-muted-foreground\">Enter your API credentials</p>\n </div>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">API Key</label>\n <input\n type=\"password\"\n placeholder=\"pk_sandbox_...\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Environment</label>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setEnvironment('sandbox')}\n className={`h-8 px-3 text-xs font-medium border transition-colors ${\n environment === 'sandbox'\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-background border-border hover:bg-muted'\n }`}\n >\n Sandbox\n </button>\n <button\n onClick={() => setEnvironment('production')}\n className={`h-8 px-3 text-xs font-medium border transition-colors ${\n environment === 'production'\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-background border-border hover:bg-muted'\n }`}\n >\n Production\n </button>\n </div>\n </div>\n\n <button\n onClick={handleConfigure}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 transition-colors flex items-center justify-center gap-2\"\n >\n <PlayIcon />\n Initialize SDK\n </button>\n\n <div className=\"relative flex items-center py-2\">\n <div className=\"flex-grow border-t border-border\"></div>\n <span className=\"flex-shrink mx-3 text-xs text-muted-foreground\">ou</span>\n <div className=\"flex-grow border-t border-border\"></div>\n </div>\n\n <button\n onClick={handleDemoMode}\n className=\"w-full h-8 px-3 text-xs font-medium border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center gap-2\"\n >\n <BeakerIcon />\n Mode Démo (sans API key)\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`space-y-6 ${className}`}>\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\n <div>\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl font-bold tracking-tight\">SDK Test Console</h1>\n {isDemoMode && (\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-200\">\n DEMO\n </span>\n )}\n </div>\n <p className=\"text-muted-foreground mt-1\">\n {isDemoMode\n ? 'Mode démo - Les réponses sont simulées'\n : `Test Pawapay SDK operations in ${environment} mode`\n }\n </p>\n </div>\n <button\n onClick={() => setIsConfigured(false)}\n className=\"h-8 px-3 text-xs font-medium border border-border bg-background hover:bg-muted transition-colors flex items-center gap-2\"\n >\n <SettingsIcon />\n Reconfigure\n </button>\n </div>\n\n <div className=\"grid lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Tabs */}\n <div className=\"flex flex-wrap gap-1 bg-muted p-1\">\n <button\n onClick={() => setActiveTab('deposit')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'deposit' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <WalletIcon />\n Deposit\n </button>\n <button\n onClick={() => setActiveTab('payout')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'payout' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <PhoneIcon />\n Payout\n </button>\n <button\n onClick={() => setActiveTab('status')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'status' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <RefreshIcon />\n Status\n </button>\n <button\n onClick={() => setActiveTab('toolkit')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'toolkit' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <ToolkitIcon />\n Toolkit\n </button>\n <button\n onClick={() => setActiveTab('finances')}\n className={`flex-1 min-w-[80px] h-8 px-3 text-xs font-medium transition-colors flex items-center justify-center gap-1.5 ${\n activeTab === 'finances' ? 'bg-background text-foreground' : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n <ChartIcon />\n Finances\n </button>\n </div>\n\n {/* Deposit Tab */}\n {activeTab === 'deposit' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Initiate Deposit</h3>\n <p className=\"text-xs text-muted-foreground\">Collect payment from a Mobile Money user</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"237670000000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Currency</label>\n <select\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {CURRENCY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={provider}\n onChange={(e) => setProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label} ({c.country})</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2 sm:col-span-2\">\n <label className=\"text-xs font-medium\">Customer Message (4-22 chars)</label>\n <input\n placeholder=\"Payment description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n maxLength={22}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n </div>\n\n <button\n onClick={handleDeposit}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <PlayIcon />}\n Execute Deposit\n </button>\n </div>\n )}\n\n {/* Payout Tab */}\n {activeTab === 'payout' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Initiate Payout</h3>\n <p className=\"text-xs text-muted-foreground\">Send money to a Mobile Money account</p>\n </div>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Recipient Phone</label>\n <input\n placeholder=\"237670000000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Amount</label>\n <input\n type=\"number\"\n placeholder=\"5000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Currency</label>\n <select\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {CURRENCY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label}</option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Provider</label>\n <select\n value={provider}\n onChange={(e) => setProvider(e.target.value as Correspondent)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n >\n {PROVIDER_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>{c.label} ({c.country})</option>\n ))}\n </select>\n </div>\n </div>\n\n <button\n onClick={handlePayout}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <PlayIcon />}\n Execute Payout\n </button>\n </div>\n )}\n\n {/* Status Tab */}\n {activeTab === 'status' && (\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Check Transaction Status</h3>\n <p className=\"text-xs text-muted-foreground\">Query the status of a transaction</p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Transaction ID</label>\n <div className=\"flex gap-2\">\n <input\n placeholder=\"Enter transaction ID (UUID)\"\n value={transactionId}\n onChange={(e) => setTransactionId(e.target.value)}\n className=\"flex-1 h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring font-mono\"\n />\n {transactionId && (\n <button\n onClick={() => copyToClipboard(transactionId)}\n className=\"w-8 h-8 border border-border bg-background hover:bg-muted transition-colors flex items-center justify-center\"\n title=\"Copy to clipboard\"\n >\n <CopyIcon />\n </button>\n )}\n </div>\n </div>\n\n <button\n onClick={handleCheckStatus}\n disabled={currentStatus === 'loading' || !transactionId}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <RefreshIcon />}\n Check Status\n </button>\n </div>\n </div>\n )}\n\n {/* Toolkit Tab */}\n {activeTab === 'toolkit' && (\n <div className=\"space-y-4\">\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Predict Provider</h3>\n <p className=\"text-xs text-muted-foreground\">Predict the provider from a phone number</p>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-xs font-medium\">Phone Number</label>\n <input\n placeholder=\"+237 670 000 000\"\n value={phoneNumber}\n onChange={(e) => setPhoneNumber(e.target.value)}\n className=\"w-full h-8 px-2.5 text-xs border border-input bg-transparent rounded-none outline-none focus:border-ring\"\n />\n </div>\n\n <button\n onClick={handlePredictProvider}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <SearchIcon />}\n Predict Provider\n </button>\n </div>\n\n <div className=\"grid sm:grid-cols-3 gap-3\">\n <button\n onClick={handleGetAvailability}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <SignalIcon />\n Provider Availability\n </button>\n <button\n onClick={handleGetActiveConfig}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <SettingsIcon />\n Active Config\n </button>\n <button\n onClick={handleGetPublicKeys}\n disabled={currentStatus === 'loading'}\n className=\"h-10 px-3 text-xs font-medium border border-border bg-background hover:bg-muted disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n <KeyIcon />\n Public Keys\n </button>\n </div>\n </div>\n )}\n\n {/* Finances Tab */}\n {activeTab === 'finances' && (\n <div className=\"space-y-4\">\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Wallet Balances</h3>\n <p className=\"text-xs text-muted-foreground\">View balances for all your wallets</p>\n </div>\n\n <button\n onClick={handleGetWalletBalances}\n disabled={currentStatus === 'loading'}\n className=\"w-full h-8 px-3 text-xs font-medium bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {currentStatus === 'loading' ? <LoaderIcon /> : <WalletIcon />}\n Get Wallet Balances\n </button>\n </div>\n\n <div className=\"border border-border bg-background p-6 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">Statements</h3>\n <p className=\"text-xs text-muted-foreground\">Generate financial statements for your wallets</p>\n </div>\n\n <div className=\"p-4 bg-muted/50 text-xs text-muted-foreground\">\n Statement generation requires callback URL configuration. Use the SDK directly:\n <pre className=\"mt-2 p-2 bg-background overflow-x-auto\">\n{`await sdk.finances.generateStatement({\n wallet: { country: 'CMR', currency: 'XAF' },\n callbackUrl: 'https://your-site.com/callback',\n startDate: '2025-01-01T00:00:00Z',\n endDate: '2025-01-31T23:59:59Z',\n});`}\n </pre>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Results Panel */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold\">Results</h3>\n {results.length > 0 && (\n <button\n onClick={() => setResults([])}\n className=\"text-xs text-muted-foreground hover:text-foreground\"\n >\n Clear\n </button>\n )}\n </div>\n\n <div className=\"border border-border bg-background divide-y divide-border max-h-[600px] overflow-y-auto\">\n {results.length === 0 ? (\n <div className=\"p-6 text-center text-muted-foreground text-xs\">\n No results yet. Execute an operation to see results here.\n </div>\n ) : (\n results.map((result) => (\n <div key={result.id} className=\"p-4 space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {result.status === 'success' ? (\n <CheckIcon className=\"text-green-600\" />\n ) : (\n <XIcon className=\"text-red-600\" />\n )}\n <span className=\"font-medium text-sm\">{result.operation}</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">{result.timestamp}</span>\n </div>\n\n {result.error ? (\n <p className=\"text-xs text-red-600\">{result.error}</p>\n ) : (\n <pre className=\"text-xs bg-muted p-2 overflow-x-auto max-h-48\">\n {JSON.stringify(result.response, null, 2)}\n </pre>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// Simple SVG Icons (no external dependencies)\nconst SettingsIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst WalletIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\" />\n </svg>\n);\n\nconst PhoneIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n);\n\nconst RefreshIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n);\n\nconst LoaderIcon = () => (\n <svg className=\"w-4 h-4 animate-spin\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n);\n\nconst CopyIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n);\n\nconst CheckIcon = ({ className = '' }: { className?: string }) => (\n <svg className={`w-4 h-4 ${className}`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst XIcon = ({ className = '' }: { className?: string }) => (\n <svg className={`w-4 h-4 ${className}`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n);\n\nconst BeakerIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n);\n\nconst ToolkitIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n);\n\nconst ChartIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nconst SignalIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0\" />\n </svg>\n);\n\nconst KeyIcon = () => (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z\" />\n </svg>\n);\n\nexport default PawapayTestDashboard;\n"]}
|