@cleartrip/ct-design-intersection-observer 4.0.0-SNAPSHOT-rnfinaltest56.0 → 4.0.0-SNAPSHOT-rnfinaltest58.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/dist/ct-design-intersection-observer.browser.cjs.js +1 -1
- package/dist/ct-design-intersection-observer.browser.cjs.js.map +1 -1
- package/dist/ct-design-intersection-observer.browser.esm.js +1 -1
- package/dist/ct-design-intersection-observer.browser.esm.js.map +1 -1
- package/dist/ct-design-intersection-observer.cjs.js +2 -131
- package/dist/ct-design-intersection-observer.cjs.js.map +1 -1
- package/dist/ct-design-intersection-observer.esm.js +3 -132
- package/dist/ct-design-intersection-observer.esm.js.map +1 -1
- package/dist/ct-design-intersection-observer.umd.js +6 -134
- package/dist/ct-design-intersection-observer.umd.js.map +1 -1
- package/dist/useInViewType.d.ts +0 -7
- package/dist/useInViewType.d.ts.map +1 -1
- package/dist/useinView.d.ts +1 -1
- package/dist/useinView.d.ts.map +1 -1
- package/dist/useinView.native.d.ts +4 -0
- package/dist/useinView.native.d.ts.map +1 -0
- package/package.json +8 -8
- package/src/useInViewType.ts +0 -9
- package/src/useinView.native.ts +283 -0
- package/src/useinView.ts +3 -197
package/src/useinView.ts
CHANGED
|
@@ -1,159 +1,23 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef } from 'react';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { useAddObservableChild, useGetScrolling } from '@cleartrip/ct-design-scroll-container';
|
|
3
|
+
import { useAddObservableChild } from '@cleartrip/ct-design-scroll-container';
|
|
5
4
|
import { useListItem } from '@cleartrip/ct-design-list';
|
|
6
5
|
import { promiseHandler } from '@cleartrip/ct-design-common-utils';
|
|
7
6
|
|
|
8
7
|
import { IntersectionOptions, InViewHookResponse } from './useInViewType';
|
|
9
8
|
|
|
10
|
-
const { width, height } = Dimensions.get('window');
|
|
11
|
-
/**
|
|
12
|
-
* todo
|
|
13
|
-
* horizontal scroll and root margin
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
interface VisibilityState {
|
|
17
|
-
visibleRef: React.MutableRefObject<number>;
|
|
18
|
-
timeoutVisibleRef: React.MutableRefObject<boolean>;
|
|
19
|
-
timeoutVisibleStartRef: React.MutableRefObject<{ start: number; end: number }>;
|
|
20
|
-
triggerOnceValue: React.MutableRefObject<boolean>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const calculateVisibility = (
|
|
24
|
-
rectTop: number,
|
|
25
|
-
rectBottom: number,
|
|
26
|
-
rectHeight: number,
|
|
27
|
-
rectLeft: number,
|
|
28
|
-
rectRight: number,
|
|
29
|
-
rectWidth: number,
|
|
30
|
-
observerBox: [number, number, number | undefined, number | undefined],
|
|
31
|
-
): { verticalVisibility: number; horizontalVisibility: number } => {
|
|
32
|
-
const [top, left, _height = height, _width = width] = observerBox;
|
|
33
|
-
|
|
34
|
-
// Calculate vertical visibility
|
|
35
|
-
let verticalVisibility = 0;
|
|
36
|
-
if (rectHeight) {
|
|
37
|
-
if (rectTop >= top && rectBottom <= _height) {
|
|
38
|
-
verticalVisibility = 100;
|
|
39
|
-
} else if (rectTop < top) {
|
|
40
|
-
verticalVisibility = ((rectBottom - top) / rectHeight) * 100;
|
|
41
|
-
} else {
|
|
42
|
-
verticalVisibility = ((_height - rectTop) / rectHeight) * 100;
|
|
43
|
-
}
|
|
44
|
-
} else {
|
|
45
|
-
const visibleHeight = rectTop > top && rectTop < _height ? rectTop - top : 0;
|
|
46
|
-
verticalVisibility = (visibleHeight / _height) * 100;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Calculate horizontal visibility
|
|
50
|
-
let horizontalVisibility = 0;
|
|
51
|
-
if (rectWidth) {
|
|
52
|
-
if (rectLeft >= left && rectRight <= _width) {
|
|
53
|
-
horizontalVisibility = 100;
|
|
54
|
-
} else if (rectLeft < left) {
|
|
55
|
-
horizontalVisibility = ((rectRight - left) / rectWidth) * 100;
|
|
56
|
-
} else {
|
|
57
|
-
horizontalVisibility = ((_width - rectLeft) / rectWidth) * 100;
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
const visibleWidth = rectLeft > left && rectLeft < _width ? rectLeft - left : 0;
|
|
61
|
-
horizontalVisibility = (visibleWidth / _width) * 100;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return { verticalVisibility, horizontalVisibility };
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const handleVisibilityChange = (
|
|
68
|
-
visibility: number,
|
|
69
|
-
threshold: number[],
|
|
70
|
-
state: VisibilityState,
|
|
71
|
-
callbacks: {
|
|
72
|
-
onChange?: (visible: boolean) => void;
|
|
73
|
-
onIntersectionComplete?: () => void;
|
|
74
|
-
onTimedObservationComplete?: () => void;
|
|
75
|
-
triggerOnce?: boolean;
|
|
76
|
-
minimumObservationTime: number;
|
|
77
|
-
observerMethod?: (visibleItems?: Set<number>, isScrolling?: boolean) => void;
|
|
78
|
-
},
|
|
79
|
-
) => {
|
|
80
|
-
const { visibleRef, timeoutVisibleRef, timeoutVisibleStartRef, triggerOnceValue } = state;
|
|
81
|
-
const {
|
|
82
|
-
onChange,
|
|
83
|
-
onIntersectionComplete,
|
|
84
|
-
onTimedObservationComplete,
|
|
85
|
-
triggerOnce,
|
|
86
|
-
minimumObservationTime,
|
|
87
|
-
observerMethod,
|
|
88
|
-
} = callbacks;
|
|
89
|
-
|
|
90
|
-
if (visibility === 0) {
|
|
91
|
-
if (visibleRef.current > 0) {
|
|
92
|
-
onIntersectionComplete?.();
|
|
93
|
-
}
|
|
94
|
-
visibleRef.current = 0;
|
|
95
|
-
timeoutVisibleRef.current = false;
|
|
96
|
-
timeoutVisibleStartRef.current.end = 0;
|
|
97
|
-
timeoutVisibleStartRef.current.start = 0;
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const thresholdVisibility = threshold[visibleRef.current] * 100;
|
|
102
|
-
|
|
103
|
-
if (visibility >= thresholdVisibility) {
|
|
104
|
-
if (!triggerOnceValue.current) {
|
|
105
|
-
timeoutVisibleRef.current = true;
|
|
106
|
-
visibleRef.current = visibleRef.current + 1;
|
|
107
|
-
|
|
108
|
-
if (timeoutVisibleStartRef.current.start === 0) {
|
|
109
|
-
timeoutVisibleStartRef.current.start = Date.now();
|
|
110
|
-
} else {
|
|
111
|
-
timeoutVisibleStartRef.current.end = Date.now();
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (triggerOnce) {
|
|
115
|
-
triggerOnceValue.current = true;
|
|
116
|
-
}
|
|
117
|
-
onChange?.(true);
|
|
118
|
-
setTimeout(() => {
|
|
119
|
-
observerMethod?.();
|
|
120
|
-
}, minimumObservationTime);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (
|
|
125
|
-
timeoutVisibleRef.current &&
|
|
126
|
-
timeoutVisibleStartRef.current.start > 0 &&
|
|
127
|
-
Date.now() - timeoutVisibleStartRef.current.start >= minimumObservationTime
|
|
128
|
-
) {
|
|
129
|
-
timeoutVisibleRef.current = false;
|
|
130
|
-
onTimedObservationComplete?.();
|
|
131
|
-
timeoutVisibleStartRef.current.end = -1;
|
|
132
|
-
timeoutVisibleStartRef.current.start = -1;
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
|
|
136
9
|
const useInView = <T>({
|
|
137
|
-
threshold = [0.01, 0.5],
|
|
138
|
-
timedThreshold = 1000,
|
|
139
10
|
onChange,
|
|
140
11
|
onIntersectionComplete,
|
|
141
12
|
onTimedObservationComplete,
|
|
142
|
-
minimumObservationTime = timedThreshold,
|
|
143
|
-
observerBox = [0, 0, height, width],
|
|
144
|
-
gestureHorizontallyScrollable = false,
|
|
145
|
-
triggerOnce = false,
|
|
146
13
|
observeOnScroll = false,
|
|
147
14
|
onUnmount,
|
|
148
|
-
checkFullVisibility = false,
|
|
149
15
|
}: IntersectionOptions): InViewHookResponse<T> => {
|
|
150
|
-
const ref = useRef<
|
|
16
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
151
17
|
const visibleRef = useRef(0);
|
|
152
18
|
const timeoutVisibleRef = useRef(false);
|
|
153
19
|
const timeoutVisibleStartRef = useRef({ start: 0, end: 0 });
|
|
154
20
|
const triggerOnceValue = useRef(false);
|
|
155
|
-
|
|
156
|
-
const { horizontal } = useGetScrolling();
|
|
157
21
|
const { listId } = useListItem();
|
|
158
22
|
|
|
159
23
|
const observerMethod = useCallback(
|
|
@@ -186,68 +50,10 @@ const useInView = <T>({
|
|
|
186
50
|
resolve();
|
|
187
51
|
return;
|
|
188
52
|
}
|
|
189
|
-
ref.current?.measure((_x, _y, width, height, pageX, pageY) => {
|
|
190
|
-
const { verticalVisibility, horizontalVisibility } = calculateVisibility(
|
|
191
|
-
pageY,
|
|
192
|
-
pageY + height,
|
|
193
|
-
height,
|
|
194
|
-
pageX,
|
|
195
|
-
pageX + width,
|
|
196
|
-
width,
|
|
197
|
-
observerBox,
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
const visiblePercentage = threshold[0] * 100;
|
|
201
|
-
const isVisible =
|
|
202
|
-
horizontal || gestureHorizontallyScrollable
|
|
203
|
-
? horizontalVisibility >= visiblePercentage
|
|
204
|
-
: verticalVisibility >= visiblePercentage;
|
|
205
|
-
const visibility = horizontal ? horizontalVisibility : verticalVisibility;
|
|
206
|
-
|
|
207
|
-
const totalVisibility = (horizontalVisibility * verticalVisibility) / 100;
|
|
208
|
-
const isTotalVisible = totalVisibility >= visiblePercentage;
|
|
209
|
-
|
|
210
|
-
const state = {
|
|
211
|
-
visibleRef,
|
|
212
|
-
timeoutVisibleRef,
|
|
213
|
-
timeoutVisibleStartRef,
|
|
214
|
-
triggerOnceValue,
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
const callbacks = {
|
|
218
|
-
onChange,
|
|
219
|
-
onIntersectionComplete,
|
|
220
|
-
onTimedObservationComplete,
|
|
221
|
-
triggerOnce,
|
|
222
|
-
minimumObservationTime,
|
|
223
|
-
observerMethod,
|
|
224
|
-
};
|
|
225
|
-
if (isTotalVisible) {
|
|
226
|
-
handleVisibilityChange(totalVisibility, threshold, state, callbacks);
|
|
227
|
-
} else if (!checkFullVisibility && isVisible) {
|
|
228
|
-
handleVisibilityChange(visibility, threshold, state, callbacks);
|
|
229
|
-
} else {
|
|
230
|
-
handleVisibilityChange(0, threshold, state, callbacks);
|
|
231
|
-
}
|
|
232
|
-
resolve();
|
|
233
|
-
});
|
|
234
53
|
});
|
|
235
54
|
}, ref.current);
|
|
236
55
|
},
|
|
237
|
-
[
|
|
238
|
-
checkFullVisibility,
|
|
239
|
-
gestureHorizontallyScrollable,
|
|
240
|
-
horizontal,
|
|
241
|
-
listId,
|
|
242
|
-
minimumObservationTime,
|
|
243
|
-
observeOnScroll,
|
|
244
|
-
observerBox,
|
|
245
|
-
onChange,
|
|
246
|
-
onIntersectionComplete,
|
|
247
|
-
onTimedObservationComplete,
|
|
248
|
-
threshold,
|
|
249
|
-
triggerOnce,
|
|
250
|
-
],
|
|
56
|
+
[listId, observeOnScroll, onChange, onIntersectionComplete, onTimedObservationComplete],
|
|
251
57
|
);
|
|
252
58
|
|
|
253
59
|
const addObservable = useCallback(() => {
|