diff --git a/src/config/cashierConfig.ts b/src/config/cashierConfig.ts index 6aa9633..c695b75 100644 --- a/src/config/cashierConfig.ts +++ b/src/config/cashierConfig.ts @@ -1,5 +1,35 @@ import type { ICustomer, IRedirect } from '@/features/cashier/types'; +// Store parameters received via postMessage from parent window +const postMessageParams: Record = {}; +let postMessageCustomer: Partial | null = null; + +// Initialize postMessage listener to receive params from parent window +if (typeof window !== 'undefined' && window.parent !== window) { + window.addEventListener('message', (event: MessageEvent) => { + // Accept messages from any origin (parent window) + // In production, you might want to validate event.origin + if (event.data && typeof event.data === 'object') { + // If the message contains config params, store them + if (event.data.type === 'CASHIER_CONFIG' || !event.data.type) { + // Convert object to URLSearchParams-like format + Object.entries(event.data).forEach(([key, value]) => { + if (key === 'customer' && typeof value === 'object' && value !== null) { + // Handle customer object separately + postMessageCustomer = value as Partial; + } else if (key !== 'type' && typeof value === 'string') { + postMessageParams[key] = value; + } else if (typeof value === 'number' || typeof value === 'boolean') { + postMessageParams[key] = String(value); + } + }); + console.log('Received params via postMessage:', postMessageParams); + console.log('Received customer via postMessage:', postMessageCustomer); + } + } + }); +} + export interface ICashierConfig { // Core payment configuration paymentType?: 'deposit' | 'withdrawal'; @@ -39,7 +69,25 @@ export interface ICashierConfig { } export function getCashierConfig(): ICashierConfig { - const params = new URLSearchParams(window.location.search); + const urlParams = new URLSearchParams(window.location.search); + + // Merge URL params with postMessage params (postMessage params take precedence) + const params = new URLSearchParams(); + + // First add URL params + urlParams.forEach((value, key) => { + params.set(key, value); + }); + + // Then override/add postMessage params + Object.entries(postMessageParams).forEach(([key, value]) => { + params.set(key, value); + }); + + // Debug: Log all parameters (URL + postMessage) + console.log('All URL params:', Object.fromEntries(urlParams.entries())); + console.log('All postMessage params:', postMessageParams); + console.log('Merged params:', Object.fromEntries(params.entries())); const config: ICashierConfig = { }; @@ -63,13 +111,10 @@ export function getCashierConfig(): ICashierConfig { if (amount && amount !== 'undefined') { const parsedAmount = parseFloat(amount); if (!isNaN(parsedAmount)) { - config.amount = 200; + config.amount = parsedAmount; } } - // TODO: remove this default value - config.amount = 200; - // Account from URL (for withdrawal) const account = params.get('account'); if (account) { @@ -86,8 +131,6 @@ export function getCashierConfig(): ICashierConfig { if (userId) { config.userId = userId; } - // TODO: remove this default value - config.userId = '12345'; const sessionId = params.get('sessionId'); @@ -101,14 +144,28 @@ export function getCashierConfig(): ICashierConfig { } // Customer data from URL (support both new 'userId' and old 'customer_id' format) - const customer: Partial = {}; - // TODO: remove this default value - const customerId = - // params.get('customer_id') || userId || - '12345'; - + // Start with postMessage customer if available, otherwise create new object + const customer: Partial = postMessageCustomer ? { ...postMessageCustomer } : {}; + + const customerId = params.get('customer_id') || userId; if (customerId) customer.id = customerId; + // Parse additional customer fields from URL params (only if not already set from postMessage) + if (!customer.first_name) { + const firstName = params.get('customer_first_name') || params.get('first_name'); + if (firstName) customer.first_name = firstName; + } + + if (!customer.last_name) { + const lastName = params.get('customer_last_name') || params.get('last_name'); + if (lastName) customer.last_name = lastName; + } + + if (!customer.email) { + const email = params.get('customer_email') || params.get('email'); + if (email) customer.email = email; + } + if (Object.keys(customer).length > 0) { config.customer = customer; }