@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/src/useinView.ts CHANGED
@@ -1,159 +1,23 @@
1
1
  import { useCallback, useEffect, useRef } from 'react';
2
2
 
3
- import { Dimensions, View } from 'react-native';
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<View>(null);
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(() => {