Skip to content

Release 0.24.0#40

Merged
predatorx7 merged 3 commits into
mainfrom
pre-0.24.0
Nov 24, 2025
Merged

Release 0.24.0#40
predatorx7 merged 3 commits into
mainfrom
pre-0.24.0

Conversation

@predatorx7
Copy link
Copy Markdown
Collaborator

@predatorx7 predatorx7 commented Nov 23, 2025

Summary by CodeRabbit

  • New Features

    • Added console-logging control and a public API to enable/disable it; session update events now include metadata.
  • Bug Fixes

    • Fixed repository/discussion links and bumped package & SDK versions.
  • Documentation

    • Updated installation, migration, contributing guides, added troubleshooting and a v0.24.0 changelog entry.
  • Chores

    • Upgraded Node/Yarn/tooling, refreshed CI/workflow and caching, simplified Android/iOS example configs, and cleaned ignore/build artifacts.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Nov 23, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

This PR updates SDK and tooling to v0.24.0, adds a cross-platform setConsoleLogging API (JS/Android/iOS), consolidates package/namespace names to inapprnsdk, removes new‑architecture conditional logic, overhauls CI/build configs and caching, and updates docs and example workspace files.

Changes

Cohort / File(s) Summary
Repository & Tooling
​.gitattributes, .nvmrc, .yarnrc.yml, package.json, tsconfig.json, tsconfig.build.json, turbo.json, .gitignore, CHANGELOG.md, CONTRIBUTING.md, lefthook.yml
Version/tooling updates (Node/Yarn/Gradle/TS/Turbo), package.json restructure and version bump to 0.24.0, .gitattributes tweak, .gitignore changes, changelog and contributing edits, and removal of lefthook config.
CI / GitHub Actions & Templates
.github/workflows/ci.yml, .github/actions/setup/action.yml, .github/ISSUE_TEMPLATE/bug_report.yml, .github/ISSUE_TEMPLATE/config.yml
Adds composite setup action and full CI workflow with advanced caching/Turbo logic; minor issue template render addition and URL fixes.
TypeScript / Lint / Babel
eslint.config.mjs, babel.config.js, user-workspace/babel.config.js
New Flat ESLint config, Babel presets overridden to handle node_modules differently, removal of some example babel plugins.
JS API Surface
src/NativeInappRnSdk.ts, src/index.tsx
Adds SetConsoleLoggingOptions and setConsoleLogging to spec and ReclaimVerification, updates emitter typings to CodegenTypes, adds metadata to session update events, and implements PlatformImpl console-logging call with error wrapping.
Android Build & Native
android/build.gradle, android/gradle/wrapper/..., android/src/main/AndroidManifest.xml, android/src/main/java/com/reclaimprotocol/inapprnsdk/*, react-native.config.js
Remove dynamic storage repos and new-arch conditionals, hardcode namespace com.reclaimprotocol.inapprnsdk, bump in-app SDK to 0.24.0, gradle wrapper/property updates, package rename, added Kotlin native method setConsoleLogging, and deletion of react-native.config.js export.
iOS Build & Native
InappRnSdk.podspec, ios/InappRnSdk.h, ios/InappRnSdk.mm, ios/inapp_rn_sdk/Api.swift, ios/InappRnSdk-Bridging-Header.h
Podspec dependency bumped to ~> 0.24.0 and header/path adjustments; migrate to spec-based native interface; add ObjC moduleName and bridge setConsoleLogging; add Swift async setConsoleLogging; remove bridging header.
Example / User Workspace
user-workspace/package.json, user-workspace/src/*, user-workspace/android/*, user-workspace/ios/*, user-workspace/metro.config.js
Example rename and dependency upgrades (React/RN), env moves from @env to env.json, AppDelegate refactor to UIApplicationDelegate + ReactNativeDelegate, Podfile pre_install removal, android namespace/appId updates, added INTERNET permission, Gradle/tooling bumps, removal of demo override app.
Samples & Scripts
samples/*/android/build.gradle, samples/*/package.json, user-workspace/* scripts
Adds local Maven repo entries in some samples, bumps sample dependency to ^0.21.0, adds gen:ios/gen:android scripts and simplifies build:ios.
Docs & Migration
documentation/*.md, migration.md, CHANGELOG.md
Docs updated for v0.24.0, install/migration docs updated with new pod versions and new iOS XCScheme troubleshooting notes.
Misc
eslint.config.mjs, babel.config.js, metro.config.js, various minor files
Misc config reshuffles, Metro config migration for monorepo, removal/addition of small files across workspaces.

Sequence Diagram(s)

sequenceDiagram
    participant JS as JavaScript
    participant Platform as PlatformImpl
    participant Native as NativeModule (Bridge/JSI)
    participant SDK as ReclaimInAppSdk (native)

    JS->>Platform: setConsoleLogging({ enabled })
    activate Platform
    Platform->>Native: setConsoleLogging({ enabled: boolean })
    activate Native
    Native->>SDK: ReclaimVerification.setConsoleLogging(enabled)
    activate SDK
    SDK-->>Native: success / error
    deactivate SDK
    alt success
        Native-->>Platform: resolve
    else error
        Native-->>Platform: reject (wrapped as ReclaimPlatformException)
    end
    deactivate Native
    Platform-->>JS: Promise<void> resolved/rejected
    deactivate Platform
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Focus review on:

  • CI workflow and Turbo/cache conditional logic across Android/iOS jobs.
  • Cross-platform implementation of setConsoleLogging (JS typings, Android Kotlin, iOS ObjC/Swift) and error mapping.
  • Android/iOS package/namespace renames and build config removals (new-arch conditionals, generated sources).
  • Example AppDelegate refactor and removed Podfile pre_install/codegen step.
  • package.json and tooling upgrades (Yarn 4, Node pin, ESLint/Babel changes).

Possibly related PRs

Suggested reviewers

  • Karam19
  • Sajjad21990
  • ChinmayMhatre

"🐰 Hop, skip, and refactor—I've leapt with cheer,
From 0.18 to 0.24, the logs appear;
Names aligned and CI now sings,
Console set, new builds take wing. ✨"

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'Release 0.24.0' directly reflects the main objective, which is to release version 0.24.0 of the SDK as evident from comprehensive version bumps throughout the changeset.

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f81aabf and 184edfd.

📒 Files selected for processing (1)
  • samples/example_new_arch/package.json (1 hunks)

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.

Copy link
Copy Markdown

@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: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
user-workspace/src/App.tsx (1)

55-88: Replace console.assert() with early validation to prevent SDK errors with missing credentials

The code at lines 66-67 of user-workspace/src/App.tsx uses console.assert() which does not prevent execution in production—it only logs in development. The code then proceeds to call reclaimVerification.startVerification() with potentially empty credentials (lines 80-81 use ?? '' fallback), which will trigger an SDK error instead of providing clear feedback to the user.

Implement the suggested fix to validate config values before proceeding:

case 'providerId':
  if (!config.REACT_APP_RECLAIM_APP_ID || !config.REACT_APP_RECLAIM_APP_SECRET) {
    Snackbar.show({
      text: 'Configure REACT_APP_RECLAIM_APP_ID and REACT_APP_RECLAIM_APP_SECRET in .env.json',
      duration: Snackbar.LENGTH_LONG,
    });
    return;
  }
  break;

This matches the error-handling pattern used elsewhere in the file (e.g., inputText validation at lines 56-62) and prevents confusing runtime errors from the SDK.

Note: The same pattern exists in samples/example_expo/app/(home)/_layout.tsx, samples/example_new_arch/src/App.tsx, and samples/example_new_arch/src/App.overrides.tsx—consider applying the fix consistently across all example files as well.

ios/inapp_rn_sdk/Api.swift (1)

588-618: Missing metadata forwarding and unsafe force-unwrap.

Two issues to consider:

  1. The metadata parameter (line 591) is received but not forwarded to _updateSession. If the SDK provides session metadata, it won't reach the React Native callback.

  2. The force-unwrap of statusString! on line 618 will crash if a future SDK version adds a new enum case that isn't handled in the switch.

Consider adding a default case and forwarding metadata:

       case .AI_PROOF_SUBMITTED:
         statusString = "AI_PROOF_SUBMITTED"
+      @unknown default:
+        statusString = "UNKNOWN"
       }
       let replyId = Api.setReplyCallback(completion)
-      self._updateSession(sessionId, statusString!, replyId)
+      self._updateSession(sessionId, statusString ?? "UNKNOWN", replyId)
🧹 Nitpick comments (17)
user-workspace/Gemfile (1)

4-4: Ruby 3.4 compatibility update looks good; address gem ordering convention.

The Ruby version bump to >= 3.4.7 and the addition of stdlib replacement gems (bigdecimal, logger, benchmark, mutex_m, nkf) are appropriate for Ruby 3.4 compatibility. The explanatory comment on line 12 clearly documents the reason.

However, RuboCop's Bundler/OrderedGems rule flags alphabetical ordering violations in the gem entries. Per coding conventions, reorder the gems alphabetically within their sections.

Apply this diff to sort gems alphabetically:

-gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
-gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
-gem 'xcodeproj', '< 1.26.0'
-gem 'concurrent-ruby', '< 1.3.4'
+gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
+gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
+gem 'concurrent-ruby', '< 1.3.4'
+gem 'xcodeproj', '< 1.26.0'

 # Ruby 3.4.0 has removed some libraries from the standard library.
-gem 'bigdecimal'
-gem 'logger'
 gem 'benchmark'
+gem 'bigdecimal'
+gem 'logger'
 gem 'mutex_m'
 # Added gem 'nkf' to provide kconv functionality which was removed from Ruby 3.4 standard library.
 gem 'nkf'

As per coding guidelines and RuboCop's Bundler/OrderedGems rule.

Also applies to: 12-18

samples/example_expo/package.json (1)

16-46: Confirm sample depends on the intended SDK version

The sample now pins @reclaimprotocol/inapp-rn-sdk to ^0.21.0, while this repo is preparing a 0.24.0 release. If the NPM package will also be 0.24.x, you may want the sample to track that (^0.24.0) so users test against the latest public SDK.

If 0.21.x is intentionally the latest published NPM version for now, consider leaving a short comment in the README or sample to avoid confusion.

samples/example_new_arch/package.json (1)

13-18: Align new‑arch sample SDK version with the main release

This sample also targets @reclaimprotocol/inapp-rn-sdk ^0.21.0. Given the repo is releasing 0.24.0, consider whether these examples should instead track ^0.24.0 so both samples and docs line up with the advertised release.

If 0.21.x is intentionally the latest published NPM version for now, keeping both samples on ^0.21.0 is fine—just worth confirming.

tsconfig.build.json (1)

3-3: Verify build scope after relaxing exclude.

tsconfig.build.json now only excludes example and lib, so any TS files under samples or user-workspace (if present) will be part of the build. That may be desired for type coverage, but it can also pull consumer/sample code into the library build or surface unrelated TS errors.

Consider re‑excluding those directories if they are meant to stay out of the library build, or confirm that your build and CI behave as expected with the broader scope.

user-workspace/android/gradlew.bat (1)

1-4: Wrapper changes look fine; -classpath is redundant with -jar.

  • Adding the MIT header and explicitly clearing CLASSPATH before launching Java both look good.
  • Invoking the wrapper via -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" is a standard pattern; the extra -classpath "%CLASSPATH%" is unnecessary but not harmful because java -jar ignores the classpath.

If you want to simplify, you can drop the -classpath portion and just rely on -jar.

Also applies to: 78-82

.gitignore (1)

46-52: Ignore patterns align with pods, vendor, and codegen outputs.

The new entries for example/*/Pods and example/vendor/, the global *.tgz ignore, and the ios/generated / android/generated ignores are consistent with keeping dependency artifacts and generated code out of version control.

