/* 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 '@remix-run/react' import clsx from 'clsx' import { useEffect, useState } from 'react' import Button from '~/components/Button' import Input from '~/components/Input' import Spinner from '~/components/Spinner' import TableList from '~/components/TableList' 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 : ( )}
) }