UNPKG

@kirz/react-native-toolkit

Version:

Toolkit to speed up React Native development

118 lines (117 loc) 5.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InAppPurchaseContext = void 0; exports.InAppPurchaseProvider = InAppPurchaseProvider; var _react = _interopRequireWildcard(require("react")); var _PluginsBundleContext = require("./PluginsBundleContext"); var _types = require("../plugins/types"); var _waitUntil = require("../utils/promise/waitUntil"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const InAppPurchaseContext = /*#__PURE__*/(0, _react.createContext)({}); exports.InAppPurchaseContext = InAppPurchaseContext; function InAppPurchaseProvider(_ref) { let { children } = _ref; const [isInitialized, setIsInitialized] = (0, _react.useState)(false); const { bundle } = (0, _react.useContext)(_PluginsBundleContext.PluginsBundleContext); const iapPurchasePlugin = (0, _react.useMemo)(() => { return bundle.getByFeature('InAppPurchase'); }, [bundle]); const [activeSubscription, setActiveSubscription] = (0, _react.useState)(null); const [hasPremiumAccess, setHasPremiumAccess] = (0, _react.useState)(false); const lastUserDataFetchTimestamp = (0, _react.useRef)(new Date().valueOf()); const fetchUserData = (0, _react.useCallback)(async () => { if (!iapPurchasePlugin) { throw new Error('IAP is not initialized'); } const results = await Promise.all([iapPurchasePlugin.receiptValidator.hasPremiumAccess(), iapPurchasePlugin.receiptValidator.getActiveSubscription()]); setHasPremiumAccess(results[0]); const subscriptionInstance = results[1] && new _types.Subscription(iapPurchasePlugin.subscriptions.find(x => { var _results$; return x.productId === ((_results$ = results[1]) === null || _results$ === void 0 ? void 0 : _results$.productId); })); setActiveSubscription(subscriptionInstance && results[1] ? { ...subscriptionInstance, ...results[1], formatPrice(options) { return subscriptionInstance.formatPrice(options); } } : null); setIsInitialized(true); lastUserDataFetchTimestamp.current = new Date().valueOf(); return results[0]; }, [iapPurchasePlugin]); const restorePurchases = (0, _react.useCallback)(async () => { if (!iapPurchasePlugin) { throw new Error('IAP is not initialized'); } await iapPurchasePlugin.receiptValidator.restorePurchases(); return fetchUserData(); }, [iapPurchasePlugin]); const purchaseProduct = (0, _react.useCallback)(async productId => { if (!iapPurchasePlugin) { throw new Error('IAP plugin not found'); } try { const purchase = await iapPurchasePlugin.purchaseProduct(productId); return purchase; } catch (err) { const error = err; if (error.isCancelled) { return null; } throw new Error(error.message); } }, [iapPurchasePlugin]); const purchasePremium = (0, _react.useCallback)(async productId => { const purchase = await purchaseProduct(productId); if (!purchase) { return null; } await (0, _waitUntil.waitUntil)(async () => { await iapPurchasePlugin.receiptValidator.restorePurchases(); return await fetchUserData(); }); await iapPurchasePlugin.refetchProducts(); return purchase; }, [purchaseProduct, iapPurchasePlugin]); const premiumAccess = (0, _react.useCallback)(func => { return async function () { let isAllowed = hasPremiumAccess; if (new Date().valueOf() - lastUserDataFetchTimestamp.current > 1000 * 60 * 60) { isAllowed = await restorePurchases(); } if (!isAllowed) { throw new Error('Premium access required'); } return func(...arguments); }; }, [hasPremiumAccess, fetchUserData, restorePurchases]); const contextData = (0, _react.useMemo)(() => ({ isInitialized, hasPremiumAccess, activeSubscription, products: (iapPurchasePlugin === null || iapPurchasePlugin === void 0 ? void 0 : iapPurchasePlugin.products) ?? [], subscriptions: (iapPurchasePlugin === null || iapPurchasePlugin === void 0 ? void 0 : iapPurchasePlugin.subscriptions) ?? [], restorePurchases, purchaseProduct, purchasePremium, premiumAccess }), [isInitialized, iapPurchasePlugin, hasPremiumAccess, activeSubscription, restorePurchases, purchaseProduct, purchasePremium, premiumAccess]); (0, _react.useEffect)(() => { if (!iapPurchasePlugin) { return; } fetchUserData(); }, [iapPurchasePlugin]); return /*#__PURE__*/_react.default.createElement(InAppPurchaseContext.Provider, { value: contextData }, children); } //# sourceMappingURL=InAppPurchaseContext.js.map