@sentry/react-native 6.7.0 → 6.9.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.
Files changed (120) hide show
  1. package/RNSentry.podspec +1 -1
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +35 -0
  4. package/android/src/main/java/io/sentry/react/RNSentryVersion.java +1 -1
  5. package/android/src/newarch/java/io/sentry/react/RNSentryModule.java +5 -0
  6. package/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +5 -0
  7. package/dist/js/NativeRNSentry.d.ts +1 -0
  8. package/dist/js/NativeRNSentry.d.ts.map +1 -1
  9. package/dist/js/NativeRNSentry.js.map +1 -1
  10. package/dist/js/feedback/FeedbackWidget.d.ts +25 -0
  11. package/dist/js/feedback/FeedbackWidget.d.ts.map +1 -0
  12. package/dist/js/feedback/FeedbackWidget.js +249 -0
  13. package/dist/js/feedback/FeedbackWidget.js.map +1 -0
  14. package/dist/js/feedback/FeedbackWidget.styles.d.ts +8 -0
  15. package/dist/js/feedback/FeedbackWidget.styles.d.ts.map +1 -0
  16. package/dist/js/feedback/FeedbackWidget.styles.js +120 -0
  17. package/dist/js/feedback/FeedbackWidget.styles.js.map +1 -0
  18. package/dist/js/feedback/FeedbackWidget.types.d.ts +218 -0
  19. package/dist/js/feedback/FeedbackWidget.types.d.ts.map +1 -0
  20. package/dist/js/feedback/FeedbackWidget.types.js +2 -0
  21. package/dist/js/feedback/FeedbackWidget.types.js.map +1 -0
  22. package/dist/js/feedback/FeedbackWidgetManager.d.ts +33 -0
  23. package/dist/js/feedback/FeedbackWidgetManager.d.ts.map +1 -0
  24. package/dist/js/feedback/FeedbackWidgetManager.js +188 -0
  25. package/dist/js/feedback/FeedbackWidgetManager.js.map +1 -0
  26. package/dist/js/feedback/branding.d.ts +5 -0
  27. package/dist/js/feedback/branding.d.ts.map +1 -0
  28. package/dist/js/feedback/branding.js +5 -0
  29. package/dist/js/feedback/branding.js.map +1 -0
  30. package/dist/js/feedback/defaults.d.ts +3 -0
  31. package/dist/js/feedback/defaults.d.ts.map +1 -0
  32. package/dist/js/feedback/defaults.js +72 -0
  33. package/dist/js/feedback/defaults.js.map +1 -0
  34. package/dist/js/feedback/integration.d.ts +10 -0
  35. package/dist/js/feedback/integration.d.ts.map +1 -0
  36. package/dist/js/feedback/integration.js +17 -0
  37. package/dist/js/feedback/integration.js.map +1 -0
  38. package/dist/js/feedback/lazy.d.ts +10 -0
  39. package/dist/js/feedback/lazy.d.ts.map +1 -0
  40. package/dist/js/feedback/lazy.js +26 -0
  41. package/dist/js/feedback/lazy.js.map +1 -0
  42. package/dist/js/feedback/utils.d.ts +17 -0
  43. package/dist/js/feedback/utils.d.ts.map +1 -0
  44. package/dist/js/feedback/utils.js +38 -0
  45. package/dist/js/feedback/utils.js.map +1 -0
  46. package/dist/js/index.d.ts +2 -0
  47. package/dist/js/index.d.ts.map +1 -1
  48. package/dist/js/index.js +2 -0
  49. package/dist/js/index.js.map +1 -1
  50. package/dist/js/integrations/debugsymbolicator.js +9 -1
  51. package/dist/js/integrations/debugsymbolicator.js.map +1 -1
  52. package/dist/js/integrations/debugsymbolicatorutils.js +9 -1
  53. package/dist/js/integrations/debugsymbolicatorutils.js.map +1 -1
  54. package/dist/js/integrations/devicecontext.js +9 -1
  55. package/dist/js/integrations/devicecontext.js.map +1 -1
  56. package/dist/js/integrations/exports.d.ts +1 -0
  57. package/dist/js/integrations/exports.d.ts.map +1 -1
  58. package/dist/js/integrations/exports.js +1 -0
  59. package/dist/js/integrations/exports.js.map +1 -1
  60. package/dist/js/integrations/modulesloader.js +9 -1
  61. package/dist/js/integrations/modulesloader.js.map +1 -1
  62. package/dist/js/integrations/reactnativeerrorhandlers.js +9 -1
  63. package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
  64. package/dist/js/integrations/release.js +9 -1
  65. package/dist/js/integrations/release.js.map +1 -1
  66. package/dist/js/integrations/screenshot.js +9 -1
  67. package/dist/js/integrations/screenshot.js.map +1 -1
  68. package/dist/js/integrations/sdkinfo.js +9 -1
  69. package/dist/js/integrations/sdkinfo.js.map +1 -1
  70. package/dist/js/integrations/viewhierarchy.js +9 -1
  71. package/dist/js/integrations/viewhierarchy.js.map +1 -1
  72. package/dist/js/replay/mobilereplay.js +9 -1
  73. package/dist/js/replay/mobilereplay.js.map +1 -1
  74. package/dist/js/sdk.d.ts.map +1 -1
  75. package/dist/js/sdk.js +12 -2
  76. package/dist/js/sdk.js.map +1 -1
  77. package/dist/js/tools/metroMiddleware.js +11 -3
  78. package/dist/js/tools/metroMiddleware.js.map +1 -1
  79. package/dist/js/tools/metroconfig.js +15 -2
  80. package/dist/js/tools/metroconfig.js.map +1 -1
  81. package/dist/js/tools/sentryMetroSerializer.js +11 -3
  82. package/dist/js/tools/sentryMetroSerializer.js.map +1 -1
  83. package/dist/js/tracing/integrations/appStart.js +9 -1
  84. package/dist/js/tracing/integrations/appStart.js.map +1 -1
  85. package/dist/js/tracing/integrations/nativeFrames.js +9 -1
  86. package/dist/js/tracing/integrations/nativeFrames.js.map +1 -1
  87. package/dist/js/utils/worldwide.d.ts +1 -0
  88. package/dist/js/utils/worldwide.d.ts.map +1 -1
  89. package/dist/js/utils/worldwide.js.map +1 -1
  90. package/dist/js/version.d.ts +1 -1
  91. package/dist/js/version.js +1 -1
  92. package/dist/js/version.js.map +1 -1
  93. package/dist/js/wrapper.d.ts +1 -0
  94. package/dist/js/wrapper.d.ts.map +1 -1
  95. package/dist/js/wrapper.js +35 -1
  96. package/dist/js/wrapper.js.map +1 -1
  97. package/ios/RNSentry.mm +70 -17
  98. package/ios/RNSentryVersion.m +1 -1
  99. package/package.json +6 -6
  100. package/plugin/build/withSentry.d.ts +2 -0
  101. package/plugin/build/withSentry.js +10 -0
  102. package/plugin/build/withSentryAndroidGradlePlugin.d.ts +15 -0
  103. package/plugin/build/withSentryAndroidGradlePlugin.js +91 -0
  104. package/scripts/collect-modules.sh +5 -5
  105. package/src/js/NativeRNSentry.ts +1 -0
  106. package/ts3.8/dist/js/NativeRNSentry.d.ts +1 -0
  107. package/ts3.8/dist/js/feedback/FeedbackWidget.d.ts +25 -0
  108. package/ts3.8/dist/js/feedback/FeedbackWidget.styles.d.ts +8 -0
  109. package/ts3.8/dist/js/feedback/FeedbackWidget.types.d.ts +218 -0
  110. package/ts3.8/dist/js/feedback/FeedbackWidgetManager.d.ts +33 -0
  111. package/ts3.8/dist/js/feedback/branding.d.ts +5 -0
  112. package/ts3.8/dist/js/feedback/defaults.d.ts +3 -0
  113. package/ts3.8/dist/js/feedback/integration.d.ts +10 -0
  114. package/ts3.8/dist/js/feedback/lazy.d.ts +10 -0
  115. package/ts3.8/dist/js/feedback/utils.d.ts +17 -0
  116. package/ts3.8/dist/js/index.d.ts +2 -0
  117. package/ts3.8/dist/js/integrations/exports.d.ts +1 -0
  118. package/ts3.8/dist/js/utils/worldwide.d.ts +1 -0
  119. package/ts3.8/dist/js/version.d.ts +1 -1
  120. package/ts3.8/dist/js/wrapper.d.ts +1 -0
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.44.0'
40
+ s.dependency 'Sentry/HybridSDK', '8.45.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)
@@ -54,5 +54,5 @@ android {
54
54
 
55
55
  dependencies {
56
56
  implementation 'com.facebook.react:react-native:+'
57
- api 'io.sentry:sentry-android:7.20.1'
57
+ api 'io.sentry:sentry-android:7.22.0'
58
58
  }
@@ -10,6 +10,7 @@ import android.content.Context;
10
10
  import android.content.pm.PackageInfo;
11
11
  import android.content.pm.PackageManager;
12
12
  import android.content.res.AssetManager;
13
+ import android.net.Uri;
13
14
  import android.util.SparseIntArray;
14
15
  import androidx.core.app.FrameMetricsAggregator;
15
16
  import androidx.fragment.app.FragmentActivity;
@@ -72,6 +73,7 @@ import io.sentry.util.JsonSerializationUtils;
72
73
  import io.sentry.vendor.Base64;
73
74
  import java.io.BufferedInputStream;
74
75
  import java.io.BufferedReader;
76
+ import java.io.ByteArrayOutputStream;
75
77
  import java.io.File;
76
78
  import java.io.FileNotFoundException;
77
79
  import java.io.FileReader;
@@ -970,6 +972,39 @@ public class RNSentryModuleImpl {
970
972
  return packageInfo.packageName;
971
973
  }
972
974
 
975
+ public void getDataFromUri(String uri, Promise promise) {
976
+ try {
977
+ Uri contentUri = Uri.parse(uri);
978
+ try (InputStream is =
979
+ getReactApplicationContext().getContentResolver().openInputStream(contentUri)) {
980
+ if (is == null) {
981
+ String msg = "File not found for uri: " + uri;
982
+ logger.log(SentryLevel.ERROR, msg);
983
+ promise.reject(new Exception(msg));
984
+ return;
985
+ }
986
+
987
+ ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
988
+ int bufferSize = 1024;
989
+ byte[] buffer = new byte[bufferSize];
990
+ int len;
991
+ while ((len = is.read(buffer)) != -1) {
992
+ byteBuffer.write(buffer, 0, len);
993
+ }
994
+ byte[] byteArray = byteBuffer.toByteArray();
995
+ WritableArray jsArray = Arguments.createArray();
996
+ for (byte b : byteArray) {
997
+ jsArray.pushInt(b & 0xFF);
998
+ }
999
+ promise.resolve(jsArray);
1000
+ }
1001
+ } catch (IOException e) {
1002
+ String msg = "Error reading uri: " + uri + ": " + e.getMessage();
1003
+ logger.log(SentryLevel.ERROR, msg);
1004
+ promise.reject(new Exception(msg));
1005
+ }
1006
+ }
1007
+
973
1008
  public void crashedLastRun(Promise promise) {
974
1009
  promise.resolve(Sentry.isCrashedLastRun());
975
1010
  }
@@ -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 = "6.7.0";
5
+ static final String REACT_NATIVE_SDK_PACKAGE_VERSION = "6.9.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";
@@ -177,4 +177,9 @@ public class RNSentryModule extends NativeRNSentrySpec {
177
177
  public void getNewScreenTimeToDisplay(Promise promise) {
178
178
  this.impl.getNewScreenTimeToDisplay(promise);
179
179
  }
180
+
181
+ @Override
182
+ public void getDataFromUri(String uri, Promise promise) {
183
+ this.impl.getDataFromUri(uri, promise);
184
+ }
180
185
  }
@@ -152,6 +152,11 @@ public class RNSentryModule extends ReactContextBaseJavaModule {
152
152
  return this.impl.fetchNativePackageName();
153
153
  }
154
154
 
155
+ @ReactMethod
156
+ public void getDataFromUri(String uri, Promise promise) {
157
+ this.impl.getDataFromUri(uri, promise);
158
+ }
159
+
155
160
  @ReactMethod(isBlockingSynchronousMethod = true)
156
161
  public WritableMap fetchNativeStackFramesBy(ReadableArray instructionsAddr) {
157
162
  // Not used on Android
@@ -43,6 +43,7 @@ export interface Spec extends TurboModule {
43
43
  captureReplay(isHardCrash: boolean): Promise<string | undefined | null>;
44
44
  getCurrentReplayId(): string | undefined | null;
45
45
  crashedLastRun(): Promise<boolean | undefined | null>;
46
+ getDataFromUri(uri: string): Promise<number[]>;
46
47
  }
47
48
  export type NativeStackFrame = {
48
49
  platform: string;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"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"}
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;AA0JnD,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';\n\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 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 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}\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 segment?: 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"]}
1
+ {"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA2JnD,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';\n\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 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 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}\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 segment?: 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"]}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import type { FeedbackWidgetProps, FeedbackWidgetState } from './FeedbackWidget.types';
3
+ /**
4
+ * @beta
5
+ * Implements a feedback form screen that sends feedback to Sentry using Sentry.captureFeedback.
6
+ */
7
+ export declare class FeedbackWidget extends React.Component<FeedbackWidgetProps, FeedbackWidgetState> {
8
+ static defaultProps: Partial<FeedbackWidgetProps>;
9
+ private static _savedState;
10
+ private _didSubmitForm;
11
+ constructor(props: FeedbackWidgetProps);
12
+ handleFeedbackSubmit: () => void;
13
+ onScreenshotButtonPress: () => void;
14
+ /**
15
+ * Save the state before unmounting the component.
16
+ */
17
+ componentWillUnmount(): void;
18
+ /**
19
+ * Renders the feedback form screen.
20
+ */
21
+ render(): React.ReactNode;
22
+ private _saveFormState;
23
+ private _clearFormState;
24
+ }
25
+ //# sourceMappingURL=FeedbackWidget.d.ts.map
@@ -0,0 +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,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAEvD;IAED,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"}
@@ -0,0 +1,249 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { captureFeedback, getCurrentScope, lastEventId, logger } from '@sentry/core';
11
+ import * as React from 'react';
12
+ import { Image, Keyboard, Text, TextInput, TouchableOpacity, TouchableWithoutFeedback, View } from 'react-native';
13
+ import { isWeb, notWeb } from '../utils/environment';
14
+ import { NATIVE } from '../wrapper';
15
+ import { sentryLogo } from './branding';
16
+ import { defaultConfiguration } from './defaults';
17
+ import defaultStyles from './FeedbackWidget.styles';
18
+ import { lazyLoadFeedbackIntegration } from './lazy';
19
+ import { base64ToUint8Array, feedbackAlertDialog, isValidEmail } from './utils';
20
+ /**
21
+ * @beta
22
+ * Implements a feedback form screen that sends feedback to Sentry using Sentry.captureFeedback.
23
+ */
24
+ export class FeedbackWidget extends React.Component {
25
+ constructor(props) {
26
+ var _a, _b, _c, _d, _e, _f, _g, _h;
27
+ super(props);
28
+ this._didSubmitForm = false;
29
+ this.handleFeedbackSubmit = () => {
30
+ const { name, email, description } = this.state;
31
+ const { onSubmitSuccess, onSubmitError, onFormSubmitted } = this.props;
32
+ const text = this.props;
33
+ const trimmedName = name === null || name === void 0 ? void 0 : name.trim();
34
+ const trimmedEmail = email === null || email === void 0 ? void 0 : email.trim();
35
+ const trimmedDescription = description === null || description === void 0 ? void 0 : description.trim();
36
+ if ((this.props.isNameRequired && !trimmedName) || (this.props.isEmailRequired && !trimmedEmail) || !trimmedDescription) {
37
+ feedbackAlertDialog(text.errorTitle, text.formError);
38
+ return;
39
+ }
40
+ if (this.props.shouldValidateEmail && (this.props.isEmailRequired || trimmedEmail.length > 0) && !isValidEmail(trimmedEmail)) {
41
+ feedbackAlertDialog(text.errorTitle, text.emailError);
42
+ return;
43
+ }
44
+ const attachments = this.state.filename && this.state.attachment
45
+ ? [
46
+ {
47
+ filename: this.state.filename,
48
+ data: this.state.attachment,
49
+ },
50
+ ]
51
+ : undefined;
52
+ const eventId = lastEventId();
53
+ const userFeedback = {
54
+ message: trimmedDescription,
55
+ name: trimmedName,
56
+ email: trimmedEmail,
57
+ associatedEventId: eventId,
58
+ };
59
+ try {
60
+ if (!onFormSubmitted) {
61
+ this.setState({ isVisible: false });
62
+ }
63
+ captureFeedback(userFeedback, attachments ? { attachments } : undefined);
64
+ onSubmitSuccess({ name: trimmedName, email: trimmedEmail, message: trimmedDescription, attachments: attachments });
65
+ feedbackAlertDialog(text.successMessageText, '');
66
+ onFormSubmitted();
67
+ this._didSubmitForm = true;
68
+ }
69
+ catch (error) {
70
+ const errorString = `Feedback form submission failed: ${error}`;
71
+ onSubmitError(new Error(errorString));
72
+ feedbackAlertDialog(text.errorTitle, text.genericError);
73
+ logger.error(`Feedback form submission failed: ${error}`);
74
+ }
75
+ };
76
+ this.onScreenshotButtonPress = () => __awaiter(this, void 0, void 0, function* () {
77
+ if (!this.state.filename && !this.state.attachment) {
78
+ const imagePickerConfiguration = this.props;
79
+ if (imagePickerConfiguration.imagePicker) {
80
+ const launchImageLibrary = imagePickerConfiguration.imagePicker.launchImageLibraryAsync
81
+ // expo-image-picker library is available
82
+ ? () => imagePickerConfiguration.imagePicker.launchImageLibraryAsync({ mediaTypes: ['images'], base64: isWeb() })
83
+ // react-native-image-picker library is available
84
+ : imagePickerConfiguration.imagePicker.launchImageLibrary
85
+ ? () => imagePickerConfiguration.imagePicker.launchImageLibrary({ mediaType: 'photo', includeBase64: isWeb() })
86
+ : null;
87
+ if (!launchImageLibrary) {
88
+ logger.warn('No compatible image picker library found. Please provide a valid image picker library.');
89
+ if (__DEV__) {
90
+ feedbackAlertDialog('Development note', 'No compatible image picker library found. Please provide a compatible version of `expo-image-picker` or `react-native-image-picker`.');
91
+ }
92
+ return;
93
+ }
94
+ const result = yield launchImageLibrary();
95
+ if (result.assets && result.assets.length > 0) {
96
+ 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 != null) {
102
+ this.setState({ filename, attachment: data, attachmentUri: imageUri });
103
+ }
104
+ else {
105
+ logger.error('Failed to read image data on the web');
106
+ }
107
+ }
108
+ else {
109
+ const filename = result.assets[0].fileName;
110
+ const imageUri = result.assets[0].uri;
111
+ NATIVE.getDataFromUri(imageUri).then((data) => {
112
+ if (data != null) {
113
+ this.setState({ filename, attachment: data, attachmentUri: imageUri });
114
+ }
115
+ else {
116
+ logger.error('Failed to read image data from uri:', imageUri);
117
+ }
118
+ }).catch((error) => {
119
+ logger.error('Failed to read image data from uri:', imageUri, 'error: ', error);
120
+ });
121
+ }
122
+ }
123
+ }
124
+ else {
125
+ // Defaulting to the onAddScreenshot callback
126
+ const { onAddScreenshot } = Object.assign(Object.assign({}, defaultConfiguration), this.props);
127
+ onAddScreenshot((uri) => {
128
+ NATIVE.getDataFromUri(uri).then((data) => {
129
+ if (data != null) {
130
+ this.setState({ filename: 'feedback_screenshot', attachment: data, attachmentUri: uri });
131
+ }
132
+ else {
133
+ logger.error('Failed to read image data from uri:', uri);
134
+ }
135
+ })
136
+ .catch((error) => {
137
+ logger.error('Failed to read image data from uri:', uri, 'error: ', error);
138
+ });
139
+ });
140
+ }
141
+ }
142
+ else {
143
+ this.setState({ filename: undefined, attachment: undefined, attachmentUri: undefined });
144
+ }
145
+ });
146
+ this._saveFormState = () => {
147
+ FeedbackWidget._savedState = Object.assign({}, this.state);
148
+ };
149
+ this._clearFormState = () => {
150
+ FeedbackWidget._savedState = {
151
+ name: '',
152
+ email: '',
153
+ description: '',
154
+ filename: undefined,
155
+ attachment: undefined,
156
+ attachmentUri: undefined,
157
+ };
158
+ };
159
+ const currentUser = {
160
+ useSentryUser: {
161
+ email: ((_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.useSentryUser) === null || _b === void 0 ? void 0 : _b.email) || ((_d = (_c = getCurrentScope()) === null || _c === void 0 ? void 0 : _c.getUser()) === null || _d === void 0 ? void 0 : _d.email) || '',
162
+ name: ((_f = (_e = this.props) === null || _e === void 0 ? void 0 : _e.useSentryUser) === null || _f === void 0 ? void 0 : _f.name) || ((_h = (_g = getCurrentScope()) === null || _g === void 0 ? void 0 : _g.getUser()) === null || _h === void 0 ? void 0 : _h.name) || '',
163
+ }
164
+ };
165
+ this.state = {
166
+ isVisible: true,
167
+ name: FeedbackWidget._savedState.name || currentUser.useSentryUser.name,
168
+ email: FeedbackWidget._savedState.email || currentUser.useSentryUser.email,
169
+ description: FeedbackWidget._savedState.description || '',
170
+ filename: FeedbackWidget._savedState.filename || undefined,
171
+ attachment: FeedbackWidget._savedState.attachment || undefined,
172
+ attachmentUri: FeedbackWidget._savedState.attachmentUri || undefined,
173
+ };
174
+ lazyLoadFeedbackIntegration();
175
+ }
176
+ /**
177
+ * Save the state before unmounting the component.
178
+ */
179
+ componentWillUnmount() {
180
+ if (this._didSubmitForm) {
181
+ this._clearFormState();
182
+ this._didSubmitForm = false;
183
+ }
184
+ else {
185
+ this._saveFormState();
186
+ }
187
+ }
188
+ /**
189
+ * Renders the feedback form screen.
190
+ */
191
+ render() {
192
+ const { name, email, description } = this.state;
193
+ const { onFormClose } = this.props;
194
+ const config = this.props;
195
+ const imagePickerConfiguration = this.props;
196
+ const text = this.props;
197
+ const styles = Object.assign(Object.assign({}, defaultStyles), this.props.styles);
198
+ const onCancel = () => {
199
+ if (onFormClose) {
200
+ onFormClose();
201
+ }
202
+ else {
203
+ this.setState({ isVisible: false });
204
+ }
205
+ };
206
+ if (!this.state.isVisible) {
207
+ return null;
208
+ }
209
+ return (React.createElement(TouchableWithoutFeedback, { onPress: notWeb() ? Keyboard.dismiss : undefined },
210
+ React.createElement(View, { style: styles.container },
211
+ React.createElement(View, { style: styles.titleContainer },
212
+ React.createElement(Text, { style: styles.title }, text.formTitle),
213
+ config.showBranding && (React.createElement(Image, { source: { uri: sentryLogo }, style: styles.sentryLogo, testID: 'sentry-logo' }))),
214
+ config.showName && (React.createElement(React.Fragment, null,
215
+ React.createElement(Text, { style: styles.label },
216
+ text.nameLabel,
217
+ config.isNameRequired && ` ${text.isRequiredLabel}`),
218
+ React.createElement(TextInput, { style: styles.input, placeholder: text.namePlaceholder, value: name, onChangeText: (value) => this.setState({ name: value }) }))),
219
+ config.showEmail && (React.createElement(React.Fragment, null,
220
+ React.createElement(Text, { style: styles.label },
221
+ text.emailLabel,
222
+ config.isEmailRequired && ` ${text.isRequiredLabel}`),
223
+ React.createElement(TextInput, { style: styles.input, placeholder: text.emailPlaceholder, keyboardType: 'email-address', value: email, onChangeText: (value) => this.setState({ email: value }) }))),
224
+ React.createElement(Text, { style: styles.label },
225
+ text.messageLabel,
226
+ ` ${text.isRequiredLabel}`),
227
+ React.createElement(TextInput, { style: [styles.input, styles.textArea], placeholder: text.messagePlaceholder, value: description, onChangeText: (value) => this.setState({ description: value }), multiline: true }),
228
+ (config.enableScreenshot || imagePickerConfiguration.imagePicker) && (React.createElement(View, { style: styles.screenshotContainer },
229
+ this.state.attachmentUri && (React.createElement(Image, { source: { uri: this.state.attachmentUri }, style: styles.screenshotThumbnail })),
230
+ React.createElement(TouchableOpacity, { style: styles.screenshotButton, onPress: this.onScreenshotButtonPress },
231
+ React.createElement(Text, { style: styles.screenshotText }, !this.state.filename && !this.state.attachment
232
+ ? text.addScreenshotButtonLabel
233
+ : text.removeScreenshotButtonLabel)))),
234
+ React.createElement(TouchableOpacity, { style: styles.submitButton, onPress: this.handleFeedbackSubmit },
235
+ React.createElement(Text, { style: styles.submitText }, text.submitButtonLabel)),
236
+ React.createElement(TouchableOpacity, { style: styles.cancelButton, onPress: onCancel },
237
+ React.createElement(Text, { style: styles.cancelText }, text.cancelButtonLabel)))));
238
+ }
239
+ }
240
+ FeedbackWidget.defaultProps = Object.assign({}, defaultConfiguration);
241
+ FeedbackWidget._savedState = {
242
+ name: '',
243
+ email: '',
244
+ description: '',
245
+ filename: undefined,
246
+ attachment: undefined,
247
+ attachmentUri: undefined,
248
+ };
249
+ //# sourceMappingURL=FeedbackWidget.js.map
@@ -0,0 +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 { NATIVE } 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 NATIVE.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 NATIVE.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"]}
@@ -0,0 +1,8 @@
1
+ import type { ViewStyle } from 'react-native';
2
+ import type { FeedbackWidgetStyles } from './FeedbackWidget.types';
3
+ declare const defaultStyles: FeedbackWidgetStyles;
4
+ export declare const modalWrapper: ViewStyle;
5
+ export declare const modalSheetContainer: ViewStyle;
6
+ export declare const topSpacer: ViewStyle;
7
+ export default defaultStyles;
8
+ //# sourceMappingURL=FeedbackWidget.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackWidget.styles.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAOnE,QAAA,MAAM,aAAa,EAAE,oBA0FpB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,SAM1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAYjC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,SAEvB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,120 @@
1
+ const PURPLE = 'rgba(88, 74, 192, 1)';
2
+ const FOREGROUND_COLOR = '#2b2233';
3
+ const BACKGROUND_COLOR = '#ffffff';
4
+ const BORDER_COLOR = 'rgba(41, 35, 47, 0.13)';
5
+ const defaultStyles = {
6
+ container: {
7
+ flex: 1,
8
+ padding: 20,
9
+ backgroundColor: BACKGROUND_COLOR,
10
+ },
11
+ title: {
12
+ fontSize: 24,
13
+ fontWeight: 'bold',
14
+ marginBottom: 20,
15
+ textAlign: 'left',
16
+ flex: 1,
17
+ color: FOREGROUND_COLOR,
18
+ },
19
+ label: {
20
+ marginBottom: 4,
21
+ fontSize: 16,
22
+ color: FOREGROUND_COLOR,
23
+ },
24
+ input: {
25
+ height: 50,
26
+ borderColor: BORDER_COLOR,
27
+ borderWidth: 1,
28
+ borderRadius: 5,
29
+ paddingHorizontal: 10,
30
+ marginBottom: 15,
31
+ fontSize: 16,
32
+ color: FOREGROUND_COLOR,
33
+ },
34
+ textArea: {
35
+ height: 100,
36
+ textAlignVertical: 'top',
37
+ color: FOREGROUND_COLOR,
38
+ },
39
+ screenshotButton: {
40
+ backgroundColor: BACKGROUND_COLOR,
41
+ padding: 15,
42
+ borderRadius: 5,
43
+ alignItems: 'center',
44
+ flex: 1,
45
+ borderWidth: 1,
46
+ borderColor: BORDER_COLOR,
47
+ },
48
+ screenshotContainer: {
49
+ flexDirection: 'row',
50
+ alignItems: 'center',
51
+ width: '100%',
52
+ marginBottom: 20,
53
+ },
54
+ screenshotThumbnail: {
55
+ width: 50,
56
+ height: 50,
57
+ borderRadius: 5,
58
+ marginRight: 10,
59
+ },
60
+ screenshotText: {
61
+ color: FOREGROUND_COLOR,
62
+ fontSize: 16,
63
+ },
64
+ submitButton: {
65
+ backgroundColor: PURPLE,
66
+ paddingVertical: 15,
67
+ borderRadius: 5,
68
+ alignItems: 'center',
69
+ marginBottom: 10,
70
+ },
71
+ submitText: {
72
+ color: BACKGROUND_COLOR,
73
+ fontSize: 18,
74
+ },
75
+ cancelButton: {
76
+ backgroundColor: BACKGROUND_COLOR,
77
+ padding: 15,
78
+ borderRadius: 5,
79
+ alignItems: 'center',
80
+ borderWidth: 1,
81
+ borderColor: BORDER_COLOR,
82
+ },
83
+ cancelText: {
84
+ color: FOREGROUND_COLOR,
85
+ fontSize: 16,
86
+ },
87
+ titleContainer: {
88
+ flexDirection: 'row',
89
+ width: '100%',
90
+ },
91
+ sentryLogo: {
92
+ width: 40,
93
+ height: 40,
94
+ },
95
+ };
96
+ export const modalWrapper = {
97
+ position: 'absolute',
98
+ top: 0,
99
+ left: 0,
100
+ right: 0,
101
+ bottom: 0,
102
+ };
103
+ export const modalSheetContainer = {
104
+ backgroundColor: '#ffffff',
105
+ borderTopLeftRadius: 16,
106
+ borderTopRightRadius: 16,
107
+ overflow: 'hidden',
108
+ alignSelf: 'stretch',
109
+ shadowColor: '#000',
110
+ shadowOffset: { width: 0, height: -3 },
111
+ shadowOpacity: 0.1,
112
+ shadowRadius: 4,
113
+ elevation: 5,
114
+ flex: 1,
115
+ };
116
+ export const topSpacer = {
117
+ height: 64, // magic number
118
+ };
119
+ export default defaultStyles;
120
+ //# sourceMappingURL=FeedbackWidget.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackWidget.styles.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.styles.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ViewStyle } from 'react-native';\n\nimport type { FeedbackWidgetStyles } from './FeedbackWidget.types';\n\nconst PURPLE = 'rgba(88, 74, 192, 1)';\nconst FOREGROUND_COLOR = '#2b2233';\nconst BACKGROUND_COLOR = '#ffffff';\nconst BORDER_COLOR = 'rgba(41, 35, 47, 0.13)';\n\nconst defaultStyles: FeedbackWidgetStyles = {\n container: {\n flex: 1,\n padding: 20,\n backgroundColor: BACKGROUND_COLOR,\n },\n title: {\n fontSize: 24,\n fontWeight: 'bold',\n marginBottom: 20,\n textAlign: 'left',\n flex: 1,\n color: FOREGROUND_COLOR,\n },\n label: {\n marginBottom: 4,\n fontSize: 16,\n color: FOREGROUND_COLOR,\n },\n input: {\n height: 50,\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n borderRadius: 5,\n paddingHorizontal: 10,\n marginBottom: 15,\n fontSize: 16,\n color: FOREGROUND_COLOR,\n },\n textArea: {\n height: 100,\n textAlignVertical: 'top',\n color: FOREGROUND_COLOR,\n },\n screenshotButton: {\n backgroundColor: BACKGROUND_COLOR,\n padding: 15,\n borderRadius: 5,\n alignItems: 'center',\n flex: 1,\n borderWidth: 1,\n borderColor: BORDER_COLOR,\n },\n screenshotContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n width: '100%',\n marginBottom: 20,\n },\n screenshotThumbnail: {\n width: 50,\n height: 50,\n borderRadius: 5,\n marginRight: 10,\n },\n screenshotText: {\n color: FOREGROUND_COLOR,\n fontSize: 16,\n },\n submitButton: {\n backgroundColor: PURPLE,\n paddingVertical: 15,\n borderRadius: 5,\n alignItems: 'center',\n marginBottom: 10,\n },\n submitText: {\n color: BACKGROUND_COLOR,\n fontSize: 18,\n },\n cancelButton: {\n backgroundColor: BACKGROUND_COLOR,\n padding: 15,\n borderRadius: 5,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: BORDER_COLOR,\n },\n cancelText: {\n color: FOREGROUND_COLOR,\n fontSize: 16,\n },\n titleContainer: {\n flexDirection: 'row',\n width: '100%',\n },\n sentryLogo: {\n width: 40,\n height: 40,\n },\n};\n\nexport const modalWrapper: ViewStyle = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n};\n\nexport const modalSheetContainer: ViewStyle = {\n backgroundColor: '#ffffff',\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n overflow: 'hidden',\n alignSelf: 'stretch',\n shadowColor: '#000',\n shadowOffset: { width: 0, height: -3 },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n elevation: 5,\n flex: 1,\n};\n\nexport const topSpacer: ViewStyle = {\n height: 64, // magic number\n};\n\nexport default defaultStyles;\n"]}