Just ensure that any generated folders you rely on in published packages are not among these ignored paths; otherwise, this looks good.

Also applies to: 82-86

user-workspace/android/gradlew (1)

90-90: Wrapper -jar usage is fine; CLASSPATH handling is now mostly redundant.

The changes to compute APP_HOME, initialize CLASSPATH, and invoke:

-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar"

are a valid way to start the Gradle wrapper and should work across supported environments.

Given that java -jar ignores the classpath, both the CLASSPATH variable and the -classpath "$CLASSPATH" argument are effectively unused now. You can keep them (harmless) or simplify the script later by removing the classpath bits to stay closer to Gradle’s stock template.

Also applies to: 117-117, 207-217

babel.config.js (1)

2-11: Make node_modules regex robust across OSes

/\/node_modules\// depends on forward slashes; on Windows paths using backslashes it may not match as intended. Consider a cross‑platform pattern instead:

-      exclude: /\/node_modules\//,
+      exclude: /node_modules[\\/]/,
...
-      include: /\/node_modules\//,
+      include: /node_modules[\\/]/,

This should behave the same on macOS/Linux while also covering Windows path separators.

documentation/install-expo.md (1)

70-92: Minor iOS section wording/capitalization tweaks

A couple of small polish items:

  • Prefer the platform’s spelling iOS instead of IOS in the heading.
  • Consider clarifying that this XCScheme env var change is only needed when you hit the specific performance issue, to avoid users thinking it’s always required.

For example:

-### IOS XCScheme Configuration
+### iOS XCScheme configuration
android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkModule.kt (1)

234-252: Clarify behavior when enabled is missing or args is null

Implementation is consistent with other bridge methods and uses runOnUiQueueThread + onPlatformException, which is good. The only subtle point is how missing input is handled:

val enabled = if (args != null) (getBoolean(args, "enabled") == true) else false

If args is null or doesn’t contain enabled, this silently disables console logging (enabled = false) and still resolves successfully. If the JS/TS API is meant to require enabled, you may want to fail fast instead of defaulting to false.

For example:

