@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 +19 -115
- package/index.js +20 -116
- package/package.json +3 -3
- package/src/lib/Experience/useExperience.d.ts +16 -16
- package/src/lib/NinetailedContext.d.ts +1 -1
- package/src/lib/NinetailedProvider.d.ts +1 -0
- package/src/lib/useNinetailed.d.ts +3 -1
- package/src/lib/Experience/useExperienceSelectionMiddleware.d.ts +0 -12
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
|
|
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
|
-
|
|
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
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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.
|
|
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.
|
|
14
|
-
"@ninetailed/experience.js-shared": "7.
|
|
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 {
|
|
2
|
-
type Load<
|
|
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:
|
|
6
|
+
baseline: TBaseline;
|
|
7
7
|
experience: null;
|
|
8
|
-
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<
|
|
15
|
+
type Success<TBaseline extends Reference, TVariant extends Reference> = {
|
|
16
16
|
status: 'success';
|
|
17
17
|
loading: boolean;
|
|
18
18
|
hasVariants: boolean;
|
|
19
|
-
baseline:
|
|
20
|
-
experience: ExperienceConfiguration<
|
|
21
|
-
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<
|
|
30
|
+
type Fail<TBaseline extends Reference> = {
|
|
31
31
|
status: 'error';
|
|
32
32
|
loading: boolean;
|
|
33
33
|
hasVariants: boolean;
|
|
34
|
-
baseline:
|
|
34
|
+
baseline: TBaseline;
|
|
35
35
|
experience: null;
|
|
36
|
-
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<
|
|
44
|
-
baseline:
|
|
45
|
-
experiences: ExperienceConfiguration<
|
|
43
|
+
type UseExperienceArgs<TBaseline extends Reference, TVariant extends Reference> = {
|
|
44
|
+
baseline: TBaseline;
|
|
45
|
+
experiences: ExperienceConfiguration<TVariant>[];
|
|
46
46
|
};
|
|
47
|
-
type
|
|
48
|
-
export declare const useExperience: <
|
|
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
|
-
|
|
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 {};
|