import React, { useMemo, useState, useCallback } from 'react'; import PanningContext, { PanningContextState, PanAmountDirections, PanLocationProps, PanningDirectionsEnum, } from './PanningContext'; /** * 包装 panResponderView 和 panListenerView 共享一个 context */ const PanningProvider = ({ children }: { children: React.ReactNode }): JSX.Element => { const [isPanning, setIspanning] = useState(false); const [wasTerminated, setWasTerminated] = useState(false); const [panLocation, setPanLocation] = useState({}); const [amountDirections, setAmountDirections] = useState({ dragDirections: {}, dragDeltas: {}, swipeDirections: {}, swipeVelocities: {}, }); const onPanStart = useCallback(() => { setIspanning(true); setWasTerminated(false); }, []); const onPanRelease = useCallback(() => { setIspanning(false); }, []); const onPanTerminated = useCallback(() => { setIspanning(false); setWasTerminated(true); }, []); const onDrag = useCallback(({ directions, deltas }) => { setAmountDirections({ dragDirections: directions, dragDeltas: deltas, swipeDirections: {}, swipeVelocities: {}, }); }, []); const onSwipe = useCallback(({ directions, velocities }) => { setAmountDirections({ swipeDirections: directions, swipeVelocities: velocities, dragDirections: {}, dragDeltas: {}, }); }, []); const onPanLocationChanged = useCallback( location => { setPanLocation(location); }, [] ); const contextValue = useMemo( () => ({ ...amountDirections, isPanning, panLocation, wasTerminated, onPanRelease, onPanStart, onPanTerminated, onDrag, onSwipe, onPanLocationChanged, }), [ isPanning, panLocation, onPanRelease, wasTerminated, onPanStart, onPanTerminated, amountDirections, onDrag, onSwipe, onPanLocationChanged, ] ); return {children}; }; PanningProvider.Directions = PanningDirectionsEnum; export default PanningProvider;