-  ) {
-    val enabled = if (args != null) (getBoolean(args, "enabled") == true) else false
+  ) {
+    if (args == null || getBoolean(args, "enabled") == null) {
+      promise?.reject(IllegalArgumentException("Missing 'enabled' flag for setConsoleLogging"))
+      return
+    }
+    val enabled = getBoolean(args, "enabled") == true

This makes incorrect usage visible to callers instead of silently changing logging behavior.

.github/actions/setup/action.yml (1)

1-36: Consider running yarn install --immutable even on cache hits

The composite action is well structured (pinned actions, sensible cache key, restore/save split). One potential improvement: you currently skip yarn install --immutable entirely on any cache hit:

- if: steps.yarn-cache.outputs.cache-hit != 'true'

Even with a cache hit, a fast yarn install --immutable helps guarantee that node_modules exactly matches yarn.lock and catches drift early. You could remove the if (or relax it) on the install step and keep the if only on the cache/save step.

This trades a bit of runtime for stronger reproducibility and fewer “works with stale cache” surprises.

user-workspace/src/App.tsx (1)

22-25: Clarify .env.json usage and avoid accidentally shipping secrets

Switching to a JSON config for the example makes local setup straightforward, but the comments could better emphasize scope and location, and you should ensure this file isn’t checked in with real secrets.

Consider tightening the comments and clarifying it’s for local/testing only:

-// Duplicate ./.env.example.json to ./.env.json and enter your reclaim app id & secrets
-// Note: reclaim app id & secrets is not needed if you start verification at backend 
+// Duplicate `.env.example.json` to `.env.json` in this directory and enter your Reclaim app id & secret for local testing only.
+// Note: For production, prefer backend-initiated verification and avoid shipping app secrets in the bundled app.

Also, make sure your TypeScript/Metro config supports JSON imports (e.g. resolveJsonModule in tsconfig.json) so import config from './.env.json'; type‑checks cleanly.

ios/InappRnSdk.mm (1)

416-428: setConsoleLogging bridge wiring looks correct; consider aligning error code naming

The new setConsoleLogging bridge cleanly forwards the enabled flag to the API and mirrors the completion‑handler pattern used elsewhere; that part looks good.

For consistency with other methods (VERIFICATION_ERROR, OVERRIDE_ERROR, VERIFICATION_OPTIONS_ERROR), you might want to standardize the error code string, e.g.:

-                      reject(@"SET_CONSOLE_LOGGING",
-                             @"Error on setting console logging", error);
+                      reject(@"SET_CONSOLE_LOGGING_ERROR",
+                             @"Error on setting console logging", error);

Also worth double‑checking that the spec type SetConsoleLoggingOptions always provides a non‑optional enabled so args.enabled() can’t be absent.

.github/workflows/ci.yml (1)

81-87: Turbo cache detection is clever but fragile.

The approach works, but parsing Turbo's JSON output with node -p is fragile. If the output structure changes in a Turbo upgrade, the detection will silently fail (returning undefined instead of "HIT"), causing unnecessary rebuilds rather than errors.

Consider adding error handling or a fallback:

      - name: Check turborepo cache for Android
        run: |
-         TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:android').cache.status")
+         TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:android')?.cache?.status || 'MISS'")

          if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then
            echo "turbo_cache_hit=1" >> $GITHUB_ENV
          fi
src/index.tsx (1)

63-70: Redundant boolean coercion.

The enabled == true coercion is applied in the public API (line 68) even though enabled is already typed as boolean. This is defensive but redundant. The same pattern is repeated in PlatformImpl.setConsoleLogging (line 670).

Consider simplifying since the parameter is already typed:

  public setConsoleLogging(
    enabled: boolean
  ) {
    return this.platform.setConsoleLogging({
-     enabled: enabled == true,
+     enabled,
    });
  }
src/NativeInappRnSdk.ts (2)

300-317: Re‑evaluate SessionUpdateRequestEvent.metadata nullability

metadata is now a required string on SessionUpdateRequestEvent. If some update events don’t include metadata (or older native SDKs don’t populate it), this will be undefined at runtime despite the non‑nullable type. Consider making it optional/nullable (e.g. metadata?: string | null) or ensuring the native layer always sends a non‑empty JSON string, and document that guarantee.


365-367: setConsoleLogging API shape looks consistent; optional arg would be a small DX win

The SetConsoleLoggingOptions shape and setConsoleLogging(args: SetConsoleLoggingOptions): Promise<void> signature are coherent and align with the public wrapper API. If you foresee calls without explicit options (or want symmetry with other …Options patterns that allow null/undefined), you could relax this to args?: SetConsoleLoggingOptions | null, but that’s a nice‑to‑have, not a blocker.

Also applies to: 384-384

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e876efb and d89e017.

⛔ Files ignored due to path filters (19)
  • .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs is excluded by !**/.yarn/**
  • .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs is excluded by !**/.yarn/**
  • .yarn/releases/yarn-3.6.1.cjs is excluded by !**/.yarn/**
  • .yarn/releases/yarn-4.11.0.cjs is excluded by !**/.yarn/**
  • android/generated/java/com/reclaimprotocol/inapp_rn_sdk/NativeInappRnSdkSpec.java is excluded by !**/generated/**
  • android/generated/jni/CMakeLists.txt is excluded by !**/generated/**
  • android/generated/jni/RNInappRnSdkSpec-generated.cpp is excluded by !**/generated/**
  • android/generated/jni/RNInappRnSdkSpec.h is excluded by !**/generated/**
  • android/generated/jni/react/renderer/components/RNInappRnSdkSpec/RNInappRnSdkSpecJSI-generated.cpp is excluded by !**/generated/**
  • android/generated/jni/react/renderer/components/RNInappRnSdkSpec/RNInappRnSdkSpecJSI.h is excluded by !**/generated/**
  • android/gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • ios/generated/RNInappRnSdkSpec/RNInappRnSdkSpec-generated.mm is excluded by !**/generated/**
  • ios/generated/RNInappRnSdkSpec/RNInappRnSdkSpec.h is excluded by !**/generated/**
  • ios/generated/RNInappRnSdkSpecJSI-generated.cpp is excluded by !**/generated/**
  • ios/generated/RNInappRnSdkSpecJSI.h is excluded by !**/generated/**
  • user-workspace/Gemfile.lock is excluded by !**/*.lock
  • user-workspace/android/gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • user-workspace/ios/Podfile.lock is excluded by !**/*.lock
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (69)
  • .gitattributes (1 hunks)
  • .github/ISSUE_TEMPLATE/bug_report.yml (1 hunks)
  • .github/ISSUE_TEMPLATE/config.yml (1 hunks)
  • .github/actions/setup/action.yml (1 hunks)
  • .github/workflows/ci.yml (1 hunks)
  • .gitignore (2 hunks)
  • .nvmrc (1 hunks)
  • .yarnrc.yml (1 hunks)
  • CHANGELOG.md (1 hunks)
  • CONTRIBUTING.md (3 hunks)
  • InappRnSdk.podspec (1 hunks)
  • android/build.gradle (4 hunks)
  • android/gradle/wrapper/gradle-wrapper.properties (0 hunks)
  • android/gradlew (0 hunks)
  • android/gradlew.bat (0 hunks)
  • android/src/main/AndroidManifest.xml (1 hunks)
  • android/src/main/AndroidManifestNew.xml (0 hunks)
  • android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkModule.kt (2 hunks)
  • android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkPackage.kt (1 hunks)
  • android/src/main/java/com/reclaimprotocol/inapprnsdk/JsonExtension.kt (1 hunks)
  • babel.config.js (1 hunks)
  • documentation/install-expo.md (2 hunks)
  • documentation/install-no-framework.md (3 hunks)
  • documentation/migration.md (3 hunks)
  • eslint.config.mjs (1 hunks)
  • ios/InappRnSdk-Bridging-Header.h (0 hunks)
  • ios/InappRnSdk.h (1 hunks)
  • ios/InappRnSdk.mm (2 hunks)
  • ios/inapp_rn_sdk/Api.swift (3 hunks)
  • lefthook.yml (0 hunks)
  • package.json (5 hunks)
  • react-native.config.js (0 hunks)
  • samples/example_expo/android/build.gradle (1 hunks)
  • samples/example_expo/package.json (1 hunks)
  • samples/example_new_arch/android/build.gradle (1 hunks)
  • samples/example_new_arch/android/settings.gradle (1 hunks)
  • samples/example_new_arch/package.json (1 hunks)
  • src/NativeInappRnSdk.ts (4 hunks)
  • src/index.tsx (5 hunks)
  • tsconfig.build.json (1 hunks)
  • tsconfig.json (2 hunks)
  • turbo.json (2 hunks)
  • user-workspace/.env.example (0 hunks)
  • user-workspace/.gitignore (1 hunks)
  • user-workspace/Gemfile (1 hunks)
  • user-workspace/__mocks__/react-native-snackbar.js (0 hunks)
  • user-workspace/android/.gitignore (0 hunks)
  • user-workspace/android/app/build.gradle (1 hunks)
  • user-workspace/android/app/src/main/AndroidManifest.xml (1 hunks)
  • user-workspace/android/app/src/main/java/reclaimprotocol/inapprnsdk/example/MainActivity.kt (1 hunks)
  • user-workspace/android/app/src/main/java/reclaimprotocol/inapprnsdk/example/MainApplication.kt (2 hunks)
  • user-workspace/android/build.gradle (1 hunks)
  • user-workspace/android/gradle.properties (1 hunks)
  • user-workspace/android/gradle/wrapper/gradle-wrapper.properties (1 hunks)
  • user-workspace/android/gradlew (3 hunks)
  • user-workspace/android/gradlew.bat (2 hunks)
  • user-workspace/android/settings.gradle (1 hunks)
  • user-workspace/babel.config.js (0 hunks)
  • user-workspace/ios/InappRnSdkExample.xcodeproj/project.pbxproj (11 hunks)
  • user-workspace/ios/InappRnSdkExample.xcodeproj/xcshareddata/xcschemes/InappRnSdkExample.xcscheme (0 hunks)
  • user-workspace/ios/InappRnSdkExample/AppDelegate.swift (1 hunks)
  • user-workspace/ios/InappRnSdkExample/Info.plist (1 hunks)
  • user-workspace/ios/Podfile (0 hunks)
  • user-workspace/metro.config.js (2 hunks)
  • user-workspace/package.json (1 hunks)
  • user-workspace/src/.env.example.json (1 hunks)
  • user-workspace/src/App.overrides.tsx (0 hunks)
  • user-workspace/src/App.tsx (1 hunks)
  • user-workspace/src/env.d.ts (0 hunks)
💤 Files with no reviewable changes (15)
  • android/gradle/wrapper/gradle-wrapper.properties
  • lefthook.yml
  • android/gradlew
  • user-workspace/mocks/react-native-snackbar.js
  • user-workspace/src/env.d.ts
  • android/src/main/AndroidManifestNew.xml
  • user-workspace/.env.example
  • android/gradlew.bat
  • react-native.config.js
  • user-workspace/src/App.overrides.tsx
  • user-workspace/android/.gitignore
  • user-workspace/ios/InappRnSdkExample.xcodeproj/xcshareddata/xcschemes/InappRnSdkExample.xcscheme
  • user-workspace/ios/Podfile
  • ios/InappRnSdk-Bridging-Header.h
  • user-workspace/babel.config.js
🧰 Additional context used
🧬 Code graph analysis (4)
eslint.config.mjs (2)
user-workspace/metro.config.js (1)
  • path (1-1)
user-workspace/babel.config.js (1)
  • path (1-1)
src/NativeInappRnSdk.ts (3)
src/index.tsx (1)
  • SetConsoleLoggingOptions (179-180)
android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkModule.kt (1)
  • reply (420-433)
ios/inapp_rn_sdk/Api.swift (1)
  • reply (21-35)
src/index.tsx (1)
src/NativeInappRnSdk.ts (1)
  • SetConsoleLoggingOptions (365-367)
ios/inapp_rn_sdk/Api.swift (2)
android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkModule.kt (1)
  • setConsoleLogging (234-252)
src/index.tsx (3)
  • setConsoleLogging (64-70)
  • setConsoleLogging (665-678)
  • ReclaimVerification (12-71)
🪛 actionlint (1.7.8)
.github/workflows/ci.yml

157-157: property "cocoapods-cache" is not defined in object type {}

(expression)

🪛 Clang (14.0.6)
ios/InappRnSdk.h

[error] 1-1: 'Foundation/Foundation.h' file not found

(clang-diagnostic-error)

🪛 dotenv-linter (4.0.0)
user-workspace/src/.env.example.json

[warning] 1-1: [KeyWithoutValue] The { key should be with a value or have an equal sign

(KeyWithoutValue)


[warning] 1-1: [LeadingCharacter] Invalid leading character detected

(LeadingCharacter)


[warning] 2-2: [IncorrectDelimiter] The "REACT_APP_RECLAIM_APP_ID": "", key has incorrect delimiter

(IncorrectDelimiter)


[warning] 2-2: [KeyWithoutValue] The "REACT_APP_RECLAIM_APP_ID": "", key should be with a value or have an equal sign

(KeyWithoutValue)


[warning] 2-2: [LeadingCharacter] Invalid leading character detected

(LeadingCharacter)


[warning] 2-2: [UnorderedKey] The "REACT_APP_RECLAIM_APP_ID": "", key should go before the { key

(UnorderedKey)


[warning] 3-3: [IncorrectDelimiter] The "REACT_APP_RECLAIM_APP_SECRET": "", key has incorrect delimiter

(IncorrectDelimiter)


[warning] 3-3: [KeyWithoutValue] The "REACT_APP_RECLAIM_APP_SECRET": "", key should be with a value or have an equal sign

(KeyWithoutValue)


[warning] 3-3: [LeadingCharacter] Invalid leading character detected

(LeadingCharacter)


[warning] 3-3: [UnorderedKey] The "REACT_APP_RECLAIM_APP_SECRET": "", key should go before the { key

(UnorderedKey)


[warning] 4-4: [IncorrectDelimiter] The "REACT_APP_RECLAIM_CAPABILITY_ACCESS_TOKEN": "" key has incorrect delimiter

(IncorrectDelimiter)


[warning] 4-4: [KeyWithoutValue] The "REACT_APP_RECLAIM_CAPABILITY_ACCESS_TOKEN": "" key should be with a value or have an equal sign

(KeyWithoutValue)


[warning] 4-4: [LeadingCharacter] Invalid leading character detected

(LeadingCharacter)


[warning] 4-4: [UnorderedKey] The "REACT_APP_RECLAIM_CAPABILITY_ACCESS_TOKEN": "" key should go before the { key

(UnorderedKey)


[warning] 5-5: [EndingBlankLine] No blank line at the end of the file

(EndingBlankLine)


[warning] 5-5: [KeyWithoutValue] The } key should be with a value or have an equal sign

(KeyWithoutValue)


[warning] 5-5: [LeadingCharacter] Invalid leading character detected

(LeadingCharacter)

🪛 LanguageTool
documentation/migration.md

[grammar] ~5-~5: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~11-~11: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~17-~17: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~23-~23: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~29-~29: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~35-~35: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~41-~41: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~49-~49: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~128-~128: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~167-~167: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

documentation/install-expo.md

[style] ~102-~102: ‘In the meantime’ might be wordy. Consider a shorter alternative.
Context: ...tigating this issue to find a solution. In the meantime, we recommend temporarily removing expo...

(EN_WORDINESS_PREMIUM_IN_THE_MEANTIME)

🪛 markdownlint-cli2 (0.18.1)
documentation/migration.md

7-7: Bare URL used

(MD034, no-bare-urls)


13-13: Bare URL used

(MD034, no-bare-urls)


19-19: Bare URL used

(MD034, no-bare-urls)


25-25: Bare URL used

(MD034, no-bare-urls)


31-31: Bare URL used

(MD034, no-bare-urls)


37-37: Bare URL used

(MD034, no-bare-urls)


43-43: Bare URL used

(MD034, no-bare-urls)

🪛 RuboCop (1.81.7)
user-workspace/Gemfile

[convention] 8-8: Gems should be sorted in an alphabetical order within their section of the Gemfile. Gem activesupport should appear before cocoapods.

(Bundler/OrderedGems)


[convention] 10-10: Gems should be sorted in an alphabetical order within their section of the Gemfile. Gem concurrent-ruby should appear before xcodeproj.

(Bundler/OrderedGems)


[convention] 15-15: Gems should be sorted in an alphabetical order within their section of the Gemfile. Gem benchmark should appear before logger.

(Bundler/OrderedGems)

🔇 Additional comments (47)
.gitattributes (1)

3-3: LGTM! Proper line ending configuration for cross-platform development.

Re-introducing the CRLF line ending configuration for Windows batch files follows Git best practices and ensures batch scripts maintain proper line endings across platforms, which is especially important for CI/CD pipelines and Windows developers.

user-workspace/android/app/src/main/AndroidManifest.xml (2)

2-3: Add INTERNET permission to support network communication.

The addition of the android.permission.INTERNET permission is appropriate for the SDK to make network calls. The permission is correctly positioned at the manifest level.


39-39: Verify activity class namespace consistency with SDK namespace refactoring.

The manifest references the activity org.reclaimprotocol.inapp_sdk.ReclaimActivity on Line 39. According to the PR objectives, the Android namespace was refactored from inapp_rn_sdk to inapprnsdk. Please verify whether this activity reference should also be updated to reflect the new namespace structure to maintain consistency across the SDK.

android/src/main/AndroidManifest.xml (1)

1-2: Namespace is properly configured in android/build.gradle.

The namespace property is correctly set to "com.reclaimprotocol.inapprnsdk" in the build configuration. Removing the package attribute from the manifest is the correct approach for Android library modules when using AGP 7.0+, where the namespace property in build.gradle takes precedence.

user-workspace/android/app/src/main/java/reclaimprotocol/inapprnsdk/example/MainApplication.kt (2)

1-1: Package rename aligns with directory; ensure all references are updated

The new package reclaimprotocol.inapprnsdk.example matches the file path and refactor direction. Please double‑check AndroidManifest, Gradle config, and any hard‑coded references still using the old reclaimprotocol.inapp_rn_sdk.example namespace.


7-7: New loadReactNative entrypoint usage looks correct; confirm RN version support

Importing ReactNativeApplicationEntryPoint.loadReactNative and calling loadReactNative(this) in onCreate is a clean replacement for manual SoLoader/new‑architecture wiring and matches recent RN templates. Just confirm that:

  • The React Native version used by this app exposes ReactNativeApplicationEntryPoint.loadReactNative, and
  • There is no remaining manual SoLoader.init or DefaultNewArchitectureEntryPoint.load() elsewhere that could double‑initialize things.

Also applies to: 36-36

user-workspace/ios/InappRnSdkExample/AppDelegate.swift (3)

7-11: LGTM! Factory pattern implementation aligns with modern React Native architecture.

The refactoring from subclassing RCTAppDelegate to manually wiring the delegate and factory is consistent with React Native's recommended approach for the new architecture. The property declarations are appropriate for maintaining references throughout the app's lifetime.


36-48: LGTM! Standard React Native delegate implementation.

The ReactNativeDelegate correctly implements the bundle URL logic with appropriate DEBUG/release conditional compilation for development and production builds.


24-30: No action needed—factory.startReactNative() handles window presentation.

The factory method creates the RCTRootView/RCTBridge and attaches the RN root to the window, so the explicit window?.makeKeyAndVisible() call is not required. The code follows the correct and documented React Native pattern, which is confirmed by the identical pattern used in the example app within the same codebase.

.github/ISSUE_TEMPLATE/bug_report.yml (1)

43-49: Good use of render: shell for environment output

Rendering the react-native info block as shell improves legibility and keeps environment data clearly formatted. No issues here.

.nvmrc (1)

1-1: Ensure ecosystem alignment with Node v22.20.0

Bumping .nvmrc to v22.20.0 is fine, but please double‑check that:

  • CI is reading .nvmrc (e.g., via your setup action) and using the same version.
  • Any engines.node constraints and local dev tooling are consistent.

This avoids hard‑to‑debug mismatches between environments.

.yarnrc.yml (1)

1-4: Yarn 4 path looks good; confirm binary and plugin expectations

Pointing yarnPath to .yarn/releases/yarn-4.11.0.cjs is consistent with a Yarn‑managed repo. Please just ensure:

  • The corresponding .yarn/releases/yarn-4.11.0.cjs file is committed.
  • CI and local dev rely on this yarnPath (e.g., via corepack) rather than a globally installed yarn.
  • Any previously configured Yarn plugins that were removed are no longer required in your workflows.
android/src/main/java/com/reclaimprotocol/inapprnsdk/JsonExtension.kt (1)

1-18: Namespace update in JsonExtension.kt looks consistent

Updating the package to com.reclaimprotocol.inapprnsdk keeps this helper aligned with the rest of the Android module. The JSONObject.toMap() logic is unchanged, so there’s no new behavioral risk here.

user-workspace/ios/InappRnSdkExample/Info.plist (1)

34-37: Ensure RCTNewArchEnabled matches your iOS/RN new‑arch wiring

Enabling RCTNewArchEnabled in Info.plist makes sense alongside the new‑architecture changes in this PR. Just confirm that:

  • Your Podfile/Xcode build settings are also configured for the new architecture, and
  • JS/Native modules (e.g., the spec‑based InappRnSdk module) are built and registered only in the new‑arch path.

This avoids subtle mismatches between the flag and the actual build configuration.

user-workspace/android/gradle/wrapper/gradle-wrapper.properties (1)

1-7: No compatibility issues found; Gradle 8.14.3 is supported

AGP 8.7.2 (specified in android/build.gradle) requires Gradle ≥ 8.9, and Gradle 8.14.3 meets this requirement. The wrapper update is safe to proceed with.

.github/ISSUE_TEMPLATE/config.yml (1)

4-7: Fixed GitHub discussions URLs.

Dropping the .git suffix from the discussions links is correct for GitHub URLs; these should now resolve reliably.

tsconfig.json (1)

9-9: bundler resolution + customConditions look correct; ensure TS version supports them.

Using moduleResolution: "bundler" together with "customConditions": ["react-native-strict-api"] matches the modern TypeScript + bundler setup for React Native style exports.

Please just confirm your dev/CI environments are on a TypeScript version recent enough to recognize bundler and customConditions; older TS versions will error on these options.

Also applies to: 15-15

CONTRIBUTING.md (1)

14-29: Updated contributing docs are clear and consistent with the workflow.

The added guidance on Node version via .nvmrc, Yarn workspaces, example app usage, type‑checking, linting, and test commands all line up well with the repo’s tooling and structure. No changes needed from my side.

Also applies to: 60-76, 96-105

CHANGELOG.md (1)

1-11: 0.24.0 changelog entry looks consistent

The new section clearly summarizes the main functional changes and fits the existing changelog structure.

turbo.json (1)

3-41: Turbo global env/dependency config is well-aligned

Capturing .nvmrc, .yarnrc.yml, and the Android/iOS env vars in Turbo’s cache keys makes the build outputs sensitive to relevant toolchain and RN flag changes without altering behavior.

user-workspace/metro.config.js (1)

3-16: Monorepo Metro wiring via withMetroConfig looks correct

Wrapping getDefaultConfig(__dirname) with withMetroConfig and passing { root, dirname: __dirname } is the expected pattern for a monorepo app; nothing stands out as problematic here.

ios/InappRnSdk.h (1)

1-4: Spec-based iOS module interface looks correct

Importing InappRnSdkSpec and extending NativeInappRnSdkSpecBase <NativeInappRnSdkSpec> is consistent with the RN codegen pattern; the header itself doesn’t introduce any issues.

eslint.config.mjs (1)

1-29: Flat ESLint + Prettier setup is sound; verify lint tooling is installed

The flat-config wiring with FlatCompat, @react-native + prettier extends, and the prettier/prettier rule looks good and should work well for RN.

Just make sure the workspace that actually runs ESLint has the necessary devDependencies (eslint, @react-native/eslint-config, eslint-plugin-prettier, prettier) so this config can resolve everything correctly.

user-workspace/package.json (1)

2-35: Example workspace scripts and version bumps look coherent

The updated package name, RN/React versions, build scripts, and Node engine constraint are consistent with the rest of the tooling (CLI 20, builder-bob, monorepo config). No problems spotted here.

user-workspace/ios/InappRnSdkExample.xcodeproj/project.pbxproj (2)

186-241: CocoaPods embed/copy phases look standard

The [CP] Embed Pods Frameworks, [CP] Check Pods Manifest.lock, and [CP] Copy Pods Resources script phases and their xcfilelist paths match the current CocoaPods-generated patterns; they should be safe to commit as-is. Just ensure Podfile.lock/Manifest.lock are kept in sync so the manifest check doesn’t fail local builds.


256-311: Bundle identifier change to reclaimprotocol.inapprnsdk.example

Debug/Release PRODUCT_BUNDLE_IDENTIFIER now use reclaimprotocol.inapprnsdk.example. This is fine and matches the namespace rename, but will require corresponding updates to Apple App IDs/provisioning profiles if you’re reusing this example in a signed build. Please confirm this new bundle ID is intentional.

user-workspace/android/build.gradle (1)

3-8: Android SDK and Kotlin version bumps look appropriate.

The version updates align with the PR's modernization goals. However, verification of these versions is already requested in the package.json review.

user-workspace/.gitignore (1)

1-3: LGTM!

The additions of .env.json and Pods/ are appropriate for the new JSON-based environment configuration and iOS pod management.

user-workspace/src/.env.example.json (1)

1-5: LGTM! Static analysis warnings are false positives.

This is a valid JSON template file for environment configuration. The dotenv-linter warnings can be safely ignored as they incorrectly treat this JSON file as a .env format file.

android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkPackage.kt (1)

1-1: LGTM!

The package namespace refactor from com.reclaimprotocol.inapp_rn_sdk to com.reclaimprotocol.inapprnsdk is consistent with the broader namespace changes across the PR.

user-workspace/android/settings.gradle (1)

4-4: LGTM!

The root project name update aligns with the namespace refactor from inapp_rn_sdk to inapprnsdk.

package.json (1)

118-123: Codegen name change successfully applied across all native modules.

Verification confirms the codegen configuration change from RNInappRnSdkSpec to InappRnSdkSpec is complete:

  • ✓ Old name RNInappRnSdkSpec removed entirely (zero references)
  • ✓ New name InappRnSdkSpec correctly referenced in iOS (header/implementation), Android (NativeInappRnSdkSpec base class), and package.json
  • ✓ Android package com.reclaimprotocol.inapprnsdk updated in build.gradle, package declarations, and all source files
  • ✓ Old package inapp_rn_sdk removed (zero references)
  • ✓ Module registration name InappRnSdk matches TurboModuleRegistry lookup in src/NativeInappRnSdk.ts
  • ✓ Android module NAME constant correctly set to "InappRnSdk"

All generated native module references and imports have been updated correctly and consistently across platforms.

samples/example_new_arch/android/build.gradle (1)

8-8: Kotlin version inconsistency verified; assess intent.

The review comment is factually accurate. Both Kotlin versions are valid: 2.2.21 was released October 23, 2025 and 2.1.20 was released March 20, 2025. The stated versions match the actual build.gradle files:

  • samples/example_new_arch/android/build.gradle uses 2.2.21
  • user-workspace/android/build.gradle uses 2.1.20

However, both files also show different Android SDK versions (buildToolsVersion 35.0.0 vs 36.0.0, compileSdkVersion 35 vs 36), suggesting the files may be intentionally maintained at different versions—examples at a stable level versus workspaces at a newer level. Verify whether this Kotlin version split is by design or should be aligned for consistency.

user-workspace/android/gradle.properties (1)

41-44: Edge‑to‑edge flag block looks good

The new edgeToEdgeEnabled flag and its documentation are clear and scoped correctly to ReactActivity usage; no issues from a Gradle/config perspective.

android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkModule.kt (1)

1-1: Package rename matches directory structure

The com.reclaimprotocol.inapprnsdk package aligns with the updated namespace and file path; no issues here.

user-workspace/android/app/src/main/java/reclaimprotocol/inapprnsdk/example/MainActivity.kt (1)

1-1: Example app package rename is consistent

Package reclaimprotocol.inapprnsdk.example now matches the directory layout and the library namespace changes; all good.

ios/InappRnSdk.mm (1)

15-24: TurboModule registration pattern looks consistent

The updated getTurboModule implementation and new +moduleName returning @"InappRnSdk" match the TurboModule/spec pattern and keep behavior the same while dropping the old macro-based registration. No issues from an Obj‑C / RN perspective.

InappRnSdk.podspec (1)

16-20: Podspec configuration looks good for the 0.24.0 release.

The dependency bump to ~> 0.24.0 and the simplified install_modules_dependencies(s) call align with modern React Native module practices. The broadened private_header_files pattern (ios/**/*.h) marks all headers as private, which is appropriate if no headers are intended for public consumption by pod consumers.

