Skip to content

fix: add nullabulity check#191

Merged
uc-brunosouza merged 3 commits intomasterfrom
MSDK-2730/Update-nullability-checks
Mar 20, 2026
Merged

fix: add nullabulity check#191
uc-brunosouza merged 3 commits intomasterfrom
MSDK-2730/Update-nullability-checks

Conversation

@uc-brunosouza
Copy link
Collaborator

@uc-brunosouza uc-brunosouza commented Mar 18, 2026

User description

Summary by CodeRabbit

  • Bug Fixes

    • Improved error handling during button configuration parsing with safer fallback behavior
    • Enhanced null-handling in user decision data processing
  • Tests

    • Added comprehensive null-safety tests for data deserialization to ensure reliability and robust error handling

CodeAnt-AI Description

Skip null entries and default missing banner button type to avoid crashes during JS-native parsing

What Changed

  • Arrays and maps coming from React Native that contain null entries are skipped instead of causing errors when deserializing user decisions and TCF-related decisions
  • Entries missing a required service ID are ignored rather than producing invalid decisions
  • Banner button type now defaults to the "More" button when the type field is absent, preventing null-related crashes
  • Unit tests added to verify handling of null array/map entries, missing service IDs, empty arrays, and missing TCF arrays

Impact

✅ Fewer Android crashes during settings parsing
✅ Safer handling of null entries from React Native arrays
✅ Consistent default banner button when button type is missing

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

@uc-brunosouza uc-brunosouza self-assigned this Mar 18, 2026
@codeant-ai
Copy link

codeant-ai bot commented Mar 18, 2026

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@coderabbitai
Copy link

coderabbitai bot commented Mar 18, 2026

📝 Walkthrough

Walkthrough

Two extension files were refactored to improve null-safety handling by introducing local variable caching and graceful defaults instead of direct map access or non-null assertions. A new comprehensive test file was added to verify robust null handling across deserialization helpers.

Changes

Cohort / File(s) Summary
Extension Improvements
android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt, android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt
Refactored deserialization logic to cache map values in local variables and use graceful defaults (e.g., ButtonType.MORE) or short-circuit on null instead of throwing exceptions on missing/null values.
Null-Safety Test Coverage
android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt
New test suite validating robust null handling in deserialization helpers, covering scenarios with null entries, missing fields, and empty datasets for deserializeUserDecision, deserializePurposeLIDecisionsMap, and deserializeTCFUserDecisions.

Estimated Code Review Effort

🎯 2 (Simple) | ⏱️ ~15 minutes

Poem

🐰 Null values? No fright!
Local vars cache with care and might,
Tests confirm each graceful default's right,
Safety hops through deserialization's night!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title contains a typo ('nullabulity' instead of 'nullability') and is somewhat vague about the specific changes made to the codebase. Correct the typo to 'nullability' and consider making the title more specific about what nullability checks were added (e.g., 'fix: add nullability checks for deserialization helpers').
✅ Passed checks (2 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch MSDK-2730/Update-nullability-checks
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@qodo-code-review
Copy link

Review Summary by Qodo

Add nullability checks and comprehensive test coverage

🐞 Bug fix 🧪 Tests

Grey Divider

Walkthroughs

Description
• Replace unsafe non-null assertions with safe nullability checks
  - buttonSettingsFromMap: Use safe call with default ButtonType.MORE
  - deserializeUserDecision: Extract serviceId with null-coalescing operator
• Add comprehensive test suite for nullability handling
  - Tests cover null entries in arrays and missing fields
  - Validates graceful handling of null values in deserialization
Diagram
flowchart LR
  A["Unsafe Non-null Assertions"] -->|Replace with safe calls| B["Safe Nullability Checks"]
  B -->|Validate with| C["NullabilityTest Suite"]
  C -->|Ensures| D["Graceful Null Handling"]
Loading

Grey Divider

File Changes

1. android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt 🐞 Bug fix +2/-1

Safe buttonType extraction with default fallback

• Extract buttonType with safe call operator and null-coalescing to default ButtonType.MORE
• Replace unsafe !! non-null assertion with safe nullable assignment
• Prevents crashes when buttonType is null in React Native 0.77+

android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt


2. android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt 🐞 Bug fix +2/-1

Safe serviceId extraction with null skipping

• Extract serviceId with safe call and null-coalescing operator
• Replace unsafe !! non-null assertion with safe nullable check
• Skip entries with missing serviceId using return@let

android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt


3. android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt 🧪 Tests +189/-0

Comprehensive nullability handling test suite

• Add 10 comprehensive test cases for nullability handling in deserialization
• Test null entries in arrays, missing fields, and empty arrays
• Cover deserializeUserDecision, deserializePurposeLIDecisionsMap, and
 deserializeTCFUserDecisions
• Validate graceful handling and correct filtering of null/invalid entries

android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt


Grey Divider

Qodo Logo

@qodo-code-review
Copy link

qodo-code-review bot commented Mar 18, 2026

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0) 📐 Spec deviations (0)

