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() { )} > )} > - + + + + + + + + + +