navbar renders appropriately for now
This commit is contained in:
@@ -7,23 +7,25 @@ import { Button, Page, Panel } from "../ui";
|
|||||||
import Form, { FormConfig } from "../ui/Form";
|
import Form, { FormConfig } from "../ui/Form";
|
||||||
|
|
||||||
export default function Login() {
|
export default function Login() {
|
||||||
|
// setup and local state
|
||||||
const authContext = useAuthContext();
|
const authContext = useAuthContext();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const [form, setForm] = useState<JSX.Element[]>();
|
const [form, setForm] = useState<JSX.Element[]>();
|
||||||
const [input, setInput] = useState<IUserAuth>({
|
const [input, setInput] = useState<IUserAuth>({
|
||||||
email: '',
|
email: '',
|
||||||
password: ''
|
password: ''
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// retrieve and store state from form
|
||||||
const getFormState = useCallback((received: IUserAuth) => {
|
const getFormState = useCallback((received: IUserAuth) => {
|
||||||
setInput(received);
|
setInput(received);
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
|
||||||
const handleLogin = async () => {
|
const handleLogin = async () => {
|
||||||
if (!input.email || !input.password) return;
|
if (!input.email || !input.password) return;
|
||||||
const result = await attemptLogin(input);
|
const result = await attemptLogin(input);
|
||||||
authContext.user = result;
|
authContext.user = result.user;
|
||||||
navigate('/');
|
navigate('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,7 +39,7 @@ export default function Login() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (authContext) navigate('/');
|
if (authContext.user) navigate('/');
|
||||||
setForm(new Form<IUserAuth>(formConfig).mount())
|
setForm(new Form<IUserAuth>(formConfig).mount())
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import { useCallback, useEffect, useMemo, useState } from "react";
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
||||||
|
import { useNavigate } from "react-router-dom";
|
||||||
import { v4 } from "uuid";
|
import { v4 } from "uuid";
|
||||||
import { IUser } from "../../../schemas";
|
import { IUser } from "../../../schemas";
|
||||||
import { attemptRegister } from "../../../util/apiUtils";
|
import { attemptLogin, attemptRegister } from "../../../util/apiUtils";
|
||||||
import { Button, Page, Panel } from "../../ui";
|
import { Button, Page, Panel } from "../../ui";
|
||||||
import Divider from "../../ui/Divider";
|
import Divider from "../../ui/Divider";
|
||||||
import Form, { FormConfig } from "../../ui/Form";
|
import Form, { FormConfig } from "../../ui/Form";
|
||||||
|
|
||||||
export default function AboutYou() {
|
export default function AboutYou() {
|
||||||
|
const navigate = useNavigate();
|
||||||
const [form, setForm] = useState<JSX.Element[]>([<p key={v4()}>Loading content...</p>]);
|
const [form, setForm] = useState<JSX.Element[]>([<p key={v4()}>Loading content...</p>]);
|
||||||
const [input, setInput] = useState<IUser>({
|
const [input, setInput] = useState<IUser>({
|
||||||
firstname: '',
|
firstname: '',
|
||||||
@@ -35,14 +37,8 @@ export default function AboutYou() {
|
|||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
const handleRegister = async () => {
|
const handleRegister = async () => {
|
||||||
for (let key of Object.keys(input)) {
|
|
||||||
if (!input[key as keyof IUser]) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(input);
|
|
||||||
|
|
||||||
const result = await attemptRegister(input);
|
const result = await attemptRegister(input);
|
||||||
console.log(result);
|
await attemptLogin({ email: result.email, password: result.password }).then(() => navigate('/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ const Welcome = () => {
|
|||||||
|
|
||||||
<Divider />
|
<Divider />
|
||||||
|
|
||||||
{ authContext.user ? authUserActions : callToRegister }
|
{ authContext && authContext.user ? authUserActions : callToRegister }
|
||||||
</Page>
|
</Page>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,35 @@
|
|||||||
import { useContext, useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import { AuthContext, useAuthContext } from "../../context/AuthContext";
|
import { useAuthContext } from "../../../context/AuthContext";
|
||||||
import { IUser } from "../../schemas";
|
import { attemptLogout } from "../../../util/apiUtils";
|
||||||
import { attemptLogout } from "../../util/apiUtils";
|
import { IUser } from "../../../schemas";
|
||||||
import Button from "./Button";
|
import Button from "../Button";
|
||||||
import "/src/sass/components/Navbar.scss";
|
import "/src/sass/components/Navbar.scss";
|
||||||
|
|
||||||
const Navbar = () => {
|
const Navbar = () => {
|
||||||
const { user } = useAuthContext();
|
// setup and local state
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const authContext = useAuthContext();
|
||||||
|
const [received, setReceived] = useState<IUser>();
|
||||||
|
const [displayed, setDisplayed] = useState<JSX.Element>();
|
||||||
|
|
||||||
|
// helper to unwrap async result
|
||||||
|
const handleLogout = async () => {
|
||||||
|
const success = await attemptLogout();
|
||||||
|
if (success) setReceived(undefined);
|
||||||
|
}
|
||||||
|
|
||||||
|
// jsx variations
|
||||||
const navbarLoggedIn = (
|
const navbarLoggedIn = (
|
||||||
<div id="navbar">
|
<div id="navbar">
|
||||||
<div className="navbar-block">
|
<div className="navbar-block">
|
||||||
<a onClick={() => navigate('/')}>RECIPIN</a>
|
<a onClick={() => navigate('/')}>RECIPIN</a>
|
||||||
</div>
|
</div>
|
||||||
<div className="navbar-block">
|
<div className="navbar-block">
|
||||||
<p>Hi, {user?.firstname}</p>
|
<p>Hi, {received?.firstname}.</p>
|
||||||
<span id="search-icon"></span>
|
<span id="search-icon"></span>
|
||||||
<Button onClick={() => console.log(user)}>Auth Context?</Button>
|
|
||||||
<Button onClick={() => navigate('/profile')}>Profile</Button>
|
<Button onClick={() => navigate('/profile')}>Profile</Button>
|
||||||
<Button onClick={attemptLogout}>Log Out</Button>
|
<Button onClick={handleLogout}>Log Out</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -42,12 +51,23 @@ const Navbar = () => {
|
|||||||
<a onClick={() => navigate('/')}>RECIPIN</a>
|
<a onClick={() => navigate('/')}>RECIPIN</a>
|
||||||
</div>
|
</div>
|
||||||
<div className="navbar-block">
|
<div className="navbar-block">
|
||||||
<p>Hi, {user?.firstname}</p>
|
<p>Hi, {received?.firstname}.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
||||||
return user ? navbarLoggedIn : navbarNotLoggedIn;
|
// side effects for live rendering
|
||||||
|
useEffect(() => {
|
||||||
|
console.log(authContext);
|
||||||
|
authContext && setReceived(authContext.user);
|
||||||
|
}, [authContext])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log(received);
|
||||||
|
setDisplayed(received ? navbarLoggedIn : navbarNotLoggedIn);
|
||||||
|
}, [received, setReceived]);
|
||||||
|
|
||||||
|
return displayed || <p>Loading...</p>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Navbar;
|
export default Navbar;
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { IUser, IUserAuth } from "../schemas";
|
import { IUser, IUserAuth } from "../schemas";
|
||||||
|
import { IAuthContext } from "../context/AuthContext";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
const API = import.meta.env.APISTRING || "http://localhost:8080";
|
const API = import.meta.env.APISTRING || "http://localhost:8080";
|
||||||
|
|
||||||
@@ -10,7 +11,7 @@ export const getBaseAPI = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// auth handlers
|
// auth handlers
|
||||||
export const attemptLogin = async (data: IUserAuth) => {
|
export const attemptLogin = async (data: IUserAuth): Promise<IAuthContext> => {
|
||||||
try {
|
try {
|
||||||
const response = await axios({
|
const response = await axios({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
@@ -18,7 +19,8 @@ export const attemptLogin = async (data: IUserAuth) => {
|
|||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.resolve(response.data);
|
const result: Promise<IAuthContext> = Promise.resolve(response.data);
|
||||||
|
return result;
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
@@ -43,6 +45,8 @@ export const attemptLogout = async () => {
|
|||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
url: API + '/auth/logout',
|
url: API + '/auth/logout',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
return true;
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ export const authRoute = (app: Express, passport: PassportStatic) => {
|
|||||||
// const { id, email, handle, firstname, lastname } = response.user;
|
// const { id, email, handle, firstname, lastname } = response.user;
|
||||||
// await UserControl.updateOne(response.user.id, { ...response.user, datemodified: now })
|
// await UserControl.updateOne(response.user.id, { ...response.user, datemodified: now })
|
||||||
// res.status(200).send({ id: id, handle: handle, firstname: firstname, lastname: lastname });
|
// res.status(200).send({ id: id, handle: handle, firstname: firstname, lastname: lastname });
|
||||||
res.cookie('userid', response.user.id, { maxAge: 1000 * 60 * 60 * 24 * 7 });
|
res.cookie('userid', response.user.id, { maxAge: 1000 * 60 * 60 * 24 });
|
||||||
|
res.send(response);
|
||||||
res.end();
|
res.end();
|
||||||
} else {
|
} else {
|
||||||
res.status(401).send({ message: "Login unsuccessful" });
|
res.status(401).send({ message: "Login unsuccessful" });
|
||||||
|
|||||||
Reference in New Issue
Block a user