@umituz/react-native-subscription 3.1.33 → 3.1.35

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.
Files changed (40) hide show
  1. package/package.json +1 -1
  2. package/src/domains/credits/application/CreditsInitializer.ts +34 -39
  3. package/src/domains/credits/application/DeductCreditsCommand.ts +13 -12
  4. package/src/domains/credits/presentation/deduct-credit/useDeductCredit.ts +9 -16
  5. package/src/domains/credits/presentation/useCredits.ts +2 -2
  6. package/src/domains/credits/presentation/useCredits.types.ts +1 -1
  7. package/src/domains/paywall/components/PaywallScreen.tsx +12 -11
  8. package/src/domains/paywall/hooks/usePaywallActions.ts +4 -3
  9. package/src/domains/paywall/hooks/usePaywallActions.utils.ts +14 -19
  10. package/src/domains/paywall/hooks/usePaywallPurchase.ts +10 -17
  11. package/src/domains/paywall/hooks/usePaywallRestore.ts +8 -15
  12. package/src/domains/revenuecat/infrastructure/services/RevenueCatInitializer.ts +6 -5
  13. package/src/domains/revenuecat/infrastructure/services/UserSwitchMutex.ts +8 -10
  14. package/src/domains/revenuecat/infrastructure/services/userSwitchCore.ts +16 -33
  15. package/src/domains/revenuecat/infrastructure/services/userSwitchHelpers.ts +3 -4
  16. package/src/domains/revenuecat/infrastructure/services/userSwitchInitializer.ts +18 -28
  17. package/src/domains/subscription/application/initializer/BackgroundInitializer.ts +17 -29
  18. package/src/domains/subscription/application/sync/CreditDocumentOperations.ts +16 -17
  19. package/src/domains/subscription/application/sync/PurchaseSyncHandler.ts +20 -23
  20. package/src/domains/subscription/application/sync/RenewalSyncHandler.ts +8 -7
  21. package/src/domains/subscription/application/sync/StatusChangeSyncHandler.ts +4 -3
  22. package/src/domains/subscription/application/sync/SyncProcessorLogger.ts +39 -64
  23. package/src/domains/subscription/application/sync/UserIdResolver.ts +5 -1
  24. package/src/domains/subscription/infrastructure/handlers/package-operations/PackageFetcher.ts +7 -6
  25. package/src/domains/subscription/infrastructure/handlers/package-operations/PackagePurchaser.ts +8 -7
  26. package/src/domains/subscription/infrastructure/hooks/usePurchasePackage.ts +4 -3
  27. package/src/domains/subscription/infrastructure/managers/SubscriptionManager.ts +20 -27
  28. package/src/domains/subscription/infrastructure/services/CustomerInfoListenerManager.ts +10 -9
  29. package/src/domains/subscription/infrastructure/services/OfferingsFetcher.ts +14 -21
  30. package/src/domains/subscription/infrastructure/services/PurchaseHandler.ts +8 -7
  31. package/src/domains/subscription/infrastructure/services/RevenueCatService.types.ts +4 -3
  32. package/src/domains/subscription/infrastructure/services/listeners/CustomerInfoHandler.ts +15 -29
  33. package/src/domains/subscription/infrastructure/services/purchase/PurchaseErrorHandler.ts +4 -2
  34. package/src/domains/subscription/infrastructure/services/purchase/PurchaseExecutor.ts +27 -33
  35. package/src/domains/subscription/infrastructure/utils/InitializationCache.ts +5 -1
  36. package/src/domains/subscription/infrastructure/utils/PremiumStatusSyncer.ts +11 -17
  37. package/src/domains/subscription/presentation/providers/SubscriptionFlowProvider.tsx +11 -12
  38. package/src/domains/subscription/presentation/useSyncStatusListener.ts +10 -9
  39. package/src/init/createSubscriptionInitModule.ts +4 -1
  40. package/src/shared/infrastructure/SubscriptionEventBus.ts +4 -1
@@ -3,20 +3,21 @@ import type { RevenueCatConfig } from "../../../revenuecat/core/types/RevenueCat
3
3
  import type { PurchaseSource } from "../../core/SubscriptionConstants";
4
4
  import type { PackageType } from "../../../revenuecat/core/types/RevenueCatTypes";
