@kirz/react-native-toolkit
Version:
Toolkit to speed up React Native development
118 lines (117 loc) • 5.71 kB
JavaScript
;
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