Refactored UnauthMenu into HeaderMenu
Header also takes care of managing logged in state via cookies
This commit is contained in:
parent
710fb6a978
commit
f1f74f06c7
4 changed files with 88 additions and 58 deletions
|
|
@ -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" />
|
||||||
|
|
|
||||||
67
src/components/HeaderMenu/HeaderMenu.tsx
Normal file
67
src/components/HeaderMenu/HeaderMenu.tsx
Normal 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
|
||||||
|
|
@ -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 {
|
|
||||||
Loading…
Reference in a new issue