diff options
| author | realtradam <[email protected]> | 2024-07-27 02:00:57 -0400 |
|---|---|---|
| committer | realtradam <[email protected]> | 2024-07-27 02:00:57 -0400 |
| commit | de3d80ce3ea20a869d700c3238020d44059de099 (patch) | |
| tree | ef849326ea4922530990d5dc29cb8ff3532e82fe /frontend/src | |
| parent | 6b342f97f6a605b7e1fe34584abbbf962ca39b7c (diff) | |
| download | spring-blog-de3d80ce3ea20a869d700c3238020d44059de099.tar.gz spring-blog-de3d80ce3ea20a869d700c3238020d44059de099.zip | |
working login and auth
Diffstat (limited to 'frontend/src')
| -rw-r--r-- | frontend/src/components/Layout.tsx | 44 | ||||
| -rw-r--r-- | frontend/src/pages/articles/Article.tsx (renamed from frontend/src/pages/Article.tsx) | 0 | ||||
| -rw-r--r-- | frontend/src/pages/articles/New.tsx | 83 | ||||
| -rw-r--r-- | frontend/src/pages/auth/Login.tsx (renamed from frontend/src/pages/Login.tsx) | 44 | ||||
| -rw-r--r-- | frontend/src/pages/auth/Register.tsx (renamed from frontend/src/pages/Register.tsx) | 0 | ||||
| -rw-r--r-- | frontend/src/routes/index.tsx | 19 |
6 files changed, 158 insertions, 32 deletions
diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index f7b8591..cdd3929 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -1,8 +1,33 @@ import { Outlet } from "react-router-dom"; +import { useState, useEffect } from "react"; export default function Layout() { + const [user, setUser] = useState<string | null>(null); + + useEffect(() => { + const url = `${import.meta.env.VITE_API_TITLE}/api/v1/profile`; + fetch(url, { + credentials: 'include', + method: 'get', + }).then((response) => { + if (response.ok) { + return response.json(); + } + throw new Error("Network response was not ok."); + }).then((response) => { setUser(response.username); console.log(response.username) }); + }, [user]); + + const logout = () => { + fetch(`${import.meta.env.VITE_API_TITLE}/api/v1/logout`, { + credentials: 'include', + method: 'get', + }).then(() => { + setUser(null); + }); + } + return( <> <div className="w-full bg-gray-200 min-h-screen font-sans leading-normal tracking-normal"> @@ -11,14 +36,7 @@ export default function Layout() <div className="container mx-auto flex items-center"> <div className="flex text-white font-extrabold"> {/*th:if="${(user == null || user.username == null)}"*/} - <a className="flex text-white text-base no-underline hover:text-white hover:no-underline" href="#"> - ☕<span className="hidden w-0 md:w-auto md:block pl-1">Spring!</span> - </a> -{/*th:if="${!(user == null || user.username == null)}"*/} - <a className="flex text-white text-base no-underline hover:text-white hover:no-underline" href="#"> -{/*th:text="'Logged in as: ' + ${user.username}"*/} - ☕<span className="hidden w-0 md:w-auto md:block pl-1"></span> - </a> +<a className="flex text-white text-base no-underline whitespace-nowrap hover:text-white hover:no-underline" href="#">☕ { user === null ? "Spring!" : user }<span className="hidden w-0 md:w-auto md:block pl-1"></span></a> </div> <div className="flex pl-4 text-sm place-content-between w-full"> <ul className="list-reset flex justify-between flex-1 md:flex-none items-center"> @@ -26,16 +44,14 @@ export default function Layout() <a className="inline-block py-2 px-2 text-white no-underline" href="/">HOME</a> </li> <li className="mr-2"> - <a className="inline-block text-indigo-200 no-underline hover:text-gray-100 hover:text-underline py-2 px-2" href="/articles/new">NEW</a> + <a className="inline-block text-indigo-200 no-underline hover:text-gray-100 hover:text-underline py-2 px-2" href="/article/new">NEW</a> </li> <li className="mr-2"> <a className="inline-block text-indigo-200 no-underline hover:text-indigo-100 hover:text-underline py-2 px-2" href="/register">REGISTER</a> </li> - <li className="mr-2"> -{/*th:if="${(user == null || user.username == null)}"*/} - <a className="inline-block text-indigo-200 no-underline hover:text-indigo-100 hover:text-underline py-2 px-2" href="/userlogin">LOGIN</a> -{/*th:if="${!(user == null || user.username == null)}"*/} - <a className="inline-block text-indigo-200 no-underline hover:text-indigo-100 hover:text-underline py-2 px-2" href="/logout">LOGOUT</a> + <li className="mr-2">{ user === null ? + <a className="inline-block text-indigo-200 no-underline hover:text-indigo-100 hover:text-underline py-2 px-2" href="/login">LOGIN</a> : + <button className="inline-block text-indigo-200 no-underline hover:text-indigo-100 hover:text-underline py-2 px-2" onClick={logout} >LOGOUT</button> } </li> </ul> {/*th:action="@{/articles/search}"*/} diff --git a/frontend/src/pages/Article.tsx b/frontend/src/pages/articles/Article.tsx index b367811..b367811 100644 --- a/frontend/src/pages/Article.tsx +++ b/frontend/src/pages/articles/Article.tsx diff --git a/frontend/src/pages/articles/New.tsx b/frontend/src/pages/articles/New.tsx new file mode 100644 index 0000000..3402f22 --- /dev/null +++ b/frontend/src/pages/articles/New.tsx @@ -0,0 +1,83 @@ +import { FormEvent } from "react"; +import { useNavigate } from "react-router-dom"; + +export default function NewArticle () { + const navigate = useNavigate(); + + const handleSubmit = async (e: FormEvent<HTMLFormElement>) => { + e.preventDefault(); //stops submit from happening + + const target = e.target as typeof e.target & { + title: { value: string }; + photoUrl: { value: string }; + content: { value: string }; + }; + + const formData = new FormData(); + formData.append('title', target.title.value); + formData.append('photoUrl', target.photoUrl.value); + formData.append('content', target.content.value); + + const response = await fetch(`${import.meta.env.VITE_API_TITLE}/api/v1/article/new`, { + credentials: 'include', + method: 'post', + body: formData, + }); + if(response.ok) { + navigate("/"); + } + else { + console.log(response); + alert("check console for error"); + } + }; + return( + <> +<div className="flex justify-center bg-white p-12"> +<form onSubmit={handleSubmit} method="post" className="w-full max-w-lg"> + <div className="flex flex-wrap -mx-3 mb-6"> + <div className="w-full md:w-1/2 px-3 mb-6 md:mb-0"> + <label className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"> + Title + </label> + <input className="appearance-none block w-full bg-gray-200 text-gray-700 border border-red-500 rounded py-3 px-4 mb-3 leading-tight focus:outline-none focus:bg-white" + id="title" + type="text" + name="title" + placeholder="Yep"/> + <p className="text-red-500 text-xs italic">Please fill out this field.</p> + </div> + <div className="w-full md:w-1/2 px-3"> + <label className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"> + Photo URL + </label> + <input className="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500" + id="photoUrl" + type="text" + name="photoUrl" + placeholder="Doe"/> + <p className="text-red-500 text-xs italic">Please fill out this field.</p> + </div> + </div> + <div className="flex flex-wrap -mx-3 mb-6"> + <div className="w-full px-3"> + <label className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"> + Content + </label> + <input className="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500" + id="content" + type="text" + name="content" + placeholder="Doe"/> + <p className="text-red-500 text-xs italic">Please fill out this field.</p> + </div> + </div> + <div className="flex flex-wrap mb-2"> + </div> + <button type="submit" className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Create</button> + +</form> +</div> + </> + ); +} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/auth/Login.tsx index 317fdb9..5a1e858 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/auth/Login.tsx @@ -1,7 +1,10 @@ -import { useState, useEffect } from "react"; -import { useParams, useNavigate } from "react-router-dom"; +import { FormEvent } from "react"; +import { useNavigate } from "react-router-dom"; -export default function Article () { +//type setUser = { setUser: { func: React.Dispatch<React.SetStateAction<string | null>> } }; +type user = { set: React.Dispatch<React.SetStateAction<string | null>>, value: string | null }; + +export default function Login ({user}: {user: user}) { const navigate = useNavigate(); const handleSubmit = async (e: FormEvent<HTMLFormElement>) => { @@ -17,24 +20,39 @@ const handleSubmit = async (e: FormEvent<HTMLFormElement>) => { formData.append('username', target.username.value); formData.append('password', target.password.value); - const response = await fetch(`${import.meta.env.VITE_API_TITLE}/api/v1/register`, { + const response = await fetch(`${import.meta.env.VITE_API_TITLE}/api/v1/login`, { credentials: 'include', method: 'post', body: formData, + }).then((res) => { + if(res.ok) { + const url = `${import.meta.env.VITE_API_TITLE}/api/v1/profile`; + fetch(url, { + credentials: 'include', + method: 'get', + }).then((response) => { + if (response.ok) { + return response.json(); + } + throw new Error("Network response was not ok."); + }).then((response) => { + user.set(response.username); + console.log("USER:"); + console.log(user); + console.log(user.value); + console.log(response.username); + navigate("/"); + }); + } + else { + console.log(response); + alert("check console for error"); + } }); - if(response.ok) { - navigate("/"); - } - else { - alert("error"); - } }; return( <> -<div className="text-xl p-4 bg-black text-red-500">Invalid Username/Password</div> -<div className="text-xl p-4 bg-black text-red-500">You have been logged out</div> - <div className="flex h-full justify-center bg-white p-12"> <form onSubmit={handleSubmit} method="post" className="w-full max-w-lg"> <div className="flex flex-wrap -mx-3 mb-6"> diff --git a/frontend/src/pages/Register.tsx b/frontend/src/pages/auth/Register.tsx index 14ceea4..14ceea4 100644 --- a/frontend/src/pages/Register.tsx +++ b/frontend/src/pages/auth/Register.tsx diff --git a/frontend/src/routes/index.tsx b/frontend/src/routes/index.tsx index 6d7ffb1..e77421c 100644 --- a/frontend/src/routes/index.tsx +++ b/frontend/src/routes/index.tsx @@ -1,20 +1,29 @@ import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import { useState } from "react"; import Home from "../pages/Home"; import Layout from "../components/Layout"; -import Article from "../pages/Article"; -import Register from "../pages/Register"; -import Login from "../pages/Login"; +import Article from "../pages/articles/Article"; +import NewArticle from "../pages/articles/New"; +import Register from "../pages/auth/Register"; +import Login from "../pages/auth/Login"; + +type user = { set: React.Dispatch<React.SetStateAction<string | null>>, value: string | null }; export default function Index() { + const [user, setUser] = useState<string | null>(null); + + const userProp: user = { set: setUser, value: user }; + return (<> <Router> <Routes> - <Route path="/" element = {<Layout/>}> + <Route path="/" element = {<Layout />}> <Route index element={<Home />} /> <Route path="/article/:id" element={<Article />} /> + <Route path="/article/new" element={<NewArticle />} /> <Route path="register" element={<Register />} /> - <Route path="login" element={<Login />} /> + <Route path="login" element={<Login user={userProp}/>} /> </Route> </Routes> </Router> |
