diff --git a/app/routes/_data.dns._index/rename.tsx b/app/routes/_data.dns._index/rename.tsx new file mode 100644 index 0000000..0eb49e3 --- /dev/null +++ b/app/routes/_data.dns._index/rename.tsx @@ -0,0 +1,53 @@ +import { Dialog } from '@headlessui/react' +import { useState } from 'react' + +export default function Modal() { + const [isOpen, setIsOpen] = useState(false) + + return ( + <> + + { + setIsOpen(false) + }} + > + + + ) +} diff --git a/app/routes/_data.dns._index/route.tsx b/app/routes/_data.dns._index/route.tsx new file mode 100644 index 0000000..e0e0fff --- /dev/null +++ b/app/routes/_data.dns._index/route.tsx @@ -0,0 +1,113 @@ +import { Switch } from '@headlessui/react' +import { useLoaderData } from '@remix-run/react' +import clsx from 'clsx' +import { useState } from 'react' + +import { getConfig } from '~/utils/config' + +import RenameModal from './rename' + +// We do not want to expose every config value +export async function loader() { + const config = await getConfig() + const dns = { + prefixes: config.prefixes, + magicDns: config.dns_config.magic_dns, + baseDomain: config.dns_config.base_domain, + overrideLocal: config.dns_config.override_local_dns, + nameservers: config.dns_config.nameservers, + splitDns: config.dns_config.restricted_nameservers, + searchDomains: config.dns_config.domains, + extraRecords: config.dns_config.extra_records + } + + return dns +} + +export default function Page() { + const data = useLoaderData() + const [localOverride, setLocalOverride] = useState(data.overrideLocal) + + return ( +
+
+

Tailnet Name

+

+ This is the base domain name of your Tailnet. + Devices are accessible at + {' '} + + [device].[user].{data.baseDomain} + + {' '} + when Magic DNS is enabled. +

+ { + event.target.select() + }} + /> + +
+
+

Nameservers

+

+ Set the nameservers used by devices on the Tailnet + to resolve DNS queries. +

+
+
+

+ Global Nameservers +

+
+ Override local DNS + { + setLocalOverride(!localOverride) + }} + > + Override local DNS + + +
+
+
+ {data.nameservers.map((ns, index) => ( +
+

{ns}

+ +
+ ))} +
+
+
+
+ ) +} diff --git a/package.json b/package.json index 86a0aa1..89d6b15 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "typecheck": "tsc" }, "dependencies": { + "@headlessui/react": "^1.7.18", "@heroicons/react": "^2.1.3", "@remix-run/node": "^2.8.1", "@remix-run/react": "^2.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40e6e4d..2ba451e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@headlessui/react': + specifier: ^1.7.18 + version: 1.7.18(react-dom@18.2.0)(react@18.2.0) '@heroicons/react': specifier: ^2.1.3 version: 2.1.3(react@18.2.0) @@ -874,6 +877,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@headlessui/react@1.7.18(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + dependencies: + '@tanstack/react-virtual': 3.2.0(react-dom@18.2.0)(react@18.2.0) + client-only: 0.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@heroicons/react@2.1.3(react@18.2.0): resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==} peerDependencies: @@ -1369,6 +1385,21 @@ packages: dev: true optional: true + /@tanstack/react-virtual@3.2.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/virtual-core': 3.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@tanstack/virtual-core@3.2.0: + resolution: {integrity: sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ==} + dev: false + /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: @@ -2117,6 +2148,10 @@ packages: engines: {node: '>=6'} dev: true + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'}