UNPKG

@gluestack-ui/core

Version:

Universal UI components for React Native, Expo, and Next.js

65 lines 3.01 kB
import React, { forwardRef } from 'react'; import { usePopoverContent } from './PopoverContext'; import { getArrowStyles } from './utils'; const PopoverArrow = (StyledPopoverArrow) => forwardRef((props, ref) => { const { value: { placement, actualPlacement, updateArrowSize, arrowHeight, arrowWidth, arrowProps, updateArrowElement, isFlipped, }, } = usePopoverContent('PopoverContext'); const additionalStyles = React.useMemo(() => { return getArrowStyles({ height: arrowHeight, width: arrowWidth, actualPlacement, }); }, [arrowHeight, arrowWidth, placement, actualPlacement]); React.useEffect(() => { var _a, _b, _c, _d; const ArrowComponent = (<StyledPopoverArrow ref={ref} onLayout={(event) => { const { height, width } = event.nativeEvent.layout; updateArrowSize({ height, width }); }} {...props} initial={{ opacity: 0, y: actualPlacement === 'top' ? 2 : actualPlacement === 'bottom' ? -2 : 0, x: actualPlacement === 'right' ? -2 : actualPlacement === 'left' ? 2 : 0, rotate: '45deg', }} animate={{ opacity: 1, y: 0, x: 0, rotate: '45deg', }} exit={{ opacity: 0, rotate: '45deg', }} style={[ props === null || props === void 0 ? void 0 : props.style, arrowProps === null || arrowProps === void 0 ? void 0 : arrowProps.style, { top: placement === 'right bottom' || placement === 'left bottom' ? ((_a = arrowProps === null || arrowProps === void 0 ? void 0 : arrowProps.style) === null || _a === void 0 ? void 0 : _a.top) > 4 ? ((_b = arrowProps === null || arrowProps === void 0 ? void 0 : arrowProps.style) === null || _b === void 0 ? void 0 : _b.top) - 4 : (_c = arrowProps === null || arrowProps === void 0 ? void 0 : arrowProps.style) === null || _c === void 0 ? void 0 : _c.top : (_d = arrowProps === null || arrowProps === void 0 ? void 0 : arrowProps.style) === null || _d === void 0 ? void 0 : _d.top, }, additionalStyles, ]} dataSet={{ flip: isFlipped }} states={{ flip: isFlipped, }}/>); updateArrowElement(ArrowComponent); }, [ additionalStyles, placement, arrowHeight, arrowWidth, actualPlacement, JSON.stringify(arrowProps === null || arrowProps === void 0 ? void 0 : arrowProps.style), ]); return null; }); export default PopoverArrow; //# sourceMappingURL=PopoverArrow.jsx.map