@sentry/react-native 8.4.0 → 8.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +2 -2
- package/android/libs/replay-stubs.jar +0 -0
- package/android/replay-stubs/build.gradle +1 -1
- package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +56 -4
- package/android/src/main/java/io/sentry/react/RNSentryStart.java +3 -0
- package/android/src/main/java/io/sentry/react/RNSentryVersion.java +1 -1
- package/android/src/newarch/java/io/sentry/react/RNSentryModule.java +10 -0
- package/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +10 -0
- package/dist/js/NativeRNSentry.d.ts +2 -0
- package/dist/js/NativeRNSentry.d.ts.map +1 -1
- package/dist/js/NativeRNSentry.js.map +1 -1
- package/dist/js/feedback/FeedbackWidgetManager.d.ts +3 -1
- package/dist/js/feedback/FeedbackWidgetManager.d.ts.map +1 -1
- package/dist/js/feedback/FeedbackWidgetManager.js +15 -1
- package/dist/js/feedback/FeedbackWidgetManager.js.map +1 -1
- package/dist/js/feedback/FeedbackWidgetProvider.d.ts +3 -2
- package/dist/js/feedback/FeedbackWidgetProvider.d.ts.map +1 -1
- package/dist/js/feedback/FeedbackWidgetProvider.js +12 -4
- package/dist/js/feedback/FeedbackWidgetProvider.js.map +1 -1
- package/dist/js/feedback/ShakeToReportBug.d.ts +27 -0
- package/dist/js/feedback/ShakeToReportBug.d.ts.map +1 -0
- package/dist/js/feedback/ShakeToReportBug.js +83 -0
- package/dist/js/feedback/ShakeToReportBug.js.map +1 -0
- package/dist/js/feedback/integration.d.ts +11 -0
- package/dist/js/feedback/integration.d.ts.map +1 -1
- package/dist/js/feedback/integration.js +7 -1
- package/dist/js/feedback/integration.js.map +1 -1
- package/dist/js/index.d.ts +1 -1
- package/dist/js/index.d.ts.map +1 -1
- package/dist/js/index.js +1 -1
- package/dist/js/index.js.map +1 -1
- package/dist/js/integrations/debugsymbolicator.js +3 -1
- package/dist/js/integrations/debugsymbolicator.js.map +1 -1
- package/dist/js/integrations/default.d.ts.map +1 -1
- package/dist/js/integrations/default.js +2 -1
- package/dist/js/integrations/default.js.map +1 -1
- package/dist/js/integrations/exports.d.ts +1 -0
- package/dist/js/integrations/exports.d.ts.map +1 -1
- package/dist/js/integrations/exports.js +1 -0
- package/dist/js/integrations/exports.js.map +1 -1
- package/dist/js/integrations/expoupdateslistener.d.ts +38 -0
- package/dist/js/integrations/expoupdateslistener.d.ts.map +1 -0
- package/dist/js/integrations/expoupdateslistener.js +130 -0
- package/dist/js/integrations/expoupdateslistener.js.map +1 -0
- package/dist/js/misc.js +2 -2
- package/dist/js/misc.js.map +1 -1
- package/dist/js/options.d.ts +12 -0
- package/dist/js/options.d.ts.map +1 -1
- package/dist/js/options.js.map +1 -1
- package/dist/js/tools/utils.d.ts.map +1 -1
- package/dist/js/tools/utils.js +2 -3
- package/dist/js/tools/utils.js.map +1 -1
- package/dist/js/tracing/integrations/appStart.d.ts +8 -0
- package/dist/js/tracing/integrations/appStart.d.ts.map +1 -1
- package/dist/js/tracing/integrations/appStart.js +56 -7
- package/dist/js/tracing/integrations/appStart.js.map +1 -1
- package/dist/js/tracing/integrations/nativeFrames.d.ts.map +1 -1
- package/dist/js/tracing/integrations/nativeFrames.js +32 -22
- package/dist/js/tracing/integrations/nativeFrames.js.map +1 -1
- package/dist/js/tracing/integrations/timeToDisplayIntegration.d.ts.map +1 -1
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js +1 -0
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js.map +1 -1
- package/dist/js/tracing/reactnativenavigation.js +1 -1
- package/dist/js/tracing/reactnativenavigation.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +3 -1
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/utils/ignorerequirecyclelogs.js +1 -1
- package/dist/js/utils/ignorerequirecyclelogs.js.map +1 -1
- package/dist/js/utils/safe.d.ts +1 -1
- package/dist/js/utils/safe.d.ts.map +1 -1
- package/dist/js/utils/safe.js.map +1 -1
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/ios/RNSentry.mm +47 -1
- package/ios/RNSentryEvents.h +1 -0
- package/ios/RNSentryEvents.m +1 -0
- package/ios/RNSentryVersion.m +1 -1
- package/package.json +13 -13
- package/plugin/build/withSentry.js +1 -1
- package/plugin/build/withSentryAndroidGradlePlugin.d.ts +1 -1
- package/plugin/build/withSentryAndroidGradlePlugin.js +1 -1
- package/scripts/sentry-xcode.sh +14 -0
- package/sentry.gradle +13 -0
- package/src/js/NativeRNSentry.ts +2 -0
- package/ts3.8/dist/js/NativeRNSentry.d.ts +2 -0
- package/ts3.8/dist/js/feedback/FeedbackWidgetManager.d.ts +3 -1
- package/ts3.8/dist/js/feedback/FeedbackWidgetProvider.d.ts +3 -2
- package/ts3.8/dist/js/feedback/ShakeToReportBug.d.ts +27 -0
- package/ts3.8/dist/js/feedback/integration.d.ts +11 -0
- package/ts3.8/dist/js/index.d.ts +1 -1
- package/ts3.8/dist/js/integrations/exports.d.ts +1 -0
- package/ts3.8/dist/js/integrations/expoupdateslistener.d.ts +38 -0
- package/ts3.8/dist/js/options.d.ts +12 -0
- package/ts3.8/dist/js/tracing/integrations/appStart.d.ts +8 -0
- package/ts3.8/dist/js/utils/safe.d.ts +1 -1
- package/ts3.8/dist/js/version.d.ts +1 -1
package/android/build.gradle
CHANGED
|
@@ -55,6 +55,6 @@ android {
|
|
|
55
55
|
dependencies {
|
|
56
56
|
compileOnly files('libs/replay-stubs.jar')
|
|
57
57
|
implementation 'com.facebook.react:react-native:+'
|
|
58
|
-
api 'io.sentry:sentry-android:8.
|
|
59
|
-
debugImplementation 'io.sentry:sentry-spotlight:8.
|
|
58
|
+
api 'io.sentry:sentry-android:8.36.0'
|
|
59
|
+
debugImplementation 'io.sentry:sentry-spotlight:8.36.0'
|
|
60
60
|
}
|
|
Binary file
|
|
@@ -45,6 +45,7 @@ import io.sentry.android.core.BuildInfoProvider;
|
|
|
45
45
|
import io.sentry.android.core.InternalSentrySdk;
|
|
46
46
|
import io.sentry.android.core.SentryAndroidDateProvider;
|
|
47
47
|
import io.sentry.android.core.SentryAndroidOptions;
|
|
48
|
+
import io.sentry.android.core.SentryShakeDetector;
|
|
48
49
|
import io.sentry.android.core.ViewHierarchyEventProcessor;
|
|
49
50
|
import io.sentry.android.core.internal.debugmeta.AssetsDebugMetaLoader;
|
|
50
51
|
import io.sentry.android.core.internal.util.SentryFrameMetricsCollector;
|
|
@@ -122,6 +123,9 @@ public class RNSentryModuleImpl {
|
|
|
122
123
|
|
|
123
124
|
private final @NotNull Runnable emitNewFrameEvent;
|
|
124
125
|
|
|
126
|
+
private static final String ON_SHAKE_EVENT = "rn_sentry_on_shake";
|
|
127
|
+
private @Nullable SentryShakeDetector shakeDetector;
|
|
128
|
+
|
|
125
129
|
/** Max trace file size in bytes. */
|
|
126
130
|
private long maxTraceFileSize = 5 * 1024 * 1024;
|
|
127
131
|
|
|
@@ -208,10 +212,58 @@ public class RNSentryModuleImpl {
|
|
|
208
212
|
}
|
|
209
213
|
|
|
210
214
|
public void removeListeners(double id) {
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
+
// removeListeners does not carry event-type information, so it cannot be used
|
|
216
|
+
// to track shake listeners selectively. Shake detection is managed exclusively
|
|
217
|
+
// via enableShakeDetection / disableShakeDetection.
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private void startShakeDetection() {
|
|
221
|
+
if (shakeDetector != null) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
try { // NOPMD - We don't want to crash in any case
|
|
226
|
+
final ReactApplicationContext context = getReactApplicationContext();
|
|
227
|
+
shakeDetector = new SentryShakeDetector(logger);
|
|
228
|
+
shakeDetector.start(
|
|
229
|
+
context,
|
|
230
|
+
() -> {
|
|
231
|
+
try { // NOPMD - We don't want to crash in any case
|
|
232
|
+
final ReactApplicationContext ctx = getReactApplicationContext();
|
|
233
|
+
if (ctx.hasActiveReactInstance()) {
|
|
234
|
+
ctx.getJSModule(
|
|
235
|
+
com.facebook.react.modules.core.DeviceEventManagerModule
|
|
236
|
+
.RCTDeviceEventEmitter.class)
|
|
237
|
+
.emit(ON_SHAKE_EVENT, null);
|
|
238
|
+
}
|
|
239
|
+
} catch (Throwable e) { // NOPMD - We don't want to crash in any case
|
|
240
|
+
logger.log(SentryLevel.WARNING, "Failed to emit shake event.", e);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
} catch (Throwable e) { // NOPMD - We don't want to crash in any case
|
|
244
|
+
logger.log(SentryLevel.WARNING, "Failed to start shake detection.", e);
|
|
245
|
+
shakeDetector = null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private void stopShakeDetection() {
|
|
250
|
+
try { // NOPMD - We don't want to crash in any case
|
|
251
|
+
if (shakeDetector != null) {
|
|
252
|
+
shakeDetector.stop();
|
|
253
|
+
shakeDetector = null;
|
|
254
|
+
}
|
|
255
|
+
} catch (Throwable e) { // NOPMD - We don't want to crash in any case
|
|
256
|
+
logger.log(SentryLevel.WARNING, "Failed to stop shake detection.", e);
|
|
257
|
+
shakeDetector = null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
public void enableShakeDetection() {
|
|
262
|
+
startShakeDetection();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
public void disableShakeDetection() {
|
|
266
|
+
stopShakeDetection();
|
|
215
267
|
}
|
|
216
268
|
|
|
217
269
|
public void fetchModules(Promise promise) {
|
|
@@ -151,6 +151,9 @@ final class RNSentryStart {
|
|
|
151
151
|
if (rnOptions.hasKey("enableTombstone")) {
|
|
152
152
|
options.setTombstoneEnabled(rnOptions.getBoolean("enableTombstone"));
|
|
153
153
|
}
|
|
154
|
+
if (rnOptions.hasKey("enableAnrFingerprinting")) {
|
|
155
|
+
options.setEnableAnrFingerprinting(rnOptions.getBoolean("enableAnrFingerprinting"));
|
|
156
|
+
}
|
|
154
157
|
if (rnOptions.hasKey("spotlight")) {
|
|
155
158
|
if (rnOptions.getType("spotlight") == ReadableType.Boolean) {
|
|
156
159
|
options.setEnableSpotlight(rnOptions.getBoolean("spotlight"));
|
|
@@ -2,7 +2,7 @@ package io.sentry.react;
|
|
|
2
2
|
|
|
3
3
|
class RNSentryVersion {
|
|
4
4
|
static final String REACT_NATIVE_SDK_PACKAGE_NAME = "npm:@sentry/react-native";
|
|
5
|
-
static final String REACT_NATIVE_SDK_PACKAGE_VERSION = "8.
|
|
5
|
+
static final String REACT_NATIVE_SDK_PACKAGE_VERSION = "8.5.0";
|
|
6
6
|
static final String NATIVE_SDK_NAME = "sentry.native.android.react-native";
|
|
7
7
|
static final String ANDROID_SDK_NAME = "sentry.java.android.react-native";
|
|
8
8
|
static final String REACT_NATIVE_SDK_NAME = "sentry.javascript.react-native";
|
|
@@ -212,4 +212,14 @@ public class RNSentryModule extends NativeRNSentrySpec {
|
|
|
212
212
|
public boolean setActiveSpanId(String spanId) {
|
|
213
213
|
return this.impl.setActiveSpanId(spanId);
|
|
214
214
|
}
|
|
215
|
+
|
|
216
|
+
@Override
|
|
217
|
+
public void enableShakeDetection() {
|
|
218
|
+
this.impl.enableShakeDetection();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@Override
|
|
222
|
+
public void disableShakeDetection() {
|
|
223
|
+
this.impl.disableShakeDetection();
|
|
224
|
+
}
|
|
215
225
|
}
|
|
@@ -212,4 +212,14 @@ public class RNSentryModule extends ReactContextBaseJavaModule {
|
|
|
212
212
|
public boolean setActiveSpanId(String spanId) {
|
|
213
213
|
return this.impl.setActiveSpanId(spanId);
|
|
214
214
|
}
|
|
215
|
+
|
|
216
|
+
@ReactMethod
|
|
217
|
+
public void enableShakeDetection() {
|
|
218
|
+
this.impl.enableShakeDetection();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@ReactMethod
|
|
222
|
+
public void disableShakeDetection() {
|
|
223
|
+
this.impl.disableShakeDetection();
|
|
224
|
+
}
|
|
215
225
|
}
|
|
@@ -50,6 +50,8 @@ export interface Spec extends TurboModule {
|
|
|
50
50
|
popTimeToDisplayFor(key: string): Promise<number | undefined | null>;
|
|
51
51
|
setActiveSpanId(spanId: string): boolean;
|
|
52
52
|
encodeToBase64(data: number[]): Promise<string | undefined | null>;
|
|
53
|
+
enableShakeDetection(): void;
|
|
54
|
+
disableShakeDetection(): void;
|
|
53
55
|
}
|
|
54
56
|
export type NativeStackFrame = {
|
|
55
57
|
platform: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAIjE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yBAAyB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IAChE,aAAa,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,eAAe,CACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QACP,WAAW,EAAE,OAAO,CAAC;KACtB,GACA,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACpE,gBAAgB,IAAI,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,2BAA2B,IAAI,IAAI,CAAC;IACpC,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACrD,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC9C,yBAAyB,IAAI,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IAC1E,wBAAwB,IAAI,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IACzE,mBAAmB,IAAI,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC9D,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAC1D,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,CAAC,eAAe,EAAE,YAAY,GAAG,IAAI,EAAE,aAAa,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IACxF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,aAAa,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,0BAA0B,IAAI,IAAI,CAAC;IACnC,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACnD,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3D,cAAc,CAAC,iBAAiB,EAAE,OAAO,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,aAAa,IAAI;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,YAAY,CAAC;QAC7B,cAAc,CAAC,EAAE,YAAY,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,sBAAsB,IAAI,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACpD,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAAC;IAC3F,yCAAyC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,aAAa,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACxE,kBAAkB,IAAI,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAChD,cAAc,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACrE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAiKnD,2DAA2D;AAC3D,eAAe,mBAAmB,CAAC,YAAY,CAAO,UAAU,CAAC,CAAC","sourcesContent":["import type { Package } from '@sentry/core';\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\nimport type { UnsafeObject } from './utils/rnlibrariesinterface';\n\n// There has to be only one interface and it has to be named `Spec`\n// Only extra allowed definitions are types (probably codegen bug)\nexport interface Spec extends TurboModule {\n addListener: (eventType: string) => void;\n removeListeners: (id: number) => void;\n getNewScreenTimeToDisplay(): Promise<number | undefined | null>;\n addBreadcrumb(breadcrumb: UnsafeObject): void;\n captureEnvelope(\n bytes: string,\n options: {\n hardCrashed: boolean;\n },\n ): Promise<boolean>;\n captureScreenshot(): Promise<NativeScreenshot[] | undefined | null>;\n clearBreadcrumbs(): void;\n crash(): void;\n closeNativeSdk(): Promise<void>;\n disableNativeFramesTracking(): void;\n fetchNativeRelease(): Promise<NativeReleaseResponse>;\n fetchNativeSdkInfo(): Promise<Package | null>;\n fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse | null>;\n fetchNativeLogAttributes(): Promise<NativeDeviceContextsResponse | null>;\n fetchNativeAppStart(): Promise<NativeAppStartResponse | null>;\n fetchNativeFrames(): Promise<NativeFramesResponse | null>;\n initNativeSdk(options: UnsafeObject): Promise<boolean>;\n setUser(defaultUserKeys: UnsafeObject | null, otherUserKeys: UnsafeObject | null): void;\n setContext(key: string, value: UnsafeObject | null): void;\n setExtra(key: string, value: string): void;\n setTag(key: string, value: string): void;\n setAttribute(key: string, value: string): void;\n setAttributes(attributes: UnsafeObject): void;\n enableNativeFramesTracking(): void;\n fetchModules(): Promise<string | undefined | null>;\n fetchViewHierarchy(): Promise<number[] | undefined | null>;\n startProfiling(platformProfilers: boolean): { started?: boolean; error?: string };\n stopProfiling(): {\n profile?: string;\n nativeProfile?: UnsafeObject;\n androidProfile?: UnsafeObject;\n error?: string;\n };\n fetchNativePackageName(): string | undefined | null;\n fetchNativeStackFramesBy(instructionsAddr: number[]): NativeStackFrames | undefined | null;\n initNativeReactNavigationNewFrameTracking(): Promise<void>;\n captureReplay(isHardCrash: boolean): Promise<string | undefined | null>;\n getCurrentReplayId(): string | undefined | null;\n crashedLastRun(): Promise<boolean | undefined | null>;\n getDataFromUri(uri: string): Promise<number[]>;\n popTimeToDisplayFor(key: string): Promise<number | undefined | null>;\n setActiveSpanId(spanId: string): boolean;\n encodeToBase64(data: number[]): Promise<string | undefined | null>;\n enableShakeDetection(): void;\n disableShakeDetection(): void;\n}\n\nexport type NativeStackFrame = {\n platform: string;\n /**\n * The instruction address of this frame.\n * Formatted as hex with 0x prefix.\n */\n instruction_addr: string;\n package?: string;\n /**\n * The debug image address of this frame.\n * Formatted as hex with 0x prefix.\n */\n image_addr?: string;\n in_app?: boolean;\n /**\n * The symbol name of this frame.\n * If symbolicated locally.\n */\n function?: string;\n /**\n * The symbol address of this frame.\n * If symbolicated locally.\n * Formatted as hex with 0x prefix.\n */\n symbol_addr?: string;\n};\n\nexport type NativeDebugImage = {\n name?: string;\n type?: string;\n uuid?: string;\n debug_id?: string;\n image_addr?: string;\n image_size?: number;\n code_file?: string;\n image_vmaddr?: string;\n};\n\nexport type NativeStackFrames = {\n frames: NativeStackFrame[];\n debugMetaImages?: NativeDebugImage[];\n};\n\nexport type NativeAppStartResponse = {\n type: 'cold' | 'warm' | 'unknown';\n has_fetched: boolean;\n app_start_timestamp_ms?: number;\n spans: {\n description: string;\n start_timestamp_ms: number;\n end_timestamp_ms: number;\n }[];\n};\n\nexport type NativeFramesResponse = {\n totalFrames: number;\n slowFrames: number;\n frozenFrames: number;\n};\n\nexport type NativeReleaseResponse = {\n build: string;\n id: string;\n version: string;\n};\n\n/**\n * This type describes serialized scope from sentry-cocoa and sentry-android\n * https://github.com/getsentry/sentry-cocoa/blob/master/Sources/Sentry/SentryScope.m\n * https://github.com/getsentry/sentry-java/blob/a461f7e125b65240004e6162b341f383ce2e1394/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java#L32\n */\nexport type NativeDeviceContextsResponse = {\n [key: string]: unknown;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n contexts?: Record<string, Record<string, unknown>>;\n user?: {\n userId?: string;\n email?: string;\n username?: string;\n ipAddress?: string;\n data?: Record<string, unknown>;\n };\n dist?: string;\n environment?: string;\n fingerprint?: string[];\n level?: string;\n breadcrumbs?: {\n level?: string;\n timestamp?: string;\n category?: string;\n type?: string;\n message?: string;\n data?: Record<string, unknown>;\n }[];\n};\n\nexport type NativeScreenshot = {\n data: number[];\n contentType: string;\n filename: string;\n};\n\n// The export must be here to pass codegen even if not used\nexport default TurboModuleRegistry.getEnforcing<Spec>('RNSentry');\n"]}
|
|
@@ -49,5 +49,7 @@ declare const resetFeedbackButtonManager: () => void;
|
|
|
49
49
|
declare const showScreenshotButton: () => void;
|
|
50
50
|
declare const hideScreenshotButton: () => void;
|
|
51
51
|
declare const resetScreenshotButtonManager: () => void;
|
|
52
|
-
|
|
52
|
+
declare const enableFeedbackOnShake: () => void;
|
|
53
|
+
declare const disableFeedbackOnShake: () => void;
|
|
54
|
+
export { showFeedbackButton, hideFeedbackButton, showFeedbackWidget, enableFeedbackOnShake, disableFeedbackOnShake, showScreenshotButton, hideScreenshotButton, resetFeedbackButtonManager, resetFeedbackWidgetManager, resetScreenshotButtonManager };
|
|
53
55
|
//# sourceMappingURL=FeedbackWidgetManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidgetManager.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetManager.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FeedbackWidgetManager.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetManager.tsx"],"names":[],"mappings":"AAKA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAMjD,uBAAe,eAAe;IAC5B,SAAS,CAAC,MAAM,CAAC,UAAU,UAAS;IACpC,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE5D,SAAS,CAAC,MAAM,KAAK,sBAAsB,IAAI,MAAM,CAEpD;WAEa,UAAU,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIzE;;OAEG;WACW,KAAK,IAAI,IAAI;WAKb,IAAI,IAAI,IAAI;WAWZ,IAAI,IAAI,IAAI;WAWZ,aAAa,IAAI,OAAO;CAGvC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACH,SAAS,CAAC,MAAM,KAAK,sBAAsB,IAAI,MAAM,CAEpD;CACF;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACH,SAAS,CAAC,MAAM,KAAK,sBAAsB,IAAI,MAAM,CAEpD;CACF;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D;;OAEG;IACH,SAAS,CAAC,MAAM,KAAK,sBAAsB,IAAI,MAAM,CAEpD;CACF;AAED,QAAA,MAAM,kBAAkB,QAAO,IAG9B,CAAC;AAEF,QAAA,MAAM,0BAA0B,QAAO,IAEtC,CAAC;AAEF,QAAA,MAAM,kBAAkB,QAAO,IAG9B,CAAC;AAEF,QAAA,MAAM,kBAAkB,QAAO,IAE9B,CAAC;AAEF,QAAA,MAAM,0BAA0B,QAAO,IAEtC,CAAC;AAEF,QAAA,MAAM,oBAAoB,QAAO,IAOhC,CAAC;AAEF,QAAA,MAAM,oBAAoB,QAAO,IAEhC,CAAC;AAEF,QAAA,MAAM,4BAA4B,QAAO,IAExC,CAAC;AAIF,QAAA,MAAM,qBAAqB,QAAO,IAKjC,CAAC;AAEF,QAAA,MAAM,sBAAsB,QAAO,IAKlC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { debug } from '@sentry/core';
|
|
2
2
|
import { isWeb } from '../utils/environment';
|
|
3
3
|
import { lazyLoadAutoInjectFeedbackButtonIntegration, lazyLoadAutoInjectFeedbackIntegration, lazyLoadAutoInjectScreenshotButtonIntegration } from './lazy';
|
|
4
|
+
import { startShakeListener, stopShakeListener } from './ShakeToReportBug';
|
|
4
5
|
export const PULL_DOWN_CLOSE_THRESHOLD = 200;
|
|
5
6
|
export const SLIDE_ANIMATION_DURATION = 200;
|
|
6
7
|
export const BACKGROUND_ANIMATION_DURATION = 200;
|
|
@@ -112,5 +113,18 @@ const hideScreenshotButton = () => {
|
|
|
112
113
|
const resetScreenshotButtonManager = () => {
|
|
113
114
|
ScreenshotButtonManager.reset();
|
|
114
115
|
};
|
|
115
|
-
|
|
116
|
+
let _imperativeShakeListenerStarted = false;
|
|
117
|
+
const enableFeedbackOnShake = () => {
|
|
118
|
+
lazyLoadAutoInjectFeedbackIntegration();
|
|
119
|
+
if (!_imperativeShakeListenerStarted) {
|
|
120
|
+
_imperativeShakeListenerStarted = startShakeListener(showFeedbackWidget);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const disableFeedbackOnShake = () => {
|
|
124
|
+
if (_imperativeShakeListenerStarted) {
|
|
125
|
+
stopShakeListener();
|
|
126
|
+
_imperativeShakeListenerStarted = false;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
export { showFeedbackButton, hideFeedbackButton, showFeedbackWidget, enableFeedbackOnShake, disableFeedbackOnShake, showScreenshotButton, hideScreenshotButton, resetFeedbackButtonManager, resetFeedbackWidgetManager, resetScreenshotButtonManager };
|
|
116
130
|
//# sourceMappingURL=FeedbackWidgetManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidgetManager.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetManager.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,KAAK,EAAG,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,2CAA2C,EAAC,qCAAqC,EAAE,6CAA6C,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackWidgetManager.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetManager.tsx"],"names":[],"mappings":"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","sourcesContent":["import { debug } from '@sentry/core';\nimport { isWeb } from '../utils/environment';\nimport { lazyLoadAutoInjectFeedbackButtonIntegration,lazyLoadAutoInjectFeedbackIntegration, lazyLoadAutoInjectScreenshotButtonIntegration } from './lazy';\nimport { startShakeListener, stopShakeListener } from './ShakeToReportBug';\n\nexport const PULL_DOWN_CLOSE_THRESHOLD = 200;\nexport const SLIDE_ANIMATION_DURATION = 200;\nexport const BACKGROUND_ANIMATION_DURATION = 200;\n\nconst NOOP_SET_VISIBILITY = (): void => {\n // No-op\n};\n\nabstract class FeedbackManager {\n protected static _isVisible = false;\n protected static _setVisibility: (visible: boolean) => void;\n\n protected static get _feedbackComponentName(): string {\n throw new Error('Subclasses must override feedbackComponentName');\n }\n\n public static initialize(setVisibility: (visible: boolean) => void): void {\n this._setVisibility = setVisibility;\n }\n\n /**\n * For testing purposes only.\n */\n public static reset(): void {\n this._isVisible = false;\n this._setVisibility = NOOP_SET_VISIBILITY;\n }\n\n public static show(): void {\n if (this._setVisibility !== NOOP_SET_VISIBILITY) {\n this._isVisible = true;\n this._setVisibility(true);\n } else {\n // This message should be always shown otherwise it's not possible to use the widget.\n // eslint-disable-next-line no-console\n console.warn(`[Sentry] ${this._feedbackComponentName} requires 'Sentry.wrap(RootComponent)' to be called before 'show${this._feedbackComponentName}()'.`);\n }\n }\n\n public static hide(): void {\n if (this._setVisibility !== NOOP_SET_VISIBILITY) {\n this._isVisible = false;\n this._setVisibility(false);\n } else {\n // This message should be always shown otherwise it's not possible to use the widget.\n // eslint-disable-next-line no-console\n console.warn(`[Sentry] ${this._feedbackComponentName} requires 'Sentry.wrap(RootComponent)' before interacting with the widget.`);\n }\n }\n\n public static isFormVisible(): boolean {\n return this._isVisible;\n }\n}\n\n/**\n * Provides functionality to show and hide the feedback widget.\n */\nexport class FeedbackWidgetManager extends FeedbackManager {\n /**\n * Returns the name of the feedback component.\n */\n protected static get _feedbackComponentName(): string {\n return 'FeedbackWidget';\n }\n}\n\n/**\n * Provides functionality to show and hide the feedback button.\n */\nexport class FeedbackButtonManager extends FeedbackManager {\n /**\n * Returns the name of the feedback component.\n */\n protected static get _feedbackComponentName(): string {\n return 'FeedbackButton';\n }\n}\n\n/**\n * Provides functionality to show and hide the screenshot button.\n */\nexport class ScreenshotButtonManager extends FeedbackManager {\n /**\n * Returns the name of the feedback component.\n */\n protected static get _feedbackComponentName(): string {\n return 'ScreenshotButton';\n }\n}\n\nconst showFeedbackWidget = (): void => {\n lazyLoadAutoInjectFeedbackIntegration();\n FeedbackWidgetManager.show();\n};\n\nconst resetFeedbackWidgetManager = (): void => {\n FeedbackWidgetManager.reset();\n};\n\nconst showFeedbackButton = (): void => {\n lazyLoadAutoInjectFeedbackButtonIntegration();\n FeedbackButtonManager.show();\n};\n\nconst hideFeedbackButton = (): void => {\n FeedbackButtonManager.hide();\n};\n\nconst resetFeedbackButtonManager = (): void => {\n FeedbackButtonManager.reset();\n};\n\nconst showScreenshotButton = (): void => {\n if (isWeb()) {\n debug.warn('ScreenshotButton is not supported on Web.');\n return;\n }\n lazyLoadAutoInjectScreenshotButtonIntegration();\n ScreenshotButtonManager.show();\n};\n\nconst hideScreenshotButton = (): void => {\n ScreenshotButtonManager.hide();\n};\n\nconst resetScreenshotButtonManager = (): void => {\n ScreenshotButtonManager.reset();\n};\n\nlet _imperativeShakeListenerStarted = false;\n\nconst enableFeedbackOnShake = (): void => {\n lazyLoadAutoInjectFeedbackIntegration();\n if (!_imperativeShakeListenerStarted) {\n _imperativeShakeListenerStarted = startShakeListener(showFeedbackWidget);\n }\n};\n\nconst disableFeedbackOnShake = (): void => {\n if (_imperativeShakeListenerStarted) {\n stopShakeListener();\n _imperativeShakeListenerStarted = false;\n }\n};\n\nexport { showFeedbackButton, hideFeedbackButton, showFeedbackWidget, enableFeedbackOnShake, disableFeedbackOnShake, showScreenshotButton, hideScreenshotButton, resetFeedbackButtonManager, resetFeedbackWidgetManager, resetScreenshotButtonManager };\n"]}
|
|
@@ -21,14 +21,15 @@ export interface FeedbackWidgetProviderState {
|
|
|
21
21
|
export declare class FeedbackWidgetProvider extends React.Component<FeedbackWidgetProviderProps> {
|
|
22
22
|
state: FeedbackWidgetProviderState;
|
|
23
23
|
private _themeListener;
|
|
24
|
+
private _startedShakeListener;
|
|
24
25
|
private _panResponder;
|
|
25
26
|
constructor(props: FeedbackWidgetProviderProps);
|
|
26
27
|
/**
|
|
27
|
-
* Add a listener to the theme change event.
|
|
28
|
+
* Add a listener to the theme change event and start shake detection if configured.
|
|
28
29
|
*/
|
|
29
30
|
componentDidMount(): void;
|
|
30
31
|
/**
|
|
31
|
-
* Clean up the theme listener.
|
|
32
|
+
* Clean up the theme listener and stop shake detection.
|
|
32
33
|
*/
|
|
33
34
|
componentWillUnmount(): void;
|
|
34
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidgetProvider.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAmK,MAAM,cAAc,CAAC;AAMzM,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackWidgetProvider.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAmK,MAAM,cAAc,CAAC;AAMzM,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAiBnE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,OAAO,CAAC;IACzB,yBAAyB,EAAE,OAAO,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC;IAClC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK,CAAC,SAAS,CAAC,2BAA2B,CAAC;IAC/E,KAAK,EAAE,2BAA2B,CAOvC;IAEF,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,qBAAqB,CAAkB;IAE/C,OAAO,CAAC,aAAa,CA8BlB;gBAEgB,KAAK,EAAE,2BAA2B;IAOrD;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAUhC;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAUnC;;OAEG;IACI,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,2BAA2B,GAAG,IAAI;IAuBxF;;OAEG;IACI,MAAM,IAAI,KAAK,CAAC,SAAS;IAwDhC,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,sBAAsB,CA0B5B;IAEF,OAAO,CAAC,4BAA4B,CAElC;IAEF,OAAO,CAAC,sCAAsC,CAE5C;IAEF,OAAO,CAAC,YAAY,CAElB;CACH"}
|
|
@@ -6,9 +6,10 @@ import { FeedbackButton } from './FeedbackButton';
|
|
|
6
6
|
import { FeedbackWidget } from './FeedbackWidget';
|
|
7
7
|
import { modalSheetContainer, modalWrapper, topSpacer } from './FeedbackWidget.styles';
|
|
8
8
|
import { getTheme } from './FeedbackWidget.theme';
|
|
9
|
-
import { BACKGROUND_ANIMATION_DURATION, FeedbackButtonManager, FeedbackWidgetManager, PULL_DOWN_CLOSE_THRESHOLD, ScreenshotButtonManager, SLIDE_ANIMATION_DURATION, } from './FeedbackWidgetManager';
|
|
10
|
-
import { getFeedbackButtonOptions, getFeedbackOptions, getScreenshotButtonOptions } from './integration';
|
|
9
|
+
import { BACKGROUND_ANIMATION_DURATION, FeedbackButtonManager, FeedbackWidgetManager, PULL_DOWN_CLOSE_THRESHOLD, ScreenshotButtonManager, showFeedbackWidget, SLIDE_ANIMATION_DURATION, } from './FeedbackWidgetManager';
|
|
10
|
+
import { getFeedbackButtonOptions, getFeedbackOptions, getScreenshotButtonOptions, isShakeToReportEnabled } from './integration';
|
|
11
11
|
import { ScreenshotButton } from './ScreenshotButton';
|
|
12
|
+
import { startShakeListener, stopShakeListener } from './ShakeToReportBug';
|
|
12
13
|
import { isModalSupported, isNativeDriverSupportedForColorAnimations } from './utils';
|
|
13
14
|
const useNativeDriverForColorAnimations = isNativeDriverSupportedForColorAnimations();
|
|
14
15
|
/**
|
|
@@ -27,6 +28,7 @@ export class FeedbackWidgetProvider extends React.Component {
|
|
|
27
28
|
panY: new Animated.Value(Dimensions.get('screen').height),
|
|
28
29
|
isScrollAtTop: true,
|
|
29
30
|
};
|
|
31
|
+
this._startedShakeListener = false;
|
|
30
32
|
this._panResponder = PanResponder.create({
|
|
31
33
|
onStartShouldSetPanResponder: (_, gestureState) => {
|
|
32
34
|
return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;
|
|
@@ -104,20 +106,26 @@ export class FeedbackWidgetProvider extends React.Component {
|
|
|
104
106
|
FeedbackWidgetManager.initialize(this._setVisibilityFunction);
|
|
105
107
|
}
|
|
106
108
|
/**
|
|
107
|
-
* Add a listener to the theme change event.
|
|
109
|
+
* Add a listener to the theme change event and start shake detection if configured.
|
|
108
110
|
*/
|
|
109
111
|
componentDidMount() {
|
|
110
112
|
this._themeListener = Appearance.addChangeListener(() => {
|
|
111
113
|
this.forceUpdate();
|
|
112
114
|
});
|
|
115
|
+
if (isShakeToReportEnabled()) {
|
|
116
|
+
this._startedShakeListener = startShakeListener(showFeedbackWidget);
|
|
117
|
+
}
|
|
113
118
|
}
|
|
114
119
|
/**
|
|
115
|
-
* Clean up the theme listener.
|
|
120
|
+
* Clean up the theme listener and stop shake detection.
|
|
116
121
|
*/
|
|
117
122
|
componentWillUnmount() {
|
|
118
123
|
if (this._themeListener) {
|
|
119
124
|
this._themeListener.remove();
|
|
120
125
|
}
|
|
126
|
+
if (this._startedShakeListener) {
|
|
127
|
+
stopShakeListener();
|
|
128
|
+
}
|
|
121
129
|
}
|
|
122
130
|
/**
|
|
123
131
|
* Animates the background opacity when the modal is shown.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidgetProvider.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { debug } from '@sentry/core';\nimport * as React from 'react';\nimport { Animated, Appearance, Dimensions, Easing, Modal, type NativeEventSubscription, type NativeScrollEvent,type NativeSyntheticEvent, PanResponder, Platform, ScrollView, View } from 'react-native';\nimport { notWeb } from '../utils/environment';\nimport { FeedbackButton } from './FeedbackButton';\nimport { FeedbackWidget } from './FeedbackWidget';\nimport { modalSheetContainer,modalWrapper, topSpacer } from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackWidgetStyles } from './FeedbackWidget.types';\nimport {\n BACKGROUND_ANIMATION_DURATION,\n FeedbackButtonManager,\n FeedbackWidgetManager,\n PULL_DOWN_CLOSE_THRESHOLD,\n ScreenshotButtonManager,\n SLIDE_ANIMATION_DURATION,\n} from './FeedbackWidgetManager';\nimport { getFeedbackButtonOptions, getFeedbackOptions, getScreenshotButtonOptions } from './integration';\nimport { ScreenshotButton } from './ScreenshotButton';\nimport { isModalSupported, isNativeDriverSupportedForColorAnimations } from './utils';\n\nconst useNativeDriverForColorAnimations = isNativeDriverSupportedForColorAnimations();\n\nexport interface FeedbackWidgetProviderProps {\n children: React.ReactNode;\n styles?: FeedbackWidgetStyles;\n}\n\nexport interface FeedbackWidgetProviderState {\n isButtonVisible: boolean;\n isScreenshotButtonVisible: boolean;\n isVisible: boolean;\n backgroundOpacity: Animated.Value;\n panY: Animated.Value;\n isScrollAtTop: boolean;\n}\n\n/**\n * FeedbackWidgetProvider is a component that wraps the feedback widget and provides\n * functionality to show and hide the widget. It also manages the visibility of the\n * feedback button and screenshot button.\n */\nexport class FeedbackWidgetProvider extends React.Component<FeedbackWidgetProviderProps> {\n public state: FeedbackWidgetProviderState = {\n isButtonVisible: false,\n isScreenshotButtonVisible: false,\n isVisible: false,\n backgroundOpacity: new Animated.Value(0),\n panY: new Animated.Value(Dimensions.get('screen').height),\n isScrollAtTop: true,\n };\n\n private _themeListener: NativeEventSubscription | undefined;\n\n private _panResponder = PanResponder.create({\n onStartShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onMoveShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onPanResponderMove: (_, gestureState) => {\n if (gestureState.dy > 0) {\n this.state.panY.setValue(gestureState.dy);\n }\n },\n onPanResponderRelease: (_, gestureState) => {\n if (gestureState.dy > PULL_DOWN_CLOSE_THRESHOLD) {\n // Close on swipe below a certain threshold\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n }).start(() => {\n this._handleClose();\n });\n } else {\n // Animate it back to the original position\n Animated.spring(this.state.panY, {\n toValue: 0,\n useNativeDriver: true,\n }).start();\n }\n },\n });\n\n public constructor(props: FeedbackWidgetProviderProps) {\n super(props);\n FeedbackButtonManager.initialize(this._setButtonVisibilityFunction);\n ScreenshotButtonManager.initialize(this._setScreenshotButtonVisibilityFunction);\n FeedbackWidgetManager.initialize(this._setVisibilityFunction);\n }\n\n /**\n * Add a listener to the theme change event.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n }\n\n /**\n * Clean up the theme listener.\n */\n public componentWillUnmount(): void {\n if (this._themeListener) {\n this._themeListener.remove();\n }\n }\n\n /**\n * Animates the background opacity when the modal is shown.\n */\n public componentDidUpdate(_prevProps: any, prevState: FeedbackWidgetProviderState): void {\n if (!prevState.isVisible && this.state.isVisible) {\n Animated.parallel([\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 1,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.in(Easing.quad),\n }),\n Animated.timing(this.state.panY, {\n toValue: 0,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.in(Easing.quad),\n }),\n ]).start(() => {\n debug.log('FeedbackWidgetProvider componentDidUpdate');\n });\n } else if (prevState.isVisible && !this.state.isVisible) {\n this.state.backgroundOpacity.setValue(0);\n }\n }\n\n /**\n * Renders the feedback form modal.\n */\n public render(): React.ReactNode {\n if (!isModalSupported()) {\n debug.error('FeedbackWidget Modal is not supported in React Native < 0.71 with Fabric renderer.');\n return <>{this.props.children}</>;\n }\n\n const theme = getTheme();\n\n const { isButtonVisible, isScreenshotButtonVisible, isVisible, backgroundOpacity } = this.state;\n\n const backgroundColor = backgroundOpacity.interpolate({\n inputRange: [0, 1],\n outputRange: ['rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.9)'],\n });\n\n // Wrapping the `Modal` component in a `View` component is necessary to avoid\n // issues like https://github.com/software-mansion/react-native-reanimated/issues/6035\n return (\n <>\n {this.props.children}\n {isButtonVisible && <FeedbackButton {...getFeedbackButtonOptions()} />}\n {isScreenshotButtonVisible && <ScreenshotButton {...getScreenshotButtonOptions()} />}\n {isVisible && (\n <Animated.View style={[modalWrapper, { backgroundColor }]}>\n <Modal\n visible={isVisible}\n transparent\n animationType=\"none\"\n onRequestClose={this._handleClose}\n testID=\"feedback-form-modal\"\n >\n <View style={topSpacer} />\n <Animated.View\n style={[modalSheetContainer(theme), { transform: [{ translateY: this.state.panY }] }]}\n {...this._panResponder.panHandlers}\n >\n <ScrollView\n bounces={false}\n keyboardShouldPersistTaps=\"handled\"\n automaticallyAdjustKeyboardInsets={Platform.OS === 'ios'}\n onScroll={this._handleScroll}\n >\n <FeedbackWidget\n {...getFeedbackOptions()}\n onFormClose={this._handleClose}\n onFormSubmitted={this._handleClose}\n />\n </ScrollView>\n </Animated.View>\n </Modal>\n </Animated.View>\n )}\n </>\n );\n }\n\n private _handleScroll = (event: NativeSyntheticEvent<NativeScrollEvent>): void => {\n this.setState({ isScrollAtTop: event.nativeEvent.contentOffset.y <= 0 });\n };\n\n private _setVisibilityFunction = (visible: boolean): void => {\n const updateState = (): void => {\n this.setState({ isVisible: visible });\n };\n if (!visible) {\n Animated.parallel([\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.out(Easing.quad),\n }),\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 0,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.out(Easing.quad),\n }),\n ]).start(() => {\n // Change of the state unmount the component\n // which would cancel the animation\n updateState();\n });\n } else {\n updateState();\n }\n };\n\n private _setButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isButtonVisible: visible });\n };\n\n private _setScreenshotButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isScreenshotButtonVisible: visible });\n };\n\n private _handleClose = (): void => {\n FeedbackWidgetManager.hide();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FeedbackWidgetProvider.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { debug } from '@sentry/core';\nimport * as React from 'react';\nimport { Animated, Appearance, Dimensions, Easing, Modal, type NativeEventSubscription, type NativeScrollEvent,type NativeSyntheticEvent, PanResponder, Platform, ScrollView, View } from 'react-native';\nimport { notWeb } from '../utils/environment';\nimport { FeedbackButton } from './FeedbackButton';\nimport { FeedbackWidget } from './FeedbackWidget';\nimport { modalSheetContainer,modalWrapper, topSpacer } from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackWidgetStyles } from './FeedbackWidget.types';\nimport {\n BACKGROUND_ANIMATION_DURATION,\n FeedbackButtonManager,\n FeedbackWidgetManager,\n PULL_DOWN_CLOSE_THRESHOLD,\n ScreenshotButtonManager,\n showFeedbackWidget,\n SLIDE_ANIMATION_DURATION,\n} from './FeedbackWidgetManager';\nimport { getFeedbackButtonOptions, getFeedbackOptions, getScreenshotButtonOptions, isShakeToReportEnabled } from './integration';\nimport { ScreenshotButton } from './ScreenshotButton';\nimport { startShakeListener, stopShakeListener } from './ShakeToReportBug';\nimport { isModalSupported, isNativeDriverSupportedForColorAnimations } from './utils';\n\nconst useNativeDriverForColorAnimations = isNativeDriverSupportedForColorAnimations();\n\nexport interface FeedbackWidgetProviderProps {\n children: React.ReactNode;\n styles?: FeedbackWidgetStyles;\n}\n\nexport interface FeedbackWidgetProviderState {\n isButtonVisible: boolean;\n isScreenshotButtonVisible: boolean;\n isVisible: boolean;\n backgroundOpacity: Animated.Value;\n panY: Animated.Value;\n isScrollAtTop: boolean;\n}\n\n/**\n * FeedbackWidgetProvider is a component that wraps the feedback widget and provides\n * functionality to show and hide the widget. It also manages the visibility of the\n * feedback button and screenshot button.\n */\nexport class FeedbackWidgetProvider extends React.Component<FeedbackWidgetProviderProps> {\n public state: FeedbackWidgetProviderState = {\n isButtonVisible: false,\n isScreenshotButtonVisible: false,\n isVisible: false,\n backgroundOpacity: new Animated.Value(0),\n panY: new Animated.Value(Dimensions.get('screen').height),\n isScrollAtTop: true,\n };\n\n private _themeListener: NativeEventSubscription | undefined;\n private _startedShakeListener: boolean = false;\n\n private _panResponder = PanResponder.create({\n onStartShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onMoveShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onPanResponderMove: (_, gestureState) => {\n if (gestureState.dy > 0) {\n this.state.panY.setValue(gestureState.dy);\n }\n },\n onPanResponderRelease: (_, gestureState) => {\n if (gestureState.dy > PULL_DOWN_CLOSE_THRESHOLD) {\n // Close on swipe below a certain threshold\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n }).start(() => {\n this._handleClose();\n });\n } else {\n // Animate it back to the original position\n Animated.spring(this.state.panY, {\n toValue: 0,\n useNativeDriver: true,\n }).start();\n }\n },\n });\n\n public constructor(props: FeedbackWidgetProviderProps) {\n super(props);\n FeedbackButtonManager.initialize(this._setButtonVisibilityFunction);\n ScreenshotButtonManager.initialize(this._setScreenshotButtonVisibilityFunction);\n FeedbackWidgetManager.initialize(this._setVisibilityFunction);\n }\n\n /**\n * Add a listener to the theme change event and start shake detection if configured.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n\n if (isShakeToReportEnabled()) {\n this._startedShakeListener = startShakeListener(showFeedbackWidget);\n }\n }\n\n /**\n * Clean up the theme listener and stop shake detection.\n */\n public componentWillUnmount(): void {\n if (this._themeListener) {\n this._themeListener.remove();\n }\n\n if (this._startedShakeListener) {\n stopShakeListener();\n }\n }\n\n /**\n * Animates the background opacity when the modal is shown.\n */\n public componentDidUpdate(_prevProps: any, prevState: FeedbackWidgetProviderState): void {\n if (!prevState.isVisible && this.state.isVisible) {\n Animated.parallel([\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 1,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.in(Easing.quad),\n }),\n Animated.timing(this.state.panY, {\n toValue: 0,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.in(Easing.quad),\n }),\n ]).start(() => {\n debug.log('FeedbackWidgetProvider componentDidUpdate');\n });\n } else if (prevState.isVisible && !this.state.isVisible) {\n this.state.backgroundOpacity.setValue(0);\n }\n }\n\n /**\n * Renders the feedback form modal.\n */\n public render(): React.ReactNode {\n if (!isModalSupported()) {\n debug.error('FeedbackWidget Modal is not supported in React Native < 0.71 with Fabric renderer.');\n return <>{this.props.children}</>;\n }\n\n const theme = getTheme();\n\n const { isButtonVisible, isScreenshotButtonVisible, isVisible, backgroundOpacity } = this.state;\n\n const backgroundColor = backgroundOpacity.interpolate({\n inputRange: [0, 1],\n outputRange: ['rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.9)'],\n });\n\n // Wrapping the `Modal` component in a `View` component is necessary to avoid\n // issues like https://github.com/software-mansion/react-native-reanimated/issues/6035\n return (\n <>\n {this.props.children}\n {isButtonVisible && <FeedbackButton {...getFeedbackButtonOptions()} />}\n {isScreenshotButtonVisible && <ScreenshotButton {...getScreenshotButtonOptions()} />}\n {isVisible && (\n <Animated.View style={[modalWrapper, { backgroundColor }]}>\n <Modal\n visible={isVisible}\n transparent\n animationType=\"none\"\n onRequestClose={this._handleClose}\n testID=\"feedback-form-modal\"\n >\n <View style={topSpacer} />\n <Animated.View\n style={[modalSheetContainer(theme), { transform: [{ translateY: this.state.panY }] }]}\n {...this._panResponder.panHandlers}\n >\n <ScrollView\n bounces={false}\n keyboardShouldPersistTaps=\"handled\"\n automaticallyAdjustKeyboardInsets={Platform.OS === 'ios'}\n onScroll={this._handleScroll}\n >\n <FeedbackWidget\n {...getFeedbackOptions()}\n onFormClose={this._handleClose}\n onFormSubmitted={this._handleClose}\n />\n </ScrollView>\n </Animated.View>\n </Modal>\n </Animated.View>\n )}\n </>\n );\n }\n\n private _handleScroll = (event: NativeSyntheticEvent<NativeScrollEvent>): void => {\n this.setState({ isScrollAtTop: event.nativeEvent.contentOffset.y <= 0 });\n };\n\n private _setVisibilityFunction = (visible: boolean): void => {\n const updateState = (): void => {\n this.setState({ isVisible: visible });\n };\n if (!visible) {\n Animated.parallel([\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.out(Easing.quad),\n }),\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 0,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.out(Easing.quad),\n }),\n ]).start(() => {\n // Change of the state unmount the component\n // which would cancel the animation\n updateState();\n });\n } else {\n updateState();\n }\n };\n\n private _setButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isButtonVisible: visible });\n };\n\n private _setScreenshotButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isScreenshotButtonVisible: visible });\n };\n\n private _handleClose = (): void => {\n FeedbackWidgetManager.hide();\n };\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { NativeModule } from 'react-native';
|
|
2
|
+
import { NativeEventEmitter } from 'react-native';
|
|
3
|
+
export declare const OnShakeEventName = "rn_sentry_on_shake";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a NativeEventEmitter for the given module.
|
|
6
|
+
* Can be overridden in tests via the `createEmitter` parameter.
|
|
7
|
+
*/
|
|
8
|
+
type EmitterFactory = (nativeModule: NativeModule) => NativeEventEmitter;
|
|
9
|
+
/**
|
|
10
|
+
* Starts listening for device shake events and invokes the provided callback when a shake is detected.
|
|
11
|
+
*
|
|
12
|
+
* This starts native shake detection:
|
|
13
|
+
* - iOS: Uses UIKit's motion event detection (no permissions required)
|
|
14
|
+
* - Android: Uses the accelerometer sensor (no permissions required)
|
|
15
|
+
*/
|
|
16
|
+
export declare function startShakeListener(onShake: () => void, createEmitter?: EmitterFactory): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Stops listening for device shake events.
|
|
19
|
+
*/
|
|
20
|
+
export declare function stopShakeListener(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Returns whether the shake listener is currently active.
|
|
23
|
+
* Exported for testing purposes.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isShakeListenerActive(): boolean;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=ShakeToReportBug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShakeToReportBug.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/ShakeToReportBug.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuB,YAAY,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIlD,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAIrD;;;GAGG;AACH,KAAK,cAAc,GAAG,CAAC,YAAY,EAAE,YAAY,KAAK,kBAAkB,CAAC;AAIzE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,IAAI,EACnB,aAAa,GAAE,cAAsC,GACpD,OAAO,CAwCT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAgBxC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { debug } from '@sentry/core';
|
|
2
|
+
import { NativeEventEmitter } from 'react-native';
|
|
3
|
+
import { isWeb } from '../utils/environment';
|
|
4
|
+
import { getRNSentryModule } from '../wrapper';
|
|
5
|
+
export const OnShakeEventName = 'rn_sentry_on_shake';
|
|
6
|
+
let _shakeSubscription = null;
|
|
7
|
+
const defaultEmitterFactory = nativeModule => new NativeEventEmitter(nativeModule);
|
|
8
|
+
/**
|
|
9
|
+
* Starts listening for device shake events and invokes the provided callback when a shake is detected.
|
|
10
|
+
*
|
|
11
|
+
* This starts native shake detection:
|
|
12
|
+
* - iOS: Uses UIKit's motion event detection (no permissions required)
|
|
13
|
+
* - Android: Uses the accelerometer sensor (no permissions required)
|
|
14
|
+
*/
|
|
15
|
+
export function startShakeListener(onShake, createEmitter = defaultEmitterFactory) {
|
|
16
|
+
if (_shakeSubscription) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
if (isWeb()) {
|
|
20
|
+
debug.warn('Shake detection is not supported on Web.');
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const nativeModule = getRNSentryModule();
|
|
24
|
+
if (!nativeModule) {
|
|
25
|
+
debug.warn('Native module is not available. Shake detection will not work.');
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const emitter = createEmitter(nativeModule);
|
|
30
|
+
_shakeSubscription = emitter.addListener(OnShakeEventName, () => {
|
|
31
|
+
onShake();
|
|
32
|
+
});
|
|
33
|
+
// Explicitly enable native shake detection. On iOS with New Architecture (TurboModules),
|
|
34
|
+
// NativeEventEmitter.addListener does not dispatch to native addListener:, so the
|
|
35
|
+
// native shake listener would never start without this explicit call.
|
|
36
|
+
const module = nativeModule;
|
|
37
|
+
if (module.enableShakeDetection) {
|
|
38
|
+
module.enableShakeDetection();
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
debug.warn('enableShakeDetection is not available on the native module.');
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
debug.warn('Failed to start shake listener:', e);
|
|
47
|
+
if (_shakeSubscription) {
|
|
48
|
+
_shakeSubscription.remove();
|
|
49
|
+
_shakeSubscription = null;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Stops listening for device shake events.
|
|
56
|
+
*/
|
|
57
|
+
export function stopShakeListener() {
|
|
58
|
+
var _a;
|
|
59
|
+
if (_shakeSubscription) {
|
|
60
|
+
try {
|
|
61
|
+
_shakeSubscription.remove();
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
debug.warn('Failed to remove shake subscription:', e);
|
|
65
|
+
}
|
|
66
|
+
_shakeSubscription = null;
|
|
67
|
+
try {
|
|
68
|
+
const nativeModule = getRNSentryModule();
|
|
69
|
+
(_a = nativeModule === null || nativeModule === void 0 ? void 0 : nativeModule.disableShakeDetection) === null || _a === void 0 ? void 0 : _a.call(nativeModule);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
debug.warn('Failed to disable native shake detection:', e);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns whether the shake listener is currently active.
|
|
78
|
+
* Exported for testing purposes.
|
|
79
|
+
*/
|
|
80
|
+
export function isShakeListenerActive() {
|
|
81
|
+
return _shakeSubscription !== null;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ShakeToReportBug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShakeToReportBug.js","sourceRoot":"","sources":["../../../src/js/feedback/ShakeToReportBug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD,IAAI,kBAAkB,GAA+B,IAAI,CAAC;AAQ1D,MAAM,qBAAqB,GAAmB,YAAY,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAmB,EACnB,gBAAgC,qBAAqB;IAErD,IAAI,kBAAkB,EAAE;QACtB,OAAO,KAAK,CAAC;KACd;IAED,IAAI,KAAK,EAAE,EAAE;QACX,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;KACd;IAED,MAAM,YAAY,GAAG,iBAAiB,EAA8B,CAAC;IACrE,IAAI,CAAC,YAAY,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC;KACd;IAED,IAAI;QACF,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5C,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC9D,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,yFAAyF;QACzF,kFAAkF;QAClF,sEAAsE;QACtE,MAAM,MAAM,GAAG,YAAqD,CAAC;QACrE,IAAI,MAAM,CAAC,oBAAoB,EAAE;YAC/B,MAAM,CAAC,oBAAoB,EAAE,CAAC;SAC/B;aAAM;YACL,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;SAC3E;QACD,OAAO,IAAI,CAAC;KACb;IAAC,OAAO,CAAC,EAAE;QACV,KAAK,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,kBAAkB,EAAE;YACtB,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC5B,kBAAkB,GAAG,IAAI,CAAC;SAC3B;QACD,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;;IAC/B,IAAI,kBAAkB,EAAE;QACtB,IAAI;YACF,kBAAkB,CAAC,MAAM,EAAE,CAAC;SAC7B;QAAC,OAAO,CAAC,EAAE;YACV,KAAK,CAAC,IAAI,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;SACvD;QACD,kBAAkB,GAAG,IAAI,CAAC;QAE1B,IAAI;YACF,MAAM,YAAY,GAAG,iBAAiB,EAAwD,CAAC;YAC/F,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,qBAAqB,4DAAI,CAAC;SACzC;QAAC,OAAO,CAAC,EAAE;YACV,KAAK,CAAC,IAAI,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;SAC5D;KACF;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,kBAAkB,KAAK,IAAI,CAAC;AACrC,CAAC","sourcesContent":["import { debug } from '@sentry/core';\nimport type { EmitterSubscription, NativeModule } from 'react-native';\nimport { NativeEventEmitter } from 'react-native';\nimport { isWeb } from '../utils/environment';\nimport { getRNSentryModule } from '../wrapper';\n\nexport const OnShakeEventName = 'rn_sentry_on_shake';\n\nlet _shakeSubscription: EmitterSubscription | null = null;\n\n/**\n * Creates a NativeEventEmitter for the given module.\n * Can be overridden in tests via the `createEmitter` parameter.\n */\ntype EmitterFactory = (nativeModule: NativeModule) => NativeEventEmitter;\n\nconst defaultEmitterFactory: EmitterFactory = nativeModule => new NativeEventEmitter(nativeModule);\n\n/**\n * Starts listening for device shake events and invokes the provided callback when a shake is detected.\n *\n * This starts native shake detection:\n * - iOS: Uses UIKit's motion event detection (no permissions required)\n * - Android: Uses the accelerometer sensor (no permissions required)\n */\nexport function startShakeListener(\n onShake: () => void,\n createEmitter: EmitterFactory = defaultEmitterFactory,\n): boolean {\n if (_shakeSubscription) {\n return false;\n }\n\n if (isWeb()) {\n debug.warn('Shake detection is not supported on Web.');\n return false;\n }\n\n const nativeModule = getRNSentryModule() as NativeModule | undefined;\n if (!nativeModule) {\n debug.warn('Native module is not available. Shake detection will not work.');\n return false;\n }\n\n try {\n const emitter = createEmitter(nativeModule);\n _shakeSubscription = emitter.addListener(OnShakeEventName, () => {\n onShake();\n });\n\n // Explicitly enable native shake detection. On iOS with New Architecture (TurboModules),\n // NativeEventEmitter.addListener does not dispatch to native addListener:, so the\n // native shake listener would never start without this explicit call.\n const module = nativeModule as { enableShakeDetection?: () => void };\n if (module.enableShakeDetection) {\n module.enableShakeDetection();\n } else {\n debug.warn('enableShakeDetection is not available on the native module.');\n }\n return true;\n } catch (e) {\n debug.warn('Failed to start shake listener:', e);\n if (_shakeSubscription) {\n _shakeSubscription.remove();\n _shakeSubscription = null;\n }\n return false;\n }\n}\n\n/**\n * Stops listening for device shake events.\n */\nexport function stopShakeListener(): void {\n if (_shakeSubscription) {\n try {\n _shakeSubscription.remove();\n } catch (e) {\n debug.warn('Failed to remove shake subscription:', e);\n }\n _shakeSubscription = null;\n\n try {\n const nativeModule = getRNSentryModule() as { disableShakeDetection?: () => void } | undefined;\n nativeModule?.disableShakeDetection?.();\n } catch (e) {\n debug.warn('Failed to disable native shake detection:', e);\n }\n }\n}\n\n/**\n * Returns whether the shake listener is currently active.\n * Exported for testing purposes.\n */\nexport function isShakeListenerActive(): boolean {\n return _shakeSubscription !== null;\n}\n"]}
|
|
@@ -9,6 +9,7 @@ type FeedbackIntegration = Integration & {
|
|
|
9
9
|
colorScheme?: 'system' | 'light' | 'dark';
|
|
10
10
|
themeLight: Partial<FeedbackWidgetTheme>;
|
|
11
11
|
themeDark: Partial<FeedbackWidgetTheme>;
|
|
12
|
+
enableShakeToReport: boolean;
|
|
12
13
|
};
|
|
13
14
|
export declare const feedbackIntegration: (initOptions?: Partial<FeedbackWidgetProps> & {
|
|
14
15
|
buttonOptions?: FeedbackButtonProps;
|
|
@@ -16,6 +17,15 @@ export declare const feedbackIntegration: (initOptions?: Partial<FeedbackWidgetP
|
|
|
16
17
|
colorScheme?: 'system' | 'light' | 'dark';
|
|
17
18
|
themeLight?: Partial<FeedbackWidgetTheme>;
|
|
18
19
|
themeDark?: Partial<FeedbackWidgetTheme>;
|
|
20
|
+
/**
|
|
21
|
+
* Enable showing the feedback widget when the user shakes the device.
|
|
22
|
+
*
|
|
23
|
+
* - iOS: Uses UIKit's motion event detection (no permissions required)
|
|
24
|
+
* - Android: Uses the accelerometer sensor (no permissions required)
|
|
25
|
+
*
|
|
26
|
+
* @default false
|
|
27
|
+
*/
|
|
28
|
+
enableShakeToReport?: boolean;
|
|
19
29
|
}) => FeedbackIntegration;
|
|
20
30
|
export declare const getFeedbackOptions: () => Partial<FeedbackWidgetProps>;
|
|
21
31
|
export declare const getFeedbackButtonOptions: () => Partial<FeedbackButtonProps>;
|
|
@@ -23,5 +33,6 @@ export declare const getScreenshotButtonOptions: () => Partial<ScreenshotButtonP
|
|
|
23
33
|
export declare const getColorScheme: () => 'system' | 'light' | 'dark';
|
|
24
34
|
export declare const getFeedbackLightTheme: () => Partial<FeedbackWidgetTheme>;
|
|
25
35
|
export declare const getFeedbackDarkTheme: () => Partial<FeedbackWidgetTheme>;
|
|
36
|
+
export declare const isShakeToReportEnabled: () => boolean;
|
|
26
37
|
export {};
|
|
27
38
|
//# sourceMappingURL=integration.d.ts.map
|