Grey Divider


Action required

1. Wrong default button type 🐞 Bug ✓ Correctness
Description
buttonSettingsFromMap defaults a missing/null "buttonType" to ButtonType.MORE, which can silently
convert an invalid/malformed JS payload into a real "MORE" button and change the rendered consent UI
instead of ignoring the invalid entry. This also introduces iOS/Android behavioral divergence (iOS
skips invalid button configs).
Code

android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt[R140-144]

+    val buttonType = getString("buttonType")?.deserializeButtonType() ?: ButtonType.MORE

    return ButtonSettings(
-        type = getString("buttonType")!!.deserializeButtonType(),
+        type = buttonType,
        isAllCaps = getBooleanOrNull("isAllCaps"),
Evidence
Android now falls back to ButtonType.MORE when buttonType is null, meaning a malformed/null field
becomes a concrete UI action rather than being dropped. iOS explicitly requires buttonType and
returns nil (skips the button) when it’s missing/invalid, so the same input yields different UI
across platforms.

android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt[138-155]
ios/Extensions/BannerSettings+Dict.swift[191-198]
src/models/FirstLayerSettings.tsx[164-170]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`buttonSettingsFromMap` currently treats a missing/null `buttonType` as `ButtonType.MORE`, which can change the banner’s button behavior for malformed/null payloads and diverges from iOS (which skips invalid button settings).

### Issue Context
On iOS, `ButtonSettings(from:)` returns `nil` if `buttonType` is missing/invalid, meaning the button is ignored. Android should follow the same approach (skip) rather than injecting a specific action.

### Fix Focus Areas
- android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt[138-155]

### Suggested approach
- Change `buttonSettingsFromMap` to return `ButtonSettings?`.
- Parse buttonType as:
 - return `null` if missing
 - return `null` if `valueOf` fails (use `runCatching { ... }.getOrNull()`)
- Update `buttonLayoutFromMap` to only `add(...)` when `buttonSettingsFromMap(...)` returns non-null.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Consent null still crashes 🐞 Bug ⛯ Reliability
Description
deserializeUserDecision now skips entries with null serviceId, but still reads consent via
getBoolean("consent") without checking for null/missing, which can still throw and crash
saveDecisions/saveDecisionsForTCF. This leaves the nullability fix incomplete for RN 0.77+ style
nulls.
Code

android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt[R17-22]

+            val serviceId = it.getString("serviceId") ?: return@let
            decisionList.add(
                UserDecision(
-                    it.getString("serviceId")!!,
+                    serviceId,
                    it.getBoolean("consent")
                )
Evidence
The code path still calls ReadableMap.getBoolean("consent"), which requires the key to exist and
be non-null; the project already provides getBooleanOrNull for safe access but it isn’t used here.
iOS also requires both serviceId and consent and skips invalid entries, indicating Android should
not crash on missing consent either.

android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt[12-27]
android/src/main/java/com/usercentrics/reactnative/extensions/ReadableMapExtensions.kt[24-30]
ios/Extensions/UserDecision+Dict.swift[4-9]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`deserializeUserDecision` still calls `getBoolean("consent")` directly. If `consent` is missing or null, this will throw at runtime and crash the call to `saveDecisions` / `saveDecisionsForTCF`.

### Issue Context
The PR targets RN 0.77+ nullability changes, so decisions payloads can contain nulls/missing keys. The code already has `getBooleanOrNull` for safe reads.

### Fix Focus Areas
- android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt[12-27]
- android/src/main/java/com/usercentrics/reactnative/extensions/ReadableMapExtensions.kt[24-30]
- android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt[1-189]

### Suggested approach
- Update parsing to:
 - `val serviceId = it.getString("serviceId") ?: return@let`
 - `val consent = it.getBooleanOrNull("consent") ?: return@let`
 - then add `UserDecision(serviceId, consent)`
- Add a unit test ensuring entries with null/missing `consent` are skipped (or defaulted, if that’s the intended behavior—match iOS if possible).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@codeant-ai codeant-ai bot added the size:L This PR changes 100-499 lines, ignoring generated files label Mar 18, 2026
@codeant-ai
Copy link

codeant-ai bot commented Mar 18, 2026

Sequence Diagram

This PR hardens Android Kotlin extension parsing against null values coming from React Native 0.77 and later. It skips invalid user decision entries and applies a safe default button type when the map field is missing.

sequenceDiagram
    participant RN as React Native Layer
    participant Ext as Kotlin Extensions
    participant SDK as Usercentrics SDK

    RN->>Ext: Send user decisions array
    Ext->>Ext: Iterate entries
    alt Map and serviceId present
        Ext->>SDK: Create and collect UserDecision
    else Null map or missing serviceId
        Ext->>Ext: Skip entry
    end
    Ext-->>RN: Return filtered user decisions

    RN->>Ext: Send button settings map
    Ext->>Ext: Resolve button type or default MORE
    Ext->>SDK: Build ButtonSettings
    Ext-->>RN: Return safe button settings
Loading

Generated by CodeAnt AI

@pantoaibot
Copy link

pantoaibot bot commented Mar 18, 2026

PR Summary:

Add null-safety checks to deserialization logic and add unit tests to prevent NPEs from null/missing RN map/array entries.

  • BannerSettingsExtensions.kt
    • Replace force-unwrapped buttonType deserialization with safe lookup:
      • val buttonType = getString("buttonType")?.deserializeButtonType() ?: ButtonType.MORE
      • Use buttonType in returned ButtonSettings (prevents NPE; missing buttonType defaults to ButtonType.MORE).
  • UserDecisionExtensions.kt
    • In deserializeUserDecision(), skip entries missing "serviceId" instead of force-unwrapping:
      • val serviceId = it.getString("serviceId") ?: return@let
      • Avoids crashes when array items are null or lack serviceId.
  • Tests
    • Add NullabilityTest.kt with comprehensive unit tests covering:
      • Arrays containing null entries, maps missing keys, empty arrays, and missing arrays for TCF/user-decision deserializers.
      • Verifies null entries are skipped and defaults/empty results are returned safely.
  • Impact
    • No breaking changes; behavior is more robust (skips invalid inputs and uses a safe default for missing buttonType).
    • No dependency or performance changes.

Reviewed by Panto AI

@pantoaibot
Copy link

pantoaibot bot commented Mar 18, 2026

Reviewed up to commit:d9995ee4a8ca0e67d8095a2595344d1f44981762

Reviewed by Panto AI

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt (1)

172-188: Add one test for missing/null consent with valid serviceId.

Given this PR’s nullability focus, a targeted case here would lock expected behavior for that input shape and prevent regressions.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt`
around lines 172 - 188, Add a unit test in NullabilityTest.kt named something
like `deserializeUserDecision_handlesMissingOrNullConsent_withValidServiceId`
that constructs a JavaOnlyArray with entries where serviceId is present but
consent is omitted and one where consent is explicitly null (plus a control
entry with consent true), calls deserializeUserDecision(), and asserts that each
entry with a valid serviceId is included in the result and that their consent
values match the expected default behavior (e.g., false for missing/null
consent) — reference deserializeUserDecision and assert on result[i].serviceId
and result[i].consent to lock the behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt`:
- Around line 17-20: deserializeUserDecision currently drops entries with null
serviceId silently; update it to signal when entries were skipped (e.g., return
a result object or pair containing the deserialized List<UserDecision> plus a
count/flag of skipped entries or throw a descriptive exception) and then change
the RNUsercentricsModule call sites that pass the result directly to the SDK
save methods (the functions that invoke the SDK save — locate usages around
where you call saveUserDecisions/saveDecisions) to check that signal: if any
entries were skipped, return an error/promise rejection to JS with a clear
message listing how many/which entries were dropped instead of calling the SDK,
otherwise proceed to call the SDK; ensure the unique symbol
deserializeUserDecision is updated and referenced by the RNUsercentricsModule
callers so JS consumers receive explicit feedback when invalid entries are
present.

---

Nitpick comments:
In
`@android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt`:
- Around line 172-188: Add a unit test in NullabilityTest.kt named something
like `deserializeUserDecision_handlesMissingOrNullConsent_withValidServiceId`
that constructs a JavaOnlyArray with entries where serviceId is present but
consent is omitted and one where consent is explicitly null (plus a control
entry with consent true), calls deserializeUserDecision(), and asserts that each
entry with a valid serviceId is included in the result and that their consent
values match the expected default behavior (e.g., false for missing/null
consent) — reference deserializeUserDecision and assert on result[i].serviceId
and result[i].consent to lock the behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 616de5f8-c4b2-4f1c-885a-08207ff54258

📥 Commits

Reviewing files that changed from the base of the PR and between 8ee96f5 and d9995ee.

📒 Files selected for processing (3)
  • android/src/main/java/com/usercentrics/reactnative/extensions/BannerSettingsExtensions.kt
  • android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt
  • android/src/test/java/com/usercentrics/reactnative/extensions/NullabilityTest.kt

@codeant-ai
Copy link

codeant-ai bot commented Mar 18, 2026

CodeAnt AI finished reviewing your PR.

@qodo-code-review
Copy link

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: test-ios

Failed stage: Run tests [❌]

Failed test name: ""

Failure summary:

The action failed during the iOS build/test step because the Swift compilation for the CocoaPods
target react-native-usercentrics failed.
- Swift compiler error: Cannot find type
'GppSectionChangePayload' in scope (repeated multiple times).
- This caused SwiftCompile /
SwiftEmitModule to fail for react-native-usercentrics (arm64), leading to Testing cancelled because
the build failed and Xcode exiting with code 65.
- The many “Run script build phase 'Create Symlinks
to Header Folders' will be run during every build …” lines are warnings and not the direct cause of
the failure.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

954:  Installing React-RCTText (0.81.4)
955:  Installing React-RCTVibration (0.81.4)
956:  Installing React-RuntimeApple (0.81.4)
957:  Installing React-RuntimeCore (0.81.4)
958:  Installing React-RuntimeHermes (0.81.4)
959:  Installing React-callinvoker (0.81.4)
960:  Installing React-cxxreact (0.81.4)
961:  Installing React-debug (0.81.4)
962:  Installing React-defaultsnativemodule (0.81.4)
963:  Installing React-domnativemodule (0.81.4)
964:  Installing React-featureflags (0.81.4)
965:  Installing React-featureflagsnativemodule (0.81.4)
966:  Installing React-graphics (0.81.4)
967:  Installing React-hermes (0.81.4)
968:  Installing React-idlecallbacksnativemodule (0.81.4)
969:  Installing React-jserrorhandler (0.81.4)
970:  Installing React-jsi (0.81.4)
...

1208:  ▸ Copying ExecutionContextManager.h
1209:  ▸ Copying ExecutionContext.h
1210:  ▸ Copying ConsoleMessage.h
1211:  ▸ Copying Base64.h
1212:  ▸ Copying React-jsiexecutor-umbrella.h
1213:  ▸ Copying JSINativeModules.h
1214:  ▸ Copying JSIExecutor.h
1215:  ▸ Copying threadsafe.h
1216:  ▸ Copying jsilib.h
1217:  ▸ Copying jsi.h
1218:  ▸ Copying jsi-inl.h
1219:  ▸ Copying instrumentation.h
1220:  ▸ Copying decorator.h
1221:  ▸ Copying React-jsi-umbrella.h
1222:  ▸ Copying JSIDynamic.h
1223:  ▸ Copying React-jserrorhandler-umbrella.h
1224:  ▸ Copying React-idlecallbacksnativemodule-umbrella.h
1225:  ▸ Copying React-hermes-umbrella.h
1226:  ▸ Copying HermesExecutorFactory.h
1227:  ▸ Copying React-graphics-umbrella.h
1228:  ▸ Copying React-featureflagsnativemodule-umbrella.h
1229:  ▸ Copying React-featureflags-umbrella.h
1230:  ▸ Copying React-domnativemodule-umbrella.h
1231:  ▸ Copying React-defaultsnativemodule-umbrella.h
1232:  ▸ Copying React-debug-umbrella.h
1233:  ▸ Copying SystraceSection.h
1234:  ▸ Copying TraceSection.h
1235:  ▸ Copying SharedProxyCxxModule.h
1236:  ▸ Copying RecoverableError.h
1237:  ▸ Copying ReactNativeVersion.h
...

1240:  ▸ Copying RAMBundleRegistry.h
1241:  ▸ Copying NativeToJsBridge.h
1242:  ▸ Copying NativeModule.h
1243:  ▸ Copying MoveWrapper.h
1244:  ▸ Copying ModuleRegistry.h
1245:  ▸ Copying MethodCall.h
1246:  ▸ Copying MessageQueueThread.h
1247:  ▸ Copying JsArgumentHelpers.h
1248:  ▸ Copying JsArgumentHelpers-inl.h
1249:  ▸ Copying JSModulesUnbundle.h
1250:  ▸ Copying JSIndexedRAMBundle.h
1251:  ▸ Copying JSExecutor.h
1252:  ▸ Copying JSBundleType.h
1253:  ▸ Copying JSBigString.h
1254:  ▸ Copying Instance.h
1255:  ▸ Copying ErrorUtils.h
1256:  ▸ Copying CxxNativeModule.h
...

1599:  ▸ Copying RCTI18nUtil.h
1600:  ▸ Copying RCTI18nManager.h
1601:  ▸ Copying RCTHTTPRequestHandler.h
1602:  ▸ Copying RCTGIFImageDecoder.h
1603:  ▸ Copying RCTFrameUpdate.h
1604:  ▸ Copying RCTFrameAnimation.h
1605:  ▸ Copying RCTFont.h
1606:  ▸ Copying RCTFileRequestHandler.h
1607:  ▸ Copying RCTFileReaderModule.h
1608:  ▸ Copying RCTFPSGraph.h
1609:  ▸ Copying RCTExceptionsManager.h
1610:  ▸ Copying RCTEventEmitter.h
1611:  ▸ Copying RCTEventDispatcherProtocol.h
1612:  ▸ Copying RCTEventDispatcher.h
1613:  ▸ Copying RCTEventAnimation.h
1614:  ▸ Copying RCTErrorInfo.h
1615:  ▸ Copying RCTErrorCustomizer.h
1616:  ▸ Copying RCTDynamicTypeRamp.h
...

1857:  ▸ Compiling SocketRocket-dummy.m
1858:  ▸ Compiling SRWebSocket.m
1859:  ▸ Compiling SRURLUtilities.m
1860:  ▸ Compiling SRSecurityPolicy.m
1861:  ▸ Compiling SRSIMDHelpers.m
1862:  ▸ Compiling SRRunLoopThread.m
1863:  ▸ Compiling SRRandom.m
1864:  ▸ Compiling SRProxyConnect.m
1865:  ▸ Compiling SRPinningSecurityPolicy.m
1866:  ▸ Compiling SRMutex.m
1867:  ▸ Compiling SRLog.m
1868:  ▸ Compiling SRIOConsumerPool.m
1869:  ▸ Compiling SRIOConsumer.m
1870:  ▸ Compiling SRHash.m
1871:  ▸ Compiling SRHTTPConnectMessage.m
1872:  ▸ Compiling SRError.m
1873:  ▸ Compiling SRDelegateController.m
...

2155:  ▸ Compiling RNCSafeAreaViewMode.m
2156:  ▸ Compiling RNCSafeAreaViewManager.m
2157:  ▸ Compiling RNCSafeAreaViewLocalData.m
2158:  ▸ Compiling RNCSafeAreaViewEdges.m
2159:  ▸ Compiling RNCSafeAreaViewEdgeMode.m
2160:  ▸ Compiling RNCSafeAreaView.m
2161:  ▸ Compiling RNCSafeAreaUtils.m
2162:  ▸ Compiling RNCSafeAreaShadowView.m
2163:  ▸ Compiling RNCSafeAreaProviderManager.m
2164:  ▸ Compiling RNCSafeAreaProvider.m
2165:  ▸ Compiling RNCOnInsetsChangeEvent.m
2166:  ▸ Compiling RCTText_vers.c
2167:  ▸ Compiling React-RCTText-dummy.m
2168:  ▸ Touching ReactCommon.framework (in target 'ReactCommon' from project 'Pods')
2169:  ▸ Touching React_graphics.framework (in target 'React-graphics' from project 'Pods')
2170:  ▸ Processing React-jserrorhandler-Info.plist
2171:  ▸ Compiling StackTraceParser.cpp
2172:  ▸ Compiling JsErrorHandler.cpp
2173:  ▸ Compiling NSTextStorage+FontScaling.m
2174:  ▸ Compiling React_jserrorhandler_vers.c
2175:  ▸ Compiling React-jserrorhandler-dummy.m
2176:  ▸ Compiling RCTUtils.mm
...

2265:  ▸ Compiling RCTModalManager.m
2266:  ▸ Compiling RCTModalHostViewManager.m
2267:  ▸ Compiling RCTModalHostViewController.m
2268:  ▸ Compiling RCTModalHostView.m
2269:  ▸ Compiling RCTLayoutAnimationGroup.m
2270:  ▸ Compiling RCTLayoutAnimation.m
2271:  ▸ Compiling RCTLayout.m
2272:  ▸ Compiling RCTKeyCommands.m
2273:  ▸ Compiling RCTJSThread.m
2274:  ▸ Compiling RCTJSStackFrame.m
2275:  ▸ Compiling RCTImageSource.m
2276:  ▸ Compiling RCTI18nUtil.m
2277:  ▸ Compiling RCTFrameUpdate.m
2278:  ▸ Compiling RCTEventEmitter.m
2279:  ▸ Compiling RCTEventDispatcher.m
2280:  ▸ Compiling RCTErrorInfo.m
2281:  ▸ Compiling RCTDisplayLink.m
...

2287:  ▸ Compiling RCTConstants.m
2288:  ▸ Compiling RCTConvert+CoreLocation.m
2289:  ▸ Compiling RCTComponentEvent.m
2290:  ▸ Compiling RCTCallableJSModules.m
2291:  ▸ Compiling RCTBundleManager.m
2292:  ▸ Compiling RCTBridgeModuleDecorator.m
2293:  ▸ Compiling RCTBridgeConstants.m
2294:  ▸ Compiling RCTBorderDrawing.m
2295:  ▸ Compiling RCTAssert.m
2296:  ▸ Compiling RCTActivityIndicatorViewManager.m
2297:  ▸ Compiling RCTActivityIndicatorView.m
2298:  ▸ Running script 'Create Symlinks to Header Folders'
2299:  ▸ Compiling RCTTypedModuleConstants.mm
2300:  ▸ Compiling RCTConvertHelpers.mm
2301:  ▸ Compiling RCTTypeSafety_vers.c
2302:  ▸ Touching React_jserrorhandler.framework (in target 'React-jserrorhandler' from project 'Pods')
2303:  ▸ Touching React.framework (in target 'React-Core' from project 'Pods')
...

2821:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/EventEmitters.cpp (in target 'ReactCodegen' from project 'Pods')
2822:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/Props.cpp (in target 'ReactCodegen' from project 'Pods')
2823:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/Props.cpp (in target 'ReactCodegen' from project 'Pods')
2824:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/Props.cpp (in target 'ReactCodegen' from project 'Pods')
2825:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/ShadowNodes.cpp (in target 'ReactCodegen' from project 'Pods')
2826:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/ShadowNodes.cpp (in target 'ReactCodegen' from project 'Pods')
2827:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/ShadowNodes.cpp (in target 'ReactCodegen' from project 'Pods')
2828:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/States.cpp (in target 'ReactCodegen' from project 'Pods')
2829:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/States.cpp (in target 'ReactCodegen' from project 'Pods')
2830:  Skipping duplicate build file in Compile Sources build phase: /Users/runner/work/react-native-sdk/react-native-sdk/sample/ios/build/generated/ios/react/renderer/components/safeareacontext/States.cpp (in target 'ReactCodegen' from project 'Pods')
2831:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-utils' from project 'Pods')
2832:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-runtimescheduler' from project 'Pods')
2833:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-runtimeexecutor' from project 'Pods')
2834:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-rendererdebug' from project 'Pods')
2835:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-renderercss' from project 'Pods')
2836:  Testing failed:
2837:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-rendererconsistency' from project 'Pods')
2838:  Cannot find type 'GppSectionChangePayload' in scope
2839:  Cannot find type 'GppSectionChangePayload' in scope
2840:  Cannot find type 'GppSectionChangePayload' in scope
2841:  Cannot find type 'GppSectionChangePayload' in scope
2842:  Cannot find type 'GppSectionChangePayload' in scope
2843:  Cannot find type 'GppSectionChangePayload' in scope
2844:  Command SwiftCompile failed with a nonzero exit code
2845:  Testing cancelled because the build failed.
2846:  ** TEST FAILED **
2847:  The following build commands failed:
2848:  EmitSwiftModule normal arm64 (in target 'react-native-usercentrics' from project 'Pods')
2849:  SwiftEmitModule normal arm64 Emitting\ module\ for\ react_native_usercentrics (in target 'react-native-usercentrics' from project 'Pods')
2850:  SwiftCompile normal arm64 Compiling\ UsercentricsConsentType+Int.swift,\ UsercentricsManager.swift,\ UsercentricsOptions+Dict.swift,\ UsercentricsServiceConsents+Dict.swift,\ UsercentricsUserInteraction+String.swift,\ UserDecision+Dict.swift,\ UserResponse+Dict.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Extensions/UsercentricsConsentType+Int.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Manager/UsercentricsManager.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Extensions/UsercentricsOptions+Dict.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Extensions/UsercentricsServiceConsents+Dict.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Extensions/UsercentricsUserInteraction+String.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Extensions/UserDecision+Dict.swift /Users/runner/work/react-native-sdk/react-native-sdk/ios/Extensions/UserResponse+Dict.swift (in target 'react-native-usercentrics' from project 'Pods')
2851:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-performancetimeline' from project 'Pods')
2852:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-microtasksnativemodule' from project 'Pods')
2853:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-jsitooling' from project 'Pods')
2854:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-jsinspectortracing' from project 'Pods')
2855:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-jsinspectornetwork' from project 'Pods')
2856:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-jsinspectorcdp' from project 'Pods')
2857:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-jserrorhandler' from project 'Pods')
2858:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-idlecallbacksnativemodule' from project 'Pods')
...

2863:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-defaultsnativemodule' from project 'Pods')
2864:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-debug' from project 'Pods')
2865:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-RuntimeHermes' from project 'Pods')
2866:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-RuntimeCore' from project 'Pods')
2867:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-RuntimeApple' from project 'Pods')
2868:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-RCTRuntime' from project 'Pods')
2869:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-RCTFBReactNativeSpec' from project 'Pods')
2870:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-NativeModulesApple' from project 'Pods')
2871:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-Mapbuffer' from project 'Pods')
2872:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-ImageManager' from project 'Pods')
2873:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-FabricImage' from project 'Pods')
2874:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-FabricComponents' from project 'Pods')
2875:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'React-Fabric' from project 'Pods')
2876:  Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this issue, either add output dependencies to the script phase, or configure it to run in every build by unchecking "Based on dependency analysis" in the script phase. (in target 'RCT-Folly' from project 'Pods')
2877:  Testing workspace sample with scheme sample
2878:  (4 failures)
2879:  ##[error]Process completed with exit code 65.
2880:  ##[group]Run actions/upload-artifact@v4

@codeant-ai
Copy link

codeant-ai bot commented Mar 20, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:L This PR changes 100-499 lines, ignoring generated files and removed size:L This PR changes 100-499 lines, ignoring generated files labels Mar 20, 2026
@codeant-ai
Copy link

codeant-ai bot commented Mar 20, 2026

CodeAnt AI Incremental review completed.

@uc-brunosouza uc-brunosouza merged commit 1af79ef into master Mar 20, 2026
2 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants