| import type { PanelConfig, MapLayers, DataSourceId } from '@/types'; |
| import { SITE_VARIANT } from './variant'; |
| |
| import { isDesktopRuntime } from '@/services/runtime'; |
| |
| import { getSecretState } from '@/services/runtime-config'; |
| |
| import { isEntitled } from '@/services/entitlements'; |
|
|
| const _desktop = isDesktopRuntime(); |
|
|
| |
| |
| |
| |
| |
| const IRAN_ATTACKS_ENABLED = typeof window !== 'undefined' && import.meta.env.VITE_ENABLE_IRAN_ATTACKS === 'true'; |
|
|
| |
| |
| |
| |
| |
| const FULL_PANELS: Record<string, PanelConfig> = { |
| map: { name: 'Global Map', enabled: true, priority: 1 }, |
| 'live-news': { name: 'Live News', enabled: true, priority: 1 }, |
| 'live-webcams': { name: 'Live Webcams', enabled: true, priority: 1 }, |
| 'windy-webcams': { name: 'Windy Live Webcam', enabled: false, priority: 2 }, |
| insights: { name: 'AI Insights', enabled: true, priority: 1 }, |
| 'threat-timeline': { name: 'Threat Timeline', enabled: true, priority: 1 }, |
| 'strategic-posture': { name: 'AI Strategic Posture', enabled: true, priority: 1 }, |
| forecast: { name: 'AI Forecasts', enabled: true, priority: 1, ...(_desktop && { premium: 'locked' as const }) }, |
| cii: { name: 'Country Instability', enabled: true, priority: 1, ...(_desktop && { premium: 'enhanced' as const }) }, |
| 'strategic-risk': { name: 'Strategic Risk Overview', enabled: true, priority: 1, ...(_desktop && { premium: 'enhanced' as const }) }, |
| intel: { name: 'Intel Feed', enabled: true, priority: 1 }, |
| 'gdelt-intel': { name: 'Live Intelligence', enabled: true, priority: 1, ...(_desktop && { premium: 'enhanced' as const }) }, |
| cascade: { name: 'Infrastructure Cascade', enabled: true, priority: 1 }, |
| 'military-correlation': { name: 'Force Posture', enabled: true, priority: 2 }, |
| 'escalation-correlation': { name: 'Escalation Monitor', enabled: true, priority: 2 }, |
| 'economic-correlation': { name: 'Economic Warfare', enabled: true, priority: 2 }, |
| 'disaster-correlation': { name: 'Disaster Cascade', enabled: true, priority: 2 }, |
| politics: { name: 'World News', enabled: true, priority: 1 }, |
| us: { name: 'United States', enabled: true, priority: 1 }, |
| europe: { name: 'Europe', enabled: true, priority: 1 }, |
| middleeast: { name: 'Middle East', enabled: true, priority: 1 }, |
| africa: { name: 'Africa', enabled: true, priority: 1 }, |
| latam: { name: 'Latin America', enabled: true, priority: 1 }, |
| asia: { name: 'Asia-Pacific', enabled: true, priority: 1 }, |
| energy: { name: 'Energy & Resources', enabled: true, priority: 1 }, |
| gov: { name: 'Government', enabled: true, priority: 1 }, |
| thinktanks: { name: 'Think Tanks', enabled: true, priority: 1 }, |
| polymarket: { name: 'Predictions', enabled: true, priority: 1 }, |
| commodities: { name: 'Metals & Materials', enabled: true, priority: 1 }, |
| 'energy-complex': { name: 'Energy Complex', enabled: true, priority: 1 }, |
| 'oil-inventories': { name: 'Oil Inventories', enabled: true, priority: 60 }, |
| markets: { name: 'Markets', enabled: true, priority: 1 }, |
| 'stock-analysis': { name: 'Stock Analysis', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'stock-backtest': { name: 'Backtesting', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'daily-market-brief': { name: 'Daily Market Brief', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'chat-analyst': { name: 'WM Analyst', enabled: true, priority: 1, premium: 'locked' as const }, |
| economic: { name: 'Macro Stress', enabled: true, priority: 1 }, |
| 'global-procurement': { name: 'Global Procurement', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'trade-policy': { name: 'Trade Policy', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'supply-chain': { name: 'Supply Chain', enabled: true, priority: 1, ...(_desktop && { premium: 'enhanced' as const }) }, |
| 'china-corridors': { name: 'China Logistics Corridors', enabled: true, priority: 1 }, |
| 'china-activity-nowcast': { name: 'China Activity Nowcast', enabled: true, priority: 1 }, |
| finance: { name: 'Financial', enabled: true, priority: 1 }, |
| tech: { name: 'Technology', enabled: true, priority: 2 }, |
| crypto: { name: 'Crypto', enabled: true, priority: 2 }, |
| heatmap: { name: 'Sector Heatmap', enabled: true, priority: 2 }, |
| ai: { name: 'AI/ML', enabled: true, priority: 2 }, |
| layoffs: { name: 'Layoffs Tracker', enabled: true, priority: 2 }, |
| monitors: { name: 'My Monitors', enabled: true, priority: 2 }, |
| 'latest-brief': { name: 'Latest Brief', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'satellite-fires': { name: 'Fires', enabled: true, priority: 2 }, |
| 'macro-signals': { name: 'Market Regime', enabled: true, priority: 2 }, |
| 'fear-greed': { name: 'Fear & Greed', enabled: true, priority: 2 }, |
| 'aaii-sentiment': { name: 'AAII Sentiment', enabled: false, priority: 2 }, |
| 'market-breadth': { name: 'Market Breadth', enabled: true, priority: 2 }, |
| 'macro-tiles': { name: 'Macro Indicators', enabled: false, priority: 2 }, |
| 'fsi': { name: 'Financial Stress', enabled: false, priority: 2 }, |
| 'yield-curve': { name: 'Yield Curve', enabled: false, priority: 2 }, |
| 'earnings-calendar': { name: 'Earnings Calendar', enabled: false, priority: 2 }, |
| 'economic-calendar': { name: 'Economic Calendar', enabled: false, priority: 2 }, |
| 'cot-positioning': { name: 'COT Positioning', enabled: false, priority: 2 }, |
| 'liquidity-shifts': { name: 'Liquidity Shifts', enabled: true, priority: 2 }, |
| 'positioning-247': { name: '24/7 Positioning', enabled: true, priority: 2 }, |
| 'gold-intelligence': { name: 'Gold Intelligence', enabled: true, priority: 60 }, |
| 'hormuz-tracker': { name: 'Hormuz Trade Tracker', enabled: true, priority: 2 }, |
| 'energy-crisis': { name: 'Energy Crisis Tracker', enabled: true, priority: 2 }, |
| 'pipeline-status': { name: 'Oil & Gas Pipeline Status', enabled: true, priority: 2 }, |
| 'storage-facility-map': { name: 'Strategic Storage Atlas', enabled: true, priority: 2 }, |
| 'fuel-shortages': { name: 'Global Fuel Shortage Registry', enabled: true, priority: 2 }, |
| 'energy-disruptions': { name: 'Energy Disruptions Log', enabled: true, priority: 2 }, |
| 'energy-risk-overview': { name: 'Global Energy Risk Overview', enabled: false, priority: 2 }, |
| 'gulf-economies': { name: 'Gulf Economies', enabled: false, priority: 2 }, |
| 'consumer-prices': { name: 'Consumer Prices', enabled: false, priority: 2 }, |
| 'grocery-basket': { name: 'Grocery Index', enabled: false, priority: 2 }, |
| 'bigmac': { name: 'Big Mac Index', enabled: false, priority: 2 }, |
| 'fuel-prices': { name: 'Fuel Prices', enabled: false, priority: 2 }, |
| 'fao-food-price-index': { name: 'FAO Food Price Index', enabled: false, priority: 2 }, |
| 'etf-flows': { name: 'BTC ETF Tracker', enabled: true, priority: 2 }, |
| stablecoins: { name: 'Stablecoins', enabled: true, priority: 2 }, |
| 'ucdp-events': { name: 'UCDP Conflict Events', enabled: true, priority: 2 }, |
| 'disease-outbreaks': { name: 'Disease Outbreaks', enabled: true, priority: 2 }, |
| 'social-velocity': { name: 'Social Velocity', enabled: true, priority: 2 }, |
| 'wsb-ticker-scanner': { name: 'WSB Ticker Scanner', enabled: true, priority: 75, premium: 'locked' as const }, |
| giving: { name: 'Global Giving', enabled: false, priority: 2 }, |
| displacement: { name: 'UNHCR Displacement', enabled: true, priority: 2 }, |
| climate: { name: 'Climate Anomalies', enabled: true, priority: 2 }, |
| 'climate-news': { name: 'Climate News', enabled: false, priority: 2 }, |
| 'population-exposure': { name: 'Population Exposure', enabled: true, priority: 2 }, |
| 'security-advisories': { name: 'Security Advisories', enabled: true, priority: 2 }, |
| 'sanctions-pressure': { name: 'Sanctions Pressure', enabled: true, priority: 2 }, |
| 'defense-patents': { name: 'R&D Signal', enabled: true, priority: 2 }, |
| 'radiation-watch': { name: 'Radiation Watch', enabled: true, priority: 2 }, |
| 'thermal-escalation': { name: 'Thermal Escalation', enabled: true, priority: 2 }, |
| 'oref-sirens': { name: 'Israel Sirens', enabled: true, priority: 2, ...(_desktop && { premium: 'locked' as const }) }, |
| 'telegram-intel': { name: 'Telegram Intel', enabled: true, priority: 2, ...(_desktop && { premium: 'locked' as const }) }, |
| 'airline-intel': { name: 'Airline Intelligence', enabled: true, priority: 2 }, |
| 'tech-readiness': { name: 'Tech Readiness Index', enabled: true, priority: 2 }, |
| 'world-clock': { name: 'World Clock', enabled: true, priority: 2 }, |
| 'national-debt': { name: 'Global Debt Clock', enabled: true, priority: 2 }, |
| 'cross-source-signals': { name: 'Cross-Source Signals', enabled: true, priority: 2 }, |
| 'market-implications': { name: 'AI Market Implications', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'regional-intelligence': { name: 'Regional Intelligence', enabled: false, priority: 1, premium: 'locked' as const }, |
| 'deduction': { name: 'Deduct Situation', enabled: false, priority: 1, premium: 'locked' as const }, |
| 'geo-hubs': { name: 'Geopolitical Hubs', enabled: false, priority: 2 }, |
| 'tech-hubs': { name: 'Hot Tech Hubs', enabled: false, priority: 2 }, |
| }; |
|
|
| const FULL_MAP_LAYERS: MapLayers = { |
| iranAttacks: IRAN_ATTACKS_ENABLED && !_desktop, |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: true, |
| bases: !_desktop, |
| cables: false, |
| pipelines: false, |
| storageFacilities: false, |
| fuelShortages: false, |
| hotspots: true, |
| ais: false, |
| nuclear: true, |
| irradiators: false, |
| radiationWatch: false, |
| sanctions: true, |
| weather: true, |
| economic: true, |
| waterways: true, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: true, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| const FULL_MOBILE_MAP_LAYERS: MapLayers = { |
| iranAttacks: IRAN_ATTACKS_ENABLED, |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: true, |
| bases: false, |
| cables: false, |
| pipelines: false, |
| storageFacilities: false, |
| fuelShortages: false, |
| hotspots: true, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| radiationWatch: false, |
| sanctions: true, |
| weather: true, |
| economic: false, |
| waterways: false, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| |
| |
| |
| const TECH_PANELS: Record<string, PanelConfig> = { |
| map: { name: 'Global Tech Map', enabled: true, priority: 1 }, |
| 'live-news': { name: 'Tech Headlines', enabled: true, priority: 1 }, |
| 'live-webcams': { name: 'Live Webcams', enabled: true, priority: 2 }, |
| 'windy-webcams': { name: 'Windy Live Webcam', enabled: false, priority: 2 }, |
| insights: { name: 'AI Insights', enabled: true, priority: 1 }, |
| ai: { name: 'AI/ML News', enabled: true, priority: 1 }, |
| tech: { name: 'Technology', enabled: true, priority: 1 }, |
| startups: { name: 'Startups & VC', enabled: true, priority: 1 }, |
| vcblogs: { name: 'VC Insights & Essays', enabled: true, priority: 1 }, |
| regionalStartups: { name: 'Global Startup News', enabled: true, priority: 1 }, |
| unicorns: { name: 'Unicorn Tracker', enabled: true, priority: 1 }, |
| accelerators: { name: 'Accelerators & Demo Days', enabled: true, priority: 1 }, |
| security: { name: 'Cybersecurity', enabled: true, priority: 1 }, |
| policy: { name: 'AI Policy & Regulation', enabled: true, priority: 1 }, |
| layoffs: { name: 'Layoffs Tracker', enabled: true, priority: 1 }, |
| markets: { name: 'Tech Stocks', enabled: true, priority: 2 }, |
| finance: { name: 'Financial News', enabled: true, priority: 2 }, |
| crypto: { name: 'Crypto', enabled: true, priority: 2 }, |
| hardware: { name: 'Semiconductors & Hardware', enabled: true, priority: 2 }, |
| cloud: { name: 'Cloud & Infrastructure', enabled: true, priority: 2 }, |
| dev: { name: 'Developer Community', enabled: true, priority: 2 }, |
| github: { name: 'GitHub Trending', enabled: true, priority: 1 }, |
| ipo: { name: 'IPO & SPAC', enabled: true, priority: 2 }, |
| polymarket: { name: 'Tech Predictions', enabled: true, priority: 2 }, |
| funding: { name: 'Funding & VC', enabled: true, priority: 1 }, |
| producthunt: { name: 'Product Hunt', enabled: true, priority: 1 }, |
| events: { name: 'Tech Events', enabled: true, priority: 1 }, |
| 'internet-disruptions': { name: 'Internet Disruptions', enabled: true, priority: 2 }, |
| 'service-status': { name: 'Service Status', enabled: true, priority: 2 }, |
| economic: { name: 'Macro Stress', enabled: true, priority: 2 }, |
| 'global-procurement': { name: 'Global Procurement', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'tech-readiness': { name: 'Tech Readiness Index', enabled: true, priority: 1 }, |
| 'macro-signals': { name: 'Market Regime', enabled: true, priority: 2 }, |
| 'etf-flows': { name: 'BTC ETF Tracker', enabled: true, priority: 2 }, |
| stablecoins: { name: 'Stablecoins', enabled: true, priority: 2 }, |
| 'airline-intel': { name: 'Airline Intelligence', enabled: true, priority: 2 }, |
| 'world-clock': { name: 'World Clock', enabled: true, priority: 2 }, |
| monitors: { name: 'My Monitors', enabled: true, priority: 2 }, |
| 'latest-brief': { name: 'Latest Brief', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'tech-hubs': { name: 'Hot Tech Hubs', enabled: false, priority: 2 }, |
| 'ai-regulation': { name: 'AI Regulation Dashboard', enabled: false, priority: 2 }, |
| }; |
|
|
| const TECH_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: true, |
| pipelines: false, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: false, |
| waterways: false, |
| outages: true, |
| cyberThreats: false, |
| datacenters: true, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: true, |
| cloudRegions: true, |
| accelerators: false, |
| techHQs: true, |
| techEvents: true, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| const TECH_MOBILE_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: false, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: false, |
| waterways: false, |
| outages: true, |
| cyberThreats: false, |
| datacenters: true, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: true, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: true, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| |
| |
| |
| const FINANCE_PANELS: Record<string, PanelConfig> = { |
| map: { name: 'Global Markets Map', enabled: true, priority: 1 }, |
| 'live-news': { name: 'Market Headlines', enabled: true, priority: 1 }, |
| 'live-webcams': { name: 'Live Webcams', enabled: true, priority: 2 }, |
| 'windy-webcams': { name: 'Windy Live Webcam', enabled: false, priority: 2 }, |
| insights: { name: 'AI Market Insights', enabled: true, priority: 1 }, |
| markets: { name: 'Live Markets', enabled: true, priority: 1 }, |
| 'stock-analysis': { name: 'Premium Stock Analysis', enabled: true, priority: 1, premium: 'locked' }, |
| 'stock-backtest': { name: 'Premium Backtesting', enabled: true, priority: 1, premium: 'locked' }, |
| 'daily-market-brief': { name: 'Daily Market Brief', enabled: true, priority: 1, premium: 'locked' }, |
| 'markets-news': { name: 'Markets News', enabled: true, priority: 2 }, |
| forex: { name: 'Forex & Currencies', enabled: true, priority: 1 }, |
| bonds: { name: 'Fixed Income', enabled: true, priority: 1 }, |
| commodities: { name: 'Metals & Materials', enabled: true, priority: 1 }, |
| 'energy-complex': { name: 'Energy Complex', enabled: true, priority: 1 }, |
| |
| |
| |
| |
| |
| |
| |
| |
| 'pipeline-status': { name: 'Oil & Gas Pipeline Status', enabled: false, priority: 2 }, |
| 'commodities-news': { name: 'Commodities News', enabled: true, priority: 2 }, |
| crypto: { name: 'Crypto & Digital Assets', enabled: true, priority: 1 }, |
| 'crypto-news': { name: 'Crypto News', enabled: true, priority: 2 }, |
| 'crypto-heatmap': { name: 'Crypto Sectors', enabled: true, priority: 1 }, |
| 'defi-tokens': { name: 'DeFi Tokens', enabled: true, priority: 2 }, |
| 'ai-tokens': { name: 'AI Tokens', enabled: true, priority: 2 }, |
| 'other-tokens': { name: 'Alt Tokens', enabled: true, priority: 2 }, |
| centralbanks: { name: 'Central Bank Watch', enabled: true, priority: 1 }, |
| economic: { name: 'Macro Stress', enabled: true, priority: 1 }, |
| 'global-procurement': { name: 'Global Procurement', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'trade-policy': { name: 'Trade Policy', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'sanctions-pressure': { name: 'Sanctions Pressure', enabled: true, priority: 1 }, |
| 'supply-chain': { name: 'Supply Chain', enabled: true, priority: 1 }, |
| 'china-corridors': { name: 'China Logistics Corridors', enabled: false, priority: 2 }, |
| 'china-activity-nowcast': { name: 'China Activity Nowcast', enabled: false, priority: 2 }, |
| 'economic-news': { name: 'Economic News', enabled: true, priority: 2 }, |
| ipo: { name: 'IPOs, Earnings & M&A', enabled: true, priority: 1 }, |
| heatmap: { name: 'Sector Heatmap', enabled: true, priority: 1 }, |
| 'macro-signals': { name: 'Market Regime', enabled: true, priority: 1 }, |
| 'macro-tiles': { name: 'Macro Indicators', enabled: true, priority: 1 }, |
| 'fear-greed': { name: 'Fear & Greed', enabled: true, priority: 1 }, |
| 'aaii-sentiment': { name: 'AAII Sentiment', enabled: true, priority: 2 }, |
| 'market-breadth': { name: 'Market Breadth', enabled: true, priority: 1 }, |
| 'fsi': { name: 'Financial Stress', enabled: true, priority: 1 }, |
| 'yield-curve': { name: 'Yield Curve', enabled: true, priority: 1 }, |
| 'earnings-calendar': { name: 'Earnings Calendar', enabled: true, priority: 1 }, |
| 'economic-calendar': { name: 'Economic Calendar', enabled: true, priority: 1 }, |
| 'cot-positioning': { name: 'COT Positioning', enabled: true, priority: 2 }, |
| 'liquidity-shifts': { name: 'Liquidity Shifts', enabled: true, priority: 1 }, |
| 'positioning-247': { name: '24/7 Positioning', enabled: true, priority: 1 }, |
| 'gold-intelligence': { name: 'Gold Intelligence', enabled: true, priority: 60 }, |
| derivatives: { name: 'Derivatives & Options', enabled: true, priority: 2 }, |
| fintech: { name: 'Fintech & Trading Tech', enabled: true, priority: 2 }, |
| 'fin-regulation': { name: 'Financial Regulation', enabled: true, priority: 2 }, |
| institutional: { name: 'Hedge Funds & PE', enabled: true, priority: 2 }, |
| analysis: { name: 'Market Analysis', enabled: true, priority: 2 }, |
| 'etf-flows': { name: 'BTC ETF Tracker', enabled: true, priority: 2 }, |
| stablecoins: { name: 'Stablecoins', enabled: true, priority: 2 }, |
| 'gcc-investments': { name: 'GCC Investments', enabled: true, priority: 2 }, |
| gccNews: { name: 'GCC Business News', enabled: true, priority: 2 }, |
| 'gulf-economies': { name: 'Gulf Economies', enabled: true, priority: 1 }, |
| 'consumer-prices': { name: 'Consumer Prices', enabled: true, priority: 1 }, |
| polymarket: { name: 'Predictions', enabled: true, priority: 2 }, |
| 'wsb-ticker-scanner': { name: 'WSB Ticker Scanner', enabled: true, priority: 75, premium: 'locked' }, |
| 'airline-intel': { name: 'Airline Intelligence', enabled: true, priority: 2 }, |
| 'world-clock': { name: 'World Clock', enabled: true, priority: 2 }, |
| monitors: { name: 'My Monitors', enabled: true, priority: 2 }, |
| 'latest-brief': { name: 'Latest Brief', enabled: true, priority: 1, premium: 'locked' as const }, |
| }; |
|
|
| const FINANCE_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: true, |
| pipelines: true, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: true, |
| weather: true, |
| economic: true, |
| waterways: true, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: true, |
| financialCenters: true, |
| centralBanks: true, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: true, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| const FINANCE_MOBILE_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: false, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: true, |
| waterways: false, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: true, |
| financialCenters: false, |
| centralBanks: true, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| |
| |
| |
| const HAPPY_PANELS: Record<string, PanelConfig> = { |
| map: { name: 'World Map', enabled: true, priority: 1 }, |
| 'positive-feed': { name: 'Good News Feed', enabled: true, priority: 1 }, |
| progress: { name: 'Human Progress', enabled: true, priority: 1 }, |
| counters: { name: 'Live Counters', enabled: true, priority: 1 }, |
| spotlight: { name: "Today's Hero", enabled: true, priority: 1 }, |
| breakthroughs: { name: 'Breakthroughs', enabled: true, priority: 1 }, |
| digest: { name: '5 Good Things', enabled: true, priority: 1 }, |
| species: { name: 'Conservation Wins', enabled: true, priority: 1 }, |
| renewable: { name: 'Renewable Energy', enabled: true, priority: 1 }, |
| giving: { name: 'Global Giving', enabled: true, priority: 1 }, |
| }; |
|
|
| const HAPPY_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: false, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: false, |
| waterways: false, |
| outages: false, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: false, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: true, |
| kindness: true, |
| happiness: true, |
| speciesRecovery: true, |
| renewableInstallations: true, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| const HAPPY_MOBILE_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: false, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: false, |
| waterways: false, |
| outages: false, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: false, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| |
| positiveEvents: true, |
| kindness: true, |
| happiness: true, |
| speciesRecovery: true, |
| renewableInstallations: true, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: false, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| |
| |
| |
| const COMMODITY_PANELS: Record<string, PanelConfig> = { |
| map: { name: 'Commodity Map', enabled: true, priority: 1 }, |
| 'live-news': { name: 'Commodity Headlines', enabled: true, priority: 1 }, |
| insights: { name: 'AI Commodity Insights', enabled: true, priority: 1 }, |
| 'commodity-news': { name: 'Commodity News', enabled: true, priority: 1 }, |
| 'liquidity-shifts': { name: 'Liquidity Shifts', enabled: true, priority: 1 }, |
| 'positioning-247': { name: '24/7 Positioning', enabled: true, priority: 1 }, |
| 'gold-silver': { name: 'Gold & Silver', enabled: true, priority: 1 }, |
| energy: { name: 'Energy Markets', enabled: true, priority: 1 }, |
| 'mining-news': { name: 'Mining News', enabled: true, priority: 1 }, |
| 'critical-minerals': { name: 'Critical Minerals', enabled: true, priority: 1 }, |
| 'base-metals': { name: 'Base Metals', enabled: true, priority: 1 }, |
| 'mining-companies': { name: 'Mining Companies', enabled: true, priority: 1 }, |
| 'supply-chain': { name: 'Supply Chain & Logistics', enabled: true, priority: 1 }, |
| 'china-corridors': { name: 'China Logistics Corridors', enabled: false, priority: 2 }, |
| 'china-activity-nowcast': { name: 'China Activity Nowcast', enabled: false, priority: 2 }, |
| 'commodity-regulation': { name: 'Regulation & Policy', enabled: true, priority: 1 }, |
| markets: { name: 'Commodity Markets', enabled: true, priority: 1 }, |
| commodities: { name: 'Live Metals & Materials', enabled: true, priority: 1 }, |
| 'energy-complex': { name: 'Energy Complex', enabled: true, priority: 1 }, |
| |
| |
| |
| |
| 'pipeline-status': { name: 'Oil & Gas Pipeline Status', enabled: false, priority: 2 }, |
| 'oil-inventories': { name: 'Oil Inventories', enabled: true, priority: 60 }, |
| 'gold-intelligence': { name: 'Gold Intelligence', enabled: true, priority: 60 }, |
| heatmap: { name: 'Sector Heatmap', enabled: true, priority: 1 }, |
| 'macro-signals': { name: 'Market Regime', enabled: true, priority: 1 }, |
| 'trade-policy': { name: 'Trade Policy', enabled: true, priority: 1, premium: 'locked' as const }, |
| 'sanctions-pressure': { name: 'Sanctions Pressure', enabled: true, priority: 1 }, |
| economic: { name: 'Macro Stress', enabled: true, priority: 1 }, |
| 'gulf-economies': { name: 'Gulf & OPEC Economies', enabled: true, priority: 1 }, |
| 'gcc-investments': { name: 'GCC Resource Investments', enabled: true, priority: 2 }, |
| 'consumer-prices': { name: 'Consumer Prices', enabled: true, priority: 2 }, |
| 'airline-intel': { name: 'Airline Intelligence', enabled: true, priority: 2 }, |
| polymarket: { name: 'Commodity Predictions', enabled: true, priority: 2 }, |
| 'world-clock': { name: 'World Clock', enabled: true, priority: 2 }, |
| monitors: { name: 'My Monitors', enabled: true, priority: 2 }, |
| 'latest-brief': { name: 'Latest Brief', enabled: true, priority: 1, premium: 'locked' as const }, |
| }; |
|
|
| const COMMODITY_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: true, |
| hotspots: false, |
| ais: true, |
| nuclear: false, |
| irradiators: false, |
| sanctions: true, |
| weather: true, |
| economic: true, |
| waterways: true, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: true, |
| fires: true, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: true, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: true, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: true, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: true, |
| processingPlants: true, |
| commodityPorts: true, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| const COMMODITY_MOBILE_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
|
|
|
|
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: false, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: true, |
| waterways: false, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: true, |
| fires: false, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: true, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: true, |
| processingPlants: false, |
| commodityPorts: true, |
| webcams: false, |
| diseaseOutbreaks: false, |
| }; |
|
|
| |
| |
| |
| |
| |
| const ENERGY_PANELS: Record<string, PanelConfig> = { |
| map: { name: 'Energy Atlas Map', enabled: true, priority: 1 }, |
| 'energy-risk-overview': { name: 'Global Energy Risk Overview', enabled: true, priority: 1 }, |
| 'chokepoint-strip': { name: 'Chokepoint Status', enabled: true, priority: 1 }, |
| 'pipeline-status': { name: 'Oil & Gas Pipeline Status', enabled: true, priority: 1 }, |
| 'storage-facility-map': { name: 'Strategic Storage Atlas', enabled: true, priority: 1 }, |
| 'fuel-shortages': { name: 'Global Fuel Shortage Registry', enabled: true, priority: 1 }, |
| 'energy-disruptions': { name: 'Energy Disruptions Log', enabled: true, priority: 1 }, |
| 'live-news': { name: 'Energy Headlines', enabled: true, priority: 1 }, |
| insights: { name: 'AI Energy Insights', enabled: true, priority: 1 }, |
| |
| 'energy-complex': { name: 'Oil & Gas Complex', enabled: true, priority: 1 }, |
| 'oil-inventories': { name: 'Oil & Gas Inventories', enabled: true, priority: 1 }, |
| 'hormuz-tracker': { name: 'Strait of Hormuz Tracker', enabled: true, priority: 1 }, |
| 'energy-crisis': { name: 'Energy Crisis Policy Tracker', enabled: true, priority: 1 }, |
| 'fuel-prices': { name: 'Retail Fuel Prices', enabled: true, priority: 1 }, |
| renewable: { name: 'Renewable Energy', enabled: true, priority: 2 }, |
| |
| commodities: { name: 'Energy Commodities (WTI, Brent, NatGas)', enabled: true, priority: 1 }, |
| energy: { name: 'Energy Markets News', enabled: true, priority: 1 }, |
| 'macro-signals': { name: 'Market Regime', enabled: true, priority: 2 }, |
| |
| 'supply-chain': { name: 'Chokepoints & Routes', enabled: true, priority: 1 }, |
| 'china-corridors': { name: 'China Logistics Corridors', enabled: false, priority: 2 }, |
| 'china-activity-nowcast': { name: 'China Activity Nowcast', enabled: false, priority: 2 }, |
| 'sanctions-pressure': { name: 'Sanctions Pressure', enabled: true, priority: 2 }, |
| |
| 'gulf-economies': { name: 'Gulf & OPEC Economies', enabled: true, priority: 2 }, |
| 'gcc-investments': { name: 'GCC Energy Investments', enabled: true, priority: 2 }, |
| |
| climate: { name: 'Climate & Weather Impact', enabled: true, priority: 2 }, |
| |
| monitors: { name: 'My Monitors', enabled: true, priority: 3 }, |
| 'world-clock': { name: 'World Clock', enabled: true, priority: 3 }, |
| 'latest-brief': { name: 'Latest Brief', enabled: true, priority: 1, premium: 'locked' as const }, |
| }; |
|
|
| const ENERGY_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: true, |
| hotspots: false, |
| ais: true, |
| nuclear: false, |
| irradiators: false, |
| sanctions: true, |
| weather: true, |
| economic: false, |
| waterways: true, |
| outages: true, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: true, |
| fires: true, |
| |
| ucdpEvents: false, |
| displacement: false, |
| climate: true, |
| |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: true, |
| gulfInvestments: false, |
| |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: true, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: true, |
| webcams: false, |
| diseaseOutbreaks: false, |
| storageFacilities: true, |
| fuelShortages: true, |
| liveTankers: true, |
| }; |
|
|
| const ENERGY_MOBILE_MAP_LAYERS: MapLayers = { |
| gpsJamming: false, |
| satellites: false, |
| conflicts: false, |
| bases: false, |
| cables: false, |
| pipelines: true, |
| hotspots: false, |
| ais: false, |
| nuclear: false, |
| irradiators: false, |
| sanctions: false, |
| weather: false, |
| economic: false, |
| waterways: true, |
| outages: false, |
| cyberThreats: false, |
| datacenters: false, |
| protests: false, |
| flights: false, |
| military: false, |
| natural: true, |
| spaceports: false, |
| minerals: false, |
| fires: false, |
| ucdpEvents: false, |
| displacement: false, |
| climate: false, |
| startupHubs: false, |
| cloudRegions: false, |
| accelerators: false, |
| techHQs: false, |
| techEvents: false, |
| stockExchanges: false, |
| financialCenters: false, |
| centralBanks: false, |
| commodityHubs: false, |
| gulfInvestments: false, |
| positiveEvents: false, |
| kindness: false, |
| happiness: false, |
| speciesRecovery: false, |
| renewableInstallations: false, |
| tradeRoutes: false, |
| iranAttacks: false, |
| ciiChoropleth: false, |
| resilienceScore: false, |
| dayNight: false, |
| miningSites: false, |
| processingPlants: false, |
| commodityPorts: true, |
| webcams: false, |
| diseaseOutbreaks: false, |
| storageFacilities: true, |
| fuelShortages: true, |
| liveTankers: true, |
| }; |
|
|
| |
| |
| |
|
|
| type PanelVariant = 'full' | 'tech' | 'finance' | 'commodity' | 'energy' | 'happy'; |
|
|
| const VARIANT_PANEL_CONFIGS: Record<PanelVariant, Record<string, PanelConfig>> = { |
| full: FULL_PANELS, |
| tech: TECH_PANELS, |
| finance: FINANCE_PANELS, |
| commodity: COMMODITY_PANELS, |
| energy: ENERGY_PANELS, |
| happy: HAPPY_PANELS, |
| }; |
|
|
| function getVariantPanelConfigs(variant: string): Record<string, PanelConfig> | undefined { |
| return Object.prototype.hasOwnProperty.call(VARIANT_PANEL_CONFIGS, variant) |
| ? VARIANT_PANEL_CONFIGS[variant as PanelVariant] |
| : undefined; |
| } |
|
|
| |
| export const ALL_PANELS: Record<string, PanelConfig> = { |
| ...HAPPY_PANELS, |
| ...COMMODITY_PANELS, |
| ...ENERGY_PANELS, |
| ...TECH_PANELS, |
| ...FINANCE_PANELS, |
| ...FULL_PANELS, |
| }; |
|
|
| |
| export const VARIANT_DEFAULTS: Record<string, string[]> = { |
| full: Object.keys(VARIANT_PANEL_CONFIGS.full), |
| tech: Object.keys(VARIANT_PANEL_CONFIGS.tech), |
| finance: Object.keys(VARIANT_PANEL_CONFIGS.finance), |
| commodity: Object.keys(VARIANT_PANEL_CONFIGS.commodity), |
| energy: Object.keys(VARIANT_PANEL_CONFIGS.energy), |
| happy: Object.keys(VARIANT_PANEL_CONFIGS.happy), |
| }; |
|
|
| |
| |
| |
| |
| export const VARIANT_PANEL_OVERRIDES: Partial<Record<string, Partial<Record<string, Partial<PanelConfig>>>>> = { |
| finance: { |
| map: { name: 'Global Markets Map' }, |
| 'live-news': { name: 'Market Headlines' }, |
| insights: { name: 'AI Market Insights' }, |
| }, |
| tech: { |
| map: { name: 'Global Tech Map' }, |
| 'live-news': { name: 'Tech Headlines' }, |
| insights: { name: 'AI Insights' }, |
| }, |
| commodity: { |
| map: { name: 'Commodity Map' }, |
| 'live-news': { name: 'Commodity Headlines' }, |
| insights: { name: 'AI Commodity Insights' }, |
| }, |
| energy: { |
| map: { name: 'Energy Atlas Map' }, |
| 'live-news': { name: 'Energy Headlines' }, |
| insights: { name: 'AI Energy Insights' }, |
| }, |
| happy: { |
| map: { name: 'World Map' }, |
| }, |
| }; |
|
|
| |
| |
| |
| |
| export function getEffectivePanelConfig(key: string, variant: string): PanelConfig { |
| const base = getVariantPanelConfigs(variant)?.[key] ?? ALL_PANELS[key]; |
| if (!base) return { name: key, enabled: false, priority: 2 }; |
| const override = VARIANT_PANEL_OVERRIDES[variant]?.[key] ?? {}; |
| return { ...base, ...override }; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function isPanelInVariantDefaults(key: string): boolean { |
| return (VARIANT_DEFAULTS[SITE_VARIANT] ?? []).includes(key); |
| } |
|
|
| export const FREE_MAX_PANELS = 40; |
| export const FREE_MAX_SOURCES = 80; |
|
|
| export function isFreePanelCapCounted(key: string): boolean { |
| return key !== 'map' && !key.startsWith('cw-'); |
| } |
|
|
| export function countFreePanelCapUsage(panelSettings: Record<string, PanelConfig>): number { |
| return Object.entries(panelSettings).filter(([key, panel]) => |
| panel.enabled && isFreePanelCapCounted(key) |
| ).length; |
| } |
|
|
| export function restoreFreeMapPanelAccess( |
| panelSettings: Record<string, PanelConfig>, |
| ): Record<string, PanelConfig> { |
| const next: Record<string, PanelConfig> = {}; |
| for (const [key, config] of Object.entries(panelSettings)) { |
| next[key] = { ...config }; |
| } |
|
|
| if (next.map?.enabled === false && countFreePanelCapUsage(next) > FREE_MAX_PANELS) { |
| next.map = { ...next.map, enabled: true }; |
| } |
|
|
| return next; |
| } |
|
|
| |
| |
| |
| |
| export function isPanelEntitled(key: string, config: PanelConfig, isPro = false): boolean { |
| if (!config.premium) return true; |
| |
| if (isEntitled()) return true; |
| const apiKeyPanels = ['stock-analysis', 'stock-backtest', 'daily-market-brief', 'market-implications', 'regional-intelligence', 'deduction', 'chat-analyst', 'wsb-ticker-scanner', 'trade-policy', 'global-procurement']; |
| if (apiKeyPanels.includes(key)) { |
| return getSecretState('WORLDMONITOR_API_KEY').present || isPro; |
| } |
| if (config.premium === 'locked') { |
| return isDesktopRuntime(); |
| } |
| return true; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function enforceFreePanelLimit( |
| panelSettings: Record<string, PanelConfig>, |
| isPro: boolean, |
| ): Record<string, PanelConfig> { |
| const next: Record<string, PanelConfig> = {}; |
| for (const [key, config] of Object.entries(panelSettings)) { |
| next[key] = { ...config }; |
| } |
|
|
| if (isPro) return next; |
|
|
| |
| for (const key of Object.keys(next)) { |
| if (key.startsWith('cw-') && next[key]?.enabled) { |
| next[key] = { ...next[key]!, enabled: false }; |
| } |
| } |
|
|
| const enabledKeys = Object.entries(next) |
| .filter(([k, v]) => v.enabled && isFreePanelCapCounted(k)) |
| .sort(([ka, a], [kb, b]) => (a.priority ?? 99) - (b.priority ?? 99) || ka.localeCompare(kb)) |
| .map(([k]) => k); |
|
|
| for (const key of enabledKeys.slice(FREE_MAX_PANELS)) { |
| next[key] = { ...next[key]!, enabled: false }; |
| } |
|
|
| return next; |
| } |
|
|
| |
| |
| |
| export const DEFAULT_PANELS: Record<string, PanelConfig> = Object.fromEntries( |
| (VARIANT_DEFAULTS[SITE_VARIANT] ?? VARIANT_DEFAULTS['full'] ?? []).map(key => |
| [key, getEffectivePanelConfig(key, SITE_VARIANT)] |
| ) |
| ); |
|
|
| export const DEFAULT_MAP_LAYERS = SITE_VARIANT === 'happy' |
| ? HAPPY_MAP_LAYERS |
| : SITE_VARIANT === 'tech' |
| ? TECH_MAP_LAYERS |
| : SITE_VARIANT === 'finance' |
| ? FINANCE_MAP_LAYERS |
| : SITE_VARIANT === 'commodity' |
| ? COMMODITY_MAP_LAYERS |
| : SITE_VARIANT === 'energy' |
| ? ENERGY_MAP_LAYERS |
| : FULL_MAP_LAYERS; |
|
|
| export const MOBILE_DEFAULT_MAP_LAYERS = SITE_VARIANT === 'happy' |
| ? HAPPY_MOBILE_MAP_LAYERS |
| : SITE_VARIANT === 'tech' |
| ? TECH_MOBILE_MAP_LAYERS |
| : SITE_VARIANT === 'finance' |
| ? FINANCE_MOBILE_MAP_LAYERS |
| : SITE_VARIANT === 'commodity' |
| ? COMMODITY_MOBILE_MAP_LAYERS |
| : SITE_VARIANT === 'energy' |
| ? ENERGY_MOBILE_MAP_LAYERS |
| : FULL_MOBILE_MAP_LAYERS; |
|
|
| |
| export const LAYER_TO_SOURCE: Partial<Record<keyof MapLayers, DataSourceId[]>> = { |
| military: ['opensky', 'wingbits'], |
| ais: ['ais'], |
| natural: ['usgs'], |
| weather: ['weather'], |
| outages: ['outages'], |
| cyberThreats: ['cyber_threats'], |
| protests: ['acled', 'gdelt_doc'], |
| ucdpEvents: ['ucdp_events'], |
| displacement: ['unhcr'], |
| climate: ['climate'], |
| sanctions: ['sanctions_pressure'], |
| radiationWatch: ['radiation'], |
| }; |
|
|
| |
| |
| |
| |
| |
| export const PANEL_CATEGORY_MAP: Record<string, { labelKey: string; panelKeys: string[]; variants?: string[] }> = { |
| |
| core: { |
| labelKey: 'header.panelCatCore', |
| panelKeys: ['map', 'live-news', 'live-webcams', 'windy-webcams', 'insights', 'strategic-posture', 'latest-brief'], |
| }, |
|
|
| |
| |
| intelligence: { |
| labelKey: 'header.panelCatIntelligence', |
| panelKeys: ['cii', 'strategic-risk', 'threat-timeline', 'intel', 'gdelt-intel', 'cascade', 'telegram-intel', 'forecast', 'cross-source-signals', 'regional-intelligence', 'deduction', 'chat-analyst', 'thermal-escalation', 'social-velocity', 'geo-hubs'], |
| variants: ['full'], |
| }, |
| correlation: { |
| labelKey: 'header.panelCatCorrelation', |
| panelKeys: ['military-correlation', 'escalation-correlation', 'economic-correlation', 'disaster-correlation'], |
| variants: ['full'], |
| }, |
| regionalNews: { |
| labelKey: 'header.panelCatRegionalNews', |
| panelKeys: ['politics', 'us', 'europe', 'middleeast', 'africa', 'latam', 'asia'], |
| variants: ['full'], |
| }, |
| marketsFinance: { |
| labelKey: 'header.panelCatMarketsFinance', |
| panelKeys: ['commodities', 'energy-complex', 'energy-risk-overview', 'pipeline-status', 'storage-facility-map', 'oil-inventories', 'fuel-prices', 'chokepoint-strip', 'fuel-shortages', 'energy-disruptions', 'hormuz-tracker', 'energy-crisis', 'markets', 'economic', 'global-procurement', 'trade-policy', 'sanctions-pressure', 'supply-chain', 'china-corridors', 'china-activity-nowcast', 'finance', 'polymarket', 'macro-signals', 'gulf-economies', 'etf-flows', 'stablecoins', 'crypto', 'heatmap', 'aaii-sentiment', 'cot-positioning', 'earnings-calendar', 'economic-calendar', 'fear-greed', 'fsi', 'macro-tiles', 'market-breadth', 'liquidity-shifts', 'national-debt', 'positioning-247', 'wsb-ticker-scanner', 'yield-curve', 'gold-intelligence', 'bigmac', 'market-implications'], |
| variants: ['full', 'energy'], |
| }, |
| topical: { |
| labelKey: 'header.panelCatTopical', |
| panelKeys: ['energy', 'gov', 'thinktanks', 'tech', 'ai', 'layoffs'], |
| variants: ['full', 'energy'], |
| }, |
| dataTracking: { |
| labelKey: 'header.panelCatDataTracking', |
| panelKeys: ['monitors', 'satellite-fires', 'ucdp-events', 'displacement', 'climate', 'climate-news', 'population-exposure', 'security-advisories', 'radiation-watch', 'oref-sirens', 'world-clock', 'tech-readiness', 'disease-outbreaks', 'fao-food-price-index', 'grocery-basket', 'defense-patents'], |
| variants: ['full', 'energy'], |
| }, |
|
|
| |
| techAi: { |
| labelKey: 'header.panelCatTechAi', |
| panelKeys: ['ai', 'tech', 'hardware', 'cloud', 'dev', 'github', 'producthunt', 'events', 'service-status', 'tech-readiness', 'internet-disruptions', 'tech-hubs'], |
| variants: ['tech'], |
| }, |
| startupsVc: { |
| labelKey: 'header.panelCatStartupsVc', |
| panelKeys: ['startups', 'vcblogs', 'regionalStartups', 'unicorns', 'accelerators', 'funding', 'ipo'], |
| variants: ['tech'], |
| }, |
| securityPolicy: { |
| labelKey: 'header.panelCatSecurityPolicy', |
| panelKeys: ['security', 'policy', 'ai-regulation'], |
| variants: ['tech'], |
| }, |
| techMarkets: { |
| labelKey: 'header.panelCatMarkets', |
| panelKeys: ['markets', 'finance', 'crypto', 'economic', 'global-procurement', 'sanctions-pressure', 'polymarket', 'macro-signals', 'etf-flows', 'stablecoins', 'layoffs', 'monitors', 'world-clock'], |
| variants: ['tech'], |
| }, |
|
|
| |
| finMarkets: { |
| labelKey: 'header.panelCatMarkets', |
| panelKeys: ['markets', 'stock-analysis', 'stock-backtest', 'daily-market-brief', 'markets-news', 'heatmap', 'macro-signals', 'analysis', 'polymarket'], |
| variants: ['finance'], |
| }, |
| fixedIncomeFx: { |
| labelKey: 'header.panelCatFixedIncomeFx', |
| panelKeys: ['forex', 'bonds'], |
| variants: ['finance'], |
| }, |
| finCommodities: { |
| labelKey: 'header.panelCatCommodities', |
| panelKeys: ['commodities', 'energy-complex', 'commodities-news'], |
| variants: ['finance'], |
| }, |
| cryptoDigital: { |
| labelKey: 'header.panelCatCryptoDigital', |
| panelKeys: ['crypto', 'crypto-heatmap', 'defi-tokens', 'ai-tokens', 'other-tokens', 'crypto-news', 'etf-flows', 'stablecoins', 'fintech'], |
| variants: ['finance'], |
| }, |
| centralBanksEcon: { |
| labelKey: 'header.panelCatCentralBanks', |
| panelKeys: ['centralbanks', 'economic', 'global-procurement', 'energy-complex', 'trade-policy', 'sanctions-pressure', 'supply-chain', 'china-corridors', 'china-activity-nowcast', 'economic-news'], |
| variants: ['finance'], |
| }, |
| dealsInstitutional: { |
| labelKey: 'header.panelCatDeals', |
| panelKeys: ['ipo', 'derivatives', 'institutional', 'fin-regulation'], |
| variants: ['finance'], |
| }, |
| gulfMena: { |
| labelKey: 'header.panelCatGulfMena', |
| panelKeys: ['gulf-economies', 'gcc-investments', 'gccNews', 'consumer-prices', 'monitors', 'world-clock'], |
| variants: ['finance'], |
| }, |
|
|
| |
| commodityPrices: { |
| labelKey: 'header.panelCatCommodityPrices', |
| panelKeys: ['commodities', 'energy-complex', 'gold-silver', 'energy', 'base-metals', 'critical-minerals', 'markets', 'heatmap', 'macro-signals'], |
| variants: ['commodity'], |
| }, |
| miningIndustry: { |
| labelKey: 'header.panelCatMining', |
| panelKeys: ['commodity-news', 'mining-news', 'mining-companies', 'supply-chain', 'china-corridors', 'china-activity-nowcast', 'commodity-regulation'], |
| variants: ['commodity'], |
| }, |
| commodityEcon: { |
| labelKey: 'header.panelCatCommodityEcon', |
| panelKeys: ['trade-policy', 'sanctions-pressure', 'economic', 'gulf-economies', 'gcc-investments', 'consumer-prices', 'finance', 'polymarket', 'airline-intel', 'world-clock', 'monitors'], |
| variants: ['commodity'], |
| }, |
|
|
| |
| happyNews: { |
| labelKey: 'header.panelCatHappyNews', |
| panelKeys: ['positive-feed', 'progress', 'counters', 'spotlight', 'breakthroughs', 'digest'], |
| variants: ['happy'], |
| }, |
| happyPlanet: { |
| labelKey: 'header.panelCatHappyPlanet', |
| panelKeys: ['species', 'renewable', 'giving'], |
| variants: ['happy'], |
| }, |
| }; |
|
|
| export interface VariantPanelCategory { |
| key: string; |
| labelKey: string; |
| panelKeys: string[]; |
| } |
|
|
| |
| |
| |
| export function getVariantPanelCategories( |
| panelSettings: Record<string, PanelConfig>, |
| variant: string, |
| ): VariantPanelCategory[] { |
| return Object.entries(PANEL_CATEGORY_MAP) |
| .filter(([, def]) => !def.variants || def.variants.includes(variant)) |
| .filter(([, def]) => def.panelKeys.some((pk) => panelSettings[pk]?.enabled)) |
| .map(([key, def]) => ({ key, labelKey: def.labelKey, panelKeys: def.panelKeys })); |
| } |
|
|
| |
| |
| |
| |
| export function getProPanelKeys( |
| panelSettings: Record<string, PanelConfig>, |
| variant: string, |
| ): string[] { |
| return Object.keys(panelSettings).filter((key) => |
| panelSettings[key]?.enabled && Boolean(getEffectivePanelConfig(key, variant).premium), |
| ); |
| } |
|
|
| |
| export const MONITOR_COLORS = [ |
| '#44ff88', |
| '#ff8844', |
| '#4488ff', |
| '#ff44ff', |
| '#ffff44', |
| '#ff4444', |
| '#44ffff', |
| '#88ff44', |
| '#ff88ff', |
| '#88ffff', |
| ]; |
|
|
| export const STORAGE_KEYS = { |
| panels: 'worldmonitor-panels', |
| monitors: 'worldmonitor-monitors', |
| mapLayers: 'worldmonitor-layers', |
| disabledFeeds: 'worldmonitor-disabled-feeds', |
| } as const; |
|
|