UNPKG

a0-purchases

Version:

Lightweight subscription management for AI apps with auto-detecting providers

115 lines 3.92 kB
import React, { createContext, useContext, useEffect, useState, useCallback } from 'react'; import { purchasesService } from './core/PurchasesService'; import { commerceState } from './core/commerceState'; import { A0PaymentProvider } from './A0PaymentProvider'; import { Platform } from 'react-native'; // Create context for the purchases state const PurchasesContext = createContext(null); export function A0PurchaseProvider({ children, config, }) { var _a, _b; const [state, setState] = useState(commerceState.getState()); const [isLoading, setIsLoading] = useState(false); // Subscribe to global commerce state updates useEffect(() => { const unsubscribe = commerceState.subscribe((newState) => setState(newState)); return unsubscribe; }, []); // Initialize purchases service once (or when config changes) useEffect(() => { const init = async () => { try { console.log('initializing', config); setIsLoading(true); await purchasesService.initialize(config); } catch (err) { console.error('[A0PurchaseProvider] initialization failed:', err); } finally { setIsLoading(false); } }; if (!state.isInitialized && !state.isInitializing) { init(); } }, [state.isInitialized, state.isInitializing, config]); // Purchase wrapper const purchase = useCallback(async (packageId) => { try { setIsLoading(true); await purchasesService.purchase(packageId); } finally { setIsLoading(false); } }, []); // Restore wrapper const restore = useCallback(async () => { try { setIsLoading(true); await purchasesService.restore(); } finally { setIsLoading(false); } }, []); // Log in wrapper const logIn = useCallback(async (userId) => { try { setIsLoading(true); await purchasesService.logIn(userId); } finally { setIsLoading(false); } }, []); // Log out wrapper const logOut = useCallback(async () => { try { setIsLoading(true); await purchasesService.logOut(); // Re-initialize with same config after logout await purchasesService.initialize(config); } finally { setIsLoading(false); } }, [config]); // Refresh customer info wrapper const refreshCustomerInfo = useCallback(async () => { try { setIsLoading(true); await purchasesService.refreshCustomerInfo(); } finally { setIsLoading(false); } }, []); // Prepare context value const ctx = { isPremium: ((_b = (_a = state.customerInfo) === null || _a === void 0 ? void 0 : _a.entitlements) === null || _b === void 0 ? void 0 : _b.active) ? Object.keys(state.customerInfo.entitlements.active).length > 0 : false, isLoading: isLoading || state.isInitializing || state.isPurchasing || state.isRestoring, isAnonymous: purchasesService.isAnonymous(), userId: state.userId, purchase, restore, logIn, logOut, refreshCustomerInfo, getCustomerInfo: () => state.customerInfo, offerings: state.offerings, }; return (<PurchasesContext.Provider value={ctx}> {Platform.OS !== 'ios' && <A0PaymentProvider />} {children} </PurchasesContext.Provider>); } export function useA0Purchases() { const ctx = useContext(PurchasesContext); if (!ctx) throw new Error('useA0Purchases must be used within A0PurchaseProvider'); return ctx; } //# sourceMappingURL=react-hooks.js.map