@sentry/react-native 3.4.0 → 3.4.3
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/CHANGELOG.md +12 -0
- package/README.md +7 -3
- package/android/src/main/java/io/sentry/react/RNSentryModule.java +2 -1
- package/dist/js/touchevents.d.ts +1 -1
- package/dist/js/touchevents.d.ts.map +1 -1
- package/dist/js/touchevents.js +1 -1
- package/dist/js/touchevents.js.map +1 -1
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/ios/RNSentry.m +16 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.4.3
|
|
4
|
+
|
|
5
|
+
- feat: Support macOS (#2240) by @ospfranco
|
|
6
|
+
|
|
7
|
+
## 3.4.2
|
|
8
|
+
|
|
9
|
+
- fix: Fix cold start appearing again after js bundle reload on Android. #2229
|
|
10
|
+
|
|
11
|
+
## 3.4.1
|
|
12
|
+
|
|
13
|
+
- fix: Make withTouchEventBoundary options optional #2196
|
|
14
|
+
|
|
3
15
|
## 3.4.0
|
|
4
16
|
|
|
5
17
|
### Various fixes & improvements
|
package/README.md
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
<a href="https://sentry.io/?utm_source=github&utm_medium=logo" target="_blank">
|
|
3
|
+
<picture>
|
|
4
|
+
<source srcset="https://sentry-brand.storage.googleapis.com/sentry-logo-white.png" media="(prefers-color-scheme: dark)" />
|
|
5
|
+
<source srcset="https://sentry-brand.storage.googleapis.com/sentry-logo-black.png" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" />
|
|
6
|
+
<img src="https://sentry-brand.storage.googleapis.com/sentry-logo-black.png" alt="Sentry" width="280">
|
|
7
|
+
</picture>
|
|
8
|
+
</a>
|
|
5
9
|
</p>
|
|
6
10
|
|
|
7
11
|
_Bad software is everywhere, and we're tired of it. Sentry is on a mission to help developers write better software faster, so we can get back to enjoying technology. If you want to join us [<kbd>**Check out our open positions**</kbd>](https://sentry.io/careers/)_
|
|
@@ -55,10 +55,11 @@ public class RNSentryModule extends ReactContextBaseJavaModule {
|
|
|
55
55
|
private static final Logger logger = Logger.getLogger("react-native-sentry");
|
|
56
56
|
|
|
57
57
|
private PackageInfo packageInfo = null;
|
|
58
|
-
private boolean didFetchAppStart;
|
|
59
58
|
private FrameMetricsAggregator frameMetricsAggregator = null;
|
|
60
59
|
private boolean androidXAvailable = true;
|
|
61
60
|
|
|
61
|
+
private static boolean didFetchAppStart;
|
|
62
|
+
|
|
62
63
|
// 700ms to constitute frozen frames.
|
|
63
64
|
private static final int FROZEN_FRAME_THRESHOLD = 700;
|
|
64
65
|
// 16ms (slower than 60fps) to constitute slow frames.
|
package/dist/js/touchevents.d.ts
CHANGED
|
@@ -52,6 +52,6 @@ declare class TouchEventBoundary extends React.Component<TouchEventBoundaryProps
|
|
|
52
52
|
* @param WrappedComponent any React Component
|
|
53
53
|
* @param boundaryProps TouchEventBoundaryProps
|
|
54
54
|
*/
|
|
55
|
-
declare const withTouchEventBoundary: (InnerComponent: React.ComponentType<any>, boundaryProps
|
|
55
|
+
declare const withTouchEventBoundary: (InnerComponent: React.ComponentType<any>, boundaryProps?: TouchEventBoundaryProps | undefined) => React.FunctionComponent;
|
|
56
56
|
export { TouchEventBoundary, withTouchEventBoundary };
|
|
57
57
|
//# sourceMappingURL=touchevents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touchevents.d.ts","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,oBAAY,uBAAuB,GAAG;IACpC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC9C,CAAC;AAuBF;;GAEG;AACH,cAAM,kBAAmB,SAAQ,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC;IACvE,OAAc,WAAW,EAAE,MAAM,CAAiC;IAClE,OAAc,YAAY,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAK1D;IAEF;;OAEG;IACI,MAAM,IAAI,KAAK,CAAC,SAAS;IAYhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;OAGG;IAEH,OAAO,CAAC,aAAa;CAmEtB;AAED;;;;GAIG;AACH,QAAA,MAAM,sBAAsB,mBAEV,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"touchevents.d.ts","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,oBAAY,uBAAuB,GAAG;IACpC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC9C,CAAC;AAuBF;;GAEG;AACH,cAAM,kBAAmB,SAAQ,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC;IACvE,OAAc,WAAW,EAAE,MAAM,CAAiC;IAClE,OAAc,YAAY,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAK1D;IAEF;;OAEG;IACI,MAAM,IAAI,KAAK,CAAC,SAAS;IAYhC;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;OAGG;IAEH,OAAO,CAAC,aAAa;CAmEtB;AAED;;;;GAIG;AACH,QAAA,MAAM,sBAAsB,mBAEV,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,0DAEvC,KAAK,CAAC,iBAUR,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC"}
|
package/dist/js/touchevents.js
CHANGED
|
@@ -134,7 +134,7 @@ TouchEventBoundary.defaultProps = {
|
|
|
134
134
|
const withTouchEventBoundary = (
|
|
135
135
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
136
136
|
InnerComponent, boundaryProps) => {
|
|
137
|
-
const WrappedComponent = (props) => (<TouchEventBoundary {...boundaryProps}>
|
|
137
|
+
const WrappedComponent = (props) => (<TouchEventBoundary {...(boundaryProps !== null && boundaryProps !== void 0 ? boundaryProps : {})}>
|
|
138
138
|
<InnerComponent {...props}/>
|
|
139
139
|
</TouchEventBoundary>);
|
|
140
140
|
WrappedComponent.displayName = 'WithTouchEventBoundary';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touchevents.js","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"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","sourcesContent":["import { addBreadcrumb } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { logger } from '@sentry/utils';\nimport * as React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nexport type TouchEventBoundaryProps = {\n /**\n * The category assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbCategory?: string;\n /**\n * The type assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbType?: string;\n /**\n * The max number of components to display when logging a touch's component tree.\n */\n maxComponentTreeSize?: number;\n /**\n * Component name(s) to ignore when logging the touch event. This prevents unhelpful logs such as\n * \"Touch event within element: View\" where you still can't tell which View it occurred in.\n */\n ignoreNames?: Array<string | RegExp>;\n /**\n * Deprecated, use ignoreNames instead\n * @deprecated\n */\n ignoredDisplayNames?: Array<string | RegExp>;\n};\n\nconst touchEventStyles = StyleSheet.create({\n wrapperView: {\n flex: 1,\n },\n});\n\nconst DEFAULT_BREADCRUMB_CATEGORY = 'touch';\nconst DEFAULT_BREADCRUMB_TYPE = 'user';\nconst DEFAULT_MAX_COMPONENT_TREE_SIZE = 20;\n\nconst PROP_KEY = 'sentry-label';\n\ninterface ElementInstance {\n elementType?: {\n displayName?: string;\n name?: string;\n };\n memoizedProps?: Record<string, unknown>;\n return?: ElementInstance;\n}\n\n/**\n * Boundary to log breadcrumbs for interaction events.\n */\nclass TouchEventBoundary extends React.Component<TouchEventBoundaryProps> {\n public static displayName: string = '__Sentry.TouchEventBoundary';\n public static defaultProps: Partial<TouchEventBoundaryProps> = {\n breadcrumbCategory: DEFAULT_BREADCRUMB_CATEGORY,\n breadcrumbType: DEFAULT_BREADCRUMB_TYPE,\n ignoreNames: [],\n maxComponentTreeSize: DEFAULT_MAX_COMPONENT_TREE_SIZE,\n };\n\n /**\n *\n */\n public render(): React.ReactNode {\n return (\n <View\n style={touchEventStyles.wrapperView}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onTouchStart={this._onTouchStart.bind(this) as any}\n >\n {this.props.children}\n </View>\n );\n }\n\n /**\n * Logs the touch event given the component tree names and a label.\n */\n private _logTouchEvent(\n componentTreeNames: string[],\n activeLabel?: string\n ): void {\n const crumb = {\n category: this.props.breadcrumbCategory,\n data: { componentTree: componentTreeNames },\n level: Severity.Info,\n message: activeLabel\n ? `Touch event within element: ${activeLabel}`\n : 'Touch event within component tree',\n type: this.props.breadcrumbType,\n };\n\n addBreadcrumb(crumb);\n\n logger.log(`[TouchEvents] ${crumb.message}`);\n }\n\n /**\n * Checks if the name is supposed to be ignored.\n */\n private _isNameIgnored(name: string): boolean {\n let ignoreNames = this.props.ignoreNames || [];\n // eslint-disable-next-line deprecation/deprecation\n if (this.props.ignoredDisplayNames) {\n // This is to make it compatible with prior version.\n // eslint-disable-next-line deprecation/deprecation\n ignoreNames = [...ignoreNames, ...this.props.ignoredDisplayNames];\n }\n\n return ignoreNames.some(\n (ignoreName: string | RegExp) =>\n (typeof ignoreName === 'string' && name === ignoreName) ||\n (ignoreName instanceof RegExp && name.match(ignoreName))\n );\n }\n\n // Originally was going to clean the names of any HOCs as well but decided that it might hinder debugging effectively. Will leave here in case\n // private readonly _cleanName = (name: string): string =>\n // name.replace(/.*\\(/g, \"\").replace(/\\)/g, \"\");\n\n /**\n * Traverses through the component tree when a touch happens and logs it.\n * @param e\n */\n // eslint-disable-next-line complexity\n private _onTouchStart(e: { _targetInst?: ElementInstance }): void {\n if (e._targetInst) {\n let currentInst: ElementInstance | undefined = e._targetInst;\n\n let activeLabel: string | undefined;\n let activeDisplayName: string | undefined;\n const componentTreeNames: string[] = [];\n\n while (\n currentInst &&\n // maxComponentTreeSize will always be defined as we have a defaultProps. But ts needs a check so this is here.\n this.props.maxComponentTreeSize &&\n componentTreeNames.length < this.props.maxComponentTreeSize\n ) {\n if (\n // If the loop gets to the boundary itself, break.\n currentInst.elementType?.displayName ===\n TouchEventBoundary.displayName\n ) {\n break;\n }\n\n const props = currentInst.memoizedProps;\n const label =\n typeof props?.[PROP_KEY] !== 'undefined'\n ? `${props[PROP_KEY]}`\n : undefined;\n\n // Check the label first\n if (label && !this._isNameIgnored(label)) {\n if (!activeLabel) {\n activeLabel = label;\n }\n componentTreeNames.push(label);\n } else if (\n typeof props?.accessibilityLabel === 'string' &&\n !this._isNameIgnored(props.accessibilityLabel)\n ) {\n if (!activeLabel) {\n activeLabel = props.accessibilityLabel;\n }\n componentTreeNames.push(props.accessibilityLabel);\n } else if (currentInst.elementType) {\n const { elementType } = currentInst;\n\n if (\n elementType.displayName &&\n !this._isNameIgnored(elementType.displayName)\n ) {\n // Check display name\n if (!activeDisplayName) {\n activeDisplayName = elementType.displayName;\n }\n componentTreeNames.push(elementType.displayName);\n }\n }\n\n currentInst = currentInst.return;\n }\n\n const finalLabel = activeLabel ?? activeDisplayName;\n\n if (componentTreeNames.length > 0 || finalLabel) {\n this._logTouchEvent(componentTreeNames, finalLabel);\n }\n }\n }\n}\n\n/**\n * Convenience Higher-Order-Component for TouchEventBoundary\n * @param WrappedComponent any React Component\n * @param boundaryProps TouchEventBoundaryProps\n */\nconst withTouchEventBoundary = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InnerComponent: React.ComponentType<any>,\n boundaryProps: TouchEventBoundaryProps\n): React.FunctionComponent => {\n const WrappedComponent: React.FunctionComponent = (props) => (\n <TouchEventBoundary {...boundaryProps}>\n <InnerComponent {...props} />\n </TouchEventBoundary>\n );\n\n WrappedComponent.displayName = 'WithTouchEventBoundary';\n\n return WrappedComponent;\n};\n\nexport { TouchEventBoundary, withTouchEventBoundary };\n"]}
|
|
1
|
+
{"version":3,"file":"touchevents.js","sourceRoot":"","sources":["../../src/js/touchevents.tsx"],"names":[],"mappings":"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","sourcesContent":["import { addBreadcrumb } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { logger } from '@sentry/utils';\nimport * as React from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nexport type TouchEventBoundaryProps = {\n /**\n * The category assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbCategory?: string;\n /**\n * The type assigned to the breadcrumb that is logged by the touch event.\n */\n breadcrumbType?: string;\n /**\n * The max number of components to display when logging a touch's component tree.\n */\n maxComponentTreeSize?: number;\n /**\n * Component name(s) to ignore when logging the touch event. This prevents unhelpful logs such as\n * \"Touch event within element: View\" where you still can't tell which View it occurred in.\n */\n ignoreNames?: Array<string | RegExp>;\n /**\n * Deprecated, use ignoreNames instead\n * @deprecated\n */\n ignoredDisplayNames?: Array<string | RegExp>;\n};\n\nconst touchEventStyles = StyleSheet.create({\n wrapperView: {\n flex: 1,\n },\n});\n\nconst DEFAULT_BREADCRUMB_CATEGORY = 'touch';\nconst DEFAULT_BREADCRUMB_TYPE = 'user';\nconst DEFAULT_MAX_COMPONENT_TREE_SIZE = 20;\n\nconst PROP_KEY = 'sentry-label';\n\ninterface ElementInstance {\n elementType?: {\n displayName?: string;\n name?: string;\n };\n memoizedProps?: Record<string, unknown>;\n return?: ElementInstance;\n}\n\n/**\n * Boundary to log breadcrumbs for interaction events.\n */\nclass TouchEventBoundary extends React.Component<TouchEventBoundaryProps> {\n public static displayName: string = '__Sentry.TouchEventBoundary';\n public static defaultProps: Partial<TouchEventBoundaryProps> = {\n breadcrumbCategory: DEFAULT_BREADCRUMB_CATEGORY,\n breadcrumbType: DEFAULT_BREADCRUMB_TYPE,\n ignoreNames: [],\n maxComponentTreeSize: DEFAULT_MAX_COMPONENT_TREE_SIZE,\n };\n\n /**\n *\n */\n public render(): React.ReactNode {\n return (\n <View\n style={touchEventStyles.wrapperView}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onTouchStart={this._onTouchStart.bind(this) as any}\n >\n {this.props.children}\n </View>\n );\n }\n\n /**\n * Logs the touch event given the component tree names and a label.\n */\n private _logTouchEvent(\n componentTreeNames: string[],\n activeLabel?: string\n ): void {\n const crumb = {\n category: this.props.breadcrumbCategory,\n data: { componentTree: componentTreeNames },\n level: Severity.Info,\n message: activeLabel\n ? `Touch event within element: ${activeLabel}`\n : 'Touch event within component tree',\n type: this.props.breadcrumbType,\n };\n\n addBreadcrumb(crumb);\n\n logger.log(`[TouchEvents] ${crumb.message}`);\n }\n\n /**\n * Checks if the name is supposed to be ignored.\n */\n private _isNameIgnored(name: string): boolean {\n let ignoreNames = this.props.ignoreNames || [];\n // eslint-disable-next-line deprecation/deprecation\n if (this.props.ignoredDisplayNames) {\n // This is to make it compatible with prior version.\n // eslint-disable-next-line deprecation/deprecation\n ignoreNames = [...ignoreNames, ...this.props.ignoredDisplayNames];\n }\n\n return ignoreNames.some(\n (ignoreName: string | RegExp) =>\n (typeof ignoreName === 'string' && name === ignoreName) ||\n (ignoreName instanceof RegExp && name.match(ignoreName))\n );\n }\n\n // Originally was going to clean the names of any HOCs as well but decided that it might hinder debugging effectively. Will leave here in case\n // private readonly _cleanName = (name: string): string =>\n // name.replace(/.*\\(/g, \"\").replace(/\\)/g, \"\");\n\n /**\n * Traverses through the component tree when a touch happens and logs it.\n * @param e\n */\n // eslint-disable-next-line complexity\n private _onTouchStart(e: { _targetInst?: ElementInstance }): void {\n if (e._targetInst) {\n let currentInst: ElementInstance | undefined = e._targetInst;\n\n let activeLabel: string | undefined;\n let activeDisplayName: string | undefined;\n const componentTreeNames: string[] = [];\n\n while (\n currentInst &&\n // maxComponentTreeSize will always be defined as we have a defaultProps. But ts needs a check so this is here.\n this.props.maxComponentTreeSize &&\n componentTreeNames.length < this.props.maxComponentTreeSize\n ) {\n if (\n // If the loop gets to the boundary itself, break.\n currentInst.elementType?.displayName ===\n TouchEventBoundary.displayName\n ) {\n break;\n }\n\n const props = currentInst.memoizedProps;\n const label =\n typeof props?.[PROP_KEY] !== 'undefined'\n ? `${props[PROP_KEY]}`\n : undefined;\n\n // Check the label first\n if (label && !this._isNameIgnored(label)) {\n if (!activeLabel) {\n activeLabel = label;\n }\n componentTreeNames.push(label);\n } else if (\n typeof props?.accessibilityLabel === 'string' &&\n !this._isNameIgnored(props.accessibilityLabel)\n ) {\n if (!activeLabel) {\n activeLabel = props.accessibilityLabel;\n }\n componentTreeNames.push(props.accessibilityLabel);\n } else if (currentInst.elementType) {\n const { elementType } = currentInst;\n\n if (\n elementType.displayName &&\n !this._isNameIgnored(elementType.displayName)\n ) {\n // Check display name\n if (!activeDisplayName) {\n activeDisplayName = elementType.displayName;\n }\n componentTreeNames.push(elementType.displayName);\n }\n }\n\n currentInst = currentInst.return;\n }\n\n const finalLabel = activeLabel ?? activeDisplayName;\n\n if (componentTreeNames.length > 0 || finalLabel) {\n this._logTouchEvent(componentTreeNames, finalLabel);\n }\n }\n }\n}\n\n/**\n * Convenience Higher-Order-Component for TouchEventBoundary\n * @param WrappedComponent any React Component\n * @param boundaryProps TouchEventBoundaryProps\n */\nconst withTouchEventBoundary = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InnerComponent: React.ComponentType<any>,\n boundaryProps?: TouchEventBoundaryProps\n): React.FunctionComponent => {\n const WrappedComponent: React.FunctionComponent = (props) => (\n <TouchEventBoundary {...(boundaryProps ?? {})}>\n <InnerComponent {...props} />\n </TouchEventBoundary>\n );\n\n WrappedComponent.displayName = 'WithTouchEventBoundary';\n\n return WrappedComponent;\n};\n\nexport { TouchEventBoundary, withTouchEventBoundary };\n"]}
|
package/dist/js/version.d.ts
CHANGED
package/dist/js/version.js
CHANGED
package/dist/js/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_NAME = 'sentry.javascript.react-native';\nexport const SDK_VERSION = '3.4.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_NAME = 'sentry.javascript.react-native';\nexport const SDK_VERSION = '3.4.3';\n"]}
|
package/ios/RNSentry.m
CHANGED
|
@@ -90,13 +90,21 @@ RCT_EXPORT_METHOD(initNativeSdk:(NSDictionary *_Nonnull)options
|
|
|
90
90
|
BOOL enableAutoPerformanceTracking = (BOOL)[mutableOptions valueForKey:@"enableAutoPerformanceTracking"];
|
|
91
91
|
|
|
92
92
|
PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode = enableAutoPerformanceTracking;
|
|
93
|
+
#if TARGET_OS_IPHONE || TARGET_OS_MACCATALYST
|
|
93
94
|
PrivateSentrySDKOnly.framesTrackingMeasurementHybridSDKMode = enableAutoPerformanceTracking;
|
|
95
|
+
#endif
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
[SentrySDK startWithOptionsObject:sentryOptions];
|
|
97
99
|
|
|
100
|
+
#if TARGET_OS_IPHONE || TARGET_OS_MACCATALYST
|
|
101
|
+
BOOL appIsActive = [[UIApplication sharedApplication] applicationState] == UIApplicationStateActive;
|
|
102
|
+
#else
|
|
103
|
+
BOOL appIsActive = [[NSApplication sharedApplication] isActive];
|
|
104
|
+
#endif
|
|
105
|
+
|
|
98
106
|
// If the app is active/in foreground, and we have not sent the SentryHybridSdkDidBecomeActive notification, send it.
|
|
99
|
-
if (
|
|
107
|
+
if (appIsActive && !sentHybridSdkDidBecomeActive && sentryOptions.enableAutoSessionTracking) {
|
|
100
108
|
[[NSNotificationCenter defaultCenter]
|
|
101
109
|
postNotificationName:@"SentryHybridSdkDidBecomeActive"
|
|
102
110
|
object:nil];
|
|
@@ -164,9 +172,9 @@ RCT_EXPORT_METHOD(fetchNativeDeviceContexts:(RCTPromiseResolveBlock)resolve
|
|
|
164
172
|
NSDictionary<NSString *, id> *serializedScope = [scope serialize];
|
|
165
173
|
// Scope serializes as 'context' instead of 'contexts' as it does for the event.
|
|
166
174
|
NSDictionary<NSString *, id> *tempContexts = [serializedScope valueForKey:@"context"];
|
|
167
|
-
|
|
175
|
+
|
|
168
176
|
NSMutableDictionary<NSString *, id> *user = [NSMutableDictionary new];
|
|
169
|
-
|
|
177
|
+
|
|
170
178
|
NSDictionary<NSString *, id> *tempUser = [serializedScope valueForKey:@"user"];
|
|
171
179
|
if (tempUser != nil) {
|
|
172
180
|
[user addEntriesFromDictionary:[tempUser valueForKey:@"user"]];
|
|
@@ -174,7 +182,7 @@ RCT_EXPORT_METHOD(fetchNativeDeviceContexts:(RCTPromiseResolveBlock)resolve
|
|
|
174
182
|
[user setValue:PrivateSentrySDKOnly.installationID forKey:@"id"];
|
|
175
183
|
}
|
|
176
184
|
[contexts setValue:user forKey:@"user"];
|
|
177
|
-
|
|
185
|
+
|
|
178
186
|
if (tempContexts != nil) {
|
|
179
187
|
[contexts setValue:tempContexts forKey:@"context"];
|
|
180
188
|
}
|
|
@@ -215,6 +223,7 @@ RCT_EXPORT_METHOD(fetchNativeFrames:(RCTPromiseResolveBlock)resolve
|
|
|
215
223
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
216
224
|
{
|
|
217
225
|
|
|
226
|
+
#if TARGET_OS_IPHONE || TARGET_OS_MACCATALYST
|
|
218
227
|
if (PrivateSentrySDKOnly.isFramesTrackingRunning) {
|
|
219
228
|
SentryScreenFrames *frames = PrivateSentrySDKOnly.currentScreenFrames;
|
|
220
229
|
|
|
@@ -241,6 +250,9 @@ RCT_EXPORT_METHOD(fetchNativeFrames:(RCTPromiseResolveBlock)resolve
|
|
|
241
250
|
} else {
|
|
242
251
|
resolve(nil);
|
|
243
252
|
}
|
|
253
|
+
#else
|
|
254
|
+
resolve(nil);
|
|
255
|
+
#endif
|
|
244
256
|
}
|
|
245
257
|
|
|
246
258
|
RCT_EXPORT_METHOD(fetchNativeRelease:(RCTPromiseResolveBlock)resolve
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@sentry/react-native",
|
|
3
3
|
"homepage": "https://github.com/getsentry/sentry-react-native",
|
|
4
4
|
"repository": "https://github.com/getsentry/sentry-react-native",
|
|
5
|
-
"version": "3.4.
|
|
5
|
+
"version": "3.4.3",
|
|
6
6
|
"description": "Official Sentry SDK for react-native",
|
|
7
7
|
"typings": "dist/js/index.d.ts",
|
|
8
8
|
"types": "dist/js/index.d.ts",
|