UNPKG

@konstructio/ui

Version:

A set of reusable and customizable React components built for konstruct.io

64 lines (63 loc) 1.57 kB
import { useRef as u, useEffect as f, useCallback as p } from "react"; import { useDropdownContext as m } from "../contexts/dropdown.hook.js"; const E = ({ ulRef: i }) => { const l = u(null), o = u(null), { isOpen: c, toggleOpen: e } = m(); f(() => { var r; const n = new AbortController(), s = (t) => { t.key === "Escape" && e(!1); }, a = (t) => { var d; (d = l.current) != null && d.contains(t.target) || e(!1); }; return document.addEventListener("keydown", s, { signal: n.signal }), document.addEventListener("mousedown", a, { signal: n.signal }), document.addEventListener( "visibilitychange", () => { document.hidden && e(!1); }, { signal: n.signal } ), (r = o.current) == null || r.addEventListener( "focus", () => { e(!0); }, { signal: n.signal } ), () => { n.abort(); }; }, [e, l]), f(() => { var s; const n = new AbortController(); return (s = o.current) == null || s.addEventListener( "keydown", (a) => { var r; if (a.key === "ArrowDown") { const t = (r = i.current) == null ? void 0 : r.querySelector("li"); t && t.focus(); } }, { signal: n.signal } ), () => { n.abort(); }; }, [o, i]); const g = p(() => e(!0), [e]), w = p(() => { c || e(!1); }, [c, e]); return { wrapperRef: l, wrapperInputRef: o, handleOpen: g, handleOpenIfClosed: w }; }; export { E as useDropdown };