react-native-sortables
Version:
Powerful Sortable Components for Flexible Content Reordering in React Native
108 lines (103 loc) • 3.46 kB
JavaScript
"use strict";
import React from "react";
import { Fragment, memo, useCallback, useEffect, useState } from 'react';
import { GestureDetector } from 'react-native-gesture-handler';
import { LayoutAnimationConfig, runOnUI, useDerivedValue } from 'react-native-reanimated';
import { useMutableValue } from '../../../integrations/reanimated';
import { ItemContextProvider, ItemOutlet, useCommonValuesContext, useDragContext, useItemLayout, useItemPanGesture, useMeasurementsContext, usePortalContext } from '../../../providers';
import ActiveItemPortal from './ActiveItemPortal';
import ItemCell from './ItemCell';
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
function DraggableView({
itemEntering,
itemExiting,
itemKey: key,
style
}) {
const portalContext = usePortalContext();
const commonValuesContext = useCommonValuesContext();
const {
handleItemMeasurement,
removeItemMeasurements
} = useMeasurementsContext();
const {
handleDragEnd
} = useDragContext();
const {
activeItemKey,
customHandle
} = commonValuesContext;
const [isHidden, setIsHidden] = useState(false);
const activationAnimationProgress = useMutableValue(0);
const isActive = useDerivedValue(() => activeItemKey.value === key);
const layoutStyleValue = useItemLayout(key, isActive, activationAnimationProgress);
const gesture = useItemPanGesture(key, activationAnimationProgress);
useEffect(() => {
return () => {
removeItemMeasurements(key);
runOnUI(() => {
handleDragEnd(key, activationAnimationProgress);
})();
};
}, [activationAnimationProgress, handleDragEnd, key, removeItemMeasurements]);
const onLayout = useCallback(({
nativeEvent: {
layout: {
height,
width
}
}
}) => handleItemMeasurement(key, {
height,
width
}), [handleItemMeasurement, key]);
const renderItemCell = (hidden = false) => {
const innerComponent = /*#__PURE__*/_jsx(ItemCell, {
activationAnimationProgress: activationAnimationProgress,
baseStyle: style,
entering: itemEntering ?? undefined,
exiting: itemExiting ?? undefined,
hidden: hidden,
isActive: isActive,
itemKey: key,
layoutStyleValue: layoutStyleValue,
onLayout: onLayout,
children: /*#__PURE__*/_jsx(LayoutAnimationConfig, {
skipEntering: false,
skipExiting: false,
children: /*#__PURE__*/_jsx(ItemOutlet, {
itemKey: key
})
})
});
return /*#__PURE__*/_jsx(ItemContextProvider, {
activationAnimationProgress: activationAnimationProgress,
gesture: gesture,
isActive: isActive,
itemKey: key,
children: customHandle ? innerComponent : /*#__PURE__*/_jsx(GestureDetector, {
gesture: gesture,
userSelect: "none",
children: innerComponent
})
});
};
// NORMAL CASE (no portal)
if (!portalContext) {
return renderItemCell();
}
// PORTAL CASE
return /*#__PURE__*/_jsxs(Fragment, {
children: [renderItemCell(isHidden), /*#__PURE__*/_jsx(ActiveItemPortal, {
activationAnimationProgress: activationAnimationProgress,
baseStyle: style,
commonValuesContext: commonValuesContext,
gesture: gesture,
isActive: isActive,
itemKey: key,
onTeleport: setIsHidden
})]
});
}
export default /*#__PURE__*/memo(DraggableView);
//# sourceMappingURL=DraggableView.js.map