From 49933ee4a20e76f391ad83e04e2b7502fc377d38 Mon Sep 17 00:00:00 2001 From: codytseng Date: Sat, 18 Jan 2025 14:42:37 +0800 Subject: [PATCH] feat: groups badge --- src/components/OthersRelayList/index.tsx | 2 +- src/components/RelayIcon/index.tsx | 11 +++++-- src/components/RelayInfo/index.tsx | 10 +++---- src/components/RelaySetsSetting/RelayUrl.tsx | 6 ++-- src/hooks/index.tsx | 2 ++ src/hooks/useFetchRelayInfo.tsx | 30 ++++++++++++++++++++ 6 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 src/hooks/useFetchRelayInfo.tsx diff --git a/src/components/OthersRelayList/index.tsx b/src/components/OthersRelayList/index.tsx index 5ff2589..92f5267 100644 --- a/src/components/OthersRelayList/index.tsx +++ b/src/components/OthersRelayList/index.tsx @@ -1,7 +1,7 @@ import { useSecondaryPage } from '@/PageManager' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' -import { useFetchRelayList } from '@/hooks/useFetchRelayList' +import { useFetchRelayList } from '@/hooks' import { toRelay } from '@/lib/link' import { userIdToPubkey } from '@/lib/pubkey' import { relayListToMailboxRelay } from '@/lib/relay' diff --git a/src/components/RelayIcon/index.tsx b/src/components/RelayIcon/index.tsx index 86e8cb6..d24931c 100644 --- a/src/components/RelayIcon/index.tsx +++ b/src/components/RelayIcon/index.tsx @@ -1,4 +1,5 @@ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' +import { useFetchRelayInfo } from '@/hooks' import { Server } from 'lucide-react' import { useMemo } from 'react' @@ -11,14 +12,18 @@ export default function RelayIcon({ className?: string iconSize?: number }) { - const icon = useMemo(() => { + const { relayInfo } = useFetchRelayInfo(url) + const iconUrl = useMemo(() => { + if (relayInfo?.icon) { + return relayInfo.icon + } const u = new URL(url) return `${u.protocol === 'wss:' ? 'https:' : 'http:'}//${u.host}/favicon.ico` - }, [url]) + }, [url, relayInfo]) return ( - + diff --git a/src/components/RelayInfo/index.tsx b/src/components/RelayInfo/index.tsx index 5daa247..5dbcde3 100644 --- a/src/components/RelayInfo/index.tsx +++ b/src/components/RelayInfo/index.tsx @@ -1,5 +1,5 @@ import { Badge } from '@/components/ui/badge' -import { useFetchRelayInfos } from '@/hooks' +import { useFetchRelayInfo } from '@/hooks' import { TRelayInfo } from '@/types' import { GitBranch, Mail, SquareCode } from 'lucide-react' import RelayIcon from '../RelayIcon' @@ -7,10 +7,7 @@ import UserAvatar from '../UserAvatar' import Username from '../Username' export default function RelayInfo({ url }: { url: string }) { - const { - relayInfos: [relayInfo], - isFetching - } = useFetchRelayInfos([url]) + const { relayInfo, isFetching } = useFetchRelayInfo(url) if (isFetching || !relayInfo) { return null } @@ -90,6 +87,9 @@ function RelayBadges({ relayInfo }: { relayInfo: TRelayInfo }) { {relayInfo.limitation?.payment_required && ( Payment )} + {relayInfo.supported_nips?.includes(29) && ( + Groups + )} ) } diff --git a/src/components/RelaySetsSetting/RelayUrl.tsx b/src/components/RelaySetsSetting/RelayUrl.tsx index 62b7697..3262edf 100644 --- a/src/components/RelaySetsSetting/RelayUrl.tsx +++ b/src/components/RelaySetsSetting/RelayUrl.tsx @@ -1,6 +1,6 @@ import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' -import { useFetchRelayInfos } from '@/hooks' +import { useFetchRelayInfo } from '@/hooks' import { isWebsocketUrl, normalizeUrl } from '@/lib/url' import { useRelaySets } from '@/providers/RelaySetsProvider' import { CircleX, SearchCheck } from 'lucide-react' @@ -77,9 +77,7 @@ export default function RelayUrls({ relaySetId }: { relaySetId: string }) { function RelayUrl({ url, onRemove }: { url: string; onRemove: () => void }) { const { t } = useTranslation() - const { - relayInfos: [relayInfo] - } = useFetchRelayInfos([url]) + const { relayInfo } = useFetchRelayInfo(url) return (
diff --git a/src/hooks/index.tsx b/src/hooks/index.tsx index 43d39a3..f7ec7bb 100644 --- a/src/hooks/index.tsx +++ b/src/hooks/index.tsx @@ -3,6 +3,8 @@ export * from './useFetchEvent' export * from './useFetchFollowings' export * from './useFetchNip05' export * from './useFetchProfile' +export * from './useFetchRelayInfo' export * from './useFetchRelayInfos' +export * from './useFetchRelayList' export * from './useSearchParams' export * from './useSearchProfiles' diff --git a/src/hooks/useFetchRelayInfo.tsx b/src/hooks/useFetchRelayInfo.tsx new file mode 100644 index 0000000..b515eca --- /dev/null +++ b/src/hooks/useFetchRelayInfo.tsx @@ -0,0 +1,30 @@ +import client from '@/services/client.service' +import { TRelayInfo } from '@/types' +import { useEffect, useState } from 'react' + +export function useFetchRelayInfo(url: string) { + const [isFetching, setIsFetching] = useState(true) + const [relayInfo, setRelayInfo] = useState(undefined) + + useEffect(() => { + const fetchRelayInfos = async () => { + setIsFetching(true) + const timer = setTimeout(() => { + setIsFetching(false) + }, 5000) + try { + const [relayInfo] = await client.fetchRelayInfos([url]) + setRelayInfo(relayInfo) + } catch (err) { + console.error(err) + } finally { + clearTimeout(timer) + setIsFetching(false) + } + } + + fetchRelayInfos() + }, [url]) + + return { relayInfo, isFetching } +}