@tamagui/react-native-web-lite
Version:
React Native for Web
67 lines (61 loc) • 2.06 kB
JavaScript
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import { NativeAnimatedHelper } from '../NativeAnimatedHelper'
let startNativeAnimationNextId = 1
// Important note: start() and stop() will only be called at most once.
// Once an animation has been stopped or finished its course, it will
// not be reused.
class Animation {
__active
__isInteraction
__nativeId
__onEnd
__iterations
start(fromValue, onUpdate, onEnd, previousAnimation, animatedValue) {}
stop() {
if (this.__nativeId) {
NativeAnimatedHelper.API.stopAnimation(this.__nativeId)
}
}
__getNativeAnimationConfig() {
// Subclasses that have corresponding animation implementation done in native
// should override this method
throw new Error('This animation type cannot be offloaded to native')
}
// Helper function for subclasses to make sure onEnd is only called once.
__debouncedOnEnd(result) {
const onEnd = this.__onEnd
this.__onEnd = null
onEnd && onEnd(result)
}
__startNativeAnimation(animatedValue) {
const startNativeAnimationWaitId = `${startNativeAnimationNextId}:startAnimation`
startNativeAnimationNextId += 1
NativeAnimatedHelper.API.setWaitingForIdentifier(startNativeAnimationWaitId)
try {
const config = this.__getNativeAnimationConfig()
animatedValue.__makeNative(config.platformConfig)
this.__nativeId = NativeAnimatedHelper.generateNewAnimationId()
NativeAnimatedHelper.API.startAnimatingNode(
this.__nativeId,
animatedValue.__getNativeTag(),
config,
// $FlowFixMe[method-unbinding] added when improving typing for this parameters
this.__debouncedOnEnd.bind(this)
)
} catch (e) {
throw e
} finally {
NativeAnimatedHelper.API.unsetWaitingForIdentifier(startNativeAnimationWaitId)
}
}
}
export { Animation }
export default Animation