/* eslint-disable unicorn/no-keyword-prefix */ import { DndContext, DragOverlay, closestCorners } from '@dnd-kit/core'; import { restrictToParentElement, restrictToVerticalAxis, } from '@dnd-kit/modifiers'; import { SortableContext, arrayMove, useSortable, verticalListSortingStrategy, } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { GripVertical, Lock } from 'lucide-react'; import { useEffect, useState } from 'react'; import { type FetcherWithComponents, useFetcher } from 'react-router'; import Button from '~/components/Button'; import Input from '~/components/Input'; import Spinner from '~/components/Spinner'; import TableList from '~/components/TableList'; import cn from '~/utils/cn'; type Properties = { readonly baseDomain?: string; readonly searchDomains: string[]; readonly disabled?: boolean; // TODO: isDisabled }; export default function Domains({ baseDomain, searchDomains, disabled, }: Properties) { 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) => { 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 : ( {fetcher.state === 'idle' ? ( ) : ( )} )}
); } type DomainProperties = { readonly domain: string; readonly id: number; readonly isDrag?: boolean; readonly localDomains: string[]; readonly disabled?: boolean; // TODO: isDisabled readonly fetcher: FetcherWithComponents; }; function Domain({ domain, id, localDomains, isDrag, disabled, fetcher, }: DomainProperties) { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id }); return (

{disabled ? undefined : ( )} {domain}

{isDrag ? undefined : ( )}
); }