@clix-so/react-native-sdk 0.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 (100) hide show
  1. package/LICENSE +27 -0
  2. package/README.md +345 -0
  3. package/lib/module/core/Clix.js +217 -0
  4. package/lib/module/core/Clix.js.map +1 -0
  5. package/lib/module/core/ClixConfig.js +4 -0
  6. package/lib/module/core/ClixConfig.js.map +1 -0
  7. package/lib/module/core/ClixInitCoordinator.js +58 -0
  8. package/lib/module/core/ClixInitCoordinator.js.map +1 -0
  9. package/lib/module/core/ClixVersion.js +17 -0
  10. package/lib/module/core/ClixVersion.js.map +1 -0
  11. package/lib/module/index.js +7 -0
  12. package/lib/module/index.js.map +1 -0
  13. package/lib/module/models/ClixDevice.js +51 -0
  14. package/lib/module/models/ClixDevice.js.map +1 -0
  15. package/lib/module/models/ClixPushNotificationPayload.js +21 -0
  16. package/lib/module/models/ClixPushNotificationPayload.js.map +1 -0
  17. package/lib/module/models/ClixUserProperty.js +44 -0
  18. package/lib/module/models/ClixUserProperty.js.map +1 -0
  19. package/lib/module/package.json +1 -0
  20. package/lib/module/services/ClixAPIClient.js +172 -0
  21. package/lib/module/services/ClixAPIClient.js.map +1 -0
  22. package/lib/module/services/DeviceAPIService.js +112 -0
  23. package/lib/module/services/DeviceAPIService.js.map +1 -0
  24. package/lib/module/services/DeviceService.js +157 -0
  25. package/lib/module/services/DeviceService.js.map +1 -0
  26. package/lib/module/services/EventAPIService.js +36 -0
  27. package/lib/module/services/EventAPIService.js.map +1 -0
  28. package/lib/module/services/EventService.js +29 -0
  29. package/lib/module/services/EventService.js.map +1 -0
  30. package/lib/module/services/NotificationService.js +549 -0
  31. package/lib/module/services/NotificationService.js.map +1 -0
  32. package/lib/module/services/StorageService.js +76 -0
  33. package/lib/module/services/StorageService.js.map +1 -0
  34. package/lib/module/services/TokenService.js +71 -0
  35. package/lib/module/services/TokenService.js.map +1 -0
  36. package/lib/module/utils/ClixError.js +63 -0
  37. package/lib/module/utils/ClixError.js.map +1 -0
  38. package/lib/module/utils/UUID.js +28 -0
  39. package/lib/module/utils/UUID.js.map +1 -0
  40. package/lib/module/utils/logging/ClixLogger.js +55 -0
  41. package/lib/module/utils/logging/ClixLogger.js.map +1 -0
  42. package/lib/typescript/package.json +1 -0
  43. package/lib/typescript/src/core/Clix.d.ts +67 -0
  44. package/lib/typescript/src/core/Clix.d.ts.map +1 -0
  45. package/lib/typescript/src/core/ClixConfig.d.ts +9 -0
  46. package/lib/typescript/src/core/ClixConfig.d.ts.map +1 -0
  47. package/lib/typescript/src/core/ClixInitCoordinator.d.ts +16 -0
  48. package/lib/typescript/src/core/ClixInitCoordinator.d.ts.map +1 -0
  49. package/lib/typescript/src/core/ClixVersion.d.ts +6 -0
  50. package/lib/typescript/src/core/ClixVersion.d.ts.map +1 -0
  51. package/lib/typescript/src/index.d.ts +5 -0
  52. package/lib/typescript/src/index.d.ts.map +1 -0
  53. package/lib/typescript/src/models/ClixDevice.d.ts +42 -0
  54. package/lib/typescript/src/models/ClixDevice.d.ts.map +1 -0
  55. package/lib/typescript/src/models/ClixPushNotificationPayload.d.ts +23 -0
  56. package/lib/typescript/src/models/ClixPushNotificationPayload.d.ts.map +1 -0
  57. package/lib/typescript/src/models/ClixUserProperty.d.ts +19 -0
  58. package/lib/typescript/src/models/ClixUserProperty.d.ts.map +1 -0
  59. package/lib/typescript/src/services/ClixAPIClient.d.ts +35 -0
  60. package/lib/typescript/src/services/ClixAPIClient.d.ts.map +1 -0
  61. package/lib/typescript/src/services/DeviceAPIService.d.ts +13 -0
  62. package/lib/typescript/src/services/DeviceAPIService.d.ts.map +1 -0
  63. package/lib/typescript/src/services/DeviceService.d.ts +20 -0
  64. package/lib/typescript/src/services/DeviceService.d.ts.map +1 -0
  65. package/lib/typescript/src/services/EventAPIService.d.ts +7 -0
  66. package/lib/typescript/src/services/EventAPIService.d.ts.map +1 -0
  67. package/lib/typescript/src/services/EventService.d.ts +9 -0
  68. package/lib/typescript/src/services/EventService.d.ts.map +1 -0
  69. package/lib/typescript/src/services/NotificationService.d.ts +56 -0
  70. package/lib/typescript/src/services/NotificationService.d.ts.map +1 -0
  71. package/lib/typescript/src/services/StorageService.d.ts +10 -0
  72. package/lib/typescript/src/services/StorageService.d.ts.map +1 -0
  73. package/lib/typescript/src/services/TokenService.d.ts +15 -0
  74. package/lib/typescript/src/services/TokenService.d.ts.map +1 -0
  75. package/lib/typescript/src/utils/ClixError.d.ts +41 -0
  76. package/lib/typescript/src/utils/ClixError.d.ts.map +1 -0
  77. package/lib/typescript/src/utils/UUID.d.ts +14 -0
  78. package/lib/typescript/src/utils/UUID.d.ts.map +1 -0
  79. package/lib/typescript/src/utils/logging/ClixLogger.d.ts +18 -0
  80. package/lib/typescript/src/utils/logging/ClixLogger.d.ts.map +1 -0
  81. package/package.json +151 -0
  82. package/src/core/Clix.ts +256 -0
  83. package/src/core/ClixConfig.ts +9 -0
  84. package/src/core/ClixInitCoordinator.ts +65 -0
  85. package/src/core/ClixVersion.ts +17 -0
  86. package/src/index.ts +5 -0
  87. package/src/models/ClixDevice.ts +88 -0
  88. package/src/models/ClixPushNotificationPayload.ts +38 -0
  89. package/src/models/ClixUserProperty.ts +58 -0
  90. package/src/services/ClixAPIClient.ts +248 -0
  91. package/src/services/DeviceAPIService.ts +187 -0
  92. package/src/services/DeviceService.ts +204 -0
  93. package/src/services/EventAPIService.ts +48 -0
  94. package/src/services/EventService.ts +45 -0
  95. package/src/services/NotificationService.ts +730 -0
  96. package/src/services/StorageService.ts +84 -0
  97. package/src/services/TokenService.ts +84 -0
  98. package/src/utils/ClixError.ts +78 -0
  99. package/src/utils/UUID.ts +29 -0
  100. package/src/utils/logging/ClixLogger.ts +61 -0
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ import { ClixLogger } from "../utils/logging/ClixLogger.js";
4
+ export class EventAPIService {
5
+ constructor(apiClient) {
6
+ this.apiClient = apiClient;
7
+ }
8
+ async trackEvent(deviceId, name, properties, messageId) {
9
+ try {
10
+ ClixLogger.debug(`Tracking event: ${name} for device: ${deviceId}`);
11
+ const eventRequestBody = {
12
+ device_id: deviceId,
13
+ name: name,
14
+ event_property: {
15
+ custom_properties: properties,
16
+ ...(messageId && {
17
+ message_id: messageId
18
+ })
19
+ }
20
+ };
21
+ const response = await this.apiClient.post('/events', {
22
+ body: {
23
+ events: [eventRequestBody]
24
+ }
25
+ });
26
+ if (response.status < 200 || response.status >= 300) {
27
+ throw new Error(`HTTP ${response.status}: ${JSON.stringify(response.data)}`);
28
+ }
29
+ ClixLogger.debug(`Event tracked successfully: ${name} for device: ${deviceId}`);
30
+ } catch (error) {
31
+ ClixLogger.error(`Failed to track event: ${name} for device: ${deviceId}`, error);
32
+ throw error;
33
+ }
34
+ }
35
+ }
36
+ //# sourceMappingURL=EventAPIService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ClixLogger","EventAPIService","constructor","apiClient","trackEvent","deviceId","name","properties","messageId","debug","eventRequestBody","device_id","event_property","custom_properties","message_id","response","post","body","events","status","Error","JSON","stringify","data","error"],"sourceRoot":"../../../src","sources":["services/EventAPIService.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,gCAA6B;AAGxD,OAAO,MAAMC,eAAe,CAAC;EAC3BC,WAAWA,CAAkBC,SAAwB,EAAE;IAAA,KAA1BA,SAAwB,GAAxBA,SAAwB;EAAG;EAExD,MAAMC,UAAUA,CACdC,QAAgB,EAChBC,IAAY,EACZC,UAA+B,EAC/BC,SAAkB,EACH;IACf,IAAI;MACFR,UAAU,CAACS,KAAK,CAAC,mBAAmBH,IAAI,gBAAgBD,QAAQ,EAAE,CAAC;MAEnE,MAAMK,gBAAgB,GAAG;QACvBC,SAAS,EAAEN,QAAQ;QACnBC,IAAI,EAAEA,IAAI;QACVM,cAAc,EAAE;UACdC,iBAAiB,EAAEN,UAAU;UAC7B,IAAIC,SAAS,IAAI;YAAEM,UAAU,EAAEN;UAAU,CAAC;QAC5C;MACF,CAAC;MAED,MAAMO,QAAQ,GAAG,MAAM,IAAI,CAACZ,SAAS,CAACa,IAAI,CAAC,SAAS,EAAE;QACpDC,IAAI,EAAE;UACJC,MAAM,EAAE,CAACR,gBAAgB;QAC3B;MACF,CAAC,CAAC;MAEF,IAAIK,QAAQ,CAACI,MAAM,GAAG,GAAG,IAAIJ,QAAQ,CAACI,MAAM,IAAI,GAAG,EAAE;QACnD,MAAM,IAAIC,KAAK,CACb,QAAQL,QAAQ,CAACI,MAAM,KAAKE,IAAI,CAACC,SAAS,CAACP,QAAQ,CAACQ,IAAI,CAAC,EAC3D,CAAC;MACH;MAEAvB,UAAU,CAACS,KAAK,CACd,+BAA+BH,IAAI,gBAAgBD,QAAQ,EAC7D,CAAC;IACH,CAAC,CAAC,OAAOmB,KAAK,EAAE;MACdxB,UAAU,CAACwB,KAAK,CACd,0BAA0BlB,IAAI,gBAAgBD,QAAQ,EAAE,EACxDmB,KACF,CAAC;MACD,MAAMA,KAAK;IACb;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ import { ClixLogger } from "../utils/logging/ClixLogger.js";
4
+ export class EventService {
5
+ constructor(eventAPIService, deviceService) {
6
+ this.eventAPIService = eventAPIService;
7
+ this.deviceService = deviceService;
8
+ }
9
+ async trackEvent(name, properties, messageId) {
10
+ try {
11
+ ClixLogger.debug(`Tracking event: ${name}`);
12
+ const deviceId = await this.deviceService.getCurrentDeviceId();
13
+ const cleanProperties = {};
14
+ if (properties) {
15
+ Object.entries(properties).forEach(([key, value]) => {
16
+ if (value !== null && value !== undefined) {
17
+ cleanProperties[key] = value;
18
+ }
19
+ });
20
+ }
21
+ await this.eventAPIService.trackEvent(deviceId, name, cleanProperties, messageId);
22
+ ClixLogger.debug(`Event tracked successfully: ${name}`);
23
+ } catch (error) {
24
+ ClixLogger.error(`Failed to track event '${name}': ${error}. Make sure Clix.initialize() has been called.`);
25
+ throw error;
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=EventService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ClixLogger","EventService","constructor","eventAPIService","deviceService","trackEvent","name","properties","messageId","debug","deviceId","getCurrentDeviceId","cleanProperties","Object","entries","forEach","key","value","undefined","error"],"sourceRoot":"../../../src","sources":["services/EventService.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,gCAA6B;AAIxD,OAAO,MAAMC,YAAY,CAAC;EACxBC,WAAWA,CACQC,eAAgC,EAChCC,aAA4B,EAC7C;IAAA,KAFiBD,eAAgC,GAAhCA,eAAgC;IAAA,KAChCC,aAA4B,GAA5BA,aAA4B;EAC5C;EAEH,MAAMC,UAAUA,CACdC,IAAY,EACZC,UAAgC,EAChCC,SAAkB,EACH;IACf,IAAI;MACFR,UAAU,CAACS,KAAK,CAAC,mBAAmBH,IAAI,EAAE,CAAC;MAE3C,MAAMI,QAAQ,GAAG,MAAM,IAAI,CAACN,aAAa,CAACO,kBAAkB,CAAC,CAAC;MAE9D,MAAMC,eAAoC,GAAG,CAAC,CAAC;MAC/C,IAAIL,UAAU,EAAE;QACdM,MAAM,CAACC,OAAO,CAACP,UAAU,CAAC,CAACQ,OAAO,CAAC,CAAC,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK;UACnD,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;YACzCN,eAAe,CAACI,GAAG,CAAC,GAAGC,KAAK;UAC9B;QACF,CAAC,CAAC;MACJ;MAEA,MAAM,IAAI,CAACd,eAAe,CAACE,UAAU,CACnCK,QAAQ,EACRJ,IAAI,EACJM,eAAe,EACfJ,SACF,CAAC;MAEDR,UAAU,CAACS,KAAK,CAAC,+BAA+BH,IAAI,EAAE,CAAC;IACzD,CAAC,CAAC,OAAOa,KAAK,EAAE;MACdnB,UAAU,CAACmB,KAAK,CACd,0BAA0Bb,IAAI,MAAMa,KAAK,gDAC3C,CAAC;MACD,MAAMA,KAAK;IACb;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,549 @@
1
+ "use strict";
2
+
3
+ import notifee, { AndroidImportance, AndroidStyle, EventType } from '@notifee/react-native';
4
+ import messaging from '@react-native-firebase/messaging';
5
+ import { Linking, Platform } from 'react-native';
6
+ import { ClixPushNotificationPayload } from "../models/ClixPushNotificationPayload.js";
7
+ import { ClixLogger } from "../utils/logging/ClixLogger.js";
8
+ import { UUID } from "../utils/UUID.js";
9
+ import { ClixAPIClient } from "./ClixAPIClient.js";
10
+ import { DeviceAPIService } from "./DeviceAPIService.js";
11
+ import { DeviceService } from "./DeviceService.js";
12
+ import { EventAPIService } from "./EventAPIService.js";
13
+ import { EventService } from "./EventService.js";
14
+ import { StorageService } from "./StorageService.js";
15
+ import { TokenService } from "./TokenService.js";
16
+ export class NotificationService {
17
+ static instance = null;
18
+ static DEFAULT_CHANNEL = {
19
+ id: 'clix_default',
20
+ name: 'Clix Notifications',
21
+ description: 'Default notifications from Clix',
22
+ importance: AndroidImportance.HIGH,
23
+ sound: 'default',
24
+ vibration: true,
25
+ lights: true
26
+ };
27
+ messagingService = messaging();
28
+ isInitialized = false;
29
+ currentPushToken = null;
30
+ processedMessageIds = new Set();
31
+ constructor() {}
32
+ static getInstance() {
33
+ if (!NotificationService.instance) {
34
+ NotificationService.instance = new NotificationService();
35
+ }
36
+ return NotificationService.instance;
37
+ }
38
+ static resetInstance() {
39
+ if (NotificationService.instance) {
40
+ NotificationService.instance.cleanup();
41
+ NotificationService.instance = null;
42
+ }
43
+ }
44
+ async initialize(eventService, storageService, deviceService, tokenService) {
45
+ if (this.isInitialized) {
46
+ ClixLogger.debug('Notification service already initialized, returning existing instance');
47
+ return this;
48
+ }
49
+ try {
50
+ ClixLogger.debug('Initializing notification service');
51
+ this.eventService = eventService;
52
+ this.storageService = storageService;
53
+ this.deviceService = deviceService;
54
+ this.tokenService = tokenService;
55
+ await this.initializeNotificationDisplayService();
56
+ await this.initializeMessageService();
57
+ this.isInitialized = true;
58
+ ClixLogger.debug('Notification service initialized successfully');
59
+ return this;
60
+ } catch (error) {
61
+ ClixLogger.error('Failed to initialize notification service', error);
62
+ throw error;
63
+ }
64
+ }
65
+ async getCurrentToken() {
66
+ try {
67
+ this.currentPushToken = await this.getOrFetchToken();
68
+ return this.currentPushToken;
69
+ } catch (error) {
70
+ ClixLogger.error('Failed to get push token', error);
71
+ return null;
72
+ }
73
+ }
74
+ cleanup() {
75
+ this.unsubscribeForegroundMessage?.();
76
+ this.unsubscribeNotificationOpened?.();
77
+ this.unsubscribeTokenRefresh?.();
78
+ this.unsubscribeNotificationEvents?.();
79
+ this.isInitialized = false;
80
+ this.processedMessageIds.clear();
81
+ ClixLogger.debug('Notification service cleaned up');
82
+ }
83
+ async initializeNotificationDisplayService() {
84
+ await notifee.requestPermission({
85
+ alert: true,
86
+ badge: true,
87
+ sound: true,
88
+ criticalAlert: false,
89
+ announcement: false,
90
+ carPlay: false,
91
+ provisional: false
92
+ });
93
+ if (Platform.OS === 'android') {
94
+ await this.createNotificationChannels();
95
+ }
96
+ this.setupNotificationEventListeners();
97
+ }
98
+ async createNotificationChannels() {
99
+ try {
100
+ await notifee.createChannel(NotificationService.DEFAULT_CHANNEL);
101
+ ClixLogger.debug('Notification channels created successfully');
102
+ } catch (error) {
103
+ ClixLogger.error('Failed to create notification channels', error);
104
+ }
105
+ }
106
+ setupNotificationEventListeners() {
107
+ this.unsubscribeNotificationEvents = notifee.onForegroundEvent(async event => {
108
+ await this.handleNotificationEvent(event);
109
+ });
110
+ }
111
+ async handleNotificationEvent(event) {
112
+ const {
113
+ type,
114
+ detail
115
+ } = event;
116
+ switch (type) {
117
+ case EventType.PRESS:
118
+ if (detail.notification?.data) {
119
+ await this.handleNotificationTap(detail.notification.data);
120
+ }
121
+ break;
122
+ case EventType.ACTION_PRESS:
123
+ if (detail.pressAction?.id) {
124
+ await this.handleActionPress(detail.pressAction.id, detail.notification?.data);
125
+ }
126
+ break;
127
+ case EventType.DISMISSED:
128
+ ClixLogger.debug('Notification dismissed');
129
+ break;
130
+ default:
131
+ ClixLogger.debug('Unhandled notification event type:', type);
132
+ }
133
+ }
134
+ async handleActionPress(actionId, data) {
135
+ ClixLogger.debug('Action pressed:', actionId);
136
+ if (data) {
137
+ await this.handleNotificationTap(data);
138
+ }
139
+ }
140
+ async initializeMessageService() {
141
+ this.setupMessageHandlers();
142
+ const settings = await this.requestMessagePermission();
143
+ if (settings !== messaging.AuthorizationStatus.DENIED) {
144
+ await this.getAndUpdateToken();
145
+ this.setupTokenRefreshListener();
146
+ } else {
147
+ ClixLogger.warn('Push notification permission denied');
148
+ }
149
+ }
150
+ setupMessageHandlers() {
151
+ this.messagingService.setBackgroundMessageHandler(async remoteMessage => {
152
+ await this.handleBackgroundMessage(remoteMessage);
153
+ });
154
+ this.unsubscribeForegroundMessage = this.messagingService.onMessage(async remoteMessage => {
155
+ await this.handleForegroundMessage(remoteMessage);
156
+ });
157
+ this.unsubscribeNotificationOpened = this.messagingService.onNotificationOpenedApp(async remoteMessage => {
158
+ await this.handleNotificationTap(remoteMessage.data ?? {});
159
+ });
160
+ this.checkInitialNotification();
161
+ }
162
+ async handleBackgroundMessage(remoteMessage) {
163
+ try {
164
+ const clixPayload = this.parseClixPayload(remoteMessage.data ?? {});
165
+ if (!clixPayload) {
166
+ ClixLogger.warn('No Clix payload found in background message');
167
+ return;
168
+ }
169
+ await this.storageService.set('last_background_notification', {
170
+ messageId: remoteMessage.messageId,
171
+ data: remoteMessage.data ?? {},
172
+ timestamp: Date.now(),
173
+ clixMessageId: clixPayload.messageId,
174
+ campaignId: clixPayload.campaignId,
175
+ trackingId: clixPayload.trackingId
176
+ });
177
+ await this.trackEventInBackground(clixPayload);
178
+ if (!remoteMessage.notification) {
179
+ await this.displayNotification(remoteMessage, clixPayload);
180
+ }
181
+ } catch (error) {
182
+ ClixLogger.error('Background message handler error:', error);
183
+ }
184
+ }
185
+ async handleForegroundMessage(remoteMessage) {
186
+ try {
187
+ const messageId = remoteMessage.messageId;
188
+ if (!messageId) {
189
+ ClixLogger.warn('No messageId found in foreground message');
190
+ return;
191
+ }
192
+ if (this.processedMessageIds.has(messageId)) {
193
+ ClixLogger.debug('Message already processed, skipping duplicate:', messageId);
194
+ return;
195
+ }
196
+ const clixPayload = this.parseClixPayload(remoteMessage.data ?? {});
197
+ if (clixPayload) {
198
+ ClixLogger.debug('Parsed Clix payload:', clixPayload);
199
+ this.processedMessageIds.add(messageId);
200
+ await this.handlePushReceived(remoteMessage.data ?? {});
201
+ await this.displayNotification(remoteMessage, clixPayload);
202
+ } else {
203
+ ClixLogger.warn('No Clix payload found in foreground message');
204
+ }
205
+ } catch (error) {
206
+ ClixLogger.error('Failed to handle foreground message', error);
207
+ }
208
+ }
209
+ async requestMessagePermission() {
210
+ const settings = await this.messagingService.requestPermission({
211
+ alert: true,
212
+ badge: true,
213
+ sound: true,
214
+ provisional: false,
215
+ announcement: false,
216
+ carPlay: false,
217
+ criticalAlert: false
218
+ });
219
+ ClixLogger.debug('Push notification permission status:', settings);
220
+ await this.storageService.set('notification_permission_status', settings.toString());
221
+ return settings;
222
+ }
223
+ setupTokenRefreshListener() {
224
+ this.unsubscribeTokenRefresh = this.messagingService.onTokenRefresh(async token => {
225
+ try {
226
+ ClixLogger.debug('Push token refreshed');
227
+ this.currentPushToken = token;
228
+ await this.saveAndRegisterToken(token);
229
+ } catch (error) {
230
+ ClixLogger.error('Failed to handle token refresh', error);
231
+ }
232
+ });
233
+ }
234
+ async checkInitialNotification() {
235
+ try {
236
+ const initialNotification = await this.messagingService.getInitialNotification();
237
+ if (initialNotification) {
238
+ ClixLogger.debug('App launched from notification:', initialNotification.messageId);
239
+ await this.handleNotificationTap(initialNotification.data ?? {});
240
+ }
241
+ } catch (error) {
242
+ ClixLogger.error('Failed to handle initial notification', error);
243
+ }
244
+ }
245
+ async getAndUpdateToken() {
246
+ try {
247
+ const token = await this.getCurrentToken();
248
+ if (token) {
249
+ await this.registerTokenWithServer(token);
250
+ }
251
+ } catch (error) {
252
+ ClixLogger.error('Failed to update push token', error);
253
+ }
254
+ }
255
+ async getOrFetchToken() {
256
+ if (this.tokenService) {
257
+ const savedToken = await this.tokenService.getCurrentToken();
258
+ if (savedToken) return savedToken;
259
+ }
260
+ const token = await this.messagingService.getToken();
261
+ if (token) {
262
+ ClixLogger.debug('Got push token:', token.substring(0, 20) + '...');
263
+ await this.tokenService?.saveToken(token);
264
+ }
265
+ return token;
266
+ }
267
+ async saveAndRegisterToken(token) {
268
+ if (this.tokenService) {
269
+ await this.tokenService.saveToken(token);
270
+ ClixLogger.debug('New push token saved via TokenService');
271
+ }
272
+ await this.registerTokenWithServer(token);
273
+ }
274
+ async registerTokenWithServer(token) {
275
+ if (this.deviceService) {
276
+ await this.deviceService.upsertToken(token);
277
+ ClixLogger.debug('Push token registered with server');
278
+ }
279
+ }
280
+ async displayNotification(remoteMessage, clixPayload) {
281
+ try {
282
+ const notificationContent = this.extractNotificationContent(remoteMessage.notification, clixPayload);
283
+ ClixLogger.debug('Creating notification config with content:', {
284
+ title: notificationContent.title,
285
+ body: notificationContent.body,
286
+ hasImage: !!notificationContent.imageUrl,
287
+ imageUrl: notificationContent.imageUrl
288
+ });
289
+ const notificationConfig = await this.createNotificationConfig(remoteMessage, clixPayload, notificationContent, NotificationService.DEFAULT_CHANNEL.id);
290
+ await notifee.displayNotification(notificationConfig);
291
+ ClixLogger.debug('Notification displayed successfully:', notificationContent.title);
292
+ } catch (error) {
293
+ ClixLogger.error('Failed to display notification', error);
294
+ if (error instanceof Error) {
295
+ ClixLogger.error('Error details:', {
296
+ message: error.message,
297
+ stack: error.stack,
298
+ messageId: remoteMessage.messageId,
299
+ hasImage: !!clixPayload.imageUrl,
300
+ imageUrl: clixPayload.imageUrl
301
+ });
302
+ }
303
+ }
304
+ }
305
+ async createNotificationConfig(remoteMessage, clixPayload, notificationContent, channelId) {
306
+ const config = {
307
+ id: remoteMessage.messageId || Date.now().toString(),
308
+ title: notificationContent.title,
309
+ body: notificationContent.body,
310
+ data: remoteMessage.data ?? {},
311
+ android: {
312
+ channelId,
313
+ pressAction: {
314
+ id: 'default'
315
+ },
316
+ actions: this.createNotificationActions(clixPayload)
317
+ },
318
+ ios: {
319
+ foregroundPresentationOptions: {
320
+ badge: true,
321
+ sound: true,
322
+ banner: true,
323
+ list: true
324
+ }
325
+ }
326
+ };
327
+ if (notificationContent.imageUrl) {
328
+ if (this.isValidImageUrl(notificationContent.imageUrl)) {
329
+ ClixLogger.debug('Adding image attachment to notification:', notificationContent.imageUrl);
330
+ if (Platform.OS === 'ios') {
331
+ try {
332
+ config.ios.attachments = [{
333
+ url: notificationContent.imageUrl
334
+ }];
335
+ } catch (error) {
336
+ ClixLogger.warn('Failed to download image attachment:', error);
337
+ }
338
+ } else {
339
+ config.android.style = {
340
+ type: AndroidStyle.BIGPICTURE,
341
+ picture: notificationContent.imageUrl
342
+ };
343
+ }
344
+ } else {
345
+ ClixLogger.warn('Skipping attachment due to invalid URL:', notificationContent.imageUrl);
346
+ }
347
+ }
348
+ return config;
349
+ }
350
+ createNotificationActions(clixPayload) {
351
+ const actions = [];
352
+ actions.push({
353
+ title: 'Open',
354
+ pressAction: {
355
+ id: 'default'
356
+ }
357
+ });
358
+ if (clixPayload.customProperties?.actions) {
359
+ const customActions = clixPayload.customProperties.actions;
360
+ if (Array.isArray(customActions)) {
361
+ customActions.forEach(action => {
362
+ if (action.title && action.actionId) {
363
+ actions.push({
364
+ title: action.title,
365
+ pressAction: {
366
+ id: action.actionId
367
+ }
368
+ });
369
+ }
370
+ });
371
+ }
372
+ }
373
+ return actions;
374
+ }
375
+ isValidImageUrl(url) {
376
+ return url.trim() !== '' && url.startsWith('http');
377
+ }
378
+ extractNotificationContent(fcmNotification, clixPayload) {
379
+ ClixLogger.debug('Extracting notification content from payload:', {
380
+ fcmTitle: fcmNotification?.title,
381
+ fcmBody: fcmNotification?.body,
382
+ customProperties: clixPayload.customProperties,
383
+ messageId: clixPayload.messageId,
384
+ imageUrl: clixPayload.imageUrl
385
+ });
386
+ const title = fcmNotification?.title || clixPayload.customProperties?.title || 'New Message';
387
+ const body = fcmNotification?.body || clixPayload.customProperties?.body || '';
388
+ ClixLogger.debug('Extracted notification content:', {
389
+ title,
390
+ body
391
+ });
392
+
393
+ // Validate imageUrl before using it
394
+ let imageUrl;
395
+ if (clixPayload.imageUrl) {
396
+ ClixLogger.debug('Processing image URL:', clixPayload.imageUrl);
397
+ if (this.isValidImageUrl(clixPayload.imageUrl)) {
398
+ imageUrl = clixPayload.imageUrl;
399
+ ClixLogger.debug('Image URL validated successfully');
400
+ } else {
401
+ ClixLogger.warn('Invalid image URL, skipping:', clixPayload.imageUrl);
402
+ }
403
+ }
404
+ return {
405
+ title,
406
+ body,
407
+ imageUrl
408
+ };
409
+ }
410
+ async handlePushReceived(data) {
411
+ try {
412
+ const clixPayload = this.parseClixPayload(data);
413
+ if (clixPayload) {
414
+ await this.trackPushEvent('PUSH_NOTIFICATION_RECEIVED', clixPayload);
415
+ }
416
+ ClixLogger.debug('Push notification received and processed');
417
+ } catch (error) {
418
+ ClixLogger.error('Failed to handle push received', error);
419
+ }
420
+ }
421
+ async handlePushTapped(data) {
422
+ try {
423
+ const clixPayload = this.parseClixPayload(data);
424
+ if (clixPayload) {
425
+ await this.trackPushEvent('PUSH_NOTIFICATION_TAPPED', clixPayload);
426
+ }
427
+ await this.handleUrlNavigation(data);
428
+ ClixLogger.debug('Push notification tapped and processed');
429
+ } catch (error) {
430
+ ClixLogger.error('Failed to handle push tapped', error);
431
+ }
432
+ }
433
+ async handleNotificationTap(data) {
434
+ try {
435
+ await this.handlePushTapped(data);
436
+ } catch (error) {
437
+ ClixLogger.error('Failed to handle notification tap', error);
438
+ }
439
+ }
440
+ async handleUrlNavigation(data) {
441
+ try {
442
+ let url;
443
+ const clixPayload = this.parseClixPayload(data);
444
+ if (clixPayload) {
445
+ url = clixPayload.landingUrl;
446
+ }
447
+ url = url || data.landing_url || data.url || data.link || data.click_action;
448
+ if (url) {
449
+ ClixLogger.debug('Opening URL from notification:', url);
450
+ try {
451
+ const supported = await Linking.canOpenURL(url);
452
+ ClixLogger.debug('Can open URL:', supported);
453
+ if (supported) {
454
+ await Linking.openURL(url);
455
+ ClixLogger.debug('URL opened successfully:', url);
456
+ } else {
457
+ ClixLogger.warn('Cannot open URL:', url);
458
+ await Linking.openURL(url);
459
+ }
460
+ } catch (error) {
461
+ ClixLogger.error('Error opening URL:', error);
462
+ }
463
+ }
464
+ } catch (error) {
465
+ ClixLogger.error('Failed to handle URL navigation', error);
466
+ }
467
+ }
468
+ parseClixPayload(userInfo) {
469
+ try {
470
+ let payload = userInfo;
471
+ if (userInfo.clix) {
472
+ if (typeof userInfo.clix === 'object') {
473
+ payload = userInfo.clix;
474
+ } else if (typeof userInfo.clix === 'string') {
475
+ payload = JSON.parse(userInfo.clix);
476
+ }
477
+ }
478
+ const toCamel = s => s.replace(/_([a-z])/g, g => (g[1] ?? '').toUpperCase());
479
+ const result = {};
480
+ if (!payload) return null;
481
+ for (const key in payload) {
482
+ result[toCamel(key)] = payload[key];
483
+ }
484
+ ClixLogger.debug('Parsed Clix payload result:', result);
485
+ if (!result.messageId) return null;
486
+
487
+ // Extract title and body into customProperties if they exist
488
+ const customProperties = {};
489
+ if (result.title) customProperties.title = result.title;
490
+ if (result.body) customProperties.body = result.body;
491
+ const finalResult = {
492
+ ...result,
493
+ customProperties: Object.keys(customProperties).length > 0 ? customProperties : undefined
494
+ };
495
+ ClixLogger.debug('Final Clix payload result:', finalResult);
496
+ return new ClixPushNotificationPayload(finalResult);
497
+ } catch (error) {
498
+ ClixLogger.error('Failed to parse Clix payload', error);
499
+ return null;
500
+ }
501
+ }
502
+ async trackPushEvent(eventType, clixPayload) {
503
+ const properties = this.extractTrackingProperties(clixPayload);
504
+ const messageId = clixPayload.messageId;
505
+ await this.eventService.trackEvent(eventType, properties, messageId);
506
+ ClixLogger.debug(`${eventType} tracked:`, messageId);
507
+ }
508
+ extractTrackingProperties(clixPayload) {
509
+ const properties = {};
510
+ if (clixPayload.messageId) properties.messageId = clixPayload.messageId;
511
+ if (clixPayload.campaignId) properties.campaignId = clixPayload.campaignId;
512
+ if (clixPayload.trackingId) properties.trackingId = clixPayload.trackingId;
513
+ return properties;
514
+ }
515
+ async trackEventInBackground(clixPayload) {
516
+ const messageId = clixPayload.messageId;
517
+ if (!messageId) {
518
+ ClixLogger.warn('No messageId found in payload, skipping event tracking');
519
+ return;
520
+ }
521
+ try {
522
+ const storageService = new StorageService();
523
+ const configData = await storageService.get('clix_config');
524
+ if (!configData) {
525
+ ClixLogger.error('No Clix config found in storage');
526
+ return;
527
+ }
528
+ let deviceId = await storageService.get('clix_device_id');
529
+ if (!deviceId) {
530
+ ClixLogger.warn('No device ID found in storage, generating new device ID');
531
+ deviceId = UUID.generate();
532
+ await storageService.set('clix_device_id', deviceId);
533
+ }
534
+ const config = configData;
535
+ const apiClient = new ClixAPIClient(config);
536
+ const deviceAPIService = new DeviceAPIService(apiClient);
537
+ const eventAPIService = new EventAPIService(apiClient);
538
+ const tokenService = new TokenService(storageService);
539
+ const deviceService = new DeviceService(storageService, tokenService, deviceAPIService);
540
+ const eventService = new EventService(eventAPIService, deviceService);
541
+ const properties = this.extractTrackingProperties(clixPayload);
542
+ await eventService.trackEvent('PUSH_NOTIFICATION_RECEIVED', properties, messageId);
543
+ ClixLogger.debug('PUSH_NOTIFICATION_RECEIVED event tracked in background');
544
+ } catch (error) {
545
+ ClixLogger.error('Error tracking event in background', error);
546
+ }
547
+ }
548
+ }
549
+ //# sourceMappingURL=NotificationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["notifee","AndroidImportance","AndroidStyle","EventType","messaging","Linking","Platform","ClixPushNotificationPayload","ClixLogger","UUID","ClixAPIClient","DeviceAPIService","DeviceService","EventAPIService","EventService","StorageService","TokenService","NotificationService","instance","DEFAULT_CHANNEL","id","name","description","importance","HIGH","sound","vibration","lights","messagingService","isInitialized","currentPushToken","processedMessageIds","Set","constructor","getInstance","resetInstance","cleanup","initialize","eventService","storageService","deviceService","tokenService","debug","initializeNotificationDisplayService","initializeMessageService","error","getCurrentToken","getOrFetchToken","unsubscribeForegroundMessage","unsubscribeNotificationOpened","unsubscribeTokenRefresh","unsubscribeNotificationEvents","clear","requestPermission","alert","badge","criticalAlert","announcement","carPlay","provisional","OS","createNotificationChannels","setupNotificationEventListeners","createChannel","onForegroundEvent","event","handleNotificationEvent","type","detail","PRESS","notification","data","handleNotificationTap","ACTION_PRESS","pressAction","handleActionPress","DISMISSED","actionId","setupMessageHandlers","settings","requestMessagePermission","AuthorizationStatus","DENIED","getAndUpdateToken","setupTokenRefreshListener","warn","setBackgroundMessageHandler","remoteMessage","handleBackgroundMessage","onMessage","handleForegroundMessage","onNotificationOpenedApp","checkInitialNotification","clixPayload","parseClixPayload","set","messageId","timestamp","Date","now","clixMessageId","campaignId","trackingId","trackEventInBackground","displayNotification","has","add","handlePushReceived","toString","onTokenRefresh","token","saveAndRegisterToken","initialNotification","getInitialNotification","registerTokenWithServer","savedToken","getToken","substring","saveToken","upsertToken","notificationContent","extractNotificationContent","title","body","hasImage","imageUrl","notificationConfig","createNotificationConfig","Error","message","stack","channelId","config","android","actions","createNotificationActions","ios","foregroundPresentationOptions","banner","list","isValidImageUrl","attachments","url","style","BIGPICTURE","picture","push","customProperties","customActions","Array","isArray","forEach","action","trim","startsWith","fcmNotification","fcmTitle","fcmBody","trackPushEvent","handlePushTapped","handleUrlNavigation","landingUrl","landing_url","link","click_action","supported","canOpenURL","openURL","userInfo","payload","clix","JSON","parse","toCamel","s","replace","g","toUpperCase","result","key","finalResult","Object","keys","length","undefined","eventType","properties","extractTrackingProperties","trackEvent","configData","get","deviceId","generate","apiClient","deviceAPIService","eventAPIService"],"sourceRoot":"../../../src","sources":["services/NotificationService.ts"],"mappings":"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","ignoreList":[]}