@flagship.io/react-sdk 5.2.0 → 5.2.2

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.
@@ -97,11 +97,15 @@ __webpack_require__.r(__webpack_exports__);
97
97
  /* harmony export */ });
98
98
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
99
99
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
100
- 'use client';
100
+ /* harmony import */ var _flagship_io_js_sdk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @flagship.io/js-sdk */ "@flagship.io/js-sdk");
101
+ /* harmony import */ var _flagship_io_js_sdk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_flagship_io_js_sdk__WEBPACK_IMPORTED_MODULE_1__);
102
+ "use client";
103
+
101
104
 
102
105
 
103
106
  const initStat = {
104
- isInitializing: true
107
+ isInitializing: true,
108
+ sdkStatus: _flagship_io_js_sdk__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_NOT_INITIALIZED
105
109
  };
106
110
  const FlagshipContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({
107
111
  state: {
@@ -126,12 +130,13 @@ __webpack_require__.r(__webpack_exports__);
126
130
  /* harmony import */ var core_js_modules_es_regexp_flags_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_flags_js__WEBPACK_IMPORTED_MODULE_0__);
127
131
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react");
128
132
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
129
- /* harmony import */ var _deps__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./deps */ "@flagship.io/js-sdk");
130
- /* harmony import */ var _deps__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_deps__WEBPACK_IMPORTED_MODULE_6__);
133
+ /* harmony import */ var _deps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./deps */ "@flagship.io/js-sdk");
134
+ /* harmony import */ var _deps__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_deps__WEBPACK_IMPORTED_MODULE_7__);
131
135
  /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
132
136
  /* harmony import */ var _FlagshipContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FlagshipContext */ "./src/FlagshipContext.tsx");
133
137
  /* harmony import */ var _FSFlag__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FSFlag */ "./src/FSFlag.ts");
134
138
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
139
+ /* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks */ "./src/hooks.ts");
135
140
  'use client';
136
141
 
137
142
 
@@ -142,6 +147,7 @@ __webpack_require__.r(__webpack_exports__);
142
147
 
143
148
 
144
149
 
