feat: improve style of save relay button

This commit is contained in:
codytseng
2025-01-18 17:55:50 +08:00
parent a85f636d24
commit 35b0350728
5 changed files with 22 additions and 35 deletions

View File

@@ -1,12 +1,10 @@
import { useSecondaryPage } from '@/PageManager' import { useSecondaryPage } from '@/PageManager'
import { Badge } from '@/components/ui/badge' import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { useFetchRelayInfo, useFetchRelayList } from '@/hooks' import { useFetchRelayInfo, useFetchRelayList } from '@/hooks'
import { toRelay } from '@/lib/link' import { toRelay } from '@/lib/link'
import { userIdToPubkey } from '@/lib/pubkey' import { userIdToPubkey } from '@/lib/pubkey'
import { simplifyUrl } from '@/lib/url' import { simplifyUrl } from '@/lib/url'
import { TMailboxRelay } from '@/types' import { TMailboxRelay } from '@/types'
import { ListPlus } from 'lucide-react'
import { useMemo } from 'react' import { useMemo } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import RelayIcon from '../RelayIcon' import RelayIcon from '../RelayIcon'
@@ -57,11 +55,7 @@ function RelayItem({ relay }: { relay: TMailboxRelay }) {
</div> </div>
</div> </div>
<div className="flex items-center gap-1 shrink-0" onClick={(e) => e.stopPropagation()}> <div className="flex items-center gap-1 shrink-0" onClick={(e) => e.stopPropagation()}>
<SaveRelayDropdownMenu urls={[url]}> <SaveRelayDropdownMenu urls={[url]} />
<Button variant="ghost" size="icon">
<ListPlus />
</Button>
</SaveRelayDropdownMenu>
</div> </div>
</div> </div>
) )

View File

@@ -1,8 +1,7 @@
import { Button } from '@/components/ui/button'
import { useFetchRelayInfos } from '@/hooks' import { useFetchRelayInfos } from '@/hooks'
import { useFeed } from '@/providers/FeedProvider' import { useFeed } from '@/providers/FeedProvider'
import client from '@/services/client.service' import client from '@/services/client.service'
import { ListPlus, SearchCheck } from 'lucide-react' import { SearchCheck } from 'lucide-react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import SaveRelayDropdownMenu from '../SaveRelayDropdownMenu' import SaveRelayDropdownMenu from '../SaveRelayDropdownMenu'
@@ -64,11 +63,7 @@ export default function TemporaryRelaySet() {
</div> </div>
))} ))}
</div> </div>
<SaveRelayDropdownMenu urls={temporaryRelayUrls} asChild> <SaveRelayDropdownMenu urls={temporaryRelayUrls} />
<Button title="save" size="icon" variant="ghost">
<ListPlus />
</Button>
</SaveRelayDropdownMenu>
</div> </div>
) )
} }

View File

