import mpMastercard from '../assets/img/mp_mastercard.png'; import mpVisa from '../assets/img/mp_visa.png'; import mpAmex from '../assets/img/mp_amex.jpg'; import mpTroy from '../assets/img/mp_troy.png'; import mpOther from '../assets/img/mp_other.png'; export const formatCardNumber = (value: string): string => { const cleanValue = value.replace(/\D/g, ''); const formatted = cleanValue.replace(/(\d{4})(?=\d)/g, '$1 '); return formatted.substring(0, 23); }; export const formatExpiryDate = (value: string): string => { const cleanValue = value.replace(/\D/g, ''); if (cleanValue.length >= 2) { return `${cleanValue.substring(0, 2)}/${cleanValue.substring(2, 4)}`; } return cleanValue; }; export const formatCVV = (value: string): string => { return value.replace(/\D/g, '').substring(0, 4); }; export const detectCardType = (cardNumber: string): string => { const cleanNumber = cardNumber.replace(/\D/g, ''); if (/^4/.test(cleanNumber)) { return 'visa'; } if (/^5[1-5]/.test(cleanNumber) || /^2[2-7]/.test(cleanNumber)) { return 'mastercard'; } if (/^3[47]/.test(cleanNumber)) { return 'amex'; } if (/^6(?:011|5)/.test(cleanNumber)) { return 'discover'; } if (/^9792/.test(cleanNumber)) { return 'troy'; } return 'unknown'; }; export const getCvcLength = (cardType: string): number => { return cardType === 'amex' ? 4 : 3; }; export const maskCardNumber = (cardNumber: string): string => { const cleanNumber = cardNumber.replace(/\D/g, ''); if (cleanNumber.length < 4) return cardNumber; const lastFour = cleanNumber.slice(-4); const masked = '*'.repeat(cleanNumber.length - 4); return `${masked}${lastFour}`.replace(/(.{4})/g, '$1 ').trim(); }; export const validateCardNumber = (cardNumber: string): boolean => { const cleanNumber = cardNumber.replace(/\D/g, ''); if (cleanNumber.length < 13 || cleanNumber.length > 19) { return false; } let sum = 0; let isEven = false; for (let i = cleanNumber.length - 1; i >= 0; i--) { let digit = parseInt(cleanNumber.charAt(i), 10); if (isEven) { digit *= 2; if (digit > 9) { digit -= 9; } } sum += digit; isEven = !isEven; } return sum % 10 === 0; }; export const getCardBIN = (cardNumber: string): string => { const cleanNumber = cardNumber.replace(/\D/g, ''); return cleanNumber.substring(0, 6); }; export const getCardIcon = (cardBin: string) => { if (cardBin.startsWith('34') || cardBin.startsWith('37')) { return mpAmex; } if (cardBin.startsWith('9792')) { return mpTroy; } const bin2 = parseInt(cardBin.slice(0, 2)); const bin4 = parseInt(cardBin.slice(0, 4)); if ((bin2 >= 51 && bin2 <= 55) || (bin4 >= 2221 && bin4 <= 2720)) { return mpMastercard; } if (cardBin.startsWith('4')) { return mpVisa; } return mpOther; };