150
+
145
151
  /**
146
152
  * This hook returns a flag object by its key. If no flag match the given key an empty flag will be returned.
147
153
  * @param key
@@ -186,108 +192,126 @@ const useFlagship = () => {
186
192
  visitor,
187
193
  config
188
194
  } = state;
195
+ const visitorRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useLatestRef)(visitor);
196
+ const configRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useLatestRef)(config);
197
+ const stateRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_6__.useLatestRef)(state);
198
+ const visitorContext = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => ({
199
+ ...(visitor === null || visitor === void 0 ? void 0 : visitor.context)
200
+ }), [JSON.stringify(visitor === null || visitor === void 0 ? void 0 : visitor.context)]);
189
201
  const fsUpdateContext = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(context => {
190
202
  handleContextChange({
191
- config,
192
- visitor,
193
- updateFunction: () => visitor === null || visitor === void 0 ? void 0 : visitor.updateContext(context),
203
+ config: configRef.current,
204
+ visitor: visitorRef.current,
205
+ updateFunction: () => {
206
+ var _visitorRef$current;
207
+ return (_visitorRef$current = visitorRef.current) === null || _visitorRef$current === void 0 ? void 0 : _visitorRef$current.updateContext(context);
208
+ },
194
209
  functionName: 'updateContext'
195
210
  });
196
- }, [visitor]);
211
+ }, []);
197
212
  const fsClearContext = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => {
198
213
  handleContextChange({
199
- config,
200
- visitor,
201
- updateFunction: () => visitor === null || visitor === void 0 ? void 0 : visitor.clearContext(),
214
+ config: configRef.current,
215
+ visitor: visitorRef.current,
216
+ updateFunction: () => {
217
+ var _visitorRef$current2;
218
+ return (_visitorRef$current2 = visitorRef.current) === null || _visitorRef$current2 === void 0 ? void 0 : _visitorRef$current2.clearContext();
219
+ },
202
220
  functionName: 'cleanContext'
203
221
  });
204
- }, [visitor]);
222
+ }, []);
205
223
  const fsAuthenticate = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(visitorId => {
206
224
  const functionName = 'authenticate';
207
- if (!visitor) {
208
- (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logError)(config, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, functionName);
225
+ const currentVisitor = visitorRef.current;
226
+ if (!currentVisitor) {
227
+ (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logError)(configRef.current, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, functionName);
209
228
  return;
210
229
  }
211
- const originalVisitorId = visitor.visitorId;
212
- visitor.authenticate(visitorId);
230
+ const originalVisitorId = currentVisitor.visitorId;
231
+ currentVisitor.authenticate(visitorId);
213
232
  if (originalVisitorId !== visitorId) {
214
- visitor.fetchFlags();
233
+ currentVisitor.fetchFlags();
215
234
  }
216
- }, [visitor]);
235
+ }, []);
217
236
  const fsUnauthenticate = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => {
218
237
  const functionName = 'unauthenticate';
219
- if (!visitor) {
220
- (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logError)(config, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, functionName);
238
+ const currentVisitor = visitorRef.current;
239
+ if (!currentVisitor) {
240
+ (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logError)(configRef.current, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, functionName);
221
241
  return;
222
242
  }
223
- const originalVisitorId = visitor.visitorId;
224
- visitor.unauthenticate();
225
- if (originalVisitorId !== visitor.visitorId) {
226
- visitor.fetchFlags();
243
+ const originalVisitorId = currentVisitor.visitorId;
244
+ currentVisitor.unauthenticate();
245
+ if (originalVisitorId !== currentVisitor.visitorId) {
246
+ currentVisitor.fetchFlags();
227
247
  }
228
- }, [visitor]);
248
+ }, []);
229
249
  const fsSendHit = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(hit => {
230
250
  const functionName = 'sendHit';
231
- if (!visitor) {
232
- (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logError)(config, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, functionName);
251
+ const currentVisitor = visitorRef.current;
252
+ if (!currentVisitor) {
253
+ (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logError)(configRef.current, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, functionName);
233
254
  return Promise.resolve();
234
255
  }
235
256
  if (Array.isArray(hit)) {
236
- return visitor.sendHits(hit);
257
+ return currentVisitor.sendHits(hit);
237
258
  }
238
- return visitor.sendHit(hit);
239
- }, [visitor]);
259
+ return currentVisitor.sendHit(hit);
260
+ }, []);
240
261
  const getFlag = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(key => {
241
- if (!visitor) {
242
- return new _FSFlag__WEBPACK_IMPORTED_MODULE_3__.FSFlag(key, state);
262
+ const currentVisitor = visitorRef.current;
263
+ if (!currentVisitor) {
264
+ return new _FSFlag__WEBPACK_IMPORTED_MODULE_3__.FSFlag(key, stateRef.current);
243
265
  }
244
- return visitor.getFlag(key);
245
- }, [visitor]);
266
+ return currentVisitor.getFlag(key);
267
+ }, []);
246
268
  const fetchFlags = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async () => {
247
- if (!visitor) {
248
- (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logWarn)(config, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, 'fetchFlags');
269
+ const currentVisitor = visitorRef.current;
270
+ if (!currentVisitor) {
271
+ (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logWarn)(configRef.current, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, 'fetchFlags');
249
272
  return Promise.resolve();
250
273
  }
251
- return visitor.fetchFlags();
252
- }, [visitor]);
274
+ return currentVisitor.fetchFlags();
275
+ }, []);
253
276
  const setConsent = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(hasConsented => {
254
- if (!visitor) {
255
- (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logWarn)(config, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, 'setConsent');
277
+ const currentVisitor = visitorRef.current;
278
+ if (!currentVisitor) {
279
+ (0,_utils__WEBPACK_IMPORTED_MODULE_4__.logWarn)(configRef.current, _constants__WEBPACK_IMPORTED_MODULE_5__.noVisitorMessage, 'setConsent');
256
280
  return;
257
281
  }
258
- visitor.setConsent(hasConsented);
259
- }, [visitor]);
282
+ currentVisitor.setConsent(hasConsented);
283
+ }, []);
260
284
  const close = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => {
261
- return _deps__WEBPACK_IMPORTED_MODULE_6__.Flagship.close();
285
+ return _deps__WEBPACK_IMPORTED_MODULE_7__.Flagship.close();
262
286
  }, []);
263
287
  const getFlags = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => {
264
- if (!visitor) {
265
- var _state$flags;
288
+ const currentVisitor = visitorRef.current;
289
+ if (!currentVisitor) {
290
+ var _stateRef$current$fla;
266
291
  const flags = new Map();
267
- (_state$flags = state.flags) === null || _state$flags === void 0 || _state$flags.forEach((flag, key) => {
268
- flags.set(key, new _FSFlag__WEBPACK_IMPORTED_MODULE_3__.FSFlag(key, state));
292
+ (_stateRef$current$fla = stateRef.current.flags) === null || _stateRef$current$fla === void 0 || _stateRef$current$fla.forEach((flag, key) => {
293
+ flags.set(key, new _FSFlag__WEBPACK_IMPORTED_MODULE_3__.FSFlag(key, stateRef.current));
269
294
  });
270
- return new _deps__WEBPACK_IMPORTED_MODULE_6__.FSFlagCollection({
295
+ return new _deps__WEBPACK_IMPORTED_MODULE_7__.FSFlagCollection({
271
296
  flags
272
297
  });
273
298
  }
274
- return visitor.getFlags();
275
- }, [visitor]);
299
+ return currentVisitor.getFlags();
300
+ }, []);
276
301
  const collectEAIEventsAsync = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async (...args) => {
277
- if (!visitor) {
302
+ const currentVisitor = visitorRef.current;
303
+ if (!currentVisitor) {
278
304
  return;
279
305
  }
280
- return visitor.collectEAIEventsAsync(...args);
281
- }, [visitor]);
306
+ return currentVisitor.collectEAIEventsAsync(...args);
307
+ }, []);
282
308
  return (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(() => ({
283
309
  visitorId: visitor === null || visitor === void 0 ? void 0 : visitor.visitorId,
284
310
  anonymousId: visitor === null || visitor === void 0 ? void 0 : visitor.anonymousId,
285
- context: {
286
- ...(visitor === null || visitor === void 0 ? void 0 : visitor.context)
287
- },
311
+ context: visitorContext,
288
312
  hasConsented: visitor === null || visitor === void 0 ? void 0 : visitor.hasConsented,
289
- sdkStatus: _deps__WEBPACK_IMPORTED_MODULE_6__.Flagship.getStatus(),
290
- flagsStatus: visitor === null || visitor === void 0 ? void 0 : visitor.flagsStatus,
313
+ sdkStatus: state.sdkStatus,
314
+ flagsStatus: state.flagsStatus,
291
315
  setConsent,
292
316
  updateContext: fsUpdateContext,
293
317
  clearContext: fsClearContext,
@@ -299,7 +323,7 @@ const useFlagship = () => {
299
323
  close,
300
324
  getFlags,
301
325
  collectEAIEventsAsync
302
- }), [visitor, setConsent, fsUpdateContext, fsClearContext, fsAuthenticate, fsUnauthenticate, fsSendHit, getFlag, fetchFlags, close, getFlags, collectEAIEventsAsync]);
326
+ }), [visitor === null || visitor === void 0 ? void 0 : visitor.visitorId, visitor === null || visitor === void 0 ? void 0 : visitor.anonymousId, visitor === null || visitor === void 0 ? void 0 : visitor.hasConsented, visitorContext, state.sdkStatus, state.flagsStatus, setConsent, fsUpdateContext, fsClearContext, fsAuthenticate, fsUnauthenticate, fsSendHit, getFlag, fetchFlags, close, getFlags, collectEAIEventsAsync]);
303
327
  };
304
328
 
305
329
  /***/ }),
