From 25eeb87e6e672423ed92fff8662b52fbc1d48235 Mon Sep 17 00:00:00 2001 From: Trevor Lambert Date: Sun, 14 Sep 2025 20:04:06 -0500 Subject: [PATCH 1/3] fix: handle null-safety and array processing - Updated PortalViewState to use HashMap for initialContext. - Normalized HashMaps to Any? to ensure compatibility with older and newer RN versions. - Expanded nullable let chains (e.g., rnArray.getMap(idx)) to satisfy stricter Kotlin null-safety. --- .../ionic/portals/reactnative/PortalView.kt | 9 ++++-- .../reactnative/ReactNativePortalManager.kt | 31 ++++++++++--------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/android/src/main/java/io/ionic/portals/reactnative/PortalView.kt b/android/src/main/java/io/ionic/portals/reactnative/PortalView.kt index 50905ef..8318297 100644 --- a/android/src/main/java/io/ionic/portals/reactnative/PortalView.kt +++ b/android/src/main/java/io/ionic/portals/reactnative/PortalView.kt @@ -19,7 +19,7 @@ import io.ionic.portals.WebVitals private data class PortalViewState( var fragment: PortalFragment?, var portal: RNPortal?, - var initialContext: HashMap? + var initialContext: HashMap? ) internal class PortalViewManager(private val context: ReactApplicationContext) : @@ -30,11 +30,16 @@ internal class PortalViewManager(private val context: ReactApplicationContext) : @ReactProp(name = "portal") fun setPortal(viewGroup: ViewGroup, portal: ReadableMap) { val name = portal.getString("name") ?: return + + // React Native 0.77 changed ReadableMap.toHashMap() from HashMap to HashMap + // Casting is safe and keeps old versions compatible + val initialContext = portal.getMap("initialContext")?.toHashMap() as HashMap? + when (fragmentMap[viewGroup.id]) { null -> fragmentMap[viewGroup.id] = PortalViewState( fragment = null, portal = RNPortalManager.createPortal(portal), - initialContext = portal.getMap("initialContext")?.toHashMap() + initialContext ) } } diff --git a/android/src/main/java/io/ionic/portals/reactnative/ReactNativePortalManager.kt b/android/src/main/java/io/ionic/portals/reactnative/ReactNativePortalManager.kt index 71bd244..f01c559 100644 --- a/android/src/main/java/io/ionic/portals/reactnative/ReactNativePortalManager.kt +++ b/android/src/main/java/io/ionic/portals/reactnative/ReactNativePortalManager.kt @@ -65,9 +65,11 @@ internal object RNPortalManager { ?.let { rnArray -> val list = mutableListOf() for (idx in 0 until rnArray.size()) { - rnArray.getMap(idx) - .let(PortalPlugin.Companion::fromReadableMap) - ?.let(list::add) + rnArray.getMap(idx)?.let { map -> + PortalPlugin.fromReadableMap(map)?.let { plugin -> + list.add(plugin) + } + } } return@let list } ?: listOf() @@ -83,16 +85,16 @@ internal object RNPortalManager { val list = mutableListOf() for (idx in 0 until rnArray.size()) { - rnArray.getMap(idx) - .let assetMap@{ map -> - val name = map.getString("name") ?: return@assetMap null + rnArray.getMap(idx)?.let { map -> + val assetMapName = map.getString("name") ?: return@let + list.add( AssetMap( - name = name, - virtualPath = map.getString("virtualPath") ?: "/$name", + name = assetMapName, + virtualPath = map.getString("virtualPath") ?: "/$assetMapName", path = map.getString("startDir") ?: "" ) - } - ?.let(list::add) + ) + } } return@let list @@ -115,16 +117,17 @@ internal object RNPortalManager { ) } - portalBuilder + portalBuilder .addPlugin(PortalsPlugin::class.java) val vitals = map.getArray("webVitals") val maybeList = if (vitals != null) { val size = vitals.size() (0 until size).fold(mutableListOf()) { list, next -> - val vital = vitals.getString(next) - list.add(vital) - return@fold list + vitals.getString(next)?.let { vital -> + list.add(vital) + } + list } } else { null From 953f30946dbe2da148d42ee082f7c8ccc356e6e5 Mon Sep 17 00:00:00 2001 From: Trevor Lambert Date: Mon, 15 Sep 2025 10:59:02 -0500 Subject: [PATCH 2/3] chore: version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 128ce07..4a25a85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/portals-react-native", - "version": "0.8.2", + "version": "0.8.3-beta", "description": "Portals for React Native", "main": "lib/commonjs/index", "module": "lib/module/index", From b35229a956b851699acdaa24bdcf2cbd01c3ee06 Mon Sep 17 00:00:00 2001 From: Trevor Lambert Date: Thu, 25 Sep 2025 11:42:54 -0500 Subject: [PATCH 3/3] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4a25a85..dedea6b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ionic/portals-react-native", - "version": "0.8.3-beta", + "version": "0.8.3", "description": "Portals for React Native", "main": "lib/commonjs/index", "module": "lib/module/index",