@sentry/react-native 8.5.0 → 8.6.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/expo-handler/build.gradle +20 -0
- package/android/expo-handler/src/main/java/io/sentry/react/expo/SentryExpoPackage.java +22 -0
- package/android/expo-handler/src/main/java/io/sentry/react/expo/SentryReactNativeHostHandler.java +48 -0
- package/android/expo-stubs/README.md +7 -0
- package/android/expo-stubs/build.gradle +23 -0
- package/android/expo-stubs/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/expo-stubs/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/android/expo-stubs/gradlew +251 -0
- package/android/expo-stubs/gradlew.bat +94 -0
- package/android/expo-stubs/settings.gradle +1 -0
- package/android/expo-stubs/src/main/java/expo/modules/core/interfaces/Package.java +11 -0
- package/android/expo-stubs/src/main/java/expo/modules/core/interfaces/ReactNativeHostHandler.java +7 -0
- package/android/libs/expo-stubs.jar +0 -0
- package/android/libs/replay-stubs.jar +0 -0
- package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +15 -11
- package/android/src/main/java/io/sentry/react/RNSentryVersion.java +1 -1
- package/dist/js/NativeLogListener.js.map +1 -1
- package/dist/js/RNSentryReplayMaskNativeComponent.d.ts.map +1 -1
- package/dist/js/RNSentryReplayUnmaskNativeComponent.d.ts.map +1 -1
- package/dist/js/breadcrumb.js.map +1 -1
- package/dist/js/client.js.map +1 -1
- package/dist/js/feedback/FeedbackButton.js.map +1 -1
- package/dist/js/feedback/FeedbackWidget.js +6 -6
- package/dist/js/feedback/FeedbackWidget.js.map +1 -1
- package/dist/js/feedback/FeedbackWidget.styles.d.ts.map +1 -1
- package/dist/js/feedback/FeedbackWidgetManager.js.map +1 -1
- package/dist/js/feedback/FeedbackWidgetProvider.js.map +1 -1
- package/dist/js/feedback/ScreenshotButton.d.ts +1 -1
- package/dist/js/feedback/ScreenshotButton.js.map +1 -1
- package/dist/js/feedback/ShakeToReportBug.js.map +1 -1
- package/dist/js/feedback/defaults.js.map +1 -1
- package/dist/js/feedback/integration.d.ts +2 -2
- package/dist/js/feedback/integration.d.ts.map +1 -1
- package/dist/js/feedback/integration.js.map +1 -1
- package/dist/js/feedback/lazy.js.map +1 -1
- package/dist/js/feedback/utils.d.ts.map +1 -1
- package/dist/js/feedback/utils.js.map +1 -1
- package/dist/js/integrations/appRegistry.d.ts.map +1 -1
- package/dist/js/integrations/appRegistry.js.map +1 -1
- package/dist/js/integrations/breadcrumbs.d.ts.map +1 -1
- package/dist/js/integrations/debugsymbolicator.js +3 -3
- package/dist/js/integrations/debugsymbolicator.js.map +1 -1
- package/dist/js/integrations/debugsymbolicatorutils.js.map +1 -1
- package/dist/js/integrations/default.js +1 -1
- package/dist/js/integrations/default.js.map +1 -1
- package/dist/js/integrations/devicecontext.js +1 -1
- package/dist/js/integrations/devicecontext.js.map +1 -1
- package/dist/js/integrations/expoconstants.js.map +1 -1
- package/dist/js/integrations/expocontext.js.map +1 -1
- package/dist/js/integrations/expoupdateslistener.js.map +1 -1
- package/dist/js/integrations/logEnricherIntegration.js +1 -1
- package/dist/js/integrations/logEnricherIntegration.js.map +1 -1
- package/dist/js/integrations/modulesloader.js.map +1 -1
- package/dist/js/integrations/nativelinkederrors.d.ts.map +1 -1
- package/dist/js/integrations/nativelinkederrors.js +1 -0
- package/dist/js/integrations/nativelinkederrors.js.map +1 -1
- package/dist/js/integrations/primitiveTagIntegration.js.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.d.ts.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlersutils.js.map +1 -1
- package/dist/js/integrations/reactnativeinfo.js.map +1 -1
- package/dist/js/integrations/release.js +1 -1
- package/dist/js/integrations/release.js.map +1 -1
- package/dist/js/integrations/rewriteframes.js.map +1 -1
- package/dist/js/integrations/screenshot.js +1 -1
- package/dist/js/integrations/screenshot.js.map +1 -1
- package/dist/js/integrations/sdkinfo.js.map +1 -1
- package/dist/js/integrations/spotlight.js.map +1 -1
- package/dist/js/integrations/viewhierarchy.js +1 -1
- package/dist/js/integrations/viewhierarchy.js.map +1 -1
- package/dist/js/misc.js.map +1 -1
- package/dist/js/options.d.ts +1 -1
- package/dist/js/options.js.map +1 -1
- package/dist/js/playground/examples.js.map +1 -1
- package/dist/js/playground/modal.d.ts +2 -2
- package/dist/js/playground/modal.d.ts.map +1 -1
- package/dist/js/playground/modal.js +6 -6
- package/dist/js/playground/modal.js.map +1 -1
- package/dist/js/profiling/cache.js.map +1 -1
- package/dist/js/profiling/convertHermesProfile.js.map +1 -1
- package/dist/js/profiling/debugid.js.map +1 -1
- package/dist/js/profiling/integration.d.ts.map +1 -1
- package/dist/js/profiling/integration.js.map +1 -1
- package/dist/js/profiling/utils.js.map +1 -1
- package/dist/js/replay/CustomMask.d.ts.map +1 -1
- package/dist/js/replay/CustomMask.js.map +1 -1
- package/dist/js/replay/CustomMask.web.d.ts.map +1 -1
- package/dist/js/replay/browserReplay.d.ts.map +1 -1
- package/dist/js/replay/browserReplay.js.map +1 -1
- package/dist/js/replay/mobilereplay.d.ts.map +1 -1
- package/dist/js/replay/mobilereplay.js +21 -2
- package/dist/js/replay/mobilereplay.js.map +1 -1
- package/dist/js/replay/networkUtils.d.ts +0 -1
- package/dist/js/replay/networkUtils.d.ts.map +1 -1
- package/dist/js/replay/networkUtils.js.map +1 -1
- package/dist/js/replay/xhrUtils.js.map +1 -1
- package/dist/js/scopeSync.js.map +1 -1
- package/dist/js/sdk.d.ts.map +1 -1
- package/dist/js/sdk.js +4 -2
- package/dist/js/sdk.js.map +1 -1
- package/dist/js/tools/ModulesCollector.js.map +1 -1
- package/dist/js/tools/easBuildHooks.js +13 -14
- package/dist/js/tools/easBuildHooks.js.map +1 -1
- package/dist/js/tools/enableLogger.js +1 -2
- package/dist/js/tools/enableLogger.js.map +1 -1
- package/dist/js/tools/metroMiddleware.d.ts.map +1 -1
- package/dist/js/tools/metroMiddleware.js.map +1 -1
- package/dist/js/tools/metroconfig.js +6 -7
- package/dist/js/tools/metroconfig.js.map +1 -1
- package/dist/js/tools/sentryBabelTransformerUtils.js +7 -7
- package/dist/js/tools/sentryBabelTransformerUtils.js.map +1 -1
- package/dist/js/tools/sentryMetroSerializer.d.ts.map +1 -1
- package/dist/js/tools/sentryMetroSerializer.js +2 -2
- package/dist/js/tools/sentryMetroSerializer.js.map +1 -1
- package/dist/js/tools/sentryOptionsSerializer.js +1 -2
- package/dist/js/tools/sentryOptionsSerializer.js.map +1 -1
- package/dist/js/tools/sentryReleaseInjector.d.ts +1 -1
- package/dist/js/tools/sentryReleaseInjector.d.ts.map +1 -1
- package/dist/js/tools/sentryReleaseInjector.js.map +1 -1
- package/dist/js/tools/utils.d.ts.map +1 -1
- package/dist/js/tools/utils.js +7 -7
- package/dist/js/tools/utils.js.map +1 -1
- package/dist/js/tools/vendor/metro/countLines.d.ts.map +1 -1
- package/dist/js/tools/vendor/metro/utils.d.ts.map +1 -1
- 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 +2 -0
- package/dist/js/touchevents.js.map +1 -1
- package/dist/js/tracing/expoAsset.js.map +1 -1
- package/dist/js/tracing/expoImage.js.map +1 -1
- package/dist/js/tracing/expoRouter.js.map +1 -1
- package/dist/js/tracing/gesturetracing.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 +5 -5
- package/dist/js/tracing/integrations/appStart.js.map +1 -1
- package/dist/js/tracing/integrations/nativeFrames.d.ts.map +1 -1
- package/dist/js/tracing/integrations/nativeFrames.js +4 -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/stalltracking.js +4 -1
- package/dist/js/tracing/integrations/stalltracking.js.map +1 -1
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js +14 -14
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js.map +1 -1
- package/dist/js/tracing/integrations/userInteraction.d.ts.map +1 -1
- package/dist/js/tracing/integrations/userInteraction.js.map +1 -1
- package/dist/js/tracing/onSpanEndUtils.d.ts.map +1 -1
- package/dist/js/tracing/onSpanEndUtils.js +20 -13
- package/dist/js/tracing/onSpanEndUtils.js.map +1 -1
- package/dist/js/tracing/reactnativenavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnativenavigation.js.map +1 -1
- package/dist/js/tracing/reactnativeprofiler.js.map +1 -1
- package/dist/js/tracing/reactnativetracing.d.ts.map +1 -1
- package/dist/js/tracing/reactnativetracing.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts +3 -0
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +4 -2
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/tracing/span.d.ts +2 -17
- package/dist/js/tracing/span.d.ts.map +1 -1
- package/dist/js/tracing/span.js.map +1 -1
- package/dist/js/tracing/timeToDisplayFallback.d.ts.map +1 -1
- package/dist/js/tracing/timetodisplay.js.map +1 -1
- package/dist/js/tracing/timetodisplaynative.d.ts.map +1 -1
- package/dist/js/tracing/timetodisplaynative.js.map +1 -1
- package/dist/js/tracing/utils.js.map +1 -1
- package/dist/js/transports/encodePolyfill.d.ts +1 -1
- package/dist/js/transports/encodePolyfill.d.ts.map +1 -1
- package/dist/js/transports/encodePolyfill.js.map +1 -1
- package/dist/js/transports/native.js.map +1 -1
- package/dist/js/utils/AsyncExpiringMap.js.map +1 -1
- package/dist/js/utils/encode.js.map +1 -1
- package/dist/js/utils/environment.js.map +1 -1
- package/dist/js/utils/ignorerequirecyclelogs.js.map +1 -1
- package/dist/js/utils/normalize.js.map +1 -1
- package/dist/js/utils/outcome.js.map +1 -1
- package/dist/js/utils/primitiveConverter.js.map +1 -1
- package/dist/js/utils/release.js.map +1 -1
- package/dist/js/utils/rnlibraries.js.map +1 -1
- package/dist/js/utils/safe.js.map +1 -1
- package/dist/js/utils/worldwide.d.ts +0 -1
- package/dist/js/utils/worldwide.d.ts.map +1 -1
- package/dist/js/utils/xhr.d.ts +0 -1
- package/dist/js/utils/xhr.d.ts.map +1 -1
- package/dist/js/utils/xhr.js.map +1 -1
- package/dist/js/vendor/base64-js/fromByteArray.js.map +1 -1
- package/dist/js/vendor/buffer/utf8ToBytes.js.map +1 -1
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/dist/js/wrapper.d.ts.map +1 -1
- package/dist/js/wrapper.js +5 -6
- package/dist/js/wrapper.js.map +1 -1
- package/expo-module.config.json +7 -0
- package/ios/RNSentryStart.m +4 -1
- package/ios/RNSentryVersion.m +1 -1
- package/package.json +10 -10
- package/ts3.8/dist/js/feedback/ScreenshotButton.d.ts +1 -1
- package/ts3.8/dist/js/feedback/integration.d.ts +2 -2
- package/ts3.8/dist/js/options.d.ts +1 -1
- package/ts3.8/dist/js/playground/modal.d.ts +2 -2
- package/ts3.8/dist/js/replay/networkUtils.d.ts +0 -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/reactnavigation.d.ts +3 -0
- package/ts3.8/dist/js/tracing/span.d.ts +2 -17
- package/ts3.8/dist/js/transports/encodePolyfill.d.ts +1 -1
- package/ts3.8/dist/js/utils/worldwide.d.ts +0 -1
- package/ts3.8/dist/js/utils/xhr.d.ts +0 -1
- package/ts3.8/dist/js/version.d.ts +1 -1
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 {\n _INTERNAL_flushLogsBuffer,\n addAutoIpAddressToSession,\n Client,\n dateTimestampInSeconds,\n debug,\n SentryError,\n} from '@sentry/core';\nimport { Alert } from 'react-native';\nimport { getDevServer } from './integrations/debugsymbolicatorutils';\nimport { defaultSdkInfo } from './integrations/sdkinfo';\nimport { getDefaultSidecarUrl } from './integrations/spotlight';\nimport { defaultNativeLogHandler, setupNativeLogListener } from './NativeLogListener';\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\nconst DEFAULT_FLUSH_INTERVAL = 5000;\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 Client<ReactNativeClientOptions> {\n private _outcomesBuffer: Outcome[];\n private _logFlushIdleTimeout: ReturnType<typeof setTimeout> | undefined;\n private _removeNativeLogListener: (() => void) | undefined;\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 = {\n ...options._metadata,\n sdk: {\n ...(options._metadata?.sdk || defaultSdkInfo),\n settings: {\n // Only allow IP inferral by Relay if sendDefaultPii is true\n infer_ip: options.sendDefaultPii ? 'auto' : 'never',\n ...options._metadata?.sdk?.settings,\n },\n },\n };\n\n // We default this to true, as it is the safer scenario\n options.parentSpanIsAlwaysRootSpan =\n options.parentSpanIsAlwaysRootSpan === undefined ? true : options.parentSpanIsAlwaysRootSpan;\n\n // enableLogs must be disabled before calling super() to avoid logs being captured.\n // This makes a copy of the user defined value, so we can restore it later for the native usaege.\n const originalEnableLogs = options.enableLogs;\n if (options.enableLogs && options.logsOrigin === 'native') {\n debug.log('disabling Sentry logs on JavaScript due to rule set by logsOrigin');\n options.enableLogs = false;\n }\n\n super(options);\n\n this._outcomesBuffer = [];\n\n if (options.sendDefaultPii === true) {\n this.on('beforeSendSession', addAutoIpAddressToSession);\n }\n\n if (options.enableLogs) {\n this.on('flush', () => {\n _INTERNAL_flushLogsBuffer(this);\n });\n\n this.on('afterCaptureLog', () => {\n if (this._logFlushIdleTimeout) {\n clearTimeout(this._logFlushIdleTimeout);\n }\n\n this._logFlushIdleTimeout = setTimeout(() => {\n _INTERNAL_flushLogsBuffer(this);\n }, DEFAULT_FLUSH_INTERVAL);\n });\n }\n\n // Restore original settings for enabling Native options.\n options.enableLogs = originalEnableLogs;\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 // Clean up native log listener\n if (this._removeNativeLogListener) {\n this._removeNativeLogListener();\n this._removeNativeLogListener = undefined;\n }\n\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);\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 debug.error('SentryError while sending event, keeping outcomes buffer:', reason);\n } else {\n debug.error('Error while sending event:', reason);\n }\n });\n } else {\n debug.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 // Set up native log listener if debug is enabled\n if (this._options.debug) {\n const logHandler = this._options.onNativeLog ?? defaultNativeLogHandler;\n this._removeNativeLogListener = setupNativeLogListener(logHandler);\n }\n\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 profilingOptions:\n this._options._experiments?.profilingOptions ?? this._options._experiments?.androidProfilingOptions,\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 debug.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 _INTERNAL_flushLogsBuffer,\n addAutoIpAddressToSession,\n Client,\n dateTimestampInSeconds,\n debug,\n SentryError,\n} from '@sentry/core';\nimport { Alert } from 'react-native';\nimport { getDevServer } from './integrations/debugsymbolicatorutils';\nimport { defaultSdkInfo } from './integrations/sdkinfo';\nimport { getDefaultSidecarUrl } from './integrations/spotlight';\nimport { defaultNativeLogHandler, setupNativeLogListener } from './NativeLogListener';\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\nconst DEFAULT_FLUSH_INTERVAL = 5000;\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 Client<ReactNativeClientOptions> {\n private _outcomesBuffer: Outcome[];\n private _logFlushIdleTimeout: ReturnType<typeof setTimeout> | undefined;\n private _removeNativeLogListener: (() => void) | undefined;\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 = {\n ...options._metadata,\n sdk: {\n ...(options._metadata?.sdk || defaultSdkInfo),\n settings: {\n // Only allow IP inferral by Relay if sendDefaultPii is true\n infer_ip: options.sendDefaultPii ? 'auto' : 'never',\n ...options._metadata?.sdk?.settings,\n },\n },\n };\n\n // We default this to true, as it is the safer scenario\n options.parentSpanIsAlwaysRootSpan =\n options.parentSpanIsAlwaysRootSpan === undefined ? true : options.parentSpanIsAlwaysRootSpan;\n\n // enableLogs must be disabled before calling super() to avoid logs being captured.\n // This makes a copy of the user defined value, so we can restore it later for the native usaege.\n const originalEnableLogs = options.enableLogs;\n if (options.enableLogs && options.logsOrigin === 'native') {\n debug.log('disabling Sentry logs on JavaScript due to rule set by logsOrigin');\n options.enableLogs = false;\n }\n\n super(options);\n\n this._outcomesBuffer = [];\n\n if (options.sendDefaultPii === true) {\n this.on('beforeSendSession', addAutoIpAddressToSession);\n }\n\n if (options.enableLogs) {\n this.on('flush', () => {\n _INTERNAL_flushLogsBuffer(this);\n });\n\n this.on('afterCaptureLog', () => {\n if (this._logFlushIdleTimeout) {\n clearTimeout(this._logFlushIdleTimeout);\n }\n\n this._logFlushIdleTimeout = setTimeout(() => {\n _INTERNAL_flushLogsBuffer(this);\n }, DEFAULT_FLUSH_INTERVAL);\n });\n }\n\n // Restore original settings for enabling Native options.\n options.enableLogs = originalEnableLogs;\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 // Clean up native log listener\n if (this._removeNativeLogListener) {\n this._removeNativeLogListener();\n this._removeNativeLogListener = undefined;\n }\n\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);\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 debug.error('SentryError while sending event, keeping outcomes buffer:', reason);\n } else {\n debug.error('Error while sending event:', reason);\n }\n });\n } else {\n debug.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 // Set up native log listener if debug is enabled\n if (this._options.debug) {\n const logHandler = this._options.onNativeLog ?? defaultNativeLogHandler;\n this._removeNativeLogListener = setupNativeLogListener(logHandler);\n }\n\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 profilingOptions:\n this._options._experiments?.profilingOptions ?? this._options._experiments?.androidProfilingOptions,\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 debug.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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,QAAQ,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK,CAAC,SAA8B;IAGtE,YAAmB,KAA0B;QAC3C,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,2BAA2B,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,oBAAoB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE;
|
|
1
|
+
{"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,QAAQ,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK,CAAC,SAA8B;IAGtE,YAAmB,KAA0B;QAC3C,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,2BAA2B,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,oBAAoB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACI,MAAM;;QACX,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,mCAAyC,0BAA0B,GAAK,IAAI,CAAC,KAAK,CAAE,CAAC;QAC/F,MAAM,MAAM,GAAyB;YACnC,aAAa,kCAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,aAAa,GAAK,MAAA,IAAI,CAAC,KAAK,CAAC,MAAM,0CAAE,aAAa,CAAE;YACnG,WAAW,kCAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,WAAW,GAAK,MAAA,IAAI,CAAC,KAAK,CAAC,MAAM,0CAAE,WAAW,CAAE;YAC7F,WAAW,kCAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,WAAW,GAAK,MAAA,IAAI,CAAC,KAAK,CAAC,MAAM,0CAAE,WAAW,CAAE;SAC9F,CAAC;QAEF,OAAO,CACL,oBAAC,gBAAgB,IACf,KAAK,EAAE,MAAM,CAAC,aAAa,EAC3B,OAAO,EAAE,kBAAkB,EAC3B,kBAAkB,EAAE,IAAI,CAAC,gBAAgB;YAEzC,oBAAC,KAAK,IAAC,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,GAAI;YACnE,oBAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAC,wBAAwB,IAC7D,IAAI,CAAC,YAAY,CACb,CACU,CACpB,CAAC;IACJ,CAAC;CACF","sourcesContent":["import * as React from 'react';\nimport type { NativeEventSubscription} from 'react-native';\nimport { Appearance, Image, Text, TouchableOpacity } from 'react-native';\nimport { defaultButtonConfiguration } from './defaults';\nimport { defaultButtonStyles } from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackButtonProps, FeedbackButtonStyles, FeedbackButtonTextConfiguration } from './FeedbackWidget.types';\nimport { showFeedbackWidget } from './FeedbackWidgetManager';\nimport { feedbackIcon } from './icons';\nimport { lazyLoadFeedbackIntegration } from './lazy';\n\n/**\n * @beta\n * Implements a feedback button that opens the FeedbackForm.\n */\nexport class FeedbackButton extends React.Component<FeedbackButtonProps> {\n private _themeListener: NativeEventSubscription | undefined;\n\n public constructor(props: FeedbackButtonProps) {\n super(props);\n lazyLoadFeedbackIntegration();\n }\n\n /**\n * Adds a listener for theme changes.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n }\n\n /**\n * Removes the theme listener.\n */\n public componentWillUnmount(): void {\n if (this._themeListener) {\n this._themeListener.remove();\n }\n }\n\n /**\n * Renders the feedback button.\n */\n public render(): React.ReactNode {\n const theme = getTheme();\n const text: FeedbackButtonTextConfiguration = { ...defaultButtonConfiguration, ...this.props };\n const styles: FeedbackButtonStyles = {\n triggerButton: { ...defaultButtonStyles(theme).triggerButton, ...this.props.styles?.triggerButton },\n triggerText: { ...defaultButtonStyles(theme).triggerText, ...this.props.styles?.triggerText },\n triggerIcon: { ...defaultButtonStyles(theme).triggerIcon, ...this.props.styles?.triggerIcon },\n };\n\n return (\n <TouchableOpacity\n style={styles.triggerButton}\n onPress={showFeedbackWidget}\n accessibilityLabel={text.triggerAriaLabel}\n >\n <Image source={{ uri: feedbackIcon }} style={styles.triggerIcon} />\n <Text style={styles.triggerText} testID=\"sentry-feedback-button\">\n {text.triggerLabel}\n </Text>\n </TouchableOpacity>\n );\n }\n}\n"]}
|
|
@@ -86,7 +86,7 @@ export class FeedbackWidget extends React.Component {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
this.onScreenshotButtonPress = () => __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
var
|
|
89
|
+
var _a, _b, _c, _d, _e;
|
|
90
90
|
if (!this._hasScreenshot()) {
|
|
91
91
|
const { imagePicker } = this.props;
|
|
92
92
|
if (imagePicker) {
|
|
@@ -107,9 +107,9 @@ export class FeedbackWidget extends React.Component {
|
|
|
107
107
|
const result = yield launchImageLibrary();
|
|
108
108
|
if ((result === null || result === void 0 ? void 0 : result.assets) && result.assets.length > 0) {
|
|
109
109
|
if (isWeb()) {
|
|
110
|
-
const filename = (
|
|
111
|
-
const imageUri = (
|
|
112
|
-
const base64 = (
|
|
110
|
+
const filename = (_a = result.assets[0]) === null || _a === void 0 ? void 0 : _a.fileName;
|
|
111
|
+
const imageUri = (_b = result.assets[0]) === null || _b === void 0 ? void 0 : _b.uri;
|
|
112
|
+
const base64 = (_c = result.assets[0]) === null || _c === void 0 ? void 0 : _c.base64;
|
|
113
113
|
const data = base64 ? base64ToUint8Array(base64) : undefined;
|
|
114
114
|
if (data) {
|
|
115
115
|
this.setState({ filename, attachment: data, attachmentUri: imageUri });
|
|
@@ -119,8 +119,8 @@ export class FeedbackWidget extends React.Component {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
else {
|
|
122
|
-
const filename = (
|
|
123
|
-
const imageUri = (
|
|
122
|
+
const filename = (_d = result.assets[0]) === null || _d === void 0 ? void 0 : _d.fileName;
|
|
123
|
+
const imageUri = (_e = result.assets[0]) === null || _e === void 0 ? void 0 : _e.uri;
|
|
124
124
|
imageUri &&
|
|
125
125
|
getDataFromUri(imageUri)
|
|
126
126
|
.then((data) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidget.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport type { SendFeedbackParams, User } from '@sentry/core';\nimport { captureFeedback, debug, getCurrentScope, getGlobalScope, getIsolationScope, lastEventId } from '@sentry/core';\nimport * as React from 'react';\nimport type { KeyboardTypeOptions ,\n NativeEventSubscription} from 'react-native';\nimport {\n Appearance,\n Image,\n Keyboard,\n Text,\n TextInput,\n TouchableOpacity,\n TouchableWithoutFeedback,\n View\n} from 'react-native';\nimport { isExpoGo, isWeb, notWeb } from '../utils/environment';\nimport type { Screenshot } from '../wrapper';\nimport { getDataFromUri, NATIVE } from '../wrapper';\nimport { sentryLogo } from './branding';\nimport { defaultConfiguration } from './defaults';\nimport defaultStyles from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackGeneralConfiguration, FeedbackTextConfiguration, FeedbackWidgetProps, FeedbackWidgetState, FeedbackWidgetStyles, ImagePickerConfiguration } from './FeedbackWidget.types';\nimport { hideFeedbackButton, showScreenshotButton } from './FeedbackWidgetManager';\nimport { lazyLoadFeedbackIntegration } from './lazy';\nimport { getCapturedScreenshot } from './ScreenshotButton';\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 _themeListener: NativeEventSubscription | undefined;\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 || this._getUser()?.email || '',\n name: this.props?.useSentryUser?.name || this._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 /**\n * For testing purposes only.\n */\n public static reset(): void {\n FeedbackWidget._savedState = {\n name: '',\n email: '',\n description: '',\n filename: undefined,\n attachment: undefined,\n attachmentUri: undefined,\n };\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 (\n (this.props.isNameRequired && !trimmedName) ||\n (this.props.isEmailRequired && !trimmedEmail) ||\n !trimmedDescription\n ) {\n feedbackAlertDialog(text.errorTitle, text.formError);\n return;\n }\n\n if (\n this.props.shouldValidateEmail &&\n (this.props.isEmailRequired || trimmedEmail.length > 0) &&\n !isValidEmail(trimmedEmail)\n ) {\n feedbackAlertDialog(text.errorTitle, text.emailError);\n return;\n }\n\n const attachments =\n 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({\n name: trimmedName,\n email: trimmedEmail,\n message: trimmedDescription,\n attachments: attachments,\n });\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 debug.error(`Feedback form submission failed: ${error}`);\n }\n };\n\n public onScreenshotButtonPress: () => void = async () => {\n if (!this._hasScreenshot()) {\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 debug.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 debug.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 &&\n getDataFromUri(imageUri)\n .then((data) => {\n if (data != null) {\n this.setState({ filename, attachment: data, attachmentUri: imageUri });\n } else {\n this._showImageRetrievalDevelopmentNote();\n debug.error('Failed to read image data from uri:', imageUri);\n }\n })\n .catch((error) => {\n this._showImageRetrievalDevelopmentNote();\n debug.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 this._showImageRetrievalDevelopmentNote();\n debug.error('Failed to read image data from uri:', uri);\n }\n }).catch((error) => {\n this._showImageRetrievalDevelopmentNote();\n debug.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 * Add a listener to the theme change event.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n }\n\n /**\n * Save the state before unmounting the component and remove the theme listener.\n */\n public componentWillUnmount(): void {\n if (this._didSubmitForm) {\n this._clearFormState();\n this._didSubmitForm = false;\n } else {\n this._saveFormState();\n }\n if (this._themeListener) {\n this._themeListener.remove();\n }\n }\n\n /**\n * Renders the feedback form screen.\n */\n public render(): React.ReactNode {\n const theme = getTheme();\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 _defaultStyles = defaultStyles(theme);\n const _propStyles = this.props.styles || {};\n const autoCorrect = config.autoCorrect !== false;\n const spellCheck = config.spellCheck !== false;\n const styles = (Object.keys(_defaultStyles) as Array<keyof FeedbackWidgetStyles>).reduce<FeedbackWidgetStyles>(\n (merged, key) => {\n (merged as Record<string, unknown>)[key] = { ...(_defaultStyles[key] as object), ...(_propStyles[key] as object) };\n return merged;\n },\n {},\n );\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 const screenshot = getCapturedScreenshot();\n if (screenshot === 'ErrorCapturingScreenshot') {\n setTimeout(async () => {\n feedbackAlertDialog(text.errorTitle, text.captureScreenshotError);\n }, 100);\n } else if (screenshot) {\n this._setCapturedScreenshot(screenshot);\n }\n\n return (\n <TouchableWithoutFeedback\n onPress={notWeb() ? Keyboard.dismiss : undefined}\n accessible={false}\n accessibilityElementsHidden={false}\n >\n <View style={styles.container}>\n <View style={styles.titleContainer}>\n <Text style={styles.title} testID=\"sentry-feedback-form-title\">\n {text.formTitle}\n </Text>\n {config.showBranding && (\n <Image source={{ uri: sentryLogo }} style={styles.sentryLogo} testID=\"sentry-logo\" />\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 testID=\"sentry-feedback-name-input\"\n placeholder={text.namePlaceholder}\n value={name}\n onChangeText={value => this.setState({ name: value })}\n autoCorrect={false}\n spellCheck={false}\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 testID=\"sentry-feedback-email-input\"\n placeholder={text.emailPlaceholder}\n keyboardType={'email-address' as KeyboardTypeOptions}\n autoCapitalize=\"none\"\n autoCorrect={false}\n spellCheck={false}\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 testID=\"sentry-feedback-message-input\"\n placeholder={text.messagePlaceholder}\n value={description}\n onChangeText={value => this.setState({ description: value })}\n multiline\n autoCorrect={autoCorrect}\n spellCheck={spellCheck}\n />\n {(config.enableScreenshot || imagePickerConfiguration.imagePicker || this._hasScreenshot()) && (\n <View style={styles.screenshotContainer}>\n {this.state.attachmentUri && (\n <Image source={{ uri: this.state.attachmentUri }} style={styles.screenshotThumbnail} />\n )}\n <TouchableOpacity style={styles.screenshotButton} onPress={this.onScreenshotButtonPress}>\n <Text style={styles.screenshotText}>\n {!this._hasScreenshot() ? text.addScreenshotButtonLabel : text.removeScreenshotButtonLabel}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n {notWeb() && config.enableTakeScreenshot && !this.state.attachmentUri && (\n <TouchableOpacity style={styles.takeScreenshotButton} onPress={() => {\n hideFeedbackButton();\n onCancel();\n showScreenshotButton();\n }}>\n <Text style={styles.takeScreenshotText} testID='sentry-feedback-take-screenshot-button'>{text.captureScreenshotButtonLabel}</Text>\n </TouchableOpacity>\n )}\n <TouchableOpacity style={styles.submitButton} onPress={this.handleFeedbackSubmit}>\n <Text style={styles.submitText} testID=\"sentry-feedback-submit-button\">\n {text.submitButtonLabel}\n </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 _setCapturedScreenshot = (screenshot: Screenshot): void => {\n if (screenshot.data != null) {\n debug.log('Setting captured screenshot:', screenshot.filename);\n NATIVE.encodeToBase64(screenshot.data)\n .then(base64String => {\n if (base64String != null) {\n const dataUri = `data:${screenshot.contentType};base64,${base64String}`;\n this.setState({ filename: screenshot.filename, attachment: screenshot.data, attachmentUri: dataUri });\n } else {\n debug.error('Failed to read image data from:', screenshot.filename);\n }\n })\n .catch(error => {\n debug.error('Failed to read image data from:', screenshot.filename, 'error: ', error);\n });\n } else {\n debug.error('Failed to read image data from:', screenshot.filename);\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 private _hasScreenshot = (): boolean => {\n return this.state.filename !== undefined && this.state.attachment !== undefined && this.state.attachmentUri !== undefined;\n }\n\n private _getUser = (): User | undefined => {\n const currentUser = getCurrentScope().getUser();\n if (currentUser) {\n return currentUser;\n }\n const isolationUser = getIsolationScope().getUser();\n if (isolationUser) {\n return isolationUser;\n }\n return getGlobalScope().getUser();\n }\n\n private _showImageRetrievalDevelopmentNote = (): void => {\n if (isExpoGo()) {\n feedbackAlertDialog(\n 'Development note',\n 'The feedback widget cannot retrieve image data in Expo Go. Please build your app to test this functionality.',\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FeedbackWidget.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport type { SendFeedbackParams, User } from '@sentry/core';\nimport { captureFeedback, debug, getCurrentScope, getGlobalScope, getIsolationScope, lastEventId } from '@sentry/core';\nimport * as React from 'react';\nimport type { KeyboardTypeOptions ,\n NativeEventSubscription} from 'react-native';\nimport {\n Appearance,\n Image,\n Keyboard,\n Text,\n TextInput,\n TouchableOpacity,\n TouchableWithoutFeedback,\n View\n} from 'react-native';\nimport { isExpoGo, isWeb, notWeb } from '../utils/environment';\nimport type { Screenshot } from '../wrapper';\nimport { getDataFromUri, NATIVE } from '../wrapper';\nimport { sentryLogo } from './branding';\nimport { defaultConfiguration } from './defaults';\nimport defaultStyles from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackGeneralConfiguration, FeedbackTextConfiguration, FeedbackWidgetProps, FeedbackWidgetState, FeedbackWidgetStyles, ImagePickerConfiguration } from './FeedbackWidget.types';\nimport { hideFeedbackButton, showScreenshotButton } from './FeedbackWidgetManager';\nimport { lazyLoadFeedbackIntegration } from './lazy';\nimport { getCapturedScreenshot } from './ScreenshotButton';\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 _themeListener: NativeEventSubscription | undefined;\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 || this._getUser()?.email || '',\n name: this.props?.useSentryUser?.name || this._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 /**\n * For testing purposes only.\n */\n public static reset(): void {\n FeedbackWidget._savedState = {\n name: '',\n email: '',\n description: '',\n filename: undefined,\n attachment: undefined,\n attachmentUri: undefined,\n };\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 (\n (this.props.isNameRequired && !trimmedName) ||\n (this.props.isEmailRequired && !trimmedEmail) ||\n !trimmedDescription\n ) {\n feedbackAlertDialog(text.errorTitle, text.formError);\n return;\n }\n\n if (\n this.props.shouldValidateEmail &&\n (this.props.isEmailRequired || trimmedEmail.length > 0) &&\n !isValidEmail(trimmedEmail)\n ) {\n feedbackAlertDialog(text.errorTitle, text.emailError);\n return;\n }\n\n const attachments =\n 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({\n name: trimmedName,\n email: trimmedEmail,\n message: trimmedDescription,\n attachments: attachments,\n });\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 debug.error(`Feedback form submission failed: ${error}`);\n }\n };\n\n public onScreenshotButtonPress: () => void = async () => {\n if (!this._hasScreenshot()) {\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 debug.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 debug.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 &&\n getDataFromUri(imageUri)\n .then((data) => {\n if (data != null) {\n this.setState({ filename, attachment: data, attachmentUri: imageUri });\n } else {\n this._showImageRetrievalDevelopmentNote();\n debug.error('Failed to read image data from uri:', imageUri);\n }\n })\n .catch((error) => {\n this._showImageRetrievalDevelopmentNote();\n debug.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 this._showImageRetrievalDevelopmentNote();\n debug.error('Failed to read image data from uri:', uri);\n }\n }).catch((error) => {\n this._showImageRetrievalDevelopmentNote();\n debug.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 * Add a listener to the theme change event.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n }\n\n /**\n * Save the state before unmounting the component and remove the theme listener.\n */\n public componentWillUnmount(): void {\n if (this._didSubmitForm) {\n this._clearFormState();\n this._didSubmitForm = false;\n } else {\n this._saveFormState();\n }\n if (this._themeListener) {\n this._themeListener.remove();\n }\n }\n\n /**\n * Renders the feedback form screen.\n */\n public render(): React.ReactNode {\n const theme = getTheme();\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 _defaultStyles = defaultStyles(theme);\n const _propStyles = this.props.styles || {};\n const autoCorrect = config.autoCorrect !== false;\n const spellCheck = config.spellCheck !== false;\n const styles = (Object.keys(_defaultStyles) as Array<keyof FeedbackWidgetStyles>).reduce<FeedbackWidgetStyles>(\n (merged, key) => {\n (merged as Record<string, unknown>)[key] = { ...(_defaultStyles[key] as object), ...(_propStyles[key] as object) };\n return merged;\n },\n {},\n );\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 const screenshot = getCapturedScreenshot();\n if (screenshot === 'ErrorCapturingScreenshot') {\n setTimeout(async () => {\n feedbackAlertDialog(text.errorTitle, text.captureScreenshotError);\n }, 100);\n } else if (screenshot) {\n this._setCapturedScreenshot(screenshot);\n }\n\n return (\n <TouchableWithoutFeedback\n onPress={notWeb() ? Keyboard.dismiss : undefined}\n accessible={false}\n accessibilityElementsHidden={false}\n >\n <View style={styles.container}>\n <View style={styles.titleContainer}>\n <Text style={styles.title} testID=\"sentry-feedback-form-title\">\n {text.formTitle}\n </Text>\n {config.showBranding && (\n <Image source={{ uri: sentryLogo }} style={styles.sentryLogo} testID=\"sentry-logo\" />\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 testID=\"sentry-feedback-name-input\"\n placeholder={text.namePlaceholder}\n value={name}\n onChangeText={value => this.setState({ name: value })}\n autoCorrect={false}\n spellCheck={false}\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 testID=\"sentry-feedback-email-input\"\n placeholder={text.emailPlaceholder}\n keyboardType={'email-address' as KeyboardTypeOptions}\n autoCapitalize=\"none\"\n autoCorrect={false}\n spellCheck={false}\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 testID=\"sentry-feedback-message-input\"\n placeholder={text.messagePlaceholder}\n value={description}\n onChangeText={value => this.setState({ description: value })}\n multiline\n autoCorrect={autoCorrect}\n spellCheck={spellCheck}\n />\n {(config.enableScreenshot || imagePickerConfiguration.imagePicker || this._hasScreenshot()) && (\n <View style={styles.screenshotContainer}>\n {this.state.attachmentUri && (\n <Image source={{ uri: this.state.attachmentUri }} style={styles.screenshotThumbnail} />\n )}\n <TouchableOpacity style={styles.screenshotButton} onPress={this.onScreenshotButtonPress}>\n <Text style={styles.screenshotText}>\n {!this._hasScreenshot() ? text.addScreenshotButtonLabel : text.removeScreenshotButtonLabel}\n </Text>\n </TouchableOpacity>\n </View>\n )}\n {notWeb() && config.enableTakeScreenshot && !this.state.attachmentUri && (\n <TouchableOpacity style={styles.takeScreenshotButton} onPress={() => {\n hideFeedbackButton();\n onCancel();\n showScreenshotButton();\n }}>\n <Text style={styles.takeScreenshotText} testID='sentry-feedback-take-screenshot-button'>{text.captureScreenshotButtonLabel}</Text>\n </TouchableOpacity>\n )}\n <TouchableOpacity style={styles.submitButton} onPress={this.handleFeedbackSubmit}>\n <Text style={styles.submitText} testID=\"sentry-feedback-submit-button\">\n {text.submitButtonLabel}\n </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 _setCapturedScreenshot = (screenshot: Screenshot): void => {\n if (screenshot.data != null) {\n debug.log('Setting captured screenshot:', screenshot.filename);\n NATIVE.encodeToBase64(screenshot.data)\n .then(base64String => {\n if (base64String != null) {\n const dataUri = `data:${screenshot.contentType};base64,${base64String}`;\n this.setState({ filename: screenshot.filename, attachment: screenshot.data, attachmentUri: dataUri });\n } else {\n debug.error('Failed to read image data from:', screenshot.filename);\n }\n })\n .catch(error => {\n debug.error('Failed to read image data from:', screenshot.filename, 'error: ', error);\n });\n } else {\n debug.error('Failed to read image data from:', screenshot.filename);\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 private _hasScreenshot = (): boolean => {\n return this.state.filename !== undefined && this.state.attachment !== undefined && this.state.attachmentUri !== undefined;\n }\n\n private _getUser = (): User | undefined => {\n const currentUser = getCurrentScope().getUser();\n if (currentUser) {\n return currentUser;\n }\n const isolationUser = getIsolationScope().getUser();\n if (isolationUser) {\n return isolationUser;\n }\n return getGlobalScope().getUser();\n }\n\n private _showImageRetrievalDevelopmentNote = (): void => {\n if (isExpoGo()) {\n feedbackAlertDialog(\n 'Development note',\n 'The feedback widget cannot retrieve image data in Expo Go. Please build your app to test this functionality.',\n );\n }\n }\n}\n"]}
|
|
@@ -1 +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;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,QAAA,MAAM,aAAa,
|
|
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;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,QAAA,MAAM,aAAa,GAAI,OAAO,mBAAmB,KAAG,oBA2GnD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,mBAAmB,KAAG,oBAgChE,CAAC;AAEF,eAAO,MAAM,6BAA6B,UAlCC,mBAAmB,KAAG,oBAkCD,CAAC;AAEjE,eAAO,MAAM,YAAY,EAAE,SAM1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,mBAAmB,KAAG,SAchE,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,SAEvB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidgetManager.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetManager.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,KAAK,EAAG,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,2CAA2C,EAAC,qCAAqC,EAAE,6CAA6C,EAAE,MAAM,QAAQ,CAAC;AAC1J,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAEjD,MAAM,mBAAmB,GAAG,GAAS,EAAE;IACrC,QAAQ;AACV,CAAC,CAAC;AAEF,MAAe,eAAe;IAIlB,MAAM,KAAK,sBAAsB;QACzC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,aAAyC;QAChE,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK;QACjB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,mBAAmB,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,cAAc,KAAK,mBAAmB,EAAE;
|
|
1
|
+
{"version":3,"file":"FeedbackWidgetManager.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetManager.tsx"],"names":[],"mappings":"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","sourcesContent":["import { debug } from '@sentry/core';\nimport { isWeb } from '../utils/environment';\nimport { lazyLoadAutoInjectFeedbackButtonIntegration,lazyLoadAutoInjectFeedbackIntegration, lazyLoadAutoInjectScreenshotButtonIntegration } from './lazy';\nimport { startShakeListener, stopShakeListener } from './ShakeToReportBug';\n\nexport const PULL_DOWN_CLOSE_THRESHOLD = 200;\nexport const SLIDE_ANIMATION_DURATION = 200;\nexport const BACKGROUND_ANIMATION_DURATION = 200;\n\nconst NOOP_SET_VISIBILITY = (): void => {\n // No-op\n};\n\nabstract class FeedbackManager {\n protected static _isVisible = false;\n protected static _setVisibility: (visible: boolean) => void;\n\n protected static get _feedbackComponentName(): string {\n throw new Error('Subclasses must override feedbackComponentName');\n }\n\n public static initialize(setVisibility: (visible: boolean) => void): void {\n this._setVisibility = setVisibility;\n }\n\n /**\n * For testing purposes only.\n */\n public static reset(): void {\n this._isVisible = false;\n this._setVisibility = NOOP_SET_VISIBILITY;\n }\n\n public static show(): void {\n if (this._setVisibility !== NOOP_SET_VISIBILITY) {\n this._isVisible = true;\n this._setVisibility(true);\n } else {\n // This message should be always shown otherwise it's not possible to use the widget.\n // eslint-disable-next-line no-console\n console.warn(`[Sentry] ${this._feedbackComponentName} requires 'Sentry.wrap(RootComponent)' to be called before 'show${this._feedbackComponentName}()'.`);\n }\n }\n\n public static hide(): void {\n if (this._setVisibility !== NOOP_SET_VISIBILITY) {\n this._isVisible = false;\n this._setVisibility(false);\n } else {\n // This message should be always shown otherwise it's not possible to use the widget.\n // eslint-disable-next-line no-console\n console.warn(`[Sentry] ${this._feedbackComponentName} requires 'Sentry.wrap(RootComponent)' before interacting with the widget.`);\n }\n }\n\n public static isFormVisible(): boolean {\n return this._isVisible;\n }\n}\n\n/**\n * Provides functionality to show and hide the feedback widget.\n */\nexport class FeedbackWidgetManager extends FeedbackManager {\n /**\n * Returns the name of the feedback component.\n */\n protected static get _feedbackComponentName(): string {\n return 'FeedbackWidget';\n }\n}\n\n/**\n * Provides functionality to show and hide the feedback button.\n */\nexport class FeedbackButtonManager extends FeedbackManager {\n /**\n * Returns the name of the feedback component.\n */\n protected static get _feedbackComponentName(): string {\n return 'FeedbackButton';\n }\n}\n\n/**\n * Provides functionality to show and hide the screenshot button.\n */\nexport class ScreenshotButtonManager extends FeedbackManager {\n /**\n * Returns the name of the feedback component.\n */\n protected static get _feedbackComponentName(): string {\n return 'ScreenshotButton';\n }\n}\n\nconst showFeedbackWidget = (): void => {\n lazyLoadAutoInjectFeedbackIntegration();\n FeedbackWidgetManager.show();\n};\n\nconst resetFeedbackWidgetManager = (): void => {\n FeedbackWidgetManager.reset();\n};\n\nconst showFeedbackButton = (): void => {\n lazyLoadAutoInjectFeedbackButtonIntegration();\n FeedbackButtonManager.show();\n};\n\nconst hideFeedbackButton = (): void => {\n FeedbackButtonManager.hide();\n};\n\nconst resetFeedbackButtonManager = (): void => {\n FeedbackButtonManager.reset();\n};\n\nconst showScreenshotButton = (): void => {\n if (isWeb()) {\n debug.warn('ScreenshotButton is not supported on Web.');\n return;\n }\n lazyLoadAutoInjectScreenshotButtonIntegration();\n ScreenshotButtonManager.show();\n};\n\nconst hideScreenshotButton = (): void => {\n ScreenshotButtonManager.hide();\n};\n\nconst resetScreenshotButtonManager = (): void => {\n ScreenshotButtonManager.reset();\n};\n\nlet _imperativeShakeListenerStarted = false;\n\nconst enableFeedbackOnShake = (): void => {\n lazyLoadAutoInjectFeedbackIntegration();\n if (!_imperativeShakeListenerStarted) {\n _imperativeShakeListenerStarted = startShakeListener(showFeedbackWidget);\n }\n};\n\nconst disableFeedbackOnShake = (): void => {\n if (_imperativeShakeListenerStarted) {\n stopShakeListener();\n _imperativeShakeListenerStarted = false;\n }\n};\n\nexport { showFeedbackButton, hideFeedbackButton, showFeedbackWidget, enableFeedbackOnShake, disableFeedbackOnShake, showScreenshotButton, hideScreenshotButton, resetFeedbackButtonManager, resetFeedbackWidgetManager, resetScreenshotButtonManager };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackWidgetProvider.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { debug } from '@sentry/core';\nimport * as React from 'react';\nimport { Animated, Appearance, Dimensions, Easing, Modal, type NativeEventSubscription, type NativeScrollEvent,type NativeSyntheticEvent, PanResponder, Platform, ScrollView, View } from 'react-native';\nimport { notWeb } from '../utils/environment';\nimport { FeedbackButton } from './FeedbackButton';\nimport { FeedbackWidget } from './FeedbackWidget';\nimport { modalSheetContainer,modalWrapper, topSpacer } from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackWidgetStyles } from './FeedbackWidget.types';\nimport {\n BACKGROUND_ANIMATION_DURATION,\n FeedbackButtonManager,\n FeedbackWidgetManager,\n PULL_DOWN_CLOSE_THRESHOLD,\n ScreenshotButtonManager,\n showFeedbackWidget,\n SLIDE_ANIMATION_DURATION,\n} from './FeedbackWidgetManager';\nimport { getFeedbackButtonOptions, getFeedbackOptions, getScreenshotButtonOptions, isShakeToReportEnabled } from './integration';\nimport { ScreenshotButton } from './ScreenshotButton';\nimport { startShakeListener, stopShakeListener } from './ShakeToReportBug';\nimport { isModalSupported, isNativeDriverSupportedForColorAnimations } from './utils';\n\nconst useNativeDriverForColorAnimations = isNativeDriverSupportedForColorAnimations();\n\nexport interface FeedbackWidgetProviderProps {\n children: React.ReactNode;\n styles?: FeedbackWidgetStyles;\n}\n\nexport interface FeedbackWidgetProviderState {\n isButtonVisible: boolean;\n isScreenshotButtonVisible: boolean;\n isVisible: boolean;\n backgroundOpacity: Animated.Value;\n panY: Animated.Value;\n isScrollAtTop: boolean;\n}\n\n/**\n * FeedbackWidgetProvider is a component that wraps the feedback widget and provides\n * functionality to show and hide the widget. It also manages the visibility of the\n * feedback button and screenshot button.\n */\nexport class FeedbackWidgetProvider extends React.Component<FeedbackWidgetProviderProps> {\n public state: FeedbackWidgetProviderState = {\n isButtonVisible: false,\n isScreenshotButtonVisible: false,\n isVisible: false,\n backgroundOpacity: new Animated.Value(0),\n panY: new Animated.Value(Dimensions.get('screen').height),\n isScrollAtTop: true,\n };\n\n private _themeListener: NativeEventSubscription | undefined;\n private _startedShakeListener: boolean = false;\n\n private _panResponder = PanResponder.create({\n onStartShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onMoveShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onPanResponderMove: (_, gestureState) => {\n if (gestureState.dy > 0) {\n this.state.panY.setValue(gestureState.dy);\n }\n },\n onPanResponderRelease: (_, gestureState) => {\n if (gestureState.dy > PULL_DOWN_CLOSE_THRESHOLD) {\n // Close on swipe below a certain threshold\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n }).start(() => {\n this._handleClose();\n });\n } else {\n // Animate it back to the original position\n Animated.spring(this.state.panY, {\n toValue: 0,\n useNativeDriver: true,\n }).start();\n }\n },\n });\n\n public constructor(props: FeedbackWidgetProviderProps) {\n super(props);\n FeedbackButtonManager.initialize(this._setButtonVisibilityFunction);\n ScreenshotButtonManager.initialize(this._setScreenshotButtonVisibilityFunction);\n FeedbackWidgetManager.initialize(this._setVisibilityFunction);\n }\n\n /**\n * Add a listener to the theme change event and start shake detection if configured.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n\n if (isShakeToReportEnabled()) {\n this._startedShakeListener = startShakeListener(showFeedbackWidget);\n }\n }\n\n /**\n * Clean up the theme listener and stop shake detection.\n */\n public componentWillUnmount(): void {\n if (this._themeListener) {\n this._themeListener.remove();\n }\n\n if (this._startedShakeListener) {\n stopShakeListener();\n }\n }\n\n /**\n * Animates the background opacity when the modal is shown.\n */\n public componentDidUpdate(_prevProps: any, prevState: FeedbackWidgetProviderState): void {\n if (!prevState.isVisible && this.state.isVisible) {\n Animated.parallel([\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 1,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.in(Easing.quad),\n }),\n Animated.timing(this.state.panY, {\n toValue: 0,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.in(Easing.quad),\n }),\n ]).start(() => {\n debug.log('FeedbackWidgetProvider componentDidUpdate');\n });\n } else if (prevState.isVisible && !this.state.isVisible) {\n this.state.backgroundOpacity.setValue(0);\n }\n }\n\n /**\n * Renders the feedback form modal.\n */\n public render(): React.ReactNode {\n if (!isModalSupported()) {\n debug.error('FeedbackWidget Modal is not supported in React Native < 0.71 with Fabric renderer.');\n return <>{this.props.children}</>;\n }\n\n const theme = getTheme();\n\n const { isButtonVisible, isScreenshotButtonVisible, isVisible, backgroundOpacity } = this.state;\n\n const backgroundColor = backgroundOpacity.interpolate({\n inputRange: [0, 1],\n outputRange: ['rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.9)'],\n });\n\n // Wrapping the `Modal` component in a `View` component is necessary to avoid\n // issues like https://github.com/software-mansion/react-native-reanimated/issues/6035\n return (\n <>\n {this.props.children}\n {isButtonVisible && <FeedbackButton {...getFeedbackButtonOptions()} />}\n {isScreenshotButtonVisible && <ScreenshotButton {...getScreenshotButtonOptions()} />}\n {isVisible && (\n <Animated.View style={[modalWrapper, { backgroundColor }]}>\n <Modal\n visible={isVisible}\n transparent\n animationType=\"none\"\n onRequestClose={this._handleClose}\n testID=\"feedback-form-modal\"\n >\n <View style={topSpacer} />\n <Animated.View\n style={[modalSheetContainer(theme), { transform: [{ translateY: this.state.panY }] }]}\n {...this._panResponder.panHandlers}\n >\n <ScrollView\n bounces={false}\n keyboardShouldPersistTaps=\"handled\"\n automaticallyAdjustKeyboardInsets={Platform.OS === 'ios'}\n onScroll={this._handleScroll}\n >\n <FeedbackWidget\n {...getFeedbackOptions()}\n onFormClose={this._handleClose}\n onFormSubmitted={this._handleClose}\n />\n </ScrollView>\n </Animated.View>\n </Modal>\n </Animated.View>\n )}\n </>\n );\n }\n\n private _handleScroll = (event: NativeSyntheticEvent<NativeScrollEvent>): void => {\n this.setState({ isScrollAtTop: event.nativeEvent.contentOffset.y <= 0 });\n };\n\n private _setVisibilityFunction = (visible: boolean): void => {\n const updateState = (): void => {\n this.setState({ isVisible: visible });\n };\n if (!visible) {\n Animated.parallel([\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.out(Easing.quad),\n }),\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 0,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.out(Easing.quad),\n }),\n ]).start(() => {\n // Change of the state unmount the component\n // which would cancel the animation\n updateState();\n });\n } else {\n updateState();\n }\n };\n\n private _setButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isButtonVisible: visible });\n };\n\n private _setScreenshotButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isScreenshotButtonVisible: visible });\n };\n\n private _handleClose = (): void => {\n FeedbackWidgetManager.hide();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FeedbackWidgetProvider.js","sourceRoot":"","sources":["../../../src/js/feedback/FeedbackWidgetProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { debug } from '@sentry/core';\nimport * as React from 'react';\nimport { Animated, Appearance, Dimensions, Easing, Modal, type NativeEventSubscription, type NativeScrollEvent,type NativeSyntheticEvent, PanResponder, Platform, ScrollView, View } from 'react-native';\nimport { notWeb } from '../utils/environment';\nimport { FeedbackButton } from './FeedbackButton';\nimport { FeedbackWidget } from './FeedbackWidget';\nimport { modalSheetContainer,modalWrapper, topSpacer } from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { FeedbackWidgetStyles } from './FeedbackWidget.types';\nimport {\n BACKGROUND_ANIMATION_DURATION,\n FeedbackButtonManager,\n FeedbackWidgetManager,\n PULL_DOWN_CLOSE_THRESHOLD,\n ScreenshotButtonManager,\n showFeedbackWidget,\n SLIDE_ANIMATION_DURATION,\n} from './FeedbackWidgetManager';\nimport { getFeedbackButtonOptions, getFeedbackOptions, getScreenshotButtonOptions, isShakeToReportEnabled } from './integration';\nimport { ScreenshotButton } from './ScreenshotButton';\nimport { startShakeListener, stopShakeListener } from './ShakeToReportBug';\nimport { isModalSupported, isNativeDriverSupportedForColorAnimations } from './utils';\n\nconst useNativeDriverForColorAnimations = isNativeDriverSupportedForColorAnimations();\n\nexport interface FeedbackWidgetProviderProps {\n children: React.ReactNode;\n styles?: FeedbackWidgetStyles;\n}\n\nexport interface FeedbackWidgetProviderState {\n isButtonVisible: boolean;\n isScreenshotButtonVisible: boolean;\n isVisible: boolean;\n backgroundOpacity: Animated.Value;\n panY: Animated.Value;\n isScrollAtTop: boolean;\n}\n\n/**\n * FeedbackWidgetProvider is a component that wraps the feedback widget and provides\n * functionality to show and hide the widget. It also manages the visibility of the\n * feedback button and screenshot button.\n */\nexport class FeedbackWidgetProvider extends React.Component<FeedbackWidgetProviderProps> {\n public state: FeedbackWidgetProviderState = {\n isButtonVisible: false,\n isScreenshotButtonVisible: false,\n isVisible: false,\n backgroundOpacity: new Animated.Value(0),\n panY: new Animated.Value(Dimensions.get('screen').height),\n isScrollAtTop: true,\n };\n\n private _themeListener: NativeEventSubscription | undefined;\n private _startedShakeListener: boolean = false;\n\n private _panResponder = PanResponder.create({\n onStartShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onMoveShouldSetPanResponder: (_, gestureState) => {\n return notWeb() && this.state.isScrollAtTop && gestureState.dy > 0;\n },\n onPanResponderMove: (_, gestureState) => {\n if (gestureState.dy > 0) {\n this.state.panY.setValue(gestureState.dy);\n }\n },\n onPanResponderRelease: (_, gestureState) => {\n if (gestureState.dy > PULL_DOWN_CLOSE_THRESHOLD) {\n // Close on swipe below a certain threshold\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n }).start(() => {\n this._handleClose();\n });\n } else {\n // Animate it back to the original position\n Animated.spring(this.state.panY, {\n toValue: 0,\n useNativeDriver: true,\n }).start();\n }\n },\n });\n\n public constructor(props: FeedbackWidgetProviderProps) {\n super(props);\n FeedbackButtonManager.initialize(this._setButtonVisibilityFunction);\n ScreenshotButtonManager.initialize(this._setScreenshotButtonVisibilityFunction);\n FeedbackWidgetManager.initialize(this._setVisibilityFunction);\n }\n\n /**\n * Add a listener to the theme change event and start shake detection if configured.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n\n if (isShakeToReportEnabled()) {\n this._startedShakeListener = startShakeListener(showFeedbackWidget);\n }\n }\n\n /**\n * Clean up the theme listener and stop shake detection.\n */\n public componentWillUnmount(): void {\n if (this._themeListener) {\n this._themeListener.remove();\n }\n\n if (this._startedShakeListener) {\n stopShakeListener();\n }\n }\n\n /**\n * Animates the background opacity when the modal is shown.\n */\n public componentDidUpdate(_prevProps: any, prevState: FeedbackWidgetProviderState): void {\n if (!prevState.isVisible && this.state.isVisible) {\n Animated.parallel([\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 1,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.in(Easing.quad),\n }),\n Animated.timing(this.state.panY, {\n toValue: 0,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.in(Easing.quad),\n }),\n ]).start(() => {\n debug.log('FeedbackWidgetProvider componentDidUpdate');\n });\n } else if (prevState.isVisible && !this.state.isVisible) {\n this.state.backgroundOpacity.setValue(0);\n }\n }\n\n /**\n * Renders the feedback form modal.\n */\n public render(): React.ReactNode {\n if (!isModalSupported()) {\n debug.error('FeedbackWidget Modal is not supported in React Native < 0.71 with Fabric renderer.');\n return <>{this.props.children}</>;\n }\n\n const theme = getTheme();\n\n const { isButtonVisible, isScreenshotButtonVisible, isVisible, backgroundOpacity } = this.state;\n\n const backgroundColor = backgroundOpacity.interpolate({\n inputRange: [0, 1],\n outputRange: ['rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.9)'],\n });\n\n // Wrapping the `Modal` component in a `View` component is necessary to avoid\n // issues like https://github.com/software-mansion/react-native-reanimated/issues/6035\n return (\n <>\n {this.props.children}\n {isButtonVisible && <FeedbackButton {...getFeedbackButtonOptions()} />}\n {isScreenshotButtonVisible && <ScreenshotButton {...getScreenshotButtonOptions()} />}\n {isVisible && (\n <Animated.View style={[modalWrapper, { backgroundColor }]}>\n <Modal\n visible={isVisible}\n transparent\n animationType=\"none\"\n onRequestClose={this._handleClose}\n testID=\"feedback-form-modal\"\n >\n <View style={topSpacer} />\n <Animated.View\n style={[modalSheetContainer(theme), { transform: [{ translateY: this.state.panY }] }]}\n {...this._panResponder.panHandlers}\n >\n <ScrollView\n bounces={false}\n keyboardShouldPersistTaps=\"handled\"\n automaticallyAdjustKeyboardInsets={Platform.OS === 'ios'}\n onScroll={this._handleScroll}\n >\n <FeedbackWidget\n {...getFeedbackOptions()}\n onFormClose={this._handleClose}\n onFormSubmitted={this._handleClose}\n />\n </ScrollView>\n </Animated.View>\n </Modal>\n </Animated.View>\n )}\n </>\n );\n }\n\n private _handleScroll = (event: NativeSyntheticEvent<NativeScrollEvent>): void => {\n this.setState({ isScrollAtTop: event.nativeEvent.contentOffset.y <= 0 });\n };\n\n private _setVisibilityFunction = (visible: boolean): void => {\n const updateState = (): void => {\n this.setState({ isVisible: visible });\n };\n if (!visible) {\n Animated.parallel([\n Animated.timing(this.state.panY, {\n toValue: Dimensions.get('screen').height,\n duration: SLIDE_ANIMATION_DURATION,\n useNativeDriver: true,\n easing: Easing.out(Easing.quad),\n }),\n Animated.timing(this.state.backgroundOpacity, {\n toValue: 0,\n duration: BACKGROUND_ANIMATION_DURATION,\n useNativeDriver: useNativeDriverForColorAnimations,\n easing: Easing.out(Easing.quad),\n }),\n ]).start(() => {\n // Change of the state unmount the component\n // which would cancel the animation\n updateState();\n });\n } else {\n updateState();\n }\n };\n\n private _setButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isButtonVisible: visible });\n };\n\n private _setScreenshotButtonVisibilityFunction = (visible: boolean): void => {\n this.setState({ isScreenshotButtonVisible: visible });\n };\n\n private _handleClose = (): void => {\n FeedbackWidgetManager.hide();\n };\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import type { Screenshot } from '../wrapper';
|
|
3
3
|
import type { ScreenshotButtonProps } from './FeedbackWidget.types';
|
|
4
|
-
export declare const getCapturedScreenshot: () => Screenshot |
|
|
4
|
+
export declare const getCapturedScreenshot: () => Screenshot | "ErrorCapturingScreenshot" | undefined;
|
|
5
5
|
/**
|
|
6
6
|
* @beta
|
|
7
7
|
* Implements a screenshot button that takes a screenshot.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenshotButton.js","sourceRoot":"","sources":["../../../src/js/feedback/ScreenshotButton.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,QAAQ,CAAC;AAErD,IAAI,kBAAuE,CAAC;AAE5E,MAAM,cAAc,GAAG,GAAwB,EAAE;IAC/C,oBAAoB,EAAE,CAAC;IACvB,UAAU,CAAC,GAAS,EAAE;QACpB,MAAM,WAAW,GAAwB,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC1E,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"ScreenshotButton.js","sourceRoot":"","sources":["../../../src/js/feedback/ScreenshotButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport type { NativeEventSubscription} from 'react-native';\nimport { Appearance, Image, Text, TouchableOpacity } from 'react-native';\nimport type { Screenshot } from '../wrapper';\nimport { NATIVE } from '../wrapper';\nimport { defaultScreenshotButtonConfiguration } from './defaults';\nimport { defaultScreenshotButtonStyles } from './FeedbackWidget.styles';\nimport { getTheme } from './FeedbackWidget.theme';\nimport type { ScreenshotButtonProps, ScreenshotButtonStyles, ScreenshotButtonTextConfiguration } from './FeedbackWidget.types';\nimport { hideScreenshotButton, showFeedbackWidget } from './FeedbackWidgetManager';\nimport { screenshotIcon } from './icons';\nimport { lazyLoadFeedbackIntegration } from './lazy';\n\nlet capturedScreenshot: Screenshot | 'ErrorCapturingScreenshot' | undefined;\n\nconst takeScreenshot = async (): Promise<void> => {\n hideScreenshotButton();\n setTimeout(async () => { // Delay capture to allow the button to hide\n const screenshots: Screenshot[] | null = await NATIVE.captureScreenshot();\n if (screenshots && screenshots.length > 0) {\n capturedScreenshot = screenshots[0];\n } else {\n capturedScreenshot = 'ErrorCapturingScreenshot';\n }\n showFeedbackWidget();\n }, 100);\n};\n\nexport const getCapturedScreenshot = (): Screenshot | 'ErrorCapturingScreenshot' | undefined => {\n const screenshot = capturedScreenshot;\n capturedScreenshot = undefined;\n return screenshot;\n}\n\n/**\n * @beta\n * Implements a screenshot button that takes a screenshot.\n */\nexport class ScreenshotButton extends React.Component<ScreenshotButtonProps> {\n private _themeListener: NativeEventSubscription | undefined;\n\n public constructor(props: ScreenshotButtonProps) {\n super(props);\n lazyLoadFeedbackIntegration();\n }\n\n /**\n * Adds a listener for theme changes.\n */\n public componentDidMount(): void {\n this._themeListener = Appearance.addChangeListener(() => {\n this.forceUpdate();\n });\n }\n\n /**\n * Removes the theme listener.\n */\n public componentWillUnmount(): void {\n if (this._themeListener) {\n this._themeListener.remove();\n }\n }\n\n /**\n * Renders the screenshot button.\n */\n public render(): React.ReactNode {\n const theme = getTheme();\n const text: ScreenshotButtonTextConfiguration = { ...defaultScreenshotButtonConfiguration, ...this.props };\n const styles: ScreenshotButtonStyles = {\n triggerButton: { ...defaultScreenshotButtonStyles(theme).triggerButton, ...this.props.styles?.triggerButton },\n triggerText: { ...defaultScreenshotButtonStyles(theme).triggerText, ...this.props.styles?.triggerText },\n triggerIcon: { ...defaultScreenshotButtonStyles(theme).triggerIcon, ...this.props.styles?.triggerIcon },\n };\n\n return (\n <TouchableOpacity\n style={styles.triggerButton}\n onPress={takeScreenshot}\n accessibilityLabel={text.triggerAriaLabel}\n >\n <Image source={{ uri: screenshotIcon }} style={styles.triggerIcon}/>\n <Text style={styles.triggerText} testID='sentry-feedback-screenshot-button'>{text.triggerLabel}</Text>\n </TouchableOpacity>\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShakeToReportBug.js","sourceRoot":"","sources":["../../../src/js/feedback/ShakeToReportBug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD,IAAI,kBAAkB,GAA+B,IAAI,CAAC;AAQ1D,MAAM,qBAAqB,GAAmB,YAAY,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAmB,EACnB,gBAAgC,qBAAqB;IAErD,IAAI,kBAAkB,EAAE;
|
|
1
|
+
{"version":3,"file":"ShakeToReportBug.js","sourceRoot":"","sources":["../../../src/js/feedback/ShakeToReportBug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD,IAAI,kBAAkB,GAA+B,IAAI,CAAC;AAQ1D,MAAM,qBAAqB,GAAmB,YAAY,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAmB,EACnB,gBAAgC,qBAAqB;IAErD,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,EAAE,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,iBAAiB,EAA8B,CAAC;IACrE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5C,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC9D,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,yFAAyF;QACzF,kFAAkF;QAClF,sEAAsE;QACtE,MAAM,MAAM,GAAG,YAAqD,CAAC;QACrE,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAChC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;QACjD,IAAI,kBAAkB,EAAE,CAAC;YACvB,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC5B,kBAAkB,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;;IAC/B,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,kBAAkB,GAAG,IAAI,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,iBAAiB,EAAwD,CAAC;YAC/F,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,qBAAqB,4DAAI,CAAC;QAC1C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,kBAAkB,KAAK,IAAI,CAAC;AACrC,CAAC","sourcesContent":["import { debug } from '@sentry/core';\nimport type { EmitterSubscription, NativeModule } from 'react-native';\nimport { NativeEventEmitter } from 'react-native';\nimport { isWeb } from '../utils/environment';\nimport { getRNSentryModule } from '../wrapper';\n\nexport const OnShakeEventName = 'rn_sentry_on_shake';\n\nlet _shakeSubscription: EmitterSubscription | null = null;\n\n/**\n * Creates a NativeEventEmitter for the given module.\n * Can be overridden in tests via the `createEmitter` parameter.\n */\ntype EmitterFactory = (nativeModule: NativeModule) => NativeEventEmitter;\n\nconst defaultEmitterFactory: EmitterFactory = nativeModule => new NativeEventEmitter(nativeModule);\n\n/**\n * Starts listening for device shake events and invokes the provided callback when a shake is detected.\n *\n * This starts native shake detection:\n * - iOS: Uses UIKit's motion event detection (no permissions required)\n * - Android: Uses the accelerometer sensor (no permissions required)\n */\nexport function startShakeListener(\n onShake: () => void,\n createEmitter: EmitterFactory = defaultEmitterFactory,\n): boolean {\n if (_shakeSubscription) {\n return false;\n }\n\n if (isWeb()) {\n debug.warn('Shake detection is not supported on Web.');\n return false;\n }\n\n const nativeModule = getRNSentryModule() as NativeModule | undefined;\n if (!nativeModule) {\n debug.warn('Native module is not available. Shake detection will not work.');\n return false;\n }\n\n try {\n const emitter = createEmitter(nativeModule);\n _shakeSubscription = emitter.addListener(OnShakeEventName, () => {\n onShake();\n });\n\n // Explicitly enable native shake detection. On iOS with New Architecture (TurboModules),\n // NativeEventEmitter.addListener does not dispatch to native addListener:, so the\n // native shake listener would never start without this explicit call.\n const module = nativeModule as { enableShakeDetection?: () => void };\n if (module.enableShakeDetection) {\n module.enableShakeDetection();\n } else {\n debug.warn('enableShakeDetection is not available on the native module.');\n }\n return true;\n } catch (e) {\n debug.warn('Failed to start shake listener:', e);\n if (_shakeSubscription) {\n _shakeSubscription.remove();\n _shakeSubscription = null;\n }\n return false;\n }\n}\n\n/**\n * Stops listening for device shake events.\n */\nexport function stopShakeListener(): void {\n if (_shakeSubscription) {\n try {\n _shakeSubscription.remove();\n } catch (e) {\n debug.warn('Failed to remove shake subscription:', e);\n }\n _shakeSubscription = null;\n\n try {\n const nativeModule = getRNSentryModule() as { disableShakeDetection?: () => void } | undefined;\n nativeModule?.disableShakeDetection?.();\n } catch (e) {\n debug.warn('Failed to disable native shake detection:', e);\n }\n }\n}\n\n/**\n * Returns whether the shake listener is currently active.\n * Exported for testing purposes.\n */\nexport function isShakeListenerActive(): boolean {\n return _shakeSubscription !== null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/js/feedback/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,UAAU,GAAG,cAAc,CAAC;AAClC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AACrC,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AACnD,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,mBAAmB,GAAG,sCAAsC,CAAC;AACnE,MAAM,aAAa,GAAG,aAAa,CAAC;AACpC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AACvC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AACrC,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AACnD,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAC1D,MAAM,WAAW,GAAG,qCAAqC,CAAC;AAC1D,MAAM,wBAAwB,GAAG,+CAA+C,CAAC;AACjF,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAC1D,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAChD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AACrD,MAAM,uBAAuB,GAAG,mBAAmB,CAAC;AACpD,MAAM,kBAAkB,GAAG,qDAAqD,CAAC;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,oBAAoB;IACpB,UAAU,EAAE,GAAG,EAAE;QACf,0BAA0B;IAC5B,CAAC;IACD,WAAW,EAAE,GAAG,EAAE;QAChB,IAAI,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/js/feedback/defaults.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FeedbackButtonProps, FeedbackWidgetProps, ScreenshotButtonProps } from './FeedbackWidget.types';\nimport { feedbackAlertDialog } from './utils';\n\nconst FORM_TITLE = 'Report a Bug';\nconst NAME_PLACEHOLDER = 'Your Name';\nconst NAME_LABEL = 'Name';\nconst EMAIL_PLACEHOLDER = 'your.email@example.org';\nconst EMAIL_LABEL = 'Email';\nconst MESSAGE_PLACEHOLDER = \"What's the bug? What did you expect?\";\nconst MESSAGE_LABEL = 'Description';\nconst IS_REQUIRED_LABEL = '(required)';\nconst SUBMIT_BUTTON_LABEL = 'Send Bug Report';\nconst CANCEL_BUTTON_LABEL = 'Cancel';\nconst TRIGGER_LABEL = 'Report a Bug';\nconst TRIGGER_SCREENSHOT_LABEL = 'Take Screenshot';\nconst ERROR_TITLE = 'Error';\nconst FORM_ERROR = 'Please fill out all required fields.';\nconst EMAIL_ERROR = 'Please enter a valid email address.';\nconst CAPTURE_SCREENSHOT_ERROR = 'Error capturing screenshot. Please try again.';\nconst SUCCESS_MESSAGE_TEXT = 'Thank you for your report!';\nconst ADD_SCREENSHOT_LABEL = 'Add a screenshot';\nconst CAPTURE_SCREENSHOT_LABEL = 'Take a screenshot';\nconst REMOVE_SCREENSHOT_LABEL = 'Remove screenshot';\nconst GENERIC_ERROR_TEXT = 'Unable to send feedback due to an unexpected error.';\n\nexport const defaultConfiguration: FeedbackWidgetProps = {\n // FeedbackCallbacks\n onFormOpen: () => {\n // Does nothing by default\n },\n onFormClose: () => {\n if (__DEV__) {\n feedbackAlertDialog(\n 'Development note',\n 'onFormClose callback is not implemented. By default the form is just unmounted.',\n );\n }\n },\n onAddScreenshot: (_: (uri: string) => void) => {\n if (__DEV__) {\n feedbackAlertDialog('Development note', 'onAddScreenshot callback is not implemented.');\n }\n },\n onSubmitSuccess: () => {\n // Does nothing by default\n },\n onSubmitError: () => {\n // Does nothing by default\n },\n onFormSubmitted: () => {\n if (__DEV__) {\n feedbackAlertDialog(\n 'Development note',\n 'onFormSubmitted callback is not implemented. By default the form is just unmounted.',\n );\n }\n },\n\n // FeedbackGeneralConfiguration\n showBranding: true,\n isEmailRequired: false,\n shouldValidateEmail: true,\n isNameRequired: false,\n showEmail: true,\n showName: true,\n enableScreenshot: false,\n enableTakeScreenshot: false,\n\n // FeedbackTextConfiguration\n cancelButtonLabel: CANCEL_BUTTON_LABEL,\n emailLabel: EMAIL_LABEL,\n emailPlaceholder: EMAIL_PLACEHOLDER,\n formTitle: FORM_TITLE,\n isRequiredLabel: IS_REQUIRED_LABEL,\n messageLabel: MESSAGE_LABEL,\n messagePlaceholder: MESSAGE_PLACEHOLDER,\n nameLabel: NAME_LABEL,\n namePlaceholder: NAME_PLACEHOLDER,\n submitButtonLabel: SUBMIT_BUTTON_LABEL,\n errorTitle: ERROR_TITLE,\n formError: FORM_ERROR,\n emailError: EMAIL_ERROR,\n captureScreenshotError: CAPTURE_SCREENSHOT_ERROR,\n successMessageText: SUCCESS_MESSAGE_TEXT,\n addScreenshotButtonLabel: ADD_SCREENSHOT_LABEL,\n removeScreenshotButtonLabel: REMOVE_SCREENSHOT_LABEL,\n captureScreenshotButtonLabel: CAPTURE_SCREENSHOT_LABEL,\n genericError: GENERIC_ERROR_TEXT,\n};\n\nexport const defaultButtonConfiguration: Partial<FeedbackButtonProps> = {\n triggerLabel: TRIGGER_LABEL,\n triggerAriaLabel: '',\n};\n\nexport const defaultScreenshotButtonConfiguration: Partial<ScreenshotButtonProps> = {\n triggerLabel: TRIGGER_SCREENSHOT_LABEL,\n triggerAriaLabel: '',\n};\n"]}
|
|
@@ -14,7 +14,7 @@ type FeedbackIntegration = Integration & {
|
|
|
14
14
|
export declare const feedbackIntegration: (initOptions?: Partial<FeedbackWidgetProps> & {
|
|
15
15
|
buttonOptions?: FeedbackButtonProps;
|
|
16
16
|
screenshotButtonOptions?: ScreenshotButtonProps;
|
|
17
|
-
colorScheme?:
|
|
17
|
+
colorScheme?: "system" | "light" | "dark";
|
|
18
18
|
themeLight?: Partial<FeedbackWidgetTheme>;
|
|
19
19
|
themeDark?: Partial<FeedbackWidgetTheme>;
|
|
20
20
|
/**
|
|
@@ -30,7 +30,7 @@ export declare const feedbackIntegration: (initOptions?: Partial<FeedbackWidgetP
|
|
|
30
30
|
export declare const getFeedbackOptions: () => Partial<FeedbackWidgetProps>;
|
|
31
31
|
export declare const getFeedbackButtonOptions: () => Partial<FeedbackButtonProps>;
|
|
32
32
|
export declare const getScreenshotButtonOptions: () => Partial<ScreenshotButtonProps>;
|
|
33
|
-
export declare const getColorScheme: () =>
|
|
33
|
+
export declare const getColorScheme: () => "system" | "light" | "dark";
|
|
34
34
|
export declare const getFeedbackLightTheme: () => Partial<FeedbackWidgetTheme>;
|
|
35
35
|
export declare const getFeedbackDarkTheme: () => Partial<FeedbackWidgetTheme>;
|
|
36
36
|
export declare const isShakeToReportEnabled: () => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE9G,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE,KAAK,mBAAmB,GAAG,WAAW,GAAG;IACvC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,aAAa,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,uBAAuB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1C,UAAU,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/js/feedback/integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE9G,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE,KAAK,mBAAmB,GAAG,WAAW,GAAG;IACvC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,aAAa,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,uBAAuB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1C,UAAU,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,cAAa,OAAO,CAAC,mBAAmB,CAAC,GAAG;IAC1C,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,uBAAuB,CAAC,EAAE,qBAAqB,CAAC;IAChD,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzC;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC1B,KACL,mBAqBF,CAAC;AAMF,eAAO,MAAM,kBAAkB,QAAO,OAAO,CAAC,mBAAmB,CAOhE,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAO,OAAO,CAAC,mBAAmB,CAOtE,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,OAAO,CAAC,qBAAqB,CAO1E,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,QAAQ,GAAG,OAAO,GAAG,MAOtD,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,OAAO,CAAC,mBAAmB,CAOnE,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAO,OAAO,CAAC,mBAAmB,CAOlE,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAO,OAGzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.js","sourceRoot":"","sources":["../../../src/js/feedback/integration.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAI3D,MAAM,CAAC,MAAM,gCAAgC,GAAG,gBAAgB,CAAC;AAYjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,cAeI,EAAE,EACe,EAAE;IACvB,MAAM,EACJ,aAAa,EACb,uBAAuB,EACvB,WAAW,EACX,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,mBAAmB,EAAE,aAAa,KAEhC,WAAW,EADV,aAAa,UACd,WAAW,EART,6GAQL,CAAc,CAAC;IAEhB,OAAO;QACL,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,aAAa;QACtB,aAAa,EAAE,aAAa,IAAI,EAAE;QAClC,uBAAuB,EAAE,uBAAuB,IAAI,EAAE;QACtD,WAAW,EAAE,WAAW,IAAI,QAAQ;QACpC,UAAU,EAAE,UAAU,IAAI,EAAE;QAC5B,SAAS,EAAE,SAAS,IAAI,EAAE;QAC1B,mBAAmB,EAAE,aAAa,IAAI,KAAK;KAC5C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,GAAoC,EAAE;;IAClE,OAAO,MAAA,SAAS,EAAE,0CAAE,oBAAoB,CAAyC,gCAAgC,CAAC,CAAC;AACrH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAiC,EAAE;IACnE,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"integration.js","sourceRoot":"","sources":["../../../src/js/feedback/integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { getClient, type Integration } from '@sentry/core';\nimport type { FeedbackWidgetTheme } from './FeedbackWidget.theme';\nimport type { FeedbackButtonProps, FeedbackWidgetProps, ScreenshotButtonProps } from './FeedbackWidget.types';\n\nexport const MOBILE_FEEDBACK_INTEGRATION_NAME = 'MobileFeedback';\n\ntype FeedbackIntegration = Integration & {\n options: Partial<FeedbackWidgetProps>;\n buttonOptions: Partial<FeedbackButtonProps>;\n screenshotButtonOptions: Partial<ScreenshotButtonProps>;\n colorScheme?: 'system' | 'light' | 'dark';\n themeLight: Partial<FeedbackWidgetTheme>;\n themeDark: Partial<FeedbackWidgetTheme>;\n enableShakeToReport: boolean;\n};\n\nexport const feedbackIntegration = (\n initOptions: Partial<FeedbackWidgetProps> & {\n buttonOptions?: FeedbackButtonProps;\n screenshotButtonOptions?: ScreenshotButtonProps;\n colorScheme?: 'system' | 'light' | 'dark';\n themeLight?: Partial<FeedbackWidgetTheme>;\n themeDark?: Partial<FeedbackWidgetTheme>;\n /**\n * Enable showing the feedback widget when the user shakes the device.\n *\n * - iOS: Uses UIKit's motion event detection (no permissions required)\n * - Android: Uses the accelerometer sensor (no permissions required)\n *\n * @default false\n */\n enableShakeToReport?: boolean;\n } = {},\n): FeedbackIntegration => {\n const {\n buttonOptions,\n screenshotButtonOptions,\n colorScheme,\n themeLight: lightTheme,\n themeDark: darkTheme,\n enableShakeToReport: shakeToReport,\n ...widgetOptions\n } = initOptions;\n\n return {\n name: MOBILE_FEEDBACK_INTEGRATION_NAME,\n options: widgetOptions,\n buttonOptions: buttonOptions || {},\n screenshotButtonOptions: screenshotButtonOptions || {},\n colorScheme: colorScheme || 'system',\n themeLight: lightTheme || {},\n themeDark: darkTheme || {},\n enableShakeToReport: shakeToReport || false,\n };\n};\n\nconst _getClientIntegration = (): FeedbackIntegration | undefined => {\n return getClient()?.getIntegrationByName<ReturnType<typeof feedbackIntegration>>(MOBILE_FEEDBACK_INTEGRATION_NAME);\n};\n\nexport const getFeedbackOptions = (): Partial<FeedbackWidgetProps> => {\n const integration = _getClientIntegration();\n if (!integration) {\n return {};\n }\n\n return integration.options;\n};\n\nexport const getFeedbackButtonOptions = (): Partial<FeedbackButtonProps> => {\n const integration = _getClientIntegration();\n if (!integration) {\n return {};\n }\n\n return integration.buttonOptions;\n};\n\nexport const getScreenshotButtonOptions = (): Partial<ScreenshotButtonProps> => {\n const integration = _getClientIntegration();\n if (!integration) {\n return {};\n }\n\n return integration.screenshotButtonOptions;\n};\n\nexport const getColorScheme = (): 'system' | 'light' | 'dark' => {\n const integration = _getClientIntegration();\n if (!integration?.colorScheme) {\n return 'system';\n }\n\n return integration.colorScheme;\n};\n\nexport const getFeedbackLightTheme = (): Partial<FeedbackWidgetTheme> => {\n const integration = _getClientIntegration();\n if (!integration) {\n return {};\n }\n\n return integration.themeLight;\n};\n\nexport const getFeedbackDarkTheme = (): Partial<FeedbackWidgetTheme> => {\n const integration = _getClientIntegration();\n if (!integration) {\n return {};\n }\n\n return integration.themeDark;\n};\n\nexport const isShakeToReportEnabled = (): boolean => {\n const integration = _getClientIntegration();\n return integration?.enableShakeToReport ?? false;\n};\n"]}
|