UNPKG

reblend-ui

Version:

Utilities for creating robust overlay components

42 lines (41 loc) 1.7 kB
"use strict"; exports.__esModule = true; exports.default = useWaitForDOMRef; exports.resolveContainerRef = void 0; var _ownerDocument = require("dom-helpers/ownerDocument"); var _canUseDOM = require("dom-helpers/canUseDOM"); var _reblendjs = require("reblendjs"); var _useWindow = require("./useWindow"); const resolveContainerRef = (ref, document) => { if (!_canUseDOM.default) return null; if (ref == null) return (document || (0, _ownerDocument.default)()).body; if (typeof ref === 'function') ref = ref(); if (ref && 'current' in ref) ref = ref.current; if (ref && ('nodeType' in ref || 'getBoundingClientRect' in ref)) return ref; return null; }; exports.resolveContainerRef = resolveContainerRef; function useWaitForDOMRef(ref, onResolved) { const window = _useWindow.default.bind(this)(); this.state.window = window; const [resolvedRef, setRef] = _reblendjs.useState.bind(this)(() => resolveContainerRef(ref, this.state.window?.document), "resolvedRef"); this.state.resolvedRef = resolvedRef; this.state.setRef = setRef; if (!this.state.resolvedRef) { const earlyRef = resolveContainerRef(ref); if (earlyRef) this.state.setRef(earlyRef); } _reblendjs.useEffect.bind(this)(() => { if (onResolved && this.state.resolvedRef) { onResolved(this.state.resolvedRef); } }, (() => [onResolved, this.state.resolvedRef]).bind(this)); _reblendjs.useEffect.bind(this)(() => { const nextRef = resolveContainerRef(ref); if (nextRef !== this.state.resolvedRef) { this.state.setRef(nextRef); } }, (() => [ref, this.state.resolvedRef]).bind(this)); return this.state.resolvedRef; } /* @Reblend: Transformed from function to class */