UNPKG

react-native-reanimated

Version:

More powerful alternative to Animated library for React Native.

175 lines (142 loc) 4.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeMutable = makeMutable; exports.makeRemote = makeRemote; exports.makeUIMutable = makeUIMutable; Object.defineProperty(exports, "stopMapper", { enumerable: true, get: function () { return _mappers.stopMapper; } }); var _NativeReanimated = _interopRequireDefault(require("./NativeReanimated")); var _shareables = require("./shareables"); var _threads = require("./threads"); var _valueSetter = require("./valueSetter"); var _mappers = require("./mappers"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function makeUIMutable(initial, syncDataHolder) { 'worklet'; const listeners = new Map(); let value = initial; const self = { set value(newValue) { (0, _valueSetter.valueSetter)(self, newValue); }, get value() { return value; }, /** * _value prop should only be accessed by the valueSetter implementation * which may make the decision about updating the mutable value depending * on the provided new value. All other places should only attempt to modify * the mutable by assigning to value prop directly. */ set _value(newValue) { value = newValue; if (syncDataHolder) { _updateDataSynchronously(syncDataHolder, (0, _shareables.makeShareableCloneOnUIRecursive)(newValue)); } listeners.forEach(listener => { listener(newValue); }); }, get _value() { return value; }, addListener: (id, listener) => { listeners.set(id, listener); }, removeListener: id => { listeners.delete(id); }, _animation: null, _isReanimatedSharedValue: true }; return self; } function makeMutable(initial) { let oneWayReadsOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; let value = initial; let syncDataHolder; if (!oneWayReadsOnly && _NativeReanimated.default.native) { // updates are always synchronous when running on web or in Jest environment syncDataHolder = _NativeReanimated.default.makeSynchronizedDataHolder((0, _shareables.makeShareableCloneRecursive)(value)); (0, _shareables.registerShareableMapping)(syncDataHolder); } const handle = (0, _shareables.makeShareableCloneRecursive)({ __init: () => { 'worklet'; return makeUIMutable(initial, syncDataHolder); } }); // listeners can only work on JS thread on Web and jest environments const listeners = _NativeReanimated.default.native ? undefined : new Map(); const mutable = { set value(newValue) { if (_NativeReanimated.default.native) { (0, _threads.runOnUI)(() => { 'worklet'; mutable.value = newValue; })(); } else { (0, _valueSetter.valueSetter)(mutable, newValue); } }, get value() { if (syncDataHolder) { return _NativeReanimated.default.getDataSynchronously(syncDataHolder); } return value; }, set _value(newValue) { if (_NativeReanimated.default.native) { throw new Error('Setting `_value` directly is only possible on the UI runtime'); } value = newValue; listeners.forEach(listener => { listener(newValue); }); }, get _value() { if (_NativeReanimated.default.native) { throw new Error('Reading from `_value` directly is only possible on the UI runtime'); } return value; }, modify: modifier => { (0, _threads.runOnUI)(() => { 'worklet'; mutable.value = modifier(mutable.value); })(); }, addListener: (id, listener) => { if (_NativeReanimated.default.native) { throw new Error('adding listeners is only possible on the UI runtime'); } listeners.set(id, listener); }, removeListener: id => { if (_NativeReanimated.default.native) { throw new Error('removing listeners is only possible on the UI runtime'); } listeners.delete(id); }, _isReanimatedSharedValue: true }; (0, _shareables.registerShareableMapping)(mutable, handle); return mutable; } function makeRemote() { let initial = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; const handle = (0, _shareables.makeShareableCloneRecursive)({ __init: () => { 'worklet'; return initial; } }); (0, _shareables.registerShareableMapping)(initial, handle); return initial; } //# sourceMappingURL=mutables.js.map