@@ -1,3 +1,4 @@
import { Button } from '@/components/ui/button'
import { import {
DropdownMenu, DropdownMenu,
DropdownMenuContent, DropdownMenuContent,
@@ -9,25 +10,32 @@ import {
import { normalizeUrl } from '@/lib/url' import { normalizeUrl } from '@/lib/url'
import { useRelaySets } from '@/providers/RelaySetsProvider' import { useRelaySets } from '@/providers/RelaySetsProvider'
import { TRelaySet } from '@/types' import { TRelaySet } from '@/types'
import { Check, FolderPlus, Plus } from 'lucide-react' import { Check, FolderPlus, Plus, Star } from 'lucide-react'
import { ReactNode, useMemo } from 'react' import { useMemo } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
export default function SaveRelayDropdownMenu({ export default function SaveRelayDropdownMenu({
children,
urls, urls,
asChild = false atTitlebar = false
}: { }: {
children: ReactNode
urls: string[] urls: string[]
asChild?: boolean atTitlebar?: boolean
}) { }) {
const { t } = useTranslation() const { t } = useTranslation()
const { relaySets } = useRelaySets() const { relaySets } = useRelaySets()
const normalizedUrls = useMemo(() => urls.map((url) => normalizeUrl(url)), [urls]) const normalizedUrls = useMemo(() => urls.map((url) => normalizeUrl(url)), [urls])
const alreadySaved = useMemo(
() => relaySets.some((set) => normalizedUrls.every((url) => set.relayUrls.includes(url))),
[relaySets, normalizedUrls]
)
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild={asChild}>{children}</DropdownMenuTrigger> <DropdownMenuTrigger asChild>
<Button variant="ghost" size={atTitlebar ? 'titlebar-icon' : 'icon'}>
<Star className={alreadySaved ? 'fill-primary stroke-primary' : ''} />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent> <DropdownMenuContent>
<DropdownMenuLabel>{t('Save to')} ...</DropdownMenuLabel> <DropdownMenuLabel>{t('Save to')} ...</DropdownMenuLabel>
<DropdownMenuSeparator /> <DropdownMenuSeparator />

View File

@@ -1,13 +1,11 @@
import NoteList from '@/components/NoteList' import NoteList from '@/components/NoteList'
import SaveRelayDropdownMenu from '@/components/SaveRelayDropdownMenu'
import PrimaryPageLayout from '@/layouts/PrimaryPageLayout' import PrimaryPageLayout from '@/layouts/PrimaryPageLayout'
import { useFeed } from '@/providers/FeedProvider' import { useFeed } from '@/providers/FeedProvider'
import { useEffect, useRef } from 'react' import { useEffect, useRef } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import FeedButton from './FeedButton' import FeedButton from './FeedButton'
import SearchButton from './SearchButton' import SearchButton from './SearchButton'
import SaveRelayDropdownMenu from '@/components/SaveRelayDropdownMenu'
import { Button } from '@/components/ui/button'
import { ListPlus } from 'lucide-react'
export default function NoteListPage() { export default function NoteListPage() {
const { t } = useTranslation() const { t } = useTranslation()
@@ -45,11 +43,7 @@ function NoteListPageTitlebar({ temporaryRelayUrls = [] }: { temporaryRelayUrls?
<div> <div>
<SearchButton /> <SearchButton />
{temporaryRelayUrls.length > 0 && ( {temporaryRelayUrls.length > 0 && (
<SaveRelayDropdownMenu urls={temporaryRelayUrls} asChild> <SaveRelayDropdownMenu urls={temporaryRelayUrls} atTitlebar />
<Button variant="ghost" size="titlebar-icon">
<ListPlus />
</Button>
</SaveRelayDropdownMenu>
)} )}
</div> </div>
</div> </div>

View File

@@ -4,7 +4,7 @@ import SaveRelayDropdownMenu from '@/components/SaveRelayDropdownMenu'
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import SecondaryPageLayout from '@/layouts/SecondaryPageLayout' import SecondaryPageLayout from '@/layouts/SecondaryPageLayout'
import { normalizeUrl, simplifyUrl } from '@/lib/url' import { normalizeUrl, simplifyUrl } from '@/lib/url'
import { Check, Copy, ListPlus } from 'lucide-react' import { Check, Copy } from 'lucide-react'
import { useMemo, useState } from 'react' import { useMemo, useState } from 'react'
import NotFoundPage from '../NotFoundPage' import NotFoundPage from '../NotFoundPage'
@@ -42,11 +42,7 @@ function RelayPageControls({ url }: { url: string }) {
<Button variant="ghost" size="titlebar-icon" onClick={handleCopy}> <Button variant="ghost" size="titlebar-icon" onClick={handleCopy}>
{copied ? <Check /> : <Copy />} {copied ? <Check /> : <Copy />}
</Button> </Button>
<SaveRelayDropdownMenu urls={[url]} asChild> <SaveRelayDropdownMenu urls={[url]} atTitlebar />
<Button variant="ghost" size="titlebar-icon">
<ListPlus />
</Button>
</SaveRelayDropdownMenu>
</> </>
) )
} }