import { Button } from '@/components/ui/button' import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue } from '@/components/ui/select' import { getFavoritesFeedRelayUrls } from '@/lib/favorites-feed-relays' import { toRelaySettings } from '@/lib/link' import { normalizeUrl, simplifyUrl } from '@/lib/url' import { cn } from '@/lib/utils' import { useSecondaryPage } from '@/PageManager' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useFeed } from '@/providers/FeedProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { SquarePen } from 'lucide-react' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' const ALL_FAVORITES_VALUE = '__all_favorites__' function relaySetToSelectValue(id: string) { return `rs:${encodeURIComponent(id)}` } function selectValueToRelaySetId(v: string) { if (!v.startsWith('rs:')) return null return decodeURIComponent(v.slice(3)) } /** Top-of-feed control: all favorites, relay sets, then single relays. */ export default function FavoriteRelaysFeedPicker() { const { t } = useTranslation() const { isSmallScreen } = useScreenSize() const { push } = useSecondaryPage() const { favoriteRelays, blockedRelays, relaySets } = useFavoriteRelays() const { feedInfo, switchFeed } = useFeed() const openFavoriteRelaySettings = () => { push(toRelaySettings('favorite-relays')) } const settingsLabel = t('Relay settings') const urls = useMemo( () => getFavoritesFeedRelayUrls(favoriteRelays, blockedRelays), [favoriteRelays, blockedRelays] ) const currentRelayKey = feedInfo.feedType === 'relay' && feedInfo.id ? normalizeUrl(feedInfo.id) || feedInfo.id : null const allActive = feedInfo.feedType === 'all-favorites' const relaySetIdActive = feedInfo.feedType === 'relays' && feedInfo.id ? feedInfo.id : null const orphanRelaySetId = relaySetIdActive && !relaySets.some((s) => s.id === relaySetIdActive) ? relaySetIdActive : null const selectValue = allActive ? ALL_FAVORITES_VALUE : relaySetIdActive ? relaySetToSelectValue(relaySetIdActive) : currentRelayKey ? currentRelayKey : ALL_FAVORITES_VALUE /** Values that exist in the mobile Select (for controlled `value` validation). */ const selectItems = useMemo(() => { const items: { value: string }[] = [{ value: ALL_FAVORITES_VALUE }] for (const set of relaySets) { items.push({ value: relaySetToSelectValue(set.id) }) } if (orphanRelaySetId) { items.push({ value: relaySetToSelectValue(orphanRelaySetId) }) } for (const url of urls) { items.push({ value: normalizeUrl(url) || url }) } if ( !allActive && feedInfo.feedType === 'relay' && feedInfo.id && !items.some((i) => i.value === currentRelayKey) ) { items.push({ value: normalizeUrl(feedInfo.id) || feedInfo.id }) } return items }, [ urls, allActive, feedInfo.feedType, feedInfo.id, currentRelayKey, relaySets, orphanRelaySetId ]) const resolvedSelectValue = selectItems.some((i) => i.value === selectValue) ? selectValue : ALL_FAVORITES_VALUE const resolveRelayUrl = (value: string) => { if (value === ALL_FAVORITES_VALUE) return null const fromList = urls.find((u) => (normalizeUrl(u) || u) === value) return fromList ?? value } const onPickValue = (v: string) => { if (v === ALL_FAVORITES_VALUE) { void switchFeed('all-favorites') return } const setId = selectValueToRelaySetId(v) if (setId) { void switchFeed('relays', { activeRelaySetId: setId }) return } const relay = resolveRelayUrl(v) if (relay) void switchFeed('relay', { relay }) } if (urls.length === 0 && relaySets.length === 0) return null const editSettingsButton = ( ) if (isSmallScreen) { return (