/* * 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 namespace facebook::react { using NativeIntersectionObserverIntersectionObserverId = int32_t; using RectAsTuple = std::tuple; using NativeIntersectionObserverObserveOptions = NativeIntersectionObserverCxxBaseNativeIntersectionObserverObserveOptions< // intersectionObserverId NativeIntersectionObserverIntersectionObserverId, // targetShadowNode jsi::Object, // thresholds std::vector>; template <> struct Bridging : NativeIntersectionObserverCxxBaseNativeIntersectionObserverObserveOptionsBridging< // intersectionObserverId NativeIntersectionObserverIntersectionObserverId, // targetShadowNode jsi::Object, // thresholds std::vector> {}; using NativeIntersectionObserverEntry = NativeIntersectionObserverCxxBaseNativeIntersectionObserverEntry< // intersectionObserverId NativeIntersectionObserverIntersectionObserverId, // targetInstanceHandle jsi::Value, // targetRect RectAsTuple, // rootRect RectAsTuple, // intersectionRect std::optional, // isIntersectingAboveThresholds bool, // time double>; template <> struct Bridging : NativeIntersectionObserverCxxBaseNativeIntersectionObserverEntryBridging< // intersectionObserverId NativeIntersectionObserverIntersectionObserverId, // targetInstanceHandle jsi::Value, // targetRect RectAsTuple, // rootRect RectAsTuple, // intersectionRect std::optional, // isIntersectingAboveThresholds bool, // time double> {}; class NativeIntersectionObserver : public NativeIntersectionObserverCxxSpec, std::enable_shared_from_this { public: NativeIntersectionObserver(std::shared_ptr jsInvoker); void observe( jsi::Runtime& runtime, NativeIntersectionObserverObserveOptions options); void unobserve( jsi::Runtime& runtime, IntersectionObserverObserverId intersectionObserverId, jsi::Object targetShadowNode); void connect( jsi::Runtime& runtime, AsyncCallback<> notifyIntersectionObserversCallback); void disconnect(jsi::Runtime& runtime); std::vector takeRecords( jsi::Runtime& runtime); private: IntersectionObserverManager intersectionObserverManager_{}; static UIManager& getUIManagerFromRuntime(jsi::Runtime& runtime); static NativeIntersectionObserverEntry convertToNativeModuleEntry( IntersectionObserverEntry entry, jsi::Runtime& runtime); }; } // namespace facebook::react