react-native-sortables
Version:
Powerful Sortable Components for Flexible Content Reordering in React Native
74 lines (73 loc) • 2.06 kB
JavaScript
;
import React from "react";
import { Fragment, useCallback, useRef, useState } from 'react';
import { useSharedValue } from 'react-native-reanimated';
import { createProvider } from '../utils';
import { PortalOutletProvider } from './PortalOutletProvider';
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
const {
PortalProvider,
usePortalContext
} = createProvider('Portal', {
guarded: false
})(({
children,
enabled
}) => {
const subscribersRef = useRef({});
const [teleportedNodes, setTeleportedNodes] = useState({});
const activeItemAbsolutePosition = useSharedValue(null);
const teleport = useCallback((id, node) => {
if (node) {
setTeleportedNodes(prev => {
const newState = {
...prev,
[id]: node
};
return newState;
});
} else {
setTeleportedNodes(prev => {
if (!prev[id]) return prev;
const newState = {
...prev
};
delete newState[id];
return newState;
});
}
}, []);
const subscribe = useCallback((id, callback) => {
subscribersRef.current[id] ??= new Set();
subscribersRef.current[id]?.add(callback);
return () => {
subscribersRef.current[id]?.delete(callback);
};
}, []);
const notifySubscribers = useCallback((id, isTeleported) => {
subscribersRef.current[id]?.forEach(callback => {
callback(isTeleported);
});
}, []);
const notifyRendered = useCallback(id => {
notifySubscribers(id, true);
}, [notifySubscribers]);
return {
children: /*#__PURE__*/_jsxs(Fragment, {
children: [children, /*#__PURE__*/_jsx(PortalOutletProvider, {
children: Object.entries(teleportedNodes).map(([key, node]) => /*#__PURE__*/_jsx(Fragment, {
children: node
}, key))
})]
}),
enabled,
value: {
activeItemAbsolutePosition,
notifyRendered,
subscribe,
teleport
}
};
});
export { PortalProvider, usePortalContext };
//# sourceMappingURL=PortalProvider.js.map