@takentrade/takentrade-libs
Version:
TakeNTrade shared libraries
188 lines (187 loc) • 6 kB
JavaScript
;
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;