@explorins/pers-sdk-react-native 2.1.2 → 2.1.5

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 (38) hide show
  1. package/README.md +7 -7
  2. package/dist/hooks/index.d.ts +6 -0
  3. package/dist/hooks/index.d.ts.map +1 -1
  4. package/dist/hooks/index.js +1 -0
  5. package/dist/hooks/useAnalytics.d.ts +37 -14
  6. package/dist/hooks/useAnalytics.d.ts.map +1 -1
  7. package/dist/hooks/useAnalytics.js +239 -19
  8. package/dist/hooks/useCampaigns.d.ts +14 -6
  9. package/dist/hooks/useCampaigns.d.ts.map +1 -1
  10. package/dist/hooks/useCampaigns.js +144 -10
  11. package/dist/hooks/useRedemptions.d.ts +5 -2
  12. package/dist/hooks/useRedemptions.d.ts.map +1 -1
  13. package/dist/hooks/useRedemptions.js +53 -2
  14. package/dist/hooks/useTokenBalances.d.ts.map +1 -1
  15. package/dist/hooks/useTokenBalances.js +21 -8
  16. package/dist/hooks/useTransactions.d.ts +8 -5
  17. package/dist/hooks/useTransactions.d.ts.map +1 -1
  18. package/dist/hooks/useTransactions.js +70 -27
  19. package/dist/hooks/useTriggerSources.d.ts +76 -0
  20. package/dist/hooks/useTriggerSources.d.ts.map +1 -0
  21. package/dist/hooks/useTriggerSources.js +272 -0
  22. package/dist/index.d.ts +12 -3
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2742 -495
  25. package/dist/index.js.map +1 -1
  26. package/dist/providers/PersSDKProvider.d.ts +1 -12
  27. package/dist/providers/PersSDKProvider.d.ts.map +1 -1
  28. package/dist/providers/PersSDKProvider.js +50 -25
  29. package/package.json +2 -2
  30. package/src/hooks/index.ts +17 -1
  31. package/src/hooks/useAnalytics.ts +268 -21
  32. package/src/hooks/useCampaigns.ts +176 -14
  33. package/src/hooks/useRedemptions.ts +66 -3
  34. package/src/hooks/useTokenBalances.ts +23 -9
  35. package/src/hooks/useTransactions.ts +84 -29
  36. package/src/hooks/useTriggerSources.ts +301 -0
  37. package/src/index.ts +33 -3
  38. package/src/providers/PersSDKProvider.tsx +58 -39
