/* eslint-disable unicorn/no-keyword-prefix */ import { closestCorners, DndContext, DragOverlay } from '@dnd-kit/core'; import { restrictToParentElement, restrictToVerticalAxis, } from '@dnd-kit/modifiers'; import { arrayMove, SortableContext, useSortable, verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { LockIcon, ThreeBarsIcon } from '@primer/octicons-react'; import { type FetcherWithComponents, useFetcher } from 'react-router'; import { useEffect, useState } from 'react'; import { Button, Input } from 'react-aria-components'; import Spinner from '~/components/Spinner'; import TableList from '~/components/TableList'; import { cn } from '~/utils/cn'; type Properties = { readonly baseDomain?: string; readonly searchDomains: string[]; // eslint-disable-next-line react/boolean-prop-naming readonly disabled?: boolean; }; export default function Domains({ baseDomain, searchDomains, disabled, }: Properties) { // eslint-disable-next-line unicorn/no-null, @typescript-eslint/ban-types const [activeId, setActiveId] = useState(null); const [localDomains, setLocalDomains] = useState(searchDomains); const [newDomain, setNewDomain] = useState(''); const fetcher = useFetcher(); useEffect(() => { setLocalDomains(searchDomains); }, [searchDomains]); return (

Search Domains

Set custom DNS search domains for your Tailnet. When using Magic DNS, your tailnet domain is used as the first search domain.

{ setActiveId(event.active.id); }} onDragEnd={(event) => { // eslint-disable-next-line unicorn/no-null setActiveId(null); const { active, over } = event; if (!over) { return; } const activeItem = localDomains[(active.id as number) - 1]; const overItem = localDomains[(over.id as number) - 1]; if (!activeItem || !overItem) { return; } const oldIndex = localDomains.indexOf(activeItem); const newIndex = localDomains.indexOf(overItem); if (oldIndex !== newIndex) { setLocalDomains(arrayMove(localDomains, oldIndex, newIndex)); } }} > {baseDomain ? (

{baseDomain}

) : undefined} {localDomains.map((sd, index) => ( ))} {activeId ? ( ) : undefined} {disabled ? undefined : ( { setNewDomain(event.target.value); }} /> {fetcher.state === 'idle' ? ( ) : ( )} )}
); } type DomainProperties = { readonly domain: string; readonly id: number; readonly isDrag?: boolean; readonly localDomains: string[]; // eslint-disable-next-line react/boolean-prop-naming readonly disabled?: boolean; readonly fetcher: FetcherWithComponents; }; function Domain({ domain, id, localDomains, isDrag, disabled, fetcher, }: DomainProperties) { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id }); // TODO: Figure out why TableList.Item breaks dndkit return (

{disabled ? undefined : ( )} {domain}

{isDrag ? undefined : ( )}
); }