ios/inapp_rn_sdk/Api.swift (1)

223-226: LGTM! Clean implementation of setConsoleLogging.

The method correctly delegates to ReclaimVerification.setConsoleLogging from the SDK. The async/throws signature aligns with the Android counterpart.

documentation/install-no-framework.md (1)

138-144: Documentation version updates are consistent with the release.

All SDK version references are correctly updated to 0.24.0 across CocoaPods examples.

.github/workflows/ci.yml (1)

1-16: Well-structured CI workflow with proper concurrency control.

The workflow configuration follows best practices:

  • Triggers on push/PR to main and merge groups
  • Concurrency group prevents redundant runs
  • Pinned action versions with commit SHAs for security
user-workspace/android/app/build.gradle (1)

73-82: Build configuration updates look correct.

  • JSC flavor updated to the React Native community-maintained version (io.github.react-native-community:jsc-android:2026004.+), which is the recommended approach for newer React Native versions.
  • Namespace and applicationId consistently renamed from inapp_rn_sdk to inapprnsdk.
src/index.tsx (2)

664-678: setConsoleLogging implementation follows established patterns.

The implementation correctly:

  • Handles optional/null options by defaulting to false
  • Wraps errors in ReclaimPlatformException
  • Aligns with the native Android/iOS implementations

