From 42f1b4de384bcbbdab3b80d8e5cc53b36fcffd50 Mon Sep 17 00:00:00 2001 From: Adam Mathes Date: Thu, 12 Feb 2026 21:50:56 -0800 Subject: Implement frontend login logic with >90% coverage --- frontend/coverage/src/App.tsx.html | 271 +++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 frontend/coverage/src/App.tsx.html (limited to 'frontend/coverage/src/App.tsx.html') diff --git a/frontend/coverage/src/App.tsx.html b/frontend/coverage/src/App.tsx.html new file mode 100644 index 0000000..7a8d1c9 --- /dev/null +++ b/frontend/coverage/src/App.tsx.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/App.tsx + + + + + + + + + +
+
+

All files / src App.tsx

+
+ +
+ 80% + Statements + 12/15 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 80% + Lines + 12/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +2x +2x +  +2x +1x +  +1x +1x +  +  +  +  +  +  +  +2x +1x +  +  +1x +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import React, { useEffect, useState } from 'react';
+import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom';
+import Login from './components/Login';
+import './App.css';
+ 
+// Protected Route wrapper
+function RequireAuth({ children }: { children: React.ReactElement }) {
+  const [auth, setAuth] = useState<boolean | null>(null);
+  const location = useLocation();
+ 
+  useEffect(() => {
+    fetch('/api/auth')
+      .then((res) => {
+        if (res.ok) {
+          setAuth(true);
+        } else E{
+          setAuth(false);
+        }
+      })
+      .catch(() => setAuth(false));
+  }, []);
+ 
+  if (auth === null) {
+    return <div>Loading...</div>;
+  }
+ 
+  Iif (!auth) {
+    return <Navigate to="/login" state={{ from: location }} replace />;
+  }
+ 
+  return children;
+}
+ 
+function Dashboard() {
+  // Placeholder for now
+  return (
+    <div>
+      <h1>Dashboard</h1>
+      <p>Welcome to the new Neko/v2 frontend.</p>
+    </div>
+  )
+}
+ 
+function App() {
+  return (
+    <BrowserRouter basename="/v2">
+      <Routes>
+        <Route path="/login" element={<Login />} />
+        <Route
+          path="/*"
+          element={
+            <RequireAuth>
+              <Dashboard />
+            </RequireAuth>
+          }
+        />
+      </Routes>
+    </BrowserRouter>
+  );
+}
+ 
+export default App;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file -- cgit v1.2.3