import RelayInfo from '@/components/RelayInfo' import { RefreshButton } from '@/components/RefreshButton' import { Button } from '@/components/ui/button' import PrimaryPageLayout from '@/layouts/PrimaryPageLayout' import { useCurrentRelays } from '@/providers/CurrentRelaysProvider' import { useFeed } from '@/providers/FeedProvider' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import type { TNoteListRef } from '@/components/NoteList' import { NoteCardLoadingSkeleton } from '@/components/NoteCard' import { TPageRef } from '@/types' import { Compass, Info, Star, UsersRound } from 'lucide-react' import React, { Dispatch, forwardRef, SetStateAction, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { FavoriteRelaysActiveStripMobileBar } from '@/components/FavoriteRelaysActiveStrip' import FavoriteRelaysFeedPicker from '@/components/FavoriteRelaysFeedPicker' import HelpAndAccountMenu from '@/components/HelpAndAccountMenu' import Logo from '@/assets/Logo' import RelaysFeed from './RelaysFeed' import { usePrimaryPage } from '@/contexts/primary-page-context' import { usePrimaryNoteView } from '@/contexts/primary-note-view-context' const NoteListPage = forwardRef((_, ref) => { const { t } = useTranslation() const { addRelayUrls, removeRelayUrls } = useCurrentRelays() const layoutRef = useRef(null) const feedRef = useRef(null) const { feedInfo, relayUrls, isReady } = useFeed() const { isSmallScreen } = useScreenSize() const [showRelayDetails, setShowRelayDetails] = useState(false) const [homeSubHeader, setHomeSubHeader] = useState(null) const usesSubHeader = feedInfo.feedType === 'relay' || feedInfo.feedType === 'relays' || feedInfo.feedType === 'all-favorites' const runFeedRefresh = useCallback(() => { feedRef.current?.refresh() }, []) useImperativeHandle( ref, () => ({ scrollToTop: (behavior?: ScrollBehavior) => layoutRef.current?.scrollToTop(behavior), refresh: runFeedRefresh }), [runFeedRefresh] ) const setHomeSubHeaderStable = useCallback((node: React.ReactNode) => { setHomeSubHeader(node) }, []) useEffect(() => { if (!usesSubHeader) setHomeSubHeader(null) }, [usesSubHeader]) // REMOVED: Scroll-to-top logic - feed should NEVER scroll to top when drawer opens/closes // The feed stays mounted and maintains scroll position at all times useEffect(() => { if (relayUrls.length) { addRelayUrls(relayUrls) return () => { removeRelayUrls(relayUrls) } } }, [relayUrls]) let content: React.ReactNode = null if (!isReady) { content = (

{t('feedStarting', { defaultValue: 'Starting feeds and relays… This can take a few seconds after login.' })}

{Array.from({ length: 5 }).map((_, i) => ( ))}
) } else { content = ( <> {showRelayDetails && feedInfo.feedType === 'relay' && !!feedInfo.id && ( )} ) } const showFavoriteRelaysPicker = isReady && (feedInfo.feedType === 'all-favorites' || feedInfo.feedType === 'relay' || feedInfo.feedType === 'relays') const feedPageTitle = useMemo( () => feedInfo.feedType === 'relays' ? t('relayType_relay_set') : t('Favorite Relays'), [feedInfo.feedType, t] ) const subHeader = ( <> {isSmallScreen ? : null}

{feedPageTitle}

{showFavoriteRelaysPicker ? : null} {homeSubHeader} ) return ( } subHeader={subHeader} displayScrollToTopButton >
{content}
) }) NoteListPage.displayName = 'NoteListPage' export default NoteListPage function NoteListPageTitlebar({ layoutRef, onFeedRefresh, showTitlebarRefresh, showRelayDetails, setShowRelayDetails }: { layoutRef?: React.RefObject onFeedRefresh: () => void showTitlebarRefresh: boolean showRelayDetails?: boolean setShowRelayDetails?: Dispatch> }) { const { t } = useTranslation() const { isSmallScreen } = useScreenSize() const { navigate, current, currentPageProps, display } = usePrimaryPage() const { primaryViewType, setPrimaryNoteView } = usePrimaryNoteView() const { pubkey } = useNostr() const spell = (currentPageProps as { spell?: string } | undefined)?.spell const exploreActive = display && current === 'explore' && primaryViewType === null const followsLatestActive = display && current === 'follows-latest' && primaryViewType === null const favoritesActive = display && current === 'spells' && spell === 'favorites' && primaryViewType === null return (
{isSmallScreen && ( <> {pubkey ? ( <> ) : null} )}
{isSmallScreen && (
)}
{showTitlebarRefresh && } {setShowRelayDetails && ( )} {isSmallScreen && }
) }