/** * Centralized Mapbox Configuration * * This configuration ensures all globe visualizations use a valid token * and provides helpful validation and debugging. */ export const MAPBOX_CONFIG = { // Primary working token (from globe_14) accessToken: 'pk.eyJ1IjoibGludXhpc2Nvb2wiLCJhIjoiY2w3ajM1MnliMDV4NDNvb2J5c3V5dzRxZyJ9.wJukH5hVSiO74GM_VSJR3Q', /** * Validate that the token is properly configured * @returns {boolean} True if token is valid, false otherwise */ validateToken() { if (!this.accessToken) { console.error('❌ MAPBOX TOKEN ERROR: No token configured!'); console.error('Please set MAPBOX_CONFIG.accessToken in mapbox-config.js'); return false; } // Check for placeholder tokens const placeholders = ['yourtokenstring', 'YOUR_TOKEN', 'yourtoken', 'yourusername']; const hasPlaceholder = placeholders.some(p => this.accessToken.includes(p)); if (hasPlaceholder) { console.error('❌ MAPBOX TOKEN ERROR: Invalid placeholder token detected!'); console.error('Current token:', this.accessToken); console.error('This token will not work. Please use a real Mapbox access token.'); console.error('Get a free token at: https://account.mapbox.com/'); return false; } // Check token format (should start with pk.) if (!this.accessToken.startsWith('pk.')) { console.warn('⚠️ MAPBOX TOKEN WARNING: Token does not start with "pk."'); console.warn('This may not be a valid public token.'); } console.log('✅ Mapbox token validated successfully'); return true; }, /** * Apply token to Mapbox GL JS * @returns {boolean} True if successful, false if validation failed */ applyToken() { if (!this.validateToken()) { // Show user-friendly error in the page this.showTokenError(); return false; } if (typeof mapboxgl !== 'undefined') { mapboxgl.accessToken = this.accessToken; console.log('✅ Mapbox token applied to mapboxgl'); return true; } else { console.error('❌ ERROR: mapboxgl library not loaded!'); console.error('Make sure Mapbox GL JS script is loaded before this configuration.'); return false; } }, /** * Show a user-friendly error message on the page */ showTokenError() { const errorDiv = document.createElement('div'); errorDiv.id = 'mapbox-token-error'; errorDiv.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(220, 38, 38, 0.95); color: white; padding: 30px 40px; border-radius: 12px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5); max-width: 500px; z-index: 10000; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; `; errorDiv.innerHTML = `

⚠️ Mapbox Token Error

This visualization requires a valid Mapbox access token to display the globe.

To fix this:
1. Visit account.mapbox.com
2. Create a free account (50,000 map loads/month)
3. Copy your access token
4. Update shared/mapbox-config.js

`; document.body.appendChild(errorDiv); }, /** * Common map initialization options for globe visualizations */ defaultMapOptions: { projection: 'globe', zoom: 1.5, center: [20, 20], pitch: 0, attributionControl: true }, /** * Get map options merged with defaults * @param {Object} customOptions - Custom options to override defaults * @returns {Object} Merged map options */ getMapOptions(customOptions = {}) { return { ...this.defaultMapOptions, ...customOptions, style: customOptions.style || 'mapbox://styles/mapbox/dark-v11' }; } }; /** * Auto-apply token when module loads (if mapboxgl is available) */ if (typeof mapboxgl !== 'undefined') { MAPBOX_CONFIG.applyToken(); } // Also make available globally for non-module scripts if (typeof window !== 'undefined') { window.MAPBOX_CONFIG = MAPBOX_CONFIG; }