@ninetailed/experience.js-react 7.5.0 → 7.6.0-beta.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/index.cjs CHANGED
@@ -34,7 +34,8 @@ const NinetailedProvider = props => {
34
34
  buildClientContext,
35
35
  onInitProfileId,
36
36
  componentViewTrackingThreshold,
37
- storageImpl
37
+ storageImpl,
38
+ useClientSideEvaluation
38
39
  } = props;
39
40
  return new experience_js.Ninetailed({
40
41
  clientId,
@@ -50,7 +51,8 @@ const NinetailedProvider = props => {
50
51
  buildClientContext,
51
52
  onInitProfileId,
52
53
  componentViewTrackingThreshold,
53
- storageImpl
54
+ storageImpl,
55
+ useClientSideEvaluation
54
56
  });
55
57
  }, []);
56
58
  const {
@@ -251,80 +253,18 @@ const MergeTag = ({
251
253
  });
252
254
  };
253
255
 
254
- const useExperienceSelectionMiddleware = ({
255
- experiences,
256
- baseline,
257
- profile
258
- }) => {
259
- const {
260
- plugins
261
- } = useNinetailed();
262
- const [_, setCurrentTime] = React.useState(Date.now());
263
- const {
264
- addListeners,
265
- removeListeners,
266
- middleware
267
- } = React.useMemo(() => experience_js.makeExperienceSelectMiddleware({
268
- plugins,
269
- experiences,
270
- baseline,
271
- profile,
272
- onChange: () => setCurrentTime(Date.now())
273
- }), [plugins, experiences, baseline, profile]);
274
- React.useEffect(() => {
275
- addListeners();
276
- return () => {
277
- removeListeners();
278
- };
279
- }, [addListeners, removeListeners]);
280
- return middleware;
281
- };
282
-
283
256
  const useExperience = ({
284
257
  baseline,
285
258
  experiences
286
259
  }) => {
287
- const profileState = useProfile();
260
+ const ninetailed = useNinetailed();
288
261
  const hasVariants = experiences.map(experience => experience_js.selectHasExperienceVariants(experience, baseline)).reduce((acc, curr) => acc || curr, false);
289
- const {
290
- status,
291
- profile
292
- } = profileState;
293
- const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
294
- experiences,
295
- baseline,
296
- profile
297
- });
298
- const overrideResult = _a => {
299
- var {
300
- experience: originalExperience,
301
- variant: originalVariant,
302
- variantIndex: originalVariantIndex
303
- } = _a,
304
- other = __rest(_a, ["experience", "variant", "variantIndex"]);
305
- const {
306
- experience,
307
- variant,
308
- variantIndex
309
- } = experienceSelectionMiddleware({
310
- experience: originalExperience,
311
- variant: originalVariant,
312
- variantIndex: originalVariantIndex
313
- });
314
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
315
- // @ts-ignore
316
- return Object.assign(Object.assign({}, other), {
317
- audience: (experience === null || experience === void 0 ? void 0 : experience.audience) ? experience.audience : null,
318
- experience,
319
- variant,
320
- variantIndex
321
- });
322
- };
323
- const baseReturn = Object.assign(Object.assign({}, profileState), {
262
+ const [experience, setExperience] = React.useState({
324
263
  hasVariants,
325
- baseline
326
- });
327
- const emptyReturn = Object.assign(Object.assign({}, baseReturn), {
264
+ baseline,
265
+ error: null,
266
+ loading: true,
267
+ status: 'loading',
328
268
  experience: null,
329
269
  variant: baseline,
330
270
  variantIndex: 0,
@@ -332,51 +272,15 @@ const useExperience = ({
332
272
  isPersonalized: false,
333
273
  profile: null
334
274
  });
335
- if (status === 'loading') {
336
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
337
- // @ts-ignore
338
- return overrideResult(emptyReturn);
339
- }
340
- if (status === 'error') {
341
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
342
- // @ts-ignore
343
- return overrideResult(emptyReturn);
344
- }
345
- if (!profile) {
346
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
347
- // @ts-ignore
348
- return overrideResult(emptyReturn);
349
- }
350
- const experience = experience_js.selectExperience({
351
- experiences,
352
- profile
353
- });
354
- if (!experience) {
355
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
356
- // @ts-ignore
357
- return overrideResult(Object.assign(Object.assign({}, emptyReturn), {
358
- profile
359
- }));
360
- }
361
- const {
362
- variant,
363
- index
364
- } = experience_js.selectExperienceVariant({
365
- baseline,
366
- experience,
367
- profile
368
- });
369
- return overrideResult(Object.assign(Object.assign({}, baseReturn), {
370
- status: 'success',
371
- loading: false,
372
- error: null,
373
- experience,
374
- variant,
375
- variantIndex: index,
376
- audience: experience.audience ? experience.audience : null,
377
- profile,
378
- isPersonalized: true
379
- }));
275
+ React.useEffect(() => {
276
+ return ninetailed.onSelectVariant({
277
+ baseline,
278
+ experiences
279
+ }, state => {
280
+ setExperience(state);
281
+ });
282
+ }, [JSON.stringify(baseline), JSON.stringify(experiences)]);
283
+ return experience;
380
284
  };
381
285
 
382
286
  const ComponentMarker = /*#__PURE__*/React.forwardRef((_, ref) => {
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import React, { createContext, useMemo, useContext, useState, useRef, useEffect, createElement, forwardRef } from 'react';
3
- import { Ninetailed, selectVariant, makeExperienceSelectMiddleware, selectHasExperienceVariants, selectExperience, selectExperienceVariant } from '@ninetailed/experience.js';
3
+ import { Ninetailed, selectVariant, selectHasExperienceVariants } from '@ninetailed/experience.js';
4
4
  import { logger, isBrowser } from '@ninetailed/experience.js-shared';
5
5
  import { isEqual, get } from 'radash';
6
6
  import { useInView } from 'react-intersection-observer';
@@ -26,7 +26,8 @@ const NinetailedProvider = props => {
26
26
  buildClientContext,
27
27
  onInitProfileId,
28
28
  componentViewTrackingThreshold,
29
- storageImpl
29
+ storageImpl,
30
+ useClientSideEvaluation
30
31
  } = props;
31
32
  return new Ninetailed({
32
33
  clientId,
@@ -42,7 +43,8 @@ const NinetailedProvider = props => {
42
43
  buildClientContext,
43
44
  onInitProfileId,
44
45
  componentViewTrackingThreshold,
45
- storageImpl
46
+ storageImpl,
47
+ useClientSideEvaluation
46
48
  });
47
49
  }, []);
48
50
  const {
@@ -243,80 +245,18 @@ const MergeTag = ({
243
245
  });
244
246
  };
245
247
 
246
- const useExperienceSelectionMiddleware = ({
247
- experiences,
248
- baseline,
249
- profile
250
- }) => {
251
- const {
252
- plugins
253
- } = useNinetailed();
254
- const [_, setCurrentTime] = useState(Date.now());
255
- const {
256
- addListeners,
257
- removeListeners,
258
- middleware
259
- } = useMemo(() => makeExperienceSelectMiddleware({
260
- plugins,
261
- experiences,
262
- baseline,
263
- profile,
264
- onChange: () => setCurrentTime(Date.now())
265
- }), [plugins, experiences, baseline, profile]);
266
- useEffect(() => {
267
- addListeners();
268
- return () => {
269
- removeListeners();
270
- };
271
- }, [addListeners, removeListeners]);
272
- return middleware;
273
- };
274
-
275
248
  const useExperience = ({
276
249
  baseline,
277
250
  experiences
278
251
  }) => {
279
- const profileState = useProfile();
252
+ const ninetailed = useNinetailed();
280
253
  const hasVariants = experiences.map(experience => selectHasExperienceVariants(experience, baseline)).reduce((acc, curr) => acc || curr, false);
281
- const {
282
- status,
283
- profile
284
- } = profileState;
285
- const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
286
- experiences,
287
- baseline,
288
- profile
289
- });
290
- const overrideResult = _a => {
291
- var {
292
- experience: originalExperience,
293
- variant: originalVariant,
294
- variantIndex: originalVariantIndex
295
- } = _a,
296
- other = __rest(_a, ["experience", "variant", "variantIndex"]);
297
- const {
298
- experience,
299
- variant,
300
- variantIndex
301
- } = experienceSelectionMiddleware({
302
- experience: originalExperience,
303
- variant: originalVariant,
304
- variantIndex: originalVariantIndex
305
- });
306
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
307
- // @ts-ignore
308
- return Object.assign(Object.assign({}, other), {
309
- audience: (experience === null || experience === void 0 ? void 0 : experience.audience) ? experience.audience : null,
310
- experience,
311
- variant,
312
- variantIndex
313
- });
314
- };
315
- const baseReturn = Object.assign(Object.assign({}, profileState), {
254
+ const [experience, setExperience] = useState({
316
255
  hasVariants,
317
- baseline
318
- });
319
- const emptyReturn = Object.assign(Object.assign({}, baseReturn), {
256
+ baseline,
257
+ error: null,
258
+ loading: true,
259
+ status: 'loading',
320
260
  experience: null,
321
261
  variant: baseline,
322
262
  variantIndex: 0,
@@ -324,51 +264,15 @@ const useExperience = ({
324
264
  isPersonalized: false,
325
265
  profile: null
326
266
  });
327
- if (status === 'loading') {
328
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
329
- // @ts-ignore
330
- return overrideResult(emptyReturn);
331
- }
332
- if (status === 'error') {
333
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
334
- // @ts-ignore
335
- return overrideResult(emptyReturn);
336
- }
337
- if (!profile) {
338
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
339
- // @ts-ignore
340
- return overrideResult(emptyReturn);
341
- }
342
- const experience = selectExperience({
343
- experiences,
344
- profile
345
- });
346
- if (!experience) {
347
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
348
- // @ts-ignore
349
- return overrideResult(Object.assign(Object.assign({}, emptyReturn), {
350
- profile
351
- }));
352
- }
353
- const {
354
- variant,
355
- index
356
- } = selectExperienceVariant({
357
- baseline,
358
- experience,
359
- profile
360
- });
361
- return overrideResult(Object.assign(Object.assign({}, baseReturn), {
362
- status: 'success',
363
- loading: false,
364
- error: null,
365
- experience,
366
- variant,
367
- variantIndex: index,
368
- audience: experience.audience ? experience.audience : null,
369
- profile,
370
- isPersonalized: true
371
- }));
267
+ useEffect(() => {
268
+ return ninetailed.onSelectVariant({
269
+ baseline,
270
+ experiences
271
+ }, state => {
272
+ setExperience(state);
273
+ });
274
+ }, [JSON.stringify(baseline), JSON.stringify(experiences)]);
275
+ return experience;
372
276
  };
373
277
 
374
278
  const ComponentMarker = /*#__PURE__*/forwardRef((_, ref) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ninetailed/experience.js-react",
3
- "version": "7.5.0",
3
+ "version": "7.6.0-beta.1",
4
4
  "peerDependencies": {
5
5
  "react": ">=16.8.0"
6
6
  },
@@ -10,8 +10,8 @@
10
10
  "type": "module",
11
11
  "types": "./src/index.d.ts",
12
12
  "dependencies": {
13
- "@ninetailed/experience.js": "7.5.0",
14
- "@ninetailed/experience.js-shared": "7.5.0",
13
+ "@ninetailed/experience.js": "7.6.0-beta.1",
14
+ "@ninetailed/experience.js-shared": "7.6.0-beta.1",
15
15
  "radash": "10.9.0",
16
16
  "react-intersection-observer": "8.34.0",
17
17
  "react-is": "18.2.0"
@@ -1,24 +1,24 @@
1
- import { Baseline, ExperienceConfiguration, Profile, Reference, VariantRef } from '@ninetailed/experience.js';
2
- type Load<Variant extends Reference> = {
1
+ import { ExperienceConfiguration, Profile, Reference, VariantRef } from '@ninetailed/experience.js';
2
+ type Load<TBaseline extends Reference> = {
3
3
  status: 'loading';
4
4
  loading: boolean;
5
5
  hasVariants: boolean;
6
- baseline: Baseline;
6
+ baseline: TBaseline;
7
7
  experience: null;
8
- variant: Variant;
8
+ variant: TBaseline;
9
9
  variantIndex: 0;
10
10
  audience: null;
11
11
  isPersonalized: boolean;
12
12
  profile: null;
13
13
  error: null;
14
14
  };
15
- type Success<Variant extends Reference> = {
15
+ type Success<TBaseline extends Reference, TVariant extends Reference> = {
16
16
  status: 'success';
17
17
  loading: boolean;
18
18
  hasVariants: boolean;
19
- baseline: Baseline;
20
- experience: ExperienceConfiguration<Variant> | null;
21
- variant: Variant;
19
+ baseline: TBaseline;
20
+ experience: ExperienceConfiguration<TVariant> | null;
21
+ variant: TBaseline | TVariant;
22
22
  variantIndex: number;
23
23
  audience: {
24
24
  id: string;
@@ -27,23 +27,23 @@ type Success<Variant extends Reference> = {
27
27
  profile: Profile;
28
28
  error: null;
29
29
  };
30
- type Fail<Variant extends Reference> = {
30
+ type Fail<TBaseline extends Reference> = {
31
31
  status: 'error';
32
32
  loading: boolean;
33
33
  hasVariants: boolean;
34
- baseline: Baseline;
34
+ baseline: TBaseline;
35
35
  experience: null;
36
- variant: Variant;
36
+ variant: TBaseline;
37
37
  variantIndex: 0;
38
38
  audience: null;
39
39
  isPersonalized: boolean;
40
40
  profile: null;
41
41
  error: Error;
42
42
  };
43
- type UseExperienceArgs<Variant extends Reference> = {
44
- baseline: Baseline;
45
- experiences: ExperienceConfiguration<Variant>[];
43
+ type UseExperienceArgs<TBaseline extends Reference, TVariant extends Reference> = {
44
+ baseline: TBaseline;
45
+ experiences: ExperienceConfiguration<TVariant>[];
46
46
  };
47
- type UseExperienceResponse<Variant extends Reference> = Load<Variant | VariantRef> | Success<Variant | VariantRef> | Fail<Variant | VariantRef>;
48
- export declare const useExperience: <Variant extends Reference>({ baseline, experiences, }: UseExperienceArgs<Variant>) => UseExperienceResponse<Variant>;
47
+ type UseExperienceReturn<TBaseline extends Reference, TVariant extends Reference> = Load<TBaseline> | Success<TBaseline, TVariant | VariantRef> | Fail<TBaseline>;
48
+ export declare const useExperience: <TBaseline extends Reference, TVariant extends Reference>({ baseline, experiences, }: UseExperienceArgs<TBaseline, TVariant>) => UseExperienceReturn<TBaseline, TVariant>;
49
49
  export {};
@@ -1,3 +1,3 @@
1
1
  /// <reference types="react" />
2
2
  import { NinetailedInstance } from '@ninetailed/experience.js';
3
- export declare const NinetailedContext: import("react").Context<NinetailedInstance | undefined>;
3
+ export declare const NinetailedContext: import("react").Context<NinetailedInstance<import("@ninetailed/experience.js").Reference, import("@ninetailed/experience.js").Reference> | undefined>;
@@ -16,6 +16,7 @@ export type NinetailedProviderInstantiationProps = {
16
16
  buildClientContext?: () => NinetailedRequestContext;
17
17
  onInitProfileId?: OnInitProfileId;
18
18
  storageImpl?: Storage;
19
+ useClientSideEvaluation?: boolean;
19
20
  };
20
21
  export type NinetailedProviderProps = NinetailedProviderInstantiationProps | {
21
22
  ninetailed: Ninetailed;
@@ -1 +1,3 @@
1
- export declare const useNinetailed: () => import("dist/packages/sdks/javascript/src").NinetailedInstance;
1
+ import { Reference } from '@ninetailed/experience.js-shared';
2
+ import { NinetailedInstance } from '@ninetailed/experience.js';
3
+ export declare const useNinetailed: <TBaseline extends Reference = Reference, TVariant extends Reference = Reference>() => NinetailedInstance<TBaseline, TVariant>;
@@ -1,12 +0,0 @@
1
- import { ExperienceConfiguration, Profile, Reference } from '@ninetailed/experience.js-shared';
2
- type UseExperienceSelectionMiddlewareArg<Variant extends Reference> = {
3
- experiences: ExperienceConfiguration<Variant>[];
4
- baseline: Reference;
5
- profile: Profile | null;
6
- };
7
- export declare const useExperienceSelectionMiddleware: <Variant extends Reference>({ experiences, baseline, profile, }: UseExperienceSelectionMiddlewareArg<Variant>) => ({ experience, variant, variantIndex, }: import("@ninetailed/experience.js").ExperienceSelectionMiddlewareReturnArg<Variant | import("@ninetailed/experience.js-shared").VariantRef>) => {
8
- experience: ExperienceConfiguration<Variant | import("@ninetailed/experience.js-shared").VariantRef> | null;
9
- variant: Variant | import("@ninetailed/experience.js-shared").VariantRef;
10
- variantIndex: number;
11
- };
12
- export {};