diff --git a/.circleci/config.yml b/.circleci/config.yml index ac8a53781b..a7d80b3a17 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -367,7 +367,6 @@ workflows: - e2e_android - hold_generate_snapshot: type: approval - requires: *release_dependencies - generate_snapshot: requires: - hold_generate_snapshot diff --git a/CHANGELOG.md b/CHANGELOG.md index b844d758c6..f6fb6ab8c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ # Changelog -## [12.4.0](https://github.com/Instabug/Instabug-React-Native/compare/v12.2.0...v12.4.0) (December 6, 2023) +## [Unreleased](https://github.com/Instabug/Instabug-React-Native/compare/v12.4.0...dev) + +### Changed + +- Bump Instabug iOS SDK to v12.5.0 ([#1085](https://github.com/Instabug/Instabug-React-Native/pull/1085)). [See release notes](https://github.com/instabug/instabug-ios/releases/tag/12.5.0). +- Bump Instabug Android SDK to v12.5.1 ([#1088](https://github.com/Instabug/Instabug-React-Native/pull/1085)). See release notes for [v12.5.0](https://github.com/Instabug/android/releases/tag/v12.5.0) and [v12.5.1](https://github.com/Instabug/android/releases/tag/v12.5.1). + +### Fixed + +- Fix a delay issue in reporting the 'Current View' that resulted in displaying outdated values ([#1080](https://github.com/Instabug/Instabug-React-Native/pull/1080)). + +## [12.4.0](https://github.com/Instabug/Instabug-React-Native/compare/v12.2.0...v12.4.0) (December 7, 2023) ### Changed @@ -12,7 +23,7 @@ - Fix an issue with `Instabug.init` on Android causing the app to crash while trying to get the current `Application` instance through the current activity which can be `null` in some cases by utilizing the React context instead ([#1069](https://github.com/Instabug/Instabug-React-Native/pull/1069)). - Fix an issue with unhandled JavaScript crashes not getting linked with the current session causing inaccurate session metrics ([#1071](https://github.com/Instabug/Instabug-React-Native/pull/1071)). -## [12.2.0](https://github.com/Instabug/Instabug-React-Native/compare/v12.2.0...v12.1.0) +## [12.2.0](https://github.com/Instabug/Instabug-React-Native/compare/v12.1.0...v12.2.0) (November 14, 2023) ### Added @@ -29,7 +40,7 @@ - Fix an issue with unhandled JavaScript crashes being reported as native iOS crashes ([#1054](https://github.com/Instabug/Instabug-React-Native/pull/1054)) - Re-enable screenshot capturing for Crash Reporting and Session Replay by removing redundant mapping ([#1055](https://github.com/Instabug/Instabug-React-Native/pull/1055)). -## [12.1.0](https://github.com/Instabug/Instabug-React-Native/compare/v12.1.0...v11.14.0) +## [12.1.0](https://github.com/Instabug/Instabug-React-Native/compare/v11.14.0...v12.1.0) (October 3, 2023) ### Added diff --git a/RNInstabug.podspec b/RNInstabug.podspec index 40c480f4cb..21ae5fc720 100644 --- a/RNInstabug.podspec +++ b/RNInstabug.podspec @@ -16,5 +16,5 @@ Pod::Spec.new do |s| s.source_files = "ios/**/*.{h,m,mm}" s.dependency 'React-Core' - use_instabug!(s) + s.dependency 'Instabug' end diff --git a/android/build.gradle b/android/build.gradle index 1773a81d11..e0d19227a5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,6 +4,17 @@ apply from: './jacoco.gradle' apply from: './native.gradle' apply from: './sourcemaps.gradle' + +rootProject.allprojects { + repositories { + google() + jcenter() + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots' + } + } +} + String getExtOrDefault(String name) { def defaultPropertyKey = 'InstabugReactNative_' + name if (rootProject.ext.has(name)) { @@ -13,12 +24,12 @@ String getExtOrDefault(String name) { } static boolean supportsNamespace() { - def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.') - def major = parsed[0].toInteger() - def minor = parsed[1].toInteger() +// def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.') +// def major = parsed[0].toInteger() +// def minor = parsed[1].toInteger() - // Namespace support was added in 7.3.0 - return (major == 7 && minor >= 3) || major >= 8 + // Namespace support was added in 7.3.0 (disabled for now) + return false } void updateManifestPackage() { diff --git a/android/native.gradle b/android/native.gradle index af50eeab91..51409c6baa 100644 --- a/android/native.gradle +++ b/android/native.gradle @@ -1,5 +1,5 @@ project.ext.instabug = [ - version: '12.4.1' + version: '12.4.0.5503778-SNAPSHOT' ] dependencies { diff --git a/android/src/main/java/com/instabug/reactlibrary/RNInstabug.java b/android/src/main/java/com/instabug/reactlibrary/RNInstabug.java index 7ea469ddbf..9b6348ab43 100644 --- a/android/src/main/java/com/instabug/reactlibrary/RNInstabug.java +++ b/android/src/main/java/com/instabug/reactlibrary/RNInstabug.java @@ -18,7 +18,7 @@ public class RNInstabug { private static RNInstabug instance; - + private RNInstabug() {} @@ -133,4 +133,117 @@ public void setBaseUrlForDeprecationLogs() { e.printStackTrace(); } } + + public static class Builder { + + /** + * Application instance to initialize Instabug. + */ + private Application application; + + /** + * The application token obtained from the Instabug dashboard. + */ + private String applicationToken; + + /** + * The level of detail in logs that you want to print. + */ + private int logLevel = LogLevel.ERROR; + + /** + * The Code Push version to be used for all reports. + */ + private String codePushVersion; + + /** + * The events that trigger the SDK's user interface. + */ + private InstabugInvocationEvent[] invocationEvents; + + + /** + * Initialize Instabug SDK with application token + * + * @param application Application object for initialization of library + * @param applicationToken The app's identifying token, available on your dashboard. + */ + public Builder(Application application, String applicationToken) { + this.application = application; + this.applicationToken = applicationToken; + } + + /** + * Initialize Instabug SDK with application token and invocation trigger events + * + * @param application Application object for initialization of library + * @param applicationToken The app's identifying token, available on your dashboard. + * @param invocationEvents The events that trigger the SDK's user interface. + *

Choose from the available events listed in {@link InstabugInvocationEvent}.

