webapp/src/components/Nav/Header/Header.tsx

521 lines
18 KiB
TypeScript
Raw Normal View History

2024-07-06 00:59:01 +00:00
import { A, redirect, useSearchParams } from '@solidjs/router'
2022-09-28 21:08:14 +00:00
import { clsx } from 'clsx'
2024-07-05 13:34:19 +00:00
import { For, Show, createEffect, createSignal, onCleanup, onMount } from 'solid-js'
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-05 13:34:19 +00:00
import type { Topic } from '../../../graphql/schema/core.gen'
2024-07-05 14:08:12 +00:00
import { getRandomTopicsFromArray } from '../../../lib/getRandomTopicsFromArray'
import { getArticleDescription } from '../../../utils/meta'
2024-02-04 11:25:21 +00:00
import { SharePopup, getShareUrl } from '../../Article/SharePopup'
2024-07-05 13:34:19 +00:00
import { Icon } from '../../_shared/Icon'
import { Newsletter } from '../../_shared/Newsletter'
2023-08-26 09:41:21 +00:00
import { AuthModal } from '../AuthModal'
import { ConfirmModal } from '../ConfirmModal'
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'
2024-07-05 13:34:19 +00:00
import { Link } from './HeaderLink'
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
articleBody?: string
cover?: string
2023-04-17 10:31:20 +00:00
scrollToComments?: (value: boolean) => void
2022-09-22 09:37:49 +00:00
}
type HeaderSearchParams = {
source?: string
}
2024-07-05 13:34:19 +00:00
const handleSwitchLanguage = (event: { target: { value: string } }) => {
location.href = `${location.href}${location.href.includes('?') ? '&' : '?'}lng=${event.target.value}`
}
2022-09-22 09:37:49 +00:00
export const Header = (props: Props) => {
const { t, lang } = useLocalize()
2024-06-24 17:50:27 +00:00
const { modal } = useUI()
2024-02-04 17:40:15 +00:00
const { requireAuthentication } = useSession()
2024-07-05 13:35:13 +00:00
const [searchParams] = useSearchParams<HeaderSearchParams>()
2024-07-05 13:34:19 +00:00
const { sortedTopics: topics } = useTopics()
2024-06-24 17:50:27 +00:00
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)
const [isProfilePopupVisible, setIsProfilePopupVisible] = createSignal(false)
2024-07-05 13:34:19 +00:00
const [isKnowledgeBaseVisible, setIsKnowledgeBaseVisible] = createSignal(false)
const [isTopicsVisible, setIsTopicsVisible] = createSignal(false)
const [isZineVisible, setIsZineVisible] = createSignal(false)
const [isFeedVisible, setIsFeedVisible] = createSignal(false)
2024-05-06 14:26:03 +00:00
const { session } = useSession()
2024-02-04 17:40:15 +00:00
const toggleFixed = () => setFixed(!fixed())
const tag = (topic: Topic) =>
/[ЁА-яё]/.test(topic.title || '') && lang() !== 'ru' ? topic.slug : topic.title
let windowScrollTop = 0
2024-03-18 11:07:28 +00:00
createEffect(() => {
2024-05-06 10:53:35 +00:00
if (topics()?.length) {
2024-07-05 13:34:19 +00:00
setRandomTopics(getRandomTopicsFromArray(topics()))
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(() => {
const mainContent = document.querySelector<HTMLDivElement>('.main-content')
2024-07-05 13:34:19 +00:00
if (fixed() || modal() !== null) {
windowScrollTop = window.scrollY
2024-07-05 13:34:19 +00:00
if (mainContent) mainContent.style.marginTop = `-${windowScrollTop}px`
}
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())
2024-02-04 17:40:15 +00:00
if (!(fixed() || modal())) {
window.scrollTo(0, windowScrollTop)
2024-07-05 13:35:13 +00:00
if (mainContent) mainContent.style.marginTop = ''
}
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-07-05 13:35:13 +00:00
const scrollToComments = (
event: MouseEvent & { currentTarget: HTMLDivElement; target: Element },
value: boolean
) => {
2024-07-05 13:34:19 +00:00
event.preventDefault()
2024-06-24 17:50:27 +00:00
props.scrollToComments?.(value)
2023-04-17 10:31:20 +00:00
}
2024-07-05 13:34:19 +00:00
const handleBookmarkButtonClick = (ev: { preventDefault: () => void }) => {
2023-08-13 12:27:30 +00:00
requireAuthentication(() => {
// TODO: implement bookmark clicked
2024-07-05 13:34:19 +00:00
ev.preventDefault()
2023-08-13 12:27:30 +00:00
}, 'bookmark')
}
2024-07-05 13:34:19 +00:00
const handleCreateButtonClick = (ev?: { preventDefault: () => void }) => {
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-05 19:40:54 +00:00
redirect('/edit/new')
2023-08-13 12:27:30 +00:00
}, 'create')
}
2024-07-05 13:34:19 +00:00
const toggleSubnavigation = (isShow: boolean, signal?: (b: boolean) => void) => {
2023-08-28 22:15:31 +00:00
clearTimer()
2024-07-05 13:34:19 +00:00
setIsKnowledgeBaseVisible(false)
setIsTopicsVisible(false)
setIsZineVisible(false)
setIsFeedVisible(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-07-05 13:34:19 +00:00
const hideSubnavigation = (_ev?: MouseEvent, 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-07-05 13:34:19 +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(),
[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
}}
>
<Modal
2024-06-24 17:50:27 +00:00
variant={searchParams?.source ? 'narrow' : 'wide'}
name="auth"
2024-07-05 13:34:19 +00:00
hideClose={searchParams?.source === 'authguard'}
noPadding={true}
>
2022-09-09 11:53:35 +00:00
<AuthModal />
</Modal>
2022-10-17 20:53:04 +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')}>
<nav class={clsx('row', styles.headerInner, { [styles.fixed]: fixed() })}>
2023-10-16 20:11:08 +00:00
<div class={clsx(styles.burgerContainer, 'col-auto')}>
<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-07-05 13:35:13 +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>
<div class={clsx(styles.mainNavigation, { [styles.fixed]: fixed() })}>
2024-07-06 00:59:01 +00:00
<ul class="view-switcher" onClick={() => !fixed() && toggleFixed()}>
2024-07-05 13:34:19 +00:00
<Link
onMouseOver={() => toggleSubnavigation(true, setIsZineVisible)}
onMouseOut={hideSubnavigation}
href="/"
active={isZineVisible()}
2024-07-05 21:40:33 +00:00
body={t('Journal')}
2024-07-05 13:34:19 +00:00
/>
<Link
onMouseOver={() => toggleSubnavigation(true, setIsFeedVisible)}
onMouseOut={hideSubnavigation}
href="/feed"
active={isFeedVisible()}
2024-07-05 21:40:33 +00:00
body={t('Feed')}
2024-07-05 13:34:19 +00:00
/>
<Link
onMouseOver={() => toggleSubnavigation(true, setIsTopicsVisible)}
onMouseOut={hideSubnavigation}
href="/topic"
active={isTopicsVisible()}
2024-07-05 22:24:22 +00:00
body={t('Topics')}
2024-07-05 13:34:19 +00:00
/>
<Link
onMouseOver={(event?: MouseEvent) => hideSubnavigation(event, 0)}
onMouseOut={(event?: MouseEvent) => hideSubnavigation(event, 0)}
href="/author"
2024-07-05 21:40:33 +00:00
body={t('Authors')}
2024-07-05 13:34:19 +00:00
/>
<Link
onMouseOver={() => toggleSubnavigation(true, setIsKnowledgeBaseVisible)}
onMouseOut={() => hideSubnavigation}
href="/guide"
body={t('Knowledge base')}
active={isKnowledgeBaseVisible()}
/>
</ul>
<div class={styles.mainNavigationMobile}>
2023-10-23 22:35:02 +00:00
<h4>{t('Participating')}</h4>
<ul class="view-switcher">
<li>
2024-07-05 19:40:54 +00:00
<A href="/edit/new">{t('Create post')}</A>
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/connect">{t('Suggest an idea')}</A>
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/support">{t('Support the project')}</A>
</li>
</ul>
2024-02-04 09:03:15 +00:00
<h4>{t('Subscribe us')}</h4>
<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
</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
</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
</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
</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
</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
</a>
</li>
</ul>
<h4>{t('Newsletter')}</h4>
<Newsletter variant={'mobileSubscription'} />
2023-10-23 22:35:02 +00:00
<h4>{t('Language')}</h4>
<select
class={styles.languageSelectorMobile}
2024-07-05 13:34:19 +00:00
onChange={handleSwitchLanguage}
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-05 19:40:54 +00:00
<A href="/dogma">{t('Dogma')}</A>
<A href="/terms">{t('Discussion rules')}</A>
<A href="/principles">{t('Principles')}</A>
2023-10-23 22:35:02 +00:00
</div>
<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'
)}
/>
<div class={styles.mobileCopyright}>
{t('Discours')} &copy; 2015&ndash;{new Date().getFullYear()}{' '}
</div>
</div>
</div>
2022-09-15 19:41:05 +00:00
</div>
<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
})}
>
<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-07-05 14:08:12 +00:00
description={getArticleDescription(props.articleBody?.slice(0, 100) || '')}
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)} />
</>
}
/>
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>
</Show>
2023-08-17 20:28:24 +00:00
2023-08-28 22:15:31 +00:00
<div
class={clsx(styles.subnavigation, 'col')}
2024-07-05 13:34:19 +00:00
classList={{ hidden: !isKnowledgeBaseVisible() }}
2023-08-28 22:15:31 +00:00
onMouseOver={clearTimer}
2024-07-05 13:34:19 +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-05 19:40:54 +00:00
<A href="/manifest">{t('Manifesto')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/dogma">{t('Dogma')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 22:24:22 +00:00
<A href="/principles">{t('Our principles')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/guide">{t('Platform Guide')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/support">{t('Support us')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +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-05 19:40:54 +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-05 19:40:54 +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-05 13:34:19 +00:00
classList={{ hidden: !isZineVisible() }}
2023-08-28 22:15:31 +00:00
onMouseOver={clearTimer}
2024-07-05 13:34:19 +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-05 19:40:54 +00:00
<A href="/expo">{t('Art')}</A>
</li>
<li class="item">
<A href="/expo/audio">{t('Music')}</A>
2023-09-18 20:28:39 +00:00
</li>
<li class="item">
2024-07-05 19:40:54 +00:00
<A href="/expo/video">{t('Video')}</A>
2023-09-18 20:28:39 +00:00
</li>
<li class="item">
2024-07-05 21:40:33 +00:00
<A href="/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-05 19:40:54 +00:00
<A href="/topic/interview">#{t('Interview')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/topic/reportage">#{t('Reports')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/topic/empiric">#{t('Experience')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/topic/society">#{t('Society')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/topic/culture">#{t('Culture')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +00:00
<A href="/topic/theory">#{t('Theory')}</A>
2023-08-17 20:28:24 +00:00
</li>
<li>
2024-07-05 19:40:54 +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')}
2024-07-05 13:34:19 +00:00
classList={{ hidden: !isTopicsVisible() }}
2023-08-28 22:15:31 +00:00
onMouseOver={clearTimer}
2024-07-05 13:34:19 +00:00
onMouseOut={hideSubnavigation}
2023-08-28 22:15:31 +00:00
>
2023-08-17 20:28:24 +00:00
<ul class="nodash">
<Show when={randomTopics().length > 0}>
<For each={randomTopics()}>
2024-06-24 17:50:27 +00:00
{(topic: Topic) => (
<li class="item">
2024-07-01 15:30:45 +00:00
<A href={`/topic/${topic.slug}`}>
<span>#{tag(topic)}</span>
2024-07-01 15:30:45 +00:00
</A>
</li>
)}
</For>
<li class={styles.rightItem}>
2024-07-03 21:25:03 +00:00
<A href="/topic">
{t('All topics')}
<Icon name="arrow-right-black" class={clsx(styles.icon, styles.rightItemIcon)} />
2024-07-01 15:30:45 +00:00
</A>
</li>
</Show>
2023-08-17 20:28:24 +00:00
</ul>
</div>
<div
class={clsx(styles.subnavigation, styles.subnavigationFeed, 'col')}
2024-07-05 13:34:19 +00:00
classList={{ hidden: !isFeedVisible() }}
2023-08-28 22:15:31 +00:00
onMouseOver={clearTimer}
2024-07-05 13:34:19 +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>
<Snackbar />
2022-09-09 11:53:35 +00:00
</div>
</header>
)
}