5
5
  import { getPremiumEntitlement } from "../../../revenuecat/core/types/RevenueCatTypes";
6
+ import { createLogger } from "../../../../shared/utils/logger";
7
+
8
+ const logger = createLogger("PremiumStatusSyncer");
6
9
 
7
10
  export async function syncPremiumStatus(
8
11
  config: RevenueCatConfig,
9
12
  userId: string,
10
13
  customerInfo: CustomerInfo
11
14
  ): Promise<{ success: boolean; error?: Error }> {
12
- if (typeof __DEV__ !== "undefined" && __DEV__) {
13
- console.log("[PremiumStatusSyncer] syncPremiumStatus called:", {
14
- userId,
15
- hasCallback: !!config.onPremiumStatusChanged,
16
- entitlementId: config.entitlementIdentifier,
17
- activeEntitlements: Object.keys(customerInfo.entitlements.active),
18
- });
19
- }
15
+ logger.debug("syncPremiumStatus called", {
16
+ userId,
17
+ hasCallback: !!config.onPremiumStatusChanged,
18
+ entitlementId: config.entitlementIdentifier,
19
+ activeEntitlements: Object.keys(customerInfo.entitlements.active),
20
+ });
20
21
 
21
22
  if (!config.onPremiumStatusChanged) {
22
23
  return { success: true };
@@ -49,12 +50,7 @@ export async function syncPremiumStatus(
49
50
  }
50
51
  return { success: true };
51
52
  } catch (error) {
52
- if (__DEV__) {
53
- console.error('[PremiumStatusSyncer] Premium status callback failed:', {
54
- userId,
55
- error: error instanceof Error ? error.message : String(error)
56
- });
57
- }
53
+ logger.error("Premium status callback failed", error, { userId });
58
54
 
59
55
  return {
60
56
  success: false,
@@ -87,8 +83,6 @@ export async function notifyRestoreCompleted(
87
83
  try {
88
84
  await config.onRestoreCompleted({ userId, isPremium, customerInfo });
89
85
  } catch (error) {
90
- if (__DEV__) {
91
- console.error('[PremiumStatusSyncer] Restore callback failed:', error instanceof Error ? error.message : String(error));
92
- }
86
+ logger.error("Restore callback failed", error);
93
87
  }
94
88
  }
@@ -2,6 +2,9 @@ import React, { createContext, useContext, useEffect } from "react";
2
2
  import { useSubscriptionFlowStore, SubscriptionFlowStatus } from "../useSubscriptionFlow";
3
3
  import { useSyncStatusListener } from "../useSyncStatusListener";
4
4
  import { initializationState } from "../../infrastructure/state/initializationState";
5
+ import { createLogger } from "../../../../shared/utils/logger";
6
+
7
+ const logger = createLogger("SubscriptionFlowProvider");
5
8
 
6
9
  interface SubscriptionFlowContextType {
7
10
  status: SubscriptionFlowStatus;
@@ -24,9 +27,7 @@ export const SubscriptionFlowProvider: React.FC<{ children: React.ReactNode }> =
24
27
  // 1. Listen to background initialization state
25
28
  const unsubscribe = initializationState.subscribe(() => {
26
29
  const { initialized } = initializationState.getSnapshot();
27
- if (__DEV__) {
28
- console.log('[SubscriptionFlowProvider] 🔄 Initialization status updated:', { initialized });
29
- }
30
+ logger.debug("Initialization status updated", { initialized });
30
31
  if (initialized && !isInitialized) {
31
32
  setInitialized(true);
32
33
  }
@@ -35,7 +36,7 @@ export const SubscriptionFlowProvider: React.FC<{ children: React.ReactNode }> =
35
36
  // Check initial state
36
37
  const { initialized: currentlyInitialized } = initializationState.getSnapshot();
37
38
  if (currentlyInitialized && !isInitialized) {
38
- if (__DEV__) console.log('[SubscriptionFlowProvider] ✅ Already initialized on mount');
39
+ logger.debug("Already initialized on mount");
39
40
  setInitialized(true);
40
41
  }
41
42
 
@@ -44,13 +45,11 @@ export const SubscriptionFlowProvider: React.FC<{ children: React.ReactNode }> =
44
45
 
45
46
  useEffect(() => {
46
47
  // This effect manages the overall flow status transition
47
- if (__DEV__) {
48
- console.log('[SubscriptionFlowProvider] 🧠 Calculating Status Transition', {
49
- isInitialized,
50
- isOnboardingComplete,
51
- currentStatus: status
52
- });
53
- }
48
+ logger.debug("Calculating Status Transition", {
49
+ isInitialized,
50
+ isOnboardingComplete,
51
+ currentStatus: status
52
+ });
54
53
 
55
54
  let nextStatus = SubscriptionFlowStatus.READY;
56
55
 
@@ -70,7 +69,7 @@ export const SubscriptionFlowProvider: React.FC<{ children: React.ReactNode }> =
70
69
  }
71
70
 
72
71
  if (nextStatus !== status) {
73
- if (__DEV__) console.log('[SubscriptionFlowProvider] 🚀 Transitioning status to:', nextStatus);
72
+ logger.debug("Transitioning status to", nextStatus);
74
73
  setStatus(nextStatus);
75
74
  }
76
75
  }, [
@@ -1,6 +1,9 @@
1
1
  import { useEffect } from "react";
2
2
  import { subscriptionEventBus, SUBSCRIPTION_EVENTS } from "../../../shared/infrastructure/SubscriptionEventBus";
3
3
  import { useSubscriptionFlowStore, SyncStatus } from "./useSubscriptionFlow";
4
+ import { createLogger } from "../../../shared/utils/logger";
5
+
6
+ const logger = createLogger("useSyncStatusListener");
4
7
 
5
8
  interface SyncStatusEvent {
6
9
  status: 'syncing' | 'success' | 'error';
@@ -30,15 +33,13 @@ export function useSyncStatusListener() {
30
33
 
31
34
  setSyncStatus(syncStatus, event.error);
32
35
 
33
- if (__DEV__) {
34
- console.log('[useSyncStatusListener] Sync status updated', {
35
- status: event.status,
36
- phase: event.phase,
37
- userId: event.userId,
38
- productId: event.productId,
39
- error: event.error,
40
- });
41
- }
36
+ logger.debug("Sync status updated", {
37
+ status: event.status,
38
+ phase: event.phase,
39
+ userId: event.userId,
40
+ productId: event.productId,
41
+ error: event.error,
42
+ });
42
43
  }
43
44
  );
44
45
 
@@ -1,6 +1,9 @@
1
1
  import type { InitModule } from '@umituz/react-native-design-system/init';
2
2
  import { initializeSubscription } from "../domains/subscription/application/initializer/SubscriptionInitializer";
3
3
  import type { SubscriptionInitConfig } from "../domains/subscription/application/SubscriptionInitializerTypes";
4
+ import { createLogger } from "../shared/utils/logger";
5
+
6
+ const logger = createLogger("SubscriptionInitModule");
4
7
 
5
8
  export interface SubscriptionInitModuleConfig extends Omit<SubscriptionInitConfig, 'apiKey'> {
6
9
  getApiKey: () => string | undefined;
@@ -34,7 +37,7 @@ export function createSubscriptionInitModule(config: SubscriptionInitModuleConfi
34
37
  subscriptionCleanup = await initializeSubscription({ apiKey, ...subscriptionConfig });
35
38
  return true;
36
39
  } catch (error) {
37
- console.error('[SubscriptionInitModule] Initialization failed:', error instanceof Error ? error.message : String(error));
40
+ logger.error("Initialization failed", error);
38
41
  throw error;
39
42
  }
40
43
  },
@@ -1,4 +1,7 @@
1
1
  type EventCallback<T = unknown> = (data: T) => void;
2
+ import { createLogger } from "../utils/logger";
3
+
4
+ const logger = createLogger("SubscriptionEventBus");
2
5
 
3
6
  class SubscriptionEventBus {
4
7
  private static instance: SubscriptionEventBus;
@@ -43,7 +46,7 @@ class SubscriptionEventBus {
43
46
  try {
44
47
  callback(data);
45
48
  } catch (error) {
46
- console.error('[SubscriptionEventBus] Listener error for event:', event, { error });
49
+ logger.error("Listener error for event", error, { event });
47
50
  }
48
51
  });
49
52
  });