react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
66 lines (58 loc) • 1.96 kB
text/typescript
import type { NativeEvent } from './commonTypes';
import NativeReanimatedModule from './NativeReanimated';
import { registerEventHandler, unregisterEventHandler } from './core';
function jsListener<T extends NativeEvent<T>>(
eventName: string,
handler: (event: T) => void
) {
return (evt: T) => {
handler({ ...evt.nativeEvent, eventName });
};
}
export default class WorkletEventHandler<T extends NativeEvent<T>> {
worklet: (event: T) => void;
eventNames: string[];
reattachNeeded: boolean;
listeners: Record<string, (event: T) => void>;
viewTag: number | undefined;
registrations: number[];
constructor(worklet: (event: T) => void, eventNames: string[] = []) {
this.worklet = worklet;
this.eventNames = eventNames;
this.reattachNeeded = false;
this.listeners = {};
this.viewTag = undefined;
this.registrations = [];
if (!NativeReanimatedModule.native) {
this.listeners = eventNames.reduce(
(acc: Record<string, (event: T) => void>, eventName: string) => {
acc[eventName] = jsListener(eventName, worklet);
return acc;
},
{}
);
}
}
updateWorklet(newWorklet: (event: T) => void): void {
this.worklet = newWorklet;
this.reattachNeeded = true;
}
registerForEvents(viewTag: number, fallbackEventName?: string): void {
this.viewTag = viewTag;
this.registrations = this.eventNames.map((eventName) =>
registerEventHandler(viewTag + eventName, this.worklet)
);
if (this.registrations.length === 0 && fallbackEventName) {
this.registrations.push(
registerEventHandler(viewTag + fallbackEventName, this.worklet)
);
}
}
registerForEventByName(eventName: string) {
this.registrations.push(registerEventHandler(eventName, this.worklet));
}
unregisterFromEvents(): void {
this.registrations.forEach((id) => unregisterEventHandler(id));
this.registrations = [];
}
}