import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { useFetchRelayInfos } from '@/hooks' import { isWebsocketUrl, normalizeUrl } from '@/lib/url' import { useRelaySets } from '@/providers/RelaySetsProvider' import { CircleX, SearchCheck } from 'lucide-react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' export default function RelayUrls({ relaySetId }: { relaySetId: string }) { const { t } = useTranslation() const { relaySets, updateRelaySet } = useRelaySets() const [newRelayUrl, setNewRelayUrl] = useState('') const [newRelayUrlError, setNewRelayUrlError] = useState(null) const relaySet = useMemo( () => relaySets.find((r) => r.id === relaySetId), [relaySets, relaySetId] ) if (!relaySet) return null const removeRelayUrl = (url: string) => { updateRelaySet({ ...relaySet, relayUrls: relaySet.relayUrls.filter((u) => u !== url) }) } const saveNewRelayUrl = () => { if (newRelayUrl === '') return const normalizedUrl = normalizeUrl(newRelayUrl) if (relaySet.relayUrls.includes(normalizedUrl)) { return setNewRelayUrlError(t('Relay already exists')) } if (!isWebsocketUrl(normalizedUrl)) { return setNewRelayUrlError(t('invalid relay URL')) } const newRelayUrls = [...relaySet.relayUrls, normalizedUrl] updateRelaySet({ ...relaySet, relayUrls: newRelayUrls }) setNewRelayUrl('') } 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 { t } = useTranslation() const { relayInfos: [relayInfo] } = useFetchRelayInfos([url]) return (
{url}
{relayInfo?.supported_nips?.includes(50) && (
)}
) }