2024-07-03 07:02:46 +00:00
|
|
|
|
import { A, useLocation, useNavigate, useSearchParams } from '@solidjs/router'
|
2022-09-28 21:08:14 +00:00
|
|
|
|
import { clsx } from 'clsx'
|
2024-06-24 17:50:27 +00:00
|
|
|
|
import { For, Show, createEffect, createMemo, createSignal, onCleanup, onMount } from 'solid-js'
|
2024-07-04 07:51:15 +00:00
|
|
|
|
import { Icon } from '~/components/_shared/Icon'
|
|
|
|
|
import { Newsletter } from '~/components/_shared/Newsletter'
|
|
|
|
|
import { useLocalize } from '~/context/localize'
|
|
|
|
|
import { useSession } from '~/context/session'
|
|
|
|
|
import { useTopics } from '~/context/topics'
|
2024-06-24 17:50:27 +00:00
|
|
|
|
import { useUI } from '~/context/ui'
|
2024-07-04 07:51:15 +00:00
|
|
|
|
import type { Topic } from '~/graphql/schema/core.gen'
|
|
|
|
|
import { getRandomTopicsFromArray } from '~/utils/getRandomTopicsFromArray'
|
|
|
|
|
import { getDescription } from '~/utils/meta'
|
2024-02-04 11:25:21 +00:00
|
|
|
|
import { SharePopup, getShareUrl } from '../../Article/SharePopup'
|
2023-08-26 09:41:21 +00:00
|
|
|
|
import { AuthModal } from '../AuthModal'
|
|
|
|
|
import { ConfirmModal } from '../ConfirmModal'
|
2023-11-14 15:10:00 +00:00
|
|
|
|
import { HeaderAuth } from '../HeaderAuth'
|
|
|
|
|
import { Modal } from '../Modal'
|
2023-11-30 08:50:29 +00:00
|
|
|
|
import { SearchModal } from '../SearchModal/SearchModal'
|
2023-08-26 09:41:21 +00:00
|
|
|
|
import { Snackbar } from '../Snackbar'
|
2023-11-30 08:07:31 +00:00
|
|
|
|
import styles from './Header.module.scss'
|
2023-07-31 21:24:41 +00:00
|
|
|
|
|
2022-09-22 09:37:49 +00:00
|
|
|
|
type Props = {
|
|
|
|
|
title?: string
|
2023-04-17 10:31:20 +00:00
|
|
|
|
slug?: string
|
2022-09-23 21:29:32 +00:00
|
|
|
|
isHeaderFixed?: boolean
|
2023-01-30 10:39:36 +00:00
|
|
|
|
articleBody?: string
|
|
|
|
|
cover?: string
|
2023-04-17 10:31:20 +00:00
|
|
|
|
scrollToComments?: (value: boolean) => void
|
2022-09-22 09:37:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-30 12:31:54 +00:00
|
|
|
|
type HeaderSearchParams = {
|
|
|
|
|
source?: string
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const handleSwitchLanguage = (value: string) => {
|
|
|
|
|
location.href = `${location.href}${location.href.includes('?') ? '&' : '?'}lng=${value}`
|
2023-10-25 15:04:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-09-22 09:37:49 +00:00
|
|
|
|
export const Header = (props: Props) => {
|
2023-09-14 11:40:46 +00:00
|
|
|
|
const { t, lang } = useLocalize()
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const { modal } = useUI()
|
|
|
|
|
const navigate = useNavigate()
|
|
|
|
|
const [searchParams] = useSearchParams<HeaderSearchParams>()
|
2024-02-04 17:40:15 +00:00
|
|
|
|
const { requireAuthentication } = useSession()
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const { sortedTopics } = useTopics()
|
|
|
|
|
const topics = createMemo<Topic[]>(() => sortedTopics())
|
|
|
|
|
const [randomTopics, setRandomTopics] = createSignal<Topic[]>([])
|
2022-09-15 18:18:07 +00:00
|
|
|
|
const [getIsScrollingBottom, setIsScrollingBottom] = createSignal(false)
|
2022-09-15 19:41:05 +00:00
|
|
|
|
const [getIsScrolled, setIsScrolled] = createSignal(false)
|
2022-09-09 11:53:35 +00:00
|
|
|
|
const [fixed, setFixed] = createSignal(false)
|
2022-10-25 15:36:32 +00:00
|
|
|
|
const [isSharePopupVisible, setIsSharePopupVisible] = createSignal(false)
|
2022-10-28 09:10:14 +00:00
|
|
|
|
const [isProfilePopupVisible, setIsProfilePopupVisible] = createSignal(false)
|
2024-07-03 07:23:36 +00:00
|
|
|
|
const [isTopMenuVisible, setIsTopMenuVisible] = createSignal(false)
|
2024-05-06 14:26:03 +00:00
|
|
|
|
const { session } = useSession()
|
2024-03-18 11:07:28 +00:00
|
|
|
|
|
2024-02-04 17:40:15 +00:00
|
|
|
|
const toggleFixed = () => setFixed(!fixed())
|
2022-11-04 13:05:50 +00:00
|
|
|
|
|
2023-09-14 11:40:46 +00:00
|
|
|
|
const tag = (topic: Topic) =>
|
|
|
|
|
/[ЁА-яё]/.test(topic.title || '') && lang() !== 'ru' ? topic.slug : topic.title
|
|
|
|
|
|
2022-11-04 13:05:50 +00:00
|
|
|
|
let windowScrollTop = 0
|
|
|
|
|
|
2024-03-18 11:07:28 +00:00
|
|
|
|
createEffect(() => {
|
2024-05-06 10:53:35 +00:00
|
|
|
|
if (topics()?.length) {
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const rt: Topic[] = getRandomTopicsFromArray(topics())
|
|
|
|
|
setRandomTopics(rt)
|
2024-05-06 10:53:35 +00:00
|
|
|
|
}
|
2024-03-18 11:07:28 +00:00
|
|
|
|
})
|
|
|
|
|
|
2022-09-09 11:53:35 +00:00
|
|
|
|
createEffect(() => {
|
2023-10-16 17:24:33 +00:00
|
|
|
|
const mainContent = document.querySelector<HTMLDivElement>('.main-content')
|
2022-11-04 13:05:50 +00:00
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
if ((window && fixed()) || modal() !== null) {
|
2022-11-04 13:05:50 +00:00
|
|
|
|
windowScrollTop = window.scrollY
|
2024-06-24 17:50:27 +00:00
|
|
|
|
if (mainContent) {
|
|
|
|
|
mainContent.style.marginTop = `-${windowScrollTop}px`
|
|
|
|
|
}
|
2022-11-04 13:05:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-25 16:25:42 +00:00
|
|
|
|
document.body.classList.toggle('fixed', fixed() || modal() !== null)
|
2022-10-25 21:17:35 +00:00
|
|
|
|
document.body.classList.toggle(styles.fixed, fixed() && !modal())
|
2022-11-04 13:05:50 +00:00
|
|
|
|
|
2024-02-04 17:40:15 +00:00
|
|
|
|
if (!(fixed() || modal())) {
|
2024-06-24 17:50:27 +00:00
|
|
|
|
if (mainContent) {
|
|
|
|
|
mainContent.style.marginTop = ''
|
|
|
|
|
}
|
2022-11-04 13:05:50 +00:00
|
|
|
|
window.scrollTo(0, windowScrollTop)
|
|
|
|
|
}
|
2022-10-25 15:36:32 +00:00
|
|
|
|
})
|
2022-09-09 11:53:35 +00:00
|
|
|
|
|
2022-09-14 21:07:47 +00:00
|
|
|
|
onMount(() => {
|
2022-09-15 18:18:07 +00:00
|
|
|
|
let scrollTop = window.scrollY
|
2022-09-14 21:07:47 +00:00
|
|
|
|
|
2022-09-15 18:18:07 +00:00
|
|
|
|
const handleScroll = () => {
|
|
|
|
|
setIsScrollingBottom(window.scrollY > scrollTop)
|
2022-09-15 19:41:05 +00:00
|
|
|
|
setIsScrolled(window.scrollY > 0)
|
2022-09-15 18:18:07 +00:00
|
|
|
|
scrollTop = window.scrollY
|
|
|
|
|
}
|
2022-09-14 21:07:47 +00:00
|
|
|
|
|
2022-09-15 18:18:07 +00:00
|
|
|
|
window.addEventListener('scroll', handleScroll, { passive: true })
|
|
|
|
|
onCleanup(() => {
|
|
|
|
|
window.removeEventListener('scroll', handleScroll)
|
|
|
|
|
})
|
|
|
|
|
})
|
2022-09-14 21:07:47 +00:00
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const scrollToComments = (event: MouseEvent | undefined, value: boolean) => {
|
|
|
|
|
event?.preventDefault()
|
|
|
|
|
props.scrollToComments?.(value)
|
2023-04-17 10:31:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const handleBookmarkButtonClick = (ev: MouseEvent | undefined) => {
|
2023-08-13 12:27:30 +00:00
|
|
|
|
requireAuthentication(() => {
|
|
|
|
|
// TODO: implement bookmark clicked
|
2024-06-24 17:50:27 +00:00
|
|
|
|
ev?.preventDefault()
|
2023-08-13 12:27:30 +00:00
|
|
|
|
}, 'bookmark')
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const handleCreateButtonClick = (ev: MouseEvent | undefined) => {
|
2023-08-13 12:27:30 +00:00
|
|
|
|
requireAuthentication(() => {
|
2024-06-24 17:50:27 +00:00
|
|
|
|
ev?.preventDefault()
|
2023-08-13 12:27:30 +00:00
|
|
|
|
|
2024-07-03 21:25:03 +00:00
|
|
|
|
navigate('/edit/new')
|
2023-08-13 12:27:30 +00:00
|
|
|
|
}, 'create')
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const toggleSubnavigation = (isShow: boolean, signal?: (v: boolean) => void) => {
|
2023-08-28 22:15:31 +00:00
|
|
|
|
clearTimer()
|
2024-07-03 07:23:36 +00:00
|
|
|
|
setIsTopMenuVisible(false)
|
2023-08-28 22:15:31 +00:00
|
|
|
|
|
|
|
|
|
if (signal) {
|
|
|
|
|
signal(isShow)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-04 09:03:15 +00:00
|
|
|
|
let timer: string | number | NodeJS.Timeout
|
2023-08-28 22:15:31 +00:00
|
|
|
|
|
|
|
|
|
const clearTimer = () => {
|
|
|
|
|
clearTimeout(timer)
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const hideSubnavigation = (time = 500) => {
|
2023-08-28 22:15:31 +00:00
|
|
|
|
timer = setTimeout(() => {
|
|
|
|
|
toggleSubnavigation(false)
|
2023-09-04 20:45:02 +00:00
|
|
|
|
}, time)
|
2023-08-17 20:28:24 +00:00
|
|
|
|
}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
const loc = useLocation()
|
|
|
|
|
const handleToggleMenuByLink = (event: MouseEvent, route: string) => {
|
2023-10-25 15:04:23 +00:00
|
|
|
|
event.preventDefault()
|
2024-06-28 15:05:45 +00:00
|
|
|
|
navigate(route)
|
2023-10-25 15:04:23 +00:00
|
|
|
|
}
|
2024-07-03 07:02:46 +00:00
|
|
|
|
|
2022-09-09 11:53:35 +00:00
|
|
|
|
return (
|
2022-09-15 18:18:07 +00:00
|
|
|
|
<header
|
2022-09-28 21:08:14 +00:00
|
|
|
|
class={styles.mainHeader}
|
2022-09-15 18:18:07 +00:00
|
|
|
|
classList={{
|
2022-09-28 21:08:14 +00:00
|
|
|
|
[styles.headerFixed]: props.isHeaderFixed,
|
2022-09-29 20:10:00 +00:00
|
|
|
|
[styles.headerScrolledTop]: !getIsScrollingBottom() && getIsScrolled(),
|
2022-10-28 09:10:14 +00:00
|
|
|
|
[styles.headerScrolledBottom]:
|
|
|
|
|
(getIsScrollingBottom() && getIsScrolled() && !isProfilePopupVisible()) || isSharePopupVisible(),
|
2024-06-26 08:22:05 +00:00
|
|
|
|
[styles.headerWithTitle]: Boolean(props.title)
|
2022-09-15 18:18:07 +00:00
|
|
|
|
}}
|
|
|
|
|
>
|
2023-09-21 11:38:22 +00:00
|
|
|
|
<Modal
|
2024-06-24 17:50:27 +00:00
|
|
|
|
variant={searchParams?.source ? 'narrow' : 'wide'}
|
2023-09-21 11:38:22 +00:00
|
|
|
|
name="auth"
|
2024-06-25 19:10:00 +00:00
|
|
|
|
hideClose={Boolean(searchParams?.source === 'authguard')}
|
2023-09-21 11:38:22 +00:00
|
|
|
|
noPadding={true}
|
|
|
|
|
>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
<AuthModal />
|
|
|
|
|
</Modal>
|
2022-10-17 20:53:04 +00:00
|
|
|
|
|
2023-07-31 21:24:41 +00:00
|
|
|
|
<Modal variant="narrow" name="confirm">
|
|
|
|
|
<ConfirmModal />
|
|
|
|
|
</Modal>
|
|
|
|
|
|
2023-11-02 19:21:51 +00:00
|
|
|
|
<Modal variant="wide" name="search">
|
|
|
|
|
<SearchModal />
|
|
|
|
|
</Modal>
|
|
|
|
|
|
2022-10-17 20:53:04 +00:00
|
|
|
|
<div class={clsx(styles.mainHeaderInner, 'wide-container')}>
|
2023-12-29 06:39:16 +00:00
|
|
|
|
<nav class={clsx('row', styles.headerInner, { [styles.fixed]: fixed() })}>
|
2023-10-16 20:11:08 +00:00
|
|
|
|
<div class={clsx(styles.burgerContainer, 'col-auto')}>
|
2023-12-29 06:39:16 +00:00
|
|
|
|
<div class={clsx(styles.burger, { [styles.fixed]: fixed() })} onClick={toggleFixed}>
|
2023-10-16 20:11:08 +00:00
|
|
|
|
<div />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2023-06-28 20:18:43 +00:00
|
|
|
|
<div class={clsx('col-md-5 col-xl-4 col-auto', styles.mainLogo)}>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
<A href={'/'}>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
<img src="/logo.svg" alt={t('Discours')} />
|
2024-06-24 17:50:27 +00:00
|
|
|
|
</A>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</div>
|
2023-09-04 20:45:02 +00:00
|
|
|
|
<div class={clsx('col col-md-13 col-lg-12 offset-xl-1', styles.mainNavigationWrapper)}>
|
2022-10-03 21:44:21 +00:00
|
|
|
|
<Show when={props.title}>
|
|
|
|
|
<div class={styles.articleHeader}>{props.title}</div>
|
|
|
|
|
</Show>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
<div class={clsx(styles.mainNavigation, { [styles.fixed]: fixed() })}>
|
|
|
|
|
<ul class="view-switcher">
|
2024-07-03 07:02:46 +00:00
|
|
|
|
<For each={['', 'feed', 'topics', 'authors', 'guide']}>
|
|
|
|
|
{(route: string) => (
|
2024-07-03 07:23:36 +00:00
|
|
|
|
<li classList={{ 'view-switcher__item--selected': loc.pathname.includes(route) }}>
|
2024-07-03 07:02:46 +00:00
|
|
|
|
<A
|
2024-07-03 07:23:36 +00:00
|
|
|
|
class={clsx({ [styles.mainNavigationItemActive]: loc.pathname.includes(route) })}
|
2024-07-03 07:02:46 +00:00
|
|
|
|
href={`/${route}`}
|
|
|
|
|
onClick={(event) => handleToggleMenuByLink(event, `/${route}`)}
|
2024-07-03 07:23:36 +00:00
|
|
|
|
onMouseOver={() => toggleSubnavigation(true, setIsTopMenuVisible)}
|
2024-07-03 07:02:46 +00:00
|
|
|
|
onMouseOut={() => hideSubnavigation()}
|
|
|
|
|
>
|
|
|
|
|
{t(route || 'journal')}
|
|
|
|
|
</A>
|
2024-07-03 07:03:48 +00:00
|
|
|
|
</li>
|
2024-07-03 07:02:46 +00:00
|
|
|
|
)}
|
|
|
|
|
</For>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<div class={styles.mainNavigationMobile}>
|
2023-10-23 22:35:02 +00:00
|
|
|
|
<h4>{t('Participating')}</h4>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
<ul class="view-switcher">
|
|
|
|
|
<li>
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/edit/new">{t('Create post')}</A>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/connect">{t('Suggest an idea')}</A>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-05 07:23:59 +00:00
|
|
|
|
<A href="/support">{t('Support the project')}</A>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
2024-02-04 09:03:15 +00:00
|
|
|
|
<h4>{t('Subscribe us')}</h4>
|
2023-09-16 06:38:56 +00:00
|
|
|
|
<ul class="view-switcher">
|
|
|
|
|
<li class={styles.mainNavigationSocial}>
|
|
|
|
|
<a href="https://www.instagram.com/discoursio/">
|
|
|
|
|
<Icon name="user-link-instagram" class={styles.icon} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
Instagram
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.mainNavigationSocial}>
|
|
|
|
|
<a href="https://facebook.com/discoursio">
|
|
|
|
|
<Icon name="user-link-facebook" class={styles.icon} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
Facebook
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.mainNavigationSocial}>
|
|
|
|
|
<a href="https://twitter.com/discours_io">
|
|
|
|
|
<Icon name="user-link-twitter" class={styles.icon} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
Twitter
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.mainNavigationSocial}>
|
|
|
|
|
<a href="https://t.me/discoursio">
|
|
|
|
|
<Icon name="user-link-telegram" class={styles.icon} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
Telegram
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.mainNavigationSocial}>
|
|
|
|
|
<a href="https://dzen.ru/discoursio">
|
|
|
|
|
<Icon name="user-link-dzen" class={styles.icon} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
Dzen
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.mainNavigationSocial}>
|
|
|
|
|
<a href="https://vk.com/discoursio">
|
|
|
|
|
<Icon name="user-link-vk" class={styles.icon} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
VK
|
2023-09-16 06:38:56 +00:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<h4>{t('Newsletter')}</h4>
|
2024-06-06 05:44:59 +00:00
|
|
|
|
<Newsletter variant={'mobileSubscription'} />
|
2023-10-23 22:35:02 +00:00
|
|
|
|
|
2023-10-25 15:04:23 +00:00
|
|
|
|
<h4>{t('Language')}</h4>
|
|
|
|
|
<select
|
|
|
|
|
class={styles.languageSelectorMobile}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
onChange={(ev) => handleSwitchLanguage(ev.target.value)}
|
2023-10-25 15:04:23 +00:00
|
|
|
|
value={lang()}
|
|
|
|
|
>
|
2023-10-23 22:35:02 +00:00
|
|
|
|
<option value="ru">🇷🇺 Русский</option>
|
|
|
|
|
<option value="en">🇬🇧 English</option>
|
|
|
|
|
</select>
|
|
|
|
|
|
|
|
|
|
<div class={styles.mainNavigationAdditionalLinks}>
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/guide/dogma">{t('Dogma')}</A>
|
|
|
|
|
<A href="/guide/debate">{t('Discussion rules')}</A>
|
2024-07-03 17:38:43 +00:00
|
|
|
|
<A href="/guide/principles">{t('Our principles')}</A>
|
2023-10-23 22:35:02 +00:00
|
|
|
|
</div>
|
|
|
|
|
|
2023-09-16 06:38:56 +00:00
|
|
|
|
<p
|
|
|
|
|
class={styles.mobileDescription}
|
|
|
|
|
innerHTML={t(
|
2024-06-26 08:22:05 +00:00
|
|
|
|
'Independant magazine with an open horizontal cooperation about culture, science and society'
|
2023-09-16 06:38:56 +00:00
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
<div class={styles.mobileCopyright}>
|
|
|
|
|
{t('Discours')} © 2015–{new Date().getFullYear()}{' '}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2022-09-15 19:41:05 +00:00
|
|
|
|
</div>
|
2022-11-13 19:35:57 +00:00
|
|
|
|
<HeaderAuth setIsProfilePopupVisible={setIsProfilePopupVisible} />
|
|
|
|
|
<Show when={props.title}>
|
2024-04-30 13:26:31 +00:00
|
|
|
|
<div
|
|
|
|
|
class={clsx(styles.articleControls, 'col-auto', {
|
2024-06-26 08:22:05 +00:00
|
|
|
|
[styles.articleControlsAuthorized]: session()?.user?.id
|
2024-04-30 13:26:31 +00:00
|
|
|
|
})}
|
|
|
|
|
>
|
2022-11-13 19:35:57 +00:00
|
|
|
|
<SharePopup
|
2024-06-24 17:50:27 +00:00
|
|
|
|
title={props.title || ''}
|
|
|
|
|
imageUrl={props.cover || ''}
|
2023-01-31 13:58:28 +00:00
|
|
|
|
shareUrl={getShareUrl()}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
description={getDescription(props.articleBody || '')}
|
2022-11-13 19:35:57 +00:00
|
|
|
|
onVisibilityChange={(isVisible) => {
|
|
|
|
|
setIsSharePopupVisible(isVisible)
|
|
|
|
|
}}
|
|
|
|
|
containerCssClass={styles.control}
|
2023-07-09 18:34:59 +00:00
|
|
|
|
trigger={
|
|
|
|
|
<>
|
|
|
|
|
<Icon name="share-outline" class={styles.icon} />
|
|
|
|
|
<Icon name="share-outline-hover" class={clsx(styles.icon, styles.iconHover)} />
|
|
|
|
|
</>
|
|
|
|
|
}
|
2022-11-13 19:35:57 +00:00
|
|
|
|
/>
|
2023-04-20 14:01:15 +00:00
|
|
|
|
<div onClick={(event) => scrollToComments(event, true)} class={styles.control}>
|
2023-07-09 18:34:59 +00:00
|
|
|
|
<Icon name="comment" class={styles.icon} />
|
|
|
|
|
<Icon name="comment-hover" class={clsx(styles.icon, styles.iconHover)} />
|
2023-04-17 10:31:20 +00:00
|
|
|
|
</div>
|
2024-02-04 09:03:15 +00:00
|
|
|
|
<button class={styles.control} onClick={handleCreateButtonClick}>
|
2022-12-04 15:10:27 +00:00
|
|
|
|
<Icon name="pencil-outline" class={styles.icon} />
|
2023-07-09 18:34:59 +00:00
|
|
|
|
<Icon name="pencil-outline-hover" class={clsx(styles.icon, styles.iconHover)} />
|
2024-02-04 09:03:15 +00:00
|
|
|
|
</button>
|
|
|
|
|
<button class={styles.control} onClick={handleBookmarkButtonClick}>
|
2022-12-04 15:10:27 +00:00
|
|
|
|
<Icon name="bookmark" class={styles.icon} />
|
2023-07-09 18:34:59 +00:00
|
|
|
|
<Icon name="bookmark-hover" class={clsx(styles.icon, styles.iconHover)} />
|
2024-02-04 09:03:15 +00:00
|
|
|
|
</button>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</div>
|
2022-11-13 19:35:57 +00:00
|
|
|
|
</Show>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
|
2023-08-28 22:15:31 +00:00
|
|
|
|
<div
|
|
|
|
|
class={clsx(styles.subnavigation, 'col')}
|
|
|
|
|
onMouseOver={clearTimer}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
onMouseOut={() => hideSubnavigation()}
|
2023-08-28 22:15:31 +00:00
|
|
|
|
>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<ul class="nodash">
|
|
|
|
|
<li>
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/guide/manifest">{t('Manifesto')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/guide/dogma">{t('Dogma')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-03 17:38:43 +00:00
|
|
|
|
<A href="/guide/principles">{t('Community Our principles')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-05 07:23:59 +00:00
|
|
|
|
<A href='/guide'>{t('Platform Guide')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-05 07:23:59 +00:00
|
|
|
|
<A href="/support">{t('Support us')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-05 07:23:59 +00:00
|
|
|
|
<A href="/manifest#participation">{t('How to help')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.rightItem}>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/connect">
|
2023-08-17 20:28:24 +00:00
|
|
|
|
{t('Suggest an idea')}
|
|
|
|
|
<Icon name="arrow-right-black" class={clsx(styles.icon, styles.rightItemIcon)} />
|
2024-07-01 15:30:45 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
2023-08-28 22:15:31 +00:00
|
|
|
|
<div
|
|
|
|
|
class={clsx(styles.subnavigation, 'col')}
|
2024-07-03 07:23:36 +00:00
|
|
|
|
classList={{ hidden: !isTopMenuVisible() }}
|
2023-08-28 22:15:31 +00:00
|
|
|
|
onMouseOver={clearTimer}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
onMouseOut={() => hideSubnavigation()}
|
2023-08-28 22:15:31 +00:00
|
|
|
|
>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<ul class="nodash">
|
2023-09-18 20:28:39 +00:00
|
|
|
|
<li class="item">
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/expo">{t('Art')}</A>
|
2023-09-18 20:28:39 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li class="item">
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/podcasts">{t('Podcasts')}</A>
|
2023-09-18 20:28:39 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li class="item">
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/guide/projects">{t('Special Projects')}</A>
|
2023-09-18 20:28:39 +00:00
|
|
|
|
</li>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/interview">#{t('Interview')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/reportage">#{t('Reports')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/empiric">#{t('Experience')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/society">#{t('Society')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/culture">#{t('Culture')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/theory">#{t('Theory')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href="/topic/poetry">#{t('Poetry')}</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li class={styles.rightItem}>
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/topic">
|
2023-08-17 20:28:24 +00:00
|
|
|
|
{t('All topics')}
|
|
|
|
|
<Icon name="arrow-right-black" class={clsx(styles.icon, styles.rightItemIcon)} />
|
2024-07-01 15:30:45 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
2023-08-28 22:15:31 +00:00
|
|
|
|
<div
|
|
|
|
|
class={clsx(styles.subnavigation, 'col')}
|
|
|
|
|
onMouseOver={clearTimer}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
onMouseOut={() => hideSubnavigation()}
|
2023-08-28 22:15:31 +00:00
|
|
|
|
>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<ul class="nodash">
|
2023-09-15 14:41:11 +00:00
|
|
|
|
<Show when={randomTopics().length > 0}>
|
|
|
|
|
<For each={randomTopics()}>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
{(topic: Topic) => (
|
2023-09-14 11:40:46 +00:00
|
|
|
|
<li class="item">
|
2024-07-01 15:30:45 +00:00
|
|
|
|
<A href={`/topic/${topic.slug}`}>
|
2023-09-14 11:40:46 +00:00
|
|
|
|
<span>#{tag(topic)}</span>
|
2024-07-01 15:30:45 +00:00
|
|
|
|
</A>
|
2023-09-14 11:40:46 +00:00
|
|
|
|
</li>
|
|
|
|
|
)}
|
|
|
|
|
</For>
|
|
|
|
|
<li class={styles.rightItem}>
|
2024-07-03 21:25:03 +00:00
|
|
|
|
<A href="/topic">
|
2023-09-14 11:40:46 +00:00
|
|
|
|
{t('All topics')}
|
|
|
|
|
<Icon name="arrow-right-black" class={clsx(styles.icon, styles.rightItemIcon)} />
|
2024-07-01 15:30:45 +00:00
|
|
|
|
</A>
|
2023-09-14 11:40:46 +00:00
|
|
|
|
</li>
|
|
|
|
|
</Show>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
class={clsx(styles.subnavigation, styles.subnavigationFeed, 'col')}
|
2023-08-28 22:15:31 +00:00
|
|
|
|
onMouseOver={clearTimer}
|
2024-06-24 17:50:27 +00:00
|
|
|
|
onMouseOut={() => hideSubnavigation()}
|
2023-08-17 20:28:24 +00:00
|
|
|
|
>
|
|
|
|
|
<ul class="nodash">
|
|
|
|
|
<li>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
<A href={'/feed'}>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<span class={styles.subnavigationItemName}>
|
|
|
|
|
<Icon name="feed-all" class={styles.icon} />
|
2023-10-30 11:20:33 +00:00
|
|
|
|
{t('All')}
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</span>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<li>
|
2024-07-03 17:38:43 +00:00
|
|
|
|
<A href={'/feed/followed'}>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<span class={styles.subnavigationItemName}>
|
|
|
|
|
<Icon name="feed-my" class={styles.icon} />
|
|
|
|
|
{t('My feed')}
|
|
|
|
|
</span>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-03 17:38:43 +00:00
|
|
|
|
<A href={'/feed/coauthored'}>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<span class={styles.subnavigationItemName}>
|
|
|
|
|
<Icon name="feed-collaborate" class={styles.icon} />
|
2023-10-30 11:20:33 +00:00
|
|
|
|
{t('Participation')}
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</span>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-03 17:38:43 +00:00
|
|
|
|
<A href={'/feed/discussed'}>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<span class={styles.subnavigationItemName}>
|
|
|
|
|
<Icon name="feed-discussion" class={styles.icon} />
|
|
|
|
|
{t('Discussions')}
|
|
|
|
|
</span>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2024-07-03 17:38:43 +00:00
|
|
|
|
<A href={'/feed/bookmarked'}>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
<span class={styles.subnavigationItemName}>
|
|
|
|
|
<Icon name="bookmark" class={styles.icon} />
|
|
|
|
|
{t('Bookmarks')}
|
|
|
|
|
</span>
|
2024-06-24 17:50:27 +00:00
|
|
|
|
</A>
|
2023-08-17 20:28:24 +00:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</nav>
|
2023-11-14 07:47:22 +00:00
|
|
|
|
|
|
|
|
|
<Snackbar />
|
2022-09-09 11:53:35 +00:00
|
|
|
|
</div>
|
|
|
|
|
</header>
|
|
|
|
|
)
|
|
|
|
|
}
|