import { render } from 'solid-js/web'; import { createSignal, onMount, Show, For } from 'solid-js'; // --- Icons for new features --- const BellIcon = () => ; const MegaphoneIcon = () => ; function App() { const [loading, setLoading] = createSignal(true); const [status, setStatus] = createSignal(''); const [userData, setUserData] = createSignal(null); const [globalNotifications, setGlobalNotifications] = createSignal({}); const [showUserNotifications, setShowUserNotifications] = createSignal(false); const [showGlobalNotifications, setShowGlobalNotifications] = createSignal(false); const getToken = () => localStorage.getItem('exocore-token') || ''; const getCookies = () => localStorage.getItem('exocore-cookies') || ''; async function fetchUserInfo() { const token = getToken(); const cookies = getCookies(); if (!token || !cookies) { window.location.href = '/private/server/exocore/web/public/login'; return; } try { const res = await fetch('/private/server/exocore/web/userinfo', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, cookies }), }); const data = await res.json(); if (data.data?.user && data.data.user.verified === 'success') { setUserData(data.data.user); setGlobalNotifications(data.data.global?.notifications || {}); setStatus(''); } else { window.location.href = '/private/server/exocore/web/public/login'; } } catch (err) { setStatus('Failed to fetch user info: ' + err.message); } finally { setLoading(false); } } function timeAgo(dateString) { const date = new Date(dateString); const now = new Date(); const seconds = Math.floor((now - date) / 1000); let interval = seconds / 86400; if (interval > 1) return Math.floor(interval) + " days ago"; interval = seconds / 3600; if (interval > 1) return Math.floor(interval) + " hours ago"; interval = seconds / 60; if (interval > 1) return Math.floor(interval) + " minutes ago"; return "Just now"; } onMount(() => { const link = document.createElement('link'); link.href = 'https://fonts.googleapis.com/css2?family=Patrick+Hand&display=swap'; link.rel = 'stylesheet'; document.head.appendChild(link); // Styles are now controlled by the
From: {from}
From: {notif.from}
{timeAgo(notif.date)}
Hello, {userData().user}!
Level: {userData().level}
Days since joined: {userData().count_days}
Manage Plan > Follow Exocore on Facebook ); } render(() =>