From 5a63224774458548cdecd887da3634940f6cdc35 Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Wed, 21 May 2025 17:07:06 +0200 Subject: [PATCH 1/2] fix: keep shadow nodes in sync --- .../listeners/KeyboardAnimationCallback.kt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/android/src/main/java/com/reactnativekeyboardcontroller/listeners/KeyboardAnimationCallback.kt b/android/src/main/java/com/reactnativekeyboardcontroller/listeners/KeyboardAnimationCallback.kt index 3ff4ed07bc..6645fa2617 100644 --- a/android/src/main/java/com/reactnativekeyboardcontroller/listeners/KeyboardAnimationCallback.kt +++ b/android/src/main/java/com/reactnativekeyboardcontroller/listeners/KeyboardAnimationCallback.kt @@ -8,6 +8,7 @@ import androidx.core.view.OnApplyWindowInsetsListener import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsAnimationCompat import androidx.core.view.WindowInsetsCompat +import com.facebook.react.animated.NativeAnimatedNodesManager import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.WritableMap import com.facebook.react.uimanager.ThemedReactContext @@ -26,6 +27,7 @@ import com.reactnativekeyboardcontroller.log.Logger import com.reactnativekeyboardcontroller.traversal.FocusedInputHolder import kotlin.math.abs + private val TAG = KeyboardAnimationCallback::class.qualifiedName private val isResizeHandledInCallbackMethods = Keyboard.IS_ANIMATION_EMULATED @@ -327,6 +329,8 @@ class KeyboardAnimationCallback( // reset to initial state duration = 0 + + keepShadowNodesInSync() } if (isKeyboardInteractive) { @@ -436,4 +440,29 @@ class KeyboardAnimationCallback( return params } + + private fun keepShadowNodesInSync() { + + // ask to the Node Manager for all the native nodes listening to OnScroll event + // val nodeManager: NativeAnimatedNodesManager = mNodesManager.get() ?: return + // nodeManager.getTagsOfConnectedNodes(eventPropagationView.id, "topScrollEnded") + + val tags = intArrayOf(eventPropagationView.id) + + if (tags.isEmpty()) { + return + } + + val tagsArray = Arguments.createArray() + for (tag in tags) { + tagsArray.pushInt(tag) + } + + + // emit the event to JS to re-sync the trees + val onAnimationEndedData = Arguments.createMap() + onAnimationEndedData.putArray("tags", tagsArray) + + context?.reactApplicationContext?.emitDeviceEvent("onUserDrivenAnimationEnded", onAnimationEndedData) + } } From cd8839f0d1b0aa7a4b2fc1a9bfc59fa7f4a8f1ee Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Wed, 21 May 2025 19:59:19 +0200 Subject: [PATCH 2/2] fix: CI --- .../AwareScrollViewStickyFooter/index.tsx | 4 +-- .../extensions/ThemedReactContext.kt | 20 ++++++++++++ .../listeners/KeyboardAnimationCallback.kt | 31 ++----------------- .../AwareScrollViewStickyFooter/index.tsx | 4 +-- 4 files changed, 27 insertions(+), 32 deletions(-) diff --git a/FabricExample/src/screens/Examples/AwareScrollViewStickyFooter/index.tsx b/FabricExample/src/screens/Examples/AwareScrollViewStickyFooter/index.tsx index fd719afbd8..e0b0827c7d 100644 --- a/FabricExample/src/screens/Examples/AwareScrollViewStickyFooter/index.tsx +++ b/FabricExample/src/screens/Examples/AwareScrollViewStickyFooter/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useMemo, useState } from "react"; -import { Button, Text, View } from "react-native"; +import { Alert, Button, Text, View } from "react-native"; import { KeyboardAwareScrollView, KeyboardStickyView, @@ -82,7 +82,7 @@ export default function AwareScrollViewStickyFooter({ navigation }: Props) { A mocked sticky footer -