179-180: Type alias correctly references native module types.

The SetConsoleLoggingOptions type alias properly references the native module types, maintaining consistency with the interface defined in src/NativeInappRnSdk.ts.

src/NativeInappRnSdk.ts (1)

1-1: Check CodegenTypes top‑level import compatibility with your React Native baseline

Importing CodegenTypes from 'react-native' and using CodegenTypes.EventEmitter<…> for the event fields is a nice tightening of types, but this will only work if the minimum supported React Native version actually re‑exports CodegenTypes from the top‑level module. Otherwise consumers will see TS compile errors on these types. Please confirm this matches your RN support matrix, and fall back to the previous internal import path if needed.

Also applies to: 389-396

android/build.gradle (2)

5-9: Confirm inapp_sdk:0.24.0 is available from the configured repositories

You’ve bumped to implementation "org.reclaimprotocol:inapp_sdk:0.24.0" while simplifying repositories to just google() and mavenCentral(). Build and consumer projects will fail resolution if 0.24.0 isn’t published to Maven Central (or if its Android/Gradle requirements exceed your current minSdkVersion / AGP combo), so please double‑check those coordinates against the artifact’s published metadata.

Also applies to: 78-78


22-22: React plugin + namespace + generated sources wiring looks reasonable; validate plugin classpath

