#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace reanimated::css { using CSSAnimationsMap = std::unordered_map>; using CSSAnimationsVector = std::vector>; class CSSAnimationsRegistry : public UpdatesRegistry, std::enable_shared_from_this { public: using SettingsUpdates = std::vector>; bool isEmpty() const override; bool hasUpdates() const; void apply( jsi::Runtime &rt, const std::shared_ptr &shadowNode, const std::optional> &animationNames, const CSSAnimationsMap &newAnimations, const CSSAnimationSettingsUpdatesMap &settingsUpdates, double timestamp); void remove(Tag viewTag) override; void update(double timestamp); private: using AnimationToIndexMap = std::unordered_map, size_t>; using RunningAnimationIndicesMap = std::unordered_map>; using AnimationsToRevertMap = std::unordered_map>; struct RegistryEntry { const CSSAnimationsVector animationsVector; const AnimationToIndexMap animationToIndexMap; }; using Registry = std::unordered_map; Registry registry_; RunningAnimationIndicesMap runningAnimationIndicesMap_; AnimationsToRevertMap animationsToRevertMap_; DelayedItemsManager> delayedAnimationsManager_; CSSAnimationsVector buildAnimationsVector( jsi::Runtime &rt, const std::shared_ptr &shadowNode, const std::optional> &animationNames, const std::optional &newAnimations) const; AnimationToIndexMap buildAnimationToIndexMap( const CSSAnimationsVector &animationsVector) const; void updateAnimationSettings( const CSSAnimationsVector &animationsVector, const CSSAnimationSettingsUpdatesMap &settingsUpdates, double timestamp); void updateViewAnimations( Tag viewTag, const std::vector &animationIndices, double timestamp, bool addToBatch); void scheduleOrActivateAnimation( size_t animationIndex, const std::shared_ptr &animation, double timestamp); void removeViewAnimations(Tag viewTag); void applyViewAnimationsStyle(Tag viewTag, double timestamp); void activateDelayedAnimations(double timestamp); void handleAnimationsToRevert(double timestamp); static bool addStyleUpdates( folly::dynamic &target, const folly::dynamic &updates, bool shouldOverride); }; } // namespace reanimated::css