Update site: auth fixes, new admin pages, payment flow, membership renewal, helpers
This commit is contained in:
@@ -19,6 +19,48 @@ if (!isset($_SESSION['updates_modal_shown'])) {
|
||||
$showUpdatesModal = false;
|
||||
}
|
||||
|
||||
// Show renew membership modal for logged-in users and where membership_fees payment_status is not PENDING RENEWAL. only show once per session
|
||||
$showRenewModal = isset($_SESSION['user_id']) ? true : false;
|
||||
if ($showRenewModal) {
|
||||
if (!isset($_SESSION['renew_modal_shown'])) {
|
||||
$_SESSION['renew_modal_shown'] = true;
|
||||
} else {
|
||||
$showRenewModal = false;
|
||||
}
|
||||
|
||||
$user_id = $_SESSION['user_id'];
|
||||
|
||||
// Ensure we have a DB connection
|
||||
if (!isset($conn) || $conn === null) {
|
||||
$showRenewModal = false;
|
||||
} else {
|
||||
$stmt = $conn->prepare("SELECT payment_status FROM membership_fees WHERE user_id = ? LIMIT 1");
|
||||
$stmt->bind_param("i", $user_id);
|
||||
$stmt->execute();
|
||||
// store_result so we can check num_rows
|
||||
$stmt->store_result();
|
||||
|
||||
// If there's no membership_fees record for this user, don't show the renew modal
|
||||
if ($stmt->num_rows === 0) {
|
||||
$showRenewModal = false;
|
||||
} else {
|
||||
$stmt->bind_result($payment_status);
|
||||
$stmt->fetch();
|
||||
|
||||
if ($payment_status === 'PENDING RENEWAL') {
|
||||
$showRenewModal = false;
|
||||
}
|
||||
if (isMembershipExpiringSoon($user_id)) {
|
||||
$showRenewModal = true;
|
||||
} else {
|
||||
$showRenewModal = false;
|
||||
}
|
||||
}
|
||||
|
||||
$stmt->close();
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_SESSION['user_id']) && isset($conn) && $conn !== null) {
|
||||
$userId = $_SESSION['user_id'];
|
||||
$stmt = $conn->prepare("SELECT user_id FROM membership_application WHERE user_id = ? AND accept_indemnity = 0 LIMIT 1");
|
||||
@@ -69,7 +111,7 @@ if (!empty($bannerImages)) {
|
||||
<div style="padding-top: 50px; padding-bottom: 50px;">
|
||||
<img style="width: 250px; margin-bottom: 20px;" src="assets/images/logos/weblogo2.png" alt="Logo">
|
||||
<h1 class="hero-title" data-aos="flip-up" data-aos-delay="50" data-aos-duration="1500" data-aos-offset="50">
|
||||
Welcome to<br>the 4 Wheel Drive Club<br>of Southern Africa
|
||||
Welcome to<br>the Four Wheel Drive Club<br>of Southern Africa
|
||||
</h1>
|
||||
<a href="membership.php" class="theme-btn style-two bgc-secondary" style="margin-top: 20px; background-color: #e90000; padding: 10px 20px; color: white; text-decoration: none; border-radius: 25px;">
|
||||
<span data-hover="Become a Member">Become a Member</span>
|
||||
@@ -159,8 +201,6 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
|
||||
<!-- About Us Area start -->
|
||||
<section class="about-us-area py-100 rpb-90 rel z-1">
|
||||
<div class="container">
|
||||
@@ -284,7 +324,6 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
</section>
|
||||
<!-- Features Area end -->
|
||||
|
||||
|
||||
<!-- Hotel Area start -->
|
||||
<section class="hotel-area bgc-black py-100 rel z-1">
|
||||
<div class="container-fluid">
|
||||
@@ -657,34 +696,72 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
const modal = document.getElementById('updatesModal');
|
||||
const closeBtn = document.querySelector('.updates-modal-close');
|
||||
const showModal = <?php echo $showUpdatesModal ? 'true' : 'false'; ?>;
|
||||
|
||||
if (showModal) {
|
||||
// Show modal after a short delay for better UX
|
||||
const showRenewModal = <?php echo $showRenewModal ? 'true' : 'false'; ?>;
|
||||
|
||||
if (showModal && modal) {
|
||||
// Show updates modal after a short delay for better UX
|
||||
setTimeout(function() {
|
||||
modal.style.display = 'flex';
|
||||
}, 500);
|
||||
}
|
||||
|
||||
// Close modal when X is clicked
|
||||
closeBtn.addEventListener('click', function() {
|
||||
modal.style.display = 'none';
|
||||
});
|
||||
|
||||
// Close modal when clicking outside the modal content
|
||||
modal.addEventListener('click', function(event) {
|
||||
if (event.target === modal) {
|
||||
modal.style.display = 'none';
|
||||
|
||||
// Close updates modal when X is clicked
|
||||
if (closeBtn) {
|
||||
closeBtn.addEventListener('click', function() {
|
||||
if (modal) modal.style.display = 'none';
|
||||
});
|
||||
}
|
||||
|
||||
// Close updates modal when clicking outside the modal content
|
||||
if (modal) {
|
||||
modal.addEventListener('click', function(event) {
|
||||
if (event.target === modal) {
|
||||
modal.style.display = 'none';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Show renew membership Bootstrap modal for logged-in users
|
||||
try {
|
||||
const renewModalEl = document.getElementById('renewModal');
|
||||
if (showRenewModal && renewModalEl && typeof bootstrap !== 'undefined') {
|
||||
setTimeout(function() {
|
||||
const renewModal = new bootstrap.Modal(renewModalEl);
|
||||
renewModal.show();
|
||||
}, 700);
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
console.warn('Renew modal show failed', e);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- Updates Modal -->
|
||||
<!-- Renew Membership Modal (shown to logged-in users) -->
|
||||
<div class="modal fade" id="renewModal" tabindex="-1" aria-labelledby="renewModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<!-- <div class="modal-header bg-secondary text-white">
|
||||
<h5 class="modal-title" id="renewModalLabel">Membership Renewal Reminder</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div> -->
|
||||
<div class="modal-body">
|
||||
Your membership will be expiring soon. Click below to renew now.
|
||||
<a style="width:100%; display:block;" href="renewal_payment" class="theme-btn style-two style-three mt-3">Renew Now</a>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" style="width:100%; display:block;" class="theme-btn" data-bs-dismiss="modal">Remind Me Later</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Updates Modal -->
|
||||
<div id="updatesModal" class="updates-modal">
|
||||
<div class="updates-modal-content">
|
||||
<span class="updates-modal-close">×</span>
|
||||
<div class="updates-modal-header">
|
||||
<h2>✨ What's New</h2>
|
||||
<h2>What's New on 4WDCSA.co.za</h2>
|
||||
</div>
|
||||
<div class="updates-modal-body">
|
||||
<div class="update-item">
|
||||
@@ -728,6 +805,7 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 20px;
|
||||
animation: fadeIn 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
@@ -749,6 +827,10 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
|
||||
animation: slideDown 0.3s ease-out;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
/* Limit height so the modal never exceeds the viewport and allow internal scrolling */
|
||||
max-height: calc(100vh - 80px);
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
@keyframes slideDown {
|
||||
@@ -834,8 +916,17 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.updates-modal {
|
||||
/* Align to top on small screens so content's top (and close button) is visible */
|
||||
align-items: flex-start;
|
||||
padding-top: 18px;
|
||||
}
|
||||
|
||||
.updates-modal-content {
|
||||
padding: 30px 20px;
|
||||
padding: 20px;
|
||||
max-width: 92%;
|
||||
width: 92%;
|
||||
max-height: calc(100vh - 36px);
|
||||
}
|
||||
|
||||
.updates-modal-header h2 {
|
||||
|
||||
Reference in New Issue
Block a user