Always applying com.facebook.react, fixing the namespace to com.reclaimprotocol.inapprnsdk, and unconditionally adding generated/java and generated/jni to main should align this library with the non‑conditional new‑arch setup. This assumes the root project already declares the com.facebook.react Gradle plugin on the buildscript classpath so apply plugin: "com.facebook.react" resolves cleanly—worth verifying in the consuming app/template.

Also applies to: 29-29, 57-62

Comment thread .github/workflows/ci.yml
Comment on lines +156 to +162
- name: Install cocoapods
if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true'
run: |
cd example
bundle install
bundle exec pod repo update --verbose
bundle exec pod install --project-directory=ios
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Invalid step reference for cocoapods-cache.

The condition on line 157 references steps.cocoapods-cache.outputs.cache-hit, but there's no step with id: cocoapods-cache defined in this workflow. This condition will always evaluate to cache-hit != 'true' (since steps.cocoapods-cache is undefined).

Either remove the unused condition or add a CocoaPods cache step:

      - name: Install cocoapods
-       if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true'
+       if: env.turbo_cache_hit != 1
        run: |
          cd example
          bundle install
          bundle exec pod repo update --verbose
          bundle exec pod install --project-directory=ios
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Install cocoapods
if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true'
run: |
cd example
bundle install
bundle exec pod repo update --verbose
bundle exec pod install --project-directory=ios
- name: Install cocoapods
if: env.turbo_cache_hit != 1
run: |
cd example
bundle install
bundle exec pod repo update --verbose
bundle exec pod install --project-directory=ios
🧰 Tools
🪛 actionlint (1.7.8)

157-157: property "cocoapods-cache" is not defined in object type {}

(expression)

