UNPKG

@coreui/react-pro

Version:

UI Components Library for React.js

61 lines (58 loc) 2.7 kB
import { __rest } from '../../node_modules/tslib/tslib.es6.js'; import PropTypes from 'prop-types'; import React, { forwardRef, useRef, useState, useEffect } from 'react'; import classNames from '../../_virtual/index.js'; import '@popperjs/core'; import { useForkedRef } from '../../hooks/useForkedRef.js'; import { CSpinner } from '../spinner/CSpinner.js'; const CElementCover = forwardRef((_a, ref) => { var { children, className, boundaries, opacity = 0.4 } = _a, rest = __rest(_a, ["children", "className", "boundaries", "opacity"]); const elementCoverRef = useRef(null); const forkedRef = useForkedRef(ref, elementCoverRef); const [customBoundaries, setCustomBoundaries] = useState({}); const getCustomBoundaries = () => { if (!elementCoverRef || !elementCoverRef.current || !boundaries) { return {}; } const parent = elementCoverRef.current.parentElement; if (!parent) { return {}; } const parentCoords = parent.getBoundingClientRect(); const customBoundaries = {}; boundaries.forEach(({ sides, query }) => { const element = parent.querySelector(query); if (!element || !sides) { return; } const coords = element.getBoundingClientRect(); sides.forEach((side) => { const sideMargin = Math.abs(coords[side] - parentCoords[side]); customBoundaries[side] = `${sideMargin}px`; }); }); return customBoundaries; }; useEffect(() => { setCustomBoundaries(getCustomBoundaries()); }, [JSON.stringify(getCustomBoundaries())]); const classes = classNames(className); const containerCoords = Object.assign({ top: 0, left: 0, right: 0, bottom: 0 }, customBoundaries); const coverStyles = Object.assign(Object.assign({}, containerCoords), { position: 'absolute', zIndex: 2, backgroundColor: `rgba(255,255,255,${opacity})` }); return (React.createElement("div", Object.assign({ className: classes, style: coverStyles }, rest, { ref: forkedRef }), React.createElement("div", { style: { position: 'absolute', top: '50%', left: '50%', transform: 'translateX(-50%) translateY(-50%)', } }, children || React.createElement(CSpinner, { variant: "grow", color: "primary" })))); }); CElementCover.propTypes = { boundaries: PropTypes.array, children: PropTypes.node, className: PropTypes.string, opacity: PropTypes.number, }; CElementCover.displayName = 'CElementCover'; export { CElementCover }; //# sourceMappingURL=CElementCover.js.map