From 68fb4de0d050bb2b462ae7116cd7fe115783b9a3 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Mon, 24 Aug 2026 09:34:22 +0000 Subject: [PATCH] Redesign: Add "custom feeds" and "followed hashtags" sections to main navigation (#40248) --- .../components/button/redesign.module.scss | 2 + .../account_card_and_menu.module.scss | 2 - .../redesign/header.module.scss | 1 + .../navigation_panel/redesign/index.tsx | 101 +++++++++++++++++- .../redesign/list_section.module.scss | 31 ++++++ .../redesign/list_section.tsx | 42 ++++++++ .../redesign/navigation_link.tsx | 10 +- app/javascript/mastodon/locales/en.json | 4 + 8 files changed, 185 insertions(+), 8 deletions(-) create mode 100644 app/javascript/mastodon/features/navigation_panel/redesign/list_section.module.scss create mode 100644 app/javascript/mastodon/features/navigation_panel/redesign/list_section.tsx diff --git a/app/javascript/mastodon/components/button/redesign.module.scss b/app/javascript/mastodon/components/button/redesign.module.scss index 07a0775c486..b0b887732c5 100644 --- a/app/javascript/mastodon/components/button/redesign.module.scss +++ b/app/javascript/mastodon/components/button/redesign.module.scss @@ -43,6 +43,8 @@ // Override default anchor styles a.base { + text-decoration: none; + &:focus { border-radius: var(--radius-round); } diff --git a/app/javascript/mastodon/features/navigation_panel/redesign/account_card_and_menu.module.scss b/app/javascript/mastodon/features/navigation_panel/redesign/account_card_and_menu.module.scss index 6b2e375b8f4..4209dc218ef 100644 --- a/app/javascript/mastodon/features/navigation_panel/redesign/account_card_and_menu.module.scss +++ b/app/javascript/mastodon/features/navigation_panel/redesign/account_card_and_menu.module.scss @@ -1,5 +1,3 @@ -@use '@/styles/mastodon/mixins'; - .root { display: flex; align-items: center; diff --git a/app/javascript/mastodon/features/navigation_panel/redesign/header.module.scss b/app/javascript/mastodon/features/navigation_panel/redesign/header.module.scss index 140949cb8d4..395492502c4 100644 --- a/app/javascript/mastodon/features/navigation_panel/redesign/header.module.scss +++ b/app/javascript/mastodon/features/navigation_panel/redesign/header.module.scss @@ -3,6 +3,7 @@ .root { position: sticky; top: 0; + z-index: 1; display: flex; align-items: center; padding: var(--space-xl) var(--space-lg); diff --git a/app/javascript/mastodon/features/navigation_panel/redesign/index.tsx b/app/javascript/mastodon/features/navigation_panel/redesign/index.tsx index ec6865faea5..6e51b618f9a 100644 --- a/app/javascript/mastodon/features/navigation_panel/redesign/index.tsx +++ b/app/javascript/mastodon/features/navigation_panel/redesign/index.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useEffect } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; @@ -6,20 +6,25 @@ import { PenNibIcon, HouseIcon, MagnifyingGlassIcon, + RssSimpleIcon, BellIcon, ChatCircleIcon, BookmarkSimpleIcon, } from '@phosphor-icons/react'; import FediIcon from '@/images/icons/icon_fediverse.svg?react'; +import { fetchLists } from '@/mastodon/actions/lists'; +import { fetchFollowedHashtags } from '@/mastodon/actions/tags_typed'; import { useIdentity } from '@/mastodon/identity_context'; import { openNewComposer } from '@/mastodon/reducers/slices/composer'; +import { getOrderedLists } from '@/mastodon/selectors/lists'; import { selectUnreadNotificationGroupsCount } from '@/mastodon/selectors/notifications'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; import { NavigationAccountCardAndMenu } from './account_card_and_menu'; import { NavigationFooterLinks } from './footer_links'; import { NavigationHeader } from './header'; +import { ListSection } from './list_section'; import { NavigationLink } from './navigation_link'; import classes from './styles.module.scss'; @@ -32,6 +37,32 @@ const messages = defineMessages({ }, }); +function useCustomFeeds() { + const dispatch = useAppDispatch(); + const customFeeds = useAppSelector((state) => getOrderedLists(state)); + + useEffect(() => { + void dispatch(fetchLists()); + }, [dispatch]); + + return { + customFeeds, + }; +} + +function useFollowedHashtags() { + const dispatch = useAppDispatch(); + const { tags, stale } = useAppSelector((state) => state.followedTags); + + useEffect(() => { + if (stale) { + void dispatch(fetchFollowedHashtags()); + } + }, [dispatch, stale]); + + return { followedHashtags: tags }; +} + export const RedesignNavigationPanel: React.FC<{ siteName?: string }> = ({ siteName, }) => { @@ -46,6 +77,9 @@ export const RedesignNavigationPanel: React.FC<{ siteName?: string }> = ({ dispatch(openNewComposer({ type: 'post' })); }, [dispatch]); + const { customFeeds } = useCustomFeeds(); + const { followedHashtags } = useFollowedHashtags(); + return (