Refactored UnauthMenu into HeaderMenu

Header also takes care of managing logged in state via cookies
This commit is contained in:
Justin Edmund 2020-09-25 06:08:37 -07:00
parent 710fb6a978
commit f1f74f06c7
4 changed files with 88 additions and 58 deletions

View file

@ -1,10 +1,9 @@
import React from 'react' import React, { useEffect, useState } from 'react'
import { RouteComponentProps, useLocation, withRouter } from 'react-router-dom' import { RouteComponentProps, useLocation, withRouter } from 'react-router-dom'
import { useCookies } from 'react-cookie' import { useCookies } from 'react-cookie'
import history from '~utils/history'
import Button from '~components/Button/Button' import Button from '~components/Button/Button'
import UnauthMenu from '~components/UnauthMenu/UnauthMenu' import HeaderMenu from '~components/HeaderMenu/HeaderMenu'
import './Header.css' import './Header.css'
@ -12,9 +11,16 @@ interface Props {}
interface HeaderProps extends RouteComponentProps<Props> {} interface HeaderProps extends RouteComponentProps<Props> {}
const Header: React.FC<HeaderProps> = (props: HeaderProps) => { const Header: React.FC<HeaderProps> = (props: HeaderProps) => {
const [cookies, setCookie] = useCookies(['user']) const [username, setUsername] = useState(undefined)
const [cookies, setCookie, removeCookie] = useCookies(['user'])
let location = useLocation() let location = useLocation()
useEffect(() => {
if (cookies.user) {
setUsername(cookies.user.username)
}
}, [])
function copyToClipboard() { function copyToClipboard() {
const el = document.createElement('input') const el = document.createElement('input')
el.value = window.location.href el.value = window.location.href
@ -35,6 +41,16 @@ const Header: React.FC<HeaderProps> = (props: HeaderProps) => {
} }
} }
function route(pathname: string) {
props.history.push(pathname)
}
function logout() {
removeCookie('user')
window.history.replaceState(null, `Grid Tool`, `/`)
props.history.go(0)
}
if (cookies.user != null) { if (cookies.user != null) {
console.log(`Logged in as user "${cookies.user.username}"`) console.log(`Logged in as user "${cookies.user.username}"`)
} }
@ -44,7 +60,7 @@ const Header: React.FC<HeaderProps> = (props: HeaderProps) => {
<div className="left"> <div className="left">
<div className="dropdown"> <div className="dropdown">
<Button type="menu">Menu</Button> <Button type="menu">Menu</Button>
<UnauthMenu /> <HeaderMenu username={username} navigate={route} logout={logout} />
</div> </div>
</div> </div>
<div className="push" /> <div className="push" />

View file

@ -0,0 +1,67 @@
import React from 'react'
import './HeaderMenu.css'
import LoginModal from '~components/LoginModal/LoginModal'
import SignupModal from '~components/SignupModal/SignupModal'
import { useModal as useSignupModal } from '~utils/useModal'
import { useModal as useLoginModal } from '~utils/useModal'
import { Route } from 'react-router'
interface Props {
username?: string
navigate: (pathname: string) => void
logout: () => void
}
const HeaderMenu = (props: Props) => {
const { open: signupOpen, openModal: openSignupModal, closeModal: closeSignupModal } = useSignupModal()
const { open: loginOpen, openModal: openLoginModal, closeModal: closeLoginModal } = useLoginModal()
function authItems() {
return (
<ul className="Menu auth">
<div className="MenuGroup">
<li className="MenuItem" onClick={ () => props.username ? props.navigate(props.username) : '' }>My Parties</li>
</div>
<div className="MenuGroup">
<li className="MenuItem" onClick={ () => props.navigate('about') }>About</li>
<li className="MenuItem" onClick={ () => props.navigate('guides') }>Guides</li>
</div>
<div className="MenuGroup">
<li className="MenuItem" onClick={props.logout}>Logout</li>
</div>
</ul>
)
}
function unauthItems() {
return (
<ul className="Menu unauth">
<div className="MenuGroup">
<li className="MenuItem" onClick={ () => props.navigate('about') }>About</li>
<li className="MenuItem" onClick={ () => props.navigate('guides') }>Guides</li>
</div>
<div className="MenuGroup">
<li className="MenuItem" onClick={openLoginModal}>Log in</li>
{loginOpen ? (
<LoginModal
close={closeLoginModal}
/>
) : null}
<li className="MenuItem" onClick={openSignupModal}>Sign up</li>
{signupOpen ? (
<SignupModal
close={closeSignupModal}
/>
) : null}
</div>
</ul>
)
}
return (props.username !== undefined) ? authItems() : unauthItems()
}
export default HeaderMenu

View file

@ -1,53 +0,0 @@
import React from 'react'
import './UnauthMenu.css'
import LoginModal from '~components/LoginModal/LoginModal'
import SignupModal from '~components/SignupModal/SignupModal'
import { useModal as useSignupModal } from '~utils/useModal'
import { useModal as useLoginModal } from '~utils/useModal'
function UnauthMenu() {
const { open: signupOpen, openModal: openSignupModal, closeModal: closeSignupModal } = useSignupModal()
const { open: loginOpen, openModal: openLoginModal, closeModal: closeLoginModal } = useLoginModal()
return (
<ul className="Menu">
<div className="MenuGroup">
<li className="MenuItem">About</li>
<li className="MenuItem">Guides</li>
</div>
<div className="MenuGroup">
<li className="MenuItem" onClick={openLoginModal}>Log in</li>
{loginOpen ? (
<LoginModal
close={closeLoginModal}
/>
) : null}
<li className="MenuItem" onClick={openSignupModal}>Sign up</li>
{signupOpen ? (
<SignupModal
close={closeSignupModal}
/>
) : null}
</div>
</ul>
)
}
export default UnauthMenu
// if (this.state.loggedIn) {
// return (
// <ul className="Menu">
// <div className="MenuGroup">
// <li className="MenuItem">My Parties</li>
// <li className="MenuItem">Guides</li>
// <li className="MenuItem">About</li>
// </div>
// <div className="MenuGroup">
// <li className="MenuItem">Log out</li>
// </div>
// </ul>
// )
// } else {