@exabytellc/utils
Version:
EB react utils to make everything a little easier!
115 lines (111 loc) • 3.23 kB
JavaScript
import React, { useMemo } from "react";
import PropTypes from "prop-types";
import "./style.css";
/**
* Shimmer.Box Component
* @param {Object} props
* @param {string} props.className - Additional CSS classes for the Box.
* @param {Object} props.style - Inline styles for the Box.
* @param {React.ReactNode} props.children - Children to render inside the Box.
* @returns {JSX.Element} A container box for the Shimmer.
*/
import { jsx as _jsx } from "react/jsx-runtime";
Shimmer.Box = function Box(_ref) {
let {
className = "",
style = {},
children
} = _ref;
return /*#__PURE__*/_jsx("div", {
className: className,
style: style,
children: children
});
};
Shimmer.Box.propTypes = {
className: PropTypes.string,
style: PropTypes.object,
children: PropTypes.node
};
/**
* Shimmer.Item Component
* @param {Object} props
* @param {string} props.className - Additional CSS classes for the Item.
* @param {Object} props.style - Inline styles for the Item.
* @returns {JSX.Element} A shimmer effect item.
*/
Shimmer.Item = function Item(_ref2) {
let {
className = "",
style = {}
} = _ref2;
return /*#__PURE__*/_jsx("div", {
className: `eb-shimmer ${className}`,
style: style
});
};
Shimmer.Item.propTypes = {
className: PropTypes.string,
style: PropTypes.object
};
/**
* Shimmer Component
* @param {Object} props
* @param {boolean} props.loading - Whether to show the shimmer effect or not.
* @param {string} props.className - Additional CSS classes for the Shimmer container.
* @param {Object} props.style - Inline styles for the Shimmer container.
* @param {React.ReactNode} props.children - Children to render when loading is false.
* @param {number} props.rows - Number of rows for the shimmer.
* @param {number} props.cols - Number of columns for the shimmer.
* @param {Function} props.Render - Custom render function for the shimmer item.
* @returns {JSX.Element} Shimmer effect or children based on the loading state.
*/
export default function Shimmer(_ref3) {
let {
loading = true,
className = "",
style = {},
children = null,
rows = 1,
cols = 1,
gap = 16,
Render = () => /*#__PURE__*/_jsx(Shimmer.Box, {
children: /*#__PURE__*/_jsx(Shimmer.Item, {
style: {
width: "75%",
height: "80px"
}
})
})
} = _ref3;
// Memoize grid styles to prevent unnecessary re-renders
const gridStyles = useMemo(() => {
return {
display: "grid",
gap: `${gap}px`,
gridTemplateColumns: `repeat(${cols > 0 ? cols : 1}, minmax(0, 1fr))`,
...style
};
}, [cols, gap, style]);
if (loading) {
return /*#__PURE__*/_jsx("div", {
className: className,
style: gridStyles,
children: Array.from({
length: rows
}).map((_, i) => /*#__PURE__*/_jsx(Render, {}, i))
});
}
// Render children if loading is false
return children || null;
}
Shimmer.propTypes = {
loading: PropTypes.bool,
className: PropTypes.string,
style: PropTypes.object,
children: PropTypes.node,
rows: PropTypes.number,
cols: PropTypes.number,
gap: PropTypes.number,
Render: PropTypes.func
};