import { XIcon } from "@heroicons/react/outline" import clsx from "clsx" import type { ReactNode } from "react" import { useEffect, useRef, useState } from "react" import { FocusOn } from "react-focus-on" import { Portal } from "~/modules/dom/portal" export function Modal({ children, visible, onClose, }: { children: ReactNode visible: boolean onClose: () => void }) { const closeButtonRef = useRef(null) useEffect(() => { if (visible) { // trying to immediately focus doesn't work for whatever reason // neither did requestAnimationFrame setTimeout(() => { closeButtonRef.current?.focus() }, 50) } }, [visible]) return (
{children}
) } export function ControlledModal({ children, button, }: { children: ReactNode button: (buttonProps: { onClick: () => void }) => void }) { const [visible, setVisible] = useState(false) return ( <> {button({ onClick: () => setVisible(true) })} setVisible(false)}> {children} ) }