2021-12-30 17:56:04 +01:00
|
|
|
import { useState, useEffect } from 'react'
|
2021-12-26 16:43:35 +01:00
|
|
|
import Logo from 'shared/components/logos/freesewing.js'
|
|
|
|
import Link from 'next/link'
|
2021-12-30 14:23:02 +01:00
|
|
|
import ThemePicker from 'shared/components/theme-picker.js'
|
2021-12-31 10:15:51 +01:00
|
|
|
import CloseIcon from 'shared/components/icons/close.js'
|
|
|
|
import MenuIcon from 'shared/components/icons/menu.js'
|
|
|
|
import SearchIcon from 'shared/components/icons/search.js'
|
2021-12-26 16:43:35 +01:00
|
|
|
|
2021-12-25 14:14:18 +01:00
|
|
|
const Right = props => (
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
|
|
|
</svg>
|
|
|
|
)
|
|
|
|
const Left = props => (
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 19l-7-7m0 0l7-7m-7 7h18" />
|
|
|
|
</svg>
|
|
|
|
)
|
|
|
|
|
2021-12-31 10:15:51 +01:00
|
|
|
const Header = ({ app, setSearch }) => {
|
2021-12-30 17:56:04 +01:00
|
|
|
|
|
|
|
const [prevScrollPos, setPrevScrollPos] = useState(0)
|
|
|
|
const [show, setShow] = useState(true)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (typeof window !== 'undefined') {
|
2022-01-20 09:07:38 +01:00
|
|
|
const handleScroll = () => {
|
|
|
|
const curScrollPos = (typeof window !== 'undefined') ? window.pageYOffset : 0
|
|
|
|
if (curScrollPos >= prevScrollPos) {
|
|
|
|
if (show && curScrollPos > 20) setShow(false)
|
|
|
|
}
|
|
|
|
else setShow(true)
|
|
|
|
setPrevScrollPos(curScrollPos)
|
|
|
|
}
|
2021-12-30 17:56:04 +01:00
|
|
|
window.addEventListener('scroll', handleScroll)
|
|
|
|
return () => window.removeEventListener('scroll', handleScroll)
|
|
|
|
}
|
2022-01-20 09:07:38 +01:00
|
|
|
}, [prevScrollPos, show])
|
2021-12-30 17:56:04 +01:00
|
|
|
|
|
|
|
|
2021-12-25 14:14:18 +01:00
|
|
|
return (
|
|
|
|
<header className={`
|
2021-12-30 17:56:04 +01:00
|
|
|
fixed top-0 left-0
|
2021-12-26 12:52:00 +01:00
|
|
|
bg-neutral
|
2021-12-30 17:56:04 +01:00
|
|
|
w-full
|
2021-12-26 12:52:00 +01:00
|
|
|
z-30
|
2021-12-30 17:56:04 +01:00
|
|
|
transition-transform
|
|
|
|
${show ? '': 'fixed top-0 left-0 -translate-y-20'}
|
2021-12-25 14:14:18 +01:00
|
|
|
`}>
|
2021-12-30 14:23:02 +01:00
|
|
|
<div className="max-w-6xl m-auto">
|
|
|
|
<div className="p-2 flex flex-row gap-2 justify-between text-neutral-content">
|
|
|
|
<button
|
|
|
|
className={`
|
2021-12-30 17:56:04 +01:00
|
|
|
btn btn-sm
|
2021-12-31 10:15:51 +01:00
|
|
|
text-neutral-content bg-transparent
|
2021-12-30 17:56:04 +01:00
|
|
|
border border-transparent
|
|
|
|
hover:bg-transparent hover:border-base-100
|
2022-05-11 16:29:46 +02:00
|
|
|
md:hidden
|
2021-12-30 17:56:04 +01:00
|
|
|
h-12
|
2021-12-30 14:23:02 +01:00
|
|
|
`}
|
|
|
|
onClick={app.togglePrimaryMenu}>
|
|
|
|
{app.primaryMenu
|
2022-01-22 17:55:03 +01:00
|
|
|
? (
|
|
|
|
<>
|
|
|
|
<CloseIcon />
|
|
|
|
<span className="opacity-50 pl-2 flex flex-row items-center gap-1">
|
|
|
|
<Left />
|
|
|
|
swipe
|
|
|
|
</span>
|
|
|
|
</>
|
|
|
|
) : (
|
|
|
|
<>
|
|
|
|
<MenuIcon />
|
|
|
|
<span className="opacity-50 pl-2 flex flex-row items-center gap-1">
|
|
|
|
<Right />
|
|
|
|
swipe
|
|
|
|
</span>
|
|
|
|
</>
|
|
|
|
)
|
2021-12-30 14:23:02 +01:00
|
|
|
}
|
|
|
|
</button>
|
2022-05-11 16:29:46 +02:00
|
|
|
<div className="flex flex-row gap-2 md:hidden">
|
2021-12-31 10:15:51 +01:00
|
|
|
<button className="btn btn-sm btn h-12 px-12" onClick={() => setSearch(true)}>
|
|
|
|
<SearchIcon />
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
<button className={`
|
|
|
|
btn btn-sm h-12
|
2022-05-11 16:29:46 +02:00
|
|
|
hidden md:flex
|
2021-12-31 10:15:51 +01:00
|
|
|
flex-row gap-1 mr-4 w-64 px-2
|
|
|
|
bg-base-100 text-base-content
|
|
|
|
hover:bg-base-100 hover:text-base-content
|
|
|
|
justify-between
|
|
|
|
`} onClick={() => setSearch(true)}>
|
|
|
|
<div className="flex flex-row items-center gap-2">
|
|
|
|
<SearchIcon />
|
|
|
|
<span className="normal-case font-normal">Quick Search...</span>
|
|
|
|
</div>
|
|
|
|
<span className="normal-case">Ctrl K</span>
|
|
|
|
</button>
|
|
|
|
<div className="hidden md:flex md:flex-row gap-2">
|
2021-12-30 17:56:04 +01:00
|
|
|
<Link href="/">
|
|
|
|
<a className="flex flex-column items-center">
|
|
|
|
<Logo size={36} fill="currentColor" stroke={false} />
|
|
|
|
</a>
|
|
|
|
</Link>
|
|
|
|
<Link href="/">
|
|
|
|
<a role="button" className="btn btn-link btn-sm text-neutral-content h-12">
|
|
|
|
freesewing.dev
|
|
|
|
</a>
|
|
|
|
</Link>
|
|
|
|
</div>
|
2022-05-11 16:29:46 +02:00
|
|
|
<div className="hidden md:flex flex-row items-center">
|
2021-12-30 18:17:10 +01:00
|
|
|
<ThemePicker app={app} />
|
|
|
|
</div>
|
2021-12-30 14:23:02 +01:00
|
|
|
</div>
|
2021-12-26 12:52:00 +01:00
|
|
|
</div>
|
2022-01-22 17:55:03 +01:00
|
|
|
<div className={`
|
|
|
|
theme-gradient h-1 w-full z-10 relative -mb-1
|
|
|
|
${app.loading ? 'loading' : ''}
|
|
|
|
`}></div>
|
2021-12-25 14:14:18 +01:00
|
|
|
</header>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default Header
|