package/README.md CHANGED
@@ -224,11 +224,10 @@ const {
224
224
  const {
225
225
  createTransaction,
226
226
  getTransactionById,
227
- getUserTransactionHistory,
228
- getTenantTransactions, // Admin
229
- getPaginatedTransactions, // Admin
230
- exportTransactionsCSV, // Admin
231
- signingStatus, // UI feedback during blockchain signing
227
+ getUserTransactionHistory, // With TransactionQueryOptions (includes pagination + filters + include)
228
+ getPaginatedTransactions, // Admin - single options object with include
229
+ exportTransactionsCSV, // Admin
230
+ signingStatus, // UI feedback during blockchain signing
232
231
  signingStatusMessage
233
232
  } = useTransactions();
234
233
 
@@ -261,12 +260,13 @@ const {
261
260
  // Campaign management
262
261
  const {
263
262
  getActiveCampaigns,
263
+ getCampaigns, // With options: { active?, businessId?, sortBy?, include?, page?, limit? }
264
264
  getCampaignById,
265
265
  claimCampaign,
266
- getUserClaims,
266
+ getUserClaims, // With options: { page?, limit?, include? }
267
267
  getCampaignTriggers,
268
268
  getAllCampaigns, // Admin
269
- getCampaignClaims, // Admin
269
+ getCampaignClaims, // Admin - with options object
270
270
  getCampaignClaimsByUserId, // Admin
271
271
  getCampaignClaimsByBusinessId // Admin
272
272
  } = useCampaigns();
@@ -15,9 +15,15 @@ export { useFiles } from './useFiles';
15
15
  export { useAnalytics } from './useAnalytics';
16
16
  export { useDonations } from './useDonations';
17
17
  export { useEvents } from './useEvents';
18
+ export { useTriggerSources } from './useTriggerSources';
18
19
  export type { RawUserData } from './useAuth';
19
20
  export type { TransactionSignerHook, SubmissionResult, AuthenticatedUser, TransactionSigningResult, StatusUpdateData, OnStatusUpdateFn, SigningStatus as SigningStatusType } from './useTransactionSigner';
20
21
  export type { AccountOwnedTokensResult, Web3Hook } from './useWeb3';
21
22
  export type { EventsHook, PersEvent, EventHandler, EventFilter, Unsubscribe } from './useEvents';
22
23
  export type { TokenBalanceWithToken, UseTokenBalancesOptions, UseTokenBalancesResult } from './useTokenBalances';
24
+ export type { CampaignClaimFilters, CampaignHook } from './useCampaigns';
25
+ export type { RedemptionRedeemFilters, RedemptionHook } from './useRedemptions';
26
+ export type { TransactionQueryOptions, TransactionHook } from './useTransactions';
27
+ export type { TriggerSourceQueryOptions, TriggerSourceHook } from './useTriggerSources';
28
+ export type { AnalyticsHook } from './useAnalytics';
23
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,IAAI,iBAAiB,EACnC,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjG,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,IAAI,iBAAiB,EACnC,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACjG,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGzE,YAAY,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGhF,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGlF,YAAY,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxF,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
@@ -16,3 +16,4 @@ export { useFiles } from './useFiles';
16
16
  export { useAnalytics } from './useAnalytics';
17
17
  export { useDonations } from './useDonations';
18
18
  export { useEvents } from './useEvents';
19
+ export { useTriggerSources } from './useTriggerSources';
@@ -1,35 +1,58 @@
1
- import { TransactionAnalyticsRequestDTO, TransactionAnalyticsResponseDTO } from '@explorins/pers-shared';
1
+ import { TransactionAnalyticsRequestDTO, TransactionAnalyticsResponseDTO, CampaignClaimAnalyticsRequestDTO, CampaignClaimAnalyticsResponseDTO, UserAnalyticsRequestDTO, UserAnalyticsResponseDTO, UserRankingAnalyticsRequestDTO, UserRankingAnalyticsResponseDTO, BusinessRankingAnalyticsRequestDTO, BusinessRankingAnalyticsResponseDTO, RetentionAnalyticsRequestDTO, RetentionAnalyticsResponseDTO } from '@explorins/pers-shared';
2
2
  /**
3
3
  * React hook for analytics operations in the PERS SDK
4
4
  *
5
- * Provides methods for retrieving transaction analytics and insights.
6
- * Supports various analytics queries for business intelligence and reporting.
5
+ * Provides comprehensive analytics and business intelligence capabilities:
6
+ * - **Transaction Analytics**: Volume, trends, business performance
7
+ * - **Campaign Claim Analytics**: Campaign performance and claim patterns
8
+ * - **User Analytics**: Engagement metrics with per-active-user averages
9
+ * - **User Ranking**: Leaderboards with full user details
10
+ * - **Business Ranking**: Business performance rankings
11
+ * - **Retention Analytics**: Monthly retention metrics
7
12
  *
8
13
  * @returns Analytics hook with methods for data analysis
9
14
  *
10
- * @example
15
+ * @example Basic Transaction Analytics
11
16
  * ```typescript
12
17
  * function AnalyticsComponent() {
13
18
  * const { getTransactionAnalytics } = useAnalytics();
14
19
  *
15
20
  * const loadAnalytics = async () => {
16
- * try {
17
- * const analytics = await getTransactionAnalytics({
18
- * timeRange: 'last_30_days',
19
- * groupBy: 'day'
20
- * });
21
- * console.log('Transaction analytics:', analytics);
22
- * } catch (error) {
23
- * console.error('Failed to load analytics:', error);
24
- * }
21
+ * const analytics = await getTransactionAnalytics({
22
+ * startDate: '2024-01-01',
23
+ * endDate: '2024-01-31',
24
+ * groupBy: 'day'
25
+ * });
26
+ * console.log('Transaction analytics:', analytics);
25
27
  * };
28
+ * }
29
+ * ```
26
30
  *
27
- * return <button onClick={loadAnalytics}>Load Analytics</button>;
31
+ * @example User Leaderboard
32
+ * ```typescript
33
+ * function LeaderboardScreen() {
34
+ * const { getUserRanking } = useAnalytics();
35
+ *
36
+ * const loadLeaderboard = async () => {
37
+ * const ranking = await getUserRanking({
38
+ * sortBy: 'totalTransactions',
39
+ * sortOrder: 'DESC',
40
+ * limit: 50
41
+ * });
42
+ * ranking.results.forEach((user, i) => {
43
+ * console.log(`#${i + 1}: ${user.email} - ${user.totalTransactions} txns`);
44
+ * });
45
+ * };
28
46
  * }
29
47
  * ```
30
48
  */
31
49
  export declare const useAnalytics: () => {
32
50
  getTransactionAnalytics: (request: TransactionAnalyticsRequestDTO) => Promise<TransactionAnalyticsResponseDTO>;
51
+ getCampaignClaimAnalytics: (request: CampaignClaimAnalyticsRequestDTO) => Promise<CampaignClaimAnalyticsResponseDTO>;
52
+ getUserAnalytics: (request?: UserAnalyticsRequestDTO) => Promise<UserAnalyticsResponseDTO>;
53
+ getUserRanking: (request?: UserRankingAnalyticsRequestDTO) => Promise<UserRankingAnalyticsResponseDTO>;
54
+ getBusinessRanking: (request?: BusinessRankingAnalyticsRequestDTO) => Promise<BusinessRankingAnalyticsResponseDTO>;
55
+ getRetentionAnalytics: (request?: RetentionAnalyticsRequestDTO) => Promise<RetentionAnalyticsResponseDTO>;
33
56
  isAvailable: boolean;
34
57
  };
35
58
  export type AnalyticsHook = ReturnType<typeof useAnalytics>;
@@ -1 +1 @@
1
- {"version":3,"file":"useAnalytics.d.ts","sourceRoot":"","sources":["../../src/hooks/useAnalytics.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAChC,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,YAAY;uCAwBqC,8BAA8B,KAAG,QAAQ,+BAA+B,CAAC;;CAkBtI,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"useAnalytics.d.ts","sourceRoot":"","sources":["../../src/hooks/useAnalytics.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,gCAAgC,EAChC,iCAAiC,EACjC,uBAAuB,EACvB,wBAAwB,EACxB,8BAA8B,EAC9B,+BAA+B,EAC/B,kCAAkC,EAClC,mCAAmC,EACnC,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,YAAY;uCAqBZ,8BAA8B,KACtC,QAAQ,+BAA+B,CAAC;yCAoChC,gCAAgC,KACxC,QAAQ,iCAAiC,CAAC;iCA+ClC,uBAAuB,KAC/B,QAAQ,wBAAwB,CAAC;+BAkDzB,8BAA8B,KACtC,QAAQ,+BAA+B,CAAC;mCAuChC,kCAAkC,KAC1C,QAAQ,mCAAmC,CAAC;sCAuCpC,4BAA4B,KACpC,QAAQ,6BAA6B,CAAC;;CAuB1C,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -3,29 +3,47 @@ import { usePersSDK } from '../providers/PersSDKProvider';
3
3
  /**
4
4
  * React hook for analytics operations in the PERS SDK
5
5
  *
6
- * Provides methods for retrieving transaction analytics and insights.
7
- * Supports various analytics queries for business intelligence and reporting.
6
+ * Provides comprehensive analytics and business intelligence capabilities:
7
+ * - **Transaction Analytics**: Volume, trends, business performance
8
+ * - **Campaign Claim Analytics**: Campaign performance and claim patterns
9
+ * - **User Analytics**: Engagement metrics with per-active-user averages
10
+ * - **User Ranking**: Leaderboards with full user details
11
+ * - **Business Ranking**: Business performance rankings
12
+ * - **Retention Analytics**: Monthly retention metrics
8
13
  *
9
14
  * @returns Analytics hook with methods for data analysis
10
15
  *
11
- * @example
16
+ * @example Basic Transaction Analytics
12
17
  * ```typescript
13
18
  * function AnalyticsComponent() {
14
19
  * const { getTransactionAnalytics } = useAnalytics();
15
20
  *
16
21
  * const loadAnalytics = async () => {
17
- * try {
18
- * const analytics = await getTransactionAnalytics({
19
- * timeRange: 'last_30_days',
20
- * groupBy: 'day'
21
- * });
22
- * console.log('Transaction analytics:', analytics);
23
- * } catch (error) {
24
- * console.error('Failed to load analytics:', error);
25
- * }
22
+ * const analytics = await getTransactionAnalytics({
23
+ * startDate: '2024-01-01',
24
+ * endDate: '2024-01-31',
25
+ * groupBy: 'day'
26
+ * });
27
+ * console.log('Transaction analytics:', analytics);
26
28
  * };
29
+ * }
30
+ * ```
31
+ *
32
+ * @example User Leaderboard
33
+ * ```typescript
34
+ * function LeaderboardScreen() {
35
+ * const { getUserRanking } = useAnalytics();
27
36
  *
28
- * return <button onClick={loadAnalytics}>Load Analytics</button>;
37
+ * const loadLeaderboard = async () => {
38
+ * const ranking = await getUserRanking({
39
+ * sortBy: 'totalTransactions',
40
+ * sortOrder: 'DESC',
41
+ * limit: 50
42
+ * });
43
+ * ranking.results.forEach((user, i) => {
44
+ * console.log(`#${i + 1}: ${user.email} - ${user.totalTransactions} txns`);
45
+ * });
46
+ * };
29
47
  * }
30
48
  * ```
31
49
  */
@@ -40,16 +58,12 @@ export const useAnalytics = () => {
40
58
  *
41
59
  * @example
42
60
  * ```typescript
43
- * const { getTransactionAnalytics } = useAnalytics();
44
61
  * const analytics = await getTransactionAnalytics({
45
- * groupBy: ['day'],
46
- * metrics: ['count', 'sum'],
47
62
  * startDate: '2024-01-01',
48
63
  * endDate: '2024-01-31',
49
- * filters: { status: 'completed' }
64
+ * groupBy: 'day',
65
+ * metrics: ['count', 'sum']
50
66
  * });
51
- * console.log('Daily transaction analytics:', analytics.results);
52
- * console.log('Execution time:', analytics.metadata.executionTime);
53
67
  * ```
54
68
  */
55
69
  const getTransactionAnalytics = useCallback(async (request) => {
@@ -65,8 +79,214 @@ export const useAnalytics = () => {
65
79
  throw error;
66
80
  }
67
81
  }, [sdk, isInitialized]);
82
+ /**
83
+ * Retrieves campaign claim analytics with aggregation
84
+ *
85
+ * Provides insights into campaign performance, claim patterns, and user engagement.
86
+ *
87
+ * @param request - Analytics request with filters, groupBy, and metrics
88
+ * @returns Promise resolving to campaign claim analytics data
89
+ *
90
+ * @example Claims per campaign
91
+ * ```typescript
92
+ * const analytics = await getCampaignClaimAnalytics({
93
+ * filters: { status: 'COMPLETED' },
94
+ * groupBy: ['campaignId'],
95
+ * metrics: ['count'],
96
+ * sortBy: 'count',
97
+ * sortOrder: 'DESC',
98
+ * limit: 10
99
+ * });
100
+ * console.log('Top campaigns:', analytics.results);
101
+ * ```
102
+ */
103
+ const getCampaignClaimAnalytics = useCallback(async (request) => {
104
+ if (!isInitialized || !sdk) {
105
+ throw new Error('SDK not initialized. Call initialize() first.');
106
+ }
107
+ try {
108
+ const result = await sdk.analytics.getCampaignClaimAnalytics(request);
109
+ return result;
110
+ }
111
+ catch (error) {
112
+ console.error('Failed to fetch campaign claim analytics:', error);
113
+ throw error;
114
+ }
115
+ }, [sdk, isInitialized]);
116
+ /**
117
+ * Retrieves user analytics with engagement metrics
118
+ *
119
+ * Includes both per-user and per-active-user metrics for accurate engagement insights.
120
+ * Per-active-user metrics show concentrated engagement among active users.
121
+ *
122
+ * @param request - Analytics request with optional filters and date range
123
+ * @returns Promise resolving to user analytics data
124
+ *
125
+ * @example Compare per-user vs per-active-user metrics
126
+ * ```typescript
127
+ * const analytics = await getUserAnalytics({
128
+ * startDate: new Date('2026-02-01'),
129
+ * endDate: new Date('2026-02-28')
130
+ * });
131
+ *
132
+ * console.log(`Active users: ${analytics.activeUsers} / ${analytics.totalUsers}`);
133
+ * console.log(`Engagement rate: ${analytics.engagementRate.toFixed(1)}%`);
134
+ *
135
+ * // Per-active-user metrics (more meaningful)
136
+ * console.log(`Avg transactions per active user: ${analytics.averageTransactionsPerActiveUser}`);
137
+ * ```
138
+ *
139
+ * @example Business-specific analytics
140
+ * ```typescript
141
+ * const analytics = await getUserAnalytics({
142
+ * filters: { businessId: 'business-123' },
143
+ * startDate: new Date('2026-01-01'),
144
+ * endDate: new Date('2026-12-31')
145
+ * });
146
+ * ```
147
+ */
148
+ const getUserAnalytics = useCallback(async (request = {}) => {
149
+ if (!isInitialized || !sdk) {
150
+ throw new Error('SDK not initialized. Call initialize() first.');
151
+ }
152
+ try {
153
+ const result = await sdk.analytics.getUserAnalytics(request);
154
+ return result;
155
+ }
156
+ catch (error) {
157
+ console.error('Failed to fetch user analytics:', error);
158
+ throw error;
159
+ }
160
+ }, [sdk, isInitialized]);
161
+ /**
162
+ * Retrieves user transaction ranking with enriched user data
163
+ *
164
+ * Returns ranked list of users with full user details (email, externalUserId)
165
+ * and transaction metrics. Ideal for leaderboards, engagement analysis,
166
+ * and identifying power users.
167
+ *
168
+ * @param request - Ranking request with filters, sorting, and limit
169
+ * @returns Promise resolving to ranked user list with transaction metrics
170
+ *
171
+ * @example Top 50 users by transaction count
172
+ * ```typescript
173
+ * const ranking = await getUserRanking({
174
+ * sortBy: 'totalTransactions',
175
+ * sortOrder: 'DESC',
176
+ * limit: 50
177
+ * });
178
+ *
179
+ * ranking.results.forEach((user, index) => {
180
+ * console.log(`#${index + 1}: ${user.email || user.externalUserId}`);
181
+ * console.log(` Transactions: ${user.totalTransactions}`);
182
+ * console.log(` Token spent: ${user.tokenSpent}`);
183
+ * });
184
+ * ```
185
+ *
186
+ * @example Top STAMP spenders
187
+ * ```typescript
188
+ * const ranking = await getUserRanking({
189
+ * filters: { tokenType: 'STAMP' },
190
+ * sortBy: 'tokenSpent',
191
+ * sortOrder: 'DESC',
192
+ * limit: 20
193
+ * });
194
+ * ```
195
+ */
196
+ const getUserRanking = useCallback(async (request = {}) => {
197
+ if (!isInitialized || !sdk) {
198
+ throw new Error('SDK not initialized. Call initialize() first.');
199
+ }
200
+ try {
201
+ const result = await sdk.analytics.getUserRanking(request);
202
+ return result;
203
+ }
204
+ catch (error) {
205
+ console.error('Failed to fetch user ranking:', error);
206
+ throw error;
207
+ }
208
+ }, [sdk, isInitialized]);
209
+ /**
210
+ * Retrieves business transaction ranking with enriched business data
211
+ *
212
+ * Returns ranked list of businesses with transaction metrics for
213
+ * partner analytics and performance dashboards.
214
+ *
215
+ * @param request - Ranking request with filters, sorting, and limit
216
+ * @returns Promise resolving to ranked business list
217
+ *
218
+ * @example Top businesses by transaction count
219
+ * ```typescript
220
+ * const ranking = await getBusinessRanking({
221
+ * sortBy: 'totalTransactions',
222
+ * sortOrder: 'DESC',
223
+ * limit: 20
224
+ * });
225
+ *
226
+ * ranking.results.forEach((business, index) => {
227
+ * console.log(`#${index + 1}: ${business.businessId}`);
228
+ * console.log(` Transactions: ${business.totalTransactions}`);
229
+ * console.log(` Token spent: ${business.tokenSpent}`);
230
+ * });
231
+ * ```
232
+ */
233
+ const getBusinessRanking = useCallback(async (request = {}) => {
234
+ if (!isInitialized || !sdk) {
235
+ throw new Error('SDK not initialized. Call initialize() first.');
236
+ }
237
+ try {
238
+ const result = await sdk.analytics.getBusinessRanking(request);
239
+ return result;
240
+ }
241
+ catch (error) {
242
+ console.error('Failed to fetch business ranking:', error);
243
+ throw error;
244
+ }
245
+ }, [sdk, isInitialized]);
246
+ /**
247
+ * Retrieves monthly user retention analytics
248
+ *
249
+ * Returns monthly retention data with active, new, and returning users
250
+ * along with retention rates. Useful for churn analysis and engagement trends.
251
+ *
252
+ * @param request - Retention request with monthsBack and filters
253
+ * @returns Promise resolving to monthly retention data
254
+ *
255
+ * @example Get 12 months of retention data
256
+ * ```typescript
257
+ * const retention = await getRetentionAnalytics({
258
+ * monthsBack: 12
259
+ * });
260
+ *
261
+ * retention.results.forEach(month => {
262
+ * console.log(`${month.month}:`);
263
+ * console.log(` Active: ${month.activeUsers}`);
264
+ * console.log(` New: ${month.newUsers}`);
265
+ * console.log(` Returning: ${month.returningUsers}`);
266
+ * console.log(` Retention Rate: ${month.retentionRate.toFixed(1)}%`);
267
+ * });
268
+ * ```
269
+ */
270
+ const getRetentionAnalytics = useCallback(async (request = {}) => {
271
+ if (!isInitialized || !sdk) {
272
+ throw new Error('SDK not initialized. Call initialize() first.');
273
+ }
274
+ try {
275
+ const result = await sdk.analytics.getRetentionAnalytics(request);
276
+ return result;
277
+ }
278
+ catch (error) {
279
+ console.error('Failed to fetch retention analytics:', error);
280
+ throw error;
281
+ }
282
+ }, [sdk, isInitialized]);
68
283
  return {
69
284
  getTransactionAnalytics,
285
+ getCampaignClaimAnalytics,
286
+ getUserAnalytics,
287
+ getUserRanking,
288
+ getBusinessRanking,
289
+ getRetentionAnalytics,
70
290
  isAvailable: isInitialized && !!sdk?.analytics,
71
291
  };
72
292
  };
@@ -1,14 +1,22 @@
1
- import type { CampaignClaimRequestDTO, CampaignDTO, CampaignClaimDTO, CampaignTriggerDTO, PaginatedResponseDTO } from '@explorins/pers-shared';
1
+ import type { CampaignClaimRequestDTO, CampaignDTO, CampaignClaimDTO, CampaignTriggerDTO, PaginatedResponseDTO, CampaignClaimIncludeRelation, CampaignIncludeRelation } from '@explorins/pers-shared';
2
+ import type { CampaignClaimFilters } from '@explorins/pers-sdk/campaign';
3
+ export type { CampaignClaimFilters } from '@explorins/pers-sdk/campaign';
2
4
  export declare const useCampaigns: () => {
3
5
  getActiveCampaigns: () => Promise<PaginatedResponseDTO<CampaignDTO>>;
4
- getCampaignById: (campaignId: string) => Promise<CampaignDTO | null>;
6
+ getCampaignById: (campaignId: string, include?: CampaignIncludeRelation[]) => Promise<CampaignDTO | null>;
5
7
  claimCampaign: (request: CampaignClaimRequestDTO) => Promise<CampaignClaimDTO | null>;
6
- getUserClaims: () => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
8
+ getUserClaims: (options?: {
9
+ page?: number;
10
+ limit?: number;
11
+ include?: CampaignClaimIncludeRelation[];
12
+ }) => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
7
13
  getCampaignTriggers: () => Promise<PaginatedResponseDTO<CampaignTriggerDTO>>;
8
14
  getAllCampaigns: (active?: boolean) => Promise<PaginatedResponseDTO<CampaignDTO>>;
9
- getCampaignClaims: () => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
10
- getCampaignClaimsByUserId: (userId: string) => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
11
- getCampaignClaimsByBusinessId: (businessId: string) => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
15
+ getCampaignClaims: (filters?: CampaignClaimFilters, include?: CampaignClaimIncludeRelation[]) => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
16
+ getCampaignClaimsByUserId: (userId: string, include?: CampaignClaimIncludeRelation[]) => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
17
+ getCampaignClaimsByBusinessId: (businessId: string, include?: CampaignClaimIncludeRelation[]) => Promise<PaginatedResponseDTO<CampaignClaimDTO>>;
18
+ assignTriggerSource: (campaignId: string, triggerSourceId: string) => Promise<CampaignDTO>;
19
+ removeTriggerSource: (campaignId: string, triggerSourceId: string) => Promise<CampaignDTO>;
12
20
  isAvailable: boolean;
13
21
  };
14
22
  export type CampaignHook = ReturnType<typeof useCampaigns>;
@@ -1 +1 @@
1
- {"version":3,"file":"useCampaigns.d.ts","sourceRoot":"","sources":["../../src/hooks/useCampaigns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAIlB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,YAAY;8BAG0B,QAAQ,qBAAqB,WAAW,CAAC,CAAC;kCAcpC,MAAM,KAAG,QAAQ,WAAW,GAAG,IAAI,CAAC;6BAczC,uBAAuB,KAAG,QAAQ,gBAAgB,GAAG,IAAI,CAAC;yBAiBhE,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;+BAkBzC,QAAQ,qBAAqB,kBAAkB,CAAC,CAAC;+BAe/C,OAAO,KAAG,QAAQ,qBAAqB,WAAW,CAAC,CAAC;6BAcxD,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;wCAclC,MAAM,KAAG,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;gDAchD,MAAM,KAAG,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;;CA0B9H,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"useCampaigns.d.ts","sourceRoot":"","sources":["../../src/hooks/useCampaigns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,eAAO,MAAM,YAAY;8BAG0B,QAAQ,qBAAqB,WAAW,CAAC,CAAC;kCA6B7E,MAAM,YACR,uBAAuB,EAAE,KAClC,QAAQ,WAAW,GAAG,IAAI,CAAC;6BAcoB,uBAAuB,KAAG,QAAQ,gBAAgB,GAAG,IAAI,CAAC;8BAmCzD;QACjD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,4BAA4B,EAAE,CAAC;KAC1C,KAAG,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;+BAkBD,QAAQ,qBAAqB,kBAAkB,CAAC,CAAC;+BAe/C,OAAO,KAAG,QAAQ,qBAAqB,WAAW,CAAC,CAAC;kCA+B5F,oBAAoB,YACpB,4BAA4B,EAAE,KACvC,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;wCAsBxC,MAAM,YACJ,4BAA4B,EAAE,KACvC,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;gDAsBpC,MAAM,YACR,4BAA4B,EAAE,KACvC,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;sCA4CpC,MAAM,mBACD,MAAM,KACtB,QAAQ,WAAW,CAAC;sCA4BT,MAAM,mBACD,MAAM,KACtB,QAAQ,WAAW,CAAC;;CA+BxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC"}