UNPKG

@etsoo/materialui

Version:

TypeScript Material-UI Implementation

65 lines (64 loc) 2.79 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ButtonPopover = ButtonPopover; const jsx_runtime_1 = require("react/jsx-runtime"); const Popover_1 = __importDefault(require("@mui/material/Popover")); const react_1 = __importDefault(require("react")); /** * Button popover component * @param props Props * @returns Component */ function ButtonPopover(props) { // Destruct const { button, children, loadData, position = "right" } = props; // States const [anchorEl, setAnchorEl] = react_1.default.useState(null); const [data, setData] = react_1.default.useState(null); const isLoadded = react_1.default.useRef(false); const open = Boolean(anchorEl); // Load data react_1.default.useEffect(() => { if (loadData && (!isLoadded.current || open)) { // First time or when open loadData().then((d) => { if (d == null) return; setData(d); isLoadded.current = true; }); } }, [loadData, open]); // Children const currentChildren = react_1.default.useMemo(() => children(data), [children, data]); const handleClose = () => { setAnchorEl(null); }; const styles = position === "left" ? { left: 14 } : { right: 14 }; // Layout return ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [button((handler) => setAnchorEl(handler)), (0, jsx_runtime_1.jsx)(Popover_1.default, { anchorEl: anchorEl, open: open, onClose: handleClose, onClick: handleClose, transformOrigin: { horizontal: position, vertical: "top" }, anchorOrigin: { horizontal: position, vertical: "bottom" }, slotProps: { paper: { elevation: 0, sx: { overflow: "visible", filter: "drop-shadow(0px 2px 8px rgba(0,0,0,0.32))", mt: 1, "&::before": { content: '""', display: "block", position: "absolute", top: 0, width: 10, height: 10, bgcolor: "background.paper", transform: "translateY(-50%) rotate(45deg)", zIndex: 0, ...styles } } } }, children: currentChildren })] })); }