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, Link } from "react-router-dom"; import "./App.css"; import { apiFetch } from "./api"; function App() { const [people, setPeople] = useState([]); const [token, setToken] = useState( localStorage.getItem("token") || "" ); const [theme, setTheme] = useState("default"); const [isShaderTheme, setIsShaderTheme] = useState(false); useEffect(() => { if (theme !== "default") { document.body.classList.add("shader-theme"); setIsShaderTheme(true); } else { document.body.classList.remove("shader-theme"); setIsShaderTheme(false); } }, [theme]); const fetchPeople = () => { if (!token) return; 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)); }; useEffect(() => { fetchPeople(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [token]); const handleLogin = (newToken: string) => { setToken(newToken); localStorage.setItem("token", newToken); }; const handleLogout = () => { setToken(""); setPeople([]); localStorage.removeItem("token"); }; if (!token) { return ; } return (
People List Games Filter
{isShaderTheme && } } /> } /> } /> } /> } />
); } export default App;