UNPKG

react-native-sortables

Version:

Powerful Sortable Components for Flexible Content Reordering in React Native

74 lines (73 loc) 2.06 kB
"use strict"; 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