react-native-gesture-handler
Version:
Declarative API exposing native platform touch and gesture system to React Native
85 lines (79 loc) • 2.51 kB
JavaScript
;
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