TypeScript · 2733 bytes Raw Blame History
1 import { useEffect, useState } from "react";
2 import { Routes, Route, NavLink, useNavigate } from "react-router-dom";
3 import { getInitStatus } from "./hooks/useApi";
4 import type { InitStatus } from "./types";
5 import GamesView from "./views/GamesView";
6 import SettingsView from "./views/SettingsView";
7 import PrefixesView from "./views/PrefixesView";
8 import SetupView from "./views/SetupView";
9
10 function App() {
11 const [initStatus, setInitStatus] = useState<InitStatus | null>(null);
12 const [loading, setLoading] = useState(true);
13 const navigate = useNavigate();
14
15 useEffect(() => {
16 checkInit();
17 }, []);
18
19 async function checkInit() {
20 try {
21 const status = await getInitStatus();
22 setInitStatus(status);
23 if (!status.initialized) {
24 navigate("/setup");
25 }
26 } catch (err) {
27 console.error("Failed to check init status:", err);
28 } finally {
29 setLoading(false);
30 }
31 }
32
33 if (loading) {
34 return (
35 <div className="setup-container">
36 <div className="spinner" />
37 </div>
38 );
39 }
40
41 // Show setup if not initialized
42 if (!initStatus?.initialized) {
43 return (
44 <Routes>
45 <Route path="*" element={<SetupView onComplete={() => checkInit()} />} />
46 </Routes>
47 );
48 }
49
50 return (
51 <div className="app">
52 <aside className="sidebar">
53 <div className="sidebar-header">
54 <h1>WANDA</h1>
55 <p>WeMod on Linux</p>
56 </div>
57 <nav>
58 <ul className="nav-list">
59 <li className="nav-item">
60 <NavLink
61 to="/"
62 className={({ isActive }) => `nav-link ${isActive ? "active" : ""}`}
63 end
64 >
65 Games
66 </NavLink>
67 </li>
68 <li className="nav-item">
69 <NavLink
70 to="/prefixes"
71 className={({ isActive }) => `nav-link ${isActive ? "active" : ""}`}
72 >
73 Prefixes
74 </NavLink>
75 </li>
76 <li className="nav-item">
77 <NavLink
78 to="/settings"
79 className={({ isActive }) => `nav-link ${isActive ? "active" : ""}`}
80 >
81 Settings
82 </NavLink>
83 </li>
84 </ul>
85 </nav>
86 </aside>
87 <main className="main-content">
88 <Routes>
89 <Route path="/" element={<GamesView />} />
90 <Route path="/prefixes" element={<PrefixesView />} />
91 <Route path="/settings" element={<SettingsView />} />
92 <Route path="/setup" element={<SetupView onComplete={() => checkInit()} />} />
93 </Routes>
94 </main>
95 </div>
96 );
97 }
98
99 export default App;