import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { toRelay } from '@/lib/link' import { isWebsocketUrl, normalizeUrl } from '@/lib/url' import { useSecondaryPage } from '@/PageManager' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { CircleX } from 'lucide-react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' import logger from '@/lib/logger' export default function RelayUrls({ relaySetId }: { relaySetId: string }) { const { t } = useTranslation() const { relaySets, updateRelaySet } = useFavoriteRelays() const [newRelayUrl, setNewRelayUrl] = useState('') const [newRelayUrlError, setNewRelayUrlError] = useState(null) const [isLoading, setIsLoading] = useState(false) const relaySet = useMemo( () => relaySets.find((r) => r.id === relaySetId), [relaySets, relaySetId] ) if (!relaySet) return null const removeRelayUrl = async (url: string) => { try { await updateRelaySet({ ...relaySet, relayUrls: relaySet.relayUrls.filter((u) => u !== url) }) } catch (error) { logger.error('Failed to remove relay from set', { error, relaySetId, url }) } } const saveNewRelayUrl = async () => { if (newRelayUrl === '' || isLoading) return const normalizedUrl = normalizeUrl(newRelayUrl) if (!normalizedUrl) { return setNewRelayUrlError(t('Invalid relay URL')) } if (relaySet.relayUrls.includes(normalizedUrl)) { return setNewRelayUrlError(t('Relay already exists')) } if (!isWebsocketUrl(normalizedUrl)) { return setNewRelayUrlError(t('invalid relay URL')) } setIsLoading(true) setNewRelayUrlError(null) try { const newRelayUrls = [...relaySet.relayUrls, normalizedUrl] await updateRelaySet({ ...relaySet, relayUrls: newRelayUrls }) setNewRelayUrl('') } catch (error) { logger.error('Failed to update relay set', { error, relaySetId, url: normalizedUrl }) setNewRelayUrlError(t('Failed to add relay. Please try again.')) } finally { setIsLoading(false) } } const handleRelayUrlInputChange = (e: React.ChangeEvent) => { setNewRelayUrl(e.target.value) setNewRelayUrlError(null) } const handleRelayUrlInputKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Enter') { event.preventDefault() saveNewRelayUrl() } } return ( <>
{relaySet.relayUrls.map((url, index) => ( removeRelayUrl(url)} /> ))}
{newRelayUrlError &&
{newRelayUrlError}
} ) } function RelayUrl({ url, onRemove }: { url: string; onRemove: () => void }) { const { push } = useSecondaryPage() return (
push(toRelay(url))} >
{url}
) }