@futurejj/react-native-visibility-sensor 1.3.13 → 1.3.15
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/README.md +2 -2
- package/lib/commonjs/VisibilitySensor.js +17 -2
- package/lib/commonjs/VisibilitySensor.js.map +1 -1
- package/lib/module/VisibilitySensor.js +17 -2
- package/lib/module/VisibilitySensor.js.map +1 -1
- package/lib/typescript/VisibilitySensor.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/VisibilitySensor.tsx +18 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
🔍 Component visibility sensor wrapper to sense whether or not a component is in viewport with configurable inset thresholds.
|
|
4
4
|
|
|
5
|
-
[](https://badge.fury.io/js/%40futurejj%2Freact-native-visibility-sensor) [](https://github.com/JairajJangle/react-native-visibility-sensor/blob/main/LICENSE) [](https://github.com/JairajJangle/react-native-visibility-sensor/actions/workflows/ci.yml)
|
|
5
|
+
[](https://badge.fury.io/js/%40futurejj%2Freact-native-visibility-sensor) [](https://github.com/JairajJangle/react-native-visibility-sensor/blob/main/LICENSE) [](https://github.com/JairajJangle/react-native-visibility-sensor/actions/workflows/ci.yml)    [](https://github.com/JairajJangle/react-native-visibility-sensor/issues?q=is%3Aopen+is%3Aissue)  [](https://snack.expo.dev/@futurejj/react-native-visibility-sensor-example)  
|
|
6
6
|
|
|
7
7
|
<div align="center">
|
|
8
8
|
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYTlsaGEyaXd4ZDdicWdtYnM4d3FibWltZjJwd3RrOG80b2pzemQ4dCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/hNCfKTz7YMuDPIM7eV/giphy.gif" alt="Visibility Sensor demo" style="border: 1px solid gray;" />
|
|
@@ -86,7 +86,7 @@ Additionally, all properties from `ViewProps` are also applicable.
|
|
|
86
86
|
|
|
87
87
|
## Notes
|
|
88
88
|
|
|
89
|
-
1. Facing problem on Android? Refer this discussion: https://github.com/JairajJangle/react-native-visibility-sensor/pull/1#issuecomment-2251569005
|
|
89
|
+
1. ⚠️ Facing problem on Android? Refer this discussion: https://github.com/JairajJangle/react-native-visibility-sensor/pull/1#issuecomment-2251569005
|
|
90
90
|
|
|
91
91
|
## Contributing
|
|
92
92
|
|
|
@@ -46,7 +46,10 @@ const VisibilitySensor = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
|
46
46
|
});
|
|
47
47
|
const [lastValue, setLastValue] = (0, _react.useState)(undefined);
|
|
48
48
|
const [active, setActive] = (0, _react.useState)(false);
|
|
49
|
+
const hasMeasuredRef = (0, _react.useRef)(false);
|
|
49
50
|
const measureInnerView = () => {
|
|
51
|
+
/* Check if the sensor is active to prevent unnecessary measurements
|
|
52
|
+
This avoids running measurements when the sensor is disabled or stopped */
|
|
50
53
|
if (!active) return;
|
|
51
54
|
localRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
|
|
52
55
|
const dimensions = {
|
|
@@ -59,6 +62,9 @@ const VisibilitySensor = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
|
59
62
|
};
|
|
60
63
|
if (rectDimensions.rectTop !== dimensions.rectTop || rectDimensions.rectBottom !== dimensions.rectBottom || rectDimensions.rectLeft !== dimensions.rectLeft || rectDimensions.rectRight !== dimensions.rectRight || rectDimensions.rectWidth !== dimensions.rectWidth || rectDimensions.rectHeight !== dimensions.rectHeight) {
|
|
61
64
|
setRectDimensions(dimensions);
|
|
65
|
+
/* Set hasMeasuredRef to true to indicate that a valid measurement has been taken
|
|
66
|
+
This ensures visibility checks only proceed after initial measurement */
|
|
67
|
+
hasMeasuredRef.current = true;
|
|
62
68
|
}
|
|
63
69
|
});
|
|
64
70
|
};
|
|
@@ -67,7 +73,12 @@ const VisibilitySensor = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
|
67
73
|
if (!active) setActive(true);
|
|
68
74
|
}, [active]);
|
|
69
75
|
const stopWatching = (0, _react.useCallback)(() => {
|
|
70
|
-
if (active)
|
|
76
|
+
if (active) {
|
|
77
|
+
setActive(false);
|
|
78
|
+
/* Reset measurement state when stopping to ensure fresh measurements
|
|
79
|
+
when the sensor is reactivated */
|
|
80
|
+
hasMeasuredRef.current = false;
|
|
81
|
+
}
|
|
71
82
|
}, [active]);
|
|
72
83
|
(0, _react.useEffect)(() => {
|
|
73
84
|
if (!disabled) {
|
|
@@ -78,6 +89,10 @@ const VisibilitySensor = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
|
78
89
|
};
|
|
79
90
|
}, [disabled, startWatching, stopWatching]);
|
|
80
91
|
(0, _react.useEffect)(() => {
|
|
92
|
+
/* Ensure visibility checks only run when the sensor is active and
|
|
93
|
+
at least one measurement has been completed. This prevents
|
|
94
|
+
premature visibility calculations with invalid or stale dimensions */
|
|
95
|
+
if (!active || !hasMeasuredRef.current) return;
|
|
81
96
|
const window = _reactNative.Dimensions.get('window');
|
|
82
97
|
const isVisible = rectDimensions.rectTop + (threshold.top || 0) <= window.height &&
|
|
83
98
|
// Top edge is within the bottom of the window
|
|
@@ -95,7 +110,7 @@ const VisibilitySensor = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
|
|
95
110
|
}
|
|
96
111
|
}
|
|
97
112
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
98
|
-
}, [rectDimensions, lastValue]);
|
|
113
|
+
}, [rectDimensions, lastValue, active]);
|
|
99
114
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
100
115
|
ref: localRef,
|
|
101
116
|
...rest,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useInterval","callback","delay","savedCallback","useRef","useEffect","current","undefined","id","setInterval","clearInterval","VisibilitySensor","forwardRef","props","ref","onChange","disabled","triggerOnce","threshold","children","rest","localRef","useImperativeHandle","getInnerRef","rectDimensions","setRectDimensions","useState","rectTop","rectBottom","rectLeft","rectRight","rectWidth","rectHeight","lastValue","setLastValue","active","setActive","measureInnerView","measure","_x","_y","width","height","pageX","pageY","dimensions","startWatching","useCallback","stopWatching","window","Dimensions","isVisible","top","bottom","left","right","jsx","View","_default","exports"],"sourceRoot":"../../src","sources":["VisibilitySensor.tsx"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","useInterval","callback","delay","savedCallback","useRef","useEffect","current","undefined","id","setInterval","clearInterval","VisibilitySensor","forwardRef","props","ref","onChange","disabled","triggerOnce","threshold","children","rest","localRef","useImperativeHandle","getInnerRef","rectDimensions","setRectDimensions","useState","rectTop","rectBottom","rectLeft","rectRight","rectWidth","rectHeight","lastValue","setLastValue","active","setActive","hasMeasuredRef","measureInnerView","measure","_x","_y","width","height","pageX","pageY","dimensions","startWatching","useCallback","stopWatching","window","Dimensions","isVisible","top","bottom","left","right","jsx","View","_default","exports"],"sourceRoot":"../../src","sources":["VisibilitySensor.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -40,7 +40,10 @@ const VisibilitySensor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
40
40
|
});
|
|
41
41
|
const [lastValue, setLastValue] = useState(undefined);
|
|
42
42
|
const [active, setActive] = useState(false);
|
|
43
|
+
const hasMeasuredRef = useRef(false);
|
|
43
44
|
const measureInnerView = () => {
|
|
45
|
+
/* Check if the sensor is active to prevent unnecessary measurements
|
|
46
|
+
This avoids running measurements when the sensor is disabled or stopped */
|
|
44
47
|
if (!active) return;
|
|
45
48
|
localRef.current?.measure((_x, _y, width, height, pageX, pageY) => {
|
|
46
49
|
const dimensions = {
|
|
@@ -53,6 +56,9 @@ const VisibilitySensor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
53
56
|
};
|
|
54
57
|
if (rectDimensions.rectTop !== dimensions.rectTop || rectDimensions.rectBottom !== dimensions.rectBottom || rectDimensions.rectLeft !== dimensions.rectLeft || rectDimensions.rectRight !== dimensions.rectRight || rectDimensions.rectWidth !== dimensions.rectWidth || rectDimensions.rectHeight !== dimensions.rectHeight) {
|
|
55
58
|
setRectDimensions(dimensions);
|
|
59
|
+
/* Set hasMeasuredRef to true to indicate that a valid measurement has been taken
|
|
60
|
+
This ensures visibility checks only proceed after initial measurement */
|
|
61
|
+
hasMeasuredRef.current = true;
|
|
56
62
|
}
|
|
57
63
|
});
|
|
58
64
|
};
|
|
@@ -61,7 +67,12 @@ const VisibilitySensor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
61
67
|
if (!active) setActive(true);
|
|
62
68
|
}, [active]);
|
|
63
69
|
const stopWatching = useCallback(() => {
|
|
64
|
-
if (active)
|
|
70
|
+
if (active) {
|
|
71
|
+
setActive(false);
|
|
72
|
+
/* Reset measurement state when stopping to ensure fresh measurements
|
|
73
|
+
when the sensor is reactivated */
|
|
74
|
+
hasMeasuredRef.current = false;
|
|
75
|
+
}
|
|
65
76
|
}, [active]);
|
|
66
77
|
useEffect(() => {
|
|
67
78
|
if (!disabled) {
|
|
@@ -72,6 +83,10 @@ const VisibilitySensor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
72
83
|
};
|
|
73
84
|
}, [disabled, startWatching, stopWatching]);
|
|
74
85
|
useEffect(() => {
|
|
86
|
+
/* Ensure visibility checks only run when the sensor is active and
|
|
87
|
+
at least one measurement has been completed. This prevents
|
|
88
|
+
premature visibility calculations with invalid or stale dimensions */
|
|
89
|
+
if (!active || !hasMeasuredRef.current) return;
|
|
75
90
|
const window = Dimensions.get('window');
|
|
76
91
|
const isVisible = rectDimensions.rectTop + (threshold.top || 0) <= window.height &&
|
|
77
92
|
// Top edge is within the bottom of the window
|
|
@@ -89,7 +104,7 @@ const VisibilitySensor = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
89
104
|
}
|
|
90
105
|
}
|
|
91
106
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
|
-
}, [rectDimensions, lastValue]);
|
|
107
|
+
}, [rectDimensions, lastValue, active]);
|
|
93
108
|
return /*#__PURE__*/_jsx(View, {
|
|
94
109
|
ref: localRef,
|
|
95
110
|
...rest,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useRef","useState","forwardRef","useImperativeHandle","Dimensions","View","jsx","_jsx","useInterval","callback","delay","savedCallback","current","undefined","id","setInterval","clearInterval","VisibilitySensor","props","ref","onChange","disabled","triggerOnce","threshold","children","rest","localRef","getInnerRef","rectDimensions","setRectDimensions","rectTop","rectBottom","rectLeft","rectRight","rectWidth","rectHeight","lastValue","setLastValue","active","setActive","measureInnerView","measure","_x","_y","width","height","pageX","pageY","dimensions","startWatching","stopWatching","window","get","isVisible","top","bottom","left","right"],"sourceRoot":"../../src","sources":["VisibilitySensor.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IACVC,WAAW,EACXC,SAAS,EACTC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,mBAAmB,QACd,OAAO;AACd,SAASC,UAAU,EAAmBC,IAAI,QAAQ,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOjE,SAASC,WAAWA,CAACC,QAAoB,EAAEC,KAAoB,EAAE;EAC/D,MAAMC,aAAa,GAAGX,MAAM,CAACS,QAAQ,CAAC;EAEtCV,SAAS,CAAC,MAAM;IACdY,aAAa,CAACC,OAAO,GAAGH,QAAQ;EAClC,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEdV,SAAS,CAAC,MAAM;IACd,IAAIW,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKG,SAAS,EAAE;MACzC;IACF;IAEA,MAAMC,EAAE,GAAGC,WAAW,CAAC,MAAMJ,aAAa,CAACC,OAAO,CAAC,CAAC,EAAEF,KAAK,CAAC;IAC5D,OAAO,MAAMM,aAAa,CAACF,EAAE,CAAC;EAChC,CAAC,EAAE,CAACJ,KAAK,CAAC,CAAC;AACb;AAEA,MAAMO,gBAAgB,gBAAGf,UAAU,CACjC,CAACgB,KAAK,EAAEC,GAAG,KAAK;EACd,MAAM;IACJC,QAAQ;IACRC,QAAQ,GAAG,KAAK;IAChBC,WAAW,GAAG,KAAK;IACnBZ,KAAK;IACLa,SAAS,GAAG,CAAC,CAAC;IACdC,QAAQ;IACR,GAAGC;EACL,CAAC,GAAGP,KAAK;EAET,MAAMQ,QAAQ,GAAG1B,MAAM,CAAO,IAAI,CAAC;EAEnCG,mBAAmB,CAACgB,GAAG,EAAE,OAAO;IAC9BQ,WAAW,EAAEA,CAAA,KAAMD,QAAQ,CAACd;EAC9B,CAAC,CAAC,CAAC;EAEH,MAAM,CAACgB,cAAc,EAAEC,iBAAiB,CAAC,GAAG5B,QAAQ,CAAsB;IACxE6B,OAAO,EAAE,CAAC;IACVC,UAAU,EAAE,CAAC;IACbC,QAAQ,EAAE,CAAC;IACXC,SAAS,EAAE,CAAC;IACZC,SAAS,EAAE,CAAC;IACZC,UAAU,EAAE;EACd,CAAC,CAAC;EACF,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAGpC,QAAQ,CAAsBY,SAAS,CAAC;EAC1E,MAAM,CAACyB,MAAM,EAAEC,SAAS,CAAC,GAAGtC,QAAQ,CAAU,KAAK,CAAC;
|
|
1
|
+
{"version":3,"names":["React","useCallback","useEffect","useRef","useState","forwardRef","useImperativeHandle","Dimensions","View","jsx","_jsx","useInterval","callback","delay","savedCallback","current","undefined","id","setInterval","clearInterval","VisibilitySensor","props","ref","onChange","disabled","triggerOnce","threshold","children","rest","localRef","getInnerRef","rectDimensions","setRectDimensions","rectTop","rectBottom","rectLeft","rectRight","rectWidth","rectHeight","lastValue","setLastValue","active","setActive","hasMeasuredRef","measureInnerView","measure","_x","_y","width","height","pageX","pageY","dimensions","startWatching","stopWatching","window","get","isVisible","top","bottom","left","right"],"sourceRoot":"../../src","sources":["VisibilitySensor.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisibilitySensor.d.ts","sourceRoot":"","sources":["../../src/VisibilitySensor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EAEtB,MAAM,0BAA0B,CAAC;AAmBlC,QAAA,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"VisibilitySensor.d.ts","sourceRoot":"","sources":["../../src/VisibilitySensor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EAEtB,MAAM,0BAA0B,CAAC;AAmBlC,QAAA,MAAM,gBAAgB,mGA2HrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futurejj/react-native-visibility-sensor",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.15",
|
|
4
4
|
"description": "A React Native wrapper to check whether a component is in the view port to track impressions and clicks",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
package/src/VisibilitySensor.tsx
CHANGED
|
@@ -58,8 +58,11 @@ const VisibilitySensor = forwardRef<VisibilitySensorRef, VisibilitySensorProps>(
|
|
|
58
58
|
});
|
|
59
59
|
const [lastValue, setLastValue] = useState<boolean | undefined>(undefined);
|
|
60
60
|
const [active, setActive] = useState<boolean>(false);
|
|
61
|
+
const hasMeasuredRef = useRef(false);
|
|
61
62
|
|
|
62
63
|
const measureInnerView = () => {
|
|
64
|
+
/* Check if the sensor is active to prevent unnecessary measurements
|
|
65
|
+
This avoids running measurements when the sensor is disabled or stopped */
|
|
63
66
|
if (!active) return;
|
|
64
67
|
|
|
65
68
|
localRef.current?.measure(
|
|
@@ -88,6 +91,9 @@ const VisibilitySensor = forwardRef<VisibilitySensorRef, VisibilitySensorProps>(
|
|
|
88
91
|
rectDimensions.rectHeight !== dimensions.rectHeight
|
|
89
92
|
) {
|
|
90
93
|
setRectDimensions(dimensions);
|
|
94
|
+
/* Set hasMeasuredRef to true to indicate that a valid measurement has been taken
|
|
95
|
+
This ensures visibility checks only proceed after initial measurement */
|
|
96
|
+
hasMeasuredRef.current = true;
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
);
|
|
@@ -100,7 +106,12 @@ const VisibilitySensor = forwardRef<VisibilitySensorRef, VisibilitySensorProps>(
|
|
|
100
106
|
}, [active]);
|
|
101
107
|
|
|
102
108
|
const stopWatching = useCallback(() => {
|
|
103
|
-
if (active)
|
|
109
|
+
if (active) {
|
|
110
|
+
setActive(false);
|
|
111
|
+
/* Reset measurement state when stopping to ensure fresh measurements
|
|
112
|
+
when the sensor is reactivated */
|
|
113
|
+
hasMeasuredRef.current = false;
|
|
114
|
+
}
|
|
104
115
|
}, [active]);
|
|
105
116
|
|
|
106
117
|
useEffect(() => {
|
|
@@ -114,6 +125,11 @@ const VisibilitySensor = forwardRef<VisibilitySensorRef, VisibilitySensorProps>(
|
|
|
114
125
|
}, [disabled, startWatching, stopWatching]);
|
|
115
126
|
|
|
116
127
|
useEffect(() => {
|
|
128
|
+
/* Ensure visibility checks only run when the sensor is active and
|
|
129
|
+
at least one measurement has been completed. This prevents
|
|
130
|
+
premature visibility calculations with invalid or stale dimensions */
|
|
131
|
+
if (!active || !hasMeasuredRef.current) return;
|
|
132
|
+
|
|
117
133
|
const window: ScaledSize = Dimensions.get('window');
|
|
118
134
|
const isVisible: boolean =
|
|
119
135
|
rectDimensions.rectTop + (threshold.top || 0) <= window.height && // Top edge is within the bottom of the window
|
|
@@ -129,7 +145,7 @@ const VisibilitySensor = forwardRef<VisibilitySensorRef, VisibilitySensorProps>(
|
|
|
129
145
|
}
|
|
130
146
|
}
|
|
131
147
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
132
|
-
}, [rectDimensions, lastValue]);
|
|
148
|
+
}, [rectDimensions, lastValue, active]);
|
|
133
149
|
|
|
134
150
|
return (
|
|
135
151
|
<View ref={localRef} {...rest}>
|