@gluestack-ui/core
Version:
Universal UI components for React Native, Expo, and Next.js
77 lines • 3.06 kB
JSX
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import React, { forwardRef } from 'react';
import { useTooltipContext } from './context';
import { mergeRefs } from '@gluestack-ui/utils/common';
import { useOverlayPosition } from '../../overlay/aria';
import { OverlayAnimatePresence } from './OverlayAnimatePresence';
import { Platform, View } from 'react-native';
export function TooltipContent(StyledTooltipContent, AnimatePresence) {
return forwardRef((_a, ref) => {
var { children, style } = _a, props = __rest(_a, ["children", "style"]);
const { value } = useTooltipContext('TooltipContext');
const { isOpen, targetRef, placement, crossOffset, offset, shouldFlip, shouldOverlapWithTrigger, } = value;
const overlayRef = React.useRef(null);
const { overlayProps, placement: calculatedPlacement } = useOverlayPosition({
placement,
targetRef,
overlayRef,
crossOffset,
offset,
shouldOverlapWithTrigger,
shouldFlip,
});
if (Object.keys(overlayProps.style).length === 0) {
overlayProps.style = {
top: -1000,
left: -1000,
};
}
const mergedRef = mergeRefs([ref, overlayRef]);
const initialAnimatedStyles = {
opacity: 0,
scale: 0.9,
y: calculatedPlacement === 'top'
? 6
: calculatedPlacement === 'bottom'
? -6
: 0,
x: calculatedPlacement === 'right'
? -6
: calculatedPlacement === 'left'
? 6
: 0,
};
const animatedStyles = {
opacity: 1,
x: 0,
y: 0,
scale: 1,
};
const exitAnimatedStyles = {
opacity: 0,
x: 0,
y: 0,
};
return (<OverlayAnimatePresence visible={isOpen} AnimatePresence={AnimatePresence}>
<View collapsable={false} ref={mergedRef} style={[overlayProps.style, { position: 'absolute' }]}>
<StyledTooltipContent initial={initialAnimatedStyles} animate={animatedStyles} exit={exitAnimatedStyles} transition={{
type: 'timing',
duration: 100,
}} {...props} style={style} ref={mergedRef} role={Platform.OS === 'web' ? 'tooltip' : undefined}>
{children}
</StyledTooltipContent>
</View>
</OverlayAnimatePresence>);
});
}
//# sourceMappingURL=TooltipContent.jsx.map