UNPKG

react-native-gesture-handler

Version:

Declarative API exposing native platform touch and gesture system to React Native

85 lines (79 loc) 2.51 kB
"use strict"; import { Reanimated } from '../../../handlers/gestures/reanimatedWrapper'; import { NativeProxy } from '../../NativeProxy'; import { HandlerCallbacks } from './propsWhiteList'; // Variant of djb2 hash function. // Taken from https://gist.github.com/eplawless/52813b1d8ad9af510d85?permalink_comment_id=3367765#gistcomment-3367765 function hash(str) { 'worklet'; const len = str.length; let h = 5381; for (let i = 0; i < len; i++) { h = h * 33 ^ str.charCodeAt(i); } return h >>> 0; } export const SHARED_VALUE_OFFSET = 1.618; // Don't transfer entire NativeProxy to the UI thread const { updateGestureHandlerConfig } = NativeProxy; export function bindSharedValues(config, handlerTag) { if (Reanimated === undefined) { return; } const baseListenerId = handlerTag + SHARED_VALUE_OFFSET; const attachListener = (sharedValue, configKey) => { 'worklet'; const keyHash = hash(configKey); const listenerId = baseListenerId + keyHash; sharedValue.addListener(listenerId, value => { if (configKey === 'runOnJS') { config.dispatchesReanimatedEvents = config.shouldUseReanimatedDetector && !value; updateGestureHandlerConfig(handlerTag, { dispatchesReanimatedEvents: config.dispatchesReanimatedEvents }); } else { updateGestureHandlerConfig(handlerTag, { [configKey]: value }); } }); }; for (const [key, maybeSharedValue] of Object.entries(config)) { if (!Reanimated.isSharedValue(maybeSharedValue)) { continue; } Reanimated.runOnUI(attachListener)(maybeSharedValue, key); } } export function unbindSharedValues(config, handlerTag) { if (Reanimated === undefined) { return; } const baseListenerId = handlerTag + SHARED_VALUE_OFFSET; for (const [key, maybeSharedValue] of Object.entries(config)) { if (!Reanimated.isSharedValue(maybeSharedValue)) { continue; } const keyHash = hash(key); const listenerId = baseListenerId + keyHash; Reanimated.runOnUI(() => { maybeSharedValue.removeListener(listenerId); })(); } } export function hasWorkletEventHandlers(config) { for (const key of HandlerCallbacks) { const value = config[key]; if (typeof value === 'function' && '__workletHash' in value) { return true; } } return false; } export function maybeUnpackValue(v) { 'worklet'; return Reanimated?.isSharedValue(v) ? v.value : v; } //# sourceMappingURL=reanimatedUtils.js.map