import RelaySimpleInfo, { RelaySimpleInfoSkeleton } from '@/components/RelaySimpleInfo' import { Button } from '@/components/ui/button' import { DEFAULT_FAVORITE_RELAYS } from '@/constants' import { useFetchRelayInfo } from '@/hooks' import { toRelay } from '@/lib/link' import { normalizeUrl, simplifyUrl } from '@/lib/url' import { usePrimaryPage, useSmartRelayNavigation } from '@/PageManager' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { cn } from '@/lib/utils' import { Newspaper } from 'lucide-react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' function FavoriteRelayCard({ url }: { url: string }) { const { navigateToRelay } = useSmartRelayNavigation() const { relayInfo, isFetching } = useFetchRelayInfo(url) if (isFetching) { return ( ) } if (!relayInfo) { return ( ) } return ( { e.stopPropagation() navigateToRelay(toRelay(relayInfo.url)) }} /> ) } /** * Horizontal strip of favorite relays (non-blocked), or {@link DEFAULT_FAVORITE_RELAYS} when none. */ export default function ExploreFavoriteRelays() { const { t } = useTranslation() const { navigate } = usePrimaryPage() const { favoriteRelays, blockedRelays } = useFavoriteRelays() const blockedSet = useMemo( () => new Set(blockedRelays.map((b) => normalizeUrl(b) || b)), [blockedRelays] ) const { urls, usingDefaults } = useMemo(() => { const visible = favoriteRelays.filter((r) => { const k = normalizeUrl(r) || r return k && !blockedSet.has(k) }) if (visible.length > 0) { return { urls: visible, usingDefaults: false } } const defaultsFiltered = DEFAULT_FAVORITE_RELAYS.filter((r) => { const k = normalizeUrl(r) || r return k && !blockedSet.has(k) }) return { urls: defaultsFiltered.length > 0 ? defaultsFiltered : DEFAULT_FAVORITE_RELAYS, usingDefaults: true } }, [favoriteRelays, blockedSet]) if (urls.length === 0) return null return (

{t('Favorite Relays')}

{usingDefaults ? ( {t('Using app default relays')} ) : null}
{urls.map((url) => (
))}
) }