headplane/app/routes/dns/components/manage-ns.tsx

153 lines
3.8 KiB
TypeScript
Raw Normal View History

import { Info } from 'lucide-react';
import { Form, useSubmit } from 'react-router';
2025-02-04 11:42:57 -05:00
import Button from '~/components/Button';
2024-12-31 10:30:14 +05:30
import Link from '~/components/Link';
import Switch from '~/components/Switch';
2024-12-31 10:30:14 +05:30
import TableList from '~/components/TableList';
import Tooltip from '~/components/Tooltip';
2025-01-28 17:46:16 -05:00
import cn from '~/utils/cn';
import AddNS from '../dialogs/add-ns';
2024-05-21 17:21:14 -04:00
interface Props {
2024-12-31 10:30:14 +05:30
nameservers: Record<string, string[]>;
overrideLocalDns: boolean;
2024-12-31 10:30:14 +05:30
isDisabled: boolean;
2024-05-21 17:21:14 -04:00
}
export default function ManageNS({
nameservers,
isDisabled,
overrideLocalDns,
}: Props) {
2024-05-21 17:21:14 -04:00
return (
<div className="flex flex-col w-2/3">
<h1 className="text-2xl font-medium mb-4">Nameservers</h1>
2025-02-04 17:21:03 -05:00
<p>
2024-12-31 10:30:14 +05:30
Set the nameservers used by devices on the Tailnet to resolve DNS
queries.{' '}
2024-05-21 17:21:14 -04:00
<Link
to="https://tailscale.com/kb/1054/dns"
name="Tailscale DNS Documentation"
>
Learn more
</Link>
</p>
<div className="mt-4">
2024-12-31 10:30:14 +05:30
{Object.keys(nameservers).map((key) => (
2024-05-21 17:21:14 -04:00
<NameserverList
key={key}
isGlobal={key === 'global'}
isDisabled={isDisabled}
nameservers={nameservers}
overrideLocalDns={overrideLocalDns}
2024-05-21 17:21:14 -04:00
name={key}
/>
))}
{isDisabled ? undefined : <AddNS nameservers={nameservers} />}
2024-05-21 17:21:14 -04:00
</div>
</div>
2024-12-31 10:30:14 +05:30
);
2024-05-21 17:21:14 -04:00
}
interface ListProps {
2024-12-31 10:30:14 +05:30
isGlobal: boolean;
isDisabled: boolean;
nameservers: Record<string, string[]>;
overrideLocalDns: boolean;
2024-12-31 10:30:14 +05:30
name: string;
2024-05-21 17:21:14 -04:00
}
2024-12-31 10:30:14 +05:30
function NameserverList({
isGlobal,
isDisabled,
nameservers,
overrideLocalDns,
2024-12-31 10:30:14 +05:30
name,
}: ListProps) {
2025-01-28 17:46:16 -05:00
const list = isGlobal ? nameservers.global : nameservers[name];
if (list.length === 0) {
2024-12-31 10:30:14 +05:30
return null;
}
2024-05-21 17:21:14 -04:00
const submit = useSubmit();
2024-05-21 17:21:14 -04:00
return (
<div className="mb-8">
<div className="flex items-center justify-between mb-2">
{isGlobal ? (
<div className="flex items-center justify-between w-full">
<h2 className="text-md font-medium opacity-80">
Global Nameservers
</h2>
<div className="flex items-center gap-2 text-sm">
<Tooltip>
<Info className="size-4" />
<Tooltip.Body>
When enabled, use the DNS servers listed below to resolve
names outside the tailnet. When disabled (default), devices
will prefer their local DNS configuration.
<Link
to="https://tailscale.com/kb/1054/dns#global-nameservers"
name="Tailscale Global Nameservers Documentation"
>
Learn More
</Link>
</Tooltip.Body>
</Tooltip>
<p>Override DNS servers</p>
<Switch
label="Override local DNS settings"
className="h-[15px] w-[23px] p-[2px]"
switchClassName="h-[9px] w-[9px]"
name="override_dns"
defaultSelected={overrideLocalDns}
onChange={(v) => {
submit(
{
action_id: 'override_dns',
override_dns: v ? 'true' : 'false',
},
{
method: 'POST',
},
);
}}
/>
</div>
</div>
) : (
<h2 className="text-md font-medium opacity-80">{name}</h2>
)}
2024-05-21 17:21:14 -04:00
</div>
<TableList>
2024-12-31 10:30:14 +05:30
{list.length > 0
? list.map((ns) => (
2025-01-28 17:46:16 -05:00
<TableList.Item key={ns}>
2024-12-31 10:30:14 +05:30
<p className="font-mono text-sm">{ns}</p>
<Form method="POST">
<input type="hidden" name="action_id" value="remove_ns" />
<input type="hidden" name="ns" value={ns} />
<input
type="hidden"
name="split_name"
value={isGlobal ? 'global' : name}
/>
<Button
isDisabled={isDisabled}
type="submit"
className={cn(
'px-2 py-1 rounded-md',
'text-red-500 dark:text-red-400',
)}
>
Remove
</Button>
</Form>
2024-12-31 10:30:14 +05:30
</TableList.Item>
))
: undefined}
2024-05-21 17:21:14 -04:00
</TableList>
</div>
2024-12-31 10:30:14 +05:30
);
2024-05-21 17:21:14 -04:00
}