@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.
- package/README.md +7 -7
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAnalytics.d.ts +37 -14
- package/dist/hooks/useAnalytics.d.ts.map +1 -1
- package/dist/hooks/useAnalytics.js +239 -19
- package/dist/hooks/useCampaigns.d.ts +14 -6
- package/dist/hooks/useCampaigns.d.ts.map +1 -1
- package/dist/hooks/useCampaigns.js +144 -10
- package/dist/hooks/useRedemptions.d.ts +5 -2
- package/dist/hooks/useRedemptions.d.ts.map +1 -1
- package/dist/hooks/useRedemptions.js +53 -2
- package/dist/hooks/useTokenBalances.d.ts.map +1 -1
- package/dist/hooks/useTokenBalances.js +21 -8
- package/dist/hooks/useTransactions.d.ts +8 -5
- package/dist/hooks/useTransactions.d.ts.map +1 -1
- package/dist/hooks/useTransactions.js +70 -27
- package/dist/hooks/useTriggerSources.d.ts +76 -0
- package/dist/hooks/useTriggerSources.d.ts.map +1 -0
- package/dist/hooks/useTriggerSources.js +272 -0
- package/dist/index.d.ts +12 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2742 -495
- package/dist/index.js.map +1 -1
- package/dist/providers/PersSDKProvider.d.ts +1 -12
- package/dist/providers/PersSDKProvider.d.ts.map +1 -1
- package/dist/providers/PersSDKProvider.js +50 -25
- package/package.json +2 -2
- package/src/hooks/index.ts +17 -1
- package/src/hooks/useAnalytics.ts +268 -21
- package/src/hooks/useCampaigns.ts +176 -14
- package/src/hooks/useRedemptions.ts +66 -3
- package/src/hooks/useTokenBalances.ts +23 -9
- package/src/hooks/useTransactions.ts +84 -29
- package/src/hooks/useTriggerSources.ts +301 -0
- package/src/index.ts +33 -3
- 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
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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();
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -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
|
|
6
|
-
*
|
|
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
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
7
|
-
*
|
|
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
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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: (
|
|
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,
|
|
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"}
|