react-native-reanimated
Version:
More powerful alternative to Animated library for React Native.
118 lines (114 loc) • 3.56 kB
JavaScript
;
import { createShareable, createSynchronizable, runOnUISync, scheduleOnUI, UIRuntimeId } from 'react-native-worklets';
import { getStaticFeatureFlag } from "./featureFlags/index.js";
import { checkInvalidReadDuringRender, checkInvalidWriteDuringRender, mutableHostDecorator } from "./mutablesCommon.js";
const USE_SYNCHRONIZABLE_FOR_MUTABLES = getStaticFeatureFlag('USE_SYNCHRONIZABLE_FOR_MUTABLES');
function mutableGuestDecorator(initial, mutable, dirtyFlag) {
'worklet';
let latest = initial;
Object.defineProperties(mutable, {
value: {
get() {
if (globalThis.__RUNTIME_KIND === 1) {
checkInvalidReadDuringRender();
}
if (globalThis.__RUNTIME_KIND !== 1 || dirtyFlag === undefined) {
latest = mutable.getSync();
} else if (dirtyFlag.getBlocking()) {
const uiValueGetter = svArg => runOnUISync(sv => {
sv.setDirty?.(false);
return sv.value;
}, svArg);
latest = uiValueGetter(mutable);
}
return latest;
},
set(newValue) {
if (globalThis.__RUNTIME_KIND === 1) {
checkInvalidWriteDuringRender();
scheduleOnUI(() => {
mutable.value = newValue;
});
} else {
mutable.setAsync(newValue);
}
},
enumerable: true,
configurable: true
},
get: {
value() {
return mutable.value;
},
configurable: false,
enumerable: false
},
set: {
value(newValue) {
if (typeof newValue === 'function' && !newValue.__isAnimationDefinition) {
mutable.value = newValue(mutable.value);
} else {
mutable.value = newValue;
}
},
configurable: false,
enumerable: false
},
_value: {
get() {
throw new Error('[Reanimated] Reading from `_value` directly is only possible on the UI runtime. Perhaps you wanted to access `value` instead?');
},
set(_newValue) {
throw new Error('[Reanimated] Setting `_value` directly is only possible on the UI runtime. Perhaps you wanted to assign to `value` instead?');
}
},
modify: {
value: (modifier, forceUpdate = true) => {
scheduleOnUI(() => {
mutable.modify(modifier, forceUpdate);
});
},
writable: true,
enumerable: true,
configurable: true
},
addListener: {
value: () => {
throw new Error('[Reanimated] Adding listeners is only possible on the UI runtime.');
},
writable: true,
enumerable: true,
configurable: true
},
removeListener: {
value: () => {
throw new Error('[Reanimated] Removing listeners is only possible on the UI runtime.');
},
writable: true,
enumerable: true,
configurable: true
},
_isReanimatedSharedValue: {
value: true,
writable: true,
enumerable: true,
configurable: true
}
});
return mutable;
}
export function makeMutable(initial) {
const dirtyFlag = USE_SYNCHRONIZABLE_FOR_MUTABLES ? createSynchronizable(false) : undefined;
const shareable = createShareable(UIRuntimeId, initial, {
hostDecorator: shareableHost => {
'worklet';
return mutableHostDecorator(shareableHost, dirtyFlag);
},
guestDecorator: shareableGuest => {
'worklet';
return mutableGuestDecorator(initial, shareableGuest, dirtyFlag);
}
});
return shareable;
}
//# sourceMappingURL=mutables.native.js.map