From 4f3990c85ad6a23127ad9d128e551d5c5505a23f Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Fri, 9 Aug 2024 17:04:42 -0400 Subject: [PATCH 1/6] Implement crashedLastRun --- .../java/io/sentry/react/RNSentryModuleImpl.java | 5 +++++ .../java/io/sentry/react/RNSentryModule.java | 5 +++++ .../java/io/sentry/react/RNSentryModule.java | 5 +++++ ios/RNSentry.mm | 6 ++++++ src/js/NativeRNSentry.ts | 1 + src/js/client.ts | 7 +++++++ src/js/index.ts | 1 + src/js/sdk.tsx | 11 +++++++++++ src/js/wrapper.ts | 13 +++++++++++++ 9 files changed, 54 insertions(+) diff --git a/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java b/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java index 7f13e5e21b..0d2792e11b 100644 --- a/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +++ b/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java @@ -852,6 +852,11 @@ public String fetchNativePackageName() { return packageInfo.packageName; } + public void crashedLastRun(Promise promise) { + Boolean crashedLastRun = Sentry.isCrashedLastRun(); + promise.resolve(crashedLastRun != null ? crashedLastRun : false); + } + private void setEventOriginTag(SentryEvent event) { SdkVersion sdk = event.getSdk(); if (sdk != null) { diff --git a/android/src/newarch/java/io/sentry/react/RNSentryModule.java b/android/src/newarch/java/io/sentry/react/RNSentryModule.java index 3d585b6b1a..f5f6ea6080 100644 --- a/android/src/newarch/java/io/sentry/react/RNSentryModule.java +++ b/android/src/newarch/java/io/sentry/react/RNSentryModule.java @@ -168,4 +168,9 @@ public void captureReplay(boolean isHardCrash, Promise promise) { public String getCurrentReplayId() { return this.impl.getCurrentReplayId(); } + + @Override + public void crashedLastRun(Promise promise) { + this.impl.crashedLastRun(promise); + } } diff --git a/android/src/oldarch/java/io/sentry/react/RNSentryModule.java b/android/src/oldarch/java/io/sentry/react/RNSentryModule.java index 33fa7283bf..656b8c6048 100644 --- a/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +++ b/android/src/oldarch/java/io/sentry/react/RNSentryModule.java @@ -168,4 +168,9 @@ public void captureReplay(boolean isHardCrash, Promise promise) { public String getCurrentReplayId() { return this.impl.getCurrentReplayId(); } + + @ReactMethod + public void crashedLastRun(Promise promise) { + this.impl.crashedLastRun(promise); + } } diff --git a/ios/RNSentry.mm b/ios/RNSentry.mm index 3abfe7c4d4..9193ecee23 100644 --- a/ios/RNSentry.mm +++ b/ios/RNSentry.mm @@ -761,6 +761,12 @@ - (NSDictionary*) fetchNativeStackFramesBy: (NSArray*)instructionsAdd #endif } +RCT_EXPORT_METHOD(crashedLastRun:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + resolve(@([SentrySDK crashedLastRun])); +} + // Thanks to this guard, we won't compile this code when we build for the old architecture. #ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule: diff --git a/src/js/NativeRNSentry.ts b/src/js/NativeRNSentry.ts index cbe17fdaa4..708a9f13d5 100644 --- a/src/js/NativeRNSentry.ts +++ b/src/js/NativeRNSentry.ts @@ -46,6 +46,7 @@ export interface Spec extends TurboModule { initNativeReactNavigationNewFrameTracking(): Promise; captureReplay(isHardCrash: boolean): Promise; getCurrentReplayId(): string | undefined | null; + crashedLastRun(): Promise; } export type NativeStackFrame = { diff --git a/src/js/client.ts b/src/js/client.ts index e22eceebd6..615075db85 100644 --- a/src/js/client.ts +++ b/src/js/client.ts @@ -119,6 +119,13 @@ export class ReactNativeClient extends BaseClient { this._initNativeSdk(); } + /** + * Returns if the app crashed in the last run. + */ + public crashedLastRun(): Promise { + return NATIVE.crashedLastRun(); + } + /** * Sets up the integrations */ diff --git a/src/js/index.ts b/src/js/index.ts index 2864d71e3a..1dee81adf6 100644 --- a/src/js/index.ts +++ b/src/js/index.ts @@ -84,6 +84,7 @@ export { captureUserFeedback, withScope, configureScope, + crashedLastRun, } from './sdk'; export { TouchEventBoundary, withTouchEventBoundary } from './touchevents'; diff --git a/src/js/sdk.tsx b/src/js/sdk.tsx index 3cb764186d..c2b2bfd359 100644 --- a/src/js/sdk.tsx +++ b/src/js/sdk.tsx @@ -246,3 +246,14 @@ export function configureScope(callback: (scope: Scope) => void): ReturnType { + const client = getCurrentHub().getClient(); + if (client) { + return client.crashedLastRun(); + } + return false; +} diff --git a/src/js/wrapper.ts b/src/js/wrapper.ts index 2e16f89021..0673cd2ca8 100644 --- a/src/js/wrapper.ts +++ b/src/js/wrapper.ts @@ -112,6 +112,8 @@ interface SentryNativeWrapper { captureReplay(isHardCrash: boolean): Promise; getCurrentReplayId(): string | null; + + crashedLastRun(): Promise; } const EOL = utf8ToBytes('\n'); @@ -642,6 +644,17 @@ export const NATIVE: SentryNativeWrapper = { return RNSentry.getCurrentReplayId() || null; }, + async crashedLastRun(): Promise { + if (!this.enableNative) { + return false; + } + if (!this._isModuleLoaded(RNSentry)) { + return false; + } + + return RNSentry.crashedLastRun(); + }, + /** * Gets the event from envelopeItem and applies the level filter to the selected event. * @param data An envelope item containing the event. From 225efc495fdb5551aa83fa5961861e7421964942 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Fri, 9 Aug 2024 17:13:16 -0400 Subject: [PATCH 2/6] Add changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afd42f74e3..37705e14e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Features + +- Implement crashedLastRun ([#4014](https://github.com/getsentry/sentry-react-native/pull/4014)) + ## 5.28.0 ### Fixes From a7b811f5d1ea2d33d98c7dff6c418e51b1436e20 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Thu, 15 Aug 2024 13:34:04 -0400 Subject: [PATCH 3/6] Allow returning null, add example --- .../src/main/java/io/sentry/react/RNSentryModuleImpl.java | 3 +-- samples/react-native/src/Screens/ErrorsScreen.tsx | 7 +++++++ src/js/NativeRNSentry.ts | 2 +- src/js/client.ts | 2 +- src/js/sdk.tsx | 4 ++-- src/js/wrapper.ts | 8 ++++---- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java b/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java index 0d2792e11b..2631cf715d 100644 --- a/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +++ b/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java @@ -853,8 +853,7 @@ public String fetchNativePackageName() { } public void crashedLastRun(Promise promise) { - Boolean crashedLastRun = Sentry.isCrashedLastRun(); - promise.resolve(crashedLastRun != null ? crashedLastRun : false); + promise.resolve(Sentry.isCrashedLastRun()); } private void setEventOriginTag(SentryEvent event) { diff --git a/samples/react-native/src/Screens/ErrorsScreen.tsx b/samples/react-native/src/Screens/ErrorsScreen.tsx index 138ec193d2..6430440295 100644 --- a/samples/react-native/src/Screens/ErrorsScreen.tsx +++ b/samples/react-native/src/Screens/ErrorsScreen.tsx @@ -106,6 +106,13 @@ const ErrorsScreen = (_props: Props) => { Sentry.nativeCrash(); }} /> +