react-native-gesture-handler
Version:
Declarative API exposing native platform touch and gesture system to React Native
77 lines (69 loc) • 2.38 kB
text/typescript
import * as React from 'react';
import { Platform, findNodeHandle as findNodeHandleRN } from 'react-native';
import { handlerIDToTag } from './handlersRegistry';
import { toArray } from '../utils';
import RNGestureHandlerModule from '../RNGestureHandlerModule';
import { ghQueueMicrotask } from '../ghQueueMicrotask';
function isConfigParam(param: unknown, name: string) {
// param !== Object(param) returns false if `param` is a function
// or an object and returns true if `param` is null
return (
param !== undefined &&
(param !== Object(param) ||
!('__isNative' in (param as Record<string, unknown>))) &&
name !== 'onHandlerStateChange' &&
name !== 'onGestureEvent'
);
}
export function filterConfig(
props: Record<string, unknown>,
validProps: string[],
defaults: Record<string, unknown> = {}
) {
const filteredConfig = { ...defaults };
for (const key of validProps) {
let value = props[key];
if (isConfigParam(value, key)) {
if (key === 'simultaneousHandlers' || key === 'waitFor') {
value = transformIntoHandlerTags(props[key]);
} else if (key === 'hitSlop' && typeof value !== 'object') {
value = { top: value, left: value, bottom: value, right: value };
}
filteredConfig[key] = value;
}
}
return filteredConfig;
}
export function transformIntoHandlerTags(handlerIDs: any) {
handlerIDs = toArray(handlerIDs);
if (Platform.OS === 'web') {
return handlerIDs
.map(({ current }: { current: any }) => current)
.filter((handle: any) => handle);
}
// converts handler string IDs into their numeric tags
return handlerIDs
.map(
(handlerID: any) =>
handlerIDToTag[handlerID] || handlerID.current?.handlerTag || -1
)
.filter((handlerTag: number) => handlerTag > 0);
}
export function findNodeHandle(
node: null | number | React.Component<any, any> | React.ComponentClass<any>
): null | number | React.Component<any, any> | React.ComponentClass<any> {
if (Platform.OS === 'web') {
return node;
}
return findNodeHandleRN(node);
}
let flushOperationsScheduled = false;
export function scheduleFlushOperations() {
if (!flushOperationsScheduled) {
flushOperationsScheduled = true;
ghQueueMicrotask(() => {
RNGestureHandlerModule.flushOperations();
flushOperationsScheduled = false;
});
}
}