2022-09-14 21:07:47 +00:00
|
|
|
import {For, Show, createSignal, createMemo, createEffect, onMount} from 'solid-js'
|
2022-09-09 11:53:35 +00:00
|
|
|
import Private from './Private'
|
|
|
|
import Notifications from './Notifications'
|
|
|
|
import Icon from './Icon'
|
|
|
|
import { Modal } from './Modal'
|
|
|
|
import AuthModal from './AuthModal'
|
|
|
|
import { t } from '../../utils/intl'
|
|
|
|
import { useModalStore, showModal, useWarningsStore } from '../../stores/ui'
|
|
|
|
import { useStore } from '@nanostores/solid'
|
|
|
|
import { session as ssession } from '../../stores/auth'
|
2022-09-14 14:40:33 +00:00
|
|
|
import { route, router } from '../../stores/router'
|
2022-09-09 11:53:35 +00:00
|
|
|
import './Header.scss'
|
|
|
|
|
|
|
|
const resources = [
|
|
|
|
{ name: t('zine'), href: '/' },
|
|
|
|
{ name: t('feed'), href: '/feed' },
|
|
|
|
{ name: t('topics'), href: '/topics' }
|
|
|
|
//{ name: t('community'), href: '/community' }
|
|
|
|
]
|
|
|
|
|
|
|
|
export const Header = () => {
|
|
|
|
// signals
|
|
|
|
const [fixed, setFixed] = createSignal(false)
|
|
|
|
const [visibleWarnings, setVisibleWarnings] = createSignal(false)
|
|
|
|
// stores
|
|
|
|
const { getWarnings } = useWarningsStore()
|
|
|
|
const session = useStore(ssession)
|
|
|
|
const { getModal } = useModalStore()
|
2022-09-14 14:40:33 +00:00
|
|
|
const routing = useStore(router)
|
|
|
|
const subpath = createMemo(() => routing().path)
|
2022-09-09 11:53:35 +00:00
|
|
|
// methods
|
|
|
|
const toggleWarnings = () => setVisibleWarnings(!visibleWarnings())
|
|
|
|
const toggleFixed = () => setFixed(!fixed())
|
|
|
|
// effects
|
|
|
|
createEffect(() => {
|
|
|
|
if (fixed() || getModal()) {
|
|
|
|
document.body.classList.add('fixed')
|
|
|
|
} else {
|
|
|
|
document.body.classList.remove('fixed')
|
|
|
|
}
|
|
|
|
}, [fixed(), getModal()])
|
|
|
|
|
|
|
|
// derived
|
|
|
|
const authorized = createMemo(() => session()?.user?.slug)
|
|
|
|
const enterClick = route(() => showModal('auth'))
|
|
|
|
const bellClick = createMemo(() => (authorized() ? route(toggleWarnings) : enterClick))
|
2022-09-14 21:07:47 +00:00
|
|
|
|
|
|
|
const root = null;
|
|
|
|
|
|
|
|
onMount(() => {
|
|
|
|
let scrollTop = window.scrollY;
|
|
|
|
|
|
|
|
window.addEventListener('scroll', () => {
|
|
|
|
const scrolledTop = scrollTop < window.scrollY;
|
|
|
|
|
|
|
|
window.console.log(scrolledTop);
|
|
|
|
|
|
|
|
root.classList.toggle('header--scrolled-top', scrolledTop);
|
|
|
|
root.classList.toggle('header--scrolled-bottom', !scrolledTop);
|
|
|
|
|
|
|
|
scrollTop = window.scrollY;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2022-09-09 11:53:35 +00:00
|
|
|
return (
|
2022-09-14 21:07:47 +00:00
|
|
|
<header ref={root}>
|
2022-09-09 11:53:35 +00:00
|
|
|
<Modal name="auth">
|
|
|
|
<AuthModal />
|
|
|
|
</Modal>
|
|
|
|
<div class="wide-container">
|
|
|
|
<nav class="row header__inner" classList={{ fixed: fixed() }}>
|
|
|
|
<div class="main-logo col-auto">
|
|
|
|
<a href="/" onClick={route}>
|
|
|
|
<img src="/logo.svg" alt={t('Discours')} />
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
<ul class="col main-navigation text-xl inline-flex" classList={{ fixed: fixed() }}>
|
|
|
|
<For each={resources}>
|
|
|
|
{(r: { href: string; name: string }) => (
|
2022-09-14 14:40:33 +00:00
|
|
|
<li classList={{ selected: r.href === subpath() }}>
|
2022-09-09 11:53:35 +00:00
|
|
|
<a href={r.href} onClick={route}>
|
|
|
|
{r.name}
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
)}
|
|
|
|
</For>
|
|
|
|
</ul>
|
|
|
|
<div class="usernav">
|
|
|
|
<div class="usercontrol col">
|
|
|
|
<div class="usercontrol__item">
|
|
|
|
<a href="#auth" onClick={bellClick}>
|
|
|
|
<div>
|
|
|
|
<Icon name="bell-white" counter={authorized() ? getWarnings().length : 1} />
|
|
|
|
</div>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<Show when={visibleWarnings()}>
|
|
|
|
<div class="usercontrol__item notifications">
|
|
|
|
<Notifications />
|
|
|
|
</div>
|
|
|
|
</Show>
|
|
|
|
|
|
|
|
<Show
|
|
|
|
when={authorized()}
|
|
|
|
fallback={
|
|
|
|
<div class="usercontrol__item loginbtn">
|
|
|
|
<a href="#auth" onClick={enterClick}>
|
|
|
|
{t('enter')}
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<Private />
|
|
|
|
</Show>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="burger-container">
|
|
|
|
<div class="burger" classList={{ fixed: fixed() }} onClick={toggleFixed}>
|
|
|
|
<div />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
)
|
|
|
|
}
|