feat: improve mobile experience

This commit is contained in:
codytseng 2025-01-02 21:57:14 +08:00
parent 8ec0d46d58
commit 3946e603b3
98 changed files with 2508 additions and 1058 deletions

View file

@ -1,48 +1,69 @@
import NoteList from '@/components/NoteList'
import RelaySettings from '@/components/RelaySettings'
import { Button } from '@/components/ui/button'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { ScrollArea } from '@/components/ui/scroll-area'
import { BIG_RELAY_URLS } from '@/constants'
import PrimaryPageLayout from '@/layouts/PrimaryPageLayout'
import { useFeed } from '@/providers/FeedProvider'
import { useNostr } from '@/providers/NostrProvider'
import { useRelaySettings } from '@/providers/RelaySettingsProvider'
import { useEffect, useRef } from 'react'
import { useEffect, useMemo, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import FeedButton from './FeedButton'
import SearchButton from './SearchButton'
export default function NoteListPage() {
const { t } = useTranslation()
const layoutRef = useRef<{ scrollToTop: () => void }>(null)
const { relayUrls } = useRelaySettings()
const relayUrlsString = JSON.stringify(relayUrls)
const { feedType } = useFeed()
const { relayUrls, temporaryRelayUrls } = useRelaySettings()
const { pubkey, relayList, followings } = useNostr()
const urls = useMemo(() => {
return feedType === 'following'
? relayList?.read.length
? relayList.read.slice(0, 4)
: BIG_RELAY_URLS
: temporaryRelayUrls.length > 0
? temporaryRelayUrls
: relayUrls
}, [feedType, relayUrls, relayList, temporaryRelayUrls])
useEffect(() => {
if (layoutRef.current) {
layoutRef.current.scrollToTop()
}
}, [relayUrlsString])
if (!relayUrls.length) {
return (
<PrimaryPageLayout>
<div className="w-full text-center">
<Popover>
<PopoverTrigger asChild>
<Button title="relay settings" size="lg">
Choose a relay group
</Button>
</PopoverTrigger>
<PopoverContent className="w-96 h-[450px] p-0">
<ScrollArea className="h-full">
<div className="p-4">
<RelaySettings />
</div>
</ScrollArea>
</PopoverContent>
</Popover>
</div>
</PrimaryPageLayout>
)
}
}, [JSON.stringify(relayUrls), feedType])
return (
<PrimaryPageLayout ref={layoutRef}>
<NoteList relayUrls={relayUrls} />
<PrimaryPageLayout
pageName="home"
ref={layoutRef}
titlebar={<NoteListPageTitlebar />}
displayScrollToTopButton
>
{!!urls.length && (feedType === 'relays' || (relayList && followings)) ? (
<NoteList
relayUrls={urls}
filter={
feedType === 'following'
? {
authors:
pubkey && !followings?.includes(pubkey)
? [...(followings ?? []), pubkey]
: (followings ?? [])
}
: {}
}
/>
) : (
<div className="text-center text-sm text-muted-foreground">{t('loading...')}</div>
)}
</PrimaryPageLayout>
)
}
function NoteListPageTitlebar() {
return (
<div className="flex gap-1 items-center h-full justify-between">
<FeedButton />
<SearchButton />
</div>
)
}