@flagship.io/react-sdk 3.0.0 → 3.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.
package/dist/es/Flag.js CHANGED
@@ -3,27 +3,27 @@ import { noVisitorMessage } from './constants';
3
3
  import { log } from './utils';
4
4
  export class Flag {
5
5
  constructor(defaultValue) {
6
- log(LogLevel.ERROR, noVisitorMessage, 'GetFlag');
6
+ log(LogLevel.WARNING, noVisitorMessage, 'GetFlag');
7
7
  this._defaultValue = defaultValue;
8
8
  }
9
9
 
10
10
  getValue() {
11
- log(LogLevel.ERROR, noVisitorMessage, 'exists');
11
+ log(LogLevel.WARNING, noVisitorMessage, 'getValue');
12
12
  return this._defaultValue;
13
13
  }
14
14
 
15
15
  exists() {
16
- log(LogLevel.ERROR, noVisitorMessage, 'exists');
16
+ log(LogLevel.WARNING, noVisitorMessage, 'exists');
17
17
  return false;
18
18
  }
19
19
 
20
20
  userExposed() {
21
- log(LogLevel.ERROR, noVisitorMessage, 'userExposed');
21
+ log(LogLevel.WARNING, noVisitorMessage, 'userExposed');
22
22
  return Promise.resolve();
23
23
  }
24
24
 
25
25
  get metadata() {
26
- log(LogLevel.ERROR, noVisitorMessage, 'metadata');
26
+ log(LogLevel.WARNING, noVisitorMessage, 'metadata');
27
27
  return new FlagMetadata({
28
28
  campaignId: '',
29
29
  campaignType: '',
@@ -1,7 +1,7 @@
1
1
  // eslint-disable-next-line no-use-before-define
2
- import React, { useState, useEffect, createContext, useRef } from 'react';
3
- import { Flagship, FlagshipStatus } from '@flagship.io/js-sdk';
4
- import { getModificationsFromCampaigns, logError, uuidV4 } from './utils';
2
+ import React, { useState, useEffect, createContext, useRef } from "react";
3
+ import { Flagship, FlagshipStatus } from "@flagship.io/js-sdk";
4
+ import { getModificationsFromCampaigns, logError, useNonInitialEffect } from "./utils";
5
5
  const initStat = {
6
6
  status: {
7
7
  isLoading: true,
@@ -64,47 +64,20 @@ export const FlagshipProvider = ({
64
64
  const [lastModified, setLastModified] = useState();
65
65
  const stateRef = useRef();
66
66
  stateRef.current = state;
67
- useEffect(() => {
67
+ useNonInitialEffect(() => {
68
68
  if (synchronizeOnBucketingUpdated) {
69
69
  var _state$visitor;
70
70
 
71
71
  (_state$visitor = state.visitor) === null || _state$visitor === void 0 ? void 0 : _state$visitor.fetchFlags();
72
72
  }
73
73
  }, [lastModified]);
74
- useEffect(() => {
75
- updateVisitor();
74
+ useNonInitialEffect(() => {
75
+ createVisitor(true);
76
76
  }, [JSON.stringify(visitorData)]);
77
77
  useEffect(() => {
78
78
  initSdk();
79
79
  }, [envId, apiKey, decisionMode]);
80
80
 
81
- const updateVisitor = () => {
82
- if (!state.visitor) {
83
- return;
84
- }
85
-
86
- if (visitorData.context) {
87
- state.visitor.clearContext();
88
- state.visitor.updateContext(visitorData.context);
89
- }
90
-
91
- if (typeof visitorData.hasConsented === 'boolean') {
92
- state.visitor.setConsent(visitorData.hasConsented);
93
- }
94
-
95
- if (state.visitor.anonymousId && !visitorData.isAuthenticated) {
96
- state.visitor.unauthenticate();
97
- } else if (!state.visitor.anonymousId && visitorData.isAuthenticated) {
98
- state.visitor.authenticate(visitorData.id || uuidV4());
99
- }
100
-
101
- if (visitorData.id) {
102
- state.visitor.visitorId = visitorData.id;
103
- }
104
-
105
- state.visitor.fetchFlags();
106
- };
107
-
108
81
  function initializeState(param) {
109
82
  const newStatus = {
110
83
  isSdkReady: param.isSdkReady,
@@ -132,7 +105,7 @@ export const FlagshipProvider = ({
132
105
 
133
106
  const onVisitorReady = (fsVisitor, error) => {
134
107
  if (error) {
135
- logError(Flagship.getConfig(), error.message || error, 'onReady');
108
+ logError(Flagship.getConfig(), error.message || error, "onReady");
136
109
  return;
137
110
  }
138
111
 
@@ -151,6 +124,37 @@ export const FlagshipProvider = ({
151
124
  }
152
125
  };
153
126
 
127
+ const createVisitor = (fetchFlags = false) => {
128
+ if (!visitorData) {
129
+ return;
130
+ }
131
+
132
+ const fsVisitor = Flagship.newVisitor({
133
+ visitorId: visitorData.id,
134
+ context: visitorData.context,
135
+ isAuthenticated: visitorData.isAuthenticated,
136
+ hasConsented: visitorData.hasConsented,
137
+ initialCampaigns,
138
+ initialModifications,
139
+ initialFlagsData
140
+ });
141
+ fsVisitor === null || fsVisitor === void 0 ? void 0 : fsVisitor.on("ready", error => {
142
+ onVisitorReady(fsVisitor, error);
143
+ });
144
+
145
+ if (!fetchNow && fsVisitor && !fetchFlags) {
146
+ initializeState({
147
+ fsVisitor,
148
+ isSdkReady: true,
149
+ isLoading: false
150
+ });
151
+ }
152
+
153
+ if (fetchFlags && !fetchNow) {
154
+ fsVisitor === null || fsVisitor === void 0 ? void 0 : fsVisitor.fetchFlags();
155
+ }
156
+ };
157
+
154
158
  const statusChanged = status => {
155
159
  if (statusChangedCallback) {
156
160
  statusChangedCallback(status);
@@ -158,39 +162,15 @@ export const FlagshipProvider = ({
158
162
 
159
163
  if (status === FlagshipStatus.STARTING && onInitStart) {
160
164
  onInitStart();
161
- } else if (status === FlagshipStatus.READY_PANIC_ON || status === FlagshipStatus.READY) {
162
- var _stateRef$current;
165
+ return;
166
+ }
163
167
 
168
+ if (status === FlagshipStatus.READY_PANIC_ON || status === FlagshipStatus.READY) {
164
169
  if (onInitDone) {
165
170
  onInitDone();
166
171
  }
167
172
 
168
- if ((_stateRef$current = stateRef.current) !== null && _stateRef$current !== void 0 && _stateRef$current.visitor) {
169
- var _stateRef$current2;
170
-
171
- (_stateRef$current2 = stateRef.current) === null || _stateRef$current2 === void 0 ? void 0 : _stateRef$current2.visitor.fetchFlags();
172
- } else {
173
- const fsVisitor = Flagship.newVisitor({
174
- visitorId: visitorData.id,
175
- context: visitorData.context,
176
- isAuthenticated: visitorData.isAuthenticated,
177
- hasConsented: visitorData.hasConsented,
178
- initialCampaigns,
179
- initialModifications,
180
- initialFlagsData
181
- });
182
- fsVisitor === null || fsVisitor === void 0 ? void 0 : fsVisitor.on('ready', error => {
183
- onVisitorReady(fsVisitor, error);
184
- });
185
-
186
- if (!fetchNow && fsVisitor) {
187
- initializeState({
188
- fsVisitor,
189
- isSdkReady: true,
190
- isLoading: false
191
- });
192
- }
193
- }
173
+ createVisitor();
194
174
  }
195
175
  };
196
176
 
@@ -221,7 +201,8 @@ export const FlagshipProvider = ({
221
201
  hitDeduplicationTime,
222
202
  visitorCacheImplementation,
223
203
  hitCacheImplementation,
224
- disableCache
204
+ disableCache,
205
+ language: 1
225
206
  });
226
207
  };
227
208
 
@@ -141,19 +141,6 @@ export const useFsModificationInfo = key => {
141
141
  });
142
142
  };
143
143
 
144
- const fsSynchronizeModifications = async (functionName, visitor, config) => {
145
- try {
146
- if (!visitor) {
147
- reportNoVisitor(config, functionName);
148
- return;
149
- }
150
-
151
- await visitor.synchronizeModifications(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
152
- } catch (error) {
153
- logError(config, error.message || error, functionName);
154
- }
155
- };
156
-
157
144
  const fsActivate = async (params, functionName, visitor, config) => {
158
145
  try {
159
146
  if (!visitor) {
@@ -303,8 +290,12 @@ export const useFlagship = () => {
303
290
  };
304
291
 
305
292
  const synchronizeModifications = async () => {
306
- const functionName = 'synchronizeModifications';
307
- await fsSynchronizeModifications(functionName, visitor, config);
293
+ if (!visitor) {
294
+ logWarn(config, noVisitorMessage, 'synchronizeModifications');
295
+ return;
296
+ }
297
+
298
+ await visitor.synchronizeModifications();
308
299
  };
309
300
 
310
301
  const getModifications = (params, activateAll) => {
@@ -341,7 +332,7 @@ export const useFlagship = () => {
341
332
  return Promise.resolve();
342
333
  }
343
334
 
344
- return visitor === null || visitor === void 0 ? void 0 : visitor.fetchFlags();
335
+ return visitor.fetchFlags();
345
336
  }
346
337
 
347
338
  function setConsent(hasConsented) {
@@ -378,8 +369,4 @@ export const useFlagship = () => {
378
369
  getFlag,
379
370
  fetchFlags
380
371
  };
381
- };
382
-
383
- const reportNoVisitor = (config, tag) => {
384
- logError(config, noVisitorMessage, tag);
385
372
  };
@@ -1,2 +1,2 @@
1
- export const noVisitorMessage = 'sdk not correctly initialized... Make sure fsVisitor is ready.';
1
+ export const noVisitorMessage = 'flagship Visitor not initialized.';
2
2
  export const noVisitorDefault = 'fsVisitor not initialized, returns default value';
package/dist/es/utils.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { LogLevel } from '@flagship.io/js-sdk';
2
+ import { useEffect, useRef } from 'react';
2
3
  export function logError(config, message, tag) {
3
4
  if (!config || !config.logManager || typeof config.logManager.error !== 'function' || !config.logLevel || config.logLevel < LogLevel.ERROR) {
4
5
  return;
@@ -60,4 +61,17 @@ export function uuidV4() {
60
61
  const value = char === 'x' ? rand : rand & 0x3 | 0x8;
61
62
  return value.toString(16);
62
63
  });
64
+ }
65
+ export function useNonInitialEffect(effect, deps) {
66
+ const initialRender = useRef(true);
67
+ useEffect(() => {
68
+ if (initialRender.current) {
69
+ initialRender.current = false;
70
+ return;
71
+ }
72
+
73
+ if (typeof effect === 'function') {
74
+ return effect();
75
+ }
76
+ }, deps);
63
77
  }
package/dist/esm/Flag.js CHANGED
@@ -15,32 +15,32 @@ export var Flag = /*#__PURE__*/function () {
15
15
 
16
16
  _defineProperty(this, "_defaultValue", void 0);
17
17
 
18
- log(LogLevel.ERROR, noVisitorMessage, 'GetFlag');
18
+ log(LogLevel.WARNING, noVisitorMessage, 'GetFlag');
19
19
  this._defaultValue = defaultValue;
20
20
  }
21
21
 
22
22
  _createClass(Flag, [{
23
23
  key: "getValue",
24
24
  value: function getValue() {
25
- log(LogLevel.ERROR, noVisitorMessage, 'exists');
25
+ log(LogLevel.WARNING, noVisitorMessage, 'getValue');
26
26
  return this._defaultValue;
27
27
  }
28
28
  }, {
29
29
  key: "exists",
30
30
  value: function exists() {
31
- log(LogLevel.ERROR, noVisitorMessage, 'exists');
31
+ log(LogLevel.WARNING, noVisitorMessage, 'exists');
32
32
  return false;
33
33
  }
34
34
  }, {
35
35
  key: "userExposed",
36
36
  value: function userExposed() {
37
- log(LogLevel.ERROR, noVisitorMessage, 'userExposed');
37
+ log(LogLevel.WARNING, noVisitorMessage, 'userExposed');
38
38
  return Promise.resolve();
39
39
  }
40
40
  }, {
41
41
  key: "metadata",
42
42
  get: function get() {
43
- log(LogLevel.ERROR, noVisitorMessage, 'metadata');
43
+ log(LogLevel.WARNING, noVisitorMessage, 'metadata');
44
44
  return new FlagMetadata({
45
45
  campaignId: '',
46
46
  campaignType: '',
@@ -17,9 +17,9 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
17
17
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
18
18
 
19
19
  // eslint-disable-next-line no-use-before-define
20
- import React, { useState, useEffect, createContext, useRef } from 'react';
21
- import { Flagship, FlagshipStatus } from '@flagship.io/js-sdk';
22
- import { getModificationsFromCampaigns, logError, uuidV4 } from './utils';
20
+ import React, { useState, useEffect, createContext, useRef } from "react";
21
+ import { Flagship, FlagshipStatus } from "@flagship.io/js-sdk";
22
+ import { getModificationsFromCampaigns, logError, useNonInitialEffect } from "./utils";
23
23
  var initStat = {
24
24
  status: {
25
25
  isLoading: true,
@@ -88,47 +88,20 @@ export var FlagshipProvider = function FlagshipProvider(_ref) {
88
88
 
89
89
  var stateRef = useRef();
90
90
  stateRef.current = state;
91
- useEffect(function () {
91
+ useNonInitialEffect(function () {
92
92
  if (synchronizeOnBucketingUpdated) {
93
93
  var _state$visitor;
94
94
 
95
95
  (_state$visitor = state.visitor) === null || _state$visitor === void 0 ? void 0 : _state$visitor.fetchFlags();
96
96
  }
97
97
  }, [lastModified]);
98
- useEffect(function () {
99
- updateVisitor();
98
+ useNonInitialEffect(function () {
99
+ createVisitor(true);
100
100
  }, [JSON.stringify(visitorData)]);
101
101
  useEffect(function () {
102
102
  initSdk();
103
103
  }, [envId, apiKey, decisionMode]);
104
104
 
105
- var updateVisitor = function updateVisitor() {
106
- if (!state.visitor) {
107
- return;
108
- }
109
-
110
- if (visitorData.context) {
111
- state.visitor.clearContext();
112
- state.visitor.updateContext(visitorData.context);
113
- }
114
-
115
- if (typeof visitorData.hasConsented === 'boolean') {
116
- state.visitor.setConsent(visitorData.hasConsented);
117
- }
118
-
119
- if (state.visitor.anonymousId && !visitorData.isAuthenticated) {
120
- state.visitor.unauthenticate();
121
- } else if (!state.visitor.anonymousId && visitorData.isAuthenticated) {
122
- state.visitor.authenticate(visitorData.id || uuidV4());
123
- }
124
-
125
- if (visitorData.id) {
126
- state.visitor.visitorId = visitorData.id;
127
- }
128
-
129
- state.visitor.fetchFlags();
130
- };
131
-
132
105
  function initializeState(param) {
133
106
  var newStatus = {
134
107
  isSdkReady: param.isSdkReady,
@@ -154,7 +127,7 @@ export var FlagshipProvider = function FlagshipProvider(_ref) {
154
127
 
155
128
  var onVisitorReady = function onVisitorReady(fsVisitor, error) {
156
129
  if (error) {
157
- logError(Flagship.getConfig(), error.message || error, 'onReady');
130
+ logError(Flagship.getConfig(), error.message || error, "onReady");
158
131
  return;
159
132
  }
160
133
 
@@ -173,6 +146,39 @@ export var FlagshipProvider = function FlagshipProvider(_ref) {
173
146
  }
174
147
  };
175
148
 
149
+ var createVisitor = function createVisitor() {
150
+ var fetchFlags = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
151
+
152
+ if (!visitorData) {
153
+ return;
154
+ }
155
+
156
+ var fsVisitor = Flagship.newVisitor({
157
+ visitorId: visitorData.id,
158
+ context: visitorData.context,
159
+ isAuthenticated: visitorData.isAuthenticated,
160
+ hasConsented: visitorData.hasConsented,
161
+ initialCampaigns: initialCampaigns,
162
+ initialModifications: initialModifications,
163
+ initialFlagsData: initialFlagsData
164
+ });
165
+ fsVisitor === null || fsVisitor === void 0 ? void 0 : fsVisitor.on("ready", function (error) {
166
+ onVisitorReady(fsVisitor, error);
167
+ });
168
+
169
+ if (!fetchNow && fsVisitor && !fetchFlags) {
170
+ initializeState({
171
+ fsVisitor: fsVisitor,
172
+ isSdkReady: true,
173
+ isLoading: false
174
+ });
175
+ }
176
+
177
+ if (fetchFlags && !fetchNow) {
178
+ fsVisitor === null || fsVisitor === void 0 ? void 0 : fsVisitor.fetchFlags();
179
+ }
180
+ };
181
+
176
182
  var statusChanged = function statusChanged(status) {
177
183
  if (statusChangedCallback) {
178
184
  statusChangedCallback(status);
@@ -180,39 +186,15 @@ export var FlagshipProvider = function FlagshipProvider(_ref) {
180
186
 
181
187
  if (status === FlagshipStatus.STARTING && onInitStart) {
182
188
  onInitStart();
183
- } else if (status === FlagshipStatus.READY_PANIC_ON || status === FlagshipStatus.READY) {
184
- var _stateRef$current;
189
+ return;
190
+ }
185
191
 
192
+ if (status === FlagshipStatus.READY_PANIC_ON || status === FlagshipStatus.READY) {
186
193
  if (onInitDone) {
187
194
  onInitDone();
188
195
  }
189
196
 
190
- if ((_stateRef$current = stateRef.current) !== null && _stateRef$current !== void 0 && _stateRef$current.visitor) {
191
- var _stateRef$current2;
192
-
193
- (_stateRef$current2 = stateRef.current) === null || _stateRef$current2 === void 0 ? void 0 : _stateRef$current2.visitor.fetchFlags();
194
- } else {
195
- var fsVisitor = Flagship.newVisitor({
196
- visitorId: visitorData.id,
197
- context: visitorData.context,
198
- isAuthenticated: visitorData.isAuthenticated,
199
- hasConsented: visitorData.hasConsented,
200
- initialCampaigns: initialCampaigns,
201
- initialModifications: initialModifications,
202
- initialFlagsData: initialFlagsData
203
- });
204
- fsVisitor === null || fsVisitor === void 0 ? void 0 : fsVisitor.on('ready', function (error) {
205
- onVisitorReady(fsVisitor, error);
206
- });
207
-
208
- if (!fetchNow && fsVisitor) {
209
- initializeState({
210
- fsVisitor: fsVisitor,
211
- isSdkReady: true,
212
- isLoading: false
213
- });
214
- }
215
- }
197
+ createVisitor();
216
198
  }
217
199
  };
218
200
 
@@ -243,7 +225,8 @@ export var FlagshipProvider = function FlagshipProvider(_ref) {
243
225
  hitDeduplicationTime: hitDeduplicationTime,
244
226
  visitorCacheImplementation: visitorCacheImplementation,
245
227
  hitCacheImplementation: hitCacheImplementation,
246
- disableCache: disableCache
228
+ disableCache: disableCache,
229
+ language: 1
247
230
  });
248
231
  };
249
232