2025-08-17 09:03:28 -06:00

197 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Authentication related functions
import { showStatus } from './utils.js';
export let currentUser = null;
export async function checkAuth() {
try {
const response = await fetch('/api/auth/check');
const data = await response.json();
// Check if user has expired
if (data.expired) {
showStatus('Account has expired. Please contact an administrator.', 'error');
// Immediate redirect for expired users
window.location.href = '/login.html?expired=true';
throw new Error('Account expired');
}
if (!data.authenticated) {
// Immediate redirect for unauthenticated users
window.location.href = '/login.html';
throw new Error('Not authenticated');
}
currentUser = data.user;
currentUser.userType = data.user.userType || 'user'; // Ensure userType is set
// Authentication successful - show the app
document.body.classList.remove('authenticating');
document.body.classList.add('authenticated');
document.getElementById('app').classList.remove('app-hidden');
updateUserInterface();
} catch (error) {
console.error('Auth check failed:', error);
// Always redirect immediately on any auth failure
window.location.href = '/login.html';
throw error;
}
}
export function updateUserInterface() {
if (!currentUser) return;
/* NEW add a body class we can target with CSS */
document.body.classList.toggle('temp-user', currentUser.userType === 'temp');
document.body.classList.toggle('admin-user', currentUser.isAdmin === true);
// ----- existing code that manipulates DOM -----
// Update user email in both desktop and mobile
const userEmailElement = document.getElementById('user-email');
const mobileUserEmailElement = document.getElementById('mobile-user-email');
if (userEmailElement) {
userEmailElement.textContent = currentUser.email;
}
if (mobileUserEmailElement) {
mobileUserEmailElement.textContent = currentUser.email;
}
// Control visibility of homepage link for admins
const homepageLink = document.getElementById('homepage-link');
if (homepageLink) {
if (currentUser.isAdmin) {
homepageLink.style.display = 'inline-flex';
} else {
homepageLink.style.display = 'none';
}
}
// Get all shifts links/buttons
const shiftsLinks = document.querySelectorAll('a[href="/shifts.html"]');
if (currentUser.userType === 'temp') {
// If user is temp, hide all shifts-related elements
shiftsLinks.forEach(link => {
const desktopButton = link.closest('.btn');
const mobileItem = link.closest('.mobile-dropdown-item');
if (desktopButton) {
desktopButton.classList.add('temp-restricted');
}
if (mobileItem) {
mobileItem.classList.add('temp-restricted');
}
});
} else {
// If user is NOT temp, ensure all shifts-related elements are visible
shiftsLinks.forEach(link => {
const desktopButton = link.closest('.btn');
const mobileItem = link.closest('.mobile-dropdown-item');
if (desktopButton) {
desktopButton.classList.remove('temp-restricted');
}
if (mobileItem) {
mobileItem.classList.remove('temp-restricted');
}
});
}
// Add temp user indicator for temp users
if (currentUser.userType === 'temp') {
// Hide user profile links
const userLinks = document.querySelectorAll('a[href="/user.html"]');
userLinks.forEach(link => link.style.display = 'none');
// Add temp user indicator
if (userEmailElement) {
userEmailElement.innerHTML = `${currentUser.email} <span class="badge temp-badge">Temp</span>`;
}
if (mobileUserEmailElement) {
mobileUserEmailElement.innerHTML = `${currentUser.email} <span class="badge temp-badge">Temp</span>`;
}
}
// Add admin link if user is admin
if (currentUser.isAdmin) {
addAdminLinks();
}
}
function addAdminLinks() {
// Add admin link to desktop header
const headerActions = document.querySelector('.header-actions');
if (headerActions) {
const adminLink = document.createElement('a');
adminLink.href = '/admin.html';
adminLink.className = 'btn btn-secondary';
adminLink.textContent = '⚙️ Admin';
headerActions.insertBefore(adminLink, headerActions.firstChild);
}
// Add admin link to mobile dropdown
const mobileDropdownContent = document.getElementById('mobile-dropdown-content');
if (mobileDropdownContent) {
// Check if admin link already exists
if (!mobileDropdownContent.querySelector('.admin-link-mobile')) {
const adminItem = document.createElement('div');
adminItem.className = 'mobile-dropdown-item admin-link-mobile';
const adminLink = document.createElement('a');
adminLink.href = '/admin.html';
adminLink.style.color = 'inherit';
adminLink.style.textDecoration = 'none';
adminLink.textContent = '⚙️ Admin Panel';
adminItem.appendChild(adminLink);
// Insert admin link at the top of the dropdown
if (mobileDropdownContent.firstChild) {
mobileDropdownContent.insertBefore(adminItem, mobileDropdownContent.firstChild);
} else {
mobileDropdownContent.appendChild(adminItem);
}
}
// Add homepage link for mobile dropdown if it doesn't exist
if (!mobileDropdownContent.querySelector('.homepage-link-mobile')) {
const homepageItem = document.createElement('div');
homepageItem.className = 'mobile-dropdown-item homepage-link-mobile';
const homepageLink = document.createElement('a');
homepageLink.href = '#'; // Or the correct link for homepage
homepageLink.id = 'mobile-homepage-link';
homepageLink.style.color = 'inherit';
homepageLink.style.textDecoration = 'none';
homepageLink.textContent = '🖥️ Homepage';
homepageItem.appendChild(homepageLink);
// Insert after the admin link
const adminLink = mobileDropdownContent.querySelector('.admin-link-mobile');
if (adminLink && adminLink.nextSibling) {
mobileDropdownContent.insertBefore(homepageItem, adminLink.nextSibling);
} else if (adminLink) {
mobileDropdownContent.appendChild(homepageItem);
} else if (mobileDropdownContent.firstChild) {
mobileDropdownContent.insertBefore(homepageItem, mobileDropdownContent.firstChild);
} else {
mobileDropdownContent.appendChild(homepageItem);
}
// Add event listener for mobile homepage link
const mobileHomepageLink = document.getElementById('mobile-homepage-link');
const desktopHomepageLink = document.getElementById('homepage-link');
if (mobileHomepageLink && desktopHomepageLink) {
mobileHomepageLink.addEventListener('click', (e) => {
e.preventDefault();
desktopHomepageLink.click();
});
}
}
}
}