@ninetailed/experience.js-react 4.2.0-beta.1 → 4.2.0-beta.10
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 +113 -99
- package/index.js +111 -92
- package/lib/MergeTag.d.ts +1 -1
- package/lib/NinetailedProvider.d.ts +12 -6
- package/lib/index.d.ts +1 -1
- package/lib/useProfile.d.ts +1 -6
- package/package.json +4 -4
package/index.cjs
CHANGED
|
@@ -7,20 +7,11 @@ var React = require('react');
|
|
|
7
7
|
var experience_js = require('@ninetailed/experience.js');
|
|
8
8
|
var reactIntersectionObserver = require('react-intersection-observer');
|
|
9
9
|
var experience_jsShared = require('@ninetailed/experience.js-shared');
|
|
10
|
-
var
|
|
11
|
-
var has$1 = require('lodash/has');
|
|
12
|
-
var _debounce = require('lodash/debounce');
|
|
13
|
-
var values$1 = require('lodash/values');
|
|
14
|
-
var get$1 = require('lodash/get');
|
|
10
|
+
var radash = require('radash');
|
|
15
11
|
|
|
16
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
17
13
|
|
|
18
14
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
19
|
-
var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
|
|
20
|
-
var has__default = /*#__PURE__*/_interopDefaultLegacy(has$1);
|
|
21
|
-
var _debounce__default = /*#__PURE__*/_interopDefaultLegacy(_debounce);
|
|
22
|
-
var values__default = /*#__PURE__*/_interopDefaultLegacy(values$1);
|
|
23
|
-
var get__default = /*#__PURE__*/_interopDefaultLegacy(get$1);
|
|
24
15
|
|
|
25
16
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
26
17
|
|
|
@@ -1914,7 +1905,7 @@ const useProfile = () => {
|
|
|
1914
1905
|
*/
|
|
1915
1906
|
React.useEffect(() => {
|
|
1916
1907
|
ninetailed.onProfileChange(profileState => {
|
|
1917
|
-
if (
|
|
1908
|
+
if (radash.isEqual(profileState, profileStateRef.current)) {
|
|
1918
1909
|
experience_jsShared.logger.debug('Profile State Did Not Change', profileState);
|
|
1919
1910
|
return;
|
|
1920
1911
|
} else {
|
|
@@ -1955,6 +1946,35 @@ const useExperiments = () => {
|
|
|
1955
1946
|
};
|
|
1956
1947
|
};
|
|
1957
1948
|
|
|
1949
|
+
const useExperienceSelectionMiddleware = ({
|
|
1950
|
+
experiences,
|
|
1951
|
+
baseline,
|
|
1952
|
+
profile
|
|
1953
|
+
}) => {
|
|
1954
|
+
const {
|
|
1955
|
+
plugins
|
|
1956
|
+
} = useNinetailed();
|
|
1957
|
+
const [_, setCurrentTime] = React.useState(Date.now());
|
|
1958
|
+
const {
|
|
1959
|
+
addListeners,
|
|
1960
|
+
removeListeners,
|
|
1961
|
+
middleware
|
|
1962
|
+
} = React.useMemo(() => experience_js.makeExperienceSelectMiddleware({
|
|
1963
|
+
plugins,
|
|
1964
|
+
experiences,
|
|
1965
|
+
baseline,
|
|
1966
|
+
profile,
|
|
1967
|
+
onChange: () => setCurrentTime(Date.now())
|
|
1968
|
+
}), [plugins, experiences, baseline, profile]);
|
|
1969
|
+
React.useEffect(() => {
|
|
1970
|
+
addListeners();
|
|
1971
|
+
return () => {
|
|
1972
|
+
removeListeners();
|
|
1973
|
+
};
|
|
1974
|
+
}, [addListeners, removeListeners]);
|
|
1975
|
+
return middleware;
|
|
1976
|
+
};
|
|
1977
|
+
|
|
1958
1978
|
const useExperience = ({
|
|
1959
1979
|
baseline,
|
|
1960
1980
|
experiences
|
|
@@ -1968,6 +1988,31 @@ const useExperience = ({
|
|
|
1968
1988
|
status,
|
|
1969
1989
|
profile
|
|
1970
1990
|
} = profileState;
|
|
1991
|
+
const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
|
|
1992
|
+
experiences,
|
|
1993
|
+
baseline,
|
|
1994
|
+
profile
|
|
1995
|
+
});
|
|
1996
|
+
const overrideResult = _a => {
|
|
1997
|
+
var {
|
|
1998
|
+
experience: originalExperience,
|
|
1999
|
+
variant: originalVariant
|
|
2000
|
+
} = _a,
|
|
2001
|
+
other = __rest(_a, ["experience", "variant"]);
|
|
2002
|
+
const {
|
|
2003
|
+
experience,
|
|
2004
|
+
variant
|
|
2005
|
+
} = experienceSelectionMiddleware({
|
|
2006
|
+
experience: originalExperience,
|
|
2007
|
+
variant: originalVariant
|
|
2008
|
+
});
|
|
2009
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2010
|
+
// @ts-ignore
|
|
2011
|
+
return Object.assign(Object.assign({}, other), {
|
|
2012
|
+
experience,
|
|
2013
|
+
variant
|
|
2014
|
+
});
|
|
2015
|
+
};
|
|
1971
2016
|
const baseReturn = Object.assign(Object.assign({}, profileState), {
|
|
1972
2017
|
hasVariants,
|
|
1973
2018
|
baseline
|
|
@@ -1982,17 +2027,17 @@ const useExperience = ({
|
|
|
1982
2027
|
if (status === 'loading') {
|
|
1983
2028
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1984
2029
|
// @ts-ignore
|
|
1985
|
-
return emptyReturn;
|
|
2030
|
+
return overrideResult(emptyReturn);
|
|
1986
2031
|
}
|
|
1987
2032
|
if (status === 'error') {
|
|
1988
2033
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1989
2034
|
// @ts-ignore
|
|
1990
|
-
return emptyReturn;
|
|
2035
|
+
return overrideResult(emptyReturn);
|
|
1991
2036
|
}
|
|
1992
2037
|
if (!profile) {
|
|
1993
2038
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1994
2039
|
// @ts-ignore
|
|
1995
|
-
return emptyReturn;
|
|
2040
|
+
return overrideResult(emptyReturn);
|
|
1996
2041
|
}
|
|
1997
2042
|
const activeExperiments = experience_js.selectActiveExperiments(experiments, profile);
|
|
1998
2043
|
const experience = experience_js.selectExperience({
|
|
@@ -2003,9 +2048,9 @@ const useExperience = ({
|
|
|
2003
2048
|
if (!experience) {
|
|
2004
2049
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2005
2050
|
// @ts-ignore
|
|
2006
|
-
return Object.assign(Object.assign({}, emptyReturn), {
|
|
2051
|
+
return overrideResult(Object.assign(Object.assign({}, emptyReturn), {
|
|
2007
2052
|
profile
|
|
2008
|
-
});
|
|
2053
|
+
}));
|
|
2009
2054
|
}
|
|
2010
2055
|
const audience = experience.audience;
|
|
2011
2056
|
const variant = experience_js.selectExperienceVariant({
|
|
@@ -2014,7 +2059,7 @@ const useExperience = ({
|
|
|
2014
2059
|
profile
|
|
2015
2060
|
});
|
|
2016
2061
|
if (!variant) {
|
|
2017
|
-
return Object.assign(Object.assign({}, baseReturn), {
|
|
2062
|
+
return overrideResult(Object.assign(Object.assign({}, baseReturn), {
|
|
2018
2063
|
status: 'success',
|
|
2019
2064
|
loading: false,
|
|
2020
2065
|
error: null,
|
|
@@ -2023,9 +2068,9 @@ const useExperience = ({
|
|
|
2023
2068
|
audience: audience ? audience : null,
|
|
2024
2069
|
profile,
|
|
2025
2070
|
isPersonalized: false
|
|
2026
|
-
});
|
|
2071
|
+
}));
|
|
2027
2072
|
}
|
|
2028
|
-
return Object.assign(Object.assign({}, baseReturn), {
|
|
2073
|
+
return overrideResult(Object.assign(Object.assign({}, baseReturn), {
|
|
2029
2074
|
status: 'success',
|
|
2030
2075
|
loading: false,
|
|
2031
2076
|
error: null,
|
|
@@ -2034,7 +2079,7 @@ const useExperience = ({
|
|
|
2034
2079
|
audience: audience ? audience : null,
|
|
2035
2080
|
profile,
|
|
2036
2081
|
isPersonalized: true
|
|
2037
|
-
});
|
|
2082
|
+
}));
|
|
2038
2083
|
};
|
|
2039
2084
|
|
|
2040
2085
|
const useJoinExperiment = () => {
|
|
@@ -2042,35 +2087,6 @@ const useJoinExperiment = () => {
|
|
|
2042
2087
|
return context.joinExperiment;
|
|
2043
2088
|
};
|
|
2044
2089
|
|
|
2045
|
-
const useExperienceSelectionMiddleware = ({
|
|
2046
|
-
experiences,
|
|
2047
|
-
baseline,
|
|
2048
|
-
profile
|
|
2049
|
-
}) => {
|
|
2050
|
-
const {
|
|
2051
|
-
plugins
|
|
2052
|
-
} = useNinetailed();
|
|
2053
|
-
const [_, setCurrentTime] = React.useState(Date.now());
|
|
2054
|
-
const {
|
|
2055
|
-
addListeners,
|
|
2056
|
-
removeListeners,
|
|
2057
|
-
middleware
|
|
2058
|
-
} = React.useMemo(() => experience_js.makeExperienceSelectMiddleware({
|
|
2059
|
-
plugins,
|
|
2060
|
-
experiences,
|
|
2061
|
-
baseline,
|
|
2062
|
-
profile,
|
|
2063
|
-
onChange: () => setCurrentTime(Date.now())
|
|
2064
|
-
}), [plugins, experiences, baseline, profile]);
|
|
2065
|
-
React.useEffect(() => {
|
|
2066
|
-
addListeners();
|
|
2067
|
-
return () => {
|
|
2068
|
-
removeListeners();
|
|
2069
|
-
};
|
|
2070
|
-
}, [addListeners, removeListeners]);
|
|
2071
|
-
return middleware;
|
|
2072
|
-
};
|
|
2073
|
-
|
|
2074
2090
|
const DefaultExperienceLoadingComponent = _a => {
|
|
2075
2091
|
var {
|
|
2076
2092
|
component: Component,
|
|
@@ -2128,8 +2144,8 @@ const Experience = _a => {
|
|
|
2128
2144
|
const {
|
|
2129
2145
|
status,
|
|
2130
2146
|
hasVariants,
|
|
2131
|
-
experience
|
|
2132
|
-
variant
|
|
2147
|
+
experience,
|
|
2148
|
+
variant,
|
|
2133
2149
|
audience,
|
|
2134
2150
|
isPersonalized,
|
|
2135
2151
|
profile
|
|
@@ -2137,18 +2153,6 @@ const Experience = _a => {
|
|
|
2137
2153
|
baseline,
|
|
2138
2154
|
experiences
|
|
2139
2155
|
});
|
|
2140
|
-
const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
|
|
2141
|
-
experiences,
|
|
2142
|
-
baseline,
|
|
2143
|
-
profile
|
|
2144
|
-
});
|
|
2145
|
-
const {
|
|
2146
|
-
experience,
|
|
2147
|
-
variant
|
|
2148
|
-
} = experienceSelectionMiddleware({
|
|
2149
|
-
experience: originalExperience,
|
|
2150
|
-
variant: originalVariant
|
|
2151
|
-
});
|
|
2152
2156
|
const joinExperiment = useJoinExperiment();
|
|
2153
2157
|
React.useEffect(() => {
|
|
2154
2158
|
if (status === 'success' && experience && profile) {
|
|
@@ -2250,7 +2254,7 @@ const ESRLoadingComponent = _a => {
|
|
|
2250
2254
|
const {
|
|
2251
2255
|
experienceVariantsMap
|
|
2252
2256
|
} = useESR();
|
|
2253
|
-
const experience = experiences.find(experience =>
|
|
2257
|
+
const experience = experiences.find(experience => Object.prototype.hasOwnProperty.call(experienceVariantsMap, experience.id));
|
|
2254
2258
|
if (!experience) {
|
|
2255
2259
|
return jsxRuntime.jsx(Component, Object.assign({}, passthroughProps, baseline, {
|
|
2256
2260
|
ninetailed: {
|
|
@@ -2305,14 +2309,16 @@ const ESRLoadingComponent = _a => {
|
|
|
2305
2309
|
|
|
2306
2310
|
const EXPERIENCE_TRAIT_PREFIX = 'nt_experiment_';
|
|
2307
2311
|
|
|
2308
|
-
const debounce = (fn, wait
|
|
2312
|
+
const debounce = (fn, wait) => {
|
|
2309
2313
|
let debouncedArgs = [];
|
|
2310
|
-
const debouncedFn =
|
|
2314
|
+
const debouncedFn = radash.debounce({
|
|
2315
|
+
delay: wait !== null && wait !== void 0 ? wait : 0
|
|
2316
|
+
}, () => {
|
|
2311
2317
|
fn.call(undefined, debouncedArgs);
|
|
2312
2318
|
debouncedArgs = [];
|
|
2313
|
-
}
|
|
2319
|
+
});
|
|
2314
2320
|
return (...args) => {
|
|
2315
|
-
debouncedArgs.push(
|
|
2321
|
+
debouncedArgs.push(args);
|
|
2316
2322
|
debouncedFn();
|
|
2317
2323
|
};
|
|
2318
2324
|
};
|
|
@@ -2374,39 +2380,47 @@ const ExperimentsProvider = ({
|
|
|
2374
2380
|
}));
|
|
2375
2381
|
};
|
|
2376
2382
|
|
|
2377
|
-
const NinetailedProvider =
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2383
|
+
const NinetailedProvider = props => {
|
|
2384
|
+
const ninetailed = React.useMemo(() => {
|
|
2385
|
+
if ('ninetailed' in props) {
|
|
2386
|
+
return props.ninetailed;
|
|
2387
|
+
}
|
|
2388
|
+
const {
|
|
2389
|
+
clientId,
|
|
2390
|
+
environment,
|
|
2391
|
+
preview,
|
|
2392
|
+
url,
|
|
2393
|
+
profile,
|
|
2394
|
+
locale,
|
|
2395
|
+
requestTimeout,
|
|
2396
|
+
plugins = [],
|
|
2397
|
+
onLog,
|
|
2398
|
+
onError
|
|
2399
|
+
} = props;
|
|
2400
|
+
return new experience_js.Ninetailed({
|
|
2401
|
+
clientId,
|
|
2402
|
+
environment,
|
|
2403
|
+
preview
|
|
2404
|
+
}, {
|
|
2405
|
+
url,
|
|
2406
|
+
plugins,
|
|
2407
|
+
profile,
|
|
2408
|
+
locale,
|
|
2409
|
+
requestTimeout,
|
|
2410
|
+
onLog,
|
|
2411
|
+
onError
|
|
2412
|
+
});
|
|
2413
|
+
}, []);
|
|
2414
|
+
const {
|
|
2415
|
+
experiments = [],
|
|
2416
|
+
maximumActiveExperiments,
|
|
2417
|
+
children
|
|
2418
|
+
} = props;
|
|
2405
2419
|
return jsxRuntime.jsx(NinetailedContext.Provider, Object.assign({
|
|
2406
2420
|
value: ninetailed
|
|
2407
2421
|
}, {
|
|
2408
2422
|
children: jsxRuntime.jsx(ExperimentsProvider, Object.assign({
|
|
2409
|
-
experiments:
|
|
2423
|
+
experiments: experiments,
|
|
2410
2424
|
maximumActiveExperiments: maximumActiveExperiments
|
|
2411
2425
|
}, {
|
|
2412
2426
|
children: children
|
|
@@ -2516,11 +2530,11 @@ const generateSelectors = id => {
|
|
|
2516
2530
|
};
|
|
2517
2531
|
const selectValueFromProfile = (profile, id) => {
|
|
2518
2532
|
const selectors = generateSelectors(id);
|
|
2519
|
-
const matchingSelector = selectors.find(selector =>
|
|
2533
|
+
const matchingSelector = selectors.find(selector => radash.get(profile, selector));
|
|
2520
2534
|
if (!matchingSelector) {
|
|
2521
2535
|
return null;
|
|
2522
2536
|
}
|
|
2523
|
-
return
|
|
2537
|
+
return radash.get(profile, matchingSelector);
|
|
2524
2538
|
};
|
|
2525
2539
|
const MergeTag = ({
|
|
2526
2540
|
id
|
package/index.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React, { createContext, useContext, useEffect, useState, useRef, useMemo, createElement as createElement$1, useCallback } from 'react';
|
|
3
|
-
import { selectDistribution, selectHasExperienceVariants, selectActiveExperiments, selectExperience, selectExperienceVariant,
|
|
3
|
+
import { selectDistribution, makeExperienceSelectMiddleware, selectHasExperienceVariants, selectActiveExperiments, selectExperience, selectExperienceVariant, Ninetailed, selectVariant } from '@ninetailed/experience.js';
|
|
4
4
|
import { useInView } from 'react-intersection-observer';
|
|
5
5
|
import { isBrowser, logger } from '@ninetailed/experience.js-shared';
|
|
6
|
-
import isEqual from '
|
|
7
|
-
import has$1 from 'lodash/has';
|
|
8
|
-
import _debounce from 'lodash/debounce';
|
|
9
|
-
import values$1 from 'lodash/values';
|
|
10
|
-
import get$1 from 'lodash/get';
|
|
6
|
+
import { isEqual, debounce as debounce$1, get as get$1 } from 'radash';
|
|
11
7
|
|
|
12
8
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
13
9
|
|
|
@@ -1942,6 +1938,35 @@ const useExperiments = () => {
|
|
|
1942
1938
|
};
|
|
1943
1939
|
};
|
|
1944
1940
|
|
|
1941
|
+
const useExperienceSelectionMiddleware = ({
|
|
1942
|
+
experiences,
|
|
1943
|
+
baseline,
|
|
1944
|
+
profile
|
|
1945
|
+
}) => {
|
|
1946
|
+
const {
|
|
1947
|
+
plugins
|
|
1948
|
+
} = useNinetailed();
|
|
1949
|
+
const [_, setCurrentTime] = useState(Date.now());
|
|
1950
|
+
const {
|
|
1951
|
+
addListeners,
|
|
1952
|
+
removeListeners,
|
|
1953
|
+
middleware
|
|
1954
|
+
} = useMemo(() => makeExperienceSelectMiddleware({
|
|
1955
|
+
plugins,
|
|
1956
|
+
experiences,
|
|
1957
|
+
baseline,
|
|
1958
|
+
profile,
|
|
1959
|
+
onChange: () => setCurrentTime(Date.now())
|
|
1960
|
+
}), [plugins, experiences, baseline, profile]);
|
|
1961
|
+
useEffect(() => {
|
|
1962
|
+
addListeners();
|
|
1963
|
+
return () => {
|
|
1964
|
+
removeListeners();
|
|
1965
|
+
};
|
|
1966
|
+
}, [addListeners, removeListeners]);
|
|
1967
|
+
return middleware;
|
|
1968
|
+
};
|
|
1969
|
+
|
|
1945
1970
|
const useExperience = ({
|
|
1946
1971
|
baseline,
|
|
1947
1972
|
experiences
|
|
@@ -1955,6 +1980,31 @@ const useExperience = ({
|
|
|
1955
1980
|
status,
|
|
1956
1981
|
profile
|
|
1957
1982
|
} = profileState;
|
|
1983
|
+
const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
|
|
1984
|
+
experiences,
|
|
1985
|
+
baseline,
|
|
1986
|
+
profile
|
|
1987
|
+
});
|
|
1988
|
+
const overrideResult = _a => {
|
|
1989
|
+
var {
|
|
1990
|
+
experience: originalExperience,
|
|
1991
|
+
variant: originalVariant
|
|
1992
|
+
} = _a,
|
|
1993
|
+
other = __rest(_a, ["experience", "variant"]);
|
|
1994
|
+
const {
|
|
1995
|
+
experience,
|
|
1996
|
+
variant
|
|
1997
|
+
} = experienceSelectionMiddleware({
|
|
1998
|
+
experience: originalExperience,
|
|
1999
|
+
variant: originalVariant
|
|
2000
|
+
});
|
|
2001
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
2002
|
+
// @ts-ignore
|
|
2003
|
+
return Object.assign(Object.assign({}, other), {
|
|
2004
|
+
experience,
|
|
2005
|
+
variant
|
|
2006
|
+
});
|
|
2007
|
+
};
|
|
1958
2008
|
const baseReturn = Object.assign(Object.assign({}, profileState), {
|
|
1959
2009
|
hasVariants,
|
|
1960
2010
|
baseline
|
|
@@ -1969,17 +2019,17 @@ const useExperience = ({
|
|
|
1969
2019
|
if (status === 'loading') {
|
|
1970
2020
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1971
2021
|
// @ts-ignore
|
|
1972
|
-
return emptyReturn;
|
|
2022
|
+
return overrideResult(emptyReturn);
|
|
1973
2023
|
}
|
|
1974
2024
|
if (status === 'error') {
|
|
1975
2025
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1976
2026
|
// @ts-ignore
|
|
1977
|
-
return emptyReturn;
|
|
2027
|
+
return overrideResult(emptyReturn);
|
|
1978
2028
|
}
|
|
1979
2029
|
if (!profile) {
|
|
1980
2030
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1981
2031
|
// @ts-ignore
|
|
1982
|
-
return emptyReturn;
|
|
2032
|
+
return overrideResult(emptyReturn);
|
|
1983
2033
|
}
|
|
1984
2034
|
const activeExperiments = selectActiveExperiments(experiments, profile);
|
|
1985
2035
|
const experience = selectExperience({
|
|
@@ -1990,9 +2040,9 @@ const useExperience = ({
|
|
|
1990
2040
|
if (!experience) {
|
|
1991
2041
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
1992
2042
|
// @ts-ignore
|
|
1993
|
-
return Object.assign(Object.assign({}, emptyReturn), {
|
|
2043
|
+
return overrideResult(Object.assign(Object.assign({}, emptyReturn), {
|
|
1994
2044
|
profile
|
|
1995
|
-
});
|
|
2045
|
+
}));
|
|
1996
2046
|
}
|
|
1997
2047
|
const audience = experience.audience;
|
|
1998
2048
|
const variant = selectExperienceVariant({
|
|
@@ -2001,7 +2051,7 @@ const useExperience = ({
|
|
|
2001
2051
|
profile
|
|
2002
2052
|
});
|
|
2003
2053
|
if (!variant) {
|
|
2004
|
-
return Object.assign(Object.assign({}, baseReturn), {
|
|
2054
|
+
return overrideResult(Object.assign(Object.assign({}, baseReturn), {
|
|
2005
2055
|
status: 'success',
|
|
2006
2056
|
loading: false,
|
|
2007
2057
|
error: null,
|
|
@@ -2010,9 +2060,9 @@ const useExperience = ({
|
|
|
2010
2060
|
audience: audience ? audience : null,
|
|
2011
2061
|
profile,
|
|
2012
2062
|
isPersonalized: false
|
|
2013
|
-
});
|
|
2063
|
+
}));
|
|
2014
2064
|
}
|
|
2015
|
-
return Object.assign(Object.assign({}, baseReturn), {
|
|
2065
|
+
return overrideResult(Object.assign(Object.assign({}, baseReturn), {
|
|
2016
2066
|
status: 'success',
|
|
2017
2067
|
loading: false,
|
|
2018
2068
|
error: null,
|
|
@@ -2021,7 +2071,7 @@ const useExperience = ({
|
|
|
2021
2071
|
audience: audience ? audience : null,
|
|
2022
2072
|
profile,
|
|
2023
2073
|
isPersonalized: true
|
|
2024
|
-
});
|
|
2074
|
+
}));
|
|
2025
2075
|
};
|
|
2026
2076
|
|
|
2027
2077
|
const useJoinExperiment = () => {
|
|
@@ -2029,35 +2079,6 @@ const useJoinExperiment = () => {
|
|
|
2029
2079
|
return context.joinExperiment;
|
|
2030
2080
|
};
|
|
2031
2081
|
|
|
2032
|
-
const useExperienceSelectionMiddleware = ({
|
|
2033
|
-
experiences,
|
|
2034
|
-
baseline,
|
|
2035
|
-
profile
|
|
2036
|
-
}) => {
|
|
2037
|
-
const {
|
|
2038
|
-
plugins
|
|
2039
|
-
} = useNinetailed();
|
|
2040
|
-
const [_, setCurrentTime] = useState(Date.now());
|
|
2041
|
-
const {
|
|
2042
|
-
addListeners,
|
|
2043
|
-
removeListeners,
|
|
2044
|
-
middleware
|
|
2045
|
-
} = useMemo(() => makeExperienceSelectMiddleware({
|
|
2046
|
-
plugins,
|
|
2047
|
-
experiences,
|
|
2048
|
-
baseline,
|
|
2049
|
-
profile,
|
|
2050
|
-
onChange: () => setCurrentTime(Date.now())
|
|
2051
|
-
}), [plugins, experiences, baseline, profile]);
|
|
2052
|
-
useEffect(() => {
|
|
2053
|
-
addListeners();
|
|
2054
|
-
return () => {
|
|
2055
|
-
removeListeners();
|
|
2056
|
-
};
|
|
2057
|
-
}, [addListeners, removeListeners]);
|
|
2058
|
-
return middleware;
|
|
2059
|
-
};
|
|
2060
|
-
|
|
2061
2082
|
const DefaultExperienceLoadingComponent = _a => {
|
|
2062
2083
|
var {
|
|
2063
2084
|
component: Component,
|
|
@@ -2115,8 +2136,8 @@ const Experience = _a => {
|
|
|
2115
2136
|
const {
|
|
2116
2137
|
status,
|
|
2117
2138
|
hasVariants,
|
|
2118
|
-
experience
|
|
2119
|
-
variant
|
|
2139
|
+
experience,
|
|
2140
|
+
variant,
|
|
2120
2141
|
audience,
|
|
2121
2142
|
isPersonalized,
|
|
2122
2143
|
profile
|
|
@@ -2124,18 +2145,6 @@ const Experience = _a => {
|
|
|
2124
2145
|
baseline,
|
|
2125
2146
|
experiences
|
|
2126
2147
|
});
|
|
2127
|
-
const experienceSelectionMiddleware = useExperienceSelectionMiddleware({
|
|
2128
|
-
experiences,
|
|
2129
|
-
baseline,
|
|
2130
|
-
profile
|
|
2131
|
-
});
|
|
2132
|
-
const {
|
|
2133
|
-
experience,
|
|
2134
|
-
variant
|
|
2135
|
-
} = experienceSelectionMiddleware({
|
|
2136
|
-
experience: originalExperience,
|
|
2137
|
-
variant: originalVariant
|
|
2138
|
-
});
|
|
2139
2148
|
const joinExperiment = useJoinExperiment();
|
|
2140
2149
|
useEffect(() => {
|
|
2141
2150
|
if (status === 'success' && experience && profile) {
|
|
@@ -2237,7 +2246,7 @@ const ESRLoadingComponent = _a => {
|
|
|
2237
2246
|
const {
|
|
2238
2247
|
experienceVariantsMap
|
|
2239
2248
|
} = useESR();
|
|
2240
|
-
const experience = experiences.find(experience =>
|
|
2249
|
+
const experience = experiences.find(experience => Object.prototype.hasOwnProperty.call(experienceVariantsMap, experience.id));
|
|
2241
2250
|
if (!experience) {
|
|
2242
2251
|
return jsx(Component, Object.assign({}, passthroughProps, baseline, {
|
|
2243
2252
|
ninetailed: {
|
|
@@ -2292,14 +2301,16 @@ const ESRLoadingComponent = _a => {
|
|
|
2292
2301
|
|
|
2293
2302
|
const EXPERIENCE_TRAIT_PREFIX = 'nt_experiment_';
|
|
2294
2303
|
|
|
2295
|
-
const debounce = (fn, wait
|
|
2304
|
+
const debounce = (fn, wait) => {
|
|
2296
2305
|
let debouncedArgs = [];
|
|
2297
|
-
const debouncedFn =
|
|
2306
|
+
const debouncedFn = debounce$1({
|
|
2307
|
+
delay: wait !== null && wait !== void 0 ? wait : 0
|
|
2308
|
+
}, () => {
|
|
2298
2309
|
fn.call(undefined, debouncedArgs);
|
|
2299
2310
|
debouncedArgs = [];
|
|
2300
|
-
}
|
|
2311
|
+
});
|
|
2301
2312
|
return (...args) => {
|
|
2302
|
-
debouncedArgs.push(
|
|
2313
|
+
debouncedArgs.push(args);
|
|
2303
2314
|
debouncedFn();
|
|
2304
2315
|
};
|
|
2305
2316
|
};
|
|
@@ -2361,39 +2372,47 @@ const ExperimentsProvider = ({
|
|
|
2361
2372
|
}));
|
|
2362
2373
|
};
|
|
2363
2374
|
|
|
2364
|
-
const NinetailedProvider =
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2375
|
+
const NinetailedProvider = props => {
|
|
2376
|
+
const ninetailed = useMemo(() => {
|
|
2377
|
+
if ('ninetailed' in props) {
|
|
2378
|
+
return props.ninetailed;
|
|
2379
|
+
}
|
|
2380
|
+
const {
|
|
2381
|
+
clientId,
|
|
2382
|
+
environment,
|
|
2383
|
+
preview,
|
|
2384
|
+
url,
|
|
2385
|
+
profile,
|
|
2386
|
+
locale,
|
|
2387
|
+
requestTimeout,
|
|
2388
|
+
plugins = [],
|
|
2389
|
+
onLog,
|
|
2390
|
+
onError
|
|
2391
|
+
} = props;
|
|
2392
|
+
return new Ninetailed({
|
|
2393
|
+
clientId,
|
|
2394
|
+
environment,
|
|
2395
|
+
preview
|
|
2396
|
+
}, {
|
|
2397
|
+
url,
|
|
2398
|
+
plugins,
|
|
2399
|
+
profile,
|
|
2400
|
+
locale,
|
|
2401
|
+
requestTimeout,
|
|
2402
|
+
onLog,
|
|
2403
|
+
onError
|
|
2404
|
+
});
|
|
2405
|
+
}, []);
|
|
2406
|
+
const {
|
|
2407
|
+
experiments = [],
|
|
2408
|
+
maximumActiveExperiments,
|
|
2409
|
+
children
|
|
2410
|
+
} = props;
|
|
2392
2411
|
return jsx(NinetailedContext.Provider, Object.assign({
|
|
2393
2412
|
value: ninetailed
|
|
2394
2413
|
}, {
|
|
2395
2414
|
children: jsx(ExperimentsProvider, Object.assign({
|
|
2396
|
-
experiments:
|
|
2415
|
+
experiments: experiments,
|
|
2397
2416
|
maximumActiveExperiments: maximumActiveExperiments
|
|
2398
2417
|
}, {
|
|
2399
2418
|
children: children
|
package/lib/MergeTag.d.ts
CHANGED
|
@@ -4,6 +4,6 @@ type MergeTagProps = {
|
|
|
4
4
|
id: string;
|
|
5
5
|
};
|
|
6
6
|
export declare const generateSelectors: (id: string) => string[];
|
|
7
|
-
export declare const selectValueFromProfile: (profile: Profile, id: string) =>
|
|
7
|
+
export declare const selectValueFromProfile: (profile: Profile, id: string) => unknown;
|
|
8
8
|
export declare const MergeTag: React.FC<React.PropsWithChildren<MergeTagProps>>;
|
|
9
9
|
export {};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { NinetailedPlugin, ExperienceConfiguration } from '@ninetailed/experience.js';
|
|
2
|
+
import { Ninetailed, NinetailedPlugin, ExperienceConfiguration } from '@ninetailed/experience.js';
|
|
3
3
|
import { Profile, Locale, OnErrorHandler, OnLogHandler } from '@ninetailed/experience.js-shared';
|
|
4
|
-
|
|
5
|
-
clientId: string;
|
|
6
|
-
environment?: string;
|
|
4
|
+
type ExperimentProviderProps = {
|
|
7
5
|
experiments?: ExperienceConfiguration<any>[];
|
|
8
6
|
maximumActiveExperiments?: number;
|
|
7
|
+
};
|
|
8
|
+
export type NinetailedProviderInstantiationProps = {
|
|
9
|
+
clientId: string;
|
|
10
|
+
environment?: string;
|
|
9
11
|
preview?: boolean;
|
|
10
12
|
url?: string;
|
|
11
13
|
plugins?: (NinetailedPlugin | NinetailedPlugin[])[];
|
|
@@ -14,5 +16,9 @@ export type NinetailedProviderProps = {
|
|
|
14
16
|
requestTimeout?: number;
|
|
15
17
|
onLog?: OnLogHandler;
|
|
16
18
|
onError?: OnErrorHandler;
|
|
17
|
-
};
|
|
18
|
-
export
|
|
19
|
+
} & ExperimentProviderProps;
|
|
20
|
+
export type NinetailedProviderProps = NinetailedProviderInstantiationProps | ({
|
|
21
|
+
ninetailed: Ninetailed;
|
|
22
|
+
} & ExperimentProviderProps);
|
|
23
|
+
export declare const NinetailedProvider: (props: React.PropsWithChildren<NinetailedProviderProps>) => JSX.Element;
|
|
24
|
+
export {};
|
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type { Profile, Variant } from '@ninetailed/experience.js-shared';
|
|
2
2
|
export type { ExperienceConfiguration, ExperienceType, EXPERIENCE_TRAIT_PREFIX, } from '@ninetailed/experience.js';
|
|
3
3
|
export { NinetailedProvider } from './NinetailedProvider';
|
|
4
|
-
export type { NinetailedProviderProps } from './NinetailedProvider';
|
|
4
|
+
export type { NinetailedProviderProps, NinetailedProviderInstantiationProps, } from './NinetailedProvider';
|
|
5
5
|
export { useNinetailed } from './useNinetailed';
|
|
6
6
|
export { useProfile } from './useProfile';
|
|
7
7
|
export { usePersonalize } from './usePersonalize';
|
package/lib/useProfile.d.ts
CHANGED
|
@@ -41,12 +41,7 @@ export declare const useProfile: () => {
|
|
|
41
41
|
averageSessionLength: number;
|
|
42
42
|
};
|
|
43
43
|
};
|
|
44
|
-
error: null;
|
|
45
|
-
* This effect compares the old and new profile state before updating it.
|
|
46
|
-
* We use a ref to avoid an infinite loop which can happen when an empty profile state was updated with no changes.
|
|
47
|
-
* This behaviour occurred as the validation handling on the error property was not set properly in the "CreateProfile" and "UpdateProfile" endpoint types.
|
|
48
|
-
* Furthermore, it was also observed, that it "only" occurred when the preview plugin was used in parallel.
|
|
49
|
-
*/
|
|
44
|
+
error: null;
|
|
50
45
|
} | {
|
|
51
46
|
loading: boolean;
|
|
52
47
|
from: "api" | "hydrated";
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ninetailed/experience.js-react",
|
|
3
|
-
"version": "4.2.0-beta.
|
|
3
|
+
"version": "4.2.0-beta.10",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"react": ">=16.8.0"
|
|
6
6
|
},
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@analytics/google-analytics": "0.5.3",
|
|
9
9
|
"react-visibility-sensor": "5.1.1",
|
|
10
|
-
"
|
|
11
|
-
"@ninetailed/experience.js": "4.2.0-beta.1",
|
|
10
|
+
"@ninetailed/experience.js": "4.2.0-beta.10",
|
|
12
11
|
"react-intersection-observer": "8.34.0",
|
|
13
|
-
"@ninetailed/experience.js-shared": "4.2.0-beta.
|
|
12
|
+
"@ninetailed/experience.js-shared": "4.2.0-beta.10",
|
|
13
|
+
"radash": "10.9.0",
|
|
14
14
|
"analytics": "0.8.1"
|
|
15
15
|
},
|
|
16
16
|
"module": "./index.js",
|