🤖 Prompt for AI Agents
.github/workflows/ci.yml around lines 156 to 162: the step conditional
references steps.cocoapods-cache.outputs.cache-hit but no prior step has id:
cocoapods-cache, so the condition is invalid; fix by either removing the "&&
steps.cocoapods-cache.outputs.cache-hit != 'true'" clause from the Install
cocoapods step, or add a preceding CocoaPods cache step with id: cocoapods-cache
that uses actions/cache (or equivalent) and exposes outputs.cache-hit so the
conditional can evaluate correctly; ensure the new cache step is defined before
line 156 and sets outputs.cache-hit (or adjust the conditional to match the
actual step id).

Comment on lines +96 to +126
### Compatibility Notice: expo-dev-client on iOS

Please be aware of a known incompatibility between ReclaimInAppSdk and the [`expo-dev-client`](https://www.npmjs.com/package/expo-dev-client) package on the iOS platform.

When both packages are present in your iOS application, critical network requests from ReclaimInAppSdk may fail with a request timeout error (i.e `Http failed. Checking if we can retry..\nNSErrorClientException: The request timed out.`).

Our team is investigating this issue to find a solution. In the meantime, we recommend temporarily removing expo-dev-client from your project when you need to test or use ReclaimInAppSdk functionality on iOS.

### Cronet errors on android without play services

On android devices which don't have play services, you may get following errors in Android logs: `java.lang.RuntimeException: All available Cronet providers are disabled. A provider should be enabled before it can be used.`, `Google-Play-Services-Cronet-Provider is unavailable.`. This is because the Reclaim InApp SDK depends on cronet for making http requests.

To fix this, you need to use embedded cronet in your android app by adding the following dependency in your build.gradle dependencies block:

```gradle
dependencies {
// ... other dependencies (not shown for brevity)
// Use embedded cronet
implementation("org.chromium.net:cronet-embedded:141.7340.3")
}
```

### iOS build issues

Incase you get errors which say `CocoaPods could not find compatible versions for pod "ReclaimInAppSdk"`, run the following in your project's `ios/` directory:

```sh
bundle exec pod update ReclaimInAppSdk
# or
pod update ReclaimInAppSdk
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Tighten Troubleshooting grammar and capitalization

The new troubleshooting content is useful; a few small language nits:

  • Capitalize platform names and services: “Android”, “Google Play services”, “Cronet”.
  • Fix “Incase” → “In case”.

For example:

-### Cronet errors on android without play services
+### Cronet errors on Android without Google Play services
...
-On android devices which don't have play services, you may get following errors
+On Android devices that don't have Google Play services, you may see errors such as
...
-Incase you get errors which say `CocoaPods could not find compatible versions for pod "ReclaimInAppSdk"`, run the following
+In case you get errors saying `CocoaPods could not find compatible versions for pod "ReclaimInAppSdk"`, run the following
🧰 Tools
🪛 LanguageTool

[style] ~102-~102: ‘In the meantime’ might be wordy. Consider a shorter alternative.
Context: ...tigating this issue to find a solution. In the meantime, we recommend temporarily removing expo...

(EN_WORDINESS_PREMIUM_IN_THE_MEANTIME)

🤖 Prompt for AI Agents
In documentation/install-expo.md around lines 96 to 126, fix minor grammar and
capitalization in the troubleshooting section: change “android” to “Android”,
“play services” to “Google Play services”, “Cronet” capitalization consistency,
and correct “Incase” to “In case”; ensure proper capitalization of package names
where appropriate (e.g., expo-dev-client remains as-is) and update the sentences
to reflect these corrections for clarity.

## 0.15.0

- Make sure if you are using the latest versions of `ReclaimInAppSdk` cocoapod if you have overriden this dependency in your `Podfile`. Latest version on [cocoapods.org is 0.18.0](https://cocoapods.org/pods/ReclaimInAppSdk).
- Make sure if you are using the latest versions of `ReclaimInAppSdk` cocoapod if you have overriden this dependency in your `Podfile`. Latest version on [cocoapods.org is 0.24.0](https://cocoapods.org/pods/ReclaimInAppSdk).
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Fix repeated typo and consider future‑proofing the version text

The bullets use overriden instead of overridden and hard‑code the latest CocoaPods version, which will go stale on the next SDK release.

You could both fix the typo and avoid future edits by wording it like “Make sure you are using the latest version of ReclaimInAppSdk from CocoaPods” and linking to cocoapods.org without embedding a specific version.

Example for one bullet (apply similarly to the others):

-- Make sure if you are using the latest versions of `ReclaimInAppSdk` cocoapod if you have overriden this dependency in your `Podfile`. Latest version on [cocoapods.org is 0.24.0](https://cocoapods.org/pods/ReclaimInAppSdk).
+- Make sure you are using the latest version of the `ReclaimInAppSdk` CocoaPod if you have overridden this dependency in your `Podfile`. See the latest version on [cocoapods.org](https://cocoapods.org/pods/ReclaimInAppSdk).

Also applies to: 11-11, 17-17, 23-23, 29-29, 35-35, 41-41, 49-49, 128-128, 167-167

🧰 Tools
🪛 LanguageTool

[grammar] ~5-~5: Ensure spelling is correct
Context: ... ReclaimInAppSdk cocoapod if you have overriden this dependency in your Podfile. Late...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
In documentation/migration.md around line 5 (and also update the same pattern at
lines 11, 17, 23, 29, 35, 41, 49, 128, and 167), fix the typo "overriden" to
"overridden" and remove the hard-coded version number; instead reword each
bullet to say "Make sure you are using the latest version of `ReclaimInAppSdk`
from CocoaPods" and keep the link to https://cocoapods.org/pods/ReclaimInAppSdk
(do not include a specific version number) so the text stays correct for future
releases.

Comment thread package.json
Comment on lines +3 to +6
"version": "0.24.0",
"description": "Reclaim Protocol's InApp React Native SDK for ZK proof generations for requests with an in-app experience of web verification",
"source": "./src/index.ts",
"main": "./lib/commonjs/index.js",
"module": "./lib/module/index.js",
"types": "./lib/typescript/module/src/index.d.ts",
"main": "./lib/module/index.js",
"types": "./lib/typescript/src/index.d.ts",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

Verify breaking changes are documented and Android SDK/Kotlin versions exist.

The version bump to 0.24.0 includes breaking changes:

  • main entry point changed from CommonJS (./lib/commonjs/index.js) to ESM (./lib/module/index.js)
  • types path changed from ./lib/typescript/module/src/index.d.ts to ./lib/typescript/src/index.d.ts

These changes will break existing consumers using CommonJS or relying on the old types path. Ensure migration guidance is provided in the CHANGELOG.

Additionally, verify the following version updates referenced in related files are valid:

  • Android SDK 36 (user-workspace/android/build.gradle uses compileSdkVersion 36 and targetSdkVersion 36)
  • Kotlin 2.1.20 (user-workspace/android/build.gradle)
  • Kotlin 2.2.21 (samples/example_new_arch/android/build.gradle) - note the version inconsistency

🌐 Web query:

What is the latest stable version of Android SDK Build Tools and is version 36 available?

💡 Result:

As of Nov 24, 2025: the latest stable Android SDK Build‑Tools release line is 35.x (35.0.1 is the most recent stable drop commonly listed). Version 36 exists in Google’s SDK repositories (shown as 36.0.0 and several 36.x release‑candidates) and is used/required by AGP preview channels, but 36.x is not yet the default stable Build‑Tools for the current stable Android Gradle Plugin. [1][2][3]

Sources:

  • Android Gradle Plugin release notes (shows stable AGP default Build Tools = 35.0.0; AGP preview lists 36.0.0). [1][2]
  • SDK package listings / SDK manager outputs showing build-tools;35.0.1 and build-tools;36.0.0 (rcs) availability. [3]

🌐 Web query:

What is the latest stable version of Kotlin and are versions 2.1.20 and 2.2.21 valid?

💡 Result:

Latest stable Kotlin (as of November 24, 2025) is 2.2.21 (released October 23, 2025). [1]

Yes — 2.1.20 is a valid tooling release (released March 20, 2025) and 2.2.21 is a valid stable tooling release (released October 23, 2025). [2][1]

Sources:

  • Kotlin releases page (release table showing 2.2.21 as current stable). [1]
  • What's new / release notes for 2.1.20. [2]


---

🏁 Script executed:

```shell
#!/bin/bash
# Find and display Android build.gradle files to verify SDK/Kotlin versions
fd -t f "build.gradle" | head -20

Length of output: 280


🏁 Script executed:

#!/bin/bash
# Check for version definitions in user-workspace/android/build.gradle
find . -path "*/user-workspace/android/build.gradle" -o -path "*/samples/example_new_arch/android/build.gradle" | xargs cat 2>/dev/null | grep -E "(compileSdkVersion|targetSdkVersion|ext.*kotlin|kotlin.*version)" -A 2 -B 2

Length of output: 392


🏁 Script executed:

#!/bin/bash
# Check for CHANGELOG file
fd -t f "CHANGELOG*" -o -type f -iname "changelog*"

Length of output: 116


🏁 Script executed:

#!/bin/bash
# Verify the current package.json entry points match the review claim
cat package.json | grep -E '"main"|"types"' -A 0

Length of output: 133


🏁 Script executed:

#!/bin/bash
# Check git history for previous main/types entries to confirm breaking change
git log --oneline -n 20 -- package.json 2>/dev/null || echo "Git history not available"

Length of output: 861


🏁 Script executed:

#!/bin/bash
# Show previous package.json to confirm breaking change
git show d89e017^:package.json 2>/dev/null | grep -E '"main"|"types"' || echo "Previous state not available"

Length of output: 209


🏁 Script executed:

#!/bin/bash
# Simple CHANGELOG search
find . -iname "*changelog*" -type f 2>/dev/null | head -5

Length of output: 14


🏁 Script executed:

#!/bin/bash
# Look for breaking change or migration docs
find . -iname "*breaking*" -o -iname "*migration*" -o -iname "*upgrade*" 2>/dev/null | head -10

Length of output: 28


🏁 Script executed:

#!/bin/bash
# Show exact content from build.gradle files mentioned in review
echo "=== user-workspace/android/build.gradle ===" && cat user-workspace/android/build.gradle | grep -E "compileSdkVersion|targetSdkVersion|kotlinVersion|buildToolsVersion" && echo "" && echo "=== samples/example_new_arch/android/build.gradle ===" && cat samples/example_new_arch/android/build.gradle | grep -E "compileSdkVersion|targetSdkVersion|kotlinVersion|buildToolsVersion"

Length of output: 360


🏁 Script executed:

#!/bin/bash
# Check CHANGELOG for 0.24.0 and breaking change documentation
cat CHANGELOG.md | grep -A 20 "0.24.0" | head -30

Length of output: 764


🏁 Script executed:

#!/bin/bash
# Check migration.md content
cat documentation/migration.md | head -50

Length of output: 3752


🏁 Script executed:

#!/bin/bash
# Check if there are any README or docs mentioning entry point changes
grep -r "lib/module\|lib/commonjs" . --include="*.md" 2>/dev/null | head -10

Length of output: 0


Document breaking changes in CHANGELOG and provide migration guidance.

The entry point changes are confirmed breaking changes:

  • main: CommonJS (./lib/commonjs/index.js) → ESM (./lib/module/index.js)
  • types: ./lib/typescript/module/src/index.d.ts./lib/typescript/src/index.d.ts

However, CHANGELOG.md (v0.24.0) does not document these breaking changes—it only lists features and bug fixes. Additionally, documentation/migration.md lacks guidance for this version and does not address the CommonJS → ESM migration.

Additionally, Android build configuration is inconsistent across the workspace:

  • user-workspace/android/build.gradle: SDK 36 + Kotlin 2.1.20 + buildToolsVersion 36.0.0 (non-stable)
  • samples/example_new_arch/android/build.gradle: SDK 35 + Kotlin 2.2.21 + buildToolsVersion 35.0.0 (stable)

While both Kotlin versions are valid and Android SDK 36 is available (though not yet default stable), the inconsistency and use of non-stable buildToolsVersion 36.0.0 in the main workspace should be resolved.

🤖 Prompt for AI Agents
In package.json around lines 3–6, the change of entry points (main switched to
ESM and types path changed) is a breaking change not documented: update
CHANGELOG.md v0.24.0 to list these breaking changes and add a short migration
section in documentation/migration.md explaining exactly what consumers must
change (update imports/require usage to ESM entry, update any
bundler/tsconfig/paths that reference the old commonjs/types paths, and how to
reference the new ./lib/module/index.js and new types path), include example
commands or config snippets for common migration steps. Also normalize Android
build config across the workspace: pick a stable SDK/buildTools/Kotlin set
(recommend SDK 35, buildToolsVersion 35.0.0, and a single Kotlin plugin
version), and update user-workspace/android/build.gradle and
samples/example_new_arch/android/build.gradle to match that chosen stable set,
noting the chosen versions in CHANGELOG/migration notes.

Comment on lines +10 to +12
maven {
url "/Users/mushaheedsyed/Projects/reclaimprotocol.org/inapp/reclaim_inapp_sdk_wrapper/inapp-sdks/build/android-sdk/dist/library/0.21.1/repo"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Remove user‑specific absolute Maven repository URL.

The added Maven repo points to a local, absolute path:

maven {
  url "/Users/mushaheedsyed/Projects/.../android-sdk/dist/library/0.21.1/repo"
}

This will break builds for anyone who doesn't have that exact path (including CI) and hard‑codes a specific SDK version outside normal dependency management.

Recommend removing this block or replacing it with a configurable source (e.g., mavenLocal() or a URL driven by a Gradle property/environment variable) used only in local dev.

🤖 Prompt for AI Agents
In samples/example_expo/android/build.gradle around lines 10 to 12, the Maven
repository block uses a user-specific absolute path which will break builds for
other developers and CI; remove that hard-coded maven { url "/Users/..." } entry
and replace it with a configurable alternative such as mavenLocal() for local
development or a repository URL read from a Gradle property/environment variable
(e.g., check for a project property and only add the repository when present),
or simply delete the block so the dependency is resolved via normal
Maven/Central/JCenter repositories.

Comment on lines +20 to +22
maven {
url "/Users/mushaheedsyed/Projects/reclaimprotocol.org/inapp/reclaim_inapp_sdk_wrapper/inapp-sdks/build/android-sdk/dist/library/0.21.1/repo"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Remove hardcoded developer-specific local path.

This Maven repository entry contains a hardcoded absolute path to a developer's local filesystem (/Users/mushaheedsyed/Projects/...). This will break builds for anyone else trying to use this example and should never be committed to version control.

Apply this diff to remove the developer-specific repository:

-        maven {
-      url "/Users/mushaheedsyed/Projects/reclaimprotocol.org/inapp/reclaim_inapp_sdk_wrapper/inapp-sdks/build/android-sdk/dist/library/0.21.1/repo"
-    }

If a local Maven repository is needed for development, it should be configured via environment variables or a local properties file that is gitignored.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
maven {
url "/Users/mushaheedsyed/Projects/reclaimprotocol.org/inapp/reclaim_inapp_sdk_wrapper/inapp-sdks/build/android-sdk/dist/library/0.21.1/repo"
}
🤖 Prompt for AI Agents
In samples/example_new_arch/android/settings.gradle around lines 20 to 22,
remove the hardcoded absolute maven repository path that points to a developer's
local filesystem; replace it with a non-user-specific solution such as
mavenLocal() or a file-based reference read from a project/local.properties or
from an environment variable (e.g., use a property like localSdkRepoDir in
local.properties or System.getenv("LOCAL_MAVEN_REPO") and then reference
file(localSdkRepoDir) in the maven { url ... } block), and ensure
local.properties is listed in .gitignore so developer-specific paths are not
committed.

@predatorx7 predatorx7 merged commit 1ae0ab0 into main Nov 24, 2025
3 of 6 checks passed
@predatorx7 predatorx7 deleted the pre-0.24.0 branch November 24, 2025 22:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants