UNPKG

react-native-rate-app

Version:

React Native module for In App Rating on Android and iOS

108 lines (106 loc) 3.79 kB
"use strict"; import { Linking, Platform } from "react-native"; import RateApp from "./codegenSpec/NativeRateApp"; import { ANDROID_MARKET_URLS, IOS_REVIEW_URL } from "./constants"; import { AndroidMarket } from "./types"; /** * Custom error for rate app operations */ class RateAppError extends Error { constructor(message) { super(message); this.name = "RateAppError"; } } const RNRateApp = { /** * Requests a review from the user. * * @param {RequestReviewProps} props - The properties for the review request. * @param {AndroidMarket} [props.androidMarket=AndroidMarket.GOOGLE] - The market where the app's review request should be directed on Android. * @param {string} [props.androidPackageName] - The package name of the app to request a review for on Samsung Galaxy Store. * @returns {Promise<boolean>} A promise that resolves to a boolean indicating whether the review was successfully requested. */ async requestReview({ androidMarket = AndroidMarket.GOOGLE, androidPackageName } = {}) { try { if (Platform.OS === "android") { switch (androidMarket) { case AndroidMarket.SAMSUNG: if (!androidPackageName) { throw new RateAppError("androidPackageName is required for Samsung Galaxy Store"); } return await RateApp.requestReviewGalaxyStore(androidPackageName); case AndroidMarket.HUAWEI: return await RateApp.requestReviewAppGallery(); default: return await RateApp.requestReview(); } } return await RateApp.requestReview(); } catch (error) { throw new RateAppError(`Failed to request review: ${error}`); } }, /** * Opens the store listing for the app. * @param props The properties for the store listing. * @returns A promise that resolves to a boolean indicating whether the store listing was successfully opened. */ async openStoreForReview({ iOSAppId, androidPackageName, androidMarket = AndroidMarket.GOOGLE }) { const isIOS = Platform.OS === "ios"; const ismacOS = Platform.OS === "macos"; const isAndroid = Platform.OS === "android"; let url = ""; if (isIOS || ismacOS) { if (!iOSAppId) { throw new RateAppError("iOSAppId is required for iOS and macOS"); } url = `${IOS_REVIEW_URL}${iOSAppId}?action=write-review`; } else if (isAndroid) { if (!androidPackageName) { throw new RateAppError("androidPackageName is required for Android"); } url = this.getAndroidMarketUrl(androidMarket, androidPackageName); } else { throw new RateAppError(`Unsupported platform: ${Platform.OS}`); } try { const canOpenURL = await Linking.canOpenURL(url); if (canOpenURL) { await Linking.openURL(url); } return canOpenURL; } catch (error) { throw new RateAppError(`Failed to open store for review: ${error}`); } }, /** * Gets the URL for the Android market. * @param androidMarket The market where the app's store listing should be opened on Android. * @param androidPackageName The package name of the app to open the store listing for on Android. * @returns The URL for the Android market. */ getAndroidMarketUrl(androidMarket, androidPackageName) { const urlTemplate = ANDROID_MARKET_URLS[androidMarket]; if (!urlTemplate) { throw new RateAppError(`Unsupported Android market: ${androidMarket}`); } return urlTemplate.replace("{packageName}", androidPackageName); } }; export * from "./types"; export * from "./constants"; export const { requestReview, openStoreForReview, getAndroidMarketUrl } = RNRateApp; export default RNRateApp; //# sourceMappingURL=index.js.map