@explorins/pers-sdk-react-native 2.3.0-alpha.3 → 2.3.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/README.md CHANGED
@@ -871,6 +871,90 @@ if (transaction.txType === ClientTransactionType.PENDING_SUBMISSION) {
871
871
  - **Expo**: Compatible with Expo managed workflow
872
872
  - **Web**: React Native Web compatibility
873
873
 
874
+ ---
875
+
876
+ ## Analytics & Attribution Tracking
877
+
878
+ The SDK provides built-in analytics tracking for user acquisition and engagement. The `PersSDKProvider` **automatically detects the platform** (iOS/Android) and sends tracking headers with all API requests.
879
+
880
+ ### Automatic Platform Detection
881
+
882
+ When you wrap your app with `PersSDKProvider`, platform info is auto-detected:
883
+
884
+ ```typescript
885
+ // Platform is automatically detected and set:
886
+ // { os: 'iOS', osVersion: '17.4', deviceType: 'phone', app: 'MyApp' }
887
+ ```
888
+
889
+ ### Manual Data Source Tracking
890
+
891
+ For campaign attribution, use `usePersSDK()` to set custom tracking data:
892
+
893
+ ```typescript
894
+ import { usePersSDK } from '@explorins/pers-sdk-react-native';
895
+ import { Linking } from 'react-native';
896
+
897
+ function DeepLinkHandler() {
898
+ const { sdk } = usePersSDK();
899
+
900
+ useEffect(() => {
901
+ // Handle deep links with UTM params
902
+ Linking.getInitialURL().then(url => {
903
+ if (url) {
904
+ const params = new URL(url).searchParams;
905
+
906
+ sdk.setDataSource({
907
+ channel: 'mobile',
908
+ medium: params.get('utm_medium') || undefined,
909
+ campaign: params.get('utm_campaign') || undefined,
910
+ source: params.get('utm_source') || undefined,
911
+ });
912
+ }
913
+ });
914
+ }, [sdk]);
915
+ }
916
+ ```
917
+
918
+ ### HTTP Headers Sent
919
+
920
+ The SDK automatically sends tracking data as HTTP headers:
921
+
922
+ | Header | Source | Description |
923
+ |--------|--------|-------------|
924
+ | `x-source-channel` | `dataSource.channel` | `'mobile'` for native apps |
925
+ | `x-source-medium` | `dataSource.medium` | Traffic medium (push, email, etc.) |
926
+ | `x-source-campaign` | `dataSource.campaign` | Campaign identifier |
927
+ | `x-source` | `dataSource.source` | Traffic source |
928
+ | `x-platform` | Auto-detected | JSON: `{ os, osVersion, deviceType, app }` |
929
+
930
+ ### Push Notification Attribution
931
+
932
+ Track users coming from push notifications:
933
+
934
+ ```typescript
935
+ import { usePersSDK } from '@explorins/pers-sdk-react-native';
936
+
937
+ function usePushNotificationTracking() {
938
+ const { sdk } = usePersSDK();
939
+
940
+ const handlePushNotification = (notification: any) => {
941
+ // Extract campaign from notification data
942
+ const campaignId = notification.data?.campaignId;
943
+
944
+ if (campaignId) {
945
+ sdk.updateDataSource({
946
+ medium: 'push',
947
+ campaign: campaignId,
948
+ });
949
+ }
950
+ };
951
+
952
+ return { handlePushNotification };
953
+ }
954
+ ```
955
+
956
+ ---
957
+
874
958
  ## Advanced Configuration
875
959
 
876
960
  ### SDK Initialization & DPoP
@@ -1,8 +1,12 @@
1
1
  import { OnStatusUpdateFn } from './useTransactionSigner';
2
2
  import type { RedemptionCreateRequestDTO, RedemptionDTO, RedemptionRedeemDTO, RedemptionRedeemRequestResponseDTO, RedemptionTypeDTO, PaginatedResponseDTO, RedemptionRedeemIncludeRelation, RedemptionIncludeRelation, ProcessRecordStatus, DynamicContext, SortOrder } from '@explorins/pers-sdk';
3
- import type { RedemptionRedeemFilters } from '@explorins/pers-sdk/redemption';
3
+ import type { RedemptionRedeemQueryParams, RedemptionQueryParams } from '@explorins/pers-sdk/redemption';
4
4
  import type { PaginationOptions } from '@explorins/pers-sdk';
5
- export type { RedemptionRedeemFilters, RedemptionFilterOptions } from '@explorins/pers-sdk/redemption';
5
+ export type { RedemptionRedeemQueryParams, RedemptionQueryParams } from '@explorins/pers-sdk/redemption';
6
+ /** @deprecated Use RedemptionRedeemQueryParams instead */
7
+ export type RedemptionRedeemFilters = RedemptionRedeemQueryParams;
8
+ /** @deprecated Use RedemptionQueryParams instead */
9
+ export type RedemptionFilterOptions = RedemptionQueryParams;
6
10
  /**
7
11
  * Options for fetching redemptions with filtering and pagination
8
12
  */
@@ -40,7 +44,7 @@ export declare const useRedemptions: () => {
40
44
  onStatusUpdate?: OnStatusUpdateFn;
41
45
  }) => Promise<RedemptionRedeemRequestResponseDTO>;