@@ -319,9 +343,10 @@ __webpack_require__.r(__webpack_exports__);
319
343
  /* harmony import */ var _deps__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deps */ "@flagship.io/js-sdk");
320
344
  /* harmony import */ var _deps__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_deps__WEBPACK_IMPORTED_MODULE_1__);
321
345
  /* harmony import */ var _FlagshipContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FlagshipContext */ "./src/FlagshipContext.tsx");
322
- /* harmony import */ var _internalType__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./internalType */ "./src/internalType.ts");
346
+ /* harmony import */ var _internalType__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./internalType */ "./src/internalType.ts");
323
347
  /* harmony import */ var _sdkVersion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdkVersion */ "./src/sdkVersion.ts");
324
348
  /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
349
+ /* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks */ "./src/hooks.ts");
325
350
  "use client";
326
351
 
327
352
 
@@ -330,6 +355,7 @@ __webpack_require__.r(__webpack_exports__);
330
355
 
331
356
 
332
357
 
358
+
333
359
  function FlagshipProvider({
334
360
  children,
335
361
  envId,
@@ -350,174 +376,207 @@ function FlagshipProvider({
350
376
  shouldSaveInstance,
351
377
  ...props
352
378
  }) {
353
- var _state$config;
354
- const flags = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.extractFlagsMap)(initialFlagsData, initialCampaigns);
355
- const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({
379
+ const flags = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => (0,_utils__WEBPACK_IMPORTED_MODULE_3__.extractFlagsMap)(initialFlagsData, initialCampaigns), [initialFlagsData, initialCampaigns]);
380
+ const [flagshipState, setFlagshipState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({
356
381
  ..._FlagshipContext__WEBPACK_IMPORTED_MODULE_4__.initStat,
357
382
  flags,
358
383
  hasVisitorData: !!visitorData
359
384
  });
360
385
  const [lastModified, setLastModified] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();
361
- const stateRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
362
- stateRef.current = state;
363
- const visitorDataRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(visitorData);
386
+ const flagshipVisitorRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
387
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
388
+ flagshipVisitorRef.current = flagshipState.visitor;
389
+ }, [flagshipState.visitor]);
390
+ const propsRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useLatestRef)(props);
391
+ const configRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useLatestRef)({
392
+ fetchNow,
393
+ hitDeduplicationTime,
394
+ language,
395
+ sdkVersion
396
+ });
397
+ const callbacksRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useLatestRef)({
398
+ onSdkStatusChanged,
399
+ onBucketingUpdated,
400
+ onFlagsStatusChanged
401
+ });
402
+ const visitorDataMemo = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => visitorData, [visitorData === null || visitorData === void 0 ? void 0 : visitorData.id, visitorData === null || visitorData === void 0 ? void 0 : visitorData.isAuthenticated, visitorData === null || visitorData === void 0 ? void 0 : visitorData.hasConsented, JSON.stringify(visitorData === null || visitorData === void 0 ? void 0 : visitorData.context)]);
364
403
 
