import { usePrimaryPage, useSecondaryPage } from '@/PageManager' import PostEditor from '@/components/PostEditor' import RelayInfo from '@/components/RelayInfo' import { Button } from '@/components/ui/button' import PrimaryPageLayout from '@/layouts/PrimaryPageLayout' import { toSearch } from '@/lib/link' 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 { Compass, Info, LogIn, PencilLine, Search, Sparkles } from 'lucide-react' import { Dispatch, forwardRef, SetStateAction, useEffect, useImperativeHandle, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import FeedButton from './FeedButton' import FollowingFeed from './FollowingFeed' import PinnedFeed from './PinnedFeed' import RelaysFeed from './RelaysFeed' const NoteListPage = forwardRef((_, ref) => { const { t } = useTranslation() const { addRelayUrls, removeRelayUrls } = useCurrentRelays() const layoutRef = useRef(null) const { pubkey } = useNostr() const { feedInfo, relayUrls, isReady, switchFeed } = useFeed() const [showRelayDetails, setShowRelayDetails] = useState(false) useImperativeHandle(ref, () => layoutRef.current as TPageRef) useEffect(() => { if (layoutRef.current) { layoutRef.current.scrollToTop('instant') } }, [JSON.stringify(relayUrls), feedInfo]) useEffect(() => { if (relayUrls.length) { addRelayUrls(relayUrls) return () => { removeRelayUrls(relayUrls) } } }, [relayUrls]) let content: React.ReactNode = null if (!isReady) { content = (
{t('loading...')}
) } else if (!feedInfo) { content = } else if (feedInfo.feedType === 'following' && !pubkey) { switchFeed(null) return null } else if (feedInfo.feedType === 'pinned' && !pubkey) { switchFeed(null) return null } else if (feedInfo.feedType === 'following') { content = } else if (feedInfo.feedType === 'pinned') { content = } else { content = ( <> {showRelayDetails && feedInfo.feedType === 'relay' && !!feedInfo.id && ( )} ) } return ( } displayScrollToTopButton > {content} ) }) NoteListPage.displayName = 'NoteListPage' export default NoteListPage function NoteListPageTitlebar({ layoutRef, showRelayDetails, setShowRelayDetails }: { layoutRef?: React.RefObject showRelayDetails?: boolean setShowRelayDetails?: Dispatch> }) { const { isSmallScreen } = useScreenSize() return (
{setShowRelayDetails && ( )} {isSmallScreen && ( <> )}
) } function PostButton() { const { checkLogin } = useNostr() const [open, setOpen] = useState(false) return ( <> ) } function SearchButton() { const { push } = useSecondaryPage() return ( ) } function WelcomeGuide() { const { t } = useTranslation() const { navigate } = usePrimaryPage() const { checkLogin } = useNostr() return (

{t('Welcome to Jumble')}

{t( 'Jumble is a client focused on browsing relays. Get started by exploring interesting relays or login to view your following feed.' )}

) }