@survicate/react-native-survicate 4.0.2 → 4.1.0

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
@@ -60,6 +60,13 @@ const numberTrait = new UserTrait('age', 25);
60
60
  const booleanTrait = new UserTrait('isPremium', true);
61
61
  const dateTrait = new UserTrait('lastLogin', new Date());
62
62
  const timeIntervalTrait = new UserTrait('timeOfPurchase', new Date());
63
+ const listener: SurvicateEventListener = {
64
+ onSurveyDisplayed(event: SurveyDisplayedEvent) {},
65
+ onQuestionAnswered(event: QuestionAnsweredEvent) {},
66
+ onSurveyClosed(event: SurveyClosedEvent) {},
67
+ onSurveyCompleted(event: SurveyCompletedEvent) {},
68
+ }
69
+ Survicate.addSurvicateEventListener(listener);
63
70
  Survicate.reset();
64
71
  ```
65
72
 
@@ -12,10 +12,14 @@ public class SurvicateModuleImpl extends SurvicateModule {
12
12
  public static final String NAME = "SurvicateBindings";
13
13
 
14
14
  private final ReactApplicationContext reactContext;
15
+ private final SurvicateRNEventListener eventListener;
16
+
17
+ private int listenerCount = 0;
15
18
 
16
19
  public SurvicateModuleImpl(ReactApplicationContext reactContext) {
17
20
  super(reactContext);
18
21
  this.reactContext = reactContext;
22
+ this.eventListener = new SurvicateRNEventListener(reactContext);
19
23
  }
20
24
 
21
25
  @Override
@@ -67,4 +71,27 @@ public class SurvicateModuleImpl extends SurvicateModule {
67
71
  public void setWorkspaceKey(String workspaceKey) {
68
72
  Survicate.setWorkspaceKey(workspaceKey);
69
73
  }
74
+
75
+ @ReactMethod
76
+ public void addListener(String eventName) {
77
+ if (listenerCount == 0) {
78
+ Survicate.setEventListener(eventListener);
79
+ }
80
+
81
+ listenerCount++;
82
+ }
83
+
84
+ @ReactMethod
85
+ public void removeListeners(int count) {
86
+ listenerCount -= count;
87
+
88
+ if (listenerCount == 0) {
89
+ Survicate.setEventListener(null);
90
+ }
91
+ }
92
+
93
+ @ReactMethod
94
+ public void removeListeners(double count) {
95
+ removeListeners((int) count);
96
+ }
70
97
  }
@@ -0,0 +1,108 @@
1
+ package com.survicate.react;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.Arguments;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
7
+ import com.facebook.react.bridge.ReactContext;
8
+ import com.facebook.react.bridge.WritableMap;
9
+ import com.facebook.react.bridge.WritableArray;
10
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
11
+ import com.survicate.surveys.SurvicateAnswer;
12
+ import com.survicate.surveys.SurvicateEventListener;
13
+ import com.survicate.surveys.SurveyDisplayedEvent;
14
+ import com.survicate.surveys.QuestionAnsweredEvent;
15
+ import com.survicate.surveys.SurveyClosedEvent;
16
+ import com.survicate.surveys.SurveyCompletedEvent;
17
+
18
+ import javax.annotation.Nullable;
19
+
20
+ class SurvicateRNEventListener extends SurvicateEventListener {
21
+
22
+ private static final String SURVEY_ID = "surveyId";
23
+ private static final String SURVEY_NAME = "surveyName";
24
+ private static final String RESPONSE_UUID = "responseUuid";
25
+ private static final String VISITOR_UUID = "visitorUuid";
26
+ private static final String QUESTION_ID = "questionId";
27
+ private static final String QUESTION = "question";
28
+ private static final String ANSWER_TYPE = "answerType";
29
+ private static final String ANSWER_ID = "answerId";
30
+ private static final String ANSWER_IDS = "answerIds";
31
+ private static final String ANSWER_VALUE = "answerValue";
32
+ private static final String PANEL_ANSWER_URL = "panelAnswerUrl";
33
+
34
+ private ReactApplicationContext reactContext;
35
+
36
+ public SurvicateRNEventListener(ReactApplicationContext reactContext) {
37
+ this.reactContext = reactContext;
38
+ }
39
+
40
+ @Override
41
+ public void onSurveyDisplayed(@NonNull SurveyDisplayedEvent event) {
42
+ WritableMap params = Arguments.createMap();
43
+ params.putString(SURVEY_ID, event.getSurveyId());
44
+ sendEvent(reactContext, "onSurveyDisplayed", params);
45
+ }
46
+
47
+ @Override
48
+ public void onQuestionAnswered(@NonNull QuestionAnsweredEvent event) {
49
+ WritableMap params = Arguments.createMap();
50
+ params.putString(SURVEY_ID, event.getSurveyId());
51
+ params.putString(SURVEY_NAME, event.getSurveyName());
52
+ params.putString(RESPONSE_UUID, event.getResponseUuid());
53
+ params.putString(VISITOR_UUID, event.getVisitorUuid());
54
+ params.putString(PANEL_ANSWER_URL, event.getPanelAnswerUrl());
55
+ params.putDouble(QUESTION_ID, event.getQuestionId());
56
+ params.putString(QUESTION, event.getQuestionText());
57
+
58
+ if (event.getAnswer().getType() != null) {
59
+ params.putString(ANSWER_TYPE, event.getAnswer().getType());
60
+ } else {
61
+ params.putNull(ANSWER_TYPE);
62
+ }
63
+
64
+ if (event.getAnswer().getId() != null) {
65
+ params.putDouble(ANSWER_ID, event.getAnswer().getId());
66
+ } else {
67
+ params.putNull(ANSWER_ID);
68
+ }
69
+
70
+ if (event.getAnswer().getIds() != null) {
71
+ WritableArray ids = Arguments.createArray();
72
+ for (long id : event.getAnswer().getIds()) {
73
+ ids.pushDouble(id);
74
+ }
75
+ params.putArray(ANSWER_IDS, ids);
76
+ } else {
77
+ params.putArray(ANSWER_IDS, Arguments.createArray());
78
+ }
79
+
80
+ if (event.getAnswer().getValue() != null) {
81
+ params.putString(ANSWER_VALUE, event.getAnswer().getValue());
82
+ } else {
83
+ params.putNull(ANSWER_VALUE);
84
+ }
85
+
86
+ sendEvent(reactContext, "onQuestionAnswered", params);
87
+ }
88
+
89
+ @Override
90
+ public void onSurveyClosed(@NonNull SurveyClosedEvent event) {
91
+ WritableMap params = Arguments.createMap();
92
+ params.putString(SURVEY_ID, event.getSurveyId());
93
+ sendEvent(reactContext, "onSurveyClosed", params);
94
+ }
95
+
96
+ @Override
97
+ public void onSurveyCompleted(@NonNull SurveyCompletedEvent event) {
98
+ WritableMap params = Arguments.createMap();
99
+ params.putString(SURVEY_ID, event.getSurveyId());
100
+ sendEvent(reactContext, "onSurveyCompleted", params);
101
+ }
102
+
103
+ private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
104
+ reactContext
105
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
106
+ .emit(eventName, params);
107
+ }
108
+ }
@@ -1,11 +1,14 @@
1
+ #import <Survicate/Survicate-Swift.h>
2
+ #import <React/RCTEventEmitter.h>
3
+
1
4
  #ifdef RCT_NEW_ARCH_ENABLED
2
5
  #import "RNSurvicateSpec.h"
3
6
 
4
- @interface SurvicateBindings : NSObject <NativeSurvicateModuleSpec>
7
+ @interface SurvicateBindings : RCTEventEmitter<NativeSurvicateModuleSpec, SurvicateDelegate>
5
8
  #else
6
9
  #import <React/RCTBridgeModule.h>
7
10
 
8
- @interface SurvicateBindings : NSObject <RCTBridgeModule>
11
+ @interface SurvicateBindings : RCTEventEmitter<RCTBridgeModule, SurvicateDelegate>
9
12
  #endif
10
13
 
11
14
  @end
@@ -2,6 +2,9 @@
2
2
  #import <Survicate/Survicate-Swift.h>
3
3
 
4
4
  @implementation SurvicateBindings
5
+ {
6
+ bool hasListeners;
7
+ }
5
8
 
6
9
  - (dispatch_queue_t)methodQueue
7
10
  {
@@ -56,10 +59,58 @@ RCT_EXPORT_METHOD(setWorkspaceKey:(NSString *)workspaceKey)
56
59
  [[SurvicateSdk shared] setWorkspaceKey:workspaceKey error: &error];
57
60
  }
58
61
 
62
+
63
+ - (NSArray<NSString*> *)supportedEvents {
64
+ return @[@"onQuestionAnswered", @"onSurveyClosed", @"onSurveyCompleted", @"onSurveyDisplayed"];
65
+ }
66
+
67
+ - (void)startObserving {
68
+ hasListeners = YES;
69
+ [[SurvicateSdk shared] setDelegate:self];
70
+ }
71
+
72
+ - (void)stopObserving {
73
+ hasListeners = NO;
74
+ [[SurvicateSdk shared] setDelegate:nil];
75
+ }
76
+
77
+ - (void)surveyDisplayedWithEvent:(SurveyDisplayedEvent * _Nonnull)event {
78
+ if (!hasListeners) return;
79
+ [self sendEventWithName:@"onSurveyDisplayed" body:@{@"surveyId": event.surveyId}];
80
+ }
81
+
82
+ - (void)questionAnswered:(QuestionAnsweredEvent * _Nonnull)event {
83
+ if (!hasListeners) return;
84
+ [self sendEventWithName:@"onQuestionAnswered" body:
85
+ @{@"surveyId": event.surveyId,
86
+ @"surveyName": event.surveyName,
87
+ @"visitorUuid": event.visitorUUID,
88
+ @"responseUuid": event.responseUUID,
89
+ @"questionId": @(event.questionID),
90
+ @"question": event.question,
91
+ @"answerValue": event.answer.value ?: [NSNull null],
92
+ @"answerId": event.answer.id ?: [NSNull null],
93
+ @"answerType": event.answer.type ?: [NSNull null],
94
+ @"answerIds": event.answer.ids ?: @[],
95
+ @"panelAnswerUrl": event.panelAnswerUrl,
96
+ }
97
+ ];
98
+ }
99
+
100
+ - (void)surveyCompletedWithEvent:(SurveyCompletedEvent * _Nonnull)event {
101
+ if (!hasListeners) return;
102
+ [self sendEventWithName:@"onSurveyCompleted" body:@{@"surveyId": event.surveyId}];
103
+ }
104
+
105
+ - (void)surveyClosedWithEvent:(SurveyClosedEvent * _Nonnull)event {
106
+ if (!hasListeners) return;
107
+ [self sendEventWithName:@"onSurveyClosed" body:@{@"surveyId": event.surveyId}];
108
+ }
109
+
59
110
  // Don't compile this code when we build for the old architecture.
60
111
  #ifdef RCT_NEW_ARCH_ENABLED
61
112
  - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
62
- (const facebook::react::ObjCTurboModule::InitParams &)params
113
+ (const facebook::react::ObjCTurboModule::InitParams &)params
63
114
  {
64
115
  return std::make_shared<facebook::react::NativeSurvicateModuleSpecJSI>(params);
65
116
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.UserTrait = void 0;
6
+ exports.default = exports.UserTrait = exports.SurvicateIntegrations = void 0;
7
7
  var _reactNative = require("react-native");
8
8
  const {
9
9
  SurvicateBindings
@@ -12,7 +12,10 @@ const {
12
12
  // @ts-expect-error
13
13
  const isTurboModuleEnabled = global.__turboModuleProxy != null;
14
14
  const survicate = isTurboModuleEnabled ? require("./NativeSurvicateModule").default : SurvicateBindings;
15
+ class SurvicateIntegrations {}
16
+ exports.SurvicateIntegrations = SurvicateIntegrations;
15
17
  class Survicate {
18
+ static integrations = new SurvicateIntegrations();
16
19
  static initializeSdk() {
17
20
  survicate.initializeSdk();
18
21
  }
@@ -30,11 +33,11 @@ class Survicate {
30
33
  }
31
34
 
32
35
  /**
33
- * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
34
- */
36
+ * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
37
+ */
35
38
 
36
39
  static setUserTrait(traitNameOrUserTrait, traitValue) {
37
- if (typeof traitNameOrUserTrait === 'string' && traitValue !== undefined) {
40
+ if (typeof traitNameOrUserTrait === "string" && traitValue !== undefined) {
38
41
  survicate.setUserTrait(traitNameOrUserTrait, traitValue);
39
42
  } else if (traitNameOrUserTrait instanceof UserTrait) {
40
43
  survicate.setUserTrait(traitNameOrUserTrait.key, traitNameOrUserTrait.value);
@@ -43,11 +46,69 @@ class Survicate {
43
46
  static reset() {
44
47
  survicate.reset();
45
48
  }
49
+ static addSurvicateEventListener(listener) {
50
+ const eventEmitter = new _reactNative.NativeEventEmitter(survicate);
51
+ const onSurveyDisplayedCallback = nativeEvent => {
52
+ let event = {
53
+ surveyId: nativeEvent.surveyId
54
+ };
55
+ if (listener.onSurveyDisplayed !== undefined) {
56
+ listener.onSurveyDisplayed(event);
57
+ }
58
+ };
59
+ const onSurveyDisplayedListener = eventEmitter.addListener("onSurveyDisplayed", event => onSurveyDisplayedCallback(event));
60
+ const onQuestionAnsweredCallback = nativeEvent => {
61
+ let answer = {
62
+ type: nativeEvent.answerType,
63
+ id: nativeEvent.answerId,
64
+ ids: nativeEvent.answerIds,
65
+ value: nativeEvent.answerValue
66
+ };
67
+ let event = {
68
+ surveyId: nativeEvent.surveyId,
69
+ surveyName: nativeEvent.surveyName,
70
+ visitorUuid: nativeEvent.visitorUuid,
71
+ responseUuid: nativeEvent.responseUuid,
72
+ questionId: nativeEvent.questionId,
73
+ question: nativeEvent.question,
74
+ answer: answer,
75
+ panelAnswerUrl: nativeEvent.panelAnswerUrl
76
+ };
77
+ if (listener.onQuestionAnswered !== undefined) {
78
+ listener.onQuestionAnswered(event);
79
+ }
80
+ };
81
+ const onQuestionAnsweredListener = eventEmitter.addListener("onQuestionAnswered", onQuestionAnsweredCallback);
82
+ const onSurveyCompletedCallback = nativeEvent => {
83
+ let event = {
84
+ surveyId: nativeEvent.surveyId
85
+ };
86
+ if (listener.onSurveyCompleted !== undefined) {
87
+ listener.onSurveyCompleted(event);
88
+ }
89
+ };
90
+ const onSurveyCompletedListener = eventEmitter.addListener("onSurveyCompleted", onSurveyCompletedCallback);
91
+ const onSurveyClosedCallback = nativeEvent => {
92
+ let event = {
93
+ surveyId: nativeEvent.surveyId
94
+ };
95
+ if (listener.onSurveyClosed !== undefined) {
96
+ listener.onSurveyClosed(event);
97
+ }
98
+ };
99
+ const onSurveyClosedListener = eventEmitter.addListener("onSurveyClosed", onSurveyClosedCallback);
100
+ return () => {
101
+ onSurveyDisplayedListener.remove();
102
+ onQuestionAnsweredListener.remove();
103
+ onSurveyCompletedListener.remove();
104
+ onSurveyClosedListener.remove();
105
+ };
106
+ }
46
107
  }
47
108
  class UserTrait {
48
109
  constructor(key, value) {
49
110
  if (key === null || value === null) {
50
- throw new Error('Key and value cannot be null');
111
+ throw new Error("Key and value cannot be null");
51
112
  }
52
113
  this.key = key;
53
114
  if (value instanceof Date) {
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","SurvicateBindings","NativeModules","isTurboModuleEnabled","global","__turboModuleProxy","survicate","default","Survicate","initializeSdk","invokeEvent","eventName","enterScreen","screenName","leaveScreen","setUserId","userId","setUserTrait","traitNameOrUserTrait","traitValue","undefined","UserTrait","key","value","reset","constructor","Error","Date","formatDateToTimeZoneIso","toString","date","offset","getTimezoneOffset","offsetHours","Math","floor","abs","offsetMinutes","getTime","toISOString","slice","padStart","exports","_default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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"}
1
+ {"version":3,"names":["_reactNative","require","SurvicateBindings","NativeModules","isTurboModuleEnabled","global","__turboModuleProxy","survicate","default","SurvicateIntegrations","exports","Survicate","integrations","initializeSdk","invokeEvent","eventName","enterScreen","screenName","leaveScreen","setUserId","userId","setUserTrait","traitNameOrUserTrait","traitValue","undefined","UserTrait","key","value","reset","addSurvicateEventListener","listener","eventEmitter","NativeEventEmitter","onSurveyDisplayedCallback","nativeEvent","event","surveyId","onSurveyDisplayed","onSurveyDisplayedListener","addListener","onQuestionAnsweredCallback","answer","type","answerType","id","answerId","ids","answerIds","answerValue","surveyName","visitorUuid","responseUuid","questionId","question","panelAnswerUrl","onQuestionAnswered","onQuestionAnsweredListener","onSurveyCompletedCallback","onSurveyCompleted","onSurveyCompletedListener","onSurveyClosedCallback","onSurveyClosed","onSurveyClosedListener","remove","constructor","Error","Date","formatDateToTimeZoneIso","toString","date","offset","getTimezoneOffset","offsetHours","Math","floor","abs","offsetMinutes","getTime","toISOString","slice","padStart","_default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { NativeModules } from "react-native";
1
+ import { NativeModules, NativeEventEmitter } from "react-native";
2
2
  const {
3
3
  SurvicateBindings
4
4
  } = NativeModules;
@@ -6,7 +6,9 @@ const {
6
6
  // @ts-expect-error
7
7
  const isTurboModuleEnabled = global.__turboModuleProxy != null;
8
8
  const survicate = isTurboModuleEnabled ? require("./NativeSurvicateModule").default : SurvicateBindings;
9
+ export class SurvicateIntegrations {}
9
10
  class Survicate {
11
+ static integrations = new SurvicateIntegrations();
10
12
  static initializeSdk() {
11
13
  survicate.initializeSdk();
12
14
  }
@@ -24,11 +26,11 @@ class Survicate {
24
26
  }
25
27
 
26
28
  /**
27
- * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
28
- */
29
+ * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
30
+ */
29
31
 
30
32
  static setUserTrait(traitNameOrUserTrait, traitValue) {
31
- if (typeof traitNameOrUserTrait === 'string' && traitValue !== undefined) {
33
+ if (typeof traitNameOrUserTrait === "string" && traitValue !== undefined) {
32
34
  survicate.setUserTrait(traitNameOrUserTrait, traitValue);
33
35
  } else if (traitNameOrUserTrait instanceof UserTrait) {
34
36
  survicate.setUserTrait(traitNameOrUserTrait.key, traitNameOrUserTrait.value);
@@ -37,11 +39,69 @@ class Survicate {
37
39
  static reset() {
38
40
  survicate.reset();
39
41
  }
42
+ static addSurvicateEventListener(listener) {
43
+ const eventEmitter = new NativeEventEmitter(survicate);
44
+ const onSurveyDisplayedCallback = nativeEvent => {
45
+ let event = {
46
+ surveyId: nativeEvent.surveyId
47
+ };
48
+ if (listener.onSurveyDisplayed !== undefined) {
49
+ listener.onSurveyDisplayed(event);
50
+ }
51
+ };
52
+ const onSurveyDisplayedListener = eventEmitter.addListener("onSurveyDisplayed", event => onSurveyDisplayedCallback(event));
53
+ const onQuestionAnsweredCallback = nativeEvent => {
54
+ let answer = {
55
+ type: nativeEvent.answerType,
56
+ id: nativeEvent.answerId,
57
+ ids: nativeEvent.answerIds,
58
+ value: nativeEvent.answerValue
59
+ };
60
+ let event = {
61
+ surveyId: nativeEvent.surveyId,
62
+ surveyName: nativeEvent.surveyName,
63
+ visitorUuid: nativeEvent.visitorUuid,
64
+ responseUuid: nativeEvent.responseUuid,
65
+ questionId: nativeEvent.questionId,
66
+ question: nativeEvent.question,
67
+ answer: answer,
68
+ panelAnswerUrl: nativeEvent.panelAnswerUrl
69
+ };
70
+ if (listener.onQuestionAnswered !== undefined) {
71
+ listener.onQuestionAnswered(event);
72
+ }
73
+ };
74
+ const onQuestionAnsweredListener = eventEmitter.addListener("onQuestionAnswered", onQuestionAnsweredCallback);
75
+ const onSurveyCompletedCallback = nativeEvent => {
76
+ let event = {
77
+ surveyId: nativeEvent.surveyId
78
+ };
79
+ if (listener.onSurveyCompleted !== undefined) {
80
+ listener.onSurveyCompleted(event);
81
+ }
82
+ };
83
+ const onSurveyCompletedListener = eventEmitter.addListener("onSurveyCompleted", onSurveyCompletedCallback);
84
+ const onSurveyClosedCallback = nativeEvent => {
85
+ let event = {
86
+ surveyId: nativeEvent.surveyId
87
+ };
88
+ if (listener.onSurveyClosed !== undefined) {
89
+ listener.onSurveyClosed(event);
90
+ }
91
+ };
92
+ const onSurveyClosedListener = eventEmitter.addListener("onSurveyClosed", onSurveyClosedCallback);
93
+ return () => {
94
+ onSurveyDisplayedListener.remove();
95
+ onQuestionAnsweredListener.remove();
96
+ onSurveyCompletedListener.remove();
97
+ onSurveyClosedListener.remove();
98
+ };
99
+ }
40
100
  }
41
101
  export class UserTrait {
42
102
  constructor(key, value) {
43
103
  if (key === null || value === null) {
44
- throw new Error('Key and value cannot be null');
104
+ throw new Error("Key and value cannot be null");
45
105
  }
46
106
  this.key = key;
47
107
  if (value instanceof Date) {
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","SurvicateBindings","isTurboModuleEnabled","global","__turboModuleProxy","survicate","require","default","Survicate","initializeSdk","invokeEvent","eventName","enterScreen","screenName","leaveScreen","setUserId","userId","setUserTrait","traitNameOrUserTrait","traitValue","undefined","UserTrait","key","value","reset","constructor","Error","Date","formatDateToTimeZoneIso","toString","date","offset","getTimezoneOffset","offsetHours","Math","floor","abs","offsetMinutes","getTime","toISOString","slice","padStart"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA,SAASA,aAAa,QAAQ,cAAc;AAE5C,MAAM;EAAEC;AAAkB,CAAC,GAAGD,aAAa;;AAE3C;AACA,MAAME,oBAA6B,GAAGC,MAAM,CAACC,kBAAkB,IAAI,IAAI;AAEvE,MAAMC,SAAc,GAAGH,oBAAoB,GACvCI,OAAO,CAAC,yBAAyB,CAAC,CAACC,OAAO,GAC1CN,iBAAiB;AAErB,MAAMO,SAAS,CAAC;EACd,OAAOC,aAAaA,CAAA,EAAS;IAC3BJ,SAAS,CAACI,aAAa,CAAC,CAAC;EAC3B;EAEA,OAAOC,WAAWA,CAACC,SAAiB,EAAQ;IAC1CN,SAAS,CAACK,WAAW,CAACC,SAAS,CAAC;EAClC;EAEA,OAAOC,WAAWA,CAACC,UAAkB,EAAQ;IAC3CR,SAAS,CAACO,WAAW,CAACC,UAAU,CAAC;EACnC;EAEA,OAAOC,WAAWA,CAACD,UAAkB,EAAQ;IAC3CR,SAAS,CAACS,WAAW,CAACD,UAAU,CAAC;EACnC;EAEA,OAAOE,SAASA,CAACC,MAAc,EAAQ;IACrCX,SAAS,CAACU,SAAS,CAACC,MAAM,CAAC;EAC7B;;EAEA;AACF;AACA;;EAGE,OAAOC,YAAYA,CAACC,oBAAwC,EAAEC,UAAmB,EAAQ;IACvF,IAAI,OAAOD,oBAAoB,KAAK,QAAQ,IAAIC,UAAU,KAAKC,SAAS,EAAE;MACxEf,SAAS,CAACY,YAAY,CAACC,oBAAoB,EAAEC,UAAU,CAAC;IAC1D,CAAC,MAAM,IAAID,oBAAoB,YAAYG,SAAS,EAAE;MACpDhB,SAAS,CAACY,YAAY,CAACC,oBAAoB,CAACI,GAAG,EAAEJ,oBAAoB,CAACK,KAAK,CAAC;IAC9E;EACF;EAEA,OAAOC,KAAKA,CAAA,EAAS;IACnBnB,SAAS,CAACmB,KAAK,CAAC,CAAC;EACnB;AACF;AAEA,OAAO,MAAMH,SAAS,CAAC;EAIrBI,WAAWA,CAACH,GAAW,EAAEC,KAAuC,EAAE;IAChE,IAAID,GAAG,KAAK,IAAI,IAAIC,KAAK,KAAK,IAAI,EAAE;MAClC,MAAM,IAAIG,KAAK,CAAC,8BAA8B,CAAC;IACjD;IAEA,IAAI,CAACJ,GAAG,GAAGA,GAAG;IAEd,IAAIC,KAAK,YAAYI,IAAI,EAAE;MACzB,IAAI,CAACJ,KAAK,GAAG,IAAI,CAACK,uBAAuB,CAACL,KAAK,CAAC;IAClD,CAAC,MAAM;MACL,IAAI,CAACA,KAAK,GAAGA,KAAK,CAACM,QAAQ,CAAC,CAAC;IAC/B;EACF;EAEQD,uBAAuBA,CAACE,IAAU,EAAU;IAClD,MAAMC,MAAM,GAAGD,IAAI,CAACE,iBAAiB,CAAC,CAAC;IACvC,MAAMC,WAAW,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,GAAG,CAACL,MAAM,CAAC,GAAG,EAAE,CAAC;IACrD,MAAMM,aAAa,GAAGH,IAAI,CAACE,GAAG,CAACL,MAAM,CAAC,GAAG,EAAE;IAC3CD,IAAI,GAAG,IAAIH,IAAI,CAACG,IAAI,CAACQ,OAAO,CAAC,CAAC,GAAIP,MAAM,GAAG,EAAE,GAAG,IAAK,CAAC;IACtD,OAAOD,IAAI,CAACS,WAAW,CAAC,CAAC,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAIT,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAGE,WAAW,CAACJ,QAAQ,CAAC,CAAC,CAACY,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAGJ,aAAa,CAACR,QAAQ,CAAC,CAAC,CAACY,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAC/J;AACF;AAEA,eAAejC,SAAS"}
1
+ {"version":3,"names":["NativeModules","NativeEventEmitter","SurvicateBindings","isTurboModuleEnabled","global","__turboModuleProxy","survicate","require","default","SurvicateIntegrations","Survicate","integrations","initializeSdk","invokeEvent","eventName","enterScreen","screenName","leaveScreen","setUserId","userId","setUserTrait","traitNameOrUserTrait","traitValue","undefined","UserTrait","key","value","reset","addSurvicateEventListener","listener","eventEmitter","onSurveyDisplayedCallback","nativeEvent","event","surveyId","onSurveyDisplayed","onSurveyDisplayedListener","addListener","onQuestionAnsweredCallback","answer","type","answerType","id","answerId","ids","answerIds","answerValue","surveyName","visitorUuid","responseUuid","questionId","question","panelAnswerUrl","onQuestionAnswered","onQuestionAnsweredListener","onSurveyCompletedCallback","onSurveyCompleted","onSurveyCompletedListener","onSurveyClosedCallback","onSurveyClosed","onSurveyClosedListener","remove","constructor","Error","Date","formatDateToTimeZoneIso","toString","date","offset","getTimezoneOffset","offsetHours","Math","floor","abs","offsetMinutes","getTime","toISOString","slice","padStart"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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"}
@@ -1,15 +1,19 @@
1
+ export declare class SurvicateIntegrations {
2
+ }
1
3
  declare class Survicate {
4
+ static integrations: SurvicateIntegrations;
2
5
  static initializeSdk(): void;
3
6
  static invokeEvent(eventName: string): void;
4
7
  static enterScreen(screenName: string): void;
5
8
  static leaveScreen(screenName: string): void;
6
9
  static setUserId(userId: string): void;
7
10
  /**
8
- * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
9
- */
11
+ * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
12
+ */
10
13
  static setUserTrait(traitName: string, traitValue: string): void;
11
14
  static setUserTrait(userTrait: UserTrait): void;
12
15
  static reset(): void;
16
+ static addSurvicateEventListener(listener: SurvicateEventListener): () => void;
13
17
  }
14
18
  export declare class UserTrait {
15
19
  key: string;
@@ -17,5 +21,36 @@ export declare class UserTrait {
17
21
  constructor(key: string, value: string | number | boolean | Date);
18
22
  private formatDateToTimeZoneIso;
19
23
  }
24
+ export type SurveyDisplayedEvent = {
25
+ surveyId: string;
26
+ };
27
+ export type QuestionAnsweredEvent = {
28
+ surveyId: string;
29
+ surveyName: string;
30
+ visitorUuid: string;
31
+ responseUuid: string;
32
+ questionId: string;
33
+ question: string | null;
34
+ answer: SurvicateAnswer;
35
+ panelAnswerUrl: string;
36
+ };
37
+ export type SurvicateAnswer = {
38
+ type: string | null;
39
+ id: number | null;
40
+ ids: number[];
41
+ value: string | null;
42
+ };
43
+ export type SurveyCompletedEvent = {
44
+ surveyId: string;
45
+ };
46
+ export type SurveyClosedEvent = {
47
+ surveyId: string;
48
+ };
49
+ export interface SurvicateEventListener {
50
+ onSurveyDisplayed?: (event: SurveyDisplayedEvent) => void;
51
+ onQuestionAnswered?: (event: QuestionAnsweredEvent) => void;
52
+ onSurveyCompleted?: (event: SurveyCompletedEvent) => void;
53
+ onSurveyClosed?: (event: SurveyClosedEvent) => void;
54
+ }
20
55
  export default Survicate;
21
56
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAWA,cAAM,SAAS;IACb,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI3C,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI5C,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI5C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;MAEE;IACF,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAChE,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAS/C,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB;AAED,qBAAa,SAAS;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;IAchE,OAAO,CAAC,uBAAuB;CAOhC;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAYA,qBAAa,qBAAqB;CAAG;AAErC,cAAM,SAAS;IACb,MAAM,CAAC,YAAY,wBAA+B;IAElD,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI3C,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI5C,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI5C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAChE,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAe/C,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB,MAAM,CAAC,yBAAyB,CAC9B,QAAQ,EAAE,sBAAsB,GAC/B,MAAM,IAAI;CAuEd;AAED,qBAAa,SAAS;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;IAchE,OAAO,CAAC,uBAAuB;CAOhC;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC5D,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACrD;AAED,eAAe,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@survicate/react-native-survicate",
3
3
  "title": "React Native Survicate Bindings",
4
- "version": "4.0.2",
4
+ "version": "4.1.0",
5
5
  "description": "React Native bindings for Survicate Mobile SDK",
6
6
  "main": "lib/commonjs/index.js",
7
7
  "module": "lib/module/index.js",
@@ -21,7 +21,7 @@ Pod::Spec.new do |s|
21
21
  s.requires_arc = true
22
22
 
23
23
  s.dependency "React"
24
- s.dependency "Survicate", "4.1.0"
24
+ s.dependency "Survicate", "4.1.1"
25
25
  # ...
26
26
  # s.dependency "..."
27
27
 
@@ -11,6 +11,8 @@ export interface Spec extends TurboModule {
11
11
  setUserTrait(traitName: string, traitValue: string): void;
12
12
  setWorkspaceKey(workspaceKey: string): void;
13
13
  reset(): void;
14
+ addListener(eventName: string): void;
15
+ removeListeners(count: number): void;
14
16
  }
15
17
 
16
18
  export default TurboModuleRegistry.get<Spec>("SurvicateBindings");
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { NativeModules } from "react-native";
1
+ import { NativeModules, NativeEventEmitter } from "react-native";
2
2
 
3
3
  const { SurvicateBindings } = NativeModules;
4
4
 
@@ -9,7 +9,12 @@ const survicate: any = isTurboModuleEnabled
9
9
  ? require("./NativeSurvicateModule").default
10
10
  : SurvicateBindings;
11
11
 
12
+
13
+ export class SurvicateIntegrations {}
14
+
12
15
  class Survicate {
16
+ static integrations = new SurvicateIntegrations();
17
+
13
18
  static initializeSdk(): void {
14
19
  survicate.initializeSdk();
15
20
  }
@@ -31,21 +36,101 @@ class Survicate {
31
36
  }
32
37
 
33
38
  /**
34
- * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
35
- */
39
+ * @deprecated Use setUserTrait(userTrait: UserTrait) method instead.
40
+ */
36
41
  static setUserTrait(traitName: string, traitValue: string): void;
37
42
  static setUserTrait(userTrait: UserTrait): void;
38
- static setUserTrait(traitNameOrUserTrait: string | UserTrait, traitValue?: string): void {
39
- if (typeof traitNameOrUserTrait === 'string' && traitValue !== undefined) {
43
+ static setUserTrait(
44
+ traitNameOrUserTrait: string | UserTrait,
45
+ traitValue?: string
46
+ ): void {
47
+ if (typeof traitNameOrUserTrait === "string" && traitValue !== undefined) {
40
48
  survicate.setUserTrait(traitNameOrUserTrait, traitValue);
41
49
  } else if (traitNameOrUserTrait instanceof UserTrait) {
42
- survicate.setUserTrait(traitNameOrUserTrait.key, traitNameOrUserTrait.value);
50
+ survicate.setUserTrait(
51
+ traitNameOrUserTrait.key,
52
+ traitNameOrUserTrait.value
53
+ );
43
54
  }
44
55
  }
45
56
 
46
57
  static reset(): void {
47
58
  survicate.reset();
48
59
  }
60
+
61
+ static addSurvicateEventListener(
62
+ listener: SurvicateEventListener
63
+ ): () => void {
64
+ const eventEmitter = new NativeEventEmitter(survicate);
65
+
66
+ const onSurveyDisplayedCallback = (nativeEvent: any) => {
67
+ let event: SurveyDisplayedEvent = { surveyId: nativeEvent.surveyId };
68
+ if (listener.onSurveyDisplayed !== undefined) {
69
+ listener.onSurveyDisplayed!(event);
70
+ }
71
+ };
72
+ const onSurveyDisplayedListener = eventEmitter.addListener(
73
+ "onSurveyDisplayed",
74
+ (event) => onSurveyDisplayedCallback(event)
75
+ );
76
+
77
+ const onQuestionAnsweredCallback = (nativeEvent: any) => {
78
+ let answer: SurvicateAnswer = {
79
+ type: nativeEvent.answerType,
80
+ id: nativeEvent.answerId,
81
+ ids: nativeEvent.answerIds,
82
+ value: nativeEvent.answerValue
83
+ };
84
+ let event: QuestionAnsweredEvent = {
85
+ surveyId: nativeEvent.surveyId,
86
+ surveyName: nativeEvent.surveyName,
87
+ visitorUuid: nativeEvent.visitorUuid,
88
+ responseUuid: nativeEvent.responseUuid,
89
+ questionId: nativeEvent.questionId,
90
+ question: nativeEvent.question,
91
+ answer: answer,
92
+ panelAnswerUrl: nativeEvent.panelAnswerUrl,
93
+ };
94
+ if (listener.onQuestionAnswered !== undefined) {
95
+ listener.onQuestionAnswered!(event);
96
+ }
97
+ };
98
+ const onQuestionAnsweredListener = eventEmitter.addListener(
99
+ "onQuestionAnswered",
100
+ onQuestionAnsweredCallback
101
+ );
102
+
103
+ const onSurveyCompletedCallback = (nativeEvent: any) => {
104
+ let event: SurveyCompletedEvent = { surveyId: nativeEvent.surveyId };
105
+ if (listener.onSurveyCompleted !== undefined) {
106
+ listener.onSurveyCompleted!(event);
107
+ }
108
+ };
109
+
110
+ const onSurveyCompletedListener = eventEmitter.addListener(
111
+ "onSurveyCompleted",
112
+ onSurveyCompletedCallback
113
+ );
114
+
115
+ const onSurveyClosedCallback = (nativeEvent: any) => {
116
+ let event: SurveyClosedEvent = { surveyId: nativeEvent.surveyId };
117
+ if (listener.onSurveyClosed !== undefined) {
118
+ listener.onSurveyClosed!(event);
119
+ }
120
+ };
121
+
122
+ const onSurveyClosedListener = eventEmitter.addListener(
123
+ "onSurveyClosed",
124
+ onSurveyClosedCallback
125
+ );
126
+
127
+ return () => {
128
+ onSurveyDisplayedListener.remove();
129
+ onQuestionAnsweredListener.remove();
130
+ onSurveyCompletedListener.remove();
131
+ onSurveyClosedListener.remove();
132
+ };
133
+ }
49
134
  }
50
135
 
51
136
  export class UserTrait {
@@ -54,25 +139,62 @@ export class UserTrait {
54
139
 
55
140
  constructor(key: string, value: string | number | boolean | Date) {
56
141
  if (key === null || value === null) {
57
- throw new Error('Key and value cannot be null');
142
+ throw new Error("Key and value cannot be null");
58
143
  }
59
144
 
60
145
  this.key = key;
61
-
146
+
62
147
  if (value instanceof Date) {
63
148
  this.value = this.formatDateToTimeZoneIso(value);
64
149
  } else {
65
150
  this.value = value.toString();
66
151
  }
67
152
  }
68
-
153
+
69
154
  private formatDateToTimeZoneIso(date: Date): string {
70
155
  const offset = date.getTimezoneOffset();
71
156
  const offsetHours = Math.floor(Math.abs(offset) / 60);
72
157
  const offsetMinutes = Math.abs(offset) % 60;
73
- date = new Date(date.getTime() - (offset * 60 * 1000));
158
+ date = new Date(date.getTime() - (offset * 60 * 1000));
74
159
  return date.toISOString().slice(0, -5) + (offset > 0 ? "-" : "+") + offsetHours.toString().padStart(2, '0') + ":" + offsetMinutes.toString().padStart(2, '0');
75
160
  }
76
161
  }
77
162
 
163
+ export type SurveyDisplayedEvent = {
164
+ surveyId: string;
165
+ };
166
+
167
+ export type QuestionAnsweredEvent = {
168
+ surveyId: string;
169
+ surveyName: string;
170
+ visitorUuid: string;
171
+ responseUuid: string;
172
+ questionId: string;
173
+ question: string | null;
174
+ answer: SurvicateAnswer;
175
+ panelAnswerUrl: string;
176
+ };
177
+
178
+ export type SurvicateAnswer = {
179
+ type: string | null;
180
+ id: number | null;
181
+ ids: number[];
182
+ value: string | null;
183
+ };
184
+
185
+ export type SurveyCompletedEvent = {
186
+ surveyId: string;
187
+ };
188
+
189
+ export type SurveyClosedEvent = {
190
+ surveyId: string;
191
+ };
192
+
193
+ export interface SurvicateEventListener {
194
+ onSurveyDisplayed?: (event: SurveyDisplayedEvent) => void;
195
+ onQuestionAnswered?: (event: QuestionAnsweredEvent) => void;
196
+ onSurveyCompleted?: (event: SurveyCompletedEvent) => void;
197
+ onSurveyClosed?: (event: SurveyClosedEvent) => void;
198
+ }
199
+
78
200
  export default Survicate;