import { useState, useEffect } from "react"; import { Person, PersonList as PersonListProto } from "../items"; import { Login } from "./Login"; import { PersonList } from "./PersonList"; import { PersonDetails } from "./PersonDetails"; import { GameList } from "./GameList"; import { GameFilter } from "./GameFilter"; import { GameDetails } from "./GameDetails"; import { ShaderBackground } from "./ShaderBackground"; import { BrowserRouter, Routes, Route, NavLink } from "react-router-dom"; import "./App.css"; import { apiFetch } from "./api"; import { Toast } from "./Toast"; import type { ToastType } from "./Toast"; interface ToastMessage { id: number; message: string; type: ToastType; } function App() { const [people, setPeople] = useState([]); const [token, setToken] = useState( localStorage.getItem("token") || "" ); const [theme, _setTheme] = useState( localStorage.getItem("theme") || "default" ); const setTheme = (theme: string) => { _setTheme(theme); localStorage.setItem("theme", theme); }; const [toasts, setToasts] = useState([]); const [isLoading, setIsLoading] = useState(false); useEffect(() => { if (theme !== "default") { document.body.classList.add("shader-theme"); } else { document.body.classList.remove("shader-theme"); } }, [theme]); const addToast = (message: string, type: ToastType = "info") => { const id = Date.now(); setToasts((prev) => [...prev, { id, message, type }]); }; const removeToast = (id: number) => { setToasts((prev) => prev.filter((t) => t.id !== id)); }; const fetchPeople = () => { if (!token) return; setIsLoading(true); apiFetch("/api") .then((res) => res.arrayBuffer()) .then((buffer) => { const list = PersonListProto.decode(new Uint8Array(buffer)); setPeople(list.person); }) .catch((err) => { console.error("Failed to fetch people:", err); addToast("Failed to fetch people list", "error"); }) .finally(() => setIsLoading(false)); }; useEffect(() => { fetchPeople(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [token]); const handleLogin = (newToken: string) => { setToken(newToken); localStorage.setItem("token", newToken); addToast("Welcome back!", "success"); }; const handleLogout = () => { setToken(""); setPeople([]); localStorage.removeItem("token"); addToast("Logged out successfully", "info"); }; if (!token) { return ; } const themes = [ { id: "default", label: "Default", icon: "🏠" }, { id: "blackhole", label: "Blackhole", icon: "🕳️" }, { id: "star", label: "Star", icon: "⭐" }, { id: "ball", label: "Ball", icon: "⚽" }, { id: "reflect", label: "Reflect", icon: "🪞" }, { id: "clouds", label: "Clouds", icon: "☁️" }, ]; return ( {isLoading &&
}
{toasts.map((toast) => ( removeToast(toast.id)} /> ))}
People Games Filter
{themes.map((t) => ( ))}
} /> } /> } /> } /> } />
); } export default App;