1
0
Fork 0
freesewing/sites/dev/components/header.mjs

96 lines
3.3 KiB
JavaScript
Raw Normal View History

// Hooks
import { useState, useEffect } from 'react'
// Components
import { ThemePicker } from 'shared/components/theme-picker/index.mjs'
import { CloseIcon, MenuIcon, SearchIcon } from 'shared/components/icons.mjs'
import { Ribbon } from 'shared/components/ribbon.mjs'
import { WordMark } from 'shared/components/wordmark.mjs'
2021-12-25 14:14:18 +01:00
export const Header = ({ app, setSearch }) => {
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
2022-01-20 09:07:38 +01:00
if (curScrollPos >= prevScrollPos) {
if (show && curScrollPos > 20) setShow(false)
} else setShow(true)
2022-01-20 09:07:38 +01:00
setPrevScrollPos(curScrollPos)
}
window.addEventListener('scroll', handleScroll)
return () => window.removeEventListener('scroll', handleScroll)
}
2022-01-20 09:07:38 +01:00
}, [prevScrollPos, show])
2021-12-25 14:14:18 +01:00
return (
<header
className={`
2022-11-23 21:42:22 +01:00
fixed bottom-0 lg:bottom-auto lg:top-0 left-0
2022-10-04 01:20:49 +02:00
bg-neutral
w-full
z-30
transition-transform
2022-11-23 21:42:22 +01:00
${show ? '' : 'fixed bottom-0 lg:top-0 left-0 translate-y-20 lg:-translate-y-20'}
2022-10-04 01:20:49 +02:00
drop-shadow-xl
`}
>
2022-11-23 21:42:22 +01:00
<div className="m-auto" style={{ maxWidth: '1800px' }}>
<div className="p-0 px-4 flex flex-row gap-2 justify-between text-neutral-content">
2022-10-04 01:20:49 +02:00
<div className="flex flex-row items-center">
<button
className={`
btn btn-sm btn-ghost
text-neutral-content bg-transparent
2023-03-26 08:32:44 +02:00
hover:bg-secondary hover:bg-opacity-50
2022-10-04 01:20:49 +02:00
lg:hidden
2023-03-26 08:32:44 +02:00
rounded-none
swap swap-rotate
2022-10-04 01:20:49 +02:00
`}
2023-03-26 08:32:44 +02:00
onClick={() => app.updateState('menu.main', app.state?.menu?.main ? false : true)}
2022-10-04 01:20:49 +02:00
>
2023-03-26 08:32:44 +02:00
<div className={`${app.state?.menu?.main ? 'rotate-90' : ''} transition-transform`}>
{app.state?.menu?.main ? <CloseIcon /> : <MenuIcon />}
</div>
2022-10-04 01:20:49 +02:00
</button>
2022-11-23 21:42:22 +01:00
<div className="hidden lg:block">
<WordMark />
</div>
</div>
<div className="flex flex-row items-center lg:hidden">
2022-10-04 01:20:49 +02:00
<WordMark />
</div>
2022-11-23 21:42:22 +01:00
<div className="flex flex-row items-center lg:hidden pr-2">
2022-10-04 01:20:49 +02:00
<button
onClick={() => setSearch(true)}
2023-03-26 08:32:44 +02:00
className="btn btn-sm btn-ghost hover:bg-secondary hover:bg-opacity-50 rounded-none"
2022-10-04 01:20:49 +02:00
>
<SearchIcon />
</button>
</div>
2022-10-04 01:20:49 +02:00
<div className="hidden lg:flex flex-row items-center">
<button
className={`
btn btn-ghost btn-sm h-12
hidden lg:flex
flex-row gap-4
justify-between
hover:bg-secondary hover:bg-opacity-50 rounded-none
2022-10-04 01:20:49 +02:00
`}
onClick={() => setSearch(true)}
>
2021-12-31 10:15:51 +01:00
<SearchIcon />
2023-03-26 08:32:44 +02:00
<keyb className="px-3 rounded text-base font-medium border border-solid border-base-300">
/
</keyb>
2022-10-04 01:20:49 +02:00
</button>
<ThemePicker app={app} />
</div>
2021-12-26 12:52:00 +01:00
</div>
</div>
<Ribbon loading={app.loading} theme={app.theme} />
</header>
2021-12-25 14:14:18 +01:00
)
}