@ninetailed/experience.js-react 1.0.0 → 1.0.1-beta.0

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.esm.js CHANGED
@@ -1,6 +1,6 @@
1
- import React, { createContext, useMemo, useContext, useState, useEffect, useCallback, useRef } from 'react';
1
+ import React, { createContext, useMemo, useContext, useState, useEffect } from 'react';
2
2
  import { Ninetailed, selectVariant } from '@ninetailed/experience.js';
3
- import VisibilitySensor from 'react-visibility-sensor';
3
+ import { useInView } from 'react-intersection-observer';
4
4
  import { isBrowser } from '@ninetailed/experience.js-shared';
5
5
  import get$1 from 'lodash/get';
6
6
 
@@ -1631,6 +1631,33 @@ const usePersonalize = (baseline, variants, options = {
1631
1631
  return selectVariant(baseline, variants, profile, options);
1632
1632
  };
1633
1633
 
1634
+ const TrackHasSeen = ({
1635
+ children,
1636
+ variant,
1637
+ audience,
1638
+ isPersonalized
1639
+ }) => {
1640
+ const ninetailed = useNinetailed();
1641
+ const {
1642
+ ref,
1643
+ inView
1644
+ } = useInView({
1645
+ triggerOnce: true
1646
+ });
1647
+ useEffect(() => {
1648
+ if (isBrowser() && inView) {
1649
+ ninetailed.trackHasSeenComponent({
1650
+ variant,
1651
+ audience,
1652
+ isPersonalized
1653
+ });
1654
+ }
1655
+ }, [inView]);
1656
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1657
+ ref: ref
1658
+ }), children);
1659
+ };
1660
+
1634
1661
  const Personalize = _a => {
1635
1662
  var {
1636
1663
  component: Component,
@@ -1640,7 +1667,6 @@ const Personalize = _a => {
1640
1667
  } = _a,
1641
1668
  baseline = __rest(_a, ["component", "loadingComponent", "variants", "holdout"]);
1642
1669
 
1643
- const ninetailed = useNinetailed();
1644
1670
  const {
1645
1671
  loading,
1646
1672
  variant,
@@ -1649,24 +1675,7 @@ const Personalize = _a => {
1649
1675
  } = usePersonalize(baseline, variants, {
1650
1676
  holdout
1651
1677
  });
1652
- const [isVisible, setIsVisible] = useState(false);
1653
- const onChangeVisibility = useCallback(visibility => {
1654
- if (visibility) {
1655
- setIsVisible(true);
1656
- }
1657
- }, []);
1658
- const trackCallFired = useRef(false);
1659
1678
  const hasVariants = variants.length > 0;
1660
- useEffect(() => {
1661
- if (isBrowser() && hasVariants && !loading && isVisible && variant && audience && audience.id !== 'baseline' && !trackCallFired.current) {
1662
- ninetailed.trackHasSeenComponent({
1663
- variant,
1664
- audience,
1665
- isPersonalized
1666
- });
1667
- trackCallFired.current = true;
1668
- }
1669
- }, [loading, isVisible, variant, baseline, isPersonalized]);
1670
1679
 
1671
1680
  if (!hasVariants) {
1672
1681
  return /*#__PURE__*/React.createElement(Component, Object.assign({}, baseline, {
@@ -1695,11 +1704,12 @@ const Personalize = _a => {
1695
1704
  })));
1696
1705
  }
1697
1706
 
1698
- return /*#__PURE__*/React.createElement(VisibilitySensor, {
1699
- key: `${audience.id}-${variant.id}`,
1700
- partialVisibility: true,
1701
- onChange: onChangeVisibility
1707
+ return /*#__PURE__*/React.createElement(TrackHasSeen, {
1708
+ variant: variant,
1709
+ audience: audience,
1710
+ isPersonalized: isPersonalized
1702
1711
  }, /*#__PURE__*/React.createElement(Component, Object.assign({}, variant, {
1712
+ key: `${audience.id}-${variant.id}`,
1703
1713
  ninetailed: {
1704
1714
  isPersonalized,
1705
1715
  audience
package/index.umd.js CHANGED
@@ -1,13 +1,12 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@ninetailed/experience.js'), require('react-visibility-sensor'), require('@ninetailed/experience.js-shared'), require('lodash/get')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react', '@ninetailed/experience.js', 'react-visibility-sensor', '@ninetailed/experience.js-shared', 'lodash/get'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.React = {}, global.React, global.experience_js, global.VisibilitySensor, global.experience_jsShared, global.get$1));
5
- })(this, (function (exports, React, experience_js, VisibilitySensor, experience_jsShared, get$1) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@ninetailed/experience.js'), require('react-intersection-observer'), require('@ninetailed/experience.js-shared'), require('lodash/get')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'react', '@ninetailed/experience.js', 'react-intersection-observer', '@ninetailed/experience.js-shared', 'lodash/get'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.React = {}, global.React, global.experience_js, global.reactIntersectionObserver, global.experience_jsShared, global.get$1));
5
+ })(this, (function (exports, React, experience_js, reactIntersectionObserver, experience_jsShared, get$1) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
9
9
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
10
- var VisibilitySensor__default = /*#__PURE__*/_interopDefaultLegacy(VisibilitySensor);
11
10
  var get__default = /*#__PURE__*/_interopDefaultLegacy(get$1);
12
11
 
13
12
  var NinetailedContext = /*#__PURE__*/React.createContext(undefined);
@@ -113,6 +112,33 @@
113
112
  return experience_js.selectVariant(baseline, variants, profile, options);
114
113
  };
115
114
 
115
+ var TrackHasSeen = function TrackHasSeen(_a) {
116
+ var children = _a.children,
117
+ variant = _a.variant,
118
+ audience = _a.audience,
119
+ isPersonalized = _a.isPersonalized;
120
+ var ninetailed = useNinetailed();
121
+
122
+ var _b = reactIntersectionObserver.useInView({
123
+ triggerOnce: true
124
+ }),
125
+ ref = _b.ref,
126
+ inView = _b.inView;
127
+
128
+ React.useEffect(function () {
129
+ if (experience_jsShared.isBrowser() && inView) {
130
+ ninetailed.trackHasSeenComponent({
131
+ variant: variant,
132
+ audience: audience,
133
+ isPersonalized: isPersonalized
134
+ });
135
+ }
136
+ }, [inView]);
137
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
138
+ ref: ref
139
+ }), children);
140
+ };
141
+
116
142
  var Personalize = function Personalize(_a) {
117
143
  var Component = _a.component,
118
144
  LoadingComponent = _a.loadingComponent,
@@ -122,8 +148,6 @@
122
148
  holdout = _c === void 0 ? -1 : _c,
123
149
  baseline = __rest(_a, ["component", "loadingComponent", "variants", "holdout"]);
124
150
 
125
- var ninetailed = useNinetailed();
126
-
127
151
  var _d = usePersonalize(baseline, variants, {
128
152
  holdout: holdout
129
153
  }),
@@ -132,27 +156,7 @@
132
156
  isPersonalized = _d.isPersonalized,
133
157
  audience = _d.audience;
134
158
 
135
- var _e = React.useState(false),
136
- isVisible = _e[0],
137
- setIsVisible = _e[1];
138
-
139
- var onChangeVisibility = React.useCallback(function (visibility) {
140
- if (visibility) {
141
- setIsVisible(true);
142
- }
143
- }, []);
144
- var trackCallFired = React.useRef(false);
145
159
  var hasVariants = variants.length > 0;
146
- React.useEffect(function () {
147
- if (experience_jsShared.isBrowser() && hasVariants && !loading && isVisible && variant && audience && audience.id !== 'baseline' && !trackCallFired.current) {
148
- ninetailed.trackHasSeenComponent({
149
- variant: variant,
150
- audience: audience,
151
- isPersonalized: isPersonalized
152
- });
153
- trackCallFired.current = true;
154
- }
155
- }, [loading, isVisible, variant, baseline, isPersonalized]);
156
160
 
157
161
  if (!hasVariants) {
158
162
  return /*#__PURE__*/React__default["default"].createElement(Component, __assign({}, baseline, {
@@ -181,11 +185,12 @@
181
185
  })));
182
186
  }
183
187
 
184
- return /*#__PURE__*/React__default["default"].createElement(VisibilitySensor__default["default"], {
185
- key: "".concat(audience.id, "-").concat(variant.id),
186
- partialVisibility: true,
187
- onChange: onChangeVisibility
188
+ return /*#__PURE__*/React__default["default"].createElement(TrackHasSeen, {
189
+ variant: variant,
190
+ audience: audience,
191
+ isPersonalized: isPersonalized
188
192
  }, /*#__PURE__*/React__default["default"].createElement(Component, __assign({}, variant, {
193
+ key: "".concat(audience.id, "-").concat(variant.id),
189
194
  ninetailed: {
190
195
  isPersonalized: isPersonalized,
191
196
  audience: audience
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- export declare type Variant<P> = {
2
+ export declare type Variant<P = unknown> = {
3
3
  id: string;
4
4
  audience: {
5
5
  id: string;
package/lib/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
+ export { Profile } from '@ninetailed/experience.js-shared';
1
2
  export { NinetailedProvider, NinetailedProviderProps, } from './NinetailedProvider';
2
3
  export { useNinetailed } from './useNinetailed';
3
4
  export { useProfile } from './useProfile';
4
5
  export { Personalize, PersonalizedComponent } from './Personalize';
5
6
  export { MergeTag } from './MergeTag';
6
- export { Profile } from '@ninetailed/experience.js-shared';
package/package.json CHANGED
@@ -1,20 +1,21 @@
1
1
  {
2
2
  "name": "@ninetailed/experience.js-react",
3
- "version": "1.0.0",
3
+ "version": "1.0.1-beta.0",
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
- "@ninetailed/experience.js-shared": "1.0.0",
10
+ "@ninetailed/experience.js-shared": "1.0.1-beta.0",
11
11
  "uuid": "^8.3.2",
12
12
  "ts-toolbelt": "^9.6.0",
13
13
  "locale-enum": "^1.1.1",
14
14
  "i18n-iso-countries": "^7.3.0",
15
15
  "lodash": "^4.17.21",
16
- "@ninetailed/experience.js": "1.0.0",
17
- "analytics": "^0.8.0"
16
+ "@ninetailed/experience.js": "1.0.1-beta.0",
17
+ "analytics": "^0.8.0",
18
+ "react-intersection-observer": "^8.33.1"
18
19
  },
19
20
  "main": "./index.umd.js",
20
21
  "module": "./index.esm.js",