react-native-rate-app 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -120,9 +120,12 @@ To enable in-app reviews for the Samsung Galaxy Store, ensure that your app is c
120
120
  - **Development Mode**: The in-app review dialog is always displayed in development mode, regardless of rate limits. This is useful for testing purposes.
121
121
  - **Best Practices**: According to operating system guidelines, it is recommended to request a review during a natural flow in your app, rather than from a button. For example, you might request a review after a user has completed a task or achieved a milestone within your app.
122
122
 
123
- [Apple Documentation](https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview#discussion)<br>
123
+ [Apple Documentation iOS 14+](https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview#discussion)<br>
124
+ [Apple Documentation iOS 16+](https://developer.apple.com/documentation/storekit/requestreviewaction)<br>
124
125
  [Google Documentation](https://developer.android.com/guide/playcore/in-app-review)
125
126
 
127
+ Below iOS 16 library is using the deprecated SKStoreReviewController and on iOS 16+ it uses the new RequestReviewAction API. Both implementations provide the same functionality and user experience.
128
+
126
129
  ### `RateApp.openStoreForReview(options)`
127
130
 
128
131
  Opens the app store page for the app, allowing the user to leave a review.
package/RateApp.podspec CHANGED
@@ -14,7 +14,7 @@ Pod::Spec.new do |s|
14
14
  s.platforms = { :ios => min_ios_version_supported }
15
15
  s.source = { :git => "https://github.com/huextrat/react-native-rate-app.git", :tag => "#{s.version}" }
16
16
 
17
- s.source_files = "ios/**/*.{h,m,mm,cpp}"
17
+ s.source_files = "ios/**/*.{h,m,mm,cpp,swift}"
18
18
  s.private_header_files = "ios/generated/**/*.h"
19
19
 
20
20
  # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
@@ -0,0 +1 @@
1
+ #import <React/RCTBridgeModule.h>
package/ios/RateApp.mm CHANGED
@@ -1,55 +1,15 @@
1
- #import "RateApp.h"
2
- #import <StoreKit/StoreKit.h>
1
+ #import <React/RCTBridgeModule.h>
3
2
 
4
- static NSString *const kNoActiveSceneError = @"no_active_scene";
5
- static NSString *const kUnsupportedPlatformError = @"unsupported_platform";
3
+ @interface RCT_EXTERN_MODULE(RateApp, NSObject)
6
4
 
7
- @implementation RateApp
8
- RCT_EXPORT_MODULE()
9
-
10
- RCT_EXPORT_METHOD(requestReview:(RCTPromiseResolveBlock)resolve
5
+ RCT_EXTERN_METHOD(requestReview:(RCTPromiseResolveBlock)resolve
11
6
  reject:(RCTPromiseRejectBlock)reject)
12
- {
13
- UIWindowScene *scene = [self findActiveScene];
14
- if (scene) {
15
- [SKStoreReviewController requestReviewInScene:scene];
16
- resolve(@(YES));
17
- } else {
18
- reject(kNoActiveSceneError, @"No active scene found", nil);
19
- }
20
- }
21
7
 
22
- RCT_EXPORT_METHOD(requestReviewAppGallery:(RCTPromiseResolveBlock)resolve
8
+ RCT_EXTERN_METHOD(requestReviewAppGallery:(RCTPromiseResolveBlock)resolve
23
9
  reject:(RCTPromiseRejectBlock)reject)
24
- {
25
- // Since this is iOS, we should reject with an appropriate message
26
- reject(kUnsupportedPlatformError, @"App Gallery reviews are not supported on iOS", nil);
27
- }
28
10
 
29
- RCT_EXPORT_METHOD(requestReviewGalaxyStore:(NSString *)packageName
11
+ RCT_EXTERN_METHOD(requestReviewGalaxyStore:(NSString *)packageName
30
12
  resolve:(RCTPromiseResolveBlock)resolve
31
13
  reject:(RCTPromiseRejectBlock)reject)
32
- {
33
- // Since this is iOS, we should reject with an appropriate message
34
- reject(kUnsupportedPlatformError, @"Galaxy Store reviews are not supported on iOS", nil);
35
- }
36
-
37
- - (UIWindowScene *) findActiveScene {
38
- for (UIWindowScene *scene in UIApplication.sharedApplication.connectedScenes) {
39
- if (scene.activationState == UISceneActivationStateForegroundActive) {
40
- return scene;
41
- }
42
- }
43
- return nil;
44
- }
45
-
46
- // Don't compile this code when we build for the old architecture.
47
- #ifdef RCT_NEW_ARCH_ENABLED
48
- - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
49
- (const facebook::react::ObjCTurboModule::InitParams &)params
50
- {
51
- return std::make_shared<facebook::react::NativeRateAppSpecJSI>(params);
52
- }
53
- #endif
54
14
 
55
- @end
15
+ @end
@@ -0,0 +1,50 @@
1
+ import Foundation
2
+ import StoreKit
3
+
4
+ @objc(RateApp)
5
+ class RateApp: NSObject {
6
+
7
+ private let noActiveSceneError = "no_active_scene"
8
+ private let unsupportedPlatformError = "unsupported_platform"
9
+
10
+ @objc
11
+ static func requiresMainQueueSetup() -> Bool {
12
+ return false
13
+ }
14
+
15
+ @objc
16
+ func requestReview(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
17
+ if let scene = findActiveScene() {
18
+ if #available(iOS 16.0, *) {
19
+ Task { @MainActor in
20
+ AppStore.requestReview(in: scene)
21
+ }
22
+ } else {
23
+ SKStoreReviewController.requestReview(in: scene)
24
+ }
25
+ resolve(true)
26
+ } else {
27
+ reject(noActiveSceneError, "No active scene found", nil)
28
+ }
29
+ }
30
+
31
+ @objc
32
+ func requestReviewAppGallery(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
33
+ reject(unsupportedPlatformError, "App Gallery reviews are not supported on iOS", nil)
34
+ }
35
+
36
+ @objc
37
+ func requestReviewGalaxyStore(_ packageName: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
38
+ reject(unsupportedPlatformError, "Galaxy Store reviews are not supported on iOS", nil)
39
+ }
40
+
41
+ private func findActiveScene() -> UIWindowScene? {
42
+ for scene in UIApplication.shared.connectedScenes {
43
+ if let windowScene = scene as? UIWindowScene,
44
+ windowScene.activationState == .foregroundActive {
45
+ return windowScene
46
+ }
47
+ }
48
+ return nil
49
+ }
50
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-rate-app",
3
- "version": "1.2.3",
3
+ "version": "1.3.0",
4
4
  "description": "React Native module for In App Rating on Android and iOS",
5
5
  "source": "src/index.tsx",
6
6
  "main": "lib/commonjs/index.js",
@@ -65,14 +65,14 @@
65
65
  },
66
66
  "devDependencies": {
67
67
  "@biomejs/biome": "1.9.4",
68
- "@commitlint/cli": "19.7.1",
69
- "@commitlint/config-conventional": "19.7.1",
68
+ "@commitlint/cli": "19.8.0",
69
+ "@commitlint/config-conventional": "19.8.0",
70
70
  "@react-native-community/cli": "15.1.3",
71
71
  "@semantic-release/changelog": "6.0.3",
72
72
  "@semantic-release/git": "10.0.1",
73
73
  "@types/jest": "29.5.14",
74
74
  "@types/react": "19.0.10",
75
- "commitlint": "19.7.1",
75
+ "commitlint": "19.8.0",
76
76
  "del-cli": "6.0.0",
77
77
  "expo": "^52.0.31",
78
78
  "husky": "9.1.7",