const Utils = {
formatPrice(amount) {
return amount.toLocaleString(CONFIG.LOCALE, {
style: 'currency',
currency: CONFIG.CURRENCY
});
},
generateId() {
return Date.now().toString(36) + Math.random().toString(36).substr(2);
},
debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
},
showLoading() {
State.isLoading = true;
document.getElementById('loadingSpinner').style.display = 'flex';
},
hideLoading() {
State.isLoading = false;
document.getElementById('loadingSpinner').style.display = 'none';
},
validatePhone(phone) {
return /^[0-9]{10}$/.test(phone);
},
validateEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
},
sanitizeHTML(str) {
const div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
},
getFormData(formElement) {
const formData = new FormData(formElement);
const data = {};
for (let [key, value] of formData.entries()) {
data[key] = value;
}
return data;
},
scrollTo(element, offset = 0) {
const elementPosition = element.getBoundingClientRect().top;
const offsetPosition = elementPosition + window.pageYOffset - offset;
window.scrollTo({
top: offsetPosition,
behavior: 'smooth'
});
}
};
// Storage Helper
const Storage = {
save(key, data) {
try {
localStorage.setItem(key, JSON.stringify(data));
return true;
} catch (error) {
console.error('Storage save error:', error);
return false;
}
},
load(key) {
try {
const data = localStorage.getItem(key);
return data ? JSON.parse(data) : null;
} catch (error) {
console.error('Storage load error:', error);
return null;
}
},
remove(key) {
try {
localStorage.removeItem(key);
return true;
} catch (error) {
console.error('Storage remove error:', error);
return false;
}
},
clear() {
try {
localStorage.clear();
return true;
} catch (error) {
console.error('Storage clear error:', error);
return false;
}
}
};