packages/react-native/src/arrow.ts
import type {Middleware, SideObject} from '@floating-ui/core';
import {arrow as arrowCore} from '@floating-ui/core';
/**
* A data provider that provides data to position an inner element of the
* floating element (usually a triangle or caret) so that it is centered to the
* reference element.
* This wraps the core `arrow` middleware to allow React refs as the element.
* @see https://floating-ui.com/docs/arrow
*/
export const arrow = (options: {
element: any;
padding?: number | SideObject;
}): Middleware => {
const {element, padding} = options;
function isRef(value: unknown) {
return {}.hasOwnProperty.call(value, 'current');
}
return {
name: 'arrow',
options,
fn(args) {
if (element && isRef(element)) {
if (element.current != null) {
return arrowCore({element: element.current, padding}).fn(args);
}
return {};
}
if (element) {
return arrowCore({element, padding}).fn(args);
}
return {};
},
};
};