First pass login support.

This commit is contained in:
James Pace 2026-08-22 10:42:56 -04:00
parent b46806ada1
commit 855c479caf
4 changed files with 70 additions and 1 deletions

View File

@ -14,6 +14,7 @@ import { Provider as JotaiProvider } from "jotai";
import { Home } from "./Home.tsx"; import { Home } from "./Home.tsx";
import { Video } from "./Video.tsx"; import { Video } from "./Video.tsx";
import { Version } from "./Version.tsx"; import { Version } from "./Version.tsx";
import { Login } from "./Login.tsx";
import "./App.css"; import "./App.css";
function App() { function App() {
@ -43,6 +44,10 @@ const router = createBrowserRouter([
path: "/video", path: "/video",
element: <Video />, element: <Video />,
}, },
{
path: "/login",
element: <Login />,
},
]); ]);
export default App; export default App;

View File

@ -12,7 +12,7 @@ import { AppNav, Footer } from "./components/AppNav.tsx";
import { Container, Row, Col, Image, Card } from "react-bootstrap"; import { Container, Row, Col, Image, Card } from "react-bootstrap";
import { atom, useAtomValue } from "jotai"; import { atom, useAtomValue } from "jotai";
import { atomWithQuery } from "jotai-tanstack-query"; import { atomWithQuery } from "jotai-tanstack-query";
import { DiagnosticsCard } from "./DiagnosticsCard.tsx"; import { DiagnosticsCard } from "./components/DiagnosticsCard.tsx";
const statusStringQuery = async () => { const statusStringQuery = async () => {
const resp = await fetch("api/status"); const resp = await fetch("api/status");

64
src/Login.tsx Normal file
View File

@ -0,0 +1,64 @@
//
// Copyright 2026 James Pace
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
//
// This Source Code Form is "Incompatible With Secondary Licenses", as
// defined by the Mozilla Public License, v. 2.0.
//
import { AppNav, Footer } from "./components/AppNav.tsx";
import { Container, Row, Col, Card, Button, Form } from "react-bootstrap";
import { atom, useAtomValue } from "jotai";
import { useNavigate } from "react-router-dom";
export function Login() {
return (
<div>
<AppNav />
<Container className="vert-padded">
<LoginForm />
</Container>
<Footer />
</div>
);
}
function LoginForm() {
const navigate = useNavigate();
const onSubmit = async (event) => {
event.preventDefault();
console.log(event.target);
const formEntries = new FormData(event.target);
const formData = Object.fromEntries(formEntries);
console.log(formData);
const resp = await fetch("/api/login", {
method: 'POST',
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(formData),
});
if(resp.redirected) {
navigate("/");
}
}
return (
<Form onSubmit={onSubmit}>
<Form.Group controlId="passwordForm">
<Form.Label>Password</Form.Label>
<Form.Control name="password" type="password" />
</Form.Group>
<Button type="submit">
Submit
</Button>
</Form>
);
}