1 line
15 KiB
Plaintext
1 line
15 KiB
Plaintext
{"version":3,"sources":["createAnimatedComponent.js"],"names":["React","findNodeHandle","Platform","StyleSheet","ReanimatedEventEmitter","AnimatedEvent","AnimatedNode","AnimatedValue","createOrReusePropsNode","invariant","NODE_MAPPING","Map","listener","data","component","get","viewTag","_updateFromNative","props","dummyListener","createAnimatedComponent","Component","prototype","isReactComponent","AnimatedComponent","constructor","_component","_invokeAnimatedPropsCallbackOnMount","setNativeProps","forceUpdate","_propsAnimated","__getValue","c","_attachProps","componentWillUnmount","_detachPropUpdater","__detach","_detachNativeEvents","componentDidMount","_animatedPropsCallback","setNativeView","_attachNativeEvents","_attachPropUpdater","_getEventViewRef","getScrollableNode","node","key","prop","attachEvent","detachEvent","_reattachNativeEvents","prevProps","attached","Set","nextEvts","add","__nodeID","has","nextProps","oldPropsAnimated","set","size","addListener","delete","removeAllListeners","componentDidUpdate","_filterNonAnimatedStyle","inputStyle","style","value","_startingValue","_filterNonAnimatedProps","inputProps","flatten","render","platformProps","select","web","default","collapsable","_setComponentRef","getNode","displayName","name"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { findNodeHandle, Platform, StyleSheet } from 'react-native';\nimport ReanimatedEventEmitter from './ReanimatedEventEmitter';\n\nimport AnimatedEvent from './core/AnimatedEvent';\nimport AnimatedNode from './core/AnimatedNode';\nimport AnimatedValue from './core/AnimatedValue';\nimport { createOrReusePropsNode } from './core/AnimatedProps';\n\nimport invariant from 'fbjs/lib/invariant';\n\nconst NODE_MAPPING = new Map();\n\nfunction listener(data) {\n const component = NODE_MAPPING.get(data.viewTag);\n component && component._updateFromNative(data.props);\n}\n\nfunction dummyListener() {\n // empty listener we use to assign to listener properties for which animated\n // event is used.\n}\n\nexport default function createAnimatedComponent(Component) {\n invariant(\n typeof Component !== 'function' ||\n (Component.prototype && Component.prototype.isReactComponent),\n '`createAnimatedComponent` does not support stateless functional components; ' +\n 'use a class component instead.'\n );\n\n class AnimatedComponent extends React.Component {\n _invokeAnimatedPropsCallbackOnMount = false;\n\n constructor(props) {\n super(props);\n this._attachProps(this.props);\n }\n\n componentWillUnmount() {\n this._detachPropUpdater();\n this._propsAnimated && this._propsAnimated.__detach();\n this._detachNativeEvents();\n }\n\n setNativeProps(props) {\n this._component.setNativeProps(props);\n }\n\n componentDidMount() {\n if (this._invokeAnimatedPropsCallbackOnMount) {\n this._invokeAnimatedPropsCallbackOnMount = false;\n this._animatedPropsCallback();\n }\n\n this._propsAnimated.setNativeView(this._component);\n this._attachNativeEvents();\n this._attachPropUpdater();\n }\n\n _getEventViewRef() {\n // Make sure to get the scrollable node for components that implement\n // `ScrollResponder.Mixin`.\n return this._component.getScrollableNode\n ? this._component.getScrollableNode()\n : this._component;\n }\n\n _attachNativeEvents() {\n const node = this._getEventViewRef();\n\n for (const key in this.props) {\n const prop = this.props[key];\n if (prop instanceof AnimatedEvent) {\n prop.attachEvent(node, key);\n }\n }\n }\n\n _detachNativeEvents() {\n const node = this._getEventViewRef();\n\n for (const key in this.props) {\n const prop = this.props[key];\n if (prop instanceof AnimatedEvent) {\n prop.detachEvent(node, key);\n }\n }\n }\n\n _reattachNativeEvents(prevProps) {\n const node = this._getEventViewRef();\n const attached = new Set();\n const nextEvts = new Set();\n for (const key in this.props) {\n const prop = this.props[key];\n if (prop instanceof AnimatedEvent) {\n nextEvts.add(prop.__nodeID);\n }\n }\n for (const key in prevProps) {\n const prop = this.props[key];\n if (prop instanceof AnimatedEvent) {\n if (!nextEvts.has(prop.__nodeID)) {\n // event was in prev props but not in current props, we detach\n prop.detachEvent(node, key);\n } else {\n // event was in prev and is still in current props\n attached.add(prop.__nodeID);\n }\n }\n }\n for (const key in this.props) {\n const prop = this.props[key];\n if (prop instanceof AnimatedEvent && !attached.has(prop.__nodeID)) {\n // not yet attached\n prop.attachEvent(node, key);\n }\n }\n }\n\n // The system is best designed when setNativeProps is implemented. It is\n // able to avoid re-rendering and directly set the attributes that changed.\n // However, setNativeProps can only be implemented on native components\n // If you want to animate a composite component, you need to re-render it.\n // In this case, we have a fallback that uses forceUpdate.\n _animatedPropsCallback = () => {\n if (this._component == null) {\n // AnimatedProps is created in will-mount because it's used in render.\n // But this callback may be invoked before mount in async mode,\n // In which case we should defer the setNativeProps() call.\n // React may throw away uncommitted work in async mode,\n // So a deferred call won't always be invoked.\n this._invokeAnimatedPropsCallbackOnMount = true;\n } else if (typeof this._component.setNativeProps !== 'function') {\n this.forceUpdate();\n } else {\n this._component.setNativeProps(this._propsAnimated.__getValue());\n }\n };\n\n _attachProps(nextProps) {\n const oldPropsAnimated = this._propsAnimated;\n\n this._propsAnimated = createOrReusePropsNode(\n nextProps,\n this._animatedPropsCallback,\n oldPropsAnimated\n );\n // If prop node has been reused we don't need to call into \"__detach\"\n if (oldPropsAnimated !== this._propsAnimated) {\n // When you call detach, it removes the element from the parent list\n // of children. If it goes to 0, then the parent also detaches itself\n // and so on.\n // An optimization is to attach the new elements and THEN detach the old\n // ones instead of detaching and THEN attaching.\n // This way the intermediate state isn't to go to 0 and trigger\n // this expensive recursive detaching to then re-attach everything on\n // the very next operation.\n oldPropsAnimated && oldPropsAnimated.__detach();\n }\n }\n\n _updateFromNative(props) {\n this._component.setNativeProps(props);\n }\n\n _attachPropUpdater() {\n const viewTag = findNodeHandle(this);\n NODE_MAPPING.set(viewTag, this);\n if (NODE_MAPPING.size === 1) {\n ReanimatedEventEmitter.addListener('onReanimatedPropsChange', listener);\n }\n }\n\n _detachPropUpdater() {\n const viewTag = findNodeHandle(this);\n NODE_MAPPING.delete(viewTag);\n if (NODE_MAPPING.size === 0) {\n ReanimatedEventEmitter.removeAllListeners('onReanimatedPropsChange');\n }\n }\n\n componentDidUpdate(prevProps) {\n this._attachProps(this.props);\n this._reattachNativeEvents(prevProps);\n\n this._propsAnimated.setNativeView(this._component);\n }\n\n _setComponentRef = c => {\n if (c !== this._component) {\n this._component = c;\n }\n };\n\n _filterNonAnimatedStyle(inputStyle) {\n const style = {};\n for (const key in inputStyle) {\n const value = inputStyle[key];\n if (key !== 'transform') {\n if (value instanceof AnimatedValue) {\n style[key] = value._startingValue;\n } else if (!(value instanceof AnimatedNode)) {\n style[key] = value;\n }\n }\n }\n return style;\n }\n\n _filterNonAnimatedProps(inputProps) {\n const props = {};\n for (const key in inputProps) {\n const value = inputProps[key];\n if (key === 'style') {\n props[key] = this._filterNonAnimatedStyle(StyleSheet.flatten(value));\n } else if (value instanceof AnimatedEvent) {\n // we cannot filter out event listeners completely as some components\n // rely on having a callback registered in order to generate events\n // alltogether. Therefore we provide a dummy callback here to allow\n // native event dispatcher to hijack events.\n props[key] = dummyListener;\n } else if (value instanceof AnimatedValue) {\n props[key] = value._startingValue;\n } else if (!(value instanceof AnimatedNode)) {\n props[key] = value;\n }\n }\n return props;\n }\n\n render() {\n const props = this._filterNonAnimatedProps(this.props);\n const platformProps = Platform.select({\n web: {},\n default: { collapsable: false },\n });\n return (\n <Component {...props} ref={this._setComponentRef} {...platformProps} />\n );\n }\n\n // A third party library can use getNode()\n // to get the node reference of the decorated component\n getNode() {\n return this._component;\n }\n }\n\n AnimatedComponent.displayName = `AnimatedComponent(${Component.displayName ||\n Component.name ||\n 'Component'})`;\n\n return AnimatedComponent;\n}\n"]} |