42
46
  getRedemptionTypes: () => Promise<PaginatedResponseDTO<RedemptionTypeDTO>>;
43
- getRedemptionRedeems: (filters?: RedemptionRedeemFilters, include?: RedemptionRedeemIncludeRelation[]) => Promise<PaginatedResponseDTO<RedemptionRedeemDTO>>;
47
+ getRedemptionRedeems: (filters?: RedemptionRedeemQueryParams, include?: RedemptionRedeemIncludeRelation[]) => Promise<PaginatedResponseDTO<RedemptionRedeemDTO>>;
44
48
  createRedemption: (redemptionData: RedemptionCreateRequestDTO) => Promise<RedemptionDTO>;
45
49
  updateRedemption: (redemptionId: string, redemptionData: RedemptionCreateRequestDTO) => Promise<RedemptionDTO>;
46
50
  toggleRedemptionStatus: (redemptionId: string) => Promise<RedemptionDTO>;
@@ -1 +1 @@
1
- {"version":3,"file":"useRedemptions.d.ts","sourceRoot":"","sources":["../../src/hooks/useRedemptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,kCAAkC,EAClC,iBAAiB,EACjB,oBAAoB,EACpB,+BAA+B,EAC/B,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEvG;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,uDAAuD;IACvD,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACtC,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5C,qBAAqB;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,eAAO,MAAM,cAAc;+BAqD2B,qBAAqB,KAAG,QAAQ,qBAAqB,aAAa,CAAC,CAAC;4BAkUlH,MAAM,YACA,yBAAyB,EAAE,KACpC,QAAQ,aAAa,CAAC;mCA3Rb;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,mBAAmB,CAAA;KAAE,YACvD,iBAAiB,YACjB,+BAA+B,EAAE,KAC1C,QAAQ,qBAAqB,mBAAmB,CAAC,CAAC;2BAiGrC,MAAM,YACV;QAAE,OAAO,CAAC,EAAE,cAAc,CAAC;QAAC,cAAc,CAAC,EAAE,gBAAgB,CAAA;KAAE,KACxE,QAAQ,kCAAkC,CAAC;8BAmHG,QAAQ,qBAAqB,iBAAiB,CAAC,CAAC;qCA9BrF,uBAAuB,YACvB,+BAA+B,EAAE,KAC1C,QAAQ,qBAAqB,mBAAmB,CAAC,CAAC;uCAcO,0BAA0B,KAAG,QAAQ,aAAa,CAAC;qCA4BrD,MAAM,kBAAkB,0BAA0B,KAAG,QAAQ,aAAa,CAAC;2CAcrE,MAAM,KAAG,QAAQ,aAAa,CAAC;;;;CAmEhG,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"useRedemptions.d.ts","sourceRoot":"","sources":["../../src/hooks/useRedemptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,kCAAkC,EAClC,iBAAiB,EACjB,oBAAoB,EACpB,+BAA+B,EAC/B,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACzG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,YAAY,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACzG,0DAA0D;AAC1D,MAAM,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AAClE,oDAAoD;AACpD,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,uDAAuD;IACvD,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACtC,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;IAC5C,qBAAqB;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,eAAO,MAAM,cAAc;+BAqD2B,qBAAqB,KAAG,QAAQ,qBAAqB,aAAa,CAAC,CAAC;4BAyUlH,MAAM,YACA,yBAAyB,EAAE,KACpC,QAAQ,aAAa,CAAC;mCA3Rb;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,mBAAmB,CAAA;KAAE,YACvD,iBAAiB,YACjB,+BAA+B,EAAE,KAC1C,QAAQ,qBAAqB,mBAAmB,CAAC,CAAC;2BAiGrC,MAAM,YACV;QAAE,OAAO,CAAC,EAAE,cAAc,CAAC;QAAC,cAAc,CAAC,EAAE,gBAAgB,CAAA;KAAE,KACxE,QAAQ,kCAAkC,CAAC;8BAmHG,QAAQ,qBAAqB,iBAAiB,CAAC,CAAC;qCA9BrF,2BAA2B,YAC3B,+BAA+B,EAAE,KAC1C,QAAQ,qBAAqB,mBAAmB,CAAC,CAAC;uCAcO,0BAA0B,KAAG,QAAQ,aAAa,CAAC;qCA4BrD,MAAM,kBAAkB,0BAA0B,KAAG,QAAQ,aAAa,CAAC;2CAcrE,MAAM,KAAG,QAAQ,aAAa,CAAC;;;;CAmEhG,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -58,7 +58,13 @@ export const useRedemptions = () => {
58
58
  throw new Error('SDK not initialized. Call initialize() first.');
59
59
  }
60
60
  try {
61
- const result = await sdk.redemptions.getRedemptions(options);
61
+ // Convert Date to ISO string for API compatibility
62
+ const apiOptions = options ? {
63
+ ...options,
64
+ startDate: options.startDate instanceof Date ? options.startDate.toISOString() : options.startDate,
65
+ endDate: options.endDate instanceof Date ? options.endDate.toISOString() : options.endDate,
66
+ } : undefined;
67
+ const result = await sdk.redemptions.getRedemptions(apiOptions);
62
68
  return result;
63
69
  }
64
70
  catch (error) {
@@ -1,4 +1,4 @@
1
- import type { TokenDTO, TokenMetadataDTO, PaginatedResponseDTO } from '@explorins/pers-sdk';
1
+ import type { TokenDTO, TokenMetadataDTO, PaginatedResponseDTO, TokenMetadataFilterOptions } from '@explorins/pers-sdk';
2
2
  /**
3
3
  * React hook for token operations in the PERS SDK
4
4
  *
@@ -34,7 +34,7 @@ export declare const useTokens: () => {
34
34
  getTokenTypes: () => Promise<any>;
35
35
  getStatusTokens: () => Promise<PaginatedResponseDTO<TokenDTO>>;
36
36
  getTokenByContract: (contractAddress: string, contractTokenId?: string | null) => Promise<TokenDTO>;
37
- getTokenMetadata: (options?: any) => Promise<PaginatedResponseDTO<TokenMetadataDTO>>;
37
+ getTokenMetadata: (options?: TokenMetadataFilterOptions) => Promise<PaginatedResponseDTO<TokenMetadataDTO>>;
38
38
  getRewards: (options?: any) => Promise<PaginatedResponseDTO<TokenMetadataDTO>>;
39
39
  getStamps: (options?: any) => Promise<PaginatedResponseDTO<TokenMetadataDTO>>;
40
40
  isAvailable: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useTokens.d.ts","sourceRoot":"","sources":["../../src/hooks/useTokens.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,oBAAoB,EAAyE,MAAM,qBAAqB,CAAC;AAEnK;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,SAAS;qBAoBoB,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;gCA2B5B,QAAQ,QAAQ,CAAC;2BA2BtB,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;yBA2BzC,QAAQ,GAAG,CAAC;2BA2BV,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;0CA6BtB,MAAM,oBAAoB,MAAM,GAAG,IAAI,KAAG,QAAQ,QAAQ,CAAC;yCAkCvC,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;mCA+B3D,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;kCA+BjD,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;;CA0BrH,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"useTokens.d.ts","sourceRoot":"","sources":["../../src/hooks/useTokens.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,0BAA0B,EAA6C,MAAM,qBAAqB,CAAC;AAEnK;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,SAAS;qBAoBoB,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;gCA2B5B,QAAQ,QAAQ,CAAC;2BA2BtB,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;yBA2BzC,QAAQ,GAAG,CAAC;2BA2BV,QAAQ,qBAAqB,QAAQ,CAAC,CAAC;0CA6BtB,MAAM,oBAAoB,MAAM,GAAG,IAAI,KAAG,QAAQ,QAAQ,CAAC;iCAkCpE,0BAA0B,KAAG,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;mCA+B3D,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;kCA+BjD,QAAQ,qBAAqB,gBAAgB,CAAC,CAAC;;CA0BrH,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import 'react-native-url-polyfill/auto';
1
2
  /**
2
3
  * @fileoverview PERS SDK for React Native - Tourism Loyalty System
3
4
  *
@@ -136,6 +137,7 @@ export { PersSDKProvider, usePersSDK, type PersConfig, type PersSDKContext } fro
136
137
  *
137
138
  * **Business & Campaign Management:**
138
139
  * - `useBusiness` - Business profile and operations
140
+ * - `useBookings` - Booking management with status validation
139
141
  * - `useCampaigns` - Marketing campaigns and promotions
140
142
  * - `useRedemptions` - Reward redemption and fulfillment
141
143
  *
@@ -206,7 +208,7 @@ export { PersSDKProvider, usePersSDK, type PersConfig, type PersSDKContext } fro
206
208
  * }
207
209
  * ```
208
210
  */
209
- export { useAuth, useTokens, useTokenBalances, useTransactions, useTransactionSigner, SigningStatus, useBusiness, useCampaigns, useRedemptions, useWeb3, usePurchases, useTenants, useUsers, useUserStatus, useFiles, useAnalytics, useDonations, useEvents, useTriggerSources, useResolvedUrl, useMetadata, useIPFSUrl, // alias for useResolvedUrl
211
+ export { useAuth, useTokens, useTokenBalances, useTransactions, useTransactionSigner, SigningStatus, useBusiness, useBookings, useCampaigns, useRedemptions, useWeb3, usePurchases, useTenants, useUsers, useUserStatus, useFiles, useAnalytics, useDonations, useEvents, useTriggerSources, useResolvedUrl, useMetadata, useIPFSUrl, // alias for useResolvedUrl
210
212
  useTransactionMetadata } from './hooks';
211
213
  export type { TransactionSignerHook, OnStatusUpdateFn, StatusUpdateData, SigningStatusType, TransactionSigningResult, SubmissionResult, AuthenticatedUser } from './hooks';
212
214
  export type { EventsHook, PersEvent, EventHandler, EventFilter, Unsubscribe } from './hooks';
@@ -217,6 +219,7 @@ export type { BusinessFilterOptions, BusinessHook } from './hooks';
217
219
  export type { TransactionQueryOptions, TransactionHook } from './hooks';
218
220
  export type { TriggerSourceQueryOptions, TriggerSourceHook } from './hooks';
219
221
  export type { AnalyticsHook } from './hooks';
222
+ export type { BookingHook, BookingQueryOptions, BookingValidationOptions } from './hooks';
220
223
  /**
221
224
  * React Native-optimized HTTP client with automatic request/response handling
222
225
  *
@@ -413,4 +416,158 @@ export type { POSAuthorizationOptions, PendingTransactionParams } from '@explori
413
416
  * ```
414
417
  */
415
418
  export { PersApiError, AuthenticationError, ErrorUtils } from '@explorins/pers-sdk/core';
419
+ /**
420
+ * Data source tracking utilities for attribution analytics
421
+ *
422
+ * Native apps MUST configure data source and platform info for proper attribution.
423
+ * Web apps benefit from auto-detection, but can still set explicit values.
424
+ *
425
+ * @example
426
+ * **React Native Setup:**
427
+ * ```typescript
428
+ * import { usePersSDK, detectReactNativePlatform } from '@explorins/pers-sdk-react-native';
429
+ *
430
+ * const { sdk } = usePersSDK();
431
+ *
432
+ * // Set platform info (call once on app start)
433
+ * sdk.setPlatform(detectReactNativePlatform());
434
+ *
435
+ * // Set data source (call once, update on deep links/push)
436
+ * sdk.setDataSource({
437
+ * channel: 'mobile',
438
+ * source: 'app_store',
439
+ * });
440
+ * ```
441
+ *
442
+ * @example
443
+ * **Handle Deep Links:**
444
+ * ```typescript
445
+ * import { parseUtmParams } from '@explorins/pers-sdk-react-native';
446
+ *
447
+ * function handleDeepLink(url: string) {
448
+ * const utm = parseUtmParams(url);
449
+ * sdk.updateDataSource({
450
+ * medium: utm.medium,
451
+ * campaign: utm.campaign,
452
+ * source: utm.source || 'deep_link',
453
+ * });
454
+ * }
455
+ * ```
456
+ *
457
+ * @example
458
+ * **Handle Push Notifications:**
459
+ * ```typescript
460
+ * function handlePushNotification(notification: PushNotification) {
461
+ * sdk.updateDataSource({
462
+ * medium: 'push',
463
+ * source: 'push_notification',
464
+ * campaign: notification.campaignId,
465
+ * });
466
+ * }
467
+ * ```
468
+ */
469
+ export { type Platform, type DataSource, type UtmParams, type WebDataSourceConfig, type NativeDataSourceConfig, parseUtmParams, detectSourceFromReferrer, detectWebPlatform, } from '@explorins/pers-sdk/core';
470
+ export { detectReactNativePlatform } from './utils/platform-detection';
471
+ /**
472
+ * Field validation utilities for custom fields and forms
473
+ *
474
+ * These functions are re-exported from @explorins/pers-shared for convenience.
475
+ * Use them for client-side validation before submitting data to the backend.
476
+ *
477
+ * @example
478
+ * **Single Field Validation:**
479
+ * ```typescript
480
+ * import { validateFieldValue, FieldType, FieldValidationRules } from '@explorins/pers-sdk-react-native';
481
+ *
482
+ * const rules: FieldValidationRules = { minLength: 3 };
483
+ * const error = validateFieldValue('ab', rules, 'text');
484
+ * // error: { message: 'Must be at least 3 characters' }
485
+ * ```
486
+ *
487
+ * @example
488
+ * **Form Validation:**
489
+ * ```typescript
490
+ * import { validateAllFields, FieldDefinition } from '@explorins/pers-sdk-react-native';
491
+ *
492
+ * const definitions: FieldDefinition[] = [
493
+ * { key: 'email', fieldType: 'email', label: 'Email', validation: { minLength: 1 } },
494
+ * { key: 'phone', fieldType: 'phone', label: 'Phone', validation: {} }
495
+ * ];
496
+ *
497
+ * const formData = { email: 'invalid', phone: '123' };
498
+ * const errors = validateAllFields(formData, definitions);
499
+ * // errors: [{ field: 'email', message: 'Invalid email format' }]
500
+ * ```
501
+ *
502
+ * @see {@link validateFieldValue} - Validate a single field value
503
+ * @see {@link validateAllFields} - Validate all fields against definitions
504
+ * @see {@link FieldDefinition} - Field definition structure
505
+ * @see {@link FieldValidationRules} - Available validation rules
506
+ */
507
+ export { validateFieldValue, validateAllFields, validateFieldComparisons, compareValues, type FieldDefinition, type FieldValidationRules, type ValidationErrorDetail, type FieldType, type FieldComparison, type ComparisonOperator, } from '@explorins/pers-sdk';
508
+ /**
509
+ * Booking status types and validation utilities for eligibility checks
510
+ *
511
+ * Use these to validate if a user's booking status meets requirements
512
+ * for redemptions, campaigns, or other booking-dependent features.
513
+ *
514
+ * **BookingStatus:** 'past' | 'active' | 'future'
515
+ * - `past`: User's stay has ended (checkOut ≤ now)
516
+ * - `active`: User is currently staying (checkIn ≤ now < checkOut)
517
+ * - `future`: Upcoming booking (checkIn > now)
518
+ *
519
+ * **BookingRequirementType:** 'active' | 'future' | 'past' | 'active_future' | 'any'
520
+ * - `active`: Only active bookings allowed
521
+ * - `future`: Only future bookings allowed
522
+ * - `past`: Only past bookings allowed
523
+ * - `active_future`: Active OR future bookings allowed
524
+ * - `any`: Any booking status allowed
525
+ *
526
+ * @example
527
+ * **Basic Validation:**
528
+ * ```typescript
529
+ * import {
530
+ * isBookingStatusValid,
531
+ * BookingStatus,
532
+ * BookingRequirementType
533
+ * } from '@explorins/pers-sdk-react-native';
534
+ *
535
+ * const userBookingStatus: BookingStatus = booking.status;
536
+ * const requirement: BookingRequirementType = redemption.bookingRequirement;
537
+ * const canRedeem = isBookingStatusValid(userBookingStatus, requirement);
538
+ * ```
539
+ *
540
+ * @example
541
+ * **Redemption Screen:**
542
+ * ```typescript
543
+ * function RedemptionCard({ redemption, userBooking }) {
544
+ * const isEligible = redemption.bookingRequirement
545
+ * ? isBookingStatusValid(userBooking?.status ?? 'past', redemption.bookingRequirement)
546
+ * : true;
547
+ *
548
+ * return (
549
+ * <View style={[styles.card, !isEligible && styles.disabled]}>
550
+ * <Text>{redemption.name}</Text>
551
+ * {!isEligible && (
552
+ * <Text style={styles.warning}>
553
+ * Requires {redemption.bookingRequirement} booking
554
+ * </Text>
555
+ * )}
556
+ * </View>
557
+ * );
558
+ * }
559
+ * ```
560
+ *
561
+ * @example
562
+ * **Validation Results:**
563
+ * ```typescript
564
+ * isBookingStatusValid('active', 'active'); // true
565
+ * isBookingStatusValid('future', 'active'); // false
566
+ * isBookingStatusValid('active', 'active_future'); // true
567
+ * isBookingStatusValid('future', 'active_future'); // true
568
+ * isBookingStatusValid('past', 'active_future'); // false
569
+ * isBookingStatusValid('past', 'any'); // true
570
+ * ```
571
+ */
572
+ export { isBookingStatusValid, type BookingStatus, type BookingRequirementType } from '@explorins/pers-sdk';
416
573
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}