import { CALLBACK_PATHS, PAYMENT_CONSTANTS } from './payment-constants'; import type { PaymentProcessRequest, TransactionType, DirectPaymentRequest } from '../types/payment.types'; import type { MasterpassRestTokenData } from '../redux/reducer'; export const isTokenExpired = ( tokenData: MasterpassRestTokenData | null, bufferSeconds = 60 ): boolean => { if (!tokenData?.exp) return true; const bufferMs = bufferSeconds * 1000; return Date.now() >= tokenData.exp * 1000 - bufferMs; }; const PAYMENT_PENDING_KEY = 'masterpass_rest_payment_pending'; const PAYMENT_PENDING_TTL_MS = 30 * 60 * 1000; export interface PaymentPendingRecord { orderNo: string | null; startedAt: number; } export const setPaymentPending = (orderNo?: string | null): void => { try { window.sessionStorage.setItem( PAYMENT_PENDING_KEY, JSON.stringify({ orderNo: orderNo || null, startedAt: Date.now() }) ); } catch (error) { // sessionStorage may be unavailable (private mode, blocked storage) } }; export const getPaymentPending = (): PaymentPendingRecord | null => { try { const raw = window.sessionStorage.getItem(PAYMENT_PENDING_KEY); if (!raw) return null; const parsed = JSON.parse(raw) as PaymentPendingRecord; if ( !parsed?.startedAt || Date.now() - parsed.startedAt > PAYMENT_PENDING_TTL_MS ) { window.sessionStorage.removeItem(PAYMENT_PENDING_KEY); return null; } return parsed; } catch (error) { return null; } }; export const clearPaymentPending = (): void => { try { window.sessionStorage.removeItem(PAYMENT_PENDING_KEY); } catch (error) { // sessionStorage may be unavailable (private mode, blocked storage) } }; export const enhance3DSecureUrl = (originalUrl: string): string => { try { const baseUrl = window.location.origin; const url = new URL(originalUrl); url.searchParams.set('returnUrl', `${baseUrl}${CALLBACK_PATHS.RETURN}`); return url.toString(); } catch (error) { return originalUrl; } }; export const getTransactionType = (useThreeD: boolean): TransactionType => { return useThreeD ? 'PURCHASE_3D' : 'PURCHASE'; }; export const formatAmountForPayment = (amount: string): string => { return amount.replace('.', ''); }; export const createPaymentRequest = (params: { cvc: string; cardAlias: string; accountKey: string; amount: string; orderNo: string; currencyCode: string; installmentCount: number; authenticationMethod: string; secure3DModel: string; terminalGroupId: string; acquirerIcaNumber: string; additionalFields?: any; }): PaymentProcessRequest => { return { requestReferenceNo: params.orderNo, cvc: params.cvc, cardAlias: params.cardAlias, accountKey: params.accountKey, amount: formatAmountForPayment(params.amount), orderNo: params.orderNo, currencyCode: params.currencyCode, paymentType: PAYMENT_CONSTANTS.PAYMENT_CONFIG.PAYMENT_TYPE, acquirerIcaNumber: params.acquirerIcaNumber, installmentCount: params.installmentCount, authenticationMethod: params.authenticationMethod, secure3DModel: params.secure3DModel, terminalGroupId: params.terminalGroupId, additionalFields: params.additionalFields || {} }; }; export const createDirectPaymentRequest = (params: { cvc: string; cardNumber: string; cardHolderName: string; cardAlias: string; expiryDate: string; accountKey: string; amount: string; orderNo: string; currencyCode: string; installmentCount: number; authenticationMethod: string; secure3DModel: string; terminalGroupId: string; acquirerIcaNumber: string; additionalFields?: any; }): DirectPaymentRequest => { const timestamp = Date.now().toString().slice(-10); const random = Math.floor(Math.random() * 1000) .toString() .padStart(3, '0'); const requestReferenceNumber = `${timestamp}${random}`; const [month, year] = params.expiryDate.split('/'); const formattedExpiryDate = `${year}${month}`; return { requestReferenceNo: requestReferenceNumber, cvc: params.cvc, cardNumber: params.cardNumber, cardHolderName: params.cardHolderName, expiryDate: formattedExpiryDate, accountKey: params.accountKey, amount: formatAmountForPayment(params.amount), orderNo: params.orderNo, currencyCode: params.currencyCode, paymentType: PAYMENT_CONSTANTS.PAYMENT_CONFIG.PAYMENT_TYPE, acquirerIcaNumber: params.acquirerIcaNumber, installmentCount: params.installmentCount, authenticationMethod: params.authenticationMethod, secure3DModel: params.secure3DModel, terminalGroupId: params.terminalGroupId, additionalFields: params.additionalFields || {} }; };