365
404
  // #region functions
366
405
 
367
- const onBucketingLastModified = lastUpdate => {
368
- if (onBucketingUpdated) {
369
- onBucketingUpdated(lastUpdate);
406
+ const handleBucketingUpdate = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(lastUpdate => {
407
+ if (callbacksRef.current.onBucketingUpdated) {
408
+ callbacksRef.current.onBucketingUpdated(lastUpdate);
370
409
  }
371
410
  setLastModified(lastUpdate);
372
- };
373
- const statusChanged = status => {
374
- if (onSdkStatusChanged) {
375
- onSdkStatusChanged(status);
376
- }
377
- switch (status) {
378
- case _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_PANIC:
379
- case _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_INITIALIZED:
380
- createVisitor();
381
- break;
382
- case _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_NOT_INITIALIZED:
383
- setState(prev => ({
384
- ...prev,
385
- config: _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getConfig(),
386
- isInitializing: false
387
- }));
388
- break;
389
- }
390
- };
391
- const initSdk = () => {
392
- _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.start(envId, apiKey, {
393
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
394
- decisionMode: decisionMode,
395
- fetchNow,
396
- onSdkStatusChanged: statusChanged,
397
- onBucketingUpdated: onBucketingLastModified,
398
- hitDeduplicationTime,
399
- language,
400
- sdkVersion,
401
- ...props
411
+ }, []);
412
+ const handleFlagsStatusChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({
413
+ status,
414
+ reason
415
+ }) => {
416
+ var _callbacksRef$current, _callbacksRef$current2;
417
+ (_callbacksRef$current = (_callbacksRef$current2 = callbacksRef.current).onFlagsStatusChanged) === null || _callbacksRef$current === void 0 || _callbacksRef$current.call(_callbacksRef$current2, {
418
+ status,
419
+ reason
402
420
  });
403
- };
404
- function initializeState(param) {
405
- setState(currentState => ({
421
+ setFlagshipState(currentState => ({
422
+ ...currentState,
423
+ flagsStatus: {
424
+ status,
425
+ reason
426
+ }
427
+ }));
428
+ }, []);
429
+ const initializeVisitorState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(param => {
430
+ setFlagshipState(currentState => ({
406
431
  ...currentState,
407
432
  visitor: param.fsVisitor,
408
433
  config: _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getConfig(),
409
434
  isInitializing: false,
410
- hasVisitorData: !!visitorData
435
+ hasVisitorData: !!visitorDataMemo,
436
+ sdkStatus: param.sdkStatus
411
437
  }));
412
- }
413
-
414
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
415
- const onVisitorReady = (fsVisitor, error) => {
438
+ }, [!!visitorDataMemo]);
439
+ const handleVisitorReady = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((fsVisitor, error, sdkStatus) => {
416
440
  if (error) {
417
441
  (0,_utils__WEBPACK_IMPORTED_MODULE_3__.logError)(_deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getConfig(), error.message || error, "onReady");
418
442
  }
419
- initializeState({
420
- fsVisitor
443
+ initializeVisitorState({
444
+ fsVisitor,
445
+ sdkStatus
421
446
  });
422
- };
423
- const createVisitor = () => {
424
- if (!visitorDataRef.current) {
447
+ }, [initializeVisitorState]);
448
+ const createFlagshipVisitor = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(sdkStatus => {
449
+ if (!visitorDataMemo) {
425
450
  return;
426
451
  }
427
452
  const fsVisitor = _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.newVisitor({
428
- visitorId: visitorDataRef.current.id,
429
- context: visitorDataRef.current.context,
430
- isAuthenticated: visitorDataRef.current.isAuthenticated,
431
- hasConsented: visitorDataRef.current.hasConsented,
453
+ visitorId: visitorDataMemo.id,
454
+ context: visitorDataMemo.context,
455
+ isAuthenticated: visitorDataMemo.isAuthenticated,
456
+ hasConsented: visitorDataMemo.hasConsented,
432
457
  initialCampaigns,
433
458
  initialFlagsData,
434
- onFlagsStatusChanged,
459
+ onFlagsStatusChanged: handleFlagsStatusChange,
435
460
  shouldSaveInstance
436
461
  });
437
462
  fsVisitor === null || fsVisitor === void 0 || fsVisitor.on("ready", error => {
438
- onVisitorReady(fsVisitor, error);
463
+ handleVisitorReady(fsVisitor, error, sdkStatus);
439
464
  });
440
465
  if (!fetchNow) {
441
- initializeState({
442
- fsVisitor
466
+ initializeVisitorState({
467
+ fsVisitor,
468
+ sdkStatus
443
469
  });
444
470
  }
445
- };
446
- function updateVisitor() {
447
- if (!visitorDataRef.current || _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getStatus() !== _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_INITIALIZED) {
448
- return;
471
+ }, [initialCampaigns, initialFlagsData, handleFlagsStatusChange, shouldSaveInstance, fetchNow, handleVisitorReady, initializeVisitorState, visitorDataMemo]);
472
+ const handleSdkStatusChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(sdkStatus => {
473
+ if (callbacksRef.current.onSdkStatusChanged) {
474
+ callbacksRef.current.onSdkStatusChanged(sdkStatus);
449
475
  }
450
- if (!state.visitor || state.visitor.visitorId !== visitorDataRef.current.id && (!visitorDataRef.current.isAuthenticated || visitorDataRef.current.isAuthenticated && state.visitor.anonymousId)) {
451
- var _state$visitor;
452
- (_state$visitor = state.visitor) === null || _state$visitor === void 0 || _state$visitor.cleanup();
453
- createVisitor();
454
- return;
476
+ switch (sdkStatus) {
477
+ case _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_PANIC:
478
+ case _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_INITIALIZED:
479
+ createFlagshipVisitor(sdkStatus);
480
+ break;
481
+ case _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_NOT_INITIALIZED:
482
+ setFlagshipState(prev => ({
483
+ ...prev,
484
+ config: _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getConfig(),
485
+ isInitializing: false,
486
+ sdkStatus
487
+ }));
488
+ break;
455
489
  }
456
- if (visitorDataRef.current.hasConsented !== state.visitor.hasConsented) {
457
- var _visitorDataRef$curre;
458
- state.visitor.setConsent((_visitorDataRef$curre = visitorDataRef.current.hasConsented) !== null && _visitorDataRef$curre !== void 0 ? _visitorDataRef$curre : true);
490
+ }, [createFlagshipVisitor]);
491
+ const handleSdkStatusChangeRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useLatestRef)(handleSdkStatusChange);
492
+ const handleBucketingUpdateRef = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useLatestRef)(handleBucketingUpdate);
493
+ const initializeFlagshipSdk = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
494
+ _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.start(envId, apiKey, {
495
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
496
+ decisionMode: decisionMode,
497
+ fetchNow: configRef.current.fetchNow,
498
+ onSdkStatusChanged: (...args) => handleSdkStatusChangeRef.current(...args),
499
+ onBucketingUpdated: (...args) => handleBucketingUpdateRef.current(...args),
500
+ hitDeduplicationTime: configRef.current.hitDeduplicationTime,
501
+ language: configRef.current.language,
502
+ sdkVersion: configRef.current.sdkVersion,
503
+ ...propsRef.current
504
+ });
505
+ }, [envId, apiKey, decisionMode]);
506
+ const updateFlagshipVisitor = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
507
+ if (!visitorDataMemo || _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getStatus() !== _deps__WEBPACK_IMPORTED_MODULE_1__.FSSdkStatus.SDK_INITIALIZED) {
508
+ return;
459
509
  }
460
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
461
- state.visitor.updateContext(visitorDataRef.current.context);
462
- if (!state.visitor.anonymousId && visitorDataRef.current.isAuthenticated) {
463
- state.visitor.authenticate(visitorDataRef.current.id);
510
+ const currentVisitor = flagshipVisitorRef.current;
511
+ if ((0,_hooks__WEBPACK_IMPORTED_MODULE_5__.shouldRecreateVisitor)(currentVisitor, visitorDataMemo.id, visitorDataMemo.isAuthenticated)) {
512
+ currentVisitor === null || currentVisitor === void 0 || currentVisitor.cleanup();
513
+ createFlagshipVisitor(_deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.getStatus());
514
+ return;
464
515
  }
465
- if (state.visitor.anonymousId && !visitorDataRef.current.isAuthenticated) {
466
- state.visitor.unauthenticate();
516
+
517
+ // Update existing visitor
518
+ if (currentVisitor) {
519
+ (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.updateVisitorData)(currentVisitor, visitorDataMemo.id, visitorDataMemo.context, visitorDataMemo.hasConsented, visitorDataMemo.isAuthenticated);
467
520
  }
468
- state.visitor.fetchFlags();
469
- }
521
+ }, [createFlagshipVisitor, visitorDataMemo]);
470
522
 
471
523
  // #endregion
472
524
 
473
525
  (0,_utils__WEBPACK_IMPORTED_MODULE_3__.useNonInitialEffect)(() => {
474
526
  if (fetchFlagsOnBucketingUpdated) {
475
- var _state$visitor2;
476
- (_state$visitor2 = state.visitor) === null || _state$visitor2 === void 0 || _state$visitor2.fetchFlags();
527
+ var _flagshipVisitorRef$c;
528
+ (_flagshipVisitorRef$c = flagshipVisitorRef.current) === null || _flagshipVisitorRef$c === void 0 || _flagshipVisitorRef$c.fetchFlags();
477
529
  }
478
- }, [lastModified]);
530
+ }, [lastModified, fetchFlagsOnBucketingUpdated]);
479
531
  (0,_utils__WEBPACK_IMPORTED_MODULE_3__.useNonInitialEffect)(() => {
480
- visitorDataRef.current = visitorData;
481
- updateVisitor();
482
- }, [JSON.stringify(visitorData)]);
532
+ updateFlagshipVisitor();
533
+ }, [updateFlagshipVisitor]);
483
534
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
484
- initSdk();
485
- }, [envId, apiKey, decisionMode]);
486
- const handleDisplay = () => {
487
- const isFirstInit = !state.visitor;
488
- if (state.isInitializing && loadingComponent && isFirstInit && fetchNow) {
489
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, loadingComponent);
490
- }
491
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, children);
492
- };
535
+ initializeFlagshipSdk();
536
+ }, [initializeFlagshipSdk]);
493
537
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
494
- var _window, _window$addEventListe;
495
- (_window = window) === null || _window === void 0 || (_window$addEventListe = _window.addEventListener) === null || _window$addEventListe === void 0 || _window$addEventListe.call(_window, _internalType__WEBPACK_IMPORTED_MODULE_5__.INTERNAL_EVENTS.FsTriggerRendering, onVariationsForced);
496
538
  return () => {
497
- var _window2, _window2$removeEventL;
498
- return (_window2 = window) === null || _window2 === void 0 || (_window2$removeEventL = _window2.removeEventListener) === null || _window2$removeEventL === void 0 ? void 0 : _window2$removeEventL.call(_window2, _internalType__WEBPACK_IMPORTED_MODULE_5__.INTERNAL_EVENTS.FsTriggerRendering, onVariationsForced);
539
+ var _flagshipVisitorRef$c2;
540
+ (_flagshipVisitorRef$c2 = flagshipVisitorRef.current) === null || _flagshipVisitorRef$c2 === void 0 || _flagshipVisitorRef$c2.cleanup();
541
+ _deps__WEBPACK_IMPORTED_MODULE_1__.Flagship.close();
499
542
  };
500
- }, [(_state$config = state.config) === null || _state$config === void 0 ? void 0 : _state$config.isQAModeEnabled]);
501
- const onVariationsForced = e => {
543
+ }, []);
544
+ const handleDisplay = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {
545
+ const isFirstInit = !flagshipState.visitor;
546
+ if (flagshipState.isInitializing && loadingComponent && isFirstInit && fetchNow) {
547
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, loadingComponent);
548
+ }
549
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, children);
550
+ }, [flagshipState.isInitializing, flagshipState.visitor, loadingComponent, fetchNow, children]);
551
+ const handleForcedVariations = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {
502
552
  const {
503
553
  detail
504
554
  } = e;
505
555
  if (detail.forcedReFetchFlags) {
506
- var _stateRef$current;
507
- (_stateRef$current = stateRef.current) === null || _stateRef$current === void 0 || (_stateRef$current = _stateRef$current.visitor) === null || _stateRef$current === void 0 || _stateRef$current.fetchFlags();
556
+ var _flagshipVisitorRef$c3;
557
+ (_flagshipVisitorRef$c3 = flagshipVisitorRef.current) === null || _flagshipVisitorRef$c3 === void 0 || _flagshipVisitorRef$c3.fetchFlags();
508
558
  } else {
509
- setState(state => ({
559
+ setFlagshipState(state => ({
510
560
  ...state,
511
561
  toggleForcedVariations: !state.toggleForcedVariations
512
562
  }));
513
563
  }
514
- };
564
+ }, []);
565
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
566
+ var _window, _window$addEventListe;
567
+ (_window = window) === null || _window === void 0 || (_window$addEventListe = _window.addEventListener) === null || _window$addEventListe === void 0 || _window$addEventListe.call(_window, _internalType__WEBPACK_IMPORTED_MODULE_6__.INTERNAL_EVENTS.FsTriggerRendering, handleForcedVariations);
568
+ return () => {
569
+ var _window2, _window2$removeEventL;
570
+ return (_window2 = window) === null || _window2 === void 0 || (_window2$removeEventL = _window2.removeEventListener) === null || _window2$removeEventL === void 0 ? void 0 : _window2$removeEventL.call(_window2, _internalType__WEBPACK_IMPORTED_MODULE_6__.INTERNAL_EVENTS.FsTriggerRendering, handleForcedVariations);
571
+ };
572
+ }, [handleForcedVariations]);
573
+ const contextValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({
574
+ state: flagshipState,
575
+ setState: setFlagshipState
576
+ }), [flagshipState]);
515
577
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FlagshipContext__WEBPACK_IMPORTED_MODULE_4__.FlagshipContext.Provider, {
516
- value: {
517
- state,
518
- setState
519
- }
520
- }, handleDisplay());
578
+ value: contextValue
579
+ }, handleDisplay);
521
580
  }
