import type { ActionFunctionArgs, LoaderFunctionArgs } from 'react-router'; import { useLoaderData } from 'react-router'; import Code from '~/components/Code'; import Notice from '~/components/Notice'; import type { LoadContext } from '~/server'; import ManageDomains from './components/manage-domains'; import ManageNS from './components/manage-ns'; import ManageRecords from './components/manage-records'; import RenameTailnet from './components/rename-tailnet'; import ToggleMagic from './components/toggle-magic'; import { dnsAction } from './dns-actions'; // We do not want to expose every config value export async function loader({ context }: LoaderFunctionArgs) { if (!context.hs.readable()) { throw new Error('No configuration is available'); } const config = context.hs.c!; const dns = { prefixes: config.prefixes, magicDns: config.dns.magic_dns, baseDomain: config.dns.base_domain, nameservers: config.dns.nameservers.global, splitDns: config.dns.nameservers.split, searchDomains: config.dns.search_domains, extraRecords: config.dns.extra_records, }; return { ...dns, writable: context.hs.writable(), }; } export async function action(data: ActionFunctionArgs) { return dnsAction(data); } export default function Page() { const data = useLoaderData(); const allNs: Record = {}; for (const key of Object.keys(data.splitDns)) { allNs[key] = data.splitDns[key]; } allNs.global = data.nameservers; const isDisabled = data.writable === false; return (
{data.writable ? undefined : ( The Headscale configuration is read-only. You cannot make changes to the configuration )}

Magic DNS

Automatically register domain names for each device on the tailnet. Devices will be accessible at{' '} [device]. {data.baseDomain} {' '} when Magic DNS is enabled.

); }