Added BottomHeader for new features
Previous Header was split into a base Header component and TopHeader.
This commit is contained in:
parent
e8876d3b90
commit
2140208530
7 changed files with 177 additions and 79 deletions
55
components/BottomHeader/index.tsx
Normal file
55
components/BottomHeader/index.tsx
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
import React, { useContext, useEffect, useState } from 'react'
|
||||||
|
import { useCookies } from 'react-cookie'
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
import AppContext from '~context/AppContext'
|
||||||
|
|
||||||
|
import Header from '~components/Header'
|
||||||
|
import Button from '~components/Button'
|
||||||
|
|
||||||
|
import { ButtonType } from '~utils/enums'
|
||||||
|
|
||||||
|
const BottomHeader = () => {
|
||||||
|
const { editable, setEditable, authenticated, setAuthenticated } = useContext(AppContext)
|
||||||
|
|
||||||
|
const [username, setUsername] = useState(undefined)
|
||||||
|
const [cookies, _, removeCookie] = useCookies(['user'])
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (cookies.user) {
|
||||||
|
setAuthenticated(true)
|
||||||
|
setUsername(cookies.user.username)
|
||||||
|
} else {
|
||||||
|
setAuthenticated(false)
|
||||||
|
}
|
||||||
|
}, [cookies, setUsername, setAuthenticated])
|
||||||
|
|
||||||
|
const leftNav = () => {
|
||||||
|
return (
|
||||||
|
<Button icon="edit" click={() => {}}>Add more info</Button>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const rightNav = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{ (editable && router.route === '/p/[party]') ?
|
||||||
|
<Button icon="cross" type={ButtonType.Destructive} click={() => {}}>Delete team</Button> : ''
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Header
|
||||||
|
position="bottom"
|
||||||
|
left={ leftNav() }
|
||||||
|
right={ rightNav() }
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BottomHeader
|
||||||
|
|
@ -1,8 +1,13 @@
|
||||||
#Header {
|
.Header {
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 34px;
|
height: 34px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
&.bottom {
|
||||||
|
position: sticky;
|
||||||
|
bottom: $unit * 2;
|
||||||
|
}
|
||||||
|
|
||||||
#right {
|
#right {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
|
|
|
||||||
|
|
@ -1,82 +1,19 @@
|
||||||
import React, { useContext, useEffect, useState } from 'react'
|
import React from 'react'
|
||||||
import { useCookies } from 'react-cookie'
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
|
||||||
import AppContext from '~context/AppContext'
|
|
||||||
|
|
||||||
import Button from '~components/Button'
|
|
||||||
import HeaderMenu from '~components/HeaderMenu'
|
|
||||||
|
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
|
||||||
interface Props {}
|
interface Props {
|
||||||
|
position: 'top' | 'bottom'
|
||||||
|
left: JSX.Element,
|
||||||
|
right: JSX.Element
|
||||||
|
}
|
||||||
|
|
||||||
const Header = (props: Props) => {
|
const Header = (props: Props) => {
|
||||||
const { editable, setEditable, authenticated, setAuthenticated } = useContext(AppContext)
|
|
||||||
|
|
||||||
const [username, setUsername] = useState(undefined)
|
|
||||||
const [cookies, _, removeCookie] = useCookies(['user'])
|
|
||||||
|
|
||||||
const router = useRouter()
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (cookies.user) {
|
|
||||||
setAuthenticated(true)
|
|
||||||
setUsername(cookies.user.username)
|
|
||||||
console.log(`Logged in as user "${cookies.user.username}"`)
|
|
||||||
} else {
|
|
||||||
setAuthenticated(false)
|
|
||||||
console.log('You are currently not logged in.')
|
|
||||||
}
|
|
||||||
}, [cookies, setUsername, setAuthenticated])
|
|
||||||
|
|
||||||
function copyToClipboard() {
|
|
||||||
const el = document.createElement('input')
|
|
||||||
el.value = window.location.href
|
|
||||||
el.id = 'url-input'
|
|
||||||
document.body.appendChild(el)
|
|
||||||
|
|
||||||
el.select()
|
|
||||||
document.execCommand('copy')
|
|
||||||
el.remove()
|
|
||||||
}
|
|
||||||
|
|
||||||
function newParty() {
|
|
||||||
router.push('/')
|
|
||||||
}
|
|
||||||
|
|
||||||
function logout() {
|
|
||||||
removeCookie('user')
|
|
||||||
|
|
||||||
setAuthenticated(false)
|
|
||||||
if (editable) setEditable(false)
|
|
||||||
|
|
||||||
// How can we log out without navigating to root
|
|
||||||
router.push('/')
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav id="Header">
|
<nav className={`Header ${props.position}`}>
|
||||||
<div id="left">
|
<div id="left">{ props.left }</div>
|
||||||
<div className="dropdown">
|
|
||||||
<Button type="menu">Menu</Button>
|
|
||||||
{ (username) ?
|
|
||||||
<HeaderMenu authenticated={authenticated} username={username} logout={logout} /> :
|
|
||||||
<HeaderMenu authenticated={authenticated} />
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="push" />
|
<div className="push" />
|
||||||
<div id="right">
|
<div id="right">{ props.right }</div>
|
||||||
{ (editable && router.route === '/p/[slug]') ?
|
|
||||||
<Button color="red" type="link" click={() => {}}>Delete</Button> : ''
|
|
||||||
}
|
|
||||||
{ (router.route === '/p/[slug]') ?
|
|
||||||
<Button type="link" click={copyToClipboard}>Copy link</Button> : ''
|
|
||||||
}
|
|
||||||
<Button type="new" click={newParty}>New</Button>
|
|
||||||
</div>
|
|
||||||
</nav>
|
</nav>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import type { ReactElement } from 'react'
|
import type { ReactElement } from 'react'
|
||||||
import Header from '~components/Header'
|
import TopHeader from '~components/TopHeader'
|
||||||
|
import BottomHeader from '~components/BottomHeader'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
children: ReactElement
|
children: ReactElement
|
||||||
|
|
@ -8,8 +9,9 @@ interface Props {
|
||||||
const Layout = ({children}: Props) => {
|
const Layout = ({children}: Props) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Header />
|
<TopHeader />
|
||||||
<main>{children}</main>
|
<main>{children}</main>
|
||||||
|
<BottomHeader />
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
0
components/TopHeader/index.scss
Normal file
0
components/TopHeader/index.scss
Normal file
89
components/TopHeader/index.tsx
Normal file
89
components/TopHeader/index.tsx
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
import React, { useContext, useEffect, useState } from 'react'
|
||||||
|
import { useCookies } from 'react-cookie'
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
|
||||||
|
import AppContext from '~context/AppContext'
|
||||||
|
|
||||||
|
import Header from '~components/Header'
|
||||||
|
import Button from '~components/Button'
|
||||||
|
import HeaderMenu from '~components/HeaderMenu'
|
||||||
|
|
||||||
|
const TopHeader = () => {
|
||||||
|
const { editable, setEditable, authenticated, setAuthenticated } = useContext(AppContext)
|
||||||
|
|
||||||
|
const [username, setUsername] = useState(undefined)
|
||||||
|
const [cookies, _, removeCookie] = useCookies(['user'])
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (cookies.user) {
|
||||||
|
setAuthenticated(true)
|
||||||
|
setUsername(cookies.user.username)
|
||||||
|
console.log(`Logged in as user "${cookies.user.username}"`)
|
||||||
|
} else {
|
||||||
|
setAuthenticated(false)
|
||||||
|
console.log('You are currently not logged in.')
|
||||||
|
}
|
||||||
|
}, [cookies, setUsername, setAuthenticated])
|
||||||
|
|
||||||
|
function copyToClipboard() {
|
||||||
|
const el = document.createElement('input')
|
||||||
|
el.value = window.location.href
|
||||||
|
el.id = 'url-input'
|
||||||
|
document.body.appendChild(el)
|
||||||
|
|
||||||
|
el.select()
|
||||||
|
document.execCommand('copy')
|
||||||
|
el.remove()
|
||||||
|
}
|
||||||
|
|
||||||
|
function newParty() {
|
||||||
|
router.push('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
function logout() {
|
||||||
|
removeCookie('user')
|
||||||
|
|
||||||
|
setAuthenticated(false)
|
||||||
|
if (editable) setEditable(false)
|
||||||
|
|
||||||
|
// TODO: How can we log out without navigating to root
|
||||||
|
router.push('/')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const leftNav = () => {
|
||||||
|
return (
|
||||||
|
<div className="dropdown">
|
||||||
|
<Button icon="menu">Menu</Button>
|
||||||
|
{ (username) ?
|
||||||
|
<HeaderMenu authenticated={authenticated} username={username} logout={logout} /> :
|
||||||
|
<HeaderMenu authenticated={authenticated} />
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const rightNav = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{ (router.route === '/p/[party]') ?
|
||||||
|
<Button icon="link" click={copyToClipboard}>Copy link</Button> : ''
|
||||||
|
}
|
||||||
|
<Button icon="new" click={newParty}>New</Button>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Header
|
||||||
|
position="top"
|
||||||
|
left={ leftNav() }
|
||||||
|
right={ rightNav() }
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TopHeader
|
||||||
|
|
@ -3,25 +3,35 @@
|
||||||
html {
|
html {
|
||||||
background: $background-color;
|
background: $background-color;
|
||||||
font-size: 62.5%;
|
font-size: 62.5%;
|
||||||
padding: $unit * 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
font-family: system-ui, -apple-system, Helvetica Neue, Helvetica, Arial, sans-serif;
|
box-sizing: border-box;
|
||||||
|
font-family: system-ui, -apple-system, 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
|
height: 100vh;
|
||||||
|
padding: $unit * 2;
|
||||||
|
|
||||||
&.no-scroll {
|
&.no-scroll {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#__next {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
min-height: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
button, input {
|
button, input {
|
||||||
font-family: system-ui, -apple-system, Helvetica Neue, Helvetica, Arial, sans-serif;
|
font-family: system-ui, -apple-system, 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, p {
|
h1, h2, h3, p {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue