@loyalytics/swan-react-native-sdk 2.0.1

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 (204) hide show
  1. package/LICENSE +55 -0
  2. package/README.md +67 -0
  3. package/docs/IOS_NOTIFICATION_EXTENSION_SETUP.md +335 -0
  4. package/ios/README.md +64 -0
  5. package/ios/SwanNotificationServiceExtension/Info.plist +31 -0
  6. package/ios/SwanNotificationServiceExtension/NotificationService.swift +337 -0
  7. package/ios/SwanNotificationServiceExtension/SwanNotificationServiceExtension.entitlements +10 -0
  8. package/lib/commonjs/components/FooterView.js +125 -0
  9. package/lib/commonjs/components/FooterView.js.map +1 -0
  10. package/lib/commonjs/components/FullScreenView.js +172 -0
  11. package/lib/commonjs/components/FullScreenView.js.map +1 -0
  12. package/lib/commonjs/components/HeaderView.js +205 -0
  13. package/lib/commonjs/components/HeaderView.js.map +1 -0
  14. package/lib/commonjs/components/PopUpView.js +186 -0
  15. package/lib/commonjs/components/PopUpView.js.map +1 -0
  16. package/lib/commonjs/config/BatchConfig.js +53 -0
  17. package/lib/commonjs/config/BatchConfig.js.map +1 -0
  18. package/lib/commonjs/constants/ApiUrls.js +56 -0
  19. package/lib/commonjs/constants/ApiUrls.js.map +1 -0
  20. package/lib/commonjs/core/EventQueueManager.js +345 -0
  21. package/lib/commonjs/core/EventQueueManager.js.map +1 -0
  22. package/lib/commonjs/core/FlushManager.js +245 -0
  23. package/lib/commonjs/core/FlushManager.js.map +1 -0
  24. package/lib/commonjs/core/NetworkMonitor.js +97 -0
  25. package/lib/commonjs/core/NetworkMonitor.js.map +1 -0
  26. package/lib/commonjs/index.js +3506 -0
  27. package/lib/commonjs/index.js.map +1 -0
  28. package/lib/commonjs/providers/FirebasePushProvider.js +130 -0
  29. package/lib/commonjs/providers/FirebasePushProvider.js.map +1 -0
  30. package/lib/commonjs/providers/NullPushProvider.js +59 -0
  31. package/lib/commonjs/providers/NullPushProvider.js.map +1 -0
  32. package/lib/commonjs/providers/PushNotificationProvider.js +30 -0
  33. package/lib/commonjs/providers/PushNotificationProvider.js.map +1 -0
  34. package/lib/commonjs/services/DeviceRegistrationService.js +248 -0
  35. package/lib/commonjs/services/DeviceRegistrationService.js.map +1 -0
  36. package/lib/commonjs/services/PushTokenService.js +284 -0
  37. package/lib/commonjs/services/PushTokenService.js.map +1 -0
  38. package/lib/commonjs/state/AuthStateMachine.js +161 -0
  39. package/lib/commonjs/state/AuthStateMachine.js.map +1 -0
  40. package/lib/commonjs/state/DeviceStateMachine.js +104 -0
  41. package/lib/commonjs/state/DeviceStateMachine.js.map +1 -0
  42. package/lib/commonjs/state/PushStateMachine.js +129 -0
  43. package/lib/commonjs/state/PushStateMachine.js.map +1 -0
  44. package/lib/commonjs/types/EventQueue.js +50 -0
  45. package/lib/commonjs/types/EventQueue.js.map +1 -0
  46. package/lib/commonjs/types/SDK.js +2 -0
  47. package/lib/commonjs/types/SDK.js.map +1 -0
  48. package/lib/commonjs/utils/FirebaseNotificationManager.js +492 -0
  49. package/lib/commonjs/utils/FirebaseNotificationManager.js.map +1 -0
  50. package/lib/commonjs/utils/Logger.js +56 -0
  51. package/lib/commonjs/utils/Logger.js.map +1 -0
  52. package/lib/commonjs/utils/SharedCredentialsManager.js +146 -0
  53. package/lib/commonjs/utils/SharedCredentialsManager.js.map +1 -0
  54. package/lib/commonjs/version.js +12 -0
  55. package/lib/commonjs/version.js.map +1 -0
  56. package/lib/module/components/FooterView.js +121 -0
  57. package/lib/module/components/FooterView.js.map +1 -0
  58. package/lib/module/components/FullScreenView.js +167 -0
  59. package/lib/module/components/FullScreenView.js.map +1 -0
  60. package/lib/module/components/HeaderView.js +199 -0
  61. package/lib/module/components/HeaderView.js.map +1 -0
  62. package/lib/module/components/PopUpView.js +181 -0
  63. package/lib/module/components/PopUpView.js.map +1 -0
  64. package/lib/module/config/BatchConfig.js +49 -0
  65. package/lib/module/config/BatchConfig.js.map +1 -0
  66. package/lib/module/constants/ApiUrls.js +52 -0
  67. package/lib/module/constants/ApiUrls.js.map +1 -0
  68. package/lib/module/core/EventQueueManager.js +340 -0
  69. package/lib/module/core/EventQueueManager.js.map +1 -0
  70. package/lib/module/core/FlushManager.js +240 -0
  71. package/lib/module/core/FlushManager.js.map +1 -0
  72. package/lib/module/core/NetworkMonitor.js +92 -0
  73. package/lib/module/core/NetworkMonitor.js.map +1 -0
  74. package/lib/module/index.js +3494 -0
  75. package/lib/module/index.js.map +1 -0
  76. package/lib/module/providers/FirebasePushProvider.js +124 -0
  77. package/lib/module/providers/FirebasePushProvider.js.map +1 -0
  78. package/lib/module/providers/NullPushProvider.js +53 -0
  79. package/lib/module/providers/NullPushProvider.js.map +1 -0
  80. package/lib/module/providers/PushNotificationProvider.js +26 -0
  81. package/lib/module/providers/PushNotificationProvider.js.map +1 -0
  82. package/lib/module/services/DeviceRegistrationService.js +243 -0
  83. package/lib/module/services/DeviceRegistrationService.js.map +1 -0
  84. package/lib/module/services/PushTokenService.js +278 -0
  85. package/lib/module/services/PushTokenService.js.map +1 -0
  86. package/lib/module/state/AuthStateMachine.js +155 -0
  87. package/lib/module/state/AuthStateMachine.js.map +1 -0
  88. package/lib/module/state/DeviceStateMachine.js +98 -0
  89. package/lib/module/state/DeviceStateMachine.js.map +1 -0
  90. package/lib/module/state/PushStateMachine.js +123 -0
  91. package/lib/module/state/PushStateMachine.js.map +1 -0
  92. package/lib/module/types/EventQueue.js +46 -0
  93. package/lib/module/types/EventQueue.js.map +1 -0
  94. package/lib/module/types/SDK.js +2 -0
  95. package/lib/module/types/SDK.js.map +1 -0
  96. package/lib/module/utils/FirebaseNotificationManager.js +486 -0
  97. package/lib/module/utils/FirebaseNotificationManager.js.map +1 -0
  98. package/lib/module/utils/Logger.js +52 -0
  99. package/lib/module/utils/Logger.js.map +1 -0
  100. package/lib/module/utils/SharedCredentialsManager.js +140 -0
  101. package/lib/module/utils/SharedCredentialsManager.js.map +1 -0
  102. package/lib/module/version.js +8 -0
  103. package/lib/module/version.js.map +1 -0
  104. package/lib/typescript/commonjs/package.json +1 -0
  105. package/lib/typescript/commonjs/src/components/FooterView.d.ts +3 -0
  106. package/lib/typescript/commonjs/src/components/FooterView.d.ts.map +1 -0
  107. package/lib/typescript/commonjs/src/components/FullScreenView.d.ts +3 -0
  108. package/lib/typescript/commonjs/src/components/FullScreenView.d.ts.map +1 -0
  109. package/lib/typescript/commonjs/src/components/HeaderView.d.ts +3 -0
  110. package/lib/typescript/commonjs/src/components/HeaderView.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/src/components/PopUpView.d.ts +3 -0
  112. package/lib/typescript/commonjs/src/components/PopUpView.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/src/config/BatchConfig.d.ts +7 -0
  114. package/lib/typescript/commonjs/src/config/BatchConfig.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/src/constants/ApiUrls.d.ts +56 -0
  116. package/lib/typescript/commonjs/src/constants/ApiUrls.d.ts.map +1 -0
  117. package/lib/typescript/commonjs/src/core/EventQueueManager.d.ts +63 -0
  118. package/lib/typescript/commonjs/src/core/EventQueueManager.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/src/core/FlushManager.d.ts +63 -0
  120. package/lib/typescript/commonjs/src/core/FlushManager.d.ts.map +1 -0
  121. package/lib/typescript/commonjs/src/core/NetworkMonitor.d.ts +38 -0
  122. package/lib/typescript/commonjs/src/core/NetworkMonitor.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/src/index.d.ts +663 -0
  124. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/src/providers/FirebasePushProvider.d.ts +28 -0
  126. package/lib/typescript/commonjs/src/providers/FirebasePushProvider.d.ts.map +1 -0
  127. package/lib/typescript/commonjs/src/providers/NullPushProvider.d.ts +25 -0
  128. package/lib/typescript/commonjs/src/providers/NullPushProvider.d.ts.map +1 -0
  129. package/lib/typescript/commonjs/src/providers/PushNotificationProvider.d.ts +105 -0
  130. package/lib/typescript/commonjs/src/providers/PushNotificationProvider.d.ts.map +1 -0
  131. package/lib/typescript/commonjs/src/services/DeviceRegistrationService.d.ts +60 -0
  132. package/lib/typescript/commonjs/src/services/DeviceRegistrationService.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/src/services/PushTokenService.d.ts +82 -0
  134. package/lib/typescript/commonjs/src/services/PushTokenService.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/src/state/AuthStateMachine.d.ts +61 -0
  136. package/lib/typescript/commonjs/src/state/AuthStateMachine.d.ts.map +1 -0
  137. package/lib/typescript/commonjs/src/state/DeviceStateMachine.d.ts +51 -0
  138. package/lib/typescript/commonjs/src/state/DeviceStateMachine.d.ts.map +1 -0
  139. package/lib/typescript/commonjs/src/state/PushStateMachine.d.ts +61 -0
  140. package/lib/typescript/commonjs/src/state/PushStateMachine.d.ts.map +1 -0
  141. package/lib/typescript/commonjs/src/types/EventQueue.d.ts +85 -0
  142. package/lib/typescript/commonjs/src/types/EventQueue.d.ts.map +1 -0
  143. package/lib/typescript/commonjs/src/types/SDK.d.ts +54 -0
  144. package/lib/typescript/commonjs/src/types/SDK.d.ts.map +1 -0
  145. package/lib/typescript/commonjs/src/utils/FirebaseNotificationManager.d.ts +169 -0
  146. package/lib/typescript/commonjs/src/utils/FirebaseNotificationManager.d.ts.map +1 -0
  147. package/lib/typescript/commonjs/src/utils/Logger.d.ts +32 -0
  148. package/lib/typescript/commonjs/src/utils/Logger.d.ts.map +1 -0
  149. package/lib/typescript/commonjs/src/utils/SharedCredentialsManager.d.ts +54 -0
  150. package/lib/typescript/commonjs/src/utils/SharedCredentialsManager.d.ts.map +1 -0
  151. package/lib/typescript/commonjs/src/version.d.ts +2 -0
  152. package/lib/typescript/commonjs/src/version.d.ts.map +1 -0
  153. package/lib/typescript/module/package.json +1 -0
  154. package/lib/typescript/module/src/components/FooterView.d.ts +3 -0
  155. package/lib/typescript/module/src/components/FooterView.d.ts.map +1 -0
  156. package/lib/typescript/module/src/components/FullScreenView.d.ts +3 -0
  157. package/lib/typescript/module/src/components/FullScreenView.d.ts.map +1 -0
  158. package/lib/typescript/module/src/components/HeaderView.d.ts +3 -0
  159. package/lib/typescript/module/src/components/HeaderView.d.ts.map +1 -0
  160. package/lib/typescript/module/src/components/PopUpView.d.ts +3 -0
  161. package/lib/typescript/module/src/components/PopUpView.d.ts.map +1 -0
  162. package/lib/typescript/module/src/config/BatchConfig.d.ts +7 -0
  163. package/lib/typescript/module/src/config/BatchConfig.d.ts.map +1 -0
  164. package/lib/typescript/module/src/constants/ApiUrls.d.ts +56 -0
  165. package/lib/typescript/module/src/constants/ApiUrls.d.ts.map +1 -0
  166. package/lib/typescript/module/src/core/EventQueueManager.d.ts +63 -0
  167. package/lib/typescript/module/src/core/EventQueueManager.d.ts.map +1 -0
  168. package/lib/typescript/module/src/core/FlushManager.d.ts +63 -0
  169. package/lib/typescript/module/src/core/FlushManager.d.ts.map +1 -0
  170. package/lib/typescript/module/src/core/NetworkMonitor.d.ts +38 -0
  171. package/lib/typescript/module/src/core/NetworkMonitor.d.ts.map +1 -0
  172. package/lib/typescript/module/src/index.d.ts +663 -0
  173. package/lib/typescript/module/src/index.d.ts.map +1 -0
  174. package/lib/typescript/module/src/providers/FirebasePushProvider.d.ts +28 -0
  175. package/lib/typescript/module/src/providers/FirebasePushProvider.d.ts.map +1 -0
  176. package/lib/typescript/module/src/providers/NullPushProvider.d.ts +25 -0
  177. package/lib/typescript/module/src/providers/NullPushProvider.d.ts.map +1 -0
  178. package/lib/typescript/module/src/providers/PushNotificationProvider.d.ts +105 -0
  179. package/lib/typescript/module/src/providers/PushNotificationProvider.d.ts.map +1 -0
  180. package/lib/typescript/module/src/services/DeviceRegistrationService.d.ts +60 -0
  181. package/lib/typescript/module/src/services/DeviceRegistrationService.d.ts.map +1 -0
  182. package/lib/typescript/module/src/services/PushTokenService.d.ts +82 -0
  183. package/lib/typescript/module/src/services/PushTokenService.d.ts.map +1 -0
  184. package/lib/typescript/module/src/state/AuthStateMachine.d.ts +61 -0
  185. package/lib/typescript/module/src/state/AuthStateMachine.d.ts.map +1 -0
  186. package/lib/typescript/module/src/state/DeviceStateMachine.d.ts +51 -0
  187. package/lib/typescript/module/src/state/DeviceStateMachine.d.ts.map +1 -0
  188. package/lib/typescript/module/src/state/PushStateMachine.d.ts +61 -0
  189. package/lib/typescript/module/src/state/PushStateMachine.d.ts.map +1 -0
  190. package/lib/typescript/module/src/types/EventQueue.d.ts +85 -0
  191. package/lib/typescript/module/src/types/EventQueue.d.ts.map +1 -0
  192. package/lib/typescript/module/src/types/SDK.d.ts +54 -0
  193. package/lib/typescript/module/src/types/SDK.d.ts.map +1 -0
  194. package/lib/typescript/module/src/utils/FirebaseNotificationManager.d.ts +169 -0
  195. package/lib/typescript/module/src/utils/FirebaseNotificationManager.d.ts.map +1 -0
  196. package/lib/typescript/module/src/utils/Logger.d.ts +32 -0
  197. package/lib/typescript/module/src/utils/Logger.d.ts.map +1 -0
  198. package/lib/typescript/module/src/utils/SharedCredentialsManager.d.ts +54 -0
  199. package/lib/typescript/module/src/utils/SharedCredentialsManager.d.ts.map +1 -0
  200. package/lib/typescript/module/src/version.d.ts +2 -0
  201. package/lib/typescript/module/src/version.d.ts.map +1 -0
  202. package/package.json +230 -0
  203. package/scripts/generate-version.js +25 -0
  204. package/scripts/setup-ios-extension.js +275 -0
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+
3
+ import AsyncStorage from '@react-native-async-storage/async-storage';
4
+ import Base64 from 'react-native-base64';
5
+ import { Platform } from 'react-native';
6
+ import Logger from "../utils/Logger.js";
7
+ import { SharedCredentialsManager } from "../utils/SharedCredentialsManager.js";
8
+ import URLS from "../constants/ApiUrls.js";
9
+
10
+ /**
11
+ * DeviceRegistrationService
12
+ *
13
+ * Handles device registration WITHOUT push token logic.
14
+ * This service is responsible for:
15
+ * - Creating/retrieving device IDs
16
+ * - Managing anonymous profiles (generatedCDID)
17
+ * - Registering devices with the backend
18
+ * - Storing device credentials
19
+ *
20
+ * KEY: This service does NOT handle push tokens.
21
+ * Push token management is handled separately by PushTokenService.
22
+ */
23
+ export class DeviceRegistrationService {
24
+ deviceId = null;
25
+ isProduction = 'STAGE';
26
+
27
+ // Injectable dependencies (passed from SDK)
28
+
29
+ constructor(appId, isProduction, sendToSwanFn, getDeviceLocationFn) {
30
+ this.appId = appId;
31
+ this.isProduction = isProduction;
32
+ this.sendToSwanFn = sendToSwanFn;
33
+ this.getDeviceLocationFn = getDeviceLocationFn;
34
+ }
35
+
36
+ /**
37
+ * Register device with backend.
38
+ * If device already registered, returns cached credentials.
39
+ * Otherwise, creates new device registration.
40
+ *
41
+ * NO PUSH TOKEN LOGIC - device registration is independent of push tokens.
42
+ */
43
+ async registerDevice() {
44
+ Logger.log('[DeviceRegistrationService] Starting device registration...');
45
+
46
+ // Check if device already registered
47
+ const storedCredentials = await this.getStoredCredentials();
48
+ if (storedCredentials?.deviceId && storedCredentials?.generatedCDID) {
49
+ Logger.log(`[DeviceRegistrationService] Device already registered: ${storedCredentials.deviceId}`);
50
+ this.deviceId = storedCredentials.deviceId;
51
+
52
+ // Ensure appId is in credentials (for existing devices that were registered before this fix)
53
+ if (!storedCredentials.appId) {
54
+ Logger.log('[DeviceRegistrationService] Adding missing appId to stored credentials');
55
+ storedCredentials.appId = this.appId;
56
+ await this.saveCredentials(storedCredentials);
57
+ }
58
+ return storedCredentials;
59
+ }
60
+
61
+ // Device not registered - perform fresh registration
62
+ Logger.log('[DeviceRegistrationService] Device not found, registering new device...');
63
+ try {
64
+ const response = await this.registerNewDevice();
65
+ const credentials = {
66
+ appId: this.appId,
67
+ // Store appId for headless context (delivery ACK when app killed)
68
+ deviceActivatedAt: new Date().toISOString(),
69
+ deviceId: response.deviceId,
70
+ generatedCDID: response.generatedCDID,
71
+ currentCDID: null,
72
+ first_seen_at: response.first_seen_at,
73
+ isProduction: this.isProduction
74
+ // NO pushNotificationToken here - that's handled separately
75
+ };
76
+ await this.saveCredentials(credentials);
77
+ this.deviceId = response.deviceId;
78
+ Logger.log(`[DeviceRegistrationService] Device registered successfully: ${response.deviceId}`);
79
+ return credentials;
80
+ } catch (error) {
81
+ Logger.error('[DeviceRegistrationService] Device registration failed:', error);
82
+ throw error;
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Get stored device credentials
88
+ */
89
+ async getStoredCredentials(key = 'swanCredentials') {
90
+ try {
91
+ const encoded = await AsyncStorage.getItem(key);
92
+ if (!encoded) {
93
+ return null;
94
+ }
95
+ return JSON.parse(Base64.decode(encoded));
96
+ } catch (error) {
97
+ Logger.error('[DeviceRegistrationService] Error getting stored credentials:', error);
98
+ return null;
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Save device credentials
104
+ */
105
+ async saveCredentials(data, key = 'swanCredentials') {
106
+ try {
107
+ const encoded = Base64.encode(JSON.stringify({
108
+ ...data,
109
+ isProduction: this.isProduction
110
+ }));
111
+ await AsyncStorage.setItem(key, encoded);
112
+ Logger.log('[DeviceRegistrationService] Credentials saved');
113
+
114
+ // Save to iOS App Group for Notification Service Extension (iOS only)
115
+ if (key === 'swanCredentials' && Platform.OS === 'ios') {
116
+ await SharedCredentialsManager.saveToAppGroup({
117
+ appId: this.appId,
118
+ deviceId: data.deviceId,
119
+ cdid: data.currentCDID || data.generatedCDID,
120
+ isProduction: this.isProduction,
121
+ ackUrl: URLS.WEBHOOK_MOBILE_PUSH_URL[this.isProduction]
122
+ });
123
+ }
124
+ } catch (error) {
125
+ Logger.error('[DeviceRegistrationService] Error saving credentials:', error);
126
+ throw error;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Update stored credentials (partial update)
132
+ */
133
+ async updateStoredCredentials(updates) {
134
+ const existing = await this.getStoredCredentials();
135
+ if (!existing) {
136
+ throw new Error('No existing credentials to update');
137
+ }
138
+ const updated = {
139
+ ...existing,
140
+ ...updates
141
+ };
142
+ await this.saveCredentials(updated);
143
+ }
144
+
145
+ /**
146
+ * Register new device with backend
147
+ * NO PUSH TOKEN PARAMETER - device registration is independent
148
+ */
149
+ async registerNewDevice() {
150
+ Logger.log('[DeviceRegistrationService] Step 1: Getting device details...');
151
+ const deviceDetails = await this.getStoredCredentials('swanDeviceDetails');
152
+ Logger.log('[DeviceRegistrationService] Step 2: Getting location...');
153
+ const location = await this.getDeviceLocationFn().catch(() => null);
154
+ Logger.log('[DeviceRegistrationService] Step 3: Building request body...');
155
+ const requestBody = {
156
+ deviceDetails: {
157
+ ...deviceDetails,
158
+ location: location || deviceDetails?.location || {}
159
+ },
160
+ platform: Platform.OS,
161
+ // NO pushNotificationToken field
162
+ // NO pushPermissionPreference field
163
+ purpose: Object.keys(deviceDetails || {}).length ? 'update_device' : 'register_device'
164
+ };
165
+ const url = `${URLS.ECOM_DEVICE_REGISTER_URL[this.isProduction]}?appId=${this.appId}`;
166
+ Logger.log('[DeviceRegistrationService] Step 4: Making API call to:', url);
167
+ const response = await this.sendToSwanFn(url, requestBody, true);
168
+ Logger.log('[DeviceRegistrationService] Step 5: Got response:', !!response);
169
+ if (!response || !response.deviceId) {
170
+ throw new Error('Failed to register device - no deviceId in response');
171
+ }
172
+
173
+ // Save device details
174
+ if (response.deviceDoc) {
175
+ const encoded = Base64.encode(JSON.stringify(response.deviceDoc));
176
+ await AsyncStorage.setItem('swanDeviceDetails', encoded);
177
+ }
178
+ return {
179
+ deviceId: response.deviceId,
180
+ generatedCDID: response.generatedCDID,
181
+ first_seen_at: new Date().toISOString()
182
+ };
183
+ }
184
+
185
+ /**
186
+ * Update device location on backend
187
+ */
188
+ async updateLocation() {
189
+ Logger.log('[DeviceRegistrationService] Updating device location...');
190
+ const credentials = await this.getStoredCredentials();
191
+ if (!credentials?.deviceId) {
192
+ Logger.warn('[DeviceRegistrationService] Device not registered yet, cannot update location');
193
+ return;
194
+ }
195
+ const deviceDetails = await this.getStoredCredentials('swanDeviceDetails');
196
+
197
+ // Check if location already shared
198
+ if (deviceDetails?.location && Object.keys(deviceDetails.location).length) {
199
+ Logger.log('[DeviceRegistrationService] Location already shared, not sharing again');
200
+ return;
201
+ }
202
+ try {
203
+ await this.updateDeviceOnBackend({});
204
+ Logger.log('[DeviceRegistrationService] Location updated successfully');
205
+ } catch (error) {
206
+ Logger.error('[DeviceRegistrationService] Failed to update location:', error);
207
+ throw error;
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Update device on backend (for push token updates and location updates)
213
+ */
214
+ async updateDeviceOnBackend(data) {
215
+ const deviceDetails = await this.getStoredCredentials('swanDeviceDetails');
216
+ const location = await this.getDeviceLocationFn().catch(() => null);
217
+ const requestBody = {
218
+ deviceDetails: {
219
+ ...deviceDetails,
220
+ location: location || deviceDetails?.location || {}
221
+ },
222
+ platform: Platform.OS,
223
+ pushNotificationToken: data.pushNotificationToken,
224
+ purpose: 'update_device'
225
+ };
226
+ const url = `${URLS.ECOM_DEVICE_REGISTER_URL[this.isProduction]}?appId=${this.appId}`;
227
+ const response = await this.sendToSwanFn(url, requestBody, true);
228
+
229
+ // Update stored device details if response contains deviceDoc
230
+ if (response?.deviceDoc) {
231
+ const encoded = Base64.encode(JSON.stringify(response.deviceDoc));
232
+ await AsyncStorage.setItem('swanDeviceDetails', encoded);
233
+ }
234
+ }
235
+
236
+ /**
237
+ * Get device ID
238
+ */
239
+ getDeviceId() {
240
+ return this.deviceId;
241
+ }
242
+ }
243
+ //# sourceMappingURL=DeviceRegistrationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AsyncStorage","Base64","Platform","Logger","SharedCredentialsManager","URLS","DeviceRegistrationService","deviceId","isProduction","constructor","appId","sendToSwanFn","getDeviceLocationFn","registerDevice","log","storedCredentials","getStoredCredentials","generatedCDID","saveCredentials","response","registerNewDevice","credentials","deviceActivatedAt","Date","toISOString","currentCDID","first_seen_at","error","key","encoded","getItem","JSON","parse","decode","data","encode","stringify","setItem","OS","saveToAppGroup","cdid","ackUrl","WEBHOOK_MOBILE_PUSH_URL","updateStoredCredentials","updates","existing","Error","updated","deviceDetails","location","catch","requestBody","platform","purpose","Object","keys","length","url","ECOM_DEVICE_REGISTER_URL","deviceDoc","updateLocation","warn","updateDeviceOnBackend","pushNotificationToken","getDeviceId"],"sourceRoot":"../../../src","sources":["services/DeviceRegistrationService.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+
3
+ import Logger from "../utils/Logger.js";
4
+ import { PUSH_NOTIFICATION_EVENTS } from "../providers/PushNotificationProvider.js";
5
+ /**
6
+ * PushTokenService
7
+ *
8
+ * Manages push token lifecycle:
9
+ * - Initializes push provider (Firebase, etc.)
10
+ * - Handles token generation and refresh
11
+ * - Updates device with token when available
12
+ * - Manages permission requests
13
+ *
14
+ * This service is INDEPENDENT of device registration.
15
+ * Tokens are managed separately and can arrive at any time.
16
+ */
17
+ export class PushTokenService {
18
+ eventListeners = {};
19
+ constructor(provider, _deviceService) {
20
+ this.provider = provider;
21
+ // deviceService kept as parameter for future use
22
+ }
23
+
24
+ /**
25
+ * Initialize push notification provider
26
+ */
27
+ async initialize() {
28
+ try {
29
+ Logger.log('[PushTokenService] Initializing push notification provider...');
30
+ const initialized = await this.provider.initialize();
31
+ if (!initialized) {
32
+ Logger.error('[PushTokenService] Provider initialization failed');
33
+ return false;
34
+ }
35
+
36
+ // Setup provider event listeners
37
+ this.setupProviderListeners();
38
+
39
+ // Try to get existing token
40
+ const token = await this.provider.getToken();
41
+ if (token) {
42
+ Logger.log('[PushTokenService] Existing token found:', token);
43
+ this.emit('tokenReceived', token);
44
+ } else {
45
+ Logger.log('[PushTokenService] No existing token found');
46
+ }
47
+ Logger.log('[PushTokenService] Push notification provider initialized successfully');
48
+ return true;
49
+ } catch (error) {
50
+ Logger.error('[PushTokenService] Error during initialization:', error);
51
+ return false;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Request push notification permission
57
+ */
58
+ async requestPermission() {
59
+ try {
60
+ Logger.log('[PushTokenService] Requesting push notification permission...');
61
+ const granted = await this.provider.requestPermission();
62
+ if (granted) {
63
+ Logger.log('[PushTokenService] Permission granted');
64
+ this.emit('permissionGranted', {
65
+ granted: true
66
+ });
67
+
68
+ // Token should arrive via provider event listener
69
+ // But we can also check immediately
70
+ const token = await this.provider.getToken();
71
+ if (token) {
72
+ this.emit('tokenReceived', token);
73
+ }
74
+ } else {
75
+ Logger.warn('[PushTokenService] Permission denied');
76
+ this.emit('permissionDenied', {
77
+ granted: false
78
+ });
79
+ }
80
+ return granted;
81
+ } catch (error) {
82
+ Logger.error('[PushTokenService] Error requesting permission:', error);
83
+ return false;
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Check if permission is granted
89
+ */
90
+ async hasPermission() {
91
+ try {
92
+ return await this.provider.hasPermission();
93
+ } catch (error) {
94
+ Logger.error('[PushTokenService] Error checking permission:', error);
95
+ return false;
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Get current push token
101
+ */
102
+ async getToken() {
103
+ try {
104
+ return await this.provider.getToken();
105
+ } catch (error) {
106
+ Logger.error('[PushTokenService] Error getting token:', error);
107
+ return null;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Delete push token (when user revokes permission)
113
+ */
114
+ async deleteToken() {
115
+ try {
116
+ if (this.provider.deleteToken) {
117
+ return await this.provider.deleteToken();
118
+ }
119
+ return false;
120
+ } catch (error) {
121
+ Logger.error('[PushTokenService] Error deleting token:', error);
122
+ return false;
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Get badge count
128
+ */
129
+ async getBadgeCount() {
130
+ try {
131
+ if (this.provider.getBadgeCount) {
132
+ return await this.provider.getBadgeCount();
133
+ }
134
+ return 0;
135
+ } catch (error) {
136
+ Logger.error('[PushTokenService] Error getting badge count:', error);
137
+ return 0;
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Set badge count
143
+ */
144
+ async setBadgeCount(count) {
145
+ try {
146
+ if (this.provider.setBadgeCount) {
147
+ return await this.provider.setBadgeCount(count);
148
+ }
149
+ return false;
150
+ } catch (error) {
151
+ Logger.error('[PushTokenService] Error setting badge count:', error);
152
+ return false;
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Create notification channel (Android)
158
+ */
159
+ async createNotificationChannel(channelId, channelName, importance, description) {
160
+ try {
161
+ if (this.provider.createNotificationChannel) {
162
+ return await this.provider.createNotificationChannel(channelId, channelName, importance, description);
163
+ }
164
+ return null;
165
+ } catch (error) {
166
+ Logger.error('[PushTokenService] Error creating notification channel:', error);
167
+ return null;
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Delete notification channel (Android only)
173
+ */
174
+ async deleteNotificationChannel(channelId) {
175
+ try {
176
+ if (this.provider.deleteNotificationChannel) {
177
+ return await this.provider.deleteNotificationChannel(channelId);
178
+ }
179
+ return false;
180
+ } catch (error) {
181
+ Logger.error('[PushTokenService] Error deleting notification channel:', error);
182
+ return false;
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Add event listener (delegates to provider)
188
+ */
189
+ addEventListener(eventName, callback) {
190
+ this.provider.addEventListener(eventName, callback);
191
+ }
192
+
193
+ /**
194
+ * Remove event listener (delegates to provider)
195
+ */
196
+ removeEventListener(eventName, callback) {
197
+ this.provider.removeEventListener(eventName, callback);
198
+ }
199
+
200
+ /**
201
+ * Setup listeners for provider events (token refresh, notifications)
202
+ */
203
+ setupProviderListeners() {
204
+ // Listen for token refresh
205
+ this.provider.addEventListener(PUSH_NOTIFICATION_EVENTS.TOKEN_REFRESH, token => {
206
+ Logger.log('[PushTokenService] Token refreshed:', token);
207
+ this.emit('tokenReceived', token);
208
+ });
209
+
210
+ // Listen for token received (first time)
211
+ this.provider.addEventListener(PUSH_NOTIFICATION_EVENTS.TOKEN_RECEIVED, token => {
212
+ Logger.log('[PushTokenService] Token received:', token);
213
+ this.emit('tokenReceived', token);
214
+ });
215
+
216
+ // Listen for notifications received
217
+ this.provider.addEventListener(PUSH_NOTIFICATION_EVENTS.NOTIFICATION_RECEIVED, notification => {
218
+ Logger.log('[PushTokenService] Notification received:', notification);
219
+ this.emit('notificationReceived', notification);
220
+ });
221
+
222
+ // Listen for notification opened
223
+ this.provider.addEventListener(PUSH_NOTIFICATION_EVENTS.NOTIFICATION_OPENED, notification => {
224
+ Logger.log('[PushTokenService] Notification opened:', notification);
225
+ this.emit('notificationOpened', notification);
226
+ });
227
+
228
+ // Listen for permission changes
229
+ this.provider.addEventListener(PUSH_NOTIFICATION_EVENTS.PERMISSION_CHANGED, permissionData => {
230
+ Logger.log('[PushTokenService] Permission changed:', permissionData);
231
+ this.emit('permissionChanged', permissionData);
232
+ });
233
+ }
234
+
235
+ /**
236
+ * Add event listener
237
+ */
238
+ on(eventName, callback) {
239
+ if (!this.eventListeners[eventName]) {
240
+ this.eventListeners[eventName] = [];
241
+ }
242
+ this.eventListeners[eventName].push(callback);
243
+
244
+ // Return unsubscribe function
245
+ return () => {
246
+ if (this.eventListeners[eventName]) {
247
+ this.eventListeners[eventName] = this.eventListeners[eventName].filter(cb => cb !== callback);
248
+ }
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Emit event to listeners
254
+ */
255
+ emit(eventName, data) {
256
+ const listeners = this.eventListeners[eventName];
257
+ if (listeners) {
258
+ listeners.forEach(callback => {
259
+ try {
260
+ callback(data);
261
+ } catch (error) {
262
+ Logger.error(`[PushTokenService] Error in event listener for ${eventName}:`, error);
263
+ }
264
+ });
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Cleanup
270
+ */
271
+ cleanup() {
272
+ if (this.provider?.cleanup) {
273
+ this.provider.cleanup();
274
+ }
275
+ this.eventListeners = {};
276
+ }
277
+ }
278
+ //# sourceMappingURL=PushTokenService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Logger","PUSH_NOTIFICATION_EVENTS","PushTokenService","eventListeners","constructor","provider","_deviceService","initialize","log","initialized","error","setupProviderListeners","token","getToken","emit","requestPermission","granted","warn","hasPermission","deleteToken","getBadgeCount","setBadgeCount","count","createNotificationChannel","channelId","channelName","importance","description","deleteNotificationChannel","addEventListener","eventName","callback","removeEventListener","TOKEN_REFRESH","TOKEN_RECEIVED","NOTIFICATION_RECEIVED","notification","NOTIFICATION_OPENED","PERMISSION_CHANGED","permissionData","on","push","filter","cb","data","listeners","forEach","cleanup"],"sourceRoot":"../../../src","sources":["services/PushTokenService.ts"],"mappings":"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","ignoreList":[]}