246 lines
7.0 KiB
JavaScript
246 lines
7.0 KiB
JavaScript
import dns from "node:dns"
|
|
import * as XLSX from 'xlsx';
|
|
import CryptoJS from "crypto-js";
|
|
|
|
|
|
export const generateSerialNumber = (index, currentPage = 1, pageSize = 1) => {
|
|
return (currentPage - 1) * pageSize + (index + 1);
|
|
};
|
|
|
|
export function getTomorrowDate() {
|
|
const today = new Date();
|
|
const tomorrow = new Date(today);
|
|
tomorrow.setDate(today.getDate() + 1);
|
|
|
|
// Format the date as YYYY-MM-DD (ISO 8601)
|
|
return tomorrow.toISOString().split('T')[0];
|
|
}
|
|
|
|
|
|
export function removeTrailingZeros(value) {
|
|
// Convert the value to a number and then to a string
|
|
let number = parseFloat(value);
|
|
let result = number.toString();
|
|
|
|
// Check if the result contains a decimal point
|
|
if (result.includes('.')) {
|
|
// Remove trailing zeros if the decimal part is 0 or 00
|
|
result = result.replace(/(\.\d*?)0+$/, '$1'); // Remove trailing zeros
|
|
result = result.replace(/\.$/, ''); // Remove the decimal point if it's the last character
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
export function getCountdownTimer(utcDateString) {
|
|
// Parse the UTC datetime string into a Date object
|
|
const targetDate = new Date(utcDateString);
|
|
const now = new Date();
|
|
|
|
// Calculate the difference in milliseconds
|
|
const difference = targetDate - now;
|
|
|
|
if (difference <= 0) {
|
|
return 'The time has passed or is now!';
|
|
}
|
|
|
|
// Convert the difference from milliseconds to a more readable format
|
|
const seconds = Math.floor(difference / 1000);
|
|
const minutes = Math.floor(seconds / 60);
|
|
const hours = Math.floor(minutes / 60);
|
|
const days = Math.floor(hours / 24);
|
|
|
|
const remainingDays = days;
|
|
const remainingHours = hours % 24;
|
|
const remainingMinutes = minutes % 60;
|
|
const remainingSeconds = seconds % 60;
|
|
|
|
return `${remainingDays === 0 ? "" : remainingDays + "d"} ${remainingHours === 0 ? "" : remainingHours + "h"} ${remainingMinutes}m ${remainingSeconds}s `;
|
|
}
|
|
|
|
|
|
export function bytesToMB(bytes) {
|
|
return (bytes / (1024 * 1024)).toFixed(2); // Convert bytes to MB and limit to 2 decimal places
|
|
}
|
|
|
|
|
|
export function startCountdown(utcDateString) {
|
|
// Function to update the countdown
|
|
const updateCountdown = () => {
|
|
const countdown = getCountdownTimer(utcDateString);
|
|
console.log(countdown);
|
|
};
|
|
|
|
// Update countdown immediately
|
|
updateCountdown();
|
|
|
|
// Set up interval to update countdown every minute (60000 milliseconds)
|
|
setInterval(updateCountdown, 60000);
|
|
}
|
|
|
|
export const getFileNameFromPath = (filePath) => {
|
|
const parts = filePath?.split("/");
|
|
return parts?.[parts?.length - 1];
|
|
};
|
|
|
|
export function debounce(func, delay) {
|
|
let debounceTimer;
|
|
return function (...args) {
|
|
clearTimeout(debounceTimer);
|
|
debounceTimer = setTimeout(() => func.apply(this, args), delay);
|
|
};
|
|
}
|
|
|
|
|
|
|
|
async function resolveMx(domain) {
|
|
return new Promise((resolve, reject) => {
|
|
dns.resolveMx(domain, (err, mxRecords) => {
|
|
if (err) {
|
|
reject(err);
|
|
return;
|
|
}
|
|
const addresses = mxRecords.map((mxRecord) => mxRecord.exchange);
|
|
resolve(addresses);
|
|
});
|
|
});
|
|
}
|
|
// Async function to check email address validity
|
|
export async function checkEmailValidity(email) {
|
|
try {
|
|
const domain = email?.split('@')[1];
|
|
const addresses = await resolveMx(domain, 'MX');
|
|
console.log(addresses);
|
|
|
|
if (addresses && addresses?.length > 0) {
|
|
return true;
|
|
}
|
|
return false; // No MX record exists
|
|
} catch (err) {
|
|
console.log(err);
|
|
|
|
return false; // Error occurred
|
|
}
|
|
}
|
|
|
|
|
|
// Function to convert timestamp to readable date format in Gulf timezone
|
|
export function formatTimestampInGulfTimezone(timestamp) {
|
|
const date = new Date(timestamp);
|
|
const options = {
|
|
year: 'numeric',
|
|
month: 'long',
|
|
day: 'numeric',
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
second: '2-digit',
|
|
timeZone: 'Asia/Dubai', // Gulf Standard Time (GST) timezone
|
|
timeZoneName: 'short'
|
|
};
|
|
return date.toLocaleDateString('en-GB', options);
|
|
}
|
|
|
|
|
|
export function formatDate(dateString) {
|
|
const options = { year: 'numeric', month: 'short', day: 'numeric' };
|
|
const date = new Date(dateString);
|
|
return date.toLocaleDateString('en-US', options);
|
|
}
|
|
|
|
export function calculatePercentage(part, total) {
|
|
if (total === 0) {
|
|
return 0; // To avoid division by zero
|
|
}
|
|
return (part / total) * 100;
|
|
}
|
|
|
|
|
|
|
|
const getNestedValue = (obj, key) => {
|
|
return key.split('.').reduce((value, part) => {
|
|
return value && value[part] ? value[part] : null;
|
|
}, obj);
|
|
};
|
|
|
|
export const exportToExcel = (data, headers) => {
|
|
const flattenedData = data.map((item) => {
|
|
const newItem = {};
|
|
|
|
// Loop through customHeaders and get the correct values
|
|
headers.forEach((header) => {
|
|
newItem[header.label] = getNestedValue(item, header.key); // Use the helper function
|
|
});
|
|
|
|
return newItem; // Return the new flat object
|
|
});
|
|
|
|
// Now pass flattenedData to your Excel library to generate the file
|
|
// Assuming you're using a library like `xlsx` for this part:
|
|
|
|
const worksheet = XLSX.utils.json_to_sheet(flattenedData);
|
|
const workbook = XLSX.utils.book_new();
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
|
|
|
|
// Generate file
|
|
XLSX.writeFile(workbook, "exported_data.xlsx");
|
|
};
|
|
|
|
|
|
export const exportToExcelNew = (data, fileName = "exported_data.xlsx") => {
|
|
console.log("Data to export:", data); // Log the data for debugging
|
|
|
|
// Ensure the data is not empty
|
|
if (!data || data.length === 0) {
|
|
console.error("No data provided for export.");
|
|
return;
|
|
}
|
|
|
|
// Convert the data to a worksheet
|
|
const worksheet = XLSX.utils.json_to_sheet(data);
|
|
|
|
// Create a new workbook and append the worksheet to it
|
|
const workbook = XLSX.utils.book_new();
|
|
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
|
|
|
|
// Ensure file has a valid .xlsx extension
|
|
const fileWithExtension = fileName.endsWith(".xlsx") ? fileName : `${fileName}.xlsx`;
|
|
|
|
// Write the workbook to a file
|
|
XLSX.writeFile(workbook, fileWithExtension);
|
|
};
|
|
|
|
|
|
export function formatDateToYYYYMMDD(dateString) {
|
|
const date = new Date(dateString);
|
|
|
|
// Extract individual date components
|
|
const year = date.getFullYear();
|
|
const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are 0-based
|
|
const day = String(date.getDate()).padStart(2, '0');
|
|
|
|
// Combine the formatted parts
|
|
return `${year}-${month}-${day}`;
|
|
}
|
|
|
|
|
|
// Encrypt a string
|
|
export const encryptString = (text) => {
|
|
const ciphertext = CryptoJS.AES.encrypt(text, import.meta.env.VITE_ROLE_ENCRYPTION_KEY).toString();
|
|
return ciphertext;
|
|
};
|
|
|
|
// Decrypt a string
|
|
export const decryptString = (ciphertext) => {
|
|
const bytes = CryptoJS.AES.decrypt(ciphertext, import.meta.env.VITE_ROLE_ENCRYPTION_KEY);
|
|
const originalText = bytes.toString(CryptoJS.enc.Utf8);
|
|
return originalText;
|
|
};
|
|
|
|
export const SUPER_ADMIN_ID = Number(import.meta.env.VITE_SUPER_ADMIN_ID) || 1
|
|
export const MAKER_ID = import.meta.env.VITE_MAKER_ID || 1
|
|
export const CHECKER_ID = import.meta.env.VITE_CHECKER_ID || 2
|
|
|
|
export const isMaker = (role = decryptString(localStorage?.getItem("role"))) => role === import.meta.env.VITE_MAKER;
|
|
export const isChecker = (role = decryptString(localStorage?.getItem("role"))) => role === import.meta.env.VITE_CHECKER;
|