import { RepoForkedIcon } from '@primer/octicons-react'; import { useMemo, useState } from 'react'; import Chip from '~/components/Chip'; import Dialog from '~/components/Dialog'; import Input from '~/components/Input'; import Switch from '~/components/Switch'; import Tooltip from '~/components/Tooltip'; import cn from '~/utils/cn'; interface Props { nameservers: Record; } export default function AddNameserver({ nameservers }: Props) { const [split, setSplit] = useState(false); const [ns, setNs] = useState(''); const [domain, setDomain] = useState(''); const isInvalid = useMemo(() => { if (ns === '') return false; // Test if it's a valid IPv4 or IPv6 address const ipv4 = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/; const ipv6 = /^([0-9a-fA-F:]+:+)+[0-9a-fA-F]+$/; if (!ipv4.test(ns) && !ipv6.test(ns)) return true; if (split) { return nameservers[domain]?.includes(ns); } return Object.values(nameservers).some((nsList) => nsList.includes(ns)); }, [nameservers, ns]); return ( Add nameserver Add nameserver
Restrict to domain } className={cn('inline-flex items-center')} /> Only clients that support split DNS (Tailscale v1.8 or later for most platforms) will use this nameserver. Older clients will ignore it.
This nameserver will only be used for some domains.
{split ? ( <> Domain Only single-label or fully-qualified queries matching this suffix should use the nameserver. ) : ( )}
); }