import BookmarkList from '@/components/BookmarkList' import RelayInfo from '@/components/RelayInfo' import VersionUpdateBanner from '@/components/VersionUpdateBanner' 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 { TPageRef } from '@/types' import { Info, Rss } from 'lucide-react' import React, { Dispatch, forwardRef, SetStateAction, useEffect, useImperativeHandle, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import FeedButton from './FeedButton' import ExploreButton from '@/components/Titlebar/ExploreButton' import AccountButton from '@/components/Titlebar/AccountButton' import FollowingFeed from './FollowingFeed' import RelaysFeed from './RelaysFeed' import logger from '@/lib/logger' import { usePrimaryPage, usePrimaryNoteView } from '@/PageManager' import storage from '@/services/local-storage.service' const NoteListPage = forwardRef((_, ref) => { logger.debug('NoteListPage component rendering') const { t } = useTranslation() const { addRelayUrls, removeRelayUrls } = useCurrentRelays() const layoutRef = useRef(null) const { pubkey, checkLogin } = useNostr() const { feedInfo, relayUrls, isReady } = useFeed() const [showRelayDetails, setShowRelayDetails] = useState(false) const [homeSubHeader, setHomeSubHeader] = useState(null) useImperativeHandle(ref, () => layoutRef.current) // Clear subHeader when switching away from relay/relays/all-favorites feed useEffect(() => { const isRelaysFeed = feedInfo.feedType === 'relay' || feedInfo.feedType === 'relays' || feedInfo.feedType === 'all-favorites' if (!isRelaysFeed) setHomeSubHeader(null) }, [feedInfo.feedType]) // 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]) // Debug logging logger.debug('NoteListPage debug:', { isReady, feedInfo, relayUrls, pubkey: !!pubkey }) let content: React.ReactNode = null if (!isReady) { content =
{t('loading...')}
} else if (feedInfo.feedType === 'following' && !pubkey) { content = (
) } else if (feedInfo.feedType === 'bookmarks') { if (!pubkey) { content = (
) } else { content = } } else if (feedInfo.feedType === 'following') { content = } else { content = ( <> {showRelayDetails && feedInfo.feedType === 'relay' && !!feedInfo.id && ( )} ) } return ( } subHeader={homeSubHeader ?? undefined} displayScrollToTopButton >
{content}
) }) NoteListPage.displayName = 'NoteListPage' export default NoteListPage function NoteListPageTitlebar({ layoutRef, showRelayDetails, setShowRelayDetails }: { layoutRef?: React.RefObject showRelayDetails?: boolean setShowRelayDetails?: Dispatch> }) { const { isSmallScreen } = useScreenSize() const { setPrimaryNoteView } = usePrimaryNoteView() const { navigate, current } = usePrimaryPage() const { primaryViewType } = usePrimaryNoteView() const showRssFeed = storage.getShowRssFeed() const handleRssClick = (e: React.MouseEvent) => { e.stopPropagation() // Navigate to home if not already there if (current !== 'home' || primaryViewType !== null) { navigate('home') // Wait a bit for navigation to complete, then switch to RSS setTimeout(() => { window.dispatchEvent(new CustomEvent('switchToRssFeed')) }, 100) } else { // Already on home, just switch to RSS tab window.dispatchEvent(new CustomEvent('switchToRssFeed')) } } return (
{isSmallScreen && (
)}
{isSmallScreen && showRssFeed && ( )} {setShowRelayDetails && ( )}
) }