73 lines
2.9 KiB
JavaScript
73 lines
2.9 KiB
JavaScript
export function validateAgeLive(inputEl, minAge = 5, maxAge = 18) {
|
|
const dob = inputEl.value.trim();
|
|
if (!dob) return false;
|
|
|
|
const birthDate = normalize(new Date(dob));
|
|
if (isNaN(birthDate.getTime())) {
|
|
showFeedback(inputEl, false, "Invalid date format (Use YYYY-MM-DD)");
|
|
return false;
|
|
}
|
|
|
|
const registrationAgeDeadline = window.appConfig?.registrationAgeDeadline;
|
|
const deadline = normalize(new Date(registrationAgeDeadline || new Date()));
|
|
|
|
// Calculate boundaries - add one day to effectively make the age calculation more lenient
|
|
const adjustedDeadline = new Date(deadline);
|
|
adjustedDeadline.setDate(adjustedDeadline.getDate() + 1);
|
|
|
|
const minBirthDate = new Date(Date.UTC(adjustedDeadline.getFullYear() - maxAge, adjustedDeadline.getMonth(), adjustedDeadline.getDate())); // oldest
|
|
const maxBirthDate = new Date(Date.UTC(adjustedDeadline.getFullYear() - minAge, adjustedDeadline.getMonth(), adjustedDeadline.getDate())); // youngest
|
|
|
|
const isValidAge = birthDate >= minBirthDate && birthDate <= maxBirthDate;
|
|
|
|
// Format date as MM-DD-YYYY for error message (use original deadline, not adjusted)
|
|
const formatDateMMDDYYYY = (dateStr) => {
|
|
if (!dateStr) return dateStr;
|
|
// Parse as UTC to avoid timezone issues that could shift the date
|
|
const date = new Date(dateStr + 'T00:00:00.000Z');
|
|
if (isNaN(date.getTime())) return dateStr;
|
|
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
const year = date.getUTCFullYear();
|
|
return `${month}-${day}-${year}`;
|
|
};
|
|
|
|
const errorMessage = isValidAge
|
|
? ""
|
|
: `Must be ${minAge}-${maxAge} years old by ${formatDateMMDDYYYY(registrationAgeDeadline)}.`;
|
|
|
|
showFeedback(inputEl, isValidAge, errorMessage);
|
|
return isValidAge;
|
|
}
|
|
|
|
function normalize(date) {
|
|
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
|
|
}
|
|
|
|
|
|
// Helper function (unchanged)
|
|
function showFeedback(inputEl, isValid, message) {
|
|
inputEl.classList.toggle("is-invalid", !isValid);
|
|
const feedbackEl = inputEl.nextElementSibling || document.createElement("div");
|
|
feedbackEl.textContent = message;
|
|
feedbackEl.className = `invalid-feedback ${isValid ? "d-none" : ""}`;
|
|
inputEl.parentNode.appendChild(feedbackEl);
|
|
}
|
|
|
|
// Set max birthdate (2025 - minAge)
|
|
window.addEventListener("DOMContentLoaded", () => {
|
|
const minAge = 5; // Must match validateAgeLive's default
|
|
const deadline = window.appConfig?.registrationAgeDeadline
|
|
? new Date(window.appConfig.registrationAgeDeadline)
|
|
: new Date();
|
|
const maxBirthYear = deadline.getFullYear() - minAge;
|
|
const maxDateStr = `${maxBirthYear}-12-31`; // Latest allowed birthdate
|
|
|
|
document.querySelectorAll(".dob-input").forEach((input) => {
|
|
input.setAttribute("max", maxDateStr);
|
|
input.setAttribute(
|
|
"aria-label",
|
|
`Born before ${maxBirthYear + 1} (${minAge}+ years by ${deadline.getFullYear()})`
|
|
);
|
|
});
|
|
}); |