import { Key, useEffect, useRef, useState } from "react"; import { useFetcher } from "react-router"; import type { User } from "~/types"; import Button from "~/components/Button"; import Code from "~/components/Code"; import Dialog from "~/components/Dialog"; import Link from "~/components/Link"; import NumberInput from "~/components/NumberInput"; import Select from "~/components/Select"; import Switch from "~/components/Switch"; import toast from "~/utils/toast"; interface AddAuthKeyProps { users: User[]; url: string; } export default function AddAuthKey({ users, url }: AddAuthKeyProps) { const fetcher = useFetcher(); const submittingRef = useRef(false); const [isOpen, setIsOpen] = useState(false); const [reusable, setReusable] = useState(false); const [ephemeral, setEphemeral] = useState(false); const [userId, setUserId] = useState(users[0]?.id); const createdKey = fetcher.data?.success ? fetcher.data.key : null; useEffect(() => { if (fetcher.state === "idle" && fetcher.data) { submittingRef.current = false; } }, [fetcher.data, fetcher.state]); useEffect(() => { if (!isOpen) { setReusable(false); setEphemeral(false); setUserId(users[0]?.id); fetcher.data = undefined; } }, [isOpen]); return ( { if (!open && submittingRef.current) return; setIsOpen(open); }} > {createdKey ? ( Pre-auth key created Copy this key now. You will not be able to see the full key again.
{createdKey}
To register a device with this key: {`tailscale up --login-server=${url} --authkey ${createdKey}`}
) : ( { event.preventDefault(); submittingRef.current = true; const form = new FormData(event.currentTarget as HTMLFormElement); form.set("action_id", "add_preauthkey"); form.set("user_id", userId?.toString() ?? ""); form.set("reusable", reusable ? "on" : "off"); form.set("ephemeral", ephemeral ? "on" : "off"); fetcher.submit(form, { method: "POST" }); }} isDisabled={fetcher.state !== "idle"} > Generate auth key
Reusable Use this key to authenticate more than one device.
{ setReusable(!reusable); }} />
Ephemeral Devices authenticated with this key will be automatically removed once they go offline.{" "} Learn more
{ setEphemeral(!ephemeral); }} />
)}
); }