diff --git a/app/components/Dropdown.tsx b/app/components/Dropdown.tsx
index 9099c92..8f217b2 100644
--- a/app/components/Dropdown.tsx
+++ b/app/components/Dropdown.tsx
@@ -7,6 +7,7 @@ type Properties = {
readonly button: ReactNode;
// eslint-disable-next-line unicorn/no-keyword-prefix
readonly className?: string;
+ readonly width?: string;
}
function Dropdown(properties: Properties) {
@@ -26,12 +27,13 @@ function Dropdown(properties: Properties) {
leaveTo='transform opacity-0 scale-95'
>
{properties.children}
@@ -66,7 +68,7 @@ function Item(properties: ItemProperties) {
void | Promise;
+ onOpen?: () => void | Promise;
+ onClose?: () => void | Promise;
}
+type Overrides = Omit
+
type Properties = {
readonly isOpen: boolean;
readonly setIsOpen: (value: SetStateAction) => void;
- readonly parameters: HookParameters;
+ readonly parameters?: HookParameters;
}
-export default function useModal(properties: HookParameters) {
+export default function useModal(properties?: HookParameters) {
const [isOpen, setIsOpen] = useState(false)
+ const [liveProperties, setLiveProperties] = useState(properties)
+
return {
Modal: (
),
- open: () => {
+ open: (overrides?: Overrides) => {
+ if (!overrides && !properties) {
+ throw new Error('No properties provided')
+ }
+
setIsOpen(true)
+ if (properties?.onOpen) {
+ void properties.onOpen()
+ }
+
+ if (overrides) {
+ setLiveProperties(overrides)
+ }
},
close: () => {
setIsOpen(false)
+ if (properties?.onClose) {
+ void properties.onClose()
+ }
}
}
}
function Modal({ parameters, isOpen, setIsOpen }: Properties) {
+ if (!parameters) {
+ return
+ }
+
return (
()
- const [activeId, setActiveId] = useState(undefined)
const fetcher = useFetcher()
- const { Modal, open } = useModal({
- title: 'Remove Machine',
- description: [
- 'This action is irreversible and will disconnect the machine from the Headscale server.',
- 'All data associated with this machine including ACLs and tags will be lost.'
- ].join('\n'),
- variant: 'danger',
- buttonText: 'Remove',
- onConfirm: () => {
- fetcher.submit(
- {
- id: activeId!
- },
- {
- method: 'DELETE',
- encType: 'application/json'
- }
- )
- }
- })
+ const { Modal, open } = useModal()
return (
<>
@@ -143,17 +123,71 @@ export default function Page() {
)}
>
)}
>
-
+
+
+
+
+
+
+
+
+
+