UNPKG

@takentrade/takentrade-libs

Version:
188 lines (187 loc) 6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatTransactionStatus = exports.toTitleCase = exports.truncateText = exports.formatFileSize = exports.formatPercentage = exports.formatRelativeTime = exports.formatDateTime = exports.formatDate = exports.maskEmail = exports.maskAccountNumber = exports.formatAccountNumber = exports.formatAmount = exports.formatCurrency = void 0; exports.toSmsSafeNigerianPhone = toSmsSafeNigerianPhone; /** * Formats currency (Naira) * 1234.56 → ₦1,234.56 */ const formatCurrency = (amount, currency = '₦', decimals = 2) => { const formatted = amount.toLocaleString('en-NG', { minimumFractionDigits: decimals, maximumFractionDigits: decimals, }); return `${currency}${formatted}`; }; exports.formatCurrency = formatCurrency; /** * Formats currency without symbol * 1234.56 → 1,234.56 */ const formatAmount = (amount, decimals = 2) => { return amount.toLocaleString('en-NG', { minimumFractionDigits: decimals, maximumFractionDigits: decimals, }); }; exports.formatAmount = formatAmount; /** * Formats account number for display * 0123456789 → 0123 4567 89 */ const formatAccountNumber = (accountNumber) => { if (accountNumber.length !== 10) return accountNumber; return `${accountNumber.substring(0, 4)} ${accountNumber.substring(4, 8)} ${accountNumber.substring(8)}`; }; exports.formatAccountNumber = formatAccountNumber; /** * Masks account number for security * 0123456789 → ****6789 */ const maskAccountNumber = (accountNumber) => { if (accountNumber.length < 4) return accountNumber; return '*'.repeat(accountNumber.length - 4) + accountNumber.slice(-4); }; exports.maskAccountNumber = maskAccountNumber; /** * Masks email for security * user@example.com → u***@example.com */ const maskEmail = (email) => { const [username, domain] = email.split('@'); if (!username || !domain) return email; const maskedUsername = username[0] + '*'.repeat(username.length - 1); return `${maskedUsername}@${domain}`; }; exports.maskEmail = maskEmail; /** * Formats date to Nigerian format * 2024-01-15 → 15/01/2024 */ const formatDate = (date) => { const d = new Date(date); const day = String(d.getDate()).padStart(2, '0'); const month = String(d.getMonth() + 1).padStart(2, '0'); const year = d.getFullYear(); return `${day}/${month}/${year}`; }; exports.formatDate = formatDate; /** * Formats date and time * → 15/01/2024 14:30 */ const formatDateTime = (date) => { const d = new Date(date); const dateStr = (0, exports.formatDate)(d); const hours = String(d.getHours()).padStart(2, '0'); const minutes = String(d.getMinutes()).padStart(2, '0'); return `${dateStr} ${hours}:${minutes}`; }; exports.formatDateTime = formatDateTime; /** * Formats relative time * → "2 hours ago", "3 days ago" */ const formatRelativeTime = (date) => { const d = new Date(date); const now = new Date(); const diffMs = now.getTime() - d.getTime(); const diffSecs = Math.floor(diffMs / 1000); const diffMins = Math.floor(diffSecs / 60); const diffHours = Math.floor(diffMins / 60); const diffDays = Math.floor(diffHours / 24); if (diffSecs < 60) return 'Just now'; if (diffMins < 60) return `${diffMins} minute${diffMins > 1 ? 's' : ''} ago`; if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`; if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`; return (0, exports.formatDate)(d); }; exports.formatRelativeTime = formatRelativeTime; /** * Formats percentage * 0.025 → 2.5% */ const formatPercentage = (value, decimals = 1) => { return `${(value * 100).toFixed(decimals)}%`; }; exports.formatPercentage = formatPercentage; /** * Formats file size * 1536 → 1.5 KB */ const formatFileSize = (bytes) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`; }; exports.formatFileSize = formatFileSize; /** * Truncates text with ellipsis * "Long text here" → "Long te..." */ const truncateText = (text, maxLength) => { if (text.length <= maxLength) return text; return text.substring(0, maxLength - 3) + '...'; }; exports.truncateText = truncateText; /** * Capitalizes first letter of each word * "john doe" → "John Doe" */ const toTitleCase = (text) => { return text .toLowerCase() .split(' ') .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) .join(' '); }; exports.toTitleCase = toTitleCase; /** * Formats transaction status for display */ /** * Normalizes a phone number to the international format for Nigeria (234...) * Handles formats like '0803...', '803...', '+234803...' */ function toSmsSafeNigerianPhone(phone) { let digits = `${phone}`.replace(/\D/g, '').trim(); if (digits === '') return ''; if (digits.startsWith('234') && digits.length === 13) { return digits; } if (digits.startsWith('0') && digits.length === 11) { return '234' + digits.slice(1); } if (digits.length === 10 && /^[789]/.test(digits)) { return '234' + digits; } if (digits.length >= 11 && !digits.startsWith('0') && !digits.startsWith('234')) { return digits; } return digits.startsWith('234') ? digits : '234' + digits; } const formatTransactionStatus = (status) => { const statusMap = { PENDING: 'Pending', SUCCESS: 'Successful', FAILED: 'Failed', REVERSED: 'Reversed', PROCESSING: 'Processing', }; return statusMap[status] || (0, exports.toTitleCase)(status); }; exports.formatTransactionStatus = formatTransactionStatus;