import type { Dispatch, FC, MouseEventHandler, ReactNode, SetStateAction, } from 'react' import type { ButtonComponent } from '../button' import { useIsMounted } from '@crypto-dex-sdk/hooks' import { Transition, TransitionChild } from '@headlessui/react' import classNames from 'classnames' import { createContext, Fragment, useCallback, useContext, useEffect, useRef, useState, } from 'react' import ReactDOM from 'react-dom' interface DrawerContextProps { open: boolean setOpen: Dispatch> element: HTMLDivElement | null } const DrawerContext = createContext(undefined) interface ProviderProps { children: ReactNode } export const DrawerRoot: FC = ({ children }) => { const ref = useRef(null) const [open, setOpen] = useState(false) const [, setRender] = useState(false) // Force render useEffect(() => { if (ref.current) setRender(true) }, []) return {children} } export function useDrawer() { const context = useContext(DrawerContext) if (!context) throw new Error('Hook can only be used inside Drawer Context') return context } interface PanelProps { children: ReactNode className?: string } export const DrawerButton: ButtonComponent = (props) => { const { setOpen } = useDrawer() const onClick = useCallback>( (e) => { setOpen(prev => !prev) props.onClick && props.onClick(e) }, [props, setOpen], ) return
} export const Panel: FC = ({ children, className }) => { const { open, setOpen } = useDrawer() const isMounted = useIsMounted() if (!isMounted) return <> return ReactDOM.createPortal(
, document.body, ) } export const Drawer = { Root: DrawerRoot, Panel, Button: DrawerButton }