// Copyright (c) Tailscale Inc & AUTHORS // SPDX-License-Identifier: BSD-3-Clause import cx from "classnames" import React, { useCallback, useMemo, useState } from "react" import { useAPI } from "src/api" import { ReactComponent as CheckCircle } from "src/assets/icons/check-circle.svg" import { ReactComponent as Clock } from "src/assets/icons/clock.svg" import { ReactComponent as Plus } from "src/assets/icons/plus.svg" import * as Control from "src/components/control-components" import { NodeData } from "src/types" import Button from "src/ui/button" import Card from "src/ui/card" import Dialog from "src/ui/dialog" import EmptyState from "src/ui/empty-state" import Input from "src/ui/input" export default function SubnetRouterView({ readonly, node, }: { readonly: boolean node: NodeData }) { const api = useAPI() const [advertisedRoutes, hasRoutes, hasUnapprovedRoutes] = useMemo(() => { const routes = node.AdvertisedRoutes || [] return [routes, routes.length > 0, routes.find((r) => !r.Approved)] }, [node.AdvertisedRoutes]) const [inputOpen, setInputOpen] = useState( advertisedRoutes.length === 0 && !readonly ) const [inputText, setInputText] = useState("") const [postError, setPostError] = useState() const resetInput = useCallback(() => { setInputText("") setPostError("") setInputOpen(false) }, []) return ( <>

Subnet router

Add devices to your tailnet without installing Tailscale.{" "} Learn more →

{!readonly && (inputOpen ? (

Advertise new routes

{ setPostError("") setInputText(e.target.value) }} />

{postError || "Add multiple routes by providing a comma-separated list."}

{hasRoutes && }
) : ( ))}
{hasRoutes ? ( <> {advertisedRoutes.map((r) => (
{r.Route}
{r.Approved ? ( ) : ( )} {r.Approved ? (
Approved
) : (
Pending approval
)}
{!readonly && ( api({ action: "update-routes", data: advertisedRoutes.filter( (it) => it.Route !== r.Route ), }) } /> )}
))}
{hasUnapprovedRoutes && ( To approve routes, in the admin console go to{" "} the machine’s route settings . )} ) : ( )}
) } function StopAdvertisingDialog({ onSubmit }: { onSubmit: () => void }) { return ( Stop advertising…} > Any active connections between devices over this route will be broken. ) }