diff --git a/src/interfaces/Account.ts b/src/interfaces/Account.ts index 330ef2b..a484d17 100644 --- a/src/interfaces/Account.ts +++ b/src/interfaces/Account.ts @@ -14,5 +14,6 @@ export interface Account { jwt_allow_groups: string[]; regular_users_view_blocked: boolean; routing_peer_dns_resolution_enabled: boolean; + dns_domain: string; }; } diff --git a/src/modules/settings/NetworkSettingsTab.tsx b/src/modules/settings/NetworkSettingsTab.tsx index fe45cdf..25d4c1d 100644 --- a/src/modules/settings/NetworkSettingsTab.tsx +++ b/src/modules/settings/NetworkSettingsTab.tsx @@ -1,10 +1,18 @@ import Breadcrumbs from "@components/Breadcrumbs"; +import Button from "@components/Button"; import FancyToggleSwitch from "@components/FancyToggleSwitch"; +import HelpText from "@components/HelpText"; +import InlineLink from "@components/InlineLink"; +import { Input } from "@components/Input"; +import { Label } from "@components/Label"; import { notify } from "@components/Notification"; +import { useHasChanges } from "@hooks/useHasChanges"; import * as Tabs from "@radix-ui/react-tabs"; import { useApiCall } from "@utils/api"; -import { GlobeIcon, NetworkIcon } from "lucide-react"; -import React, { useState } from "react"; +import { validator } from "@utils/helpers"; +import { isNetBirdHosted } from "@utils/netbird"; +import { ExternalLinkIcon, GlobeIcon, NetworkIcon } from "lucide-react"; +import React, { useMemo, useState } from "react"; import { useSWRConfig } from "swr"; import SettingsIcon from "@/assets/icons/SettingsIcon"; import { Account } from "@/interfaces/Account"; @@ -13,18 +21,23 @@ type Props = { account: Account; }; -export default function NetworkSettingsTab({ account }: Props) { +export default function NetworkSettingsTab({ account }: Readonly) { const { mutate } = useSWRConfig(); - const saveRequest = useApiCall("/accounts/" + account.id); + const saveRequest = useApiCall("/accounts/" + account.id, true); const [routingPeerDNSSetting, setRoutingPeerDNSSetting] = useState( account.settings.routing_peer_dns_resolution_enabled, ); + const [customDNSDomain, setCustomDNSDomain] = useState( + account.settings.dns_domain || "", + ); - const toggleSetting = async (toggle: boolean) => { + const toggleNetworkDNSSetting = async (toggle: boolean) => { notify({ - title: "Save Network Settings", - description: "Network settings successfully saved.", + title: "DNS Wildcard Routing", + description: `DNS Wildcard Routing successfully ${ + toggle ? "enabled" : "disabled" + }.`, promise: saveRequest .put({ id: account.id, @@ -37,10 +50,43 @@ export default function NetworkSettingsTab({ account }: Props) { setRoutingPeerDNSSetting(toggle); mutate("/accounts"); }), - loadingMessage: "Saving the network settings...", + loadingMessage: "Updating DNS wildcard setting...", }); }; + const { hasChanges, updateRef } = useHasChanges([customDNSDomain]); + + const saveChanges = async () => { + notify({ + title: "Custom DNS Domain", + description: `Custom DNS Domain successfully updated.`, + promise: saveRequest + .put({ + id: account.id, + settings: { + ...account.settings, + dns_domain: customDNSDomain || "", + }, + }) + .then(() => { + mutate("/accounts"); + updateRef([customDNSDomain]); + }), + loadingMessage: "Updating Custom DNS domain...", + }); + }; + + const domainError = useMemo(() => { + if (customDNSDomain == "") return ""; + const valid = validator.isValidDomain(customDNSDomain, { + allowWildcard: false, + allowOnlyTld: false, + }); + if (!valid) { + return "Please enter a valid domain, e.g. example.com or intra.example.com"; + } + }, [customDNSDomain]); + return (
@@ -51,36 +97,80 @@ export default function NetworkSettingsTab({ account }: Props) { icon={} /> } active />
-

Networks

+
+

Networks

+
+
- - - Enable DNS Wildcard Routing - +
- Allow routing using DNS wildcards. This requires NetBird - client v0.35 or higher. Changes will only take effect after - restarting the clients. - - } - /> + > +
+ + + Specify a custom DNS domain for your network. This will be + used for all your peers. + +
+
+ setCustomDNSDomain(e.target.value)} + /> +
+
+ + + + Enable DNS Wildcard Routing + + } + helpText={ + <> + Allow routing using DNS wildcards. This requires NetBird client + v0.35 or higher. Changes will only take effect after restarting + the clients.{" "} + + Learn more + + + + } + />