reactnative-plugin-appice 1.7.30 → 1.7.31

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.
@@ -12,7 +12,6 @@ import semusi.util.constants.CampaignConstants;
12
12
  public enum EnumConstants {
13
13
 
14
14
 
15
- // TODO: 02/01/24 once iOS will ready to rename it we will rename the key, because right now key and value are same.
16
15
  //=========================
17
16
  //USER-PROFILE
18
17
  //=========================
@@ -101,178 +100,176 @@ public enum EnumConstants {
101
100
  return constants;
102
101
  }
103
102
 
104
- // TODO: 29/12/23 {
105
- // replace static value with sdk value
106
- // }
103
+
107
104
  public String getValue(){
108
- switch (constants){
109
- case "APPICE_USER_NAME":{
105
+ switch (this){
106
+ case APPICE_USER_NAME:{
110
107
  return UserInfoConstants.NAME;
111
108
  }
112
109
 
113
- case "APPICE_USER_PHONE":{
110
+ case APPICE_USER_PHONE:{
114
111
  return UserInfoConstants.PHONE;
115
112
  }
116
113
 
117
- case "APPICE_USER_EMAIL":{
114
+ case APPICE_USER_EMAIL:{
118
115
  return UserInfoConstants.EMAIL;
119
116
  }
120
117
 
121
- case "APPICE_DATE_OF_BIRTH":{
118
+ case APPICE_DATE_OF_BIRTH:{
122
119
  return UserInfoConstants.DATE_OF_BIRTH;
123
120
  }
124
121
 
125
- case "APPICE_USER_AGE":{
122
+ case APPICE_USER_AGE:{
126
123
  return UserInfoConstants.AGE;
127
124
  }
128
125
 
129
- case "APPICE_USER_EDUCATION_TYPE":{
126
+ case APPICE_USER_EDUCATION_TYPE:{
130
127
  return UserInfoConstants.EDUCATION_TYPE;
131
128
  }
132
129
 
133
130
 
134
- case "APPICE_USER_GENDER":{
131
+ case APPICE_USER_GENDER:{
135
132
  return UserInfoConstants.GENDER;
136
133
  }
137
134
 
138
- case "APPICE_USER_IS_EMPLOYED":{
135
+ case APPICE_USER_IS_EMPLOYED:{
139
136
  return UserInfoConstants.EMPLOYEE_STATUS;
140
137
  }
141
138
 
142
- case "APPICE_USER_EMPLOYMENT_TYPE":{
139
+ case APPICE_USER_EMPLOYMENT_TYPE:{
143
140
  return UserInfoConstants.EMPLOYMENT_TYPE;
144
141
  }
145
142
 
146
- case "APPICE_USER_MARRIED":{
143
+ case APPICE_USER_MARRIED:{
147
144
  return UserInfoConstants.RELATIONSHIP_STATUS;
148
145
  }
149
146
 
150
- case "APPICE_PUSH_NOTIFICATION_CLICKED":{
147
+ case APPICE_PUSH_NOTIFICATION_CLICKED:{
151
148
  return StringConstants.APPICE_PUSH_NOTIFICATION_CLICKED;
152
149
  }
153
150
 
154
- case "APPICE_INAPP_NOTIFICATION_CLICKED":{
151
+ case APPICE_INAPP_NOTIFICATION_CLICKED:{
155
152
  return StringConstants.APPICE_INAPP_NOTIFICATION_CLICKED;
156
153
  }
157
154
 
158
- case "INBOX_MESSAGE":{
155
+ case INBOX_MESSAGE:{
159
156
  return StringConstants.INBOX_MESSAGE;
160
157
  }
161
158
 
162
- case "INBOX_TITLE":{
159
+ case INBOX_TITLE:{
163
160
  return StringConstants.INBOX_TITLE;
164
161
  }
165
162
 
166
- case "INBOX_MESSAGE_STATUS":{
163
+ case INBOX_MESSAGE_STATUS:{
167
164
  return StringConstants.INBOX_MESSAGE_STATUS;
168
165
  }
169
166
 
170
- case "INBOX_CAMPAIGN_TYPE":{
167
+ case INBOX_CAMPAIGN_TYPE:{
171
168
  return StringConstants.INBOX_CAMPAIGN_TYPE;
172
169
  }
173
170
 
174
- case "INBOX_MESSAGE_LANGUAGE":{
171
+ case INBOX_MESSAGE_LANGUAGE:{
175
172
  return StringConstants.INBOX_MESSAGE_LANGUAGE;
176
173
  }
177
174
 
178
- case "INBOX_MESSAGE_ID":{
175
+ case INBOX_MESSAGE_ID:{
179
176
  return StringConstants.INBOX_MESSAGE_ID;
180
177
  }
181
178
 
182
- case "INBOX_CAMPAIGN_ID":{
179
+ case INBOX_CAMPAIGN_ID:{
183
180
  return StringConstants.INBOX_CAMPAIGN_ID;
184
181
  }
185
182
 
186
- case "INBOX_MESSAGE_CATEGORY":{
183
+ case INBOX_MESSAGE_CATEGORY:{
187
184
  return StringConstants.INBOX_MESSAGE_CATEGORY;
188
185
  }
189
186
 
190
- case "INBOX_MESSAGE_ICON":{
187
+ case INBOX_MESSAGE_ICON:{
191
188
  return StringConstants.INBOX_MESSAGE_ICON;
192
189
  }
193
190
 
194
- case "INBOX_CUSTOM_DATA":{
191
+ case INBOX_CUSTOM_DATA:{
195
192
  return StringConstants.INBOX_CUSTOM_DATA;
196
193
  }
197
194
 
198
- case "FIRST_SEEN":{
195
+ case FIRST_SEEN:{
199
196
  return StringConstants.FIRST_SEEN;
200
197
  }
201
198
 
202
- case "LAST_SEEN":{
199
+ case LAST_SEEN:{
203
200
  return StringConstants.LAST_SEEN;
204
201
  }
205
202
 
206
- case "TOP_N_PRODUCTS_VIEWED":{
203
+ case TOP_N_PRODUCTS_VIEWED:{
207
204
  return CustomUserPropertyConstants.TOP_N_PRODUCTS_VIEWED;
208
205
  }
209
206
 
210
- case "N_COMPLAINTS_RAISED":{
207
+ case N_COMPLAINTS_RAISED:{
211
208
  return CustomUserPropertyConstants.N_COMPLAINTS_RAISED;
212
209
  }
213
210
 
214
- case "PREF_LOGIN_DEVICE":{
211
+ case PREF_LOGIN_DEVICE:{
215
212
  return CustomUserPropertyConstants.PREF_LOGIN_DEVICE;
216
213
  }
217
214
 
218
- case "REFERRAL_CAMPAIGN":{
215
+ case REFERRAL_CAMPAIGN:{
219
216
  return CustomUserPropertyConstants.REFERRAL_CAMPAIGN;
220
217
  }
221
218
 
222
- case "DEMOGRAPHIC_INFO":{
219
+ case DEMOGRAPHIC_INFO:{
223
220
  return UserInfoConstants.DEMOGRAPHIC_INFO;
224
221
  }
225
222
 
226
- case "TOTAL_ORDER_VALUE":{
223
+ case TOTAL_ORDER_VALUE:{
227
224
  return Ecommerce.TOTAL_ORDER_VALUE;
228
225
  }
229
226
 
230
- case "ADD_TO_CART_N_DAYS":{
227
+ case ADD_TO_CART_N_DAYS:{
231
228
  return Ecommerce.ADD_TO_CART_N_DAYS;
232
229
  }
233
230
 
234
- case "FINANCIAL_SERVICES":{
231
+ case FINANCIAL_SERVICES:{
235
232
  return FinancialServices.FINANCIAL_SERVICES;
236
233
  }
237
234
 
238
- case "CREDIT_SCORE":{
235
+ case CREDIT_SCORE:{
239
236
  return FinancialServices.CREDIT_SCORE;
240
237
  }
241
238
 
242
- case "DEBT_TO_INCOME_RATIO":{
239
+ case DEBT_TO_INCOME_RATIO:{
243
240
  return FinancialServices.DEBT_TO_INCOME_RATIO;
244
241
  }
245
242
 
246
- case "SAVINGS_BALANCE":{
243
+ case SAVINGS_BALANCE:{
247
244
  return FinancialServices.SAVINGS_BALANCE;
248
245
  }
249
246
 
250
- case "CHECKING_BALANCE":{
247
+ case CHECKING_BALANCE:{
251
248
  return FinancialServices.CHECKING_BALANCE;
252
249
  }
253
250
 
254
- case "AVERAGE_TRANSACTION_AMOUNT":{
251
+ case AVERAGE_TRANSACTION_AMOUNT:{
255
252
  return FinancialServices.AVERAGE_TRANSACTION_AMOUNT;
256
253
  }
257
254
 
258
- case "FREQUENCY_OF_TRANSACTION":{
255
+ case FREQUENCY_OF_TRANSACTION:{
259
256
  return FinancialServices.FREQUENCY_OF_TRANSACTION;
260
257
  }
261
258
 
262
- case "TYPE_OF_TRANSACTION":{
259
+ case TYPE_OF_TRANSACTION:{
263
260
  return FinancialServices.TYPE_OF_TRANSACTION;
264
261
  }
265
262
 
266
- case "CAMP_ID":{
263
+ case CAMP_ID:{
267
264
  return CampaignConstants.CAMP_ID;
268
265
  }
269
- case "ACTION_URL":{
266
+ case ACTION_URL:{
270
267
  return CampaignConstants.ACTION_URL;
271
268
  }
272
- case "ACTION_TYPE":{
269
+ case ACTION_TYPE:{
273
270
  return CampaignConstants.ACTION_TYPE;
274
271
  }
275
- case "CUSTOMDATA":{
272
+ case CUSTOMDATA:{
276
273
  return CUSTOM_DATA;
277
274
  }
278
275
  default:
package/campaign.js CHANGED
@@ -1,26 +1,113 @@
1
1
 
2
- export default class Campaign {
3
- constructor(campId, actionUrl, actionType, customData) {
4
- this._campId = campId;
5
- this._actionUrl = actionUrl;
6
- this._actionType = actionType;
7
- this._customData = customData;
2
+ import { Linking, Platform } from 'react-native';
3
+
4
+ const handleClickOnPush = async (campaign) => {
5
+ const url = campaign.actionUrl;
6
+ const actionType = campaign.actionType;
7
+
8
+ if (!url || typeof url !== 'string') {
9
+ console.log('Error: URL is not provided.');
10
+ return;
11
+ }
12
+
13
+ const httpUrls = url.startsWith('http://') || url.startsWith('https://');
14
+
15
+ if (httpUrls) {
16
+ try {
17
+ if (Platform.OS === 'ios') {
18
+ const supported = await Linking.canOpenURL(url);
19
+ if (!supported) {
20
+ console.log('URL not supported on iOS:', url);
21
+ return;
22
+ }
23
+ }
24
+
25
+ await Linking.openURL(url);
26
+ console.log(`Successfully opened URL: ${url}`);
27
+ } catch (error) {
28
+ console.log('Error while opening URL:', error?.message || error);
29
+ }
30
+ }
31
+
32
+ if (actionType === 'dl' && !httpUrls) {
33
+ // handle custom deeplink
34
+ }
35
+ };
36
+
37
+ class Campaign {
38
+ constructor(eventData) {
39
+ let data = eventData;
40
+ try {
41
+ if (typeof eventData === 'string') {
42
+ data = JSON.parse(eventData);
43
+ }
44
+ } catch (e) {
45
+ // if parse fails, keep eventData as-is (object expected)
46
+ data = eventData || {};
47
+ }
48
+
49
+ const isIOS = Platform.OS === 'ios';
50
+
51
+ if (isIOS) {
52
+ this.campId = data.campId || '';
53
+ } else {
54
+ this.campId = data.camp_id || '';
55
+ }
56
+
57
+ this.actionType = data.et || '';
58
+ this.actionUrl = data.eurl || '';
59
+ this.actionContent = data.actionContent || '';
60
+ this.title = data.nh || '';
61
+ this.description = data.nd || '';
62
+ this.campType = data.t || '';
63
+ this.selectedIndex = data.selectedIndex || 0;
64
+ this.language = data.language || data.lang || '';
65
+ this.replyText = data.replyText || '';
66
+ this.customData = data.customData || data.cdata || {};
67
+
68
+ const selected = data.selectedAction || {};
69
+ this.selectedAction = selected;
70
+
71
+ this.actions = Array.isArray(data.actions)
72
+ ? data.actions.map((action) => {
73
+ return {
74
+ actionTitle: action.actionTitle || action.abt || '',
75
+ actionType: action.actionType || action.act || '',
76
+ actionContent: action.actionContent || action.acc || '',
77
+ actionUrl: action.actionUrl || action.acu || ''
78
+ };
79
+ })
80
+ : [];
81
+
82
+ if (isIOS) {
83
+ this.selectedActionTitle = selected.actionTitle || '';
84
+ this.selectedActionType = selected.actionType || '';
85
+ this.actionContent = selected.actionContent || '';
86
+ this.selectedActionUrl = selected.actionUrl || '';
87
+ } else {
88
+ this.selectedActionTitle = selected.abt || '';
89
+ this.selectedActionType = selected.act || '';
90
+ this.actionContent = selected.acc || '';
91
+ this.selectedActionUrl = selected.acu || '';
92
+ }
8
93
  }
9
94
 
10
95
  // Getter methods for campaign properties
11
96
  getCampaignId() {
12
- return this._campId;
97
+ return this.campId;
13
98
  }
14
99
 
15
100
  getActionUrl() {
16
- return this._actionUrl;
101
+ return this.actionUrl;
17
102
  }
18
103
 
19
104
  getActionType() {
20
- return this._actionType;
105
+ return this.actionType;
21
106
  }
22
107
 
23
108
  getCustomData() {
24
- return this._customData;
109
+ return this.customData;
25
110
  }
26
- }
111
+ }
112
+
113
+ export { Campaign, handleClickOnPush };
package/example/App.js CHANGED
@@ -20,6 +20,7 @@ import { Alert,
20
20
  import { getInboxMessages, getMessageCounts, setUser, updatedInboxMessage } from './ancilliary';
21
21
  import { handleUrl,receiveDeepLink } from './offerIdhandler';
22
22
  const AppICE = require('reactnative-plugin-appice');
23
+ const { Campaign, handleClickOnPush } = require('reactnative-plugin-appice/campaign');
23
24
  const HelloWorldApp = () => {
24
25
 
25
26
 
@@ -30,14 +31,14 @@ const HelloWorldApp = () => {
30
31
  AppICE.preInitialise();
31
32
  console.log('preInitialize completed');
32
33
 
33
- AppICE.startContext( //keys here
34
- "",
34
+ AppICE.startContext( //keys here
35
+ "",
35
36
  "",
36
37
  "",
37
38
  "",
38
39
  "",
39
40
  "",
40
- certs
41
+ certs
41
42
  );
42
43
 
43
44
  addAppICEAPIListeners();
@@ -88,19 +89,23 @@ const HelloWorldApp = () => {
88
89
 
89
90
 
90
91
  function addAppICEAPIListeners() {
91
- AppICE.addListener(
92
- AppICE.AppICEPushNotificationClicked,
93
- (event: {AppICEPushNotificationClicked: any}) => {
94
- if (typeof event !== 'undefined') {
95
- console.log(
96
- 'handleAppICETapEvent',
97
- AppICE.AppICEPushNotificationClicked,
98
- event.AppICEPushNotificationClicked,
99
- );
100
- AppICE.pushNotificationClicked(event.AppICEPushNotificationClicked);
101
- }
102
- },
103
- );
92
+ AppICE.addListener(
93
+ AppICE.AppICEPushNotificationClicked,
94
+ async (event) => {
95
+ if (!event || !event.AppICEPushNotificationClicked) {
96
+ return;
97
+ }
98
+
99
+ try {
100
+ const campaign = new Campaign(event.AppICEPushNotificationClicked);
101
+ await handleClickOnPush(campaign);
102
+ } catch (error) {
103
+ console.error('Error handling app link:', error);
104
+ }
105
+
106
+ AppICE.pushNotificationClicked(event.AppICEPushNotificationClicked);
107
+ },
108
+ );
104
109
 
105
110
  AppICE.addListener(
106
111
  AppICE.AppICEInAppClicked,
File without changes
File without changes
@@ -276,6 +276,10 @@ dependencies {
276
276
  exclude group:'com.facebook.flipper'
277
277
  }
278
278
 
279
+ implementation "appice.io.android:sdk:2.6.26-release"
280
+
281
+ implementation "com.google.android.gms:play-services-cloud-messaging:17.0.2"
282
+
279
283
  if (enableHermes) {
280
284
  //noinspection GradleDynamicVersion
281
285
  implementation("com.facebook.react:hermes-engine:+") { // From node_modules
@@ -23,6 +23,15 @@
23
23
  </intent-filter>
24
24
  </activity>
25
25
 
26
+ <receiver
27
+ android:name="semusi.ruleengine.pushmanager.AppICEMessageHandler"
28
+ android:exported="true"
29
+ android:permission="com.google.android.c2dm.permission.SEND" >
30
+ <intent-filter>
31
+ <action android:name="com.google.android.c2dm.intent.RECEIVE" />
32
+ </intent-filter>
33
+ </receiver>
34
+
26
35
  <service
27
36
  android:name="semusi.ruleengine.pushmanager.SdkFcmListenerService"
28
37
  android:protectionLevel="signature"
@@ -3,6 +3,9 @@ package com.example;
3
3
  import com.facebook.react.ReactActivity;
4
4
  import com.facebook.react.ReactActivityDelegate;
5
5
  import com.facebook.react.ReactRootView;
6
+ import semusi.activitysdk.ContextSdk
7
+ import semusi.context.utility.PushClickData
8
+ import semusi.context.utility.Utility
6
9
 
7
10
  public class MainActivity extends ReactActivity {
8
11
 
@@ -45,4 +48,13 @@ public class MainActivity extends ReactActivity {
45
48
  return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
46
49
  }
47
50
  }
51
+ override fun onResume() {
52
+ super.onResume()
53
+ AppICEUtils.handleAppICEPayload(intent, getApplicationContext());
54
+ }
55
+
56
+ override fun onNewIntent(intent: Intent) {
57
+ super.onNewIntent(intent)
58
+ AppICEUtils.handleAppICEPayload(intent, getApplicationContext())
59
+ }
48
60
  }