@explorins/pers-sdk-react-native 2.0.1 → 2.0.3

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/dist/index.d.ts CHANGED
@@ -240,10 +240,24 @@ export { initializeReactNativePolyfills } from './polyfills';
240
240
  * - Business and campaign types (BusinessDTO, CampaignDTO, etc.)
241
241
  * - API request/response types for all endpoints
242
242
  * - Error types and status enums
243
+ * - Utility functions for pagination, token display, etc.
243
244
  *
244
245
  * @see {@link https://github.com/eXplorins/pers-shared} - Shared library documentation
245
246
  */
246
247
  export * from '@explorins/pers-shared';
248
+ /**
249
+ * Token utilities re-exported from token module
250
+ *
251
+ * @see {@link getMetadataFromTokenUnitResponse} - Get full metadata object from token unit
252
+ */
253
+ export { getMetadataFromTokenUnitResponse } from '@explorins/pers-sdk/token';
254
+ /**
255
+ * Shared SDK utilities re-exported from base SDK
256
+ *
257
+ * Includes helper functions for:
258
+ * - Pagination utilities (buildPaginationParams, extractData, etc.)
259
+ */
260
+ export { buildPaginationParams, extractData, extractPagination, isPaginatedResponse, normalizeToPaginated, fetchAllPages, type PaginationOptions, type PaginationWithFilters, type ListResponse } from '@explorins/pers-sdk';
247
261
  /**
248
262
  * Re-export Web3 and blockchain-related types from base SDK
249
263
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,OAAO,aAAa,CAAC;AAMrB;;;;;;;;GAQG;AACH,OAAO,EACL,6BAA6B,EAC7B,KAAK,qBAAqB,EAC3B,MAAM,wCAAwC,CAAC;AAMhD;;;;;;;;;;GAUG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;;;;;GAQG;AACH,OAAO,EACL,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAM/C;;;GAGG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAMvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,eAAe,EACf,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAMrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGrF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM7F;;;;;;GAMG;AACH,OAAO,EACL,qBAAqB,EACtB,MAAM,sCAAsC,CAAC;AAM9C;;;;;;;;GAQG;AACH,OAAO,EACL,8BAA8B,EAC/B,MAAM,aAAa,CAAC;AAMrB;;;;;;;;;;;;;;;GAeG;AACH,cAAc,wBAAwB,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAMlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAM/E;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,OAAO,aAAa,CAAC;AAMrB;;;;;;;;GAQG;AACH,OAAO,EACL,6BAA6B,EAC7B,KAAK,qBAAqB,EAC3B,MAAM,wCAAwC,CAAC;AAMhD;;;;;;;;;;GAUG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;;;;;GAQG;AACH,OAAO,EACL,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAM/C;;;GAGG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAMvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EACL,eAAe,EACf,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAMrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACV,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGrF,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM7F;;;;;;GAMG;AACH,OAAO,EACL,qBAAqB,EACtB,MAAM,sCAAsC,CAAC;AAM9C;;;;;;;;GAQG;AACH,OAAO,EACL,8BAA8B,EAC/B,MAAM,aAAa,CAAC;AAMrB;;;;;;;;;;;;;;;;GAgBG;AACH,cAAc,wBAAwB,CAAC;AAEvC;;;;GAIG;AACH,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAE7E;;;;;GAKG;AACH,OAAO,EAEL,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;GAWG;AACH,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAMlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAM/E;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -23381,6 +23381,43 @@ function isPaginatedResponse(response) {
23381
23381
  'data' in response &&
23382
23382
  'pagination' in response);
23383
23383
  }
23384
+ /**
23385
+ * Extract data array from either array or paginated response
23386
+ * Use during hybrid backend phase to safely handle both response shapes
23387
+ *
23388
+ * @param response - Either an array or paginated response
23389
+ * @returns Data array
23390
+ *
23391
+ * @example
23392
+ * ```typescript
23393
+ * const response = await api.getItems(); // Could be T[] or PaginatedResponseDTO<T>
23394
+ * const items = extractData(response); // Always T[]
23395
+ * ```
23396
+ */
23397
+ function extractData(response) {
23398
+ if (Array.isArray(response)) {
23399
+ return response;
23400
+ }
23401
+ return (response?.data ?? []);
23402
+ }
23403
+ /**
23404
+ * Extract pagination metadata (returns null for array responses)
23405
+ *
23406
+ * @param response - Either an array or paginated response
23407
+ * @returns Pagination metadata or null
23408
+ *
23409
+ * @example
23410
+ * ```typescript
23411
+ * const response = await api.getItems();
23412
+ * const pagination = extractPagination(response);
23413
+ * if (pagination) {
23414
+ * console.log(`Total: ${pagination.total}`);
23415
+ * }
23416
+ * ```
23417
+ */
23418
+ function extractPagination(response) {
23419
+ return isPaginatedResponse(response) ? response.pagination : null;
23420
+ }
23384
23421
  /**
23385
23422
  * Normalize any list response to PaginatedResponseDTO format
23386
23423
  * Converts array responses to paginated format during hybrid backend phase
@@ -23419,6 +23456,39 @@ function normalizeToPaginated(response) {
23419
23456
  }
23420
23457
  };
23421
23458
  }
23459
+ /**
23460
+ * Fetch all pages automatically (useful for infinite scroll or complete datasets)
23461
+ *
23462
+ * ⚠️ WARNING: Use with caution on large datasets. This will make multiple API calls
23463
+ * and load all items into memory. Consider using pagination UI instead.
23464
+ *
23465
+ * @param fetchFn - Function that fetches a page (must return PaginatedResponseDTO)
23466
+ * @param limit - Items per page (default: 50)
23467
+ * @param maxPages - Safety limit to prevent infinite loops (default: 100)
23468
+ * @returns All items from all pages
23469
+ *
23470
+ * @example
23471
+ * ```typescript
23472
+ * // Fetch all campaigns (use with caution!)
23473
+ * const allCampaigns = await fetchAllPages(
23474
+ * (page, limit) => sdk.campaigns.getCampaigns({ page, limit }),
23475
+ * 50, // items per page
23476
+ * 100 // max 100 pages (5000 items)
23477
+ * );
23478
+ * ```
23479
+ */
23480
+ async function fetchAllPages(fetchFn, limit = 50, maxPages = 100) {
23481
+ const allItems = [];
23482
+ let page = 1;
23483
+ let hasMore = true;
23484
+ while (hasMore && page <= maxPages) {
23485
+ const response = await fetchFn(page, limit);
23486
+ allItems.push(...(response.data || []));
23487
+ hasMore = response.pagination.hasNext;
23488
+ page++;
23489
+ }
23490
+ return allItems;
23491
+ }
23422
23492
 
23423
23493
  /**
23424
23494
  * Platform-Agnostic User API Client
@@ -37458,6 +37528,76 @@ const useEvents = () => {
37458
37528
  };
37459
37529
  };
37460
37530
 
37531
+ // ==========================================
37532
+ // TOKEN UTILITY FUNCTIONS
37533
+ // ==========================================
37534
+ /**
37535
+ * Get metadata from a token unit response
37536
+ * Handles metadata-based tokens (ERC-1155 with metadata array)
37537
+ *
37538
+ * For metadata-based tokens:
37539
+ * - Returns the metadata object from token.metadata array
37540
+ * - Uses provided incrementalId or tokenMetadataIncrementalId from tokenUnit
37541
+ * - Defaults to index 0 if no incrementalId specified
37542
+ *
37543
+ * For standard tokens (no metadata):
37544
+ * - Returns null
37545
+ *
37546
+ * @param tokenUnit - The token unit from campaign or balance
37547
+ * @param incrementalId - Optional metadata index to use (overrides tokenUnit.tokenMetadataIncrementalId)
37548
+ * @returns Token metadata object or null
37549
+ *
37550
+ * @example
37551
+ * ```typescript
37552
+ * // Get metadata using tokenUnit's incrementalId
37553
+ * const tokenUnit = {
37554
+ * tokenMetadataIncrementalId: 3,
37555
+ * token: {
37556
+ * metadata: [
37557
+ * { name: 'Bronze Pass', imageUrl: '...' },
37558
+ * { name: 'Silver Pass', imageUrl: '...' },
37559
+ * { name: 'Gold Pass', imageUrl: '...' }
37560
+ * ]
37561
+ * }
37562
+ * };
37563
+ * const metadata = getMetadataFromTokenUnitResponse(tokenUnit);
37564
+ * // Returns: { name: 'Bronze Pass', imageUrl: '...' } (index 0 - default)
37565
+ *
37566
+ * // Override incrementalId
37567
+ * const metadata2 = getMetadataFromTokenUnitResponse(tokenUnit, 2);
37568
+ * // Returns: { name: 'Gold Pass', imageUrl: '...' } (index 2)
37569
+ *
37570
+ * // Standard token (no metadata)
37571
+ * const tokenUnit2 = {
37572
+ * token: { symbol: 'VQP', name: 'Visit Qatar Points' }
37573
+ * };
37574
+ * const metadata3 = getMetadataFromTokenUnitResponse(tokenUnit2);
37575
+ * // Returns: null
37576
+ *
37577
+ * // Display name with fallback
37578
+ * const displayName = metadata?.name || tokenUnit.token?.symbol || 'Reward';
37579
+ *
37580
+ * // Display image
37581
+ * const imageUrl = metadata?.imageUrl;
37582
+ * ```
37583
+ */
37584
+ function getMetadataFromTokenUnitResponse(tokenUnit, incrementalId) {
37585
+ // If no metadata array exists, return null
37586
+ if (!tokenUnit.token?.metadata || tokenUnit.token.metadata.length === 0) {
37587
+ return null;
37588
+ }
37589
+ const metadata = tokenUnit.token.metadata;
37590
+ // Use provided incrementalId or tokenUnit's incrementalId to find matching metadata
37591
+ const targetId = incrementalId ?? tokenUnit.tokenMetadataIncrementalId;
37592
+ if (targetId !== undefined) {
37593
+ const found = metadata.find((m) => m.incrementalId === targetId);
37594
+ if (found)
37595
+ return found;
37596
+ }
37597
+ // Fallback to first metadata item
37598
+ return metadata[0];
37599
+ }
37600
+
37461
37601
  // ============================================================================
37462
37602
  // SHARED HELPERS (internal)
37463
37603
  // ============================================================================
@@ -37770,14 +37910,21 @@ exports.buildBurnRequest = buildBurnRequest;
37770
37910
  exports.buildMintRequest = buildMintRequest;
37771
37911
  exports.buildPOSBurnRequest = buildPOSBurnRequest;
37772
37912
  exports.buildPOSTransferRequest = buildPOSTransferRequest;
37913
+ exports.buildPaginationParams = buildPaginationParams;
37773
37914
  exports.buildSubmissionRequest = buildSubmissionRequest;
37774
37915
  exports.buildTransferRequest = buildTransferRequest;
37775
37916
  exports.createReactNativeAuthProvider = createReactNativeAuthProvider;
37776
37917
  exports.createUserIdentifierObject = createUserIdentifierObject;
37777
37918
  exports.detectIdentifierType = detectIdentifierType;
37919
+ exports.extractData = extractData;
37920
+ exports.extractPagination = extractPagination;
37921
+ exports.fetchAllPages = fetchAllPages;
37922
+ exports.getMetadataFromTokenUnitResponse = getMetadataFromTokenUnitResponse;
37778
37923
  exports.hasMinimumRole = hasMinimumRole;
37779
37924
  exports.initializeReactNativePolyfills = initializeReactNativePolyfills;
37925
+ exports.isPaginatedResponse = isPaginatedResponse;
37780
37926
  exports.isUserIdentifierObject = isUserIdentifierObject;
37927
+ exports.normalizeToPaginated = normalizeToPaginated;
37781
37928
  exports.registerIdentifierType = registerIdentifierType;
37782
37929
  exports.testnetPrefix = testnetPrefix;
37783
37930
  exports.testnetShortPrefix = testnetShortPrefix;