diff --git a/app/components/Spinner.tsx b/app/components/Spinner.tsx new file mode 100644 index 0000000..c808ca6 --- /dev/null +++ b/app/components/Spinner.tsx @@ -0,0 +1,23 @@ +import clsx from 'clsx' + +type Properties = { + // eslint-disable-next-line unicorn/no-keyword-prefix + className?: string; +} + +export default function Spinner(properties: Properties) { + return ( +
+
+ Loading... +
+
+ ) +} diff --git a/app/routes/_data.dns._index/domains.tsx b/app/routes/_data.dns._index/domains.tsx index f13d3f4..c96d438 100644 --- a/app/routes/_data.dns._index/domains.tsx +++ b/app/routes/_data.dns._index/domains.tsx @@ -16,12 +16,13 @@ import { } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' import { Bars3Icon, LockClosedIcon } from '@heroicons/react/24/outline' -import { useFetcher } from '@remix-run/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 = { @@ -97,6 +98,7 @@ export default function Domains({ baseDomain, searchDomains, disabled }: Propert id={index + 1} localDomains={localDomains} disabled={disabled} + fetcher={fetcher} /> ))} @@ -106,6 +108,7 @@ export default function Domains({ baseDomain, searchDomains, disabled }: Propert localDomains={localDomains} id={activeId as number - 1} disabled={disabled} + fetcher={fetcher} /> : undefined} @@ -121,23 +124,27 @@ export default function Domains({ baseDomain, searchDomains, disabled }: Propert setNewDomain(event.target.value) }} /> - + setNewDomain('') + }} + > + Add + + ) : ( + + )} )} @@ -153,11 +160,10 @@ type DomainProperties = { readonly localDomains: string[]; // eslint-disable-next-line react/boolean-prop-naming readonly disabled?: boolean; + readonly fetcher: FetcherWithComponents; } -function Domain({ domain, id, localDomains, isDrag, disabled }: DomainProperties) { - const fetcher = useFetcher() - +function Domain({ domain, id, localDomains, isDrag, disabled, fetcher }: DomainProperties) { const { attributes, listeners, @@ -167,14 +173,15 @@ function Domain({ domain, id, localDomains, isDrag, disabled }: DomainProperties isDragging } = useSortable({ id }) + // TODO: Figure out why TableList.Item breaks dndkit return (
{ fetcher.submit({ - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention 'dns_config.domains': localDomains.filter((_, index) => index !== id - 1) }, { method: 'PATCH', diff --git a/app/routes/_data.dns._index/magic.tsx b/app/routes/_data.dns._index/magic.tsx index 6d55b21..1f9f6f6 100644 --- a/app/routes/_data.dns._index/magic.tsx +++ b/app/routes/_data.dns._index/magic.tsx @@ -4,6 +4,7 @@ import clsx from 'clsx' import { useState } from 'react' import Button from '~/components/Button' +import Spinner from '~/components/Spinner' type Properties = { readonly isEnabled: boolean; @@ -25,6 +26,9 @@ export default function Modal({ isEnabled, disabled }: Properties) { setIsOpen(true) }} > + {fetcher.state === 'idle' ? undefined : ( + + )} {isEnabled ? 'Disable' : 'Enable'} Magic DNS + {fetcher.state === 'idle' ? undefined : ( + + )} Rename Tailnet... Rename diff --git a/app/routes/_data.dns._index/route.tsx b/app/routes/_data.dns._index/route.tsx index 6361c01..177a694 100644 --- a/app/routes/_data.dns._index/route.tsx +++ b/app/routes/_data.dns._index/route.tsx @@ -8,6 +8,7 @@ import Button from '~/components/Button' import Code from '~/components/Code' import Input from '~/components/Input' import Notice from '~/components/Notice' +import Spinner from '~/components/Spinner' import TableList from '~/components/TableList' import { getConfig, getContext, patchConfig } from '~/utils/config' import { restartHeadscale } from '~/utils/docker' @@ -80,12 +81,14 @@ export default function Page() { Global Nameservers
- Override local DNS + + Override local DNS + { @@ -145,23 +148,27 @@ export default function Page() { setNs(event.target.value) }} /> - + setNs('') + }} + > + Add + + ) : ( + + )} ) : undefined}