522
581
 
523
582
  /***/ }),
@@ -662,6 +721,67 @@ __webpack_require__.r(__webpack_exports__);
662
721
  /* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
663
722
 
664
723
 
724
+ /***/ }),
725
+
726
+ /***/ "./src/hooks.ts":
727
+ /*!**********************!*\
728
+ !*** ./src/hooks.ts ***!
729
+ \**********************/
730
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
731
+
732
+ __webpack_require__.r(__webpack_exports__);
733
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
734
+ /* harmony export */ getAuthenticationAction: () => (/* binding */ getAuthenticationAction),
735
+ /* harmony export */ shouldRecreateVisitor: () => (/* binding */ shouldRecreateVisitor),
736
+ /* harmony export */ shouldUpdateConsent: () => (/* binding */ shouldUpdateConsent),
737
+ /* harmony export */ updateVisitorData: () => (/* binding */ updateVisitorData),
738
+ /* harmony export */ useLatestRef: () => (/* binding */ useLatestRef)
739
+ /* harmony export */ });
740
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
741
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
742
+ 'use client';
743
+
744
+
745
+ function useLatestRef(value) {
746
+ const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(value);
747
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
748
+ ref.current = value;
749
+ }, [value]);
750
+ return ref;
751
+ }
752
+ function shouldRecreateVisitor(currentVisitor, visitorId, isAuthenticated) {
753
+ if (!currentVisitor) {
754
+ return true;
755
+ }
756
+ const hasIdChanged = currentVisitor.visitorId !== visitorId;
757
+ return hasIdChanged && (!isAuthenticated || isAuthenticated && !!currentVisitor.anonymousId);
758
+ }
759
+ function shouldUpdateConsent(currentVisitor, hasConsented) {
760
+ return currentVisitor.hasConsented !== hasConsented;
761
+ }
762
+ function getAuthenticationAction(currentVisitor, isAuthenticated) {
763
+ if (!currentVisitor.anonymousId && isAuthenticated) {
764
+ return "authenticate";
765
+ }
766
+ if (currentVisitor.anonymousId && !isAuthenticated) {
767
+ return "unauthenticate";
768
+ }
769
+ return null;
770
+ }
771
+ function updateVisitorData(visitor, visitorId, context, hasConsented, isAuthenticated) {
772
+ if (shouldUpdateConsent(visitor, hasConsented)) {
773
+ visitor.setConsent(hasConsented !== null && hasConsented !== void 0 ? hasConsented : true);
774
+ }
775
+ visitor.updateContext(context);
776
+ const authAction = getAuthenticationAction(visitor, isAuthenticated);
777
+ if (authAction === "authenticate") {
778
+ visitor.authenticate(visitorId);
779
+ } else if (authAction === "unauthenticate") {
780
+ visitor.unauthenticate();
781
+ }
782
+ visitor.fetchFlags();
783
+ }
784
+
665
785
  /***/ }),
666
786
 
667
787
  /***/ "./src/internalType.ts":
@@ -692,7 +812,7 @@ __webpack_require__.r(__webpack_exports__);
692
812
  /* harmony export */ version: () => (/* binding */ version)
693
813
  /* harmony export */ });
694
814
  // Generated by genversion.
695
- const version = '5.2.0';
815
+ const version = '5.2.2';
696
816
 
697
817
  /***/ }),
698
818