feat: react native 87 support + chore work - #7
Conversation
There was a problem hiding this comment.
Pull request overview
Updates the library and example app to support React Native 0.87, modernizing the iOS Hermes integration and refreshing the example’s iOS/Android build tooling, while adding an Android-focused Maestro E2E regression flow.
Changes:
- Refactor iOS native module to use
CallInvoker+ HermesIHermesinterface and start observing timezone changes when the TurboModule is initialized. - Upgrade the example app to React Native
0.87.0(plus related iOS/Android project updates). - Add a Maestro Android regression flow and a root
e2e:androidscript to run it.
Reviewed changes
Copilot reviewed 20 out of 22 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| skills-lock.json | Adds skill lock metadata for the Maestro testing skill. |
| package.json | Adds e2e:android script for running the new Maestro flow. |
| lefthook.yml | Removes commit-msg commitlint hook configuration. |
| ios/TimezoneHermesFix.mm | Migrates to CallInvoker-based runtime access and Hermes IHermes timezone reset API; adjusts notification handling. |
| example/src/App.tsx | Simplifies StatusBar usage in the example UI. |
| example/package.json | Bumps React/React Native and adds lint/test tooling for the example app. |
| example/jest.config.js | Switches Jest preset to @react-native/jest-preset. |
| example/ios/TimezoneHermesFixExample/PrivacyInfo.xcprivacy | Updates accessed API categories/reasons entries. |
| example/ios/TimezoneHermesFixExample/Info.plist | Adds iPad-specific supported orientations. |
| example/ios/TimezoneHermesFixExample.xcodeproj/project.pbxproj | Updates Xcode project settings/build phases for RN 0.87 toolchain expectations. |
| example/ios/Podfile.lock | Updates CocoaPods lockfile for RN 0.87 pod graph and facades. |
| example/ios/Podfile | Removes explicit RCT_NEW_ARCH_ENABLED environment toggle. |
| example/index.js | Adds global LogBox suppression (currently too broad). |
| example/android/gradle/wrapper/gradle-wrapper.properties | Updates Gradle wrapper distribution version. |
| example/android/gradle.properties | Enables edge-to-edge and adds AGP opt-out flags. |
| example/android/build.gradle | Updates SDK/build tools and Kotlin version declarations. |
| example/android/app/src/main/AndroidManifest.xml | Makes usesCleartextTraffic configurable via placeholder (currently unresolved). |
| example/android/app/build.gradle | Updates default Proguard config file for release builds. |
| .maestro/timezone-refresh.android.yaml | Adds Android Maestro flow validating Hermes timezone cache refresh after system timezone change. |
| .agents/skills/maestro-mobile-testing/SKILL.md | Adds a Maestro testing skill document used by agents. |
Suppressed comments (1)
.maestro/timezone-refresh.android.yaml:93
- This assertion matches a fully formatted locale-dependent time string (from
toLocaleTimeString()), which is likely to vary by device locale / 12h vs 24h settings and can make the flow flaky. Assert the stable offset value relative to the timezone label instead.
- assertVisible: '6:50:36 AM - TimezoneOffset 420'
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 20 out of 22 changed files in this pull request and generated 1 comment.
Suppressed comments (1)
example/index.js:5
LogBox.ignoreAllLogs()disables all React Native LogBox warnings for the example app, which can hide actionable warnings/errors during development and when validating this library in the example.
Prefer removing this, or at least scoping it to specific noisy messages under __DEV__ with LogBox.ignoreLogs([...]).
import { LogBox } from 'react-native';
LogBox.ignoreAllLogs();
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 21 out of 24 changed files in this pull request and generated no new comments.
Suppressed comments (4)
example/index.js:5
- LogBox.ignoreAllLogs() suppresses all warnings/errors, which can mask real issues when validating the example app (and makes debugging failing E2E runs harder). It’s better to remove it, or ignore only specific known-noisy warnings behind a dev-only guard.
import { AppRegistry } from 'react-native';
import App from './src/App';
import { name as appName } from './app.json';
import { LogBox } from 'react-native';
LogBox.ignoreAllLogs();
example/android/app/build.gradle:88
- usesCleartextTraffic is now configurable via a manifest placeholder, but it’s still set to "true" in defaultConfig, which applies to release builds too. Consider defaulting cleartext traffic to false for release builds (keep it enabled only for debug/devserver) to avoid shipping an insecure network policy in the example app.
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
manifestPlaceholders = [usesCleartextTraffic: "true"]
}
README.md:11
- The support matrix now references a 0.5.x release line, but the package.json in this PR is still versioned at 0.4.0. Please align the README with the version you intend to publish (either bump the package version/release notes, or adjust the table to match the current versioning).
| 0.1.x - 0.3.x | 0.80.2 - 0.81.x |
| 0.4.x | 0.82.x - 0.86.x |
| 0.5.x | 0.87.x and above |
README.md:11
- This library is consumed via TurboModuleRegistry.getEnforcing(...) (TurboModule/New Architecture). The README currently reads like a general drop-in native module; please document that it requires Hermes and the React Native New Architecture (TurboModules) to be enabled so users don’t hit runtime module-not-found crashes.
## 🚀 React Native Support
| Library Version | React Native Version |
| --------------- | -------------------- |
| 0.1.x - 0.3.x | 0.80.2 - 0.81.x |
| 0.4.x | 0.82.x - 0.86.x |
| 0.5.x | 0.87.x and above |
No description provided.