+ */ + public Builder(Application application, String applicationToken, InstabugInvocationEvent... invocationEvents) { + this.application = application; + this.applicationToken = applicationToken; + this.invocationEvents = invocationEvents; + } + + /** + * Sets the filtering level for printed SDK logs. + * + * @param logLevel The log filtering level to be set. + * Choose from {@link LogLevel} constants: + * {@link LogLevel#NONE}, {@link LogLevel#ERROR}, {@link LogLevel#DEBUG}, or {@link LogLevel#VERBOSE}. + *

Default level is {@link LogLevel#ERROR}.

+ */ + public Builder setLogLevel(int logLevel) { + this.logLevel = logLevel; + return this; + } + + /** + * Sets Code Push version to be used for all reports. + * + * @param codePushVersion the Code Push version to work with. + */ + public Builder setCodePushVersion(String codePushVersion) { + this.codePushVersion = codePushVersion; + return this; + } + + /** + * Sets the invocation triggering events for the SDK's user interface + * + * @param invocationEvents The events that trigger the SDK's user interface. + * Choose from the available events listed in {@link InstabugInvocationEvent}. + */ + public Builder setInvocationEvents(InstabugInvocationEvent... invocationEvents) { + this.invocationEvents = invocationEvents; + return this; + } + + /** + * Builds the Instabug instance with the provided configurations. + */ + public void build() { + try { + RNInstabug.getInstance().setBaseUrlForDeprecationLogs(); + RNInstabug.getInstance().setCurrentPlatform(); + + Instabug.Builder instabugBuilder = new Instabug.Builder(application, applicationToken) + .setInvocationEvents(invocationEvents) + .setSdkDebugLogsLevel(logLevel); + + if (codePushVersion != null) { + instabugBuilder.setCodePushVersion(codePushVersion); + } + + instabugBuilder.build(); + + // Temporarily disabling APM hot launches + APM.setHotAppLaunchEnabled(false); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } diff --git a/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java b/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java index d412c62a6d..6692a25972 100644 --- a/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java +++ b/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java @@ -50,6 +50,8 @@ import java.util.Locale; import java.util.Map; +import javax.annotation.Nullable; + /** * The type Rn instabug reactnative module. @@ -117,9 +119,16 @@ public void run() { * Initializes the SDK. * @param token The token that identifies the app. You can find it on your dashboard. * @param invocationEventValues The events that invoke the SDK's UI. + * @param logLevel The level of detail in logs that you want to print. + * @param codePushVersion The Code Push version to be used for all reports. */ @ReactMethod - public void init(final String token, final ReadableArray invocationEventValues, final String logLevel) { + public void init( + final String token, + final ReadableArray invocationEventValues, + final String logLevel, + @Nullable final String codePushVersion + ) { MainThreadHandler.runOnMainThread(new Runnable() { @Override public void run() { @@ -130,7 +139,14 @@ public void run() { final Application application = (Application) reactContext.getApplicationContext(); - RNInstabug.getInstance().init(application, token, parsedLogLevel, invocationEvents); + RNInstabug.Builder builder = new RNInstabug.Builder(application, token) + .setInvocationEvents(invocationEvents) + .setLogLevel(parsedLogLevel); + + if(codePushVersion != null) { + builder.setCodePushVersion(codePushVersion); + } + builder.build(); } }); } @@ -916,6 +932,29 @@ public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) { }); } + /** + * Reports that the screen name been changed (Current View). + * + * @param screenName string containing the screen name + * + */ + @ReactMethod + public void reportCurrentViewChange(final String screenName) { + MainThreadHandler.runOnMainThread(new Runnable() { + @Override + public void run() { + try { + Method method = getMethod(Class.forName("com.instabug.library.Instabug"), "reportCurrentViewChange", String.class); + if (method != null) { + method.invoke(null, screenName); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + /** * Reports that the screen has been changed (Repro Steps) the screen sent to this method will be the 'current view' on the dashboard * diff --git a/android/src/main/java/com/instabug/reactlibrary/utils/ReportUtil.java b/android/src/main/java/com/instabug/reactlibrary/utils/ReportUtil.java index 69fdde015e..a44da18822 100644 --- a/android/src/main/java/com/instabug/reactlibrary/utils/ReportUtil.java +++ b/android/src/main/java/com/instabug/reactlibrary/utils/ReportUtil.java @@ -70,7 +70,7 @@ public static WritableArray parseConsoleLogs(ArrayList consoleLogs) { for(int i = 0; i < consoleLogs.size(); i++) { try { writableArray.pushString(consoleLogs.get(i).toJson()); - } catch (JSONException e) { + } catch (Exception e) { e.printStackTrace(); } diff --git a/android/src/test/java/com/instabug/reactlibrary/RNInstabugReactnativeModuleTest.java b/android/src/test/java/com/instabug/reactlibrary/RNInstabugReactnativeModuleTest.java index 1426f9a1f8..148d71d512 100644 --- a/android/src/test/java/com/instabug/reactlibrary/RNInstabugReactnativeModuleTest.java +++ b/android/src/test/java/com/instabug/reactlibrary/RNInstabugReactnativeModuleTest.java @@ -482,6 +482,18 @@ public void tearDown() { } } + @Test + public void givenString$reportCurrentViewChange_whenQuery_thenShouldCallNativeApiWithString() throws Exception { + // when + rnModule.reportCurrentViewChange("screen"); + Method privateStringMethod = getMethod(Class.forName("com.instabug.library.Instabug"), "reportCurrentViewChange", String.class); + privateStringMethod.setAccessible(true); + + // then + verify(Instabug.class, VerificationModeFactory.times(1)); + privateStringMethod.invoke("reportCurrentViewChange","screen"); + } + @Test public void givenString$reportScreenChange_whenQuery_thenShouldCallNativeApiWithString() throws Exception { // when diff --git a/android/src/test/java/com/instabug/reactlibrary/RNInstabugTest.java b/android/src/test/java/com/instabug/reactlibrary/RNInstabugTest.java index df169df1e1..fde1fc8d01 100644 --- a/android/src/test/java/com/instabug/reactlibrary/RNInstabugTest.java +++ b/android/src/test/java/com/instabug/reactlibrary/RNInstabugTest.java @@ -10,6 +10,7 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.Application; @@ -112,6 +113,139 @@ public void testSetDeprecationBaseUrl() { reflected.verify(() -> MockReflected.setBaseUrl(any())); } + + @Test + public void testBuildWithoutLogLevelShouldSetLogLevelToError() { + final String token = "fde...."; + + + MockedConstruction mInstabugBuilder = mockConstruction(Instabug.Builder.class, (mock, context) -> { + String actualToken = (String) context.arguments().get(1); + // Initializes Instabug with the correct token + assertEquals(token, actualToken); + when(mock.setSdkDebugLogsLevel(anyInt())).thenReturn(mock); + when(mock.setInvocationEvents(any())).thenReturn(mock); + }); + + new RNInstabug.Builder(mContext, token) + .build(); + + Instabug.Builder builder = mInstabugBuilder.constructed().get(0); + + verify(builder).setSdkDebugLogsLevel(LogLevel.ERROR); + verify(builder).setInvocationEvents(null); + verify(builder).build(); + + +// verify(sut).setBaseUrlForDeprecationLogs(); +// verify(sut).setCurrentPlatform(); + + + mInstabugBuilder.close(); + } + + @Test + public void testBuildWithVerboseLogLevel() { + final String token = "fde...."; + final int logLevel = LogLevel.VERBOSE; + + + MockedConstruction mInstabugBuilder = mockConstruction(Instabug.Builder.class, (mock, context) -> { + String actualToken = (String) context.arguments().get(1); + // Initializes Instabug with the correct token + assertEquals(token, actualToken); + when(mock.setSdkDebugLogsLevel(anyInt())).thenReturn(mock); + when(mock.setInvocationEvents(any())).thenReturn(mock); + }); + + new RNInstabug.Builder(mContext, token) + .setLogLevel(logLevel) + .build(); + + Instabug.Builder builder = mInstabugBuilder.constructed().get(0); + + verify(builder).setSdkDebugLogsLevel(logLevel); + verify(builder).setInvocationEvents(null); + verify(builder).build(); + + + verify(sut).setBaseUrlForDeprecationLogs(); + verify(sut).setCurrentPlatform(); + + + mInstabugBuilder.close(); + } + + @Test + public void testBuildWithInvocationEvents() { + final InstabugInvocationEvent[] invocationEvents = new InstabugInvocationEvent[]{InstabugInvocationEvent.FLOATING_BUTTON}; + final String token = "fde...."; + + + MockedConstruction mInstabugBuilder = mockConstruction(Instabug.Builder.class, (mock, context) -> { + String actualToken = (String) context.arguments().get(1); + // Initializes Instabug with the correct token + assertEquals(token, actualToken); + when(mock.setSdkDebugLogsLevel(anyInt())).thenReturn(mock); + when(mock.setInvocationEvents(any())).thenReturn(mock); + }); + + new RNInstabug.Builder(mContext, token) + .setInvocationEvents(invocationEvents) + .build(); + + Instabug.Builder builder = mInstabugBuilder.constructed().get(0); + + verify(builder).setSdkDebugLogsLevel(LogLevel.ERROR); + verify(builder).setInvocationEvents(invocationEvents); + verify(builder).build(); + + +// verify(sut).setBaseUrlForDeprecationLogs(); +// verify(sut).setCurrentPlatform(); + + + mInstabugBuilder.close(); + } + + @Test + public void testBuildWithCodePushVersion() { + final InstabugInvocationEvent[] invocationEvents = new InstabugInvocationEvent[]{InstabugInvocationEvent.FLOATING_BUTTON}; + final String token = "fde...."; + final String codePushVersion = "1.0.0(1)"; + + + MockedConstruction mInstabugBuilder = mockConstruction(Instabug.Builder.class, (mock, context) -> { + String actualToken = (String) context.arguments().get(1); + // Initializes Instabug with the correct token + assertEquals(token, actualToken); + when(mock.setSdkDebugLogsLevel(anyInt())).thenReturn(mock); + when(mock.setInvocationEvents(any())).thenReturn(mock); + when(mock.setCodePushVersion(any())).thenReturn(mock); + }); + + new RNInstabug.Builder(mContext, token) + .setLogLevel(LogLevel.ERROR) + .setInvocationEvents(null) + .setCodePushVersion(codePushVersion) + .build(); + + Instabug.Builder builder = mInstabugBuilder.constructed().get(0); + + verify(builder).setSdkDebugLogsLevel(LogLevel.ERROR); + verify(builder).setCodePushVersion(codePushVersion); + verify(builder).setInvocationEvents(null); + verify(builder).build(); + + +// verify(sut).setBaseUrlForDeprecationLogs(); +// verify(sut).setCurrentPlatform(); + + verifyNoMoreInteractions(sut); + + + mInstabugBuilder.close(); + } } diff --git a/examples/default/babel.config.js b/examples/default/babel.config.js index f842b77fcf..983e075de7 100644 --- a/examples/default/babel.config.js +++ b/examples/default/babel.config.js @@ -1,3 +1,4 @@ module.exports = { presets: ['module:metro-react-native-babel-preset'], + plugins: ['react-native-reanimated/plugin'], }; diff --git a/examples/default/index.js b/examples/default/index.js index ab752cb6e3..9733db05ea 100644 --- a/examples/default/index.js +++ b/examples/default/index.js @@ -1,3 +1,4 @@ +import 'react-native-gesture-handler'; import { AppRegistry } from 'react-native'; import { name as appName } from './app.json'; diff --git a/examples/default/ios/InstabugTests/InstabugSampleTests.m b/examples/default/ios/InstabugTests/InstabugSampleTests.m index 2e6445b5ba..05e085ee3d 100644 --- a/examples/default/ios/InstabugTests/InstabugSampleTests.m +++ b/examples/default/ios/InstabugTests/InstabugSampleTests.m @@ -65,12 +65,17 @@ - (void)testSetEnabled { } - (void)testInit { + id mock = OCMClassMock([Instabug class]); IBGInvocationEvent floatingButtonInvocationEvent = IBGInvocationEventFloatingButton; NSString *appToken = @"app_token"; + NSString *codePushVersion = @"1.0.0(1)"; NSArray *invocationEvents = [NSArray arrayWithObjects:[NSNumber numberWithInteger:floatingButtonInvocationEvent], nil]; IBGSDKDebugLogsLevel sdkDebugLogsLevel = IBGSDKDebugLogsLevelDebug; + + OCMStub([mock setCodePushVersion:codePushVersion]); - [self.instabugBridge init:appToken invocationEvents:invocationEvents debugLogsLevel:sdkDebugLogsLevel]; + [self.instabugBridge init:appToken invocationEvents:invocationEvents debugLogsLevel:sdkDebugLogsLevel codePushVersion:codePushVersion]; + OCMVerify([mock setCodePushVersion:codePushVersion]); OCMVerify([self.mRNInstabug initWithToken:appToken invocationEvents:floatingButtonInvocationEvent debugLogsLevel:sdkDebugLogsLevel]); } diff --git a/examples/default/ios/InstabugTests/RNInstabugTests.m b/examples/default/ios/InstabugTests/RNInstabugTests.m index 9ceed36621..7f1ddcd00f 100644 --- a/examples/default/ios/InstabugTests/RNInstabugTests.m +++ b/examples/default/ios/InstabugTests/RNInstabugTests.m @@ -68,4 +68,11 @@ - (void)testInitWithLogsLevel { OCMVerify([self.mIBGNetworkLogger setEnabled:YES]); } +- (void) testSetCodePushVersion { + NSString *codePushVersion = @"1.0.0(1)"; + [RNInstabug setCodePushVersion:codePushVersion]; + + OCMVerify([self.mInstabug setCodePushVersion:codePushVersion]); +} + @end diff --git a/examples/default/ios/Podfile b/examples/default/ios/Podfile index b47b0b248c..acaf5db699 100644 --- a/examples/default/ios/Podfile +++ b/examples/default/ios/Podfile @@ -26,7 +26,7 @@ target 'InstabugExample' do # Flags change depending on the env values. flags = get_default_flags() - + pod 'Instabug', :podspec => 'https://ios-releases.instabug.com/custom/custom-build-force-set-codepush/12.4.3/Instabug.podspec' use_react_native!( :path => config[:reactNativePath], # Hermes is now enabled by default. Disable by setting this flag to false. diff --git a/examples/default/ios/Podfile.lock b/examples/default/ios/Podfile.lock index 4e63cac81d..f426c19d2d 100644 --- a/examples/default/ios/Podfile.lock +++ b/examples/default/ios/Podfile.lock @@ -73,7 +73,7 @@ PODS: - hermes-engine (0.72.3): - hermes-engine/Pre-built (= 0.72.3) - hermes-engine/Pre-built (0.72.3) - - Instabug (12.4.0) + - Instabug (12.4.3) - libevent (2.1.12) - OCMock (3.9.1) - OpenSSL-Universal (1.1.1100) @@ -379,6 +379,8 @@ PODS: - glog - react-native-safe-area-context (4.7.1): - React-Core + - react-native-slider (4.4.3): + - React-Core - React-NativeModulesApple (0.72.3): - hermes-engine - React-callinvoker @@ -489,9 +491,41 @@ PODS: - React-jsi (= 0.72.3) - React-logger (= 0.72.3) - React-perflogger (= 0.72.3) + - RNGestureHandler (2.13.4): + - RCT-Folly (= 2021.07.22.00) + - React-Core - RNInstabug (12.4.0): - - Instabug (= 12.4.0) + - Instabug + - React-Core + - RNReanimated (3.5.4): + - DoubleConversion + - FBLazyVector + - glog + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-callinvoker - React-Core + - React-Core/DevSupport + - React-Core/RCTWebSocket + - React-CoreModules + - React-cxxreact + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-RCTActionSheet + - React-RCTAnimation + - React-RCTAppDelegate + - React-RCTBlob + - React-RCTImage + - React-RCTLinking + - React-RCTNetwork + - React-RCTSettings + - React-RCTText + - ReactCommon/turbomodule/core + - Yoga - RNScreens (3.24.0): - React-Core - React-RCTImage @@ -531,6 +565,7 @@ DEPENDENCIES: - FlipperKit/SKIOSNetworkPlugin (= 0.182.0) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - Instabug (from `https://ios-releases.instabug.com/custom/custom-build-force-set-codepush/12.4.3/Instabug.podspec`) - libevent (~> 2.1.12) - OCMock - OpenSSL-Universal (= 1.1.1100) @@ -552,6 +587,7 @@ DEPENDENCIES: - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - "react-native-slider (from `../node_modules/@react-native-community/slider`)" - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) @@ -569,7 +605,9 @@ DEPENDENCIES: - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNInstabug (from `../node_modules/instabug-reactnative`) + - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNSVG (from `../node_modules/react-native-svg`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) @@ -587,7 +625,6 @@ SPEC REPOS: - Flipper-PeerTalk - FlipperKit - fmt - - Instabug - libevent - OCMock - OpenSSL-Universal @@ -608,6 +645,8 @@ EXTERNAL SOURCES: hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2023-03-20-RNv0.72.0-49794cfc7c81fb8f69fd60c3bbf85a7480cc5a77 + Instabug: + :podspec: https://ios-releases.instabug.com/custom/custom-build-force-set-codepush/12.4.3/Instabug.podspec RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -640,6 +679,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/logger" react-native-safe-area-context: :path: "../node_modules/react-native-safe-area-context" + react-native-slider: + :path: "../node_modules/@react-native-community/slider" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: @@ -674,8 +715,12 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/utils" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" RNInstabug: :path: "../node_modules/instabug-reactnative" + RNReanimated: + :path: "../node_modules/react-native-reanimated" RNScreens: :path: "../node_modules/react-native-screens" RNSVG: @@ -702,7 +747,7 @@ SPEC CHECKSUMS: fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b hermes-engine: 10fbd3f62405c41ea07e71973ea61e1878d07322 - Instabug: 83bde9d7d4b582ea8f14935f79f1ce39af55e149 + Instabug: a45124475f99fb282c4765c632b17b3b3bb1d625 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OCMock: 9491e4bec59e0b267d52a9184ff5605995e74be8 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c @@ -722,6 +767,7 @@ SPEC CHECKSUMS: React-jsinspector: b511447170f561157547bc0bef3f169663860be7 React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95 react-native-safe-area-context: 9697629f7b2cda43cf52169bb7e0767d330648c2 + react-native-slider: 1cdd6ba29675df21f30544253bf7351d3c2d68c4 React-NativeModulesApple: c57f3efe0df288a6532b726ad2d0322a9bf38472 React-perflogger: 6bd153e776e6beed54c56b0847e1220a3ff92ba5 React-RCTActionSheet: c0b62af44e610e69d9a2049a682f5dba4e9dff17 @@ -739,7 +785,9 @@ SPEC CHECKSUMS: React-runtimescheduler: 837c1bebd2f84572db17698cd702ceaf585b0d9a React-utils: bcb57da67eec2711f8b353f6e3d33bd8e4b2efa3 ReactCommon: 3ccb8fb14e6b3277e38c73b0ff5e4a1b8db017a9 - RNInstabug: ae604474d8e74d7bd2bee96ccbcfd9d7e12a61fe + RNGestureHandler: 6e46dde1f87e5f018a54fe5d40cd0e0b942b49ee + RNInstabug: a0c5e130f55637d0e41d4070f7cb37f1798d7226 + RNReanimated: ab2e96c6d5591c3dfbb38a464f54c8d17fb34a87 RNScreens: b21dc57dfa2b710c30ec600786a3fc223b1b92e7 RNSVG: 80584470ff1ffc7994923ea135a3e5ad825546b9 RNVectorIcons: 8b5bb0fa61d54cd2020af4f24a51841ce365c7e9 @@ -747,6 +795,6 @@ SPEC CHECKSUMS: Yoga: 8796b55dba14d7004f980b54bcc9833ee45b28ce YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: d169b4508f413ff5d69cdf38428960e0828e6282 +PODFILE CHECKSUM: 52f1fceaac9b4e47ad2048fb3af43584062fb977 -COCOAPODS: 1.11.3 +COCOAPODS: 1.13.0 diff --git a/examples/default/package.json b/examples/default/package.json index 26592d3f75..608dd04396 100644 --- a/examples/default/package.json +++ b/examples/default/package.json @@ -6,9 +6,11 @@ "android": "react-native run-android", "ios": "react-native run-ios", "start": "react-native start", - "lint": "eslint ." + "lint": "eslint .", + "postinstall": "patch-package" }, "dependencies": { + "@react-native-community/slider": "^4.4.3", "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.12", @@ -16,6 +18,8 @@ "native-base": "^3.4.28", "react": "18.2.0", "react-native": "0.72.3", + "react-native-gesture-handler": "^2.13.4", + "react-native-reanimated": "^3.5.4", "react-native-safe-area-context": "^4.5.3", "react-native-screens": "^3.20.0", "react-native-svg": "^13.9.0", @@ -34,6 +38,7 @@ "detox": "^20.9.0", "jest": "^29.2.1", "metro-react-native-babel-preset": "0.77.0", + "patch-package": "^8.0.0", "react-test-renderer": "18.2.0", "ts-jest": "^29.1.0", "typescript": "5.1.6" diff --git a/examples/default/patches/react-native+0.72.3.patch b/examples/default/patches/react-native+0.72.3.patch new file mode 100644 index 0000000000..e8b2e89654 --- /dev/null +++ b/examples/default/patches/react-native+0.72.3.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/react-native/third-party-podspecs/boost.podspec b/node_modules/react-native/third-party-podspecs/boost.podspec +index 3d9331c..bbbb738 100644 +--- a/node_modules/react-native/third-party-podspecs/boost.podspec ++++ b/node_modules/react-native/third-party-podspecs/boost.podspec +@@ -10,7 +10,7 @@ Pod::Spec.new do |spec| + spec.homepage = 'http://www.boost.org' + spec.summary = 'Boost provides free peer-reviewed portable C++ source libraries.' + spec.authors = 'Rene Rivera' +- spec.source = { :http => 'https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2', ++ spec.source = { :http => 'https://archives.boost.io/release/1.76.0/source/boost_1_76_0.tar.bz2', + :sha256 => 'f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41' } + + # Pinning to the same version as React.podspec. diff --git a/examples/default/src/App.tsx b/examples/default/src/App.tsx index fbd116e5aa..6dff03618d 100644 --- a/examples/default/src/App.tsx +++ b/examples/default/src/App.tsx @@ -1,5 +1,7 @@ import React, { useEffect } from 'react'; +import { StyleSheet } from 'react-native'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { NavigationContainer } from '@react-navigation/native'; import Instabug, { InvocationEvent, LogLevel } from 'instabug-reactnative'; import { NativeBaseProvider } from 'native-base'; @@ -18,10 +20,18 @@ export const App: React.FC = () => { }, []); return ( - - - - - + + + + + + + ); }; + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, +}); diff --git a/examples/default/src/components/Screen.tsx b/examples/default/src/components/Screen.tsx index 63745b8cbe..c0f296aaa8 100644 --- a/examples/default/src/components/Screen.tsx +++ b/examples/default/src/components/Screen.tsx @@ -4,7 +4,7 @@ import { VStack } from 'native-base'; export const Screen: React.FC = ({ children }) => { return ( - + {children} ); diff --git a/examples/default/src/components/Section.tsx b/examples/default/src/components/Section.tsx new file mode 100644 index 0000000000..eed7586e2b --- /dev/null +++ b/examples/default/src/components/Section.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Heading, VStack } from 'native-base'; + +interface SectionProps { + title: string; + flex?: number; + children?: React.ReactNode; +} + +export const Section: React.FC = ({ title, flex, children }) => { + return ( + + + {title} + + + {children} + + ); +}; diff --git a/examples/default/src/images/logo.png b/examples/default/src/images/logo.png new file mode 100644 index 0000000000..4d71f0134c Binary files /dev/null and b/examples/default/src/images/logo.png differ diff --git a/examples/default/src/navigation/HomeStack.tsx b/examples/default/src/navigation/HomeStack.tsx index 737a257558..360a274448 100644 --- a/examples/default/src/navigation/HomeStack.tsx +++ b/examples/default/src/navigation/HomeStack.tsx @@ -8,6 +8,12 @@ import { FeatureRequestsScreen } from '../screens/FeatureRequestsScreen'; import { HomeScreen } from '../screens/HomeScreen'; import { RepliesScreen } from '../screens/RepliesScreen'; import { SurveysScreen } from '../screens/SurveysScreen'; +import { UserStepsScreen } from '../screens/user-steps/UserStepsScreen'; +import { BasicComponentsScreen } from '../screens/user-steps/BasicComponentsScreen'; +import { ScrollViewScreen } from '../screens/user-steps/ScrollViewScreen'; +import { FlatListScreen } from '../screens/user-steps/FlatListScreen'; +import { SectionListScreen } from '../screens/user-steps/SectionListScreen'; +import { GesturesScreen } from '../screens/user-steps/GesturesScreen'; export type HomeStackParamList = { Home: undefined; @@ -16,6 +22,12 @@ export type HomeStackParamList = { FeatureRequests: undefined; Replies: undefined; Surveys: undefined; + UserSteps: undefined; + BasicComponents: undefined; + ScrollView: undefined; + FlatList: undefined; + SectionList: undefined; + Gestures: undefined; }; const HomeStack = createNativeStackNavigator(); @@ -41,6 +53,32 @@ export const HomeStackNavigator: React.FC = () => { /> + + + + + + ); }; diff --git a/examples/default/src/screens/HomeScreen.tsx b/examples/default/src/screens/HomeScreen.tsx index cf74a1d435..8ec8bd65f7 100644 --- a/examples/default/src/screens/HomeScreen.tsx +++ b/examples/default/src/screens/HomeScreen.tsx @@ -16,6 +16,7 @@ export const HomeScreen: React.FC navigation.navigate('FeatureRequests')} /> navigation.navigate('Replies')} /> navigation.navigate('Surveys')} /> + navigation.navigate('UserSteps')} /> ); }; diff --git a/examples/default/src/screens/user-steps/BasicComponentsScreen.tsx b/examples/default/src/screens/user-steps/BasicComponentsScreen.tsx new file mode 100644 index 0000000000..4149ad5e80 --- /dev/null +++ b/examples/default/src/screens/user-steps/BasicComponentsScreen.tsx @@ -0,0 +1,134 @@ +import React, { useState } from 'react'; +import { + Alert, + Button, + Image, + Pressable, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + Switch, + useWindowDimensions, + ActivityIndicator, +} from 'react-native'; +import Slider from '@react-native-community/slider'; +import { Center, HStack, ScrollView, VStack } from 'native-base'; + +import { Screen } from '../../components/Screen'; +import { Section } from '../../components/Section'; +import { nativeBaseTheme } from '../../theme/nativeBaseTheme'; + +/** + * A screen that demonstates the usage of user steps with basic React Native components. + * + * This specific screen doesn't use NativeBase in some parts since we need to focus on + * capturing React Native provided components rather than implementations built on top of it. + */ +export const BasicComponentsScreen: React.FC = () => { + const [isSwitchOn, setIsSwitchOn] = useState(false); + const { width } = useWindowDimensions(); + + const onPress = (label: string) => { + return () => { + Alert.alert(`Pressed "${label}"`); + }; + }; + + return ( + + +
+ + Lorem ipsum, dolor sit amet consectetur adipisicing elit. Alias tempore inventore quas + cum cupiditate ratione, iusto itaque natus maiores fugit. + +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ +
+ + + Is Switch On + +
+ +
+ +
+ +
+ +
+
+
+ ); +}; + +const formControlStyles = StyleSheet.create({ + formControl: { + paddingVertical: 16, + paddingHorizontal: 24, + fontSize: 16, + borderRadius: 5, + }, +}); + +const styles = StyleSheet.create({ + text: { + fontSize: 16, + lineHeight: 24, + }, + image: { + resizeMode: 'contain', + }, + textInput: StyleSheet.flatten([ + formControlStyles.formControl, + { + backgroundColor: 'white', + borderWidth: 1, + borderColor: '#ccc', + }, + ]), + buttonText: { + color: 'white', + textAlign: 'center', + fontWeight: 'bold', + }, + button: StyleSheet.flatten([ + formControlStyles.formControl, + { + backgroundColor: nativeBaseTheme.colors.primary[600], + }, + ]), +}); diff --git a/examples/default/src/screens/user-steps/FlatListScreen.tsx b/examples/default/src/screens/user-steps/FlatListScreen.tsx new file mode 100644 index 0000000000..7ab8caa2ef --- /dev/null +++ b/examples/default/src/screens/user-steps/FlatListScreen.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { FlatList, RefreshControl } from 'react-native'; +import { Skeleton } from 'native-base'; + +import { Screen } from '../../components/Screen'; +import { Section } from '../../components/Section'; +import { createList } from '../../utils/createList'; +import { useDelayedRefresh } from '../../utils/useDelayedRefresh'; + +export const FlatListScreen: React.FC = () => { + const { refreshing, onRefresh } = useDelayedRefresh(); + + return ( + +
+ item.toString()} + renderItem={() => ( + + )} + /> +
+ +
+ } + data={createList(20)} + keyExtractor={(item) => item.toString()} + renderItem={() => ( + + )} + /> +
+
+ ); +}; diff --git a/examples/default/src/screens/user-steps/GesturesScreen.tsx b/examples/default/src/screens/user-steps/GesturesScreen.tsx new file mode 100644 index 0000000000..655a85b8de --- /dev/null +++ b/examples/default/src/screens/user-steps/GesturesScreen.tsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { Alert, ScrollView } from 'react-native'; + +import Animated, { runOnJS, useAnimatedStyle, useSharedValue } from 'react-native-reanimated'; +import { Gesture, GestureDetector, Swipeable } from 'react-native-gesture-handler'; +import { Box, Center, Text } from 'native-base'; + +import { Screen } from '../../components/Screen'; +import { Section } from '../../components/Section'; + +const AnimatedBox = Animated.createAnimatedComponent(Box); + +export const GesturesScreen: React.FC = () => { + const showAlert = (message: string) => { + Alert.alert(message); + }; + + const tapGesture = Gesture.Tap() + .maxDuration(250) + .onStart(() => { + runOnJS(showAlert)('Tapped.'); + }); + + const doubleTapGesture = Gesture.Tap() + .maxDuration(250) + .numberOfTaps(2) + .onStart(() => { + runOnJS(showAlert)('Double tapped.'); + }); + + const scale = useSharedValue(1); + const savedScale = useSharedValue(1); + const pinchGesture = Gesture.Pinch() + .onUpdate((e) => { + scale.value = savedScale.value * e.scale; + }) + .onEnd(() => { + savedScale.value = scale.value; + }); + const pinchStyle = useAnimatedStyle(() => ({ transform: [{ scale: scale.value }] })); + + return ( + + +
+ +
+ + Tap + +
+
+
+ +
+ +
+ + Double Tap + +
+
+
+ +
+ } + renderRightActions={() => }> +
+ + Swipe + +
+
+
+ +
+
+ + + +
+
+
+
+ ); +}; diff --git a/examples/default/src/screens/user-steps/ScrollViewScreen.tsx b/examples/default/src/screens/user-steps/ScrollViewScreen.tsx new file mode 100644 index 0000000000..f0eab8e3ff --- /dev/null +++ b/examples/default/src/screens/user-steps/ScrollViewScreen.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import { Screen } from '../../components/Screen'; +import { RefreshControl, ScrollView } from 'react-native'; +import { VStack, Skeleton, HStack } from 'native-base'; +import { createList } from '../../utils/createList'; +import { Section } from '../../components/Section'; +import { useDelayedRefresh } from '../../utils/useDelayedRefresh'; + +export const ScrollViewScreen: React.FC = () => { + const { refreshing, onRefresh } = useDelayedRefresh(); + + return ( + +
+ + + {createList(10).map((num) => ( + + ))} + + +
+ +
+ }> + + {createList(20).map((num) => ( + + ))} + + +
+
+ ); +}; diff --git a/examples/default/src/screens/user-steps/SectionListScreen.tsx b/examples/default/src/screens/user-steps/SectionListScreen.tsx new file mode 100644 index 0000000000..f392129b08 --- /dev/null +++ b/examples/default/src/screens/user-steps/SectionListScreen.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { RefreshControl, SectionList } from 'react-native'; +import { Heading, Skeleton } from 'native-base'; + +import { Screen } from '../../components/Screen'; +import { createList } from '../../utils/createList'; +import { useDelayedRefresh } from '../../utils/useDelayedRefresh'; + +const sections = [ + { + title: 'Section A', + data: createList(10), + }, + { + title: 'Section B', + data: createList(10), + }, +]; + +export const SectionListScreen: React.FC = () => { + const { refreshing, onRefresh } = useDelayedRefresh(); + + return ( + + } + sections={sections} + keyExtractor={(item) => item.toString()} + renderSectionHeader={(info) => ( + + {info.section.title} + + )} + renderItem={() => ( + + )} + /> + + ); +}; diff --git a/examples/default/src/screens/user-steps/UserStepsScreen.tsx b/examples/default/src/screens/user-steps/UserStepsScreen.tsx new file mode 100644 index 0000000000..219cd5bbd6 --- /dev/null +++ b/examples/default/src/screens/user-steps/UserStepsScreen.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +import { ListTile } from '../../components/ListTile'; +import { Screen } from '../../components/Screen'; +import type { HomeStackParamList } from '../../navigation/HomeStack'; +import type { NativeStackScreenProps } from '@react-navigation/native-stack'; + +export const UserStepsScreen: React.FC> = ({ + navigation, +}) => { + return ( + + navigation.navigate('BasicComponents')} /> + navigation.navigate('ScrollView')} /> + navigation.navigate('FlatList')} /> + navigation.navigate('SectionList')} /> + navigation.navigate('Gestures')} /> + + ); +}; diff --git a/examples/default/src/utils/createList.ts b/examples/default/src/utils/createList.ts new file mode 100644 index 0000000000..1719c2d75c --- /dev/null +++ b/examples/default/src/utils/createList.ts @@ -0,0 +1,3 @@ +export function createList(length: number) { + return Array.from({ length }, (_, i) => i + 1); +} diff --git a/examples/default/src/utils/useDelayedRefresh.ts b/examples/default/src/utils/useDelayedRefresh.ts new file mode 100644 index 0000000000..813acc0c94 --- /dev/null +++ b/examples/default/src/utils/useDelayedRefresh.ts @@ -0,0 +1,18 @@ +import { useState } from 'react'; + +export function useDelayedRefresh() { + const [refreshing, setIsRefreshing] = useState(false); + + const onRefresh = () => { + if (refreshing) { + return; + } + + setIsRefreshing(true); + setTimeout(() => { + setIsRefreshing(false); + }, 1000); + }; + + return { refreshing, onRefresh }; +} diff --git a/examples/default/yarn.lock b/examples/default/yarn.lock index 9a695546a7..f036714d72 100644 --- a/examples/default/yarn.lock +++ b/examples/default/yarn.lock @@ -93,7 +93,7 @@ "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.22.11": +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== @@ -133,6 +133,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" @@ -162,6 +167,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-module-imports@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" @@ -180,6 +192,17 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -246,6 +269,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + "@babel/helper-validator-option@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" @@ -741,6 +769,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" +"@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/plugin-transform-modules-systemjs@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" @@ -790,6 +827,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-transform-object-assign@^7.16.7": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.22.5.tgz#290c1b9555dcea48bb2c29ad94237777600d04f9" + integrity sha512-iDhx9ARkXq4vhZ2CYOSnQXkmxkDgosLi3J8Z17mKz7LyzthtkdVchLD7WZ3aXeCuvJDOW3+1I5TpJmwIbF9MKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-object-rest-spread@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" @@ -963,6 +1007,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + "@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234" @@ -1121,6 +1175,17 @@ "@babel/plugin-transform-modules-commonjs" "^7.22.5" "@babel/plugin-transform-typescript" "^7.22.5" +"@babel/preset-typescript@^7.16.7": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" + "@babel/register@^7.13.16": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.5.tgz#e4d8d0f615ea3233a27b5c6ada6750ee59559939" @@ -1178,7 +1243,7 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" -"@babel/types@^7.23.0": +"@babel/types@^7.22.15", "@babel/types@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== @@ -1192,6 +1257,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@egjs/hammerjs@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" + integrity sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A== + dependencies: + "@types/hammerjs" "^2.0.36" + "@formatjs/ecma402-abstract@1.17.0": version "1.17.0" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz#2ce191a3bde4c65c6684e03fa247062a4a294b9e" @@ -2126,6 +2198,11 @@ prompts "^2.4.0" semver "^6.3.0" +"@react-native-community/slider@^4.4.3": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@react-native-community/slider/-/slider-4.4.3.tgz#9b9dc639b88f5bfda72bd72a9dff55cbf9f777ed" + integrity sha512-WdjvGtqJfqcCiLwtbzie53Z/H6w6dIfRHhlW832D89ySAdE5DxLAsqRhDOG0eacuAxxEB+T9sGCkVMD0fa3aBg== + "@react-native/assets-registry@^0.72.0": version "0.72.0" resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" @@ -2779,6 +2856,11 @@ dependencies: "@types/node" "*" +"@types/hammerjs@^2.0.36": + version "2.0.43" + resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.43.tgz#8660dd1e0e5fd979395e2f999e670cdb9484d1e9" + integrity sha512-wqxfwHk83RS7+6OpytGdo5wqkqtvx+bGaIs1Rwm5NrtQHUfL4OgWs/5p0OipmjmT+fexePh37Ek+mqIpdNjQKA== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -2883,6 +2965,11 @@ dependencies: "@types/yargs-parser" "*" +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -3010,6 +3097,11 @@ async@^3.2.2: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -3264,6 +3356,15 @@ caf@^15.0.1: resolved "https://registry.yarnpkg.com/caf/-/caf-15.0.1.tgz#28f1f17bd93dc4b5d95207ad07066eddf4768160" integrity sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ== +call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -3344,6 +3445,11 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + cjs-module-lexer@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" @@ -3658,6 +3764,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" @@ -4014,6 +4129,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -4057,6 +4179,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4072,6 +4204,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + funpermaproxy@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/funpermaproxy/-/funpermaproxy-1.1.0.tgz#39cb0b8bea908051e4608d8a414f1d87b55bf557" @@ -4087,6 +4224,16 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -4136,6 +4283,13 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -4151,6 +4305,23 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -4158,6 +4329,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + hermes-estree@0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.12.0.tgz#8a289f9aee854854422345e6995a48613bac2ca8" @@ -4189,6 +4367,13 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" +hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -4322,6 +4507,11 @@ is-directory@^0.3.1: resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -4374,6 +4564,18 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -4933,6 +5135,16 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-stable-stringify@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz#43d39c7c8da34bfaf785a61a56808b0def9f747d" + integrity sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -4954,11 +5166,23 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -5071,7 +5295,7 @@ lodash.uniqueid@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz#3268f26a7c88e4f4b1758d679271814e31fa5b26" integrity sha512-GQQWaIeGlL6DIIr06kj1j6sSmBxyNMwI8kaX9aKpHR/XsMTiaXDVPNPAkiboOTK9OJpTJF/dXT3xYoFQnj386Q== -lodash@^4.17.11: +lodash@^4.17.11, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5661,7 +5885,7 @@ metro@0.79.1: ws "^7.5.1" yargs "^17.6.2" -micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -5927,6 +6151,11 @@ object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -5967,6 +6196,14 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -5982,6 +6219,11 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -6045,6 +6287,27 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6230,7 +6493,7 @@ react-freeze@^1.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-is@^16.13.0, react-is@^16.13.1: +react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -6240,6 +6503,27 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-native-gesture-handler@^2.13.4: + version "2.13.4" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.13.4.tgz#6a99384330278c4488bcfc7f1814be3e0d7401fd" + integrity sha512-smpYOVbvWABpq2H+lmDnfOLCTH934aUPO1w2/pQXvm1j+M/vmGQmvgRDJOpXcks17HLtNNKXD6tcODf3aPqDfA== + dependencies: + "@egjs/hammerjs" "^2.0.17" + hoist-non-react-statics "^3.3.0" + invariant "^2.2.4" + lodash "^4.17.21" + prop-types "^15.7.2" + +react-native-reanimated@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.5.4.tgz#a6c2b0c43b6dad246f5d276213974afedb8e3fc7" + integrity sha512-8we9LLDO1o4Oj9/DICeEJ2K1tjfqkJagqQUglxeUAkol/HcEJ6PGxIrpBcNryLqCDYEcu6FZWld/FzizBIw6bg== + dependencies: + "@babel/plugin-transform-object-assign" "^7.16.7" + "@babel/preset-typescript" "^7.16.7" + convert-source-map "^2.0.0" + invariant "^2.2.4" + react-native-safe-area-context@^4.5.3: version "4.7.1" resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.7.1.tgz#b7be2d68dee909717cfa439bb5c7966042d231e8" @@ -6484,6 +6768,13 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -6604,6 +6895,16 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -6650,6 +6951,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -6916,6 +7222,13 @@ tinycolor2@^1.4.2: resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -7254,6 +7567,11 @@ yaml@^2.2.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== +yaml@^2.2.2: + version "2.3.4" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" diff --git a/ios/RNInstabug/InstabugReactBridge.h b/ios/RNInstabug/InstabugReactBridge.h index cc90bb86c1..24baf146a3 100644 --- a/ios/RNInstabug/InstabugReactBridge.h +++ b/ios/RNInstabug/InstabugReactBridge.h @@ -27,7 +27,7 @@ - (void)setEnabled:(BOOL)isEnabled; -- (void)init:(NSString *)token invocationEvents:(NSArray *)invocationEventsArray debugLogsLevel:(IBGSDKDebugLogsLevel)sdkDebugLogsLevel; +- (void)init:(NSString *)token invocationEvents:(NSArray *)invocationEventsArray debugLogsLevel:(IBGSDKDebugLogsLevel)sdkDebugLogsLevel codePushVersion:(NSString *)codePushVersion; - (void)setUserData:(NSString *)userData; diff --git a/ios/RNInstabug/InstabugReactBridge.m b/ios/RNInstabug/InstabugReactBridge.m index bf97d0ff99..2483caa9f7 100644 --- a/ios/RNInstabug/InstabugReactBridge.m +++ b/ios/RNInstabug/InstabugReactBridge.m @@ -37,14 +37,22 @@ - (dispatch_queue_t)methodQueue { Instabug.enabled = isEnabled; } -RCT_EXPORT_METHOD(init:(NSString *)token invocationEvents:(NSArray*)invocationEventsArray debugLogsLevel:(IBGSDKDebugLogsLevel)sdkDebugLogsLevel) { +RCT_EXPORT_METHOD(init:(NSString *)token + invocationEvents:(NSArray *)invocationEventsArray + debugLogsLevel:(IBGSDKDebugLogsLevel)sdkDebugLogsLevel + codePushVersion:(NSString *)codePushVersion) { IBGInvocationEvent invocationEvents = 0; for (NSNumber *boxedValue in invocationEventsArray) { invocationEvents |= [boxedValue intValue]; } - [RNInstabug initWithToken:token invocationEvents:invocationEvents debugLogsLevel:sdkDebugLogsLevel]; + [Instabug setCodePushVersion:codePushVersion]; + NSLog(@“[Instabug] CodePush: %@“, codePushVersion); + + [RNInstabug initWithToken:token + invocationEvents:invocationEvents + debugLogsLevel:sdkDebugLogsLevel]; } RCT_EXPORT_METHOD(setReproStepsConfig:(IBGUserStepsMode)bugMode :(IBGUserStepsMode)crashMode:(IBGUserStepsMode)sessionReplayMode) { diff --git a/ios/RNInstabug/RNInstabug.h b/ios/RNInstabug/RNInstabug.h index b18b4d41fa..e42b38844b 100644 --- a/ios/RNInstabug/RNInstabug.h +++ b/ios/RNInstabug/RNInstabug.h @@ -8,6 +8,17 @@ + (void)initWithToken:(NSString *)token invocationEvents:(IBGInvocationEvent)invocationEvents debugLogsLevel:(IBGSDKDebugLogsLevel)debugLogsLevel; + (void)initWithToken:(NSString *)token invocationEvents:(IBGInvocationEvent)invocationEvents; +/** + @brief Set codePush version before starting the SDK. + + @discussion Sets Code Push version to be used for all reports. + should be called from `-[UIApplicationDelegate application:didFinishLaunchingWithOptions:]` + and before `startWithToken`. + + @param codePushVersion the Code Push version to be used for all reports. + */ ++ (void)setCodePushVersion:(NSString *)codePushVersion; + @end #endif /* RNInstabug_h */ diff --git a/ios/RNInstabug/RNInstabug.m b/ios/RNInstabug/RNInstabug.m index 209670a5ee..378835f72d 100644 --- a/ios/RNInstabug/RNInstabug.m +++ b/ios/RNInstabug/RNInstabug.m @@ -14,11 +14,6 @@ + (void)reset { } + (void)initWithToken:(NSString *)token invocationEvents:(IBGInvocationEvent)invocationEvents { - // Initialization is performed only once to avoid unexpected behavior. - if (didInit) { - NSLog(@"IBG-RN: Skipped iOS SDK re-initialization"); - return; - } didInit = YES; @@ -49,6 +44,10 @@ + (void)initWithToken:(NSString *)token [self initWithToken:token invocationEvents:invocationEvents]; } ++ (void)setCodePushVersion:(NSString *)codePushVersion { + [Instabug setCodePushVersion:codePushVersion]; +} + // Note: This function is used to bridge IBGNSLog with RCTLogFunction. // This log function should not be used externally and is only an implementation detail. void RNIBGLog(IBGLogLevel logLevel, NSString *format, ...) { diff --git a/ios/native.rb b/ios/native.rb index 0b6e557526..ae1809f4d1 100644 --- a/ios/native.rb +++ b/ios/native.rb @@ -1,4 +1,4 @@ -$instabug = { :version => '12.4.0' } +$instabug = { :version => '12.5.0' } def use_instabug! (spec = nil) version = $instabug[:version] diff --git a/package.json b/package.json index 75fa384939..57d91b63cb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "instabug-reactnative", "description": "React Native plugin for integrating the Instabug SDK", - "version": "12.4.0", + "version": "12.4.3", "author": "Instabug (https://instabug.com)", "repository": "github:Instabug/Instabug-React-Native", "homepage": "https://www.instabug.com/platforms/react-native", diff --git a/src/models/InstabugConfig.ts b/src/models/InstabugConfig.ts index 36770c94a0..0eda7a3187 100644 --- a/src/models/InstabugConfig.ts +++ b/src/models/InstabugConfig.ts @@ -13,4 +13,9 @@ export interface InstabugConfig { * An optional LogLevel to indicate the verbosity of SDK logs. Default is Error. */ debugLogsLevel?: LogLevel; + + /** + * An optional code push version to be used for all reports. + */ + codePushVersion?: string; } diff --git a/src/modules/Instabug.ts b/src/modules/Instabug.ts index 0d1c4092a4..cf0debc9a9 100644 --- a/src/modules/Instabug.ts +++ b/src/modules/Instabug.ts @@ -34,6 +34,23 @@ export const setEnabled = (isEnabled: boolean) => { NativeInstabug.setEnabled(isEnabled); }; +/** + * Reports that the screen name been changed (Current View field on dashboard). + * only for android. + * + * Normally reportScreenChange handles taking a screenshot for reproduction + * steps and the Current View field on the dashboard. But we've faced issues + * in android where we needed to separate them, that's why we only call it + * for android. + * + * @param screenName string containing the screen name + */ +function reportCurrentViewForAndroid(screenName: string | null) { + if (Platform.OS === 'android' && screenName != null) { + NativeInstabug.reportCurrentViewChange(screenName); + } +} + /** * Initializes the SDK. * This is the main SDK method that does all the magic. This is the only @@ -50,11 +67,13 @@ export const init = (config: InstabugConfig) => { config.token, config.invocationEvents, config.debugLogsLevel ?? LogLevel.error, + config.codePushVersion, ); _isFirstScreen = true; _currentScreen = firstScreen; + reportCurrentViewForAndroid(firstScreen); setTimeout(() => { if (_currentScreen === firstScreen) { NativeInstabug.reportScreenChange(firstScreen); @@ -458,6 +477,7 @@ export const onNavigationStateChange = ( const prevScreen = InstabugUtils.getActiveRouteName(prevState); if (prevScreen !== currentScreen) { + reportCurrentViewForAndroid(currentScreen); if (_currentScreen != null && _currentScreen !== firstScreen) { NativeInstabug.reportScreenChange(_currentScreen); _currentScreen = null; @@ -478,6 +498,7 @@ export const onStateChange = (state?: NavigationStateV5) => { } const currentScreen = InstabugUtils.getFullRoute(state); + reportCurrentViewForAndroid(currentScreen); if (_currentScreen !== null && _currentScreen !== firstScreen) { NativeInstabug.reportScreenChange(_currentScreen); _currentScreen = null; diff --git a/src/native/NativeInstabug.ts b/src/native/NativeInstabug.ts index 23d41e3426..b8b1d912f3 100644 --- a/src/native/NativeInstabug.ts +++ b/src/native/NativeInstabug.ts @@ -19,7 +19,12 @@ export interface InstabugNativeModule extends NativeModule { // Essential APIs // setEnabled(isEnabled: boolean): void; - init(token: string, invocationEvents: InvocationEvent[], debugLogsLevel: LogLevel): void; + init( + token: string, + invocationEvents: InvocationEvent[], + debugLogsLevel: LogLevel, + codePushVersion?: string, + ): void; show(): void; // Misc APIs // @@ -44,6 +49,7 @@ export interface InstabugNativeModule extends NativeModule { ): void; setTrackUserSteps(isEnabled: boolean): void; reportScreenChange(firstScreen: string): void; + reportCurrentViewChange(screenName: string): void; addPrivateView(nativeTag: number | null): void; removePrivateView(nativeTag: number | null): void; diff --git a/test/mocks/mockInstabug.ts b/test/mocks/mockInstabug.ts index f7d975eee1..6353cf64c7 100644 --- a/test/mocks/mockInstabug.ts +++ b/test/mocks/mockInstabug.ts @@ -47,6 +47,7 @@ const mockInstabug: InstabugNativeModule = { show: jest.fn(), setPreSendingHandler: jest.fn(), reportScreenChange: jest.fn(), + reportCurrentViewChange: jest.fn(), addExperiments: jest.fn(), removeExperiments: jest.fn(), clearAllExperiments: jest.fn(), diff --git a/test/modules/Instabug.spec.ts b/test/modules/Instabug.spec.ts index 2d928253a8..c8019c1ea8 100644 --- a/test/modules/Instabug.spec.ts +++ b/test/modules/Instabug.spec.ts @@ -109,6 +109,33 @@ describe('Instabug Module', () => { }); }); + // eslint-disable-next-line jest/no-disabled-tests + it.skip('onNavigationStateChange should call the native method reportCurrentViewChange on Android Platform', async () => { + Platform.OS = 'android'; + InstabugUtils.getActiveRouteName = jest.fn().mockImplementation((screenName) => screenName); + + // @ts-ignore + Instabug.onNavigationStateChange('home', 'settings'); + + await waitForExpect(() => { + expect(NativeInstabug.reportCurrentViewChange).toBeCalledTimes(1); + expect(NativeInstabug.reportCurrentViewChange).toBeCalledWith('settings'); + }); + }); + + // eslint-disable-next-line jest/no-disabled-tests + it.skip('onNavigationStateChange should not call the native method reportCurrentViewChange on iOS Platform', async () => { + Platform.OS = 'ios'; + InstabugUtils.getActiveRouteName = jest.fn().mockImplementation((screenName) => screenName); + + // @ts-ignore + Instabug.onNavigationStateChange('home', 'settings'); + + await waitForExpect(() => { + expect(NativeInstabug.reportCurrentViewChange).not.toBeCalled(); + }); + }); + it('onNavigationStateChange should not call the native method reportScreenChange if screen is the same', (done) => { InstabugUtils.getActiveRouteName = jest.fn().mockImplementation((screenName) => screenName); @@ -122,7 +149,20 @@ describe('Instabug Module', () => { }, 1500); }); - it('onNavigationStateChange should call the native method reportScreenChange immediatly if _currentScreen is set', async () => { + it('onNavigationStateChange should not call the native method reportCurrentViewChange if screen is the same', (done) => { + InstabugUtils.getActiveRouteName = jest.fn().mockImplementation((screenName) => screenName); + + // @ts-ignore + Instabug.onNavigationStateChange('home', 'home'); + + // Wait for 1.5s as reportScreenChange is delayed by 1s + setTimeout(() => { + expect(NativeInstabug.reportCurrentViewChange).not.toBeCalled(); + done(); + }, 1500); + }); + + it('onNavigationStateChange should call the native method reportScreenChange immediately if _currentScreen is set', async () => { InstabugUtils.getActiveRouteName = jest.fn().mockImplementation((screenName) => screenName); // sets _currentScreen and waits for 1s as _currentScreen is null @@ -150,6 +190,31 @@ describe('Instabug Module', () => { }); }); + // eslint-disable-next-line jest/no-disabled-tests + it.skip('onStateChange should call the native method reportCurrentViewChange on Android Platform', async () => { + Platform.OS = 'android'; + const state = { routes: [{ name: 'ScreenName' }], index: 0 }; + // @ts-ignore + Instabug.onStateChange(state); + + await waitForExpect(() => { + expect(NativeInstabug.reportCurrentViewChange).toBeCalledTimes(1); + expect(NativeInstabug.reportCurrentViewChange).toBeCalledWith('ScreenName'); + }); + }); + + // eslint-disable-next-line jest/no-disabled-tests + it.skip('onStateChange should not call the native method reportCurrentViewChange on iOS Platform', async () => { + Platform.OS = 'ios'; + const state = { routes: [{ name: 'ScreenName' }], index: 0 }; + // @ts-ignore + Instabug.onStateChange(state); + + await waitForExpect(() => { + expect(NativeInstabug.reportCurrentViewChange).not.toBeCalled(); + }); + }); + it('onStateChange should call the native method reportScreenChange immediately if _currentScreen is set', async () => { // sets _currentScreen and waits for 1s as _currentScreen is null const state = { routes: [{ name: 'ScreenName' }], index: 0 }; @@ -172,6 +237,7 @@ describe('Instabug Module', () => { token: 'some-token', invocationEvents: [InvocationEvent.floatingButton, InvocationEvent.shake], debugLogsLevel: LogLevel.debug, + codePushVersion: '1.1.0', }; Instabug.init(instabugConfig); @@ -180,6 +246,7 @@ describe('Instabug Module', () => { instabugConfig.token, instabugConfig.invocationEvents, instabugConfig.debugLogsLevel, + instabugConfig.codePushVersion, ); }); @@ -195,6 +262,31 @@ describe('Instabug Module', () => { }); }); + it('init should call reportCurrentViewChange on Android Platform', async () => { + Platform.OS = 'android'; + Instabug.init({ + token: 'some-token', + invocationEvents: [InvocationEvent.none], + }); + + await waitForExpect(() => { + expect(NativeInstabug.reportCurrentViewChange).toBeCalledTimes(1); + expect(NativeInstabug.reportCurrentViewChange).toBeCalledWith('Initial Screen'); + }); + }); + + it('init should not call reportCurrentViewChange on ios Platform', async () => { + Platform.OS = 'ios'; + Instabug.init({ + token: 'some-token', + invocationEvents: [InvocationEvent.none], + }); + + await waitForExpect(() => { + expect(NativeInstabug.reportCurrentViewChange).not.toBeCalled(); + }); + }); + it('should call the native method setUserData', () => { const userData = 'userData'; Instabug.setUserData(userData);