react-native-rate-app 1.0.6 → 1.1.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 +30 -2
- package/android/src/main/java/com/rateapp/RateAppModule.kt +84 -4
- package/android/src/newarch/RateApp.kt +2 -1
- package/android/src/oldarch/RateApp.kt +4 -1
- package/lib/commonjs/codegenSpec/NativeRateApp.js.map +1 -1
- package/lib/commonjs/index.js +22 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/codegenSpec/NativeRateApp.js.map +1 -1
- package/lib/module/index.js +22 -2
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/codegenSpec/NativeRateApp.d.ts +2 -0
- package/lib/typescript/codegenSpec/NativeRateApp.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +8 -4
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +11 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/codegenSpec/NativeRateApp.ts +2 -0
- package/src/index.tsx +31 -3
- package/src/types.ts +12 -0
package/README.md
CHANGED
|
@@ -20,8 +20,13 @@
|
|
|
20
20
|
|
|
21
21
|
- 🚀 Easy integration with React Native projects
|
|
22
22
|
- 🔄 Cross-platform support (iOS and Android)
|
|
23
|
-
- 📱 Supports Android 21+ and iOS 14+
|
|
23
|
+
- 📱 Supports Android 5+ (API level 21+) and iOS 14+
|
|
24
24
|
- 🏗️ Supports the new architecture for React Native
|
|
25
|
+
- 🛒 Supports multiple app stores:
|
|
26
|
+
- Google Play Store
|
|
27
|
+
- Samsung Galaxy Store
|
|
28
|
+
- Huawei AppGallery
|
|
29
|
+
- Apple App Store (iOS)
|
|
25
30
|
|
|
26
31
|
## Installation
|
|
27
32
|
|
|
@@ -65,15 +70,38 @@ Example:
|
|
|
65
70
|
|
|
66
71
|
This library will throw an error if something goes wrong during the execution of its methods. Make sure to handle these errors appropriately in your application.
|
|
67
72
|
|
|
68
|
-
### `RateApp.requestReview()`
|
|
73
|
+
### `RateApp.requestReview(options)`
|
|
69
74
|
|
|
70
75
|
Requests a review from the user using the native in-app review dialog.
|
|
71
76
|
|
|
77
|
+
#### Parameters
|
|
78
|
+
|
|
79
|
+
- `options` (optional): An object containing the following properties:
|
|
80
|
+
- `androidMarket` (optional): The market where the app's review request should be directed on Android. Defaults to `AndroidMarket.GOOGLE`. Supported values are:
|
|
81
|
+
- `AndroidMarket.GOOGLE`: Google Play Store
|
|
82
|
+
- `AndroidMarket.SAMSUNG`: Samsung Galaxy Store
|
|
83
|
+
- `AndroidMarket.HUAWEI`: Huawei AppGallery
|
|
84
|
+
- `androidPackageName` (optional): The package name of the app to request a review for on Samsung Galaxy Store.
|
|
85
|
+
|
|
86
|
+
#### Example
|
|
87
|
+
|
|
72
88
|
```javascript
|
|
73
89
|
const result = await RateApp.requestReview();
|
|
74
90
|
console.log(result); // true if successful, false otherwise
|
|
75
91
|
```
|
|
76
92
|
|
|
93
|
+
### Important Note on Huawei AppGallery and Samsung Galaxy Store In-App Rating
|
|
94
|
+
|
|
95
|
+
Please note that the in-app rating functionality for Huawei AppGallery and Samsung Galaxy Store has not been thoroughly tested. While the implementation follows the respective guidelines, we recommend conducting your own tests to ensure compatibility and functionality within your application environment.
|
|
96
|
+
|
|
97
|
+
#### Huawei AppGallery Requirements
|
|
98
|
+
|
|
99
|
+
To enable in-app reviews for the Huawei AppGallery, ensure that your app is correctly configured with Huawei Mobile Services (HMS). This functionality leverages [Huawei In-App Comments](https://developer.huawei.com/consumer/en/doc/AppGallery-connect-Guides/agc-comments-develop-0000001062858332) mechanism.
|
|
100
|
+
|
|
101
|
+
#### Samsung Galaxy Store Requirements
|
|
102
|
+
|
|
103
|
+
To enable in-app reviews for the Samsung Galaxy Store, ensure that your app is correctly configured. You must provide the `androidPackageName` specific to the Samsung Galaxy Store. This functionality leverages the [Galaxy Store Broadcast](https://developer.samsung.com/galaxy-store/customer-review/galaxy-store-review-broadcast.html) mechanism.
|
|
104
|
+
|
|
77
105
|
### Important Notes
|
|
78
106
|
|
|
79
107
|
- **Quotas**: In-app reviews are subject to rate limits set by the operating system. This means the review dialog might not always appear to the user, depending on how often it has been requested previously. Note that `requestReview` will return `true` even if the rate limits have been reached. For more information, please refer to the official documentation from Apple and Google.
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
package com.rateapp
|
|
2
2
|
|
|
3
|
+
import android.app.Activity;
|
|
4
|
+
import android.content.BroadcastReceiver
|
|
5
|
+
import android.content.Context
|
|
6
|
+
import android.content.Intent
|
|
7
|
+
import android.content.IntentFilter
|
|
8
|
+
import android.content.pm.PackageManager
|
|
9
|
+
import android.net.Uri
|
|
10
|
+
|
|
11
|
+
import com.facebook.react.bridge.ActivityEventListener
|
|
3
12
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
13
|
import com.facebook.react.bridge.ReactMethod
|
|
5
14
|
import com.facebook.react.bridge.Promise
|
|
@@ -8,7 +17,11 @@ import com.google.android.play.core.review.ReviewManager
|
|
|
8
17
|
import com.google.android.play.core.review.ReviewManagerFactory
|
|
9
18
|
|
|
10
19
|
class RateAppModule internal constructor(context: ReactApplicationContext) :
|
|
11
|
-
RateAppSpec(context) {
|
|
20
|
+
RateAppSpec(context), ActivityEventListener {
|
|
21
|
+
|
|
22
|
+
init {
|
|
23
|
+
context.addActivityEventListener(this)
|
|
24
|
+
}
|
|
12
25
|
|
|
13
26
|
override fun getName(): String {
|
|
14
27
|
return NAME
|
|
@@ -22,8 +35,7 @@ class RateAppModule internal constructor(context: ReactApplicationContext) :
|
|
|
22
35
|
if (task.isSuccessful) {
|
|
23
36
|
val reviewInfo = task.result
|
|
24
37
|
reviewInfo?.let {
|
|
25
|
-
|
|
26
|
-
if (activity != null) {
|
|
38
|
+
currentActivity?.let { activity ->
|
|
27
39
|
val flow = manager.launchReviewFlow(activity, it)
|
|
28
40
|
flow.addOnCompleteListener { result ->
|
|
29
41
|
if (result.isSuccessful) {
|
|
@@ -32,7 +44,7 @@ class RateAppModule internal constructor(context: ReactApplicationContext) :
|
|
|
32
44
|
promise.reject("REVIEW_FLOW_FAILED", "Review flow failed to complete")
|
|
33
45
|
}
|
|
34
46
|
}
|
|
35
|
-
}
|
|
47
|
+
} ?: promise.reject("ACTIVITY_NULL", "Current activity is null")
|
|
36
48
|
} ?: promise.reject("REVIEW_INFO_NULL", "Review info is null")
|
|
37
49
|
} else {
|
|
38
50
|
promise.reject("REQUEST_REVIEW_FLOW_FAILED", "Request review flow failed")
|
|
@@ -40,7 +52,75 @@ class RateAppModule internal constructor(context: ReactApplicationContext) :
|
|
|
40
52
|
}
|
|
41
53
|
}
|
|
42
54
|
|
|
55
|
+
@ReactMethod
|
|
56
|
+
override fun requestReviewAppGallery(promise: Promise) {
|
|
57
|
+
promiseAppGallery = promise;
|
|
58
|
+
val intent = Intent("com.huawei.appmarket.intent.action.guidecomment")
|
|
59
|
+
intent.setPackage("com.huawei.appmarket")
|
|
60
|
+
currentActivity?.let {
|
|
61
|
+
it.startActivityForResult(intent, 1001);
|
|
62
|
+
} ?: promise.reject("ACTIVITY_NULL", "Current activity is null")
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
override fun onActivityResult(activity: Activity?, requestCode: Int, resultCode: Int, data: Intent?) {
|
|
66
|
+
if (requestCode == REQUEST_CODE) {
|
|
67
|
+
if (resultCode == Activity.RESULT_OK) {
|
|
68
|
+
promiseAppGallery?.resolve(true)
|
|
69
|
+
} else {
|
|
70
|
+
promiseAppGallery?.reject("REVIEW_NOT_COMPLETED", resultCode.toString())
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@ReactMethod
|
|
76
|
+
override fun requestReviewGalaxyStore(packageName: String, promise: Promise) {
|
|
77
|
+
val ai = reactApplicationContext.packageManager.getApplicationInfo("com.sec.android.app.samsungapps", PackageManager.GET_META_DATA)
|
|
78
|
+
val inappReviewVersion = ai.metaData.getInt("com.sec.android.app.samsungapps.review.inappReview", 0)
|
|
79
|
+
if (inappReviewVersion > 0) {
|
|
80
|
+
promiseGalaxyStore = promise
|
|
81
|
+
|
|
82
|
+
val intent = Intent("com.sec.android.app.samsungapps.REQUEST_INAPP_REVIEW_AUTHORITY")
|
|
83
|
+
intent.setPackage("com.sec.android.app.samsungapps")
|
|
84
|
+
intent.putExtra("callerPackage", packageName)
|
|
85
|
+
reactApplicationContext.sendBroadcast(intent)
|
|
86
|
+
|
|
87
|
+
val filter = IntentFilter()
|
|
88
|
+
filter.addAction("com.sec.android.app.samsungapps.RESPONSE_INAPP_REVIEW_AUTHORITY")
|
|
89
|
+
reactApplicationContext.registerReceiver(authorityReceiver, filter)
|
|
90
|
+
} else {
|
|
91
|
+
promise.reject("NOT_SUPPORTED", "Galaxy Store does not support in-app review")
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private val authorityReceiver = object : BroadcastReceiver() {
|
|
96
|
+
override fun onReceive(context: Context, intent: Intent) {
|
|
97
|
+
val hasAuthority = intent.getBooleanExtra("hasAuthority", false)
|
|
98
|
+
val deeplinkUri = intent.getStringExtra("deeplinkUri")
|
|
99
|
+
|
|
100
|
+
if (hasAuthority) {
|
|
101
|
+
val deeplinkIntent = Intent().apply {
|
|
102
|
+
data = Uri.parse(deeplinkUri)
|
|
103
|
+
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
|
|
104
|
+
}
|
|
105
|
+
currentActivity?.let {
|
|
106
|
+
it.startActivity(deeplinkIntent)
|
|
107
|
+
promiseGalaxyStore?.resolve(true)
|
|
108
|
+
} ?: promiseGalaxyStore?.reject("ACTIVITY_NULL", "Current activity is null")
|
|
109
|
+
} else {
|
|
110
|
+
promiseGalaxyStore?.reject("NO_AUTHORITY", "No authority to write review")
|
|
111
|
+
}
|
|
112
|
+
reactApplicationContext.unregisterReceiver(this)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
override fun onNewIntent(intent: Intent?) {
|
|
117
|
+
// No-op
|
|
118
|
+
}
|
|
119
|
+
|
|
43
120
|
companion object {
|
|
44
121
|
const val NAME = "RateApp"
|
|
122
|
+
const val REQUEST_CODE = 1001
|
|
123
|
+
private var promiseAppGallery: Promise? = null
|
|
124
|
+
private var promiseGalaxyStore: Promise? = null
|
|
45
125
|
}
|
|
46
126
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
package com.rateapp
|
|
2
2
|
|
|
3
|
+
import com.facebook.react.bridge.ActivityEventListener
|
|
3
4
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
5
|
|
|
5
6
|
abstract class RateAppSpec internal constructor(context: ReactApplicationContext) :
|
|
6
|
-
NativeRateAppSpec(context) {
|
|
7
|
+
NativeRateAppSpec(context), ActivityEventListener {
|
|
7
8
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
package com.rateapp
|
|
2
2
|
|
|
3
|
+
import com.facebook.react.bridge.ActivityEventListener
|
|
3
4
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
5
|
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
5
6
|
import com.facebook.react.bridge.Promise
|
|
6
7
|
|
|
7
8
|
abstract class RateAppSpec internal constructor(context: ReactApplicationContext) :
|
|
8
|
-
ReactContextBaseJavaModule(context) {
|
|
9
|
+
ReactContextBaseJavaModule(context), ActivityEventListener {
|
|
9
10
|
|
|
10
11
|
abstract fun requestReview(promise: Promise)
|
|
12
|
+
abstract fun requestReviewAppGallery(promise: Promise)
|
|
13
|
+
abstract fun requestReviewGalaxyStore(packageName: String, promise: Promise)
|
|
11
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeRateApp.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeRateApp.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAQpCC,gCAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -48,10 +48,30 @@ class RateAppError extends Error {
|
|
|
48
48
|
const RateApp = {
|
|
49
49
|
/**
|
|
50
50
|
* Requests a review from the user.
|
|
51
|
-
*
|
|
51
|
+
*
|
|
52
|
+
* @param {RequestReviewProps} props - The properties for the review request.
|
|
53
|
+
* @param {AndroidMarket} [props.androidMarket=AndroidMarket.GOOGLE] - The market where the app's review request should be directed on Android.
|
|
54
|
+
* @param {string} [props.androidPackageName] - The package name of the app to request a review for on Samsung Galaxy Store.
|
|
55
|
+
* @returns {Promise<boolean>} A promise that resolves to a boolean indicating whether the review was successfully requested.
|
|
52
56
|
*/
|
|
53
|
-
async requestReview(
|
|
57
|
+
async requestReview({
|
|
58
|
+
androidMarket = _types.AndroidMarket.GOOGLE,
|
|
59
|
+
androidPackageName
|
|
60
|
+
} = {}) {
|
|
54
61
|
try {
|
|
62
|
+
if (_reactNative.Platform.OS === "android") {
|
|
63
|
+
switch (androidMarket) {
|
|
64
|
+
case _types.AndroidMarket.SAMSUNG:
|
|
65
|
+
if (!androidPackageName) {
|
|
66
|
+
throw new RateAppError("androidPackageName is required for Samsung Galaxy Store");
|
|
67
|
+
}
|
|
68
|
+
return await _NativeRateApp.default.requestReviewGalaxyStore(androidPackageName);
|
|
69
|
+
case _types.AndroidMarket.HUAWEI:
|
|
70
|
+
return await _NativeRateApp.default.requestReviewAppGallery();
|
|
71
|
+
default:
|
|
72
|
+
return await _NativeRateApp.default.requestReview();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
55
75
|
return await _NativeRateApp.default.requestReview();
|
|
56
76
|
} catch (error) {
|
|
57
77
|
throw new RateAppError(`Failed to request review: ${error}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_NativeRateApp","_interopRequireDefault","_constants","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_types","e","__esModule","default","RateAppError","Error","constructor","message","name","RateApp","requestReview","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_NativeRateApp","_interopRequireDefault","_constants","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_types","e","__esModule","default","RateAppError","Error","constructor","message","name","RateApp","requestReview","androidMarket","AndroidMarket","GOOGLE","androidPackageName","Platform","OS","SAMSUNG","NativeRateApp","requestReviewGalaxyStore","HUAWEI","requestReviewAppGallery","error","openStoreForReview","iOSAppId","isIOS","ismacOS","isAndroid","url","IOS_REVIEW_URL","getAndroidMarketUrl","canOpenURL","Linking","openURL","urlTemplate","ANDROID_MARKET_URLS","replace","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeRateApp.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeRateApp.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAQlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -17,10 +17,30 @@ class RateAppError extends Error {
|
|
|
17
17
|
const RateApp = {
|
|
18
18
|
/**
|
|
19
19
|
* Requests a review from the user.
|
|
20
|
-
*
|
|
20
|
+
*
|
|
21
|
+
* @param {RequestReviewProps} props - The properties for the review request.
|
|
22
|
+
* @param {AndroidMarket} [props.androidMarket=AndroidMarket.GOOGLE] - The market where the app's review request should be directed on Android.
|
|
23
|
+
* @param {string} [props.androidPackageName] - The package name of the app to request a review for on Samsung Galaxy Store.
|
|
24
|
+
* @returns {Promise<boolean>} A promise that resolves to a boolean indicating whether the review was successfully requested.
|
|
21
25
|
*/
|
|
22
|
-
async requestReview(
|
|
26
|
+
async requestReview({
|
|
27
|
+
androidMarket = AndroidMarket.GOOGLE,
|
|
28
|
+
androidPackageName
|
|
29
|
+
} = {}) {
|
|
23
30
|
try {
|
|
31
|
+
if (Platform.OS === "android") {
|
|
32
|
+
switch (androidMarket) {
|
|
33
|
+
case AndroidMarket.SAMSUNG:
|
|
34
|
+
if (!androidPackageName) {
|
|
35
|
+
throw new RateAppError("androidPackageName is required for Samsung Galaxy Store");
|
|
36
|
+
}
|
|
37
|
+
return await NativeRateApp.requestReviewGalaxyStore(androidPackageName);
|
|
38
|
+
case AndroidMarket.HUAWEI:
|
|
39
|
+
return await NativeRateApp.requestReviewAppGallery();
|
|
40
|
+
default:
|
|
41
|
+
return await NativeRateApp.requestReview();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
24
44
|
return await NativeRateApp.requestReview();
|
|
25
45
|
} catch (error) {
|
|
26
46
|
throw new RateAppError(`Failed to request review: ${error}`);
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Linking","Platform","NativeRateApp","ANDROID_MARKET_URLS","IOS_REVIEW_URL","AndroidMarket","RateAppError","Error","constructor","message","name","RateApp","requestReview","
|
|
1
|
+
{"version":3,"names":["Linking","Platform","NativeRateApp","ANDROID_MARKET_URLS","IOS_REVIEW_URL","AndroidMarket","RateAppError","Error","constructor","message","name","RateApp","requestReview","androidMarket","GOOGLE","androidPackageName","OS","SAMSUNG","requestReviewGalaxyStore","HUAWEI","requestReviewAppGallery","error","openStoreForReview","iOSAppId","isIOS","ismacOS","isAndroid","url","getAndroidMarketUrl","canOpenURL","openURL","urlTemplate","replace"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { TurboModule } from "react-native";
|
|
2
2
|
export interface Spec extends TurboModule {
|
|
3
3
|
requestReview(): Promise<boolean>;
|
|
4
|
+
requestReviewAppGallery(): Promise<boolean>;
|
|
5
|
+
requestReviewGalaxyStore(androidPackageName: string): Promise<boolean>;
|
|
4
6
|
}
|
|
5
7
|
declare const _default: Spec;
|
|
6
8
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeRateApp.d.ts","sourceRoot":"","sources":["../../../src/codegenSpec/NativeRateApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"NativeRateApp.d.ts","sourceRoot":"","sources":["../../../src/codegenSpec/NativeRateApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,wBAAwB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;;AAED,wBAAiE"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { AndroidMarket, type OpenStoreForReviewProps } from "./types";
|
|
1
|
+
import { AndroidMarket, type OpenStoreForReviewProps, type RequestReviewProps } from "./types";
|
|
2
2
|
declare const RateApp: {
|
|
3
3
|
/**
|
|
4
4
|
* Requests a review from the user.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* @param {RequestReviewProps} props - The properties for the review request.
|
|
7
|
+
* @param {AndroidMarket} [props.androidMarket=AndroidMarket.GOOGLE] - The market where the app's review request should be directed on Android.
|
|
8
|
+
* @param {string} [props.androidPackageName] - The package name of the app to request a review for on Samsung Galaxy Store.
|
|
9
|
+
* @returns {Promise<boolean>} A promise that resolves to a boolean indicating whether the review was successfully requested.
|
|
6
10
|
*/
|
|
7
|
-
requestReview(): Promise<boolean>;
|
|
11
|
+
requestReview({ androidMarket, androidPackageName, }?: RequestReviewProps): Promise<boolean>;
|
|
8
12
|
/**
|
|
9
13
|
* Opens the store listing for the app.
|
|
10
14
|
* @param props The properties for the store listing.
|
|
@@ -21,6 +25,6 @@ declare const RateApp: {
|
|
|
21
25
|
};
|
|
22
26
|
export * from "./types";
|
|
23
27
|
export * from "./constants";
|
|
24
|
-
export declare const requestReview: () => Promise<boolean>, openStoreForReview: ({ iOSAppId, androidPackageName, androidMarket, }: OpenStoreForReviewProps) => Promise<boolean>, getAndroidMarketUrl: (androidMarket: AndroidMarket, androidPackageName: string) => string;
|
|
28
|
+
export declare const requestReview: ({ androidMarket, androidPackageName, }?: RequestReviewProps) => Promise<boolean>, openStoreForReview: ({ iOSAppId, androidPackageName, androidMarket, }: OpenStoreForReviewProps) => Promise<boolean>, getAndroidMarketUrl: (androidMarket: AndroidMarket, androidPackageName: string) => string;
|
|
25
29
|
export default RateApp;
|
|
26
30
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,aAAa,EACb,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAYjB,QAAA,MAAM,OAAO;IACX;;;;;;;OAOG;2DAIA,kBAAkB,GAAQ,OAAO,CAAC,OAAO,CAAC;IAyB7C;;;;OAIG;yEAKA,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B7C;;;;;OAKG;uCAEc,aAAa,sBACR,MAAM,GACzB,MAAM;CAOV,CAAC;AAEF,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,eAAO,MAAQ,aAAa,4CArFvB,kBAAkB,KAAQ,OAAO,CAAC,OAAO,CAAC,EAqFjB,kBAAkB,qDAnD3C,uBAAuB,KAAG,OAAO,CAAC,OAAO,CAAC,EAmDG,mBAAmB,kBAblD,aAAa,sBACR,MAAM,KACzB,MAYI,CAAC;AACV,eAAe,OAAO,CAAC"}
|
|
@@ -19,4 +19,15 @@ export interface OpenStoreForReviewProps {
|
|
|
19
19
|
*/
|
|
20
20
|
androidMarket?: AndroidMarket;
|
|
21
21
|
}
|
|
22
|
+
export interface RequestReviewProps {
|
|
23
|
+
/**
|
|
24
|
+
* The market where the app's review request should be directed on Android.
|
|
25
|
+
* @default AndroidMarket.GOOGLE
|
|
26
|
+
*/
|
|
27
|
+
androidMarket?: Exclude<AndroidMarket, AndroidMarket.AMAZON>;
|
|
28
|
+
/**
|
|
29
|
+
* The package name of the app to request a review for on Samsung Galaxy Store.
|
|
30
|
+
*/
|
|
31
|
+
androidPackageName?: string;
|
|
32
|
+
}
|
|
22
33
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACvB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7D;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-rate-app",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.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",
|
|
@@ -59,13 +59,13 @@
|
|
|
59
59
|
"registry": "https://registry.npmjs.org/"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"@biomejs/biome": "1.9.
|
|
62
|
+
"@biomejs/biome": "1.9.2",
|
|
63
63
|
"@commitlint/cli": "19.5.0",
|
|
64
64
|
"@commitlint/config-conventional": "19.5.0",
|
|
65
65
|
"@semantic-release/changelog": "6.0.3",
|
|
66
66
|
"@semantic-release/git": "10.0.1",
|
|
67
67
|
"@types/jest": "29.5.13",
|
|
68
|
-
"@types/react": "18.3.
|
|
68
|
+
"@types/react": "18.3.9",
|
|
69
69
|
"commitlint": "19.5.0",
|
|
70
70
|
"del-cli": "5.1.0",
|
|
71
71
|
"husky": "9.1.6",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"typescript": "5.6.2"
|
|
79
79
|
},
|
|
80
80
|
"resolutions": {
|
|
81
|
-
"@types/react": "18.3.
|
|
81
|
+
"@types/react": "18.3.9"
|
|
82
82
|
},
|
|
83
83
|
"peerDependencies": {
|
|
84
84
|
"react": "*",
|
|
@@ -3,6 +3,8 @@ import { TurboModuleRegistry } from "react-native";
|
|
|
3
3
|
|
|
4
4
|
export interface Spec extends TurboModule {
|
|
5
5
|
requestReview(): Promise<boolean>;
|
|
6
|
+
requestReviewAppGallery(): Promise<boolean>;
|
|
7
|
+
requestReviewGalaxyStore(androidPackageName: string): Promise<boolean>;
|
|
6
8
|
}
|
|
7
9
|
|
|
8
10
|
export default TurboModuleRegistry.getEnforcing<Spec>("RateApp");
|
package/src/index.tsx
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { Linking, Platform } from "react-native";
|
|
2
2
|
import NativeRateApp from "./codegenSpec/NativeRateApp";
|
|
3
3
|
import { ANDROID_MARKET_URLS, IOS_REVIEW_URL } from "./constants";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
AndroidMarket,
|
|
6
|
+
type OpenStoreForReviewProps,
|
|
7
|
+
type RequestReviewProps,
|
|
8
|
+
} from "./types";
|
|
5
9
|
|
|
6
10
|
/**
|
|
7
11
|
* Custom error for rate app operations
|
|
@@ -16,10 +20,34 @@ class RateAppError extends Error {
|
|
|
16
20
|
const RateApp = {
|
|
17
21
|
/**
|
|
18
22
|
* Requests a review from the user.
|
|
19
|
-
*
|
|
23
|
+
*
|
|
24
|
+
* @param {RequestReviewProps} props - The properties for the review request.
|
|
25
|
+
* @param {AndroidMarket} [props.androidMarket=AndroidMarket.GOOGLE] - The market where the app's review request should be directed on Android.
|
|
26
|
+
* @param {string} [props.androidPackageName] - The package name of the app to request a review for on Samsung Galaxy Store.
|
|
27
|
+
* @returns {Promise<boolean>} A promise that resolves to a boolean indicating whether the review was successfully requested.
|
|
20
28
|
*/
|
|
21
|
-
async requestReview(
|
|
29
|
+
async requestReview({
|
|
30
|
+
androidMarket = AndroidMarket.GOOGLE,
|
|
31
|
+
androidPackageName,
|
|
32
|
+
}: RequestReviewProps = {}): Promise<boolean> {
|
|
22
33
|
try {
|
|
34
|
+
if (Platform.OS === "android") {
|
|
35
|
+
switch (androidMarket) {
|
|
36
|
+
case AndroidMarket.SAMSUNG:
|
|
37
|
+
if (!androidPackageName) {
|
|
38
|
+
throw new RateAppError(
|
|
39
|
+
"androidPackageName is required for Samsung Galaxy Store",
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
return await NativeRateApp.requestReviewGalaxyStore(
|
|
43
|
+
androidPackageName,
|
|
44
|
+
);
|
|
45
|
+
case AndroidMarket.HUAWEI:
|
|
46
|
+
return await NativeRateApp.requestReviewAppGallery();
|
|
47
|
+
default:
|
|
48
|
+
return await NativeRateApp.requestReview();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
23
51
|
return await NativeRateApp.requestReview();
|
|
24
52
|
} catch (error) {
|
|
25
53
|
throw new RateAppError(`Failed to request review: ${error}`);
|
package/src/types.ts
CHANGED
|
@@ -20,3 +20,15 @@ export interface OpenStoreForReviewProps {
|
|
|
20
20
|
*/
|
|
21
21
|
androidMarket?: AndroidMarket;
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
export interface RequestReviewProps {
|
|
25
|
+
/**
|
|
26
|
+
* The market where the app's review request should be directed on Android.
|
|
27
|
+
* @default AndroidMarket.GOOGLE
|
|
28
|
+
*/
|
|
29
|
+
androidMarket?: Exclude<AndroidMarket, AndroidMarket.AMAZON>;
|
|
30
|
+
/**
|
|
31
|
+
* The package name of the app to request a review for on Samsung Galaxy Store.
|
|
32
|
+
*/
|
|
33
|
+
androidPackageName?: string;
|
|
34
|
+
}
|