/* * 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. */ #pragma once #include #include #include #include #include #include "IntersectionObserverState.h" namespace facebook::react { using IntersectionObserverObserverId = int32_t; struct IntersectionObserverEntry { IntersectionObserverObserverId intersectionObserverId; ShadowNodeFamily::Shared shadowNodeFamily; Rect targetRect; Rect rootRect; Rect intersectionRect; bool isIntersectingAboveThresholds; HighResTimeStamp time; bool sameShadowNodeFamily( const ShadowNodeFamily& otherShadowNodeFamily) const { return std::addressof(*shadowNodeFamily) == std::addressof(otherShadowNodeFamily); } }; class IntersectionObserver { public: IntersectionObserver( IntersectionObserverObserverId intersectionObserverId, std::optional observationRootShadowNodeFamily, ShadowNodeFamily::Shared targetShadowNodeFamily, std::vector thresholds, std::optional> rootThresholds = std::nullopt); // Partially equivalent to // https://w3c.github.io/IntersectionObserver/#update-intersection-observations-algo std::optional updateIntersectionObservation( const RootShadowNode& rootShadowNode, HighResTimeStamp time); std::optional updateIntersectionObservationForSurfaceUnmount(HighResTimeStamp time); IntersectionObserverObserverId getIntersectionObserverId() const { return intersectionObserverId_; } ShadowNodeFamily::Shared getTargetShadowNodeFamily() const { return targetShadowNodeFamily_; } std::vector getThresholds() const { return thresholds_; } private: std::optional setIntersectingState( const Rect& rootBoundingRect, const Rect& targetBoundingRect, const Rect& intersectionRect, Float threshold, Float rootThreshold, HighResTimeStamp time); std::optional setNotIntersectingState( const Rect& rootBoundingRect, const Rect& targetBoundingRect, const Rect& intersectionRect, HighResTimeStamp time); IntersectionObserverObserverId intersectionObserverId_; std::optional observationRootShadowNodeFamily_; ShadowNodeFamily::Shared targetShadowNodeFamily_; std::vector thresholds_; std::optional> rootThresholds_; mutable IntersectionObserverState state_ = IntersectionObserverState::Initial(); }; } // namespace facebook::react