/** * FLOCKRADAR - USER AUTHENTICATION & COMMUNITY STATE MANAGER * Waze-style driver profile, preferences, and crowdsourced reporting store. */ (function() { 'use strict'; const STORAGE_KEY_USER = 'flock_radar_user'; const STORAGE_KEY_REPORTS = 'flock_community_reports'; // Default Guest Profile const defaultUser = { isLoggedIn: false, username: 'Guest Driver', callsign: 'SCOUT-104', level: 1, points: 120, vehicle: 'Sedan (Silver)', soundEnabled: true, alertsMuted: false, reportsCount: 0 }; // State let currentUser = null; let communityReports = []; function init() { loadUser(); loadReports(); } function loadUser() { try { const stored = localStorage.getItem(STORAGE_KEY_USER); if (stored) { currentUser = JSON.parse(stored); } else { currentUser = { ...defaultUser }; } } catch (e) { currentUser = { ...defaultUser }; } } function saveUser() { try { localStorage.setItem(STORAGE_KEY_USER, JSON.stringify(currentUser)); window.dispatchEvent(new CustomEvent('flock_user_updated', { detail: currentUser })); } catch (e) { console.error('Failed to save user session', e); } } function login(username, vehicle, soundEnabled) { currentUser = { isLoggedIn: true, username: username || 'Citizen Scout', callsign: 'RADAR-' + Math.floor(100 + Math.random() * 900), level: 2, points: 250, vehicle: vehicle || 'Standard Vehicle', soundEnabled: soundEnabled !== false, alertsMuted: false, reportsCount: communityReports.length }; saveUser(); return currentUser; } function logout() { currentUser = { ...defaultUser }; saveUser(); } function loadReports() { try { const stored = localStorage.getItem(STORAGE_KEY_REPORTS); if (stored) { communityReports = JSON.parse(stored); } else { communityReports = []; } } catch (e) { communityReports = []; } } function saveReports() { try { localStorage.setItem(STORAGE_KEY_REPORTS, JSON.stringify(communityReports)); window.dispatchEvent(new CustomEvent('flock_reports_updated', { detail: communityReports })); } catch (e) { console.error('Failed to save community reports', e); } } function addReport(report) { const newReport = { id: 'rpt-' + Date.now(), lat: report.lat, lng: report.lng, type: report.type || 'Solar Pole Mount', intersection: report.intersection || 'Reported Location', notes: report.notes || 'Spotted by community driver', reportedBy: currentUser ? currentUser.username : 'Anonymous Scout', timestamp: new Date().toISOString(), confirmations: 1 }; communityReports.push(newReport); saveReports(); if (currentUser) { currentUser.points = (currentUser.points || 0) + 50; currentUser.reportsCount = (currentUser.reportsCount || 0) + 1; saveUser(); } return newReport; } function getUser() { if (!currentUser) loadUser(); return currentUser; } function getReports() { if (!communityReports) loadReports(); return communityReports; } // Export API to global scope window.FlockAuth = { init, getUser, login, logout, saveUser, getReports, addReport }; init(); })();