@sentry/react-native 6.13.1 → 7.0.0-alpha.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/RNSentry.podspec +1 -1
- package/android/build.gradle +1 -1
- package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +11 -14
- package/android/src/main/java/io/sentry/react/RNSentryVersion.java +1 -1
- package/dist/js/client.d.ts +12 -0
- package/dist/js/client.d.ts.map +1 -1
- package/dist/js/client.js +24 -1
- package/dist/js/client.js.map +1 -1
- package/dist/js/feedback/FeedbackWidget.d.ts +1 -1
- package/dist/js/feedback/FeedbackWidget.d.ts.map +1 -1
- package/dist/js/feedback/FeedbackWidget.js +18 -17
- package/dist/js/feedback/FeedbackWidget.js.map +1 -1
- package/dist/js/feedback/FeedbackWidget.types.d.ts +29 -29
- package/dist/js/feedback/FeedbackWidget.types.d.ts.map +1 -1
- package/dist/js/feedback/FeedbackWidget.types.js.map +1 -1
- package/dist/js/feedback/FeedbackWidgetManager.d.ts.map +1 -1
- package/dist/js/feedback/FeedbackWidgetManager.js +6 -3
- package/dist/js/feedback/FeedbackWidgetManager.js.map +1 -1
- package/dist/js/feedback/defaults.d.ts +1 -1
- package/dist/js/feedback/defaults.d.ts.map +1 -1
- package/dist/js/feedback/defaults.js.map +1 -1
- package/dist/js/feedback/integration.d.ts +1 -1
- package/dist/js/feedback/integration.d.ts.map +1 -1
- package/dist/js/feedback/integration.js.map +1 -1
- package/dist/js/feedback/utils.js +2 -2
- package/dist/js/feedback/utils.js.map +1 -1
- package/dist/js/index.d.ts +2 -2
- 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 +2 -1
- package/dist/js/integrations/debugsymbolicator.js.map +1 -1
- package/dist/js/integrations/debugsymbolicatorutils.d.ts.map +1 -1
- package/dist/js/integrations/debugsymbolicatorutils.js +12 -2
- package/dist/js/integrations/debugsymbolicatorutils.js.map +1 -1
- package/dist/js/integrations/default.d.ts.map +1 -1
- package/dist/js/integrations/default.js +9 -5
- package/dist/js/integrations/default.js.map +1 -1
- package/dist/js/integrations/expocontext.d.ts +18 -0
- package/dist/js/integrations/expocontext.d.ts.map +1 -1
- package/dist/js/integrations/expocontext.js +20 -12
- package/dist/js/integrations/expocontext.js.map +1 -1
- package/dist/js/integrations/nativelinkederrors.js +4 -3
- package/dist/js/integrations/nativelinkederrors.js.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.d.ts.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.js +2 -1
- package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
- package/dist/js/integrations/screenshot.js +3 -3
- package/dist/js/integrations/screenshot.js.map +1 -1
- package/dist/js/integrations/spotlight.d.ts.map +1 -1
- package/dist/js/integrations/spotlight.js +8 -4
- package/dist/js/integrations/spotlight.js.map +1 -1
- package/dist/js/integrations/viewhierarchy.js +2 -1
- package/dist/js/integrations/viewhierarchy.js.map +1 -1
- package/dist/js/options.d.ts +8 -1
- package/dist/js/options.d.ts.map +1 -1
- package/dist/js/options.js.map +1 -1
- package/dist/js/profiling/cache.d.ts +1 -1
- package/dist/js/profiling/convertHermesProfile.d.ts.map +1 -1
- package/dist/js/profiling/convertHermesProfile.js +18 -5
- package/dist/js/profiling/convertHermesProfile.js.map +1 -1
- package/dist/js/profiling/debugid.d.ts.map +1 -1
- package/dist/js/profiling/debugid.js +9 -1
- package/dist/js/profiling/debugid.js.map +1 -1
- package/dist/js/profiling/hermes.d.ts +1 -1
- package/dist/js/profiling/hermes.d.ts.map +1 -1
- package/dist/js/profiling/integration.js +2 -1
- package/dist/js/profiling/integration.js.map +1 -1
- package/dist/js/profiling/utils.d.ts.map +1 -1
- package/dist/js/profiling/utils.js +15 -17
- package/dist/js/profiling/utils.js.map +1 -1
- package/dist/js/replay/CustomMask.js +1 -1
- package/dist/js/replay/CustomMask.js.map +1 -1
- package/dist/js/replay/mobilereplay.js +2 -1
- package/dist/js/replay/mobilereplay.js.map +1 -1
- package/dist/js/scopeSync.d.ts.map +1 -1
- package/dist/js/scopeSync.js +7 -1
- package/dist/js/scopeSync.js.map +1 -1
- package/dist/js/sdk.d.ts.map +1 -1
- package/dist/js/sdk.js +2 -2
- package/dist/js/sdk.js.map +1 -1
- package/dist/js/tools/ModulesCollector.js +1 -0
- package/dist/js/tools/ModulesCollector.js.map +1 -1
- package/dist/js/tools/collectModules.js +1 -0
- package/dist/js/tools/collectModules.js.map +1 -1
- package/dist/js/tools/enableLogger.js +1 -0
- package/dist/js/tools/enableLogger.js.map +1 -1
- package/dist/js/tools/metroMiddleware.js +2 -1
- package/dist/js/tools/metroMiddleware.js.map +1 -1
- package/dist/js/tools/metroconfig.js +5 -3
- package/dist/js/tools/metroconfig.js.map +1 -1
- package/dist/js/tools/sentryBabelTransformer.js +1 -0
- package/dist/js/tools/sentryBabelTransformer.js.map +1 -1
- package/dist/js/tools/sentryBabelTransformerUtils.js +1 -0
- package/dist/js/tools/sentryBabelTransformerUtils.js.map +1 -1
- package/dist/js/tools/sentryMetroSerializer.js +1 -0
- package/dist/js/tools/sentryMetroSerializer.js.map +1 -1
- package/dist/js/tools/utils.js +1 -0
- package/dist/js/tools/utils.js.map +1 -1
- package/dist/js/tools/vendor/expo/expoconfig.js +1 -0
- package/dist/js/tools/vendor/expo/expoconfig.js.map +1 -1
- package/dist/js/tools/vendor/metro/metroBabelTransformer.js +1 -0
- package/dist/js/tools/vendor/metro/metroBabelTransformer.js.map +1 -1
- package/dist/js/tools/vendor/metro/utils.js +1 -0
- package/dist/js/tools/vendor/metro/utils.js.map +1 -1
- package/dist/js/touchevents.d.ts.map +1 -1
- package/dist/js/touchevents.js +4 -0
- package/dist/js/touchevents.js.map +1 -1
- package/dist/js/tracing/integrations/appStart.d.ts +1 -1
- package/dist/js/tracing/integrations/appStart.d.ts.map +1 -1
- package/dist/js/tracing/integrations/appStart.js +9 -2
- package/dist/js/tracing/integrations/appStart.js.map +1 -1
- package/dist/js/tracing/integrations/nativeFrames.js.map +1 -1
- package/dist/js/tracing/integrations/stalltracking.d.ts +1 -1
- package/dist/js/tracing/integrations/stalltracking.d.ts.map +1 -1
- package/dist/js/tracing/integrations/timeToDisplayIntegration.d.ts.map +1 -1
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js +14 -10
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js.map +1 -1
- package/dist/js/tracing/onSpanEndUtils.d.ts +1 -1
- package/dist/js/tracing/onSpanEndUtils.d.ts.map +1 -1
- package/dist/js/tracing/onSpanEndUtils.js +2 -1
- package/dist/js/tracing/onSpanEndUtils.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/reactnativeprofiler.d.ts +3 -1
- package/dist/js/tracing/reactnativeprofiler.d.ts.map +1 -1
- package/dist/js/tracing/reactnativeprofiler.js +2 -1
- package/dist/js/tracing/reactnativeprofiler.js.map +1 -1
- package/dist/js/tracing/reactnativetracing.d.ts +4 -1
- package/dist/js/tracing/reactnativetracing.d.ts.map +1 -1
- package/dist/js/tracing/reactnativetracing.js +5 -1
- package/dist/js/tracing/reactnativetracing.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +5 -4
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/tracing/span.js +3 -3
- package/dist/js/tracing/span.js.map +1 -1
- package/dist/js/tracing/timeToDisplayFallback.d.ts +1 -1
- package/dist/js/tracing/timeToDisplayFallback.d.ts.map +1 -1
- package/dist/js/tracing/timeToDisplayFallback.js.map +1 -1
- package/dist/js/transports/encodePolyfill.d.ts.map +1 -1
- package/dist/js/transports/encodePolyfill.js +5 -5
- package/dist/js/transports/encodePolyfill.js.map +1 -1
- package/dist/js/utils/AsyncExpiringMap.d.ts.map +1 -1
- package/dist/js/utils/AsyncExpiringMap.js +8 -4
- package/dist/js/utils/AsyncExpiringMap.js.map +1 -1
- package/dist/js/utils/envelope.d.ts.map +1 -1
- package/dist/js/utils/envelope.js +1 -2
- package/dist/js/utils/envelope.js.map +1 -1
- package/dist/js/utils/environment.d.ts.map +1 -1
- package/dist/js/utils/environment.js +5 -6
- package/dist/js/utils/environment.js.map +1 -1
- package/dist/js/vendor/base64-js/fromByteArray.d.ts.map +1 -1
- package/dist/js/vendor/base64-js/fromByteArray.js +6 -0
- package/dist/js/vendor/base64-js/fromByteArray.js.map +1 -1
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.d.ts.map +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/dist/js/wrapper.js +3 -2
- package/dist/js/wrapper.js.map +1 -1
- package/ios/RNSentryVersion.m +1 -1
- package/package.json +12 -13
- package/plugin/build/withSentry.js +1 -1
- package/plugin/build/withSentryAndroidGradlePlugin.js +1 -1
- package/ts3.8/dist/js/client.d.ts +12 -0
- package/ts3.8/dist/js/feedback/FeedbackWidget.d.ts +1 -1
- package/ts3.8/dist/js/feedback/FeedbackWidget.types.d.ts +29 -29
- package/ts3.8/dist/js/feedback/defaults.d.ts +1 -1
- package/ts3.8/dist/js/feedback/integration.d.ts +1 -1
- package/ts3.8/dist/js/index.d.ts +2 -2
- package/ts3.8/dist/js/integrations/expocontext.d.ts +18 -0
- package/ts3.8/dist/js/options.d.ts +8 -1
- package/ts3.8/dist/js/profiling/cache.d.ts +1 -1
- package/ts3.8/dist/js/profiling/hermes.d.ts +1 -1
- package/ts3.8/dist/js/tracing/integrations/appStart.d.ts +1 -1
- package/ts3.8/dist/js/tracing/integrations/stalltracking.d.ts +1 -1
- package/ts3.8/dist/js/tracing/onSpanEndUtils.d.ts +1 -1
- package/ts3.8/dist/js/tracing/reactnativeprofiler.d.ts +3 -1
- package/ts3.8/dist/js/tracing/reactnativetracing.d.ts +4 -1
- package/ts3.8/dist/js/tracing/timeToDisplayFallback.d.ts +1 -1
- package/ts3.8/dist/js/version.d.ts +1 -1
package/RNSentry.podspec
CHANGED
|
@@ -37,7 +37,7 @@ Pod::Spec.new do |s|
|
|
|
37
37
|
|
|
38
38
|
s.compiler_flags = other_cflags
|
|
39
39
|
|
|
40
|
-
s.dependency 'Sentry/HybridSDK', '8.
|
|
40
|
+
s.dependency 'Sentry/HybridSDK', '8.50.0'
|
|
41
41
|
|
|
42
42
|
if defined? install_modules_dependencies
|
|
43
43
|
# Default React Native dependencies for 0.71 and above (new and legacy architecture)
|
package/android/build.gradle
CHANGED
|
@@ -30,12 +30,12 @@ import com.facebook.react.bridge.WritableNativeArray;
|
|
|
30
30
|
import com.facebook.react.bridge.WritableNativeMap;
|
|
31
31
|
import com.facebook.react.common.JavascriptException;
|
|
32
32
|
import io.sentry.Breadcrumb;
|
|
33
|
-
import io.sentry.HubAdapter;
|
|
34
33
|
import io.sentry.ILogger;
|
|
35
34
|
import io.sentry.IScope;
|
|
36
35
|
import io.sentry.ISentryExecutorService;
|
|
37
36
|
import io.sentry.ISerializer;
|
|
38
37
|
import io.sentry.Integration;
|
|
38
|
+
import io.sentry.ScopesAdapter;
|
|
39
39
|
import io.sentry.Sentry;
|
|
40
40
|
import io.sentry.SentryDate;
|
|
41
41
|
import io.sentry.SentryDateProvider;
|
|
@@ -87,6 +87,7 @@ import java.util.Iterator;
|
|
|
87
87
|
import java.util.List;
|
|
88
88
|
import java.util.Map;
|
|
89
89
|
import java.util.Properties;
|
|
90
|
+
import java.util.Set;
|
|
90
91
|
import java.util.concurrent.CountDownLatch;
|
|
91
92
|
import org.jetbrains.annotations.NotNull;
|
|
92
93
|
import org.jetbrains.annotations.Nullable;
|
|
@@ -527,7 +528,7 @@ public class RNSentryModuleImpl {
|
|
|
527
528
|
}
|
|
528
529
|
|
|
529
530
|
public void captureReplay(boolean isHardCrash, Promise promise) {
|
|
530
|
-
Sentry.
|
|
531
|
+
Sentry.getCurrentScopes().getOptions().getReplayController().captureReplay(isHardCrash);
|
|
531
532
|
promise.resolve(getCurrentReplayId());
|
|
532
533
|
}
|
|
533
534
|
|
|
@@ -623,7 +624,7 @@ public class RNSentryModuleImpl {
|
|
|
623
624
|
return;
|
|
624
625
|
}
|
|
625
626
|
|
|
626
|
-
ISerializer serializer =
|
|
627
|
+
ISerializer serializer = ScopesAdapter.getInstance().getOptions().getSerializer();
|
|
627
628
|
final @Nullable byte[] bytes =
|
|
628
629
|
JsonSerializationUtils.bytesFrom(serializer, logger, viewHierarchy);
|
|
629
630
|
if (bytes == null) {
|
|
@@ -677,10 +678,6 @@ public class RNSentryModuleImpl {
|
|
|
677
678
|
if (userKeys.hasKey("ip_address")) {
|
|
678
679
|
userInstance.setIpAddress(userKeys.getString("ip_address"));
|
|
679
680
|
}
|
|
680
|
-
|
|
681
|
-
if (userKeys.hasKey("segment")) {
|
|
682
|
-
userInstance.setSegment(userKeys.getString("segment"));
|
|
683
|
-
}
|
|
684
681
|
}
|
|
685
682
|
|
|
686
683
|
if (userDataKeys != null) {
|
|
@@ -842,8 +839,7 @@ public class RNSentryModuleImpl {
|
|
|
842
839
|
(int) SECONDS.toMicros(1) / profilingTracesHz,
|
|
843
840
|
new SentryFrameMetricsCollector(reactApplicationContext, logger, buildInfo),
|
|
844
841
|
executorService,
|
|
845
|
-
logger
|
|
846
|
-
buildInfo);
|
|
842
|
+
logger);
|
|
847
843
|
}
|
|
848
844
|
|
|
849
845
|
public WritableMap startProfiling(boolean platformProfilers) {
|
|
@@ -867,7 +863,7 @@ public class RNSentryModuleImpl {
|
|
|
867
863
|
}
|
|
868
864
|
|
|
869
865
|
public WritableMap stopProfiling() {
|
|
870
|
-
final boolean isDebug =
|
|
866
|
+
final boolean isDebug = ScopesAdapter.getInstance().getOptions().isDebug();
|
|
871
867
|
final WritableMap result = new WritableNativeMap();
|
|
872
868
|
File output = null;
|
|
873
869
|
try {
|
|
@@ -953,7 +949,7 @@ public class RNSentryModuleImpl {
|
|
|
953
949
|
}
|
|
954
950
|
|
|
955
951
|
public void fetchNativeDeviceContexts(Promise promise) {
|
|
956
|
-
final @NotNull SentryOptions options =
|
|
952
|
+
final @NotNull SentryOptions options = ScopesAdapter.getInstance().getOptions();
|
|
957
953
|
final @Nullable Context context = this.getReactApplicationContext().getApplicationContext();
|
|
958
954
|
final @Nullable IScope currentScope = InternalSentrySdk.getCurrentScope();
|
|
959
955
|
fetchNativeDeviceContexts(promise, options, context, currentScope);
|
|
@@ -990,7 +986,8 @@ public class RNSentryModuleImpl {
|
|
|
990
986
|
}
|
|
991
987
|
|
|
992
988
|
public void fetchNativeSdkInfo(Promise promise) {
|
|
993
|
-
final @Nullable SdkVersion sdkVersion =
|
|
989
|
+
final @Nullable SdkVersion sdkVersion =
|
|
990
|
+
ScopesAdapter.getInstance().getOptions().getSdkVersion();
|
|
994
991
|
if (sdkVersion == null) {
|
|
995
992
|
promise.resolve(null);
|
|
996
993
|
} else {
|
|
@@ -1069,14 +1066,14 @@ public class RNSentryModuleImpl {
|
|
|
1069
1066
|
if (eventSdk != null
|
|
1070
1067
|
&& "sentry.javascript.react-native".equals(eventSdk.getName())
|
|
1071
1068
|
&& sdk != null) {
|
|
1072
|
-
|
|
1069
|
+
Set<SentryPackage> sentryPackages = sdk.getPackageSet();
|
|
1073
1070
|
if (sentryPackages != null) {
|
|
1074
1071
|
for (SentryPackage sentryPackage : sentryPackages) {
|
|
1075
1072
|
eventSdk.addPackage(sentryPackage.getName(), sentryPackage.getVersion());
|
|
1076
1073
|
}
|
|
1077
1074
|
}
|
|
1078
1075
|
|
|
1079
|
-
|
|
1076
|
+
Set<String> integrations = sdk.getIntegrationSet();
|
|
1080
1077
|
if (integrations != null) {
|
|
1081
1078
|
for (String integration : integrations) {
|
|
1082
1079
|
eventSdk.addIntegration(integration);
|
|
@@ -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 = "
|
|
5
|
+
static final String REACT_NATIVE_SDK_PACKAGE_VERSION = "7.0.0-alpha.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";
|
package/dist/js/client.d.ts
CHANGED
|
@@ -44,6 +44,18 @@ export declare class ReactNativeClient extends BaseClient<ReactNativeClientOptio
|
|
|
44
44
|
* @inheritDoc
|
|
45
45
|
*/
|
|
46
46
|
init(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Register a hook on this client.
|
|
49
|
+
*
|
|
50
|
+
* (Generic method signature to allow for custom React Native Client events.)
|
|
51
|
+
*/
|
|
52
|
+
on(hook: string, callback: unknown): () => void;
|
|
53
|
+
/**
|
|
54
|
+
* Emit a hook that was previously registered via `on()`.
|
|
55
|
+
*
|
|
56
|
+
* (Generic method signature to allow for custom React Native Client events.)
|
|
57
|
+
*/
|
|
58
|
+
emit(hook: string, ...rest: unknown[]): void;
|
|
47
59
|
/**
|
|
48
60
|
* Starts native client with dsn and options
|
|
49
61
|
*/
|
package/dist/js/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,QAAQ,EACR,KAAK,EACL,SAAS,EAET,aAAa,EACb,4BAA4B,EAC5B,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,QAAQ,EACR,KAAK,EACL,SAAS,EAET,aAAa,EACb,4BAA4B,EAC5B,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,UAAU,EAIX,MAAM,cAAc,CAAC;AAMtB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAS1D;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,wBAAwB,CAAC;IACzE,OAAO,CAAC,eAAe,CAAY;IAEnC;;;OAGG;gBACgB,OAAO,EAAE,wBAAwB;IAiBpD;;OAEG;IACI,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAE,SAAc,GAAG,WAAW,CAAC,KAAK,CAAC;IAIvF;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAIrG;;;OAGG;IACI,WAAW,IAAI,IAAI;IAI1B;;OAEG;IACI,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC;IAOpC;;;OAGG;IACI,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAUxD;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC,4BAA4B,CAAC;IAiClF;;OAEG;IACI,IAAI,IAAI,IAAI;IAKnB;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI;IAKtD;;;;OAIG;IACI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAKnD;;OAEG;IACH,OAAO,CAAC,cAAc;IA6BtB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAShC;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B"}
|
package/dist/js/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { eventFromException, eventFromMessage } from '@sentry/browser';
|
|
2
|
-
import { BaseClient, dateTimestampInSeconds, logger, SentryError } from '@sentry/core';
|
|
2
|
+
import { addAutoIpAddressToSession, addAutoIpAddressToUser, BaseClient, dateTimestampInSeconds, logger, SentryError, } from '@sentry/core';
|
|
3
3
|
import { Alert } from 'react-native';
|
|
4
4
|
import { getDevServer } from './integrations/debugsymbolicatorutils';
|
|
5
5
|
import { defaultSdkInfo } from './integrations/sdkinfo';
|
|
@@ -31,6 +31,10 @@ export class ReactNativeClient extends BaseClient {
|
|
|
31
31
|
options.parentSpanIsAlwaysRootSpan === undefined ? true : options.parentSpanIsAlwaysRootSpan;
|
|
32
32
|
super(options);
|
|
33
33
|
this._outcomesBuffer = [];
|
|
34
|
+
if (options.sendDefaultPii === true) {
|
|
35
|
+
this.on('postprocessEvent', addAutoIpAddressToUser);
|
|
36
|
+
this.on('beforeSendSession', addAutoIpAddressToSession);
|
|
37
|
+
}
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* @inheritDoc
|
|
@@ -112,6 +116,24 @@ export class ReactNativeClient extends BaseClient {
|
|
|
112
116
|
super.init();
|
|
113
117
|
this._initNativeSdk();
|
|
114
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Register a hook on this client.
|
|
121
|
+
*
|
|
122
|
+
* (Generic method signature to allow for custom React Native Client events.)
|
|
123
|
+
*/
|
|
124
|
+
on(hook, callback) {
|
|
125
|
+
// @ts-expect-error on from the base class doesn't support generic types
|
|
126
|
+
return super.on(hook, callback);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Emit a hook that was previously registered via `on()`.
|
|
130
|
+
*
|
|
131
|
+
* (Generic method signature to allow for custom React Native Client events.)
|
|
132
|
+
*/
|
|
133
|
+
emit(hook, ...rest) {
|
|
134
|
+
// @ts-expect-error emit from the base class doesn't support generic types
|
|
135
|
+
super.emit(hook, ...rest);
|
|
136
|
+
}
|
|
115
137
|
/**
|
|
116
138
|
* Starts native client with dsn and options
|
|
117
139
|
*/
|
|
@@ -130,6 +152,7 @@ export class ReactNativeClient extends BaseClient {
|
|
|
130
152
|
.then((didCallNativeInit) => {
|
|
131
153
|
var _a, _b;
|
|
132
154
|
(_b = (_a = this._options).onReady) === null || _b === void 0 ? void 0 : _b.call(_a, { didCallNativeInit });
|
|
155
|
+
this.emit('afterInit');
|
|
133
156
|
})
|
|
134
157
|
.then(undefined, error => {
|
|
135
158
|
logger.error('The OnReady callback threw an error: ', error);
|
package/dist/js/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventFromException, eventFromMessage } from '@sentry/browser';\nimport type {\n ClientReportEnvelope,\n ClientReportItem,\n Envelope,\n Event,\n EventHint,\n Outcome,\n SeverityLevel,\n TransportMakeRequestResponse,\n UserFeedback,\n} from '@sentry/core';\nimport { BaseClient, dateTimestampInSeconds, logger, SentryError } from '@sentry/core';\nimport { Alert } from 'react-native';\n\nimport { getDevServer } from './integrations/debugsymbolicatorutils';\nimport { defaultSdkInfo } from './integrations/sdkinfo';\nimport { getDefaultSidecarUrl } from './integrations/spotlight';\nimport type { ReactNativeClientOptions } from './options';\nimport type { mobileReplayIntegration } from './replay/mobilereplay';\nimport { MOBILE_REPLAY_INTEGRATION_NAME } from './replay/mobilereplay';\nimport { createUserFeedbackEnvelope, items } from './utils/envelope';\nimport { ignoreRequireCycleLogs } from './utils/ignorerequirecyclelogs';\nimport { mergeOutcomes } from './utils/outcome';\nimport { ReactNativeLibraries } from './utils/rnlibraries';\nimport { NATIVE } from './wrapper';\n\n/**\n * The Sentry React Native SDK Client.\n *\n * @see ReactNativeClientOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class ReactNativeClient extends BaseClient<ReactNativeClientOptions> {\n private _outcomesBuffer: Outcome[];\n\n /**\n * Creates a new React Native SDK instance.\n * @param options Configuration options for this SDK.\n */\n public constructor(options: ReactNativeClientOptions) {\n ignoreRequireCycleLogs(ReactNativeLibraries.ReactNativeVersion?.version);\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || defaultSdkInfo;\n // We default this to true, as it is the safer scenario\n options.parentSpanIsAlwaysRootSpan =\n options.parentSpanIsAlwaysRootSpan === undefined ? true : options.parentSpanIsAlwaysRootSpan;\n super(options);\n\n this._outcomesBuffer = [];\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint: EventHint = {}): PromiseLike<Event> {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(message: string, level?: SeverityLevel, hint?: EventHint): PromiseLike<Event> {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * If native client is available it will trigger a native crash.\n * Use this only for testing purposes.\n */\n public nativeCrash(): void {\n NATIVE.nativeCrash();\n }\n\n /**\n * @inheritDoc\n */\n public close(): PromiseLike<boolean> {\n // As super.close() flushes queued events, we wait for that to finish before closing the native SDK.\n return super.close().then((result: boolean) => {\n return NATIVE.closeNativeSdk().then(() => result) as PromiseLike<boolean>;\n });\n }\n\n /**\n * Sends user feedback to Sentry.\n * @deprecated Use `Sentry.captureFeedback` instead.\n */\n public captureUserFeedback(feedback: UserFeedback): void {\n const envelope = createUserFeedbackEnvelope(feedback, {\n metadata: this._options._metadata,\n dsn: this.getDsn(),\n tunnel: undefined,\n });\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(envelope);\n }\n\n /**\n * @inheritdoc\n */\n public sendEnvelope(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n const outcomes = this._clearOutcomes();\n this._outcomesBuffer = mergeOutcomes(this._outcomesBuffer, outcomes);\n\n if (this._options.sendClientReports) {\n this._attachClientReportTo(this._outcomesBuffer, envelope as ClientReportEnvelope);\n }\n\n let shouldClearOutcomesBuffer = true;\n if (this._isEnabled() && this._transport && this._dsn) {\n this.emit('beforeEnvelope', envelope);\n\n this._transport.send(envelope).then(null, reason => {\n if (reason instanceof SentryError) {\n // SentryError is thrown by SyncPromise\n shouldClearOutcomesBuffer = false;\n // If this is called asynchronously we want the _outcomesBuffer to be cleared\n logger.error('SentryError while sending event, keeping outcomes buffer:', reason);\n } else {\n logger.error('Error while sending event:', reason);\n }\n });\n } else {\n logger.error('Transport disabled');\n }\n\n if (shouldClearOutcomesBuffer) {\n this._outcomesBuffer = []; // if send fails synchronously the _outcomesBuffer will stay intact\n }\n\n return Promise.resolve({});\n }\n\n /**\n * @inheritDoc\n */\n public init(): void {\n super.init();\n this._initNativeSdk();\n }\n\n /**\n * Starts native client with dsn and options\n */\n private _initNativeSdk(): void {\n NATIVE.initNativeSdk({\n ...this._options,\n defaultSidecarUrl: getDefaultSidecarUrl(),\n devServerUrl: getDevServer()?.url || '',\n mobileReplayOptions:\n this._integrations[MOBILE_REPLAY_INTEGRATION_NAME] &&\n 'options' in this._integrations[MOBILE_REPLAY_INTEGRATION_NAME]\n ? (this._integrations[MOBILE_REPLAY_INTEGRATION_NAME] as ReturnType<typeof mobileReplayIntegration>).options\n : undefined,\n })\n .then(\n (result: boolean) => {\n return result;\n },\n () => {\n this._showCannotConnectDialog();\n return false;\n },\n )\n .then((didCallNativeInit: boolean) => {\n this._options.onReady?.({ didCallNativeInit });\n })\n .then(undefined, error => {\n logger.error('The OnReady callback threw an error: ', error);\n });\n }\n\n /**\n * If the user is in development mode, and the native nagger is enabled then it will show an alert.\n */\n private _showCannotConnectDialog(): void {\n if (__DEV__ && this._options.enableNativeNagger) {\n Alert.alert(\n 'Sentry',\n 'Warning, could not connect to Sentry native SDK.\\nIf you do not want to use the native component please pass `enableNative: false` in the options.\\nVisit: https://docs.sentry.io/platforms/react-native/ for more details.',\n );\n }\n }\n\n /**\n * Attaches a client report from outcomes to the envelope.\n */\n private _attachClientReportTo(outcomes: Outcome[], envelope: ClientReportEnvelope): void {\n if (outcomes.length > 0) {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: dateTimestampInSeconds(),\n discarded_events: outcomes,\n },\n ];\n\n envelope[items].push(clientReportItem);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventFromException, eventFromMessage } from '@sentry/browser';\nimport type {\n ClientReportEnvelope,\n ClientReportItem,\n Envelope,\n Event,\n EventHint,\n Outcome,\n SeverityLevel,\n TransportMakeRequestResponse,\n UserFeedback,\n} from '@sentry/core';\nimport {\n addAutoIpAddressToSession,\n addAutoIpAddressToUser,\n BaseClient,\n dateTimestampInSeconds,\n logger,\n SentryError,\n} from '@sentry/core';\nimport { Alert } from 'react-native';\n\nimport { getDevServer } from './integrations/debugsymbolicatorutils';\nimport { defaultSdkInfo } from './integrations/sdkinfo';\nimport { getDefaultSidecarUrl } from './integrations/spotlight';\nimport type { ReactNativeClientOptions } from './options';\nimport type { mobileReplayIntegration } from './replay/mobilereplay';\nimport { MOBILE_REPLAY_INTEGRATION_NAME } from './replay/mobilereplay';\nimport { createUserFeedbackEnvelope, items } from './utils/envelope';\nimport { ignoreRequireCycleLogs } from './utils/ignorerequirecyclelogs';\nimport { mergeOutcomes } from './utils/outcome';\nimport { ReactNativeLibraries } from './utils/rnlibraries';\nimport { NATIVE } from './wrapper';\n\n/**\n * The Sentry React Native SDK Client.\n *\n * @see ReactNativeClientOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class ReactNativeClient extends BaseClient<ReactNativeClientOptions> {\n private _outcomesBuffer: Outcome[];\n\n /**\n * Creates a new React Native SDK instance.\n * @param options Configuration options for this SDK.\n */\n public constructor(options: ReactNativeClientOptions) {\n ignoreRequireCycleLogs(ReactNativeLibraries.ReactNativeVersion?.version);\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || defaultSdkInfo;\n // We default this to true, as it is the safer scenario\n options.parentSpanIsAlwaysRootSpan =\n options.parentSpanIsAlwaysRootSpan === undefined ? true : options.parentSpanIsAlwaysRootSpan;\n super(options);\n\n this._outcomesBuffer = [];\n\n if (options.sendDefaultPii === true) {\n this.on('postprocessEvent', addAutoIpAddressToUser);\n this.on('beforeSendSession', addAutoIpAddressToSession);\n }\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint: EventHint = {}): PromiseLike<Event> {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(message: string, level?: SeverityLevel, hint?: EventHint): PromiseLike<Event> {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * If native client is available it will trigger a native crash.\n * Use this only for testing purposes.\n */\n public nativeCrash(): void {\n NATIVE.nativeCrash();\n }\n\n /**\n * @inheritDoc\n */\n public close(): PromiseLike<boolean> {\n // As super.close() flushes queued events, we wait for that to finish before closing the native SDK.\n return super.close().then((result: boolean) => {\n return NATIVE.closeNativeSdk().then(() => result) as PromiseLike<boolean>;\n });\n }\n\n /**\n * Sends user feedback to Sentry.\n * @deprecated Use `Sentry.captureFeedback` instead.\n */\n public captureUserFeedback(feedback: UserFeedback): void {\n const envelope = createUserFeedbackEnvelope(feedback, {\n metadata: this._options._metadata,\n dsn: this.getDsn(),\n tunnel: undefined,\n });\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.sendEnvelope(envelope);\n }\n\n /**\n * @inheritdoc\n */\n public sendEnvelope(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n const outcomes = this._clearOutcomes();\n this._outcomesBuffer = mergeOutcomes(this._outcomesBuffer, outcomes);\n\n if (this._options.sendClientReports) {\n this._attachClientReportTo(this._outcomesBuffer, envelope as ClientReportEnvelope);\n }\n\n let shouldClearOutcomesBuffer = true;\n if (this._isEnabled() && this._transport && this._dsn) {\n this.emit('beforeEnvelope', envelope);\n\n this._transport.send(envelope).then(null, reason => {\n if (reason instanceof SentryError) {\n // SentryError is thrown by SyncPromise\n shouldClearOutcomesBuffer = false;\n // If this is called asynchronously we want the _outcomesBuffer to be cleared\n logger.error('SentryError while sending event, keeping outcomes buffer:', reason);\n } else {\n logger.error('Error while sending event:', reason);\n }\n });\n } else {\n logger.error('Transport disabled');\n }\n\n if (shouldClearOutcomesBuffer) {\n this._outcomesBuffer = []; // if send fails synchronously the _outcomesBuffer will stay intact\n }\n\n return Promise.resolve({});\n }\n\n /**\n * @inheritDoc\n */\n public init(): void {\n super.init();\n this._initNativeSdk();\n }\n\n /**\n * Register a hook on this client.\n *\n * (Generic method signature to allow for custom React Native Client events.)\n */\n public on(hook: string, callback: unknown): () => void {\n // @ts-expect-error on from the base class doesn't support generic types\n return super.on(hook, callback);\n }\n\n /**\n * Emit a hook that was previously registered via `on()`.\n *\n * (Generic method signature to allow for custom React Native Client events.)\n */\n public emit(hook: string, ...rest: unknown[]): void {\n // @ts-expect-error emit from the base class doesn't support generic types\n super.emit(hook, ...rest);\n }\n\n /**\n * Starts native client with dsn and options\n */\n private _initNativeSdk(): void {\n NATIVE.initNativeSdk({\n ...this._options,\n defaultSidecarUrl: getDefaultSidecarUrl(),\n devServerUrl: getDevServer()?.url || '',\n mobileReplayOptions:\n this._integrations[MOBILE_REPLAY_INTEGRATION_NAME] &&\n 'options' in this._integrations[MOBILE_REPLAY_INTEGRATION_NAME]\n ? (this._integrations[MOBILE_REPLAY_INTEGRATION_NAME] as ReturnType<typeof mobileReplayIntegration>).options\n : undefined,\n })\n .then(\n (result: boolean) => {\n return result;\n },\n () => {\n this._showCannotConnectDialog();\n return false;\n },\n )\n .then((didCallNativeInit: boolean) => {\n this._options.onReady?.({ didCallNativeInit });\n this.emit('afterInit');\n })\n .then(undefined, error => {\n logger.error('The OnReady callback threw an error: ', error);\n });\n }\n\n /**\n * If the user is in development mode, and the native nagger is enabled then it will show an alert.\n */\n private _showCannotConnectDialog(): void {\n if (__DEV__ && this._options.enableNativeNagger) {\n Alert.alert(\n 'Sentry',\n 'Warning, could not connect to Sentry native SDK.\\nIf you do not want to use the native component please pass `enableNative: false` in the options.\\nVisit: https://docs.sentry.io/platforms/react-native/ for more details.',\n );\n }\n }\n\n /**\n * Attaches a client report from outcomes to the envelope.\n */\n private _attachClientReportTo(outcomes: Outcome[], envelope: ClientReportEnvelope): void {\n if (outcomes.length > 0) {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: dateTimestampInSeconds(),\n discarded_events: outcomes,\n },\n ];\n\n envelope[items].push(clientReportItem);\n }\n }\n}\n"]}
|
|
@@ -5,7 +5,7 @@ import type { FeedbackWidgetProps, FeedbackWidgetState } from './FeedbackWidget.
|
|
|
5
5
|
* Implements a feedback form screen that sends feedback to Sentry using Sentry.captureFeedback.
|
|
6
6
|
*/
|
|
7
7
|
export declare class FeedbackWidget extends React.Component<FeedbackWidgetProps, FeedbackWidgetState> {
|
|
8
|
-
static defaultProps:
|
|
8
|
+
static defaultProps: FeedbackWidgetProps;
|
|
9
9
|
private static _savedState;
|
|
10
10
|
private _didSubmitForm;
|
|
11
11
|
constructor(props: FeedbackWidgetProps);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidget.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B,OAAO,KAAK,EAA2D,mBAAmB,EAAE,mBAAmB,EAAkD,MAAM,wBAAwB,CAAC;AAIhM;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK,CAAC,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAC3F,OAAc,YAAY,
|
|
1
|
+
{"version":3,"file":"FeedbackWidget.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B,OAAO,KAAK,EAA2D,mBAAmB,EAAE,mBAAmB,EAAkD,MAAM,wBAAwB,CAAC;AAIhM;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK,CAAC,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAC3F,OAAc,YAAY,sBAAwB;IAElD,OAAO,CAAC,MAAM,CAAC,WAAW,CAOxB;IAEF,OAAO,CAAC,cAAc,CAAkB;gBAErB,KAAK,EAAE,mBAAmB;IAuBtC,oBAAoB,EAAE,MAAM,IAAI,CAmDrC;IAEK,uBAAuB,EAAE,MAAM,IAAI,CAmEzC;IAED;;OAEG;IACI,oBAAoB,IAAI,IAAI;IASnC;;OAEG;IACI,MAAM,IAAI,KAAK,CAAC,SAAS;IAwGhC,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,eAAe,CASrB;CACH"}
|
|
@@ -74,15 +74,16 @@ export class FeedbackWidget extends React.Component {
|
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
76
|
this.onScreenshotButtonPress = () => __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
var _j, _k, _l, _m, _o;
|
|
77
78
|
if (!this.state.filename && !this.state.attachment) {
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
const launchImageLibrary =
|
|
79
|
+
const { imagePicker } = this.props;
|
|
80
|
+
if (imagePicker) {
|
|
81
|
+
const launchImageLibrary = imagePicker.launchImageLibraryAsync
|
|
81
82
|
// expo-image-picker library is available
|
|
82
|
-
? () =>
|
|
83
|
+
? () => { var _a; return (_a = imagePicker.launchImageLibraryAsync) === null || _a === void 0 ? void 0 : _a.call(imagePicker, { mediaTypes: ['images'], base64: isWeb() }); }
|
|
83
84
|
// react-native-image-picker library is available
|
|
84
|
-
:
|
|
85
|
-
? () =>
|
|
85
|
+
: imagePicker.launchImageLibrary
|
|
86
|
+
? () => { var _a; return (_a = imagePicker.launchImageLibrary) === null || _a === void 0 ? void 0 : _a.call(imagePicker, { mediaType: 'photo', includeBase64: isWeb() }); }
|
|
86
87
|
: null;
|
|
87
88
|
if (!launchImageLibrary) {
|
|
88
89
|
logger.warn('No compatible image picker library found. Please provide a valid image picker library.');
|
|
@@ -92,13 +93,13 @@ export class FeedbackWidget extends React.Component {
|
|
|
92
93
|
return;
|
|
93
94
|
}
|
|
94
95
|
const result = yield launchImageLibrary();
|
|
95
|
-
if (result.assets && result.assets.length > 0) {
|
|
96
|
+
if ((result === null || result === void 0 ? void 0 : result.assets) && result.assets.length > 0) {
|
|
96
97
|
if (isWeb()) {
|
|
97
|
-
const filename = result.assets[0].fileName;
|
|
98
|
-
const imageUri = result.assets[0].uri;
|
|
99
|
-
const base64 = result.assets[0].base64;
|
|
100
|
-
const data = base64ToUint8Array(base64);
|
|
101
|
-
if (data
|
|
98
|
+
const filename = (_j = result.assets[0]) === null || _j === void 0 ? void 0 : _j.fileName;
|
|
99
|
+
const imageUri = (_k = result.assets[0]) === null || _k === void 0 ? void 0 : _k.uri;
|
|
100
|
+
const base64 = (_l = result.assets[0]) === null || _l === void 0 ? void 0 : _l.base64;
|
|
101
|
+
const data = base64 ? base64ToUint8Array(base64) : undefined;
|
|
102
|
+
if (data) {
|
|
102
103
|
this.setState({ filename, attachment: data, attachmentUri: imageUri });
|
|
103
104
|
}
|
|
104
105
|
else {
|
|
@@ -106,10 +107,10 @@ export class FeedbackWidget extends React.Component {
|
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
109
|
else {
|
|
109
|
-
const filename = result.assets[0].fileName;
|
|
110
|
-
const imageUri = result.assets[0].uri;
|
|
111
|
-
getDataFromUri(imageUri).then((data) => {
|
|
112
|
-
if (data
|
|
110
|
+
const filename = (_m = result.assets[0]) === null || _m === void 0 ? void 0 : _m.fileName;
|
|
111
|
+
const imageUri = (_o = result.assets[0]) === null || _o === void 0 ? void 0 : _o.uri;
|
|
112
|
+
imageUri && getDataFromUri(imageUri).then((data) => {
|
|
113
|
+
if (data) {
|
|
113
114
|
this.setState({ filename, attachment: data, attachmentUri: imageUri });
|
|
114
115
|
}
|
|
115
116
|
else {
|
|
@@ -237,7 +238,7 @@ export class FeedbackWidget extends React.Component {
|
|
|
237
238
|
React.createElement(Text, { style: styles.cancelText }, text.cancelButtonLabel)))));
|
|
238
239
|
}
|
|
239
240
|
}
|
|
240
|
-
FeedbackWidget.defaultProps =
|
|
241
|
+
FeedbackWidget.defaultProps = defaultConfiguration;
|
|
241
242
|
FeedbackWidget._savedState = {
|
|
242
243
|
name: '',
|
|
243
244
|
email: '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidget.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { SendFeedbackParams } from '@sentry/core';\nimport { captureFeedback, getCurrentScope, lastEventId, logger } from '@sentry/core';\nimport * as React from 'react';\nimport type { KeyboardTypeOptions } from 'react-native';\nimport {\n Image,\n Keyboard,\n Text,\n TextInput,\n TouchableOpacity,\n TouchableWithoutFeedback,\n View\n} from 'react-native';\n\nimport { isWeb, notWeb } from '../utils/environment';\nimport { getDataFromUri } from '../wrapper';\nimport { sentryLogo } from './branding';\nimport { defaultConfiguration } from './defaults';\nimport defaultStyles from './FeedbackWidget.styles';\nimport type { FeedbackGeneralConfiguration, FeedbackTextConfiguration, FeedbackWidgetProps, FeedbackWidgetState, FeedbackWidgetStyles, ImagePickerConfiguration } from './FeedbackWidget.types';\nimport { lazyLoadFeedbackIntegration } from './lazy';\nimport { base64ToUint8Array, feedbackAlertDialog, isValidEmail } from './utils';\n\n/**\n * @beta\n * Implements a feedback form screen that sends feedback to Sentry using Sentry.captureFeedback.\n */\nexport class FeedbackWidget extends React.Component<FeedbackWidgetProps, FeedbackWidgetState> {\n public static defaultProps: Partial<FeedbackWidgetProps> = {\n ...defaultConfiguration\n }\n\n private static _savedState: Omit<FeedbackWidgetState, 'isVisible'> = {\n name: '',\n email: '',\n description: '',\n filename: undefined,\n attachment: undefined,\n attachmentUri: undefined,\n };\n\n private _didSubmitForm: boolean = false;\n\n public constructor(props: FeedbackWidgetProps) {\n super(props);\n\n const currentUser = {\n useSentryUser: {\n email: this.props?.useSentryUser?.email || getCurrentScope()?.getUser()?.email || '',\n name: this.props?.useSentryUser?.name || getCurrentScope()?.getUser()?.name || '',\n }\n }\n\n this.state = {\n isVisible: true,\n name: FeedbackWidget._savedState.name || currentUser.useSentryUser.name,\n email: FeedbackWidget._savedState.email || currentUser.useSentryUser.email,\n description: FeedbackWidget._savedState.description || '',\n filename: FeedbackWidget._savedState.filename || undefined,\n attachment: FeedbackWidget._savedState.attachment || undefined,\n attachmentUri: FeedbackWidget._savedState.attachmentUri || undefined,\n };\n\n lazyLoadFeedbackIntegration();\n }\n\n public handleFeedbackSubmit: () => void = () => {\n const { name, email, description } = this.state;\n const { onSubmitSuccess, onSubmitError, onFormSubmitted } = this.props;\n const text: FeedbackTextConfiguration = this.props;\n\n const trimmedName = name?.trim();\n const trimmedEmail = email?.trim();\n const trimmedDescription = description?.trim();\n\n if ((this.props.isNameRequired && !trimmedName) || (this.props.isEmailRequired && !trimmedEmail) || !trimmedDescription) {\n feedbackAlertDialog(text.errorTitle, text.formError);\n return;\n }\n\n if (this.props.shouldValidateEmail && (this.props.isEmailRequired || trimmedEmail.length > 0) && !isValidEmail(trimmedEmail)) {\n feedbackAlertDialog(text.errorTitle, text.emailError);\n return;\n }\n\n const attachments = this.state.filename && this.state.attachment\n ? [\n {\n filename: this.state.filename,\n data: this.state.attachment,\n },\n ]\n : undefined;\n\n const eventId = lastEventId();\n const userFeedback: SendFeedbackParams = {\n message: trimmedDescription,\n name: trimmedName,\n email: trimmedEmail,\n associatedEventId: eventId,\n };\n\n try {\n if (!onFormSubmitted) {\n this.setState({ isVisible: false });\n }\n captureFeedback(userFeedback, attachments ? { attachments } : undefined);\n onSubmitSuccess({ name: trimmedName, email: trimmedEmail, message: trimmedDescription, attachments: attachments });\n feedbackAlertDialog(text.successMessageText , '');\n onFormSubmitted();\n this._didSubmitForm = true;\n } catch (error) {\n const errorString = `Feedback form submission failed: ${error}`;\n onSubmitError(new Error(errorString));\n feedbackAlertDialog(text.errorTitle, text.genericError);\n logger.error(`Feedback form submission failed: ${error}`);\n }\n };\n\n public onScreenshotButtonPress: () => void = async () => {\n if (!this.state.filename && !this.state.attachment) {\n const imagePickerConfiguration: ImagePickerConfiguration = this.props;\n if (imagePickerConfiguration.imagePicker) {\n const launchImageLibrary = imagePickerConfiguration.imagePicker.launchImageLibraryAsync\n // expo-image-picker library is available\n ? () => imagePickerConfiguration.imagePicker.launchImageLibraryAsync({ mediaTypes: ['images'], base64: isWeb() })\n // react-native-image-picker library is available\n : imagePickerConfiguration.imagePicker.launchImageLibrary\n ? () => imagePickerConfiguration.imagePicker.launchImageLibrary({ mediaType: 'photo', includeBase64: isWeb() })\n : null;\n if (!launchImageLibrary) {\n logger.warn('No compatible image picker library found. Please provide a valid image picker library.');\n if (__DEV__) {\n feedbackAlertDialog(\n 'Development note',\n 'No compatible image picker library found. Please provide a compatible version of `expo-image-picker` or `react-native-image-picker`.',\n );\n }\n return;\n }\n\n const result = await launchImageLibrary();\n if (result.assets && result.assets.length > 0) {\n if (isWeb()) {\n const filename = result.assets[0].fileName;\n const imageUri = result.assets[0].uri;\n const base64 = result.assets[0].base64;\n const data = base64ToUint8Array(base64);\n if (data != null) {\n this.setState({ filename, attachment: data, attachmentUri: imageUri });\n } else {\n logger.error('Failed to read image data on the web');\n }\n } else {\n const filename = result.assets[0].fileName;\n const imageUri = result.assets[0].uri;\n getDataFromUri(imageUri).then((data) => {\n if (data != null) {\n this.setState({ filename, attachment: data, attachmentUri: imageUri });\n } else {\n logger.error('Failed to read image data from uri:', imageUri);\n }\n }).catch((error) => {\n logger.error('Failed to read image data from uri:', imageUri, 'error: ', error);\n });\n }\n }\n } else {\n // Defaulting to the onAddScreenshot callback\n const { onAddScreenshot } = { ...defaultConfiguration, ...this.props };\n onAddScreenshot((uri: string) => {\n getDataFromUri(uri).then((data) => {\n if (data != null) {\n this.setState({ filename: 'feedback_screenshot', attachment: data, attachmentUri: uri });\n } else {\n logger.error('Failed to read image data from uri:', uri);\n }\n })\n .catch((error) => {\n logger.error('Failed to read image data from uri:', uri, 'error: ', error);\n });\n });\n }\n } else {\n this.setState({ filename: undefined, attachment: undefined, attachmentUri: undefined });\n }\n }\n\n /**\n * Save the state before unmounting the component.\n */\n public componentWillUnmount(): void {\n if (this._didSubmitForm) {\n this._clearFormState();\n this._didSubmitForm = false;\n } else {\n this._saveFormState();\n }\n }\n\n /**\n * Renders the feedback form screen.\n */\n public render(): React.ReactNode {\n const { name, email, description } = this.state;\n const { onFormClose } = this.props;\n const config: FeedbackGeneralConfiguration = this.props;\n const imagePickerConfiguration: ImagePickerConfiguration = this.props;\n const text: FeedbackTextConfiguration = this.props;\n const styles: FeedbackWidgetStyles = { ...defaultStyles, ...this.props.styles };\n const onCancel = (): void => {\n if (onFormClose) {\n onFormClose();\n } else {\n this.setState({ isVisible: false });\n }\n }\n\n if (!this.state.isVisible) {\n return null;\n }\n\n return (\n <TouchableWithoutFeedback onPress={notWeb() ? Keyboard.dismiss: undefined}>\n <View style={styles.container}>\n <View style={styles.titleContainer}>\n <Text style={styles.title}>{text.formTitle}</Text>\n {config.showBranding && (\n <Image\n source={{ uri: sentryLogo }}\n style={styles.sentryLogo}\n testID='sentry-logo'\n />\n )}\n </View>\n\n {config.showName && (\n <>\n <Text style={styles.label}>\n {text.nameLabel}\n {config.isNameRequired && ` ${text.isRequiredLabel}`}\n </Text>\n <TextInput\n style={styles.input}\n placeholder={text.namePlaceholder}\n value={name}\n onChangeText={(value) => this.setState({ name: value })}\n />\n </>\n )}\n\n {config.showEmail && (\n <>\n <Text style={styles.label}>\n {text.emailLabel}\n {config.isEmailRequired && ` ${text.isRequiredLabel}`}\n </Text>\n <TextInput\n style={styles.input}\n placeholder={text.emailPlaceholder}\n keyboardType={'email-address' as KeyboardTypeOptions}\n value={email}\n onChangeText={(value) => this.setState({ email: value })}\n />\n </>\n )}\n\n <Text style={styles.label}>\n {text.messageLabel}\n {` ${text.isRequiredLabel}`}\n </Text>\n <TextInput\n style={[styles.input, styles.textArea]}\n placeholder={text.messagePlaceholder}\n value={description}\n onChangeText={(value) => this.setState({ description: value })}\n multiline\n />\n {(config.enableScreenshot || imagePickerConfiguration.imagePicker) && (\n <View style={styles.screenshotContainer}>\n {this.state.attachmentUri && (\n <Image\n source={{ uri: this.state.attachmentUri }}\n style={styles.screenshotThumbnail}\n />\n )}\n <TouchableOpacity style={styles.screenshotButton} onPress={this.onScreenshotButtonPress}>\n <Text style={styles.screenshotText}>\n {!this.state.filename && !this.state.attachment\n ? text.addScreenshotButtonLabel\n : text.removeScreenshotButtonLabel}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n <TouchableOpacity style={styles.submitButton} onPress={this.handleFeedbackSubmit}>\n <Text style={styles.submitText}>{text.submitButtonLabel}</Text>\n </TouchableOpacity>\n\n <TouchableOpacity style={styles.cancelButton} onPress={onCancel}>\n <Text style={styles.cancelText}>{text.cancelButtonLabel}</Text>\n </TouchableOpacity>\n </View>\n </TouchableWithoutFeedback>\n );\n }\n\n private _saveFormState = (): void => {\n FeedbackWidget._savedState = { ...this.state };\n };\n\n private _clearFormState = (): void => {\n FeedbackWidget._savedState = {\n name: '',\n email: '',\n description: '',\n filename: undefined,\n attachment: undefined,\n attachmentUri: undefined,\n };\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FeedbackWidget.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { SendFeedbackParams } from '@sentry/core';\nimport { captureFeedback, getCurrentScope, lastEventId, logger } from '@sentry/core';\nimport * as React from 'react';\nimport type { KeyboardTypeOptions } from 'react-native';\nimport {\n Image,\n Keyboard,\n Text,\n TextInput,\n TouchableOpacity,\n TouchableWithoutFeedback,\n View\n} from 'react-native';\n\nimport { isWeb, notWeb } from '../utils/environment';\nimport { getDataFromUri } from '../wrapper';\nimport { sentryLogo } from './branding';\nimport { defaultConfiguration } from './defaults';\nimport defaultStyles from './FeedbackWidget.styles';\nimport type { FeedbackGeneralConfiguration, FeedbackTextConfiguration, FeedbackWidgetProps, FeedbackWidgetState, FeedbackWidgetStyles, ImagePickerConfiguration } from './FeedbackWidget.types';\nimport { lazyLoadFeedbackIntegration } from './lazy';\nimport { base64ToUint8Array, feedbackAlertDialog, isValidEmail } from './utils';\n\n/**\n * @beta\n * Implements a feedback form screen that sends feedback to Sentry using Sentry.captureFeedback.\n */\nexport class FeedbackWidget extends React.Component<FeedbackWidgetProps, FeedbackWidgetState> {\n public static defaultProps = defaultConfiguration;\n\n private static _savedState: Omit<FeedbackWidgetState, 'isVisible'> = {\n name: '',\n email: '',\n description: '',\n filename: undefined,\n attachment: undefined,\n attachmentUri: undefined,\n };\n\n private _didSubmitForm: boolean = false;\n\n public constructor(props: FeedbackWidgetProps) {\n super(props);\n\n const currentUser = {\n useSentryUser: {\n email: this.props?.useSentryUser?.email || getCurrentScope()?.getUser()?.email || '',\n name: this.props?.useSentryUser?.name || getCurrentScope()?.getUser()?.name || '',\n }\n }\n\n this.state = {\n isVisible: true,\n name: FeedbackWidget._savedState.name || currentUser.useSentryUser.name,\n email: FeedbackWidget._savedState.email || currentUser.useSentryUser.email,\n description: FeedbackWidget._savedState.description || '',\n filename: FeedbackWidget._savedState.filename || undefined,\n attachment: FeedbackWidget._savedState.attachment || undefined,\n attachmentUri: FeedbackWidget._savedState.attachmentUri || undefined,\n };\n\n lazyLoadFeedbackIntegration();\n }\n\n public handleFeedbackSubmit: () => void = () => {\n const { name, email, description } = this.state;\n const { onSubmitSuccess, onSubmitError, onFormSubmitted } = this.props;\n const text = this.props;\n\n const trimmedName = name?.trim();\n const trimmedEmail = email?.trim();\n const trimmedDescription = description?.trim();\n\n if ((this.props.isNameRequired && !trimmedName) || (this.props.isEmailRequired && !trimmedEmail) || !trimmedDescription) {\n feedbackAlertDialog(text.errorTitle, text.formError);\n return;\n }\n\n if (this.props.shouldValidateEmail && (this.props.isEmailRequired || trimmedEmail.length > 0) && !isValidEmail(trimmedEmail)) {\n feedbackAlertDialog(text.errorTitle, text.emailError);\n return;\n }\n\n const attachments = this.state.filename && this.state.attachment\n ? [\n {\n filename: this.state.filename,\n data: this.state.attachment,\n },\n ]\n : undefined;\n\n const eventId = lastEventId();\n const userFeedback: SendFeedbackParams = {\n message: trimmedDescription,\n name: trimmedName,\n email: trimmedEmail,\n associatedEventId: eventId,\n };\n\n try {\n if (!onFormSubmitted) {\n this.setState({ isVisible: false });\n }\n captureFeedback(userFeedback, attachments ? { attachments } : undefined);\n onSubmitSuccess({ name: trimmedName, email: trimmedEmail, message: trimmedDescription, attachments: attachments });\n feedbackAlertDialog(text.successMessageText , '');\n onFormSubmitted();\n this._didSubmitForm = true;\n } catch (error) {\n const errorString = `Feedback form submission failed: ${error}`;\n onSubmitError(new Error(errorString));\n feedbackAlertDialog(text.errorTitle, text.genericError);\n logger.error(`Feedback form submission failed: ${error}`);\n }\n };\n\n public onScreenshotButtonPress: () => void = async () => {\n if (!this.state.filename && !this.state.attachment) {\n const { imagePicker } = this.props;\n if (imagePicker) {\n const launchImageLibrary = imagePicker.launchImageLibraryAsync\n // expo-image-picker library is available\n ? () => imagePicker.launchImageLibraryAsync?.({ mediaTypes: ['images'], base64: isWeb() })\n // react-native-image-picker library is available\n : imagePicker.launchImageLibrary\n ? () => imagePicker.launchImageLibrary?.({ mediaType: 'photo', includeBase64: isWeb() })\n : null;\n if (!launchImageLibrary) {\n logger.warn('No compatible image picker library found. Please provide a valid image picker library.');\n if (__DEV__) {\n feedbackAlertDialog(\n 'Development note',\n 'No compatible image picker library found. Please provide a compatible version of `expo-image-picker` or `react-native-image-picker`.',\n );\n }\n return;\n }\n\n const result = await launchImageLibrary();\n if (result?.assets && result.assets.length > 0) {\n if (isWeb()) {\n const filename = result.assets[0]?.fileName;\n const imageUri = result.assets[0]?.uri;\n const base64 = result.assets[0]?.base64;\n const data = base64 ? base64ToUint8Array(base64) : undefined;\n if (data) {\n this.setState({ filename, attachment: data, attachmentUri: imageUri });\n } else {\n logger.error('Failed to read image data on the web');\n }\n } else {\n const filename = result.assets[0]?.fileName;\n const imageUri = result.assets[0]?.uri;\n imageUri && getDataFromUri(imageUri).then((data) => {\n if (data) {\n this.setState({ filename, attachment: data, attachmentUri: imageUri });\n } else {\n logger.error('Failed to read image data from uri:', imageUri);\n }\n }).catch((error) => {\n logger.error('Failed to read image data from uri:', imageUri, 'error: ', error);\n });\n }\n }\n } else {\n // Defaulting to the onAddScreenshot callback\n const { onAddScreenshot } = { ...defaultConfiguration, ...this.props };\n onAddScreenshot((uri: string) => {\n getDataFromUri(uri).then((data) => {\n if (data != null) {\n this.setState({ filename: 'feedback_screenshot', attachment: data, attachmentUri: uri });\n } else {\n logger.error('Failed to read image data from uri:', uri);\n }\n })\n .catch((error) => {\n logger.error('Failed to read image data from uri:', uri, 'error: ', error);\n });\n });\n }\n } else {\n this.setState({ filename: undefined, attachment: undefined, attachmentUri: undefined });\n }\n }\n\n /**\n * Save the state before unmounting the component.\n */\n public componentWillUnmount(): void {\n if (this._didSubmitForm) {\n this._clearFormState();\n this._didSubmitForm = false;\n } else {\n this._saveFormState();\n }\n }\n\n /**\n * Renders the feedback form screen.\n */\n public render(): React.ReactNode {\n const { name, email, description } = this.state;\n const { onFormClose } = this.props;\n const config: FeedbackGeneralConfiguration = this.props;\n const imagePickerConfiguration: ImagePickerConfiguration = this.props;\n const text: FeedbackTextConfiguration = this.props;\n const styles: FeedbackWidgetStyles = { ...defaultStyles, ...this.props.styles };\n const onCancel = (): void => {\n if (onFormClose) {\n onFormClose();\n } else {\n this.setState({ isVisible: false });\n }\n }\n\n if (!this.state.isVisible) {\n return null;\n }\n\n return (\n <TouchableWithoutFeedback onPress={notWeb() ? Keyboard.dismiss: undefined}>\n <View style={styles.container}>\n <View style={styles.titleContainer}>\n <Text style={styles.title}>{text.formTitle}</Text>\n {config.showBranding && (\n <Image\n source={{ uri: sentryLogo }}\n style={styles.sentryLogo}\n testID='sentry-logo'\n />\n )}\n </View>\n\n {config.showName && (\n <>\n <Text style={styles.label}>\n {text.nameLabel}\n {config.isNameRequired && ` ${text.isRequiredLabel}`}\n </Text>\n <TextInput\n style={styles.input}\n placeholder={text.namePlaceholder}\n value={name}\n onChangeText={(value) => this.setState({ name: value })}\n />\n </>\n )}\n\n {config.showEmail && (\n <>\n <Text style={styles.label}>\n {text.emailLabel}\n {config.isEmailRequired && ` ${text.isRequiredLabel}`}\n </Text>\n <TextInput\n style={styles.input}\n placeholder={text.emailPlaceholder}\n keyboardType={'email-address' as KeyboardTypeOptions}\n value={email}\n onChangeText={(value) => this.setState({ email: value })}\n />\n </>\n )}\n\n <Text style={styles.label}>\n {text.messageLabel}\n {` ${text.isRequiredLabel}`}\n </Text>\n <TextInput\n style={[styles.input, styles.textArea]}\n placeholder={text.messagePlaceholder}\n value={description}\n onChangeText={(value) => this.setState({ description: value })}\n multiline\n />\n {(config.enableScreenshot || imagePickerConfiguration.imagePicker) && (\n <View style={styles.screenshotContainer}>\n {this.state.attachmentUri && (\n <Image\n source={{ uri: this.state.attachmentUri }}\n style={styles.screenshotThumbnail}\n />\n )}\n <TouchableOpacity style={styles.screenshotButton} onPress={this.onScreenshotButtonPress}>\n <Text style={styles.screenshotText}>\n {!this.state.filename && !this.state.attachment\n ? text.addScreenshotButtonLabel\n : text.removeScreenshotButtonLabel}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n <TouchableOpacity style={styles.submitButton} onPress={this.handleFeedbackSubmit}>\n <Text style={styles.submitText}>{text.submitButtonLabel}</Text>\n </TouchableOpacity>\n\n <TouchableOpacity style={styles.cancelButton} onPress={onCancel}>\n <Text style={styles.cancelText}>{text.cancelButtonLabel}</Text>\n </TouchableOpacity>\n </View>\n </TouchableWithoutFeedback>\n );\n }\n\n private _saveFormState = (): void => {\n FeedbackWidget._savedState = { ...this.state };\n };\n\n private _clearFormState = (): void => {\n FeedbackWidget._savedState = {\n name: '',\n email: '',\n description: '',\n filename: undefined,\n attachment: undefined,\n attachmentUri: undefined,\n };\n };\n}\n"]}
|
|
@@ -15,32 +15,32 @@ export interface FeedbackGeneralConfiguration {
|
|
|
15
15
|
*
|
|
16
16
|
* @default true
|
|
17
17
|
*/
|
|
18
|
-
showBranding
|
|
18
|
+
showBranding: boolean;
|
|
19
19
|
/**
|
|
20
20
|
* Should the email field be required?
|
|
21
21
|
*/
|
|
22
|
-
isEmailRequired
|
|
22
|
+
isEmailRequired: boolean;
|
|
23
23
|
/**
|
|
24
24
|
* Should the email field be validated?
|
|
25
25
|
*/
|
|
26
|
-
shouldValidateEmail
|
|
26
|
+
shouldValidateEmail: boolean;
|
|
27
27
|
/**
|
|
28
28
|
* Should the name field be required?
|
|
29
29
|
*/
|
|
30
|
-
isNameRequired
|
|
30
|
+
isNameRequired: boolean;
|
|
31
31
|
/**
|
|
32
32
|
* Should the email input field be visible? Note: email will still be collected if set via `Sentry.setUser()`
|
|
33
33
|
*/
|
|
34
|
-
showEmail
|
|
34
|
+
showEmail: boolean;
|
|
35
35
|
/**
|
|
36
36
|
* Should the name input field be visible? Note: name will still be collected if set via `Sentry.setUser()`
|
|
37
37
|
*/
|
|
38
|
-
showName
|
|
38
|
+
showName: boolean;
|
|
39
39
|
/**
|
|
40
40
|
* This flag determines whether the "Add Screenshot" button is displayed
|
|
41
41
|
* @default false
|
|
42
42
|
*/
|
|
43
|
-
enableScreenshot
|
|
43
|
+
enableScreenshot: boolean;
|
|
44
44
|
/**
|
|
45
45
|
* Fill in email/name input fields with Sentry user context if it exists.
|
|
46
46
|
* The value of the email/name keys represent the properties of your user context.
|
|
@@ -57,27 +57,27 @@ export interface FeedbackTextConfiguration {
|
|
|
57
57
|
/**
|
|
58
58
|
* The label for the Feedback form cancel button that closes dialog
|
|
59
59
|
*/
|
|
60
|
-
cancelButtonLabel
|
|
60
|
+
cancelButtonLabel: string;
|
|
61
61
|
/**
|
|
62
62
|
* The label for the Feedback form submit button that sends feedback
|
|
63
63
|
*/
|
|
64
|
-
submitButtonLabel
|
|
64
|
+
submitButtonLabel: string;
|
|
65
65
|
/**
|
|
66
66
|
* The title of the Feedback form
|
|
67
67
|
*/
|
|
68
|
-
formTitle
|
|
68
|
+
formTitle: string;
|
|
69
69
|
/**
|
|
70
70
|
* Label for the email input
|
|
71
71
|
*/
|
|
72
|
-
emailLabel
|
|
72
|
+
emailLabel: string;
|
|
73
73
|
/**
|
|
74
74
|
* Placeholder text for Feedback email input
|
|
75
75
|
*/
|
|
76
|
-
emailPlaceholder
|
|
76
|
+
emailPlaceholder: string;
|
|
77
77
|
/**
|
|
78
78
|
* Label for the message input
|
|
79
79
|
*/
|
|
80
|
-
messageLabel
|
|
80
|
+
messageLabel: string;
|
|
81
81
|
/**
|
|
82
82
|
* Placeholder text for Feedback message input
|
|
83
83
|
*/
|
|
@@ -85,43 +85,43 @@ export interface FeedbackTextConfiguration {
|
|
|
85
85
|
/**
|
|
86
86
|
* Label for the name input
|
|
87
87
|
*/
|
|
88
|
-
nameLabel
|
|
88
|
+
nameLabel: string;
|
|
89
89
|
/**
|
|
90
90
|
* Message after feedback was sent successfully
|
|
91
91
|
*/
|
|
92
|
-
successMessageText
|
|
92
|
+
successMessageText: string;
|
|
93
93
|
/**
|
|
94
94
|
* Placeholder text for Feedback name input
|
|
95
95
|
*/
|
|
96
|
-
namePlaceholder
|
|
96
|
+
namePlaceholder: string;
|
|
97
97
|
/**
|
|
98
98
|
* Text which indicates that a field is required
|
|
99
99
|
*/
|
|
100
|
-
isRequiredLabel
|
|
100
|
+
isRequiredLabel: string;
|
|
101
101
|
/**
|
|
102
102
|
* The label for the button that adds a screenshot and renders the image editor
|
|
103
103
|
*/
|
|
104
|
-
addScreenshotButtonLabel
|
|
104
|
+
addScreenshotButtonLabel: string;
|
|
105
105
|
/**
|
|
106
106
|
* The label for the button that removes a screenshot and hides the image editor
|
|
107
107
|
*/
|
|
108
|
-
removeScreenshotButtonLabel
|
|
108
|
+
removeScreenshotButtonLabel: string;
|
|
109
109
|
/**
|
|
110
110
|
* The title of the error dialog
|
|
111
111
|
*/
|
|
112
|
-
errorTitle
|
|
112
|
+
errorTitle: string;
|
|
113
113
|
/**
|
|
114
114
|
* The error message when the form is invalid
|
|
115
115
|
*/
|
|
116
|
-
formError
|
|
116
|
+
formError: string;
|
|
117
117
|
/**
|
|
118
118
|
* The error message when the email is invalid
|
|
119
119
|
*/
|
|
120
|
-
emailError
|
|
120
|
+
emailError: string;
|
|
121
121
|
/**
|
|
122
122
|
* Message when there is a generic error
|
|
123
123
|
*/
|
|
124
|
-
genericError
|
|
124
|
+
genericError: string;
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
127
127
|
* The public callbacks available for the feedback integration
|
|
@@ -130,29 +130,29 @@ export interface FeedbackCallbacks {
|
|
|
130
130
|
/**
|
|
131
131
|
* Callback when form is opened
|
|
132
132
|
*/
|
|
133
|
-
onFormOpen
|
|
133
|
+
onFormOpen: () => void;
|
|
134
134
|
/**
|
|
135
135
|
* Callback when form is closed and not submitted
|
|
136
136
|
*/
|
|
137
|
-
onFormClose
|
|
137
|
+
onFormClose: () => void;
|
|
138
138
|
/**
|
|
139
139
|
* Callback when a screenshot is added
|
|
140
140
|
*/
|
|
141
|
-
onAddScreenshot
|
|
141
|
+
onAddScreenshot: (addScreenshot: (uri: string) => void) => void;
|
|
142
142
|
/**
|
|
143
143
|
* Callback when feedback is successfully submitted
|
|
144
144
|
*
|
|
145
145
|
* After this you'll see a SuccessMessage on the screen for a moment.
|
|
146
146
|
*/
|
|
147
|
-
onSubmitSuccess
|
|
147
|
+
onSubmitSuccess: (data: FeedbackFormData) => void;
|
|
148
148
|
/**
|
|
149
149
|
* Callback when feedback is unsuccessfully submitted
|
|
150
150
|
*/
|
|
151
|
-
onSubmitError
|
|
151
|
+
onSubmitError: (error: Error) => void;
|
|
152
152
|
/**
|
|
153
153
|
* Callback when the feedback form is submitted successfully, and the SuccessMessage is complete, or dismissed
|
|
154
154
|
*/
|
|
155
|
-
onFormSubmitted
|
|
155
|
+
onFormSubmitted: () => void;
|
|
156
156
|
}
|
|
157
157
|
/**
|
|
158
158
|
* Image Picker configuration interface compatible with:
|