react-native-gesture-handler
Version:
Declarative API exposing native platform touch and gesture system to React Native
126 lines (118 loc) • 3.12 kB
text/typescript
import { Platform } from 'react-native';
import { PressableEvent } from './PressableProps';
import { StateDefinition } from './StateMachine';
export enum StateMachineEvent {
NATIVE_BEGIN = 'nativeBegin',
NATIVE_START = 'nativeStart',
FINALIZE = 'finalize',
LONG_PRESS_TOUCHES_DOWN = 'longPressTouchesDown',
}
function getAndroidStatesConfig(
handlePressIn: (event: PressableEvent) => void,
handlePressOut: (event: PressableEvent) => void
) {
return [
{
eventName: StateMachineEvent.NATIVE_BEGIN,
},
{
eventName: StateMachineEvent.LONG_PRESS_TOUCHES_DOWN,
callback: handlePressIn,
},
{
eventName: StateMachineEvent.FINALIZE,
callback: handlePressOut,
},
];
}
function getIosStatesConfig(
handlePressIn: (event: PressableEvent) => void,
handlePressOut: (event: PressableEvent) => void
) {
return [
{
eventName: StateMachineEvent.LONG_PRESS_TOUCHES_DOWN,
},
{
eventName: StateMachineEvent.NATIVE_START,
callback: handlePressIn,
},
{
eventName: StateMachineEvent.FINALIZE,
callback: handlePressOut,
},
];
}
function getWebStatesConfig(
handlePressIn: (event: PressableEvent) => void,
handlePressOut: (event: PressableEvent) => void
) {
return [
{
eventName: StateMachineEvent.NATIVE_BEGIN,
},
{
eventName: StateMachineEvent.NATIVE_START,
},
{
eventName: StateMachineEvent.LONG_PRESS_TOUCHES_DOWN,
callback: handlePressIn,
},
{
eventName: StateMachineEvent.FINALIZE,
callback: handlePressOut,
},
];
}
function getMacosStatesConfig(
handlePressIn: (event: PressableEvent) => void,
handlePressOut: (event: PressableEvent) => void
) {
return [
{
eventName: StateMachineEvent.LONG_PRESS_TOUCHES_DOWN,
},
{
eventName: StateMachineEvent.NATIVE_BEGIN,
callback: handlePressIn,
},
{
eventName: StateMachineEvent.NATIVE_START,
},
{
eventName: StateMachineEvent.FINALIZE,
callback: handlePressOut,
},
];
}
function getUniversalStatesConfig(
handlePressIn: (event: PressableEvent) => void,
handlePressOut: (event: PressableEvent) => void
) {
return [
{
eventName: StateMachineEvent.FINALIZE,
callback: (event: PressableEvent) => {
handlePressIn(event);
handlePressOut(event);
},
},
];
}
export function getStatesConfig(
handlePressIn: (event: PressableEvent) => void,
handlePressOut: (event: PressableEvent) => void
): StateDefinition[] {
if (Platform.OS === 'android') {
return getAndroidStatesConfig(handlePressIn, handlePressOut);
} else if (Platform.OS === 'ios') {
return getIosStatesConfig(handlePressIn, handlePressOut);
} else if (Platform.OS === 'web') {
return getWebStatesConfig(handlePressIn, handlePressOut);
} else if (Platform.OS === 'macos') {
return getMacosStatesConfig(handlePressIn, handlePressOut);
} else {
// Unknown platform - using minimal universal setup.
return getUniversalStatesConfig(handlePressIn, handlePressOut);
}
}