import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { ArrowLeft, Crosshair, WifiHigh, ShieldChevron, LockKey, CornersOut, CaretRight, FileText, MapPin, Clock, User, ShareNetwork, Radioactive, TerminalWindow, X, MagnifyingGlass, } from '@phosphor-icons/react'; import { motion } from 'framer-motion'; import Seo from '../components/Seo'; import piml from 'piml'; import TacticalGlobe from '../components/TacticalGlobe'; // Helper for scrambling text effect const ScrambleText = ({ text, speed = 30, delay = 0 }) => { const [display, setDisplay] = useState(''); const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?'; useEffect(() => { let iteration = 0; let timer = null; // Initial delay const startTimeout = setTimeout(() => { timer = setInterval(() => { setDisplay( text .split('') .map((letter, index) => { if (index < iteration) { return text[index]; } return chars[Math.floor(Math.random() * chars.length)]; }) .join(''), ); if (iteration >= text.length) { clearInterval(timer); } iteration += 1; // Faster reveal }, speed); }, delay); return () => { clearTimeout(startTimeout); if (timer) clearInterval(timer); }; }, [text, speed, delay]); return {display}; }; const THEMES = { matrix: { id: 'matrix', label: 'MATRIX_PROTO', primary: 'text-emerald-500', primaryHover: 'hover:text-emerald-400', primaryBg: 'bg-emerald-500', primaryBorder: 'border-emerald-500', primaryBorderHover: 'hover:border-emerald-500', accent: 'text-emerald-700', accentBg: 'bg-emerald-900', accentBorder: 'border-emerald-900', selection: 'selection:bg-emerald-500/50', // Specific Opacities bgMain10: 'bg-emerald-500/10', bgMain05: 'bg-emerald-500/5', bgMain20: 'bg-emerald-900/20', borderMain30: 'border-emerald-500/30', borderMain20: 'border-emerald-500/20', borderMain10: 'border-emerald-500/10', borderMain50: 'border-emerald-500/50', borderDim30: 'border-emerald-900/30', textMain50: 'text-emerald-500/50', textMain60: 'text-emerald-500/60', textDim600: 'text-emerald-600', textDim800: 'text-emerald-800', textBody: 'text-emerald-300', textBright: 'text-emerald-400', decoration: 'via-emerald-500/[0.03]', globe: '#10b981', globeActive: '#ef4444', glitchShadow1: '#00ff00', glitchShadow2: '#ff0000', }, fallout: { id: 'fallout', label: 'NEW_VEGAS_OS', primary: 'text-amber-500', primaryHover: 'hover:text-amber-400', primaryBg: 'bg-amber-500', primaryBorder: 'border-amber-500', primaryBorderHover: 'hover:border-amber-500', accent: 'text-amber-700', accentBg: 'bg-amber-900', accentBorder: 'border-amber-900', selection: 'selection:bg-amber-500/50', // Specific Opacities bgMain10: 'bg-amber-500/10', bgMain05: 'bg-amber-500/5', bgMain20: 'bg-amber-900/20', borderMain30: 'border-amber-500/30', borderMain20: 'border-amber-500/20', borderMain10: 'border-amber-500/10', borderMain50: 'border-amber-500/50', borderDim30: 'border-amber-900/30', textMain50: 'text-amber-500/50', textMain60: 'text-amber-500/60', textDim600: 'text-amber-600', textDim800: 'text-amber-800', textBody: 'text-amber-300', textBright: 'text-amber-400', decoration: 'via-amber-500/[0.03]', globe: '#f59e0b', globeActive: '#ef4444', glitchShadow1: '#f59e0b', glitchShadow2: '#ff0000', }, }; const ReadingPage = () => { const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [selectedId, setSelectedId] = useState(null); const [globeColor, setGlobeColor] = useState('#10b981'); // Default Emerald const [theme, setTheme] = useState('matrix'); const [searchQuery, setSearchQuery] = useState(''); const [filterStatus, setFilterStatus] = useState('ALL'); // ALL, UNREAD, READ const currentTheme = THEMES[theme]; const toggleTheme = () => { setTheme((prev) => (prev === 'matrix' ? 'fallout' : 'matrix')); }; useEffect(() => { const fetchReadings = async () => { // Simulate "Decrypting" delay setTimeout(async () => { try { const response = await fetch('/logs/reading/reading.piml'); if (!response.ok) return; const text = await response.text(); const data = piml.parse(text); const sortedItems = (data.logs || []).map((item, idx) => ({ ...item, id: idx, status: item.status === 'read' ? 'COMPLETED' : 'ACTIVE', priority: item.status === 'read' ? 'LOW' : 'CRITICAL', clearance: ['TOP SECRET', 'CONFIDENTIAL', 'RESTRICTED'][idx % 3], // Fake coordinates for the gimmick lat: (Math.random() * 180 - 90).toFixed(4), lng: (Math.random() * 360 - 180).toFixed(4), sector: `SEC-${Math.floor(Math.random() * 999)}`, })); setItems(sortedItems); } catch (err) { console.error('Intel retrieval failed:', err); } finally { setLoading(false); } }, 800); }; fetchReadings(); }, []); const selectedItem = items.find((i) => i.id === selectedId); const filteredItems = items.filter((item) => { const matchesSearch = (item.title?.toLowerCase() || '').includes(searchQuery.toLowerCase()) || (item.author?.toLowerCase() || '').includes(searchQuery.toLowerCase()); if (filterStatus === 'ALL') return matchesSearch; if (filterStatus === 'UNREAD') return matchesSearch && item.status === 'ACTIVE'; if (filterStatus === 'READ') return matchesSearch && item.status === 'COMPLETED'; return matchesSearch; }); useEffect(() => { if (selectedItem) { // Update globe color based on item status setGlobeColor( selectedItem.status === 'ACTIVE' ? currentTheme.globeActive : currentTheme.globe, ); } else { setGlobeColor(currentTheme.globe); } }, [selectedItem, currentTheme]); const getDomain = (url) => { try { return new URL(url).hostname.replace('www.', '').toUpperCase(); } catch { return 'UNKNOWN_NET'; } }; return (
{selectedItem.description}