@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.
- package/package.json +1 -1
- package/src/domains/credits/application/CreditsInitializer.ts +34 -39
- package/src/domains/credits/application/DeductCreditsCommand.ts +13 -12
- package/src/domains/credits/presentation/deduct-credit/useDeductCredit.ts +9 -16
- package/src/domains/credits/presentation/useCredits.ts +2 -2
- package/src/domains/credits/presentation/useCredits.types.ts +1 -1
- package/src/domains/paywall/components/PaywallScreen.tsx +12 -11
- package/src/domains/paywall/hooks/usePaywallActions.ts +4 -3
- package/src/domains/paywall/hooks/usePaywallActions.utils.ts +14 -19
- package/src/domains/paywall/hooks/usePaywallPurchase.ts +10 -17
- package/src/domains/paywall/hooks/usePaywallRestore.ts +8 -15
- package/src/domains/revenuecat/infrastructure/services/RevenueCatInitializer.ts +6 -5
- package/src/domains/revenuecat/infrastructure/services/UserSwitchMutex.ts +8 -10
- package/src/domains/revenuecat/infrastructure/services/userSwitchCore.ts +16 -33
- package/src/domains/revenuecat/infrastructure/services/userSwitchHelpers.ts +3 -4
- package/src/domains/revenuecat/infrastructure/services/userSwitchInitializer.ts +18 -28
- package/src/domains/subscription/application/initializer/BackgroundInitializer.ts +17 -29
- package/src/domains/subscription/application/sync/CreditDocumentOperations.ts +16 -17
- package/src/domains/subscription/application/sync/PurchaseSyncHandler.ts +20 -23
- package/src/domains/subscription/application/sync/RenewalSyncHandler.ts +8 -7
- package/src/domains/subscription/application/sync/StatusChangeSyncHandler.ts +4 -3
- package/src/domains/subscription/application/sync/SyncProcessorLogger.ts +39 -64
- package/src/domains/subscription/application/sync/UserIdResolver.ts +5 -1
- package/src/domains/subscription/infrastructure/handlers/package-operations/PackageFetcher.ts +7 -6
- package/src/domains/subscription/infrastructure/handlers/package-operations/PackagePurchaser.ts +8 -7
- package/src/domains/subscription/infrastructure/hooks/usePurchasePackage.ts +4 -3
- package/src/domains/subscription/infrastructure/managers/SubscriptionManager.ts +20 -27
- package/src/domains/subscription/infrastructure/services/CustomerInfoListenerManager.ts +10 -9
- package/src/domains/subscription/infrastructure/services/OfferingsFetcher.ts +14 -21
- package/src/domains/subscription/infrastructure/services/PurchaseHandler.ts +8 -7
- package/src/domains/subscription/infrastructure/services/RevenueCatService.types.ts +4 -3
- package/src/domains/subscription/infrastructure/services/listeners/CustomerInfoHandler.ts +15 -29
- package/src/domains/subscription/infrastructure/services/purchase/PurchaseErrorHandler.ts +4 -2
- package/src/domains/subscription/infrastructure/services/purchase/PurchaseExecutor.ts +27 -33
- package/src/domains/subscription/infrastructure/utils/InitializationCache.ts +5 -1
- package/src/domains/subscription/infrastructure/utils/PremiumStatusSyncer.ts +11 -17
- package/src/domains/subscription/presentation/providers/SubscriptionFlowProvider.tsx +11 -12
- package/src/domains/subscription/presentation/useSyncStatusListener.ts +10 -9
- package/src/init/createSubscriptionInitModule.ts +4 -1
- 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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
49
|
+
logger.error("Listener error for event", error, { event });
|
|
47
50
|
}
|
|
48
51
|
});
|
|
49
52
|
});
|