import React, { memo, useContext, useMemo } from 'react';
import { RefreshControl, type RefreshControlProps } from 'react-native';
import {
Gesture,
GestureDetector,
type SimultaneousGesture,
} from 'react-native-gesture-handler';
import Animated, { useAnimatedProps } from 'react-native-reanimated';
import { SCROLLABLE_STATUS } from '../../constants';
import { BottomSheetDraggableContext } from '../../contexts/gesture';
import { useBottomSheetInternal } from '../../hooks';
const AnimatedRefreshControl = Animated.createAnimatedComponent(RefreshControl);
interface BottomSheetRefreshControlProps extends RefreshControlProps {
scrollableGesture: SimultaneousGesture;
}
function BottomSheetRefreshControlComponent({
onRefresh,
scrollableGesture,
...rest
}: BottomSheetRefreshControlProps) {
//#region hooks
const draggableGesture = useContext(BottomSheetDraggableContext);
const {
animatedScrollableStatus: animatedScrollableState,
enableContentPanningGesture,
} = useBottomSheetInternal();
//#endregion
if (!draggableGesture && enableContentPanningGesture) {
throw "'BottomSheetRefreshControl' cannot be used out of the BottomSheet!";
}
//#region variables
const animatedProps = useAnimatedProps(
() => ({
enabled: animatedScrollableState.value === SCROLLABLE_STATUS.UNLOCKED,
}),
[animatedScrollableState.value]
);
const gesture = useMemo(
() =>
draggableGesture
? Gesture.Native()
.simultaneousWithExternalGesture(
...draggableGesture.toGestureArray(),
...scrollableGesture.toGestureArray()
)
.shouldCancelWhenOutside(true)
: undefined,
[draggableGesture, scrollableGesture]
);
//#endregion
// render
if (gesture) {
return (
);
}
return (
);
}
const BottomSheetRefreshControl = memo(BottomSheetRefreshControlComponent);
BottomSheetRefreshControl.displayName = 'BottomSheetRefreshControl';
export default BottomSheetRefreshControl;