Release 0.24.0#40
Conversation
|
Caution Review failedThe pull request is closed. WalkthroughThis 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
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Focus review on:
Possibly related PRs
Suggested reviewers
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
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. Comment |
6157380 to
d89e017
Compare
There was a problem hiding this comment.
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: Replaceconsole.assert()with early validation to prevent SDK errors with missing credentialsThe code at lines 66-67 of
user-workspace/src/App.tsxusesconsole.assert()which does not prevent execution in production—it only logs in development. The code then proceeds to callreclaimVerification.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.,
inputTextvalidation 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, andsamples/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: Missingmetadataforwarding and unsafe force-unwrap.Two issues to consider:
The
metadataparameter (line 591) is received but not forwarded to_updateSession. If the SDK provides session metadata, it won't reach the React Native callback.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/OrderedGemsrule 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 versionThe sample now pins
@reclaimprotocol/inapp-rn-sdkto^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 releaseThis 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.0so 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.0is fine—just worth confirming.tsconfig.build.json (1)
3-3: Verify build scope after relaxingexclude.
tsconfig.build.jsonnow only excludesexampleandlib, so any TS files undersamplesoruser-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;-classpathis redundant with-jar.
- Adding the MIT header and explicitly clearing
CLASSPATHbefore 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 becausejava -jarignores the classpath.If you want to simplify, you can drop the
-classpathportion 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/*/Podsandexample/vendor/, the global*.tgzignore, and theios/generated/android/generatedignores 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-jarusage is fine; CLASSPATH handling is now mostly redundant.The changes to compute
APP_HOME, initializeCLASSPATH, 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 -jarignores the classpath, both theCLASSPATHvariable 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 tweaksA couple of small polish items:
- Prefer the platform’s spelling
iOSinstead ofIOSin 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 configurationandroid/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkModule.kt (1)
234-252: Clarify behavior whenenabledis missing or args is nullImplementation 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 falseIf
argsis null or doesn’t containenabled, this silently disables console logging (enabled = false) and still resolves successfully. If the JS/TS API is meant to requireenabled, you may want to fail fast instead of defaulting tofalse.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") == trueThis makes incorrect usage visible to callers instead of silently changing logging behavior.
.github/actions/setup/action.yml (1)
1-36: Consider runningyarn install --immutableeven on cache hitsThe composite action is well structured (pinned actions, sensible cache key, restore/save split). One potential improvement: you currently skip
yarn install --immutableentirely on any cache hit:- if: steps.yarn-cache.outputs.cache-hit != 'true'Even with a cache hit, a fast
yarn install --immutablehelps guarantee thatnode_modulesexactly matchesyarn.lockand catches drift early. You could remove theif(or relax it) on the install step and keep theifonly on thecache/savestep.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.jsonusage and avoid accidentally shipping secretsSwitching 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.
resolveJsonModuleintsconfig.json) soimport config from './.env.json';type‑checks cleanly.ios/InappRnSdk.mm (1)
416-428:setConsoleLoggingbridge wiring looks correct; consider aligning error code namingThe new
setConsoleLoggingbridge cleanly forwards theenabledflag 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
SetConsoleLoggingOptionsalways provides a non‑optionalenabledsoargs.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 -pis fragile. If the output structure changes in a Turbo upgrade, the detection will silently fail (returningundefinedinstead 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 fisrc/index.tsx (1)
63-70: Redundant boolean coercion.The
enabled == truecoercion is applied in the public API (line 68) even thoughenabledis already typed asboolean. This is defensive but redundant. The same pattern is repeated inPlatformImpl.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‑evaluateSessionUpdateRequestEvent.metadatanullability
metadatais now a requiredstringonSessionUpdateRequestEvent. If some update events don’t include metadata (or older native SDKs don’t populate it), this will beundefinedat 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:setConsoleLoggingAPI shape looks consistent; optional arg would be a small DX winThe
SetConsoleLoggingOptionsshape andsetConsoleLogging(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…Optionspatterns that allow null/undefined), you could relax this toargs?: 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
⛔ Files ignored due to path filters (19)
.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjsis excluded by!**/.yarn/**.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjsis excluded by!**/.yarn/**.yarn/releases/yarn-3.6.1.cjsis excluded by!**/.yarn/**.yarn/releases/yarn-4.11.0.cjsis excluded by!**/.yarn/**android/generated/java/com/reclaimprotocol/inapp_rn_sdk/NativeInappRnSdkSpec.javais excluded by!**/generated/**android/generated/jni/CMakeLists.txtis excluded by!**/generated/**android/generated/jni/RNInappRnSdkSpec-generated.cppis excluded by!**/generated/**android/generated/jni/RNInappRnSdkSpec.his excluded by!**/generated/**android/generated/jni/react/renderer/components/RNInappRnSdkSpec/RNInappRnSdkSpecJSI-generated.cppis excluded by!**/generated/**android/generated/jni/react/renderer/components/RNInappRnSdkSpec/RNInappRnSdkSpecJSI.his excluded by!**/generated/**android/gradle/wrapper/gradle-wrapper.jaris excluded by!**/*.jarios/generated/RNInappRnSdkSpec/RNInappRnSdkSpec-generated.mmis excluded by!**/generated/**ios/generated/RNInappRnSdkSpec/RNInappRnSdkSpec.his excluded by!**/generated/**ios/generated/RNInappRnSdkSpecJSI-generated.cppis excluded by!**/generated/**ios/generated/RNInappRnSdkSpecJSI.his excluded by!**/generated/**user-workspace/Gemfile.lockis excluded by!**/*.lockuser-workspace/android/gradle/wrapper/gradle-wrapper.jaris excluded by!**/*.jaruser-workspace/ios/Podfile.lockis excluded by!**/*.lockyarn.lockis 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.INTERNETpermission 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.ReclaimActivityon Line 39. According to the PR objectives, the Android namespace was refactored frominapp_rn_sdktoinapprnsdk. 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 inandroid/build.gradle.The
namespaceproperty 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 updatedThe new package
reclaimprotocol.inapprnsdk.examplematches the file path and refactor direction. Please double‑check AndroidManifest, Gradle config, and any hard‑coded references still using the oldreclaimprotocol.inapp_rn_sdk.examplenamespace.
7-7: NewloadReactNativeentrypoint usage looks correct; confirm RN version supportImporting
ReactNativeApplicationEntryPoint.loadReactNativeand callingloadReactNative(this)inonCreateis 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.initorDefaultNewArchitectureEntryPoint.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
RCTAppDelegateto 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
ReactNativeDelegatecorrectly 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 ofrender: shellfor environment outputRendering the
react-native infoblock as shell improves legibility and keeps environment data clearly formatted. No issues here..nvmrc (1)
1-1: Ensure ecosystem alignment with Node v22.20.0Bumping
.nvmrctov22.20.0is fine, but please double‑check that:
- CI is reading
.nvmrc(e.g., via your setup action) and using the same version.- Any
engines.nodeconstraints 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 expectationsPointing
yarnPathto.yarn/releases/yarn-4.11.0.cjsis consistent with a Yarn‑managed repo. Please just ensure:
- The corresponding
.yarn/releases/yarn-4.11.0.cjsfile 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 consistentUpdating the package to
com.reclaimprotocol.inapprnsdkkeeps this helper aligned with the rest of the Android module. TheJSONObject.toMap()logic is unchanged, so there’s no new behavioral risk here.user-workspace/ios/InappRnSdkExample/Info.plist (1)
34-37: EnsureRCTNewArchEnabledmatches your iOS/RN new‑arch wiringEnabling
RCTNewArchEnabledin 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 supportedAGP 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
.gitsuffix from the discussions links is correct for GitHub URLs; these should now resolve reliably.tsconfig.json (1)
9-9:bundlerresolution +customConditionslook 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
bundlerandcustomConditions; 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 consistentThe 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-alignedCapturing
.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 viawithMetroConfiglooks correctWrapping
getDefaultConfig(__dirname)withwithMetroConfigand 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 correctImporting
InappRnSdkSpecand extendingNativeInappRnSdkSpecBase <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 installedThe flat-config wiring with
FlatCompat,@react-native+prettierextends, and theprettier/prettierrule 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 coherentThe 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 standardThe
[CP] Embed Pods Frameworks,[CP] Check Pods Manifest.lock, and[CP] Copy Pods Resourcesscript phases and their xcfilelist paths match the current CocoaPods-generated patterns; they should be safe to commit as-is. Just ensurePodfile.lock/Manifest.lockare kept in sync so the manifest check doesn’t fail local builds.
256-311: Bundle identifier change toreclaimprotocol.inapprnsdk.exampleDebug/Release
PRODUCT_BUNDLE_IDENTIFIERnow usereclaimprotocol.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.jsonandPods/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
.envformat file.android/src/main/java/com/reclaimprotocol/inapprnsdk/InappRnSdkPackage.kt (1)
1-1: LGTM!The package namespace refactor from
com.reclaimprotocol.inapp_rn_sdktocom.reclaimprotocol.inapprnsdkis 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_sdktoinapprnsdk.package.json (1)
118-123: Codegen name change successfully applied across all native modules.Verification confirms the codegen configuration change from
RNInappRnSdkSpectoInappRnSdkSpecis complete:
- ✓ Old name
RNInappRnSdkSpecremoved entirely (zero references)- ✓ New name
InappRnSdkSpeccorrectly referenced in iOS (header/implementation), Android (NativeInappRnSdkSpec base class), and package.json- ✓ Android package
com.reclaimprotocol.inapprnsdkupdated in build.gradle, package declarations, and all source files- ✓ Old package
inapp_rn_sdkremoved (zero references)- ✓ Module registration name
InappRnSdkmatches 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.gradleuses2.2.21user-workspace/android/build.gradleuses2.1.20However, 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 goodThe new
edgeToEdgeEnabledflag 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 structureThe
com.reclaimprotocol.inapprnsdkpackage 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 consistentPackage
reclaimprotocol.inapprnsdk.examplenow matches the directory layout and the library namespace changes; all good.ios/InappRnSdk.mm (1)
15-24: TurboModule registration pattern looks consistentThe updated
getTurboModuleimplementation and new+moduleNamereturning@"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.0and the simplifiedinstall_modules_dependencies(s)call align with modern React Native module practices. The broadenedprivate_header_filespattern (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.setConsoleLoggingfrom 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_sdktoinapprnsdk.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
SetConsoleLoggingOptionstype alias properly references the native module types, maintaining consistency with the interface defined insrc/NativeInappRnSdk.ts.src/NativeInappRnSdk.ts (1)
1-1: CheckCodegenTypestop‑level import compatibility with your React Native baselineImporting
CodegenTypesfrom'react-native'and usingCodegenTypes.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‑exportsCodegenTypesfrom 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: Confirminapp_sdk:0.24.0is available from the configured repositoriesYou’ve bumped to
implementation "org.reclaimprotocol:inapp_sdk:0.24.0"while simplifying repositories to justgoogle()andmavenCentral(). 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 currentminSdkVersion/ 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 classpathAlways applying
com.facebook.react, fixing the namespace tocom.reclaimprotocol.inapprnsdk, and unconditionally addinggenerated/javaandgenerated/jnitomainshould align this library with the non‑conditional new‑arch setup. This assumes the root project already declares thecom.facebook.reactGradle plugin on the buildscript classpath soapply plugin: "com.facebook.react"resolves cleanly—worth verifying in the consuming app/template.Also applies to: 29-29, 57-62
| - 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 |
There was a problem hiding this comment.
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.
| - 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).
| ### 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 | ||
| ``` |
There was a problem hiding this comment.
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). |
There was a problem hiding this comment.
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.
| "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", |
There was a problem hiding this comment.
🧩 Analysis chain
Verify breaking changes are documented and Android SDK/Kotlin versions exist.
The version bump to 0.24.0 includes breaking changes:
mainentry point changed from CommonJS (./lib/commonjs/index.js) to ESM (./lib/module/index.js)typespath changed from./lib/typescript/module/src/index.d.tsto./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 2Length 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 0Length 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 -5Length 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 -10Length 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 -30Length of output: 764
🏁 Script executed:
#!/bin/bash
# Check migration.md content
cat documentation/migration.md | head -50Length 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 -10Length 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.
| maven { | ||
| url "/Users/mushaheedsyed/Projects/reclaimprotocol.org/inapp/reclaim_inapp_sdk_wrapper/inapp-sdks/build/android-sdk/dist/library/0.21.1/repo" | ||
| } |
There was a problem hiding this comment.
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.
| maven { | ||
| url "/Users/mushaheedsyed/Projects/reclaimprotocol.org/inapp/reclaim_inapp_sdk_wrapper/inapp-sdks/build/android-sdk/dist/library/0.21.1/repo" | ||
| } |
There was a problem hiding this comment.
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.
| 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.
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
Chores
✏️ Tip: You can customize this high-level summary in your review settings.