import _ from "lodash"; import React from "react"; import { TWUIPopoverStyles } from "../../elements/Modal"; import twuiNumberfy from "../../utils/numberfy"; type Params = { targetElRef: React.RefObject; position: (typeof TWUIPopoverStyles)[number]; }; export default function twuiGrabPopoverStyles({ position, targetElRef, }: Params): React.CSSProperties { if (!targetElRef.current) return {}; const rect = targetElRef.current.getBoundingClientRect(); const targetElCurrStyles = window.getComputedStyle(targetElRef.current); const targetElRightPadding = twuiNumberfy(targetElCurrStyles.paddingRight); let popoverStyle: React.CSSProperties = { position: "absolute", zIndex: 100, }; const defaultBottomStyle: React.CSSProperties = { top: rect.bottom + window.scrollY + 8, left: rect.left + window.scrollX + rect.width / 2, transform: "translateX(-50%)", }; const defaultTopStyleStyle: React.CSSProperties = { bottom: window.innerHeight - (rect.top + window.scrollY) + 8, left: rect.left + window.scrollX + rect.width / 2, transform: "translateX(-50%)", }; if (position === "bottom") { popoverStyle = _.merge(popoverStyle, defaultBottomStyle); } else if (position === "bottom-left") { popoverStyle = _.merge( popoverStyle, _.omit(defaultBottomStyle, ["transform"]), { left: rect.left, } as React.CSSProperties ); } else if (position === "bottom-right") { popoverStyle = _.merge( popoverStyle, _.omit(defaultBottomStyle, ["left", "transform"]), { right: window.innerWidth - (rect.left + window.scrollX) - rect.width - targetElRightPadding, } as React.CSSProperties ); } else if (position === "top") { popoverStyle = _.merge(popoverStyle, defaultTopStyleStyle); } else if (position === "right") { popoverStyle.top = rect.top + window.scrollY + rect.height / 2; popoverStyle.left = rect.right + window.scrollX + 8; popoverStyle.transform = "translateY(-50%)"; } else if (position === "left") { popoverStyle.top = rect.top + window.scrollY + rect.height / 2; popoverStyle.right = window.innerWidth - (rect.left + window.scrollX) + 8; popoverStyle.transform = "translateY(-50%)"; } return popoverStyle; }