@r0b0t3d/react-native-collapsible 1.0.1 → 1.2.0-alpha.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/lib/commonjs/components/CollapsibleContainer.js +4 -2
- package/lib/commonjs/components/CollapsibleContainer.js.map +1 -1
- package/lib/commonjs/components/CollapsibleView.js +4 -3
- package/lib/commonjs/components/CollapsibleView.js.map +1 -1
- package/lib/commonjs/components/{AnimatedTopView.js → header/AnimatedTopView.js} +0 -0
- package/lib/commonjs/components/{AnimatedTopView.js.map → header/AnimatedTopView.js.map} +0 -0
- package/lib/commonjs/components/{CollapsibleHeaderContainer.js → header/CollapsibleHeaderContainer.js} +9 -8
- package/lib/commonjs/components/header/CollapsibleHeaderContainer.js.map +1 -0
- package/lib/commonjs/components/{StickyView.js → header/StickyView.js} +18 -31
- package/lib/commonjs/components/header/StickyView.js.map +1 -0
- package/lib/commonjs/components/pullToRefresh/PullToRefreshContainer.js +75 -0
- package/lib/commonjs/components/pullToRefresh/PullToRefreshContainer.js.map +1 -0
- package/lib/commonjs/components/pullToRefresh/PullToRefreshProvider.js +35 -0
- package/lib/commonjs/components/pullToRefresh/PullToRefreshProvider.js.map +1 -0
- package/lib/commonjs/components/pullToRefresh/RefreshControl.js +73 -0
- package/lib/commonjs/components/pullToRefresh/RefreshControl.js.map +1 -0
- package/lib/commonjs/components/pullToRefresh/usePullToRefreshContext.js +24 -0
- package/lib/commonjs/components/pullToRefresh/usePullToRefreshContext.js.map +1 -0
- package/lib/commonjs/components/pullToRefresh/utils.js +59 -0
- package/lib/commonjs/components/pullToRefresh/utils.js.map +1 -0
- package/lib/commonjs/components/{CollapsibleFlatList.js → scrollable/CollapsibleFlatList.js} +36 -31
- package/lib/commonjs/components/scrollable/CollapsibleFlatList.js.map +1 -0
- package/lib/commonjs/components/{CollapsibleScrollView.js → scrollable/CollapsibleScrollView.js} +6 -6
- package/lib/commonjs/components/scrollable/CollapsibleScrollView.js.map +1 -0
- package/lib/commonjs/{hooks → components/scrollable}/useAnimatedScroll.js +7 -7
- package/lib/commonjs/components/scrollable/useAnimatedScroll.js.map +1 -0
- package/lib/commonjs/hooks/useInternalCollapsibleContext.js +1 -1
- package/lib/commonjs/hooks/useInternalCollapsibleContext.js.map +1 -1
- package/lib/commonjs/index.js +21 -12
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/{types.js → types.d.js} +1 -1
- package/lib/commonjs/{types.js.map → types.d.js.map} +0 -0
- package/lib/commonjs/utils/debounce.js +20 -0
- package/lib/commonjs/utils/debounce.js.map +1 -0
- package/lib/commonjs/{hooks/withCollapsibleContext.js → withCollapsibleContext.js} +95 -64
- package/lib/commonjs/withCollapsibleContext.js.map +1 -0
- package/lib/module/components/CollapsibleContainer.js +1 -1
- package/lib/module/components/CollapsibleContainer.js.map +1 -1
- package/lib/module/components/CollapsibleView.js +4 -3
- package/lib/module/components/CollapsibleView.js.map +1 -1
- package/lib/module/components/{AnimatedTopView.js → header/AnimatedTopView.js} +0 -0
- package/lib/module/components/{AnimatedTopView.js.map → header/AnimatedTopView.js.map} +0 -0
- package/lib/module/components/{CollapsibleHeaderContainer.js → header/CollapsibleHeaderContainer.js} +7 -6
- package/lib/module/components/header/CollapsibleHeaderContainer.js.map +1 -0
- package/lib/module/components/{StickyView.js → header/StickyView.js} +17 -30
- package/lib/module/components/header/StickyView.js.map +1 -0
- package/lib/module/components/pullToRefresh/PullToRefreshContainer.js +56 -0
- package/lib/module/components/pullToRefresh/PullToRefreshContainer.js.map +1 -0
- package/lib/module/components/pullToRefresh/PullToRefreshProvider.js +21 -0
- package/lib/module/components/pullToRefresh/PullToRefreshProvider.js.map +1 -0
- package/lib/module/components/pullToRefresh/RefreshControl.js +55 -0
- package/lib/module/components/pullToRefresh/RefreshControl.js.map +1 -0
- package/lib/module/components/pullToRefresh/usePullToRefreshContext.js +13 -0
- package/lib/module/components/pullToRefresh/usePullToRefreshContext.js.map +1 -0
- package/lib/module/components/pullToRefresh/utils.js +42 -0
- package/lib/module/components/pullToRefresh/utils.js.map +1 -0
- package/lib/module/components/{CollapsibleFlatList.js → scrollable/CollapsibleFlatList.js} +36 -32
- package/lib/module/components/scrollable/CollapsibleFlatList.js.map +1 -0
- package/lib/module/components/{CollapsibleScrollView.js → scrollable/CollapsibleScrollView.js} +5 -5
- package/lib/module/components/scrollable/CollapsibleScrollView.js.map +1 -0
- package/lib/module/{hooks → components/scrollable}/useAnimatedScroll.js +6 -6
- package/lib/module/components/scrollable/useAnimatedScroll.js.map +1 -0
- package/lib/module/hooks/useInternalCollapsibleContext.js +1 -1
- package/lib/module/hooks/useInternalCollapsibleContext.js.map +1 -1
- package/lib/module/index.js +6 -5
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.d.js +2 -0
- package/lib/module/{types.js.map → types.d.js.map} +0 -0
- package/lib/module/utils/debounce.js +13 -0
- package/lib/module/utils/debounce.js.map +1 -0
- package/lib/module/withCollapsibleContext.js +163 -0
- package/lib/module/withCollapsibleContext.js.map +1 -0
- package/lib/typescript/components/CollapsibleView.d.ts +1 -1
- package/lib/typescript/components/{AnimatedTopView.d.ts → header/AnimatedTopView.d.ts} +0 -0
- package/lib/typescript/components/{CollapsibleHeaderContainer.d.ts → header/CollapsibleHeaderContainer.d.ts} +0 -0
- package/lib/typescript/components/{StickyView.d.ts → header/StickyView.d.ts} +0 -0
- package/lib/typescript/components/pullToRefresh/PullToRefreshContainer.d.ts +8 -0
- package/lib/typescript/components/pullToRefresh/PullToRefreshProvider.d.ts +6 -0
- package/lib/typescript/components/pullToRefresh/RefreshControl.d.ts +9 -0
- package/lib/typescript/components/pullToRefresh/usePullToRefreshContext.d.ts +4 -0
- package/lib/typescript/components/pullToRefresh/utils.d.ts +20 -0
- package/lib/typescript/components/{CollapsibleFlatList.d.ts → scrollable/CollapsibleFlatList.d.ts} +1 -1
- package/lib/typescript/components/{CollapsibleScrollView.d.ts → scrollable/CollapsibleScrollView.d.ts} +1 -1
- package/lib/typescript/{hooks → components/scrollable}/useAnimatedScroll.d.ts +0 -0
- package/lib/typescript/hooks/useInternalCollapsibleContext.d.ts +1 -1
- package/lib/typescript/index.d.ts +6 -5
- package/lib/typescript/utils/debounce.d.ts +1 -0
- package/lib/typescript/{hooks/withCollapsibleContext.d.ts → withCollapsibleContext.d.ts} +0 -0
- package/package.json +4 -2
- package/src/components/CollapsibleContainer.tsx +1 -1
- package/src/components/CollapsibleView.tsx +4 -3
- package/src/components/{AnimatedTopView.tsx → header/AnimatedTopView.tsx} +0 -0
- package/src/components/{CollapsibleHeaderContainer.tsx → header/CollapsibleHeaderContainer.tsx} +6 -4
- package/src/components/{StickyView.tsx → header/StickyView.tsx} +15 -22
- package/src/components/pullToRefresh/PullToRefreshContainer.tsx +65 -0
- package/src/components/pullToRefresh/PullToRefreshProvider.tsx +27 -0
- package/src/components/pullToRefresh/RefreshControl.tsx +80 -0
- package/src/components/pullToRefresh/usePullToRefreshContext.ts +13 -0
- package/src/components/pullToRefresh/utils.ts +49 -0
- package/src/components/scrollable/CollapsibleFlatList.tsx +135 -0
- package/src/components/{CollapsibleScrollView.tsx → scrollable/CollapsibleScrollView.tsx} +6 -6
- package/src/{hooks → components/scrollable}/useAnimatedScroll.ts +8 -8
- package/src/hooks/useInternalCollapsibleContext.ts +1 -1
- package/src/index.tsx +6 -5
- package/src/{types.ts → types.d.ts} +14 -3
- package/src/utils/debounce.ts +10 -0
- package/src/withCollapsibleContext.tsx +201 -0
- package/lib/commonjs/components/CollapsibleFlatList.js.map +0 -1
- package/lib/commonjs/components/CollapsibleHeaderContainer.js.map +0 -1
- package/lib/commonjs/components/CollapsibleScrollView.js.map +0 -1
- package/lib/commonjs/components/StickyView.js.map +0 -1
- package/lib/commonjs/hooks/useAnimatedScroll.js.map +0 -1
- package/lib/commonjs/hooks/withCollapsibleContext.js.map +0 -1
- package/lib/module/components/CollapsibleFlatList.js.map +0 -1
- package/lib/module/components/CollapsibleHeaderContainer.js.map +0 -1
- package/lib/module/components/CollapsibleScrollView.js.map +0 -1
- package/lib/module/components/StickyView.js.map +0 -1
- package/lib/module/hooks/useAnimatedScroll.js.map +0 -1
- package/lib/module/hooks/withCollapsibleContext.js +0 -136
- package/lib/module/hooks/withCollapsibleContext.js.map +0 -1
- package/lib/module/types.js +0 -2
- package/lib/typescript/types.d.ts +0 -33
- package/src/components/CollapsibleFlatList.tsx +0 -119
- package/src/hooks/withCollapsibleContext.tsx +0 -164
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
1
2
|
import type React from 'react';
|
|
2
3
|
import type { View } from 'react-native';
|
|
3
4
|
import type Animated from 'react-native-reanimated';
|
|
@@ -24,11 +25,15 @@ export type LayoutParams = {
|
|
|
24
25
|
export type CollapsibleContextInternalType = {
|
|
25
26
|
containerRef: React.RefObject<View>;
|
|
26
27
|
contentMinHeight: Animated.SharedValue<number>;
|
|
27
|
-
firstStickyViewY:
|
|
28
|
+
firstStickyViewY: Animated.SharedValue<number>;
|
|
29
|
+
stickyViewPositions: Animated.SharedValue<Record<string, LayoutParams>>;
|
|
28
30
|
stickyViewTops: Animated.SharedValue<Record<string, number>>;
|
|
29
|
-
fixedHeaderHeight:
|
|
31
|
+
fixedHeaderHeight: Animated.SharedValue<number>;
|
|
30
32
|
handleContainerHeight: (height: number) => void;
|
|
31
|
-
handleStickyViewLayout: (
|
|
33
|
+
handleStickyViewLayout: (
|
|
34
|
+
viewKey: string,
|
|
35
|
+
viewRef?: React.RefObject<View>
|
|
36
|
+
) => void;
|
|
32
37
|
handleHeaderContainerLayout: (viewKey: string, height?: number) => void;
|
|
33
38
|
setCollapsibleHandlers: (handlers: CollapsibleHandles) => void;
|
|
34
39
|
};
|
|
@@ -36,3 +41,9 @@ export type CollapsibleContextInternalType = {
|
|
|
36
41
|
export type CollapsibleProps = {
|
|
37
42
|
headerSnappable?: boolean;
|
|
38
43
|
};
|
|
44
|
+
|
|
45
|
+
export type PullToRefreshContextType = {
|
|
46
|
+
refreshValue: Animated.SharedValue<number>;
|
|
47
|
+
internalRefreshing: Animated.SharedValue<boolean>;
|
|
48
|
+
internalHeight: Animated.SharedValue<number>;
|
|
49
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// https://gist.github.com/ca0v/73a31f57b397606c9813472f7493a940
|
|
2
|
+
export function debounce<T extends Function>(cb: T, wait = 20) {
|
|
3
|
+
let h = 0;
|
|
4
|
+
let callable = (...args: any) => {
|
|
5
|
+
clearTimeout(h);
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
h = setTimeout(() => cb(...args), wait);
|
|
8
|
+
};
|
|
9
|
+
return <T>(<any>callable);
|
|
10
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/* eslint-disable no-shadow */
|
|
2
|
+
/* eslint-disable react-hooks/exhaustive-deps */
|
|
3
|
+
import React, { FC, useCallback, useMemo, useRef } from 'react';
|
|
4
|
+
import type { CollapsibleHandles, LayoutParams } from './types';
|
|
5
|
+
import { CollapsibleContext } from './hooks/useCollapsibleContext';
|
|
6
|
+
import { InternalCollapsibleContext } from './hooks/useInternalCollapsibleContext';
|
|
7
|
+
import {
|
|
8
|
+
useAnimatedReaction,
|
|
9
|
+
useDerivedValue,
|
|
10
|
+
useSharedValue,
|
|
11
|
+
withTiming,
|
|
12
|
+
} from 'react-native-reanimated';
|
|
13
|
+
import type { View } from 'react-native';
|
|
14
|
+
import { debounce } from './utils/debounce';
|
|
15
|
+
import PullToRefreshProvider from './components/pullToRefresh/PullToRefreshProvider';
|
|
16
|
+
|
|
17
|
+
export default function withCollapsibleContext<T>(Component: FC<T>) {
|
|
18
|
+
return (props: T) => {
|
|
19
|
+
const collapsibleHandlers = useRef<CollapsibleHandles>();
|
|
20
|
+
const headerHeight = useSharedValue(0);
|
|
21
|
+
const scrollY = useSharedValue(0);
|
|
22
|
+
const stickyViewRefs = useRef<Record<string, React.RefObject<View>>>({});
|
|
23
|
+
const stickyViewTops = useSharedValue<Record<string, number>>({});
|
|
24
|
+
const stickyViewPositionsRef = useRef<Record<string, LayoutParams>>({});
|
|
25
|
+
const stickyViewPositions = useSharedValue<Record<string, LayoutParams>>(
|
|
26
|
+
{}
|
|
27
|
+
);
|
|
28
|
+
const fixedHeaderHeight = useSharedValue(0);
|
|
29
|
+
const stickyHeaderHeight = useSharedValue(0);
|
|
30
|
+
const containerHeight = useSharedValue(0);
|
|
31
|
+
const firstStickyViewY = useSharedValue(1000000);
|
|
32
|
+
const headerContainersHeight = useRef<Record<string, number>>({});
|
|
33
|
+
const containerRef = useRef<View>(null);
|
|
34
|
+
|
|
35
|
+
const setCollapsibleHandlers = useCallback((handlers) => {
|
|
36
|
+
collapsibleHandlers.current = handlers;
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
const headerCollapsed = useDerivedValue(() => {
|
|
40
|
+
const maxY = fixedHeaderHeight.value - firstStickyViewY.value;
|
|
41
|
+
return scrollY.value >= maxY;
|
|
42
|
+
}, []);
|
|
43
|
+
|
|
44
|
+
const contentMinHeight = useDerivedValue(() => {
|
|
45
|
+
return (
|
|
46
|
+
containerHeight.value +
|
|
47
|
+
fixedHeaderHeight.value -
|
|
48
|
+
stickyHeaderHeight.value
|
|
49
|
+
);
|
|
50
|
+
}, []);
|
|
51
|
+
|
|
52
|
+
useAnimatedReaction(
|
|
53
|
+
() => {
|
|
54
|
+
const totalHeight = Object.keys(stickyViewPositions.value).reduce(
|
|
55
|
+
(acc, item) => {
|
|
56
|
+
return acc + stickyViewPositions.value[item].top;
|
|
57
|
+
},
|
|
58
|
+
0
|
|
59
|
+
);
|
|
60
|
+
return totalHeight - fixedHeaderHeight.value;
|
|
61
|
+
},
|
|
62
|
+
(result, previous) => {
|
|
63
|
+
if (result !== previous) {
|
|
64
|
+
const viewPositions = stickyViewPositions.value;
|
|
65
|
+
const headerHeight = fixedHeaderHeight.value;
|
|
66
|
+
const sortedKeys = Object.keys(viewPositions).sort(
|
|
67
|
+
(a, b) => viewPositions[a].top - viewPositions[b].top
|
|
68
|
+
);
|
|
69
|
+
let totalTop = 0;
|
|
70
|
+
const values: any = {};
|
|
71
|
+
for (let i = 0; i < sortedKeys.length; i++) {
|
|
72
|
+
values[sortedKeys[i]] = totalTop;
|
|
73
|
+
// Try minus 1 make it filled when scrolling up.
|
|
74
|
+
// Otherwise, we can see a small space between the persits views
|
|
75
|
+
totalTop += viewPositions[sortedKeys[i]].height - 1;
|
|
76
|
+
}
|
|
77
|
+
stickyViewTops.value = values;
|
|
78
|
+
firstStickyViewY.value = viewPositions[sortedKeys[0]]?.top || 0;
|
|
79
|
+
const stickyHeader = sortedKeys.reduce((acc, key) => {
|
|
80
|
+
const data = viewPositions[key];
|
|
81
|
+
const isInsideHeader = data.top < headerHeight;
|
|
82
|
+
if (isInsideHeader) {
|
|
83
|
+
return acc + data.height;
|
|
84
|
+
}
|
|
85
|
+
return acc;
|
|
86
|
+
}, 0);
|
|
87
|
+
stickyHeaderHeight.value = stickyHeader;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const handleStickyViewLayout = useCallback(
|
|
93
|
+
(viewKey: string, viewRef?: React.RefObject<View>) => {
|
|
94
|
+
if (viewRef && viewRef.current && containerRef.current) {
|
|
95
|
+
stickyViewRefs.current[viewKey] = viewRef;
|
|
96
|
+
viewRef.current.measureLayout(
|
|
97
|
+
// @ts-ignore
|
|
98
|
+
containerRef.current,
|
|
99
|
+
(left, top, width, height) => {
|
|
100
|
+
stickyViewPositionsRef.current = {
|
|
101
|
+
...stickyViewPositionsRef.current,
|
|
102
|
+
[viewKey]: { left, top, width, height },
|
|
103
|
+
};
|
|
104
|
+
stickyViewPositions.value = stickyViewPositionsRef.current;
|
|
105
|
+
},
|
|
106
|
+
() => {}
|
|
107
|
+
);
|
|
108
|
+
} else {
|
|
109
|
+
delete stickyViewRefs.current[viewKey];
|
|
110
|
+
delete stickyViewPositionsRef.current[viewKey];
|
|
111
|
+
stickyViewPositions.value = stickyViewPositionsRef.current;
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
[]
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const debounceRefreshStickyPositions = useMemo(() => {
|
|
118
|
+
return debounce(() => {
|
|
119
|
+
Object.keys(stickyViewRefs.current).forEach((key) => {
|
|
120
|
+
const viewRef = stickyViewRefs.current[key];
|
|
121
|
+
if (viewRef) {
|
|
122
|
+
handleStickyViewLayout(key, viewRef);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}, 200);
|
|
126
|
+
}, []);
|
|
127
|
+
|
|
128
|
+
const handleHeaderContainerLayout = useCallback(
|
|
129
|
+
(viewKey: string, height?: number) => {
|
|
130
|
+
if (!height) {
|
|
131
|
+
delete headerContainersHeight.current[viewKey];
|
|
132
|
+
} else {
|
|
133
|
+
headerContainersHeight.current[viewKey] = height;
|
|
134
|
+
}
|
|
135
|
+
const totalHeight = Object.keys(headerContainersHeight.current).reduce(
|
|
136
|
+
(acc, key) => headerContainersHeight.current[key] + acc,
|
|
137
|
+
0
|
|
138
|
+
);
|
|
139
|
+
headerHeight.value = withTiming(totalHeight, {
|
|
140
|
+
duration: fixedHeaderHeight.value === 0 ? 0 : 200,
|
|
141
|
+
});
|
|
142
|
+
fixedHeaderHeight.value = totalHeight;
|
|
143
|
+
// Try refresh sticky positions
|
|
144
|
+
debounceRefreshStickyPositions();
|
|
145
|
+
},
|
|
146
|
+
[]
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const handleContainerHeight = useCallback((height: number) => {
|
|
150
|
+
containerHeight.value = height;
|
|
151
|
+
}, []);
|
|
152
|
+
|
|
153
|
+
const context = useMemo(() => {
|
|
154
|
+
return {
|
|
155
|
+
collapse: () => collapsibleHandlers.current?.collapse(),
|
|
156
|
+
expand: () => collapsibleHandlers.current?.expand(),
|
|
157
|
+
scrollTo: (offset: number, animate?: boolean) =>
|
|
158
|
+
collapsibleHandlers.current?.scrollTo(offset, animate),
|
|
159
|
+
headerHeight,
|
|
160
|
+
scrollY,
|
|
161
|
+
headerCollapsed,
|
|
162
|
+
};
|
|
163
|
+
}, [scrollY, headerHeight, headerCollapsed]);
|
|
164
|
+
|
|
165
|
+
const internalContext = useMemo(
|
|
166
|
+
() => ({
|
|
167
|
+
containerRef,
|
|
168
|
+
handleStickyViewLayout,
|
|
169
|
+
handleHeaderContainerLayout,
|
|
170
|
+
setCollapsibleHandlers,
|
|
171
|
+
handleContainerHeight,
|
|
172
|
+
firstStickyViewY,
|
|
173
|
+
stickyViewTops,
|
|
174
|
+
stickyViewPositions,
|
|
175
|
+
fixedHeaderHeight,
|
|
176
|
+
contentMinHeight,
|
|
177
|
+
}),
|
|
178
|
+
[
|
|
179
|
+
setCollapsibleHandlers,
|
|
180
|
+
handleStickyViewLayout,
|
|
181
|
+
handleHeaderContainerLayout,
|
|
182
|
+
handleContainerHeight,
|
|
183
|
+
firstStickyViewY,
|
|
184
|
+
stickyViewTops,
|
|
185
|
+
stickyViewPositions,
|
|
186
|
+
fixedHeaderHeight,
|
|
187
|
+
contentMinHeight,
|
|
188
|
+
]
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
return (
|
|
192
|
+
<CollapsibleContext.Provider value={context}>
|
|
193
|
+
<InternalCollapsibleContext.Provider value={internalContext}>
|
|
194
|
+
<PullToRefreshProvider>
|
|
195
|
+
<Component {...props} />
|
|
196
|
+
</PullToRefreshProvider>
|
|
197
|
+
</InternalCollapsibleContext.Provider>
|
|
198
|
+
</CollapsibleContext.Provider>
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["CollapsibleFlatList.tsx"],"names":["AnimatedFlatList","Animated","createAnimatedComponent","FlatList","CollapsibleFlatList","headerSnappable","props","scrollView","headerHeight","contentMinHeight","mounted","contentHeight","current","scrollTo","yValue","animated","scrollToOffset","offset","handleInternalContentHeight","value","setInternalContentMinHeight","scrollHandler","internalContentMinHeight","contentContainerStyle","styles","contentContainer","minHeight","handleContentSizeChange","_","height","renderListHeader","ListHeaderComponent","container","style","StyleSheet","create","absoluteFillObject","flexGrow","topView","position","top","left","right"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FlatListProps, FlatList, View, StyleSheet } from 'react-native';\nimport Animated, { runOnJS, useDerivedValue } from 'react-native-reanimated';\nimport AnimatedTopView from './AnimatedTopView';\nimport useAnimatedScroll from '../hooks/useAnimatedScroll';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\nimport type { CollapsibleProps } from '../types';\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\n\nconst AnimatedFlatList = Animated.createAnimatedComponent(FlatList);\n\ntype Props<Data> = Omit<FlatListProps<Data>, 'scrollEnabled'> &\n CollapsibleProps;\n\nexport default function CollapsibleFlatList<Data>({\n headerSnappable = true,\n ...props\n}: Props<Data>) {\n const scrollView = useRef<FlatList>(null);\n const { headerHeight } = useCollapsibleContext();\n const { contentMinHeight } = useInternalCollapsibleContext();\n const mounted = useRef(true);\n const contentHeight = useRef(0);\n\n useEffect(() => {\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const scrollTo = useCallback((yValue: number, animated = true) => {\n scrollView.current?.scrollToOffset({\n offset: yValue,\n animated,\n });\n }, []);\n\n const handleInternalContentHeight = useCallback((value: number) => {\n if (mounted.current) {\n setInternalContentMinHeight(value);\n }\n }, []);\n\n const { scrollHandler } = useAnimatedScroll({\n headerSnappable,\n scrollTo,\n });\n\n const [internalContentMinHeight, setInternalContentMinHeight] = useState(\n contentMinHeight.value\n );\n\n useDerivedValue(() => {\n if (\n contentHeight.current < contentMinHeight.value &&\n contentMinHeight.value !== internalContentMinHeight\n ) {\n runOnJS(handleInternalContentHeight)(contentMinHeight.value);\n }\n }, [internalContentMinHeight, contentHeight.current]);\n\n const contentContainerStyle = useMemo(\n () => [\n styles.contentContainer,\n { minHeight: internalContentMinHeight },\n props.contentContainerStyle,\n ],\n [props.contentContainerStyle, internalContentMinHeight]\n );\n\n const handleContentSizeChange = useCallback((_, height) => {\n contentHeight.current = height;\n }, []);\n\n const renderListHeader = () => (\n <View>\n <AnimatedTopView height={headerHeight} />\n {props.ListHeaderComponent}\n </View>\n );\n\n return (\n // @ts-ignore\n <AnimatedFlatList\n ref={scrollView}\n bounces={false}\n keyboardDismissMode=\"on-drag\"\n keyboardShouldPersistTaps=\"handled\"\n scrollEventThrottle={16}\n {...props}\n style={[styles.container, props.style]}\n contentContainerStyle={contentContainerStyle}\n onScroll={scrollHandler}\n ListHeaderComponent={renderListHeader()}\n onContentSizeChange={handleContentSizeChange}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n },\n contentContainer: {\n flexGrow: 1,\n },\n topView: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["CollapsibleHeaderContainer.tsx"],"names":["key","CollapsibleHeaderContainer","children","containerStyle","contentKey","scrollY","handleHeaderContainerLayout","headerHeight","undefined","handleHeaderLayout","nativeEvent","layout","height","value","duration","headerTranslate","Animated","Extrapolate","CLAMP","headerStyle","transform","translateY","minHeight","internalStyle","zIndex","styles","container","StyleSheet","create","backgroundColor"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AAOA;;AAOA;;;;;;;;AAjBA;AAwBA,IAAIA,GAAG,GAAG,CAAV;;AAEe,SAASC,0BAAT,CAAoC;AACjDC,EAAAA,QADiD;AAEjDC,EAAAA;AAFiD,CAApC,EAGL;AACR,QAAMC,UAAU,GAAG,oBAAQ,MAAO,sBAAqBJ,GAAG,EAAG,EAA1C,EAA6C,EAA7C,CAAnB;AACA,QAAM;AAAEK,IAAAA;AAAF,MAAc,qCAApB;AACA,QAAM;AAAEC,IAAAA;AAAF,MAAkC,mEAAxC;AACA,QAAMC,YAAY,GAAG,2CAAe,CAAf,CAArB;AAEA,wBAAU,MAAM;AACd,WAAO,MAAMD,2BAA2B,CAACF,UAAD,EAAaI,SAAb,CAAxC;AACD,GAFD,EAEG,EAFH;AAIA,QAAMC,kBAAkB,GAAG,wBACzB,CAAC;AACCC,IAAAA,WAAW,EAAE;AACXC,MAAAA,MAAM,EAAE;AAAEC,QAAAA;AAAF;AADG;AADd,GAAD,KAIyB;AACvBL,IAAAA,YAAY,CAACM,KAAb,GAAqB,uCAAWD,MAAX,EAAmB;AACtCE,MAAAA,QAAQ,EAAE;AAD4B,KAAnB,CAArB;AAGAR,IAAAA,2BAA2B,CAACF,UAAD,EAAaQ,MAAb,CAA3B;AACD,GAVwB,EAWzB,CAACR,UAAD,EAAaE,2BAAb,CAXyB,CAA3B;AAcA,QAAMS,eAAe,GAAG,4CACtB,MACE,wCACEV,OAAO,CAACQ,KADV,EAEE;AACA,GAAC,CAAC,GAAF,EAAO,CAAP,EAAU,MAAV,CAHF,EAIE,CAAC,GAAD,EAAM,CAAN,EAAS,CAAC,MAAV,CAJF,EAKEG,+BAASC,WAAT,CAAqBC,KALvB,CAFoB,EAStB,EATsB,CAAxB;AAYA,QAAMC,WAAW,GAAG,6CAAiB,MAAM;AACzC,WAAO;AACLC,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEN,eAAe,CAACF;AAA9B,OAAD,CADN;AAELS,MAAAA,SAAS,EAAEf,YAAY,CAACM;AAFnB,KAAP;AAID,GALmB,EAKjB,CAACN,YAAD,EAAeQ,eAAf,CALiB,CAApB;AAOA,QAAMQ,aAAa,GAAG,oBAAQ,MAAM;AAClC,WAAO;AACLC,MAAAA,MAAM,EAAE,SAASxB;AADZ,KAAP;AAGD,GAJqB,EAInB,EAJmB,CAAtB;AAMA,sBACE,6BAAC,8BAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CAACyB,MAAM,CAACC,SAAR,EAAmBP,WAAnB,EAAgCI,aAAhC,CADT;AAEE,IAAA,aAAa,EAAC;AAFhB,kBAIE,6BAAC,iBAAD;AACE,IAAA,GAAG,EAAEnB,UADP;AAEE,IAAA,QAAQ,EAAEK,kBAFZ;AAGE,IAAA,aAAa,EAAC,UAHhB;AAIE,IAAA,KAAK,EAAEN;AAJT,KAMGD,QANH,CAJF,CADF;AAeD;;AAED,MAAMuB,MAAM,GAAGE,wBAAWC,MAAX,CAAkB;AAC/BF,EAAAA,SAAS,EAAE;AACTG,IAAAA,eAAe,EAAE;AADR;AADoB,CAAlB,CAAf","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\nimport React, { ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport {\n LayoutChangeEvent,\n StyleProp,\n StyleSheet,\n View,\n ViewStyle,\n} from 'react-native';\nimport Animated, {\n interpolate,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\n\ntype Props = {\n children: ReactNode;\n containerStyle?: StyleProp<ViewStyle>;\n};\n\nlet key = 0;\n\nexport default function CollapsibleHeaderContainer({\n children,\n containerStyle,\n}: Props) {\n const contentKey = useMemo(() => `collapsible-header-${key++}`, []);\n const { scrollY } = useCollapsibleContext();\n const { handleHeaderContainerLayout } = useInternalCollapsibleContext();\n const headerHeight = useSharedValue(0);\n\n useEffect(() => {\n return () => handleHeaderContainerLayout(contentKey, undefined);\n }, []);\n\n const handleHeaderLayout = useCallback(\n ({\n nativeEvent: {\n layout: { height },\n },\n }: LayoutChangeEvent) => {\n headerHeight.value = withTiming(height, {\n duration: 200,\n });\n handleHeaderContainerLayout(contentKey, height);\n },\n [contentKey, handleHeaderContainerLayout]\n );\n\n const headerTranslate = useDerivedValue(\n () =>\n interpolate(\n scrollY.value,\n // FIXME: can improve by geting maxY value of header and sticky views\n [-250, 0, 100000],\n [250, 0, -100000],\n Animated.Extrapolate.CLAMP\n ),\n []\n );\n\n const headerStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateY: headerTranslate.value }],\n minHeight: headerHeight.value,\n };\n }, [headerHeight, headerTranslate]);\n\n const internalStyle = useMemo(() => {\n return {\n zIndex: 100000 - key,\n };\n }, []);\n\n return (\n <Animated.View\n style={[styles.container, headerStyle, internalStyle]}\n pointerEvents=\"box-none\"\n >\n <View\n key={contentKey}\n onLayout={handleHeaderLayout}\n pointerEvents=\"box-none\"\n style={containerStyle}\n >\n {children}\n </View>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: 'white',\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["CollapsibleScrollView.tsx"],"names":["CollapsibleScrollView","headerSnappable","children","props","scrollView","contentMinHeight","headerHeight","scrollTo","yValue","animated","current","y","scrollHandler","animatedStyle","minHeight","value","contentContainerStyle","styles","contentContainer","container","style","StyleSheet","create","absoluteFillObject","flexGrow","topView","position","top","left","right"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;;;AAOe,SAASA,qBAAT,CAA+B;AAC5CC,EAAAA,eAAe,GAAG,IAD0B;AAE5CC,EAAAA,QAF4C;AAG5C,KAAGC;AAHyC,CAA/B,EAIL;AACR,QAAMC,UAAU,GAAG,mBAA4B,IAA5B,CAAnB;AACA,QAAM;AAAEC,IAAAA;AAAF,MAAuB,mEAA7B;AACA,QAAM;AAAEC,IAAAA;AAAF,MAAmB,qCAAzB;AAEA,QAAMC,QAAQ,GAAG,wBAAY,CAACC,MAAD,EAAiBC,QAAQ,GAAG,IAA5B,KAAqC;AAAA;;AAChE;AACA,2BAAAL,UAAU,CAACM,OAAX,4EAAoBH,QAApB,CAA6B;AAAEI,MAAAA,CAAC,EAAEH,MAAL;AAAaC,MAAAA;AAAb,KAA7B;AACD,GAHgB,EAGd,EAHc,CAAjB;AAKA,QAAM;AAAEG,IAAAA;AAAF,MAAoB,gCAAkB;AAC1CX,IAAAA,eAD0C;AAE1CM,IAAAA;AAF0C,GAAlB,CAA1B;AAKA,QAAMM,aAAa,GAAG,6CAAiB,MAAM;AAC3C,WAAO;AACLC,MAAAA,SAAS,EAAET,gBAAgB,CAACU;AADvB,KAAP;AAGD,GAJqB,EAInB,EAJmB,CAAtB;AAMA,QAAMC,qBAAqB,GAAG,oBAC5B,MAAM,CAACC,MAAM,CAACC,gBAAR,EAA0Bf,KAAK,CAACa,qBAAhC,CADsB,EAE5B,CAACb,KAAK,CAACa,qBAAP,CAF4B,CAA9B;AAKA,sBACE,6BAAC,8BAAD,CAAU,UAAV;AACE,IAAA,GAAG,EAAEZ,UADP;AAEE,IAAA,OAAO,EAAE;AAFX,KAGMD,KAHN;AAIE,IAAA,KAAK,EAAE,CAACc,MAAM,CAACE,SAAR,EAAmBhB,KAAK,CAACiB,KAAzB,CAJT;AAKE,IAAA,qBAAqB,EAAEJ,qBALzB;AAME,IAAA,QAAQ,EAAEJ,aANZ;AAOE,IAAA,mBAAmB,EAAC,SAPtB;AAQE,IAAA,yBAAyB,EAAC,SAR5B;AASE,IAAA,mBAAmB,EAAE;AATvB,mBAWE,6BAAC,8BAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEC;AAAtB,kBACE,6BAAC,wBAAD;AAAiB,IAAA,MAAM,EAAEP;AAAzB,IADF,EAEGJ,QAFH,CAXF,CADF;AAkBD;;AAED,MAAMe,MAAM,GAAGI,wBAAWC,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE,EACT,GAAGE,wBAAWE;AADL,GADoB;AAI/BL,EAAAA,gBAAgB,EAAE;AAChBM,IAAAA,QAAQ,EAAE;AADM,GAJa;AAO/BC,EAAAA,OAAO,EAAE;AACPC,IAAAA,QAAQ,EAAE,UADH;AAEPC,IAAAA,GAAG,EAAE,CAFE;AAGPC,IAAAA,IAAI,EAAE,CAHC;AAIPC,IAAAA,KAAK,EAAE;AAJA;AAPsB,CAAlB,CAAf","sourcesContent":["import AnimatedTopView from './AnimatedTopView';\nimport useAnimatedScroll from '../hooks/useAnimatedScroll';\nimport React, { ReactNode, useCallback, useMemo, useRef } from 'react';\nimport { ScrollViewProps, StyleSheet } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport type { CollapsibleProps } from '../types';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\n\ntype Props = ScrollViewProps &\n CollapsibleProps & {\n children?: ReactNode;\n };\n\nexport default function CollapsibleScrollView({\n headerSnappable = true,\n children,\n ...props\n}: Props) {\n const scrollView = useRef<Animated.ScrollView>(null);\n const { contentMinHeight } = useInternalCollapsibleContext();\n const { headerHeight } = useCollapsibleContext();\n\n const scrollTo = useCallback((yValue: number, animated = true) => {\n // @ts-ignore\n scrollView.current?.scrollTo({ y: yValue, animated });\n }, []);\n\n const { scrollHandler } = useAnimatedScroll({\n headerSnappable,\n scrollTo,\n });\n\n const animatedStyle = useAnimatedStyle(() => {\n return {\n minHeight: contentMinHeight.value,\n };\n }, []);\n\n const contentContainerStyle = useMemo(\n () => [styles.contentContainer, props.contentContainerStyle],\n [props.contentContainerStyle]\n );\n\n return (\n <Animated.ScrollView\n ref={scrollView}\n bounces={false}\n {...props}\n style={[styles.container, props.style]}\n contentContainerStyle={contentContainerStyle}\n onScroll={scrollHandler}\n keyboardDismissMode=\"on-drag\"\n keyboardShouldPersistTaps=\"handled\"\n scrollEventThrottle={16}\n >\n <Animated.View style={animatedStyle}>\n <AnimatedTopView height={headerHeight} />\n {children}\n </Animated.View>\n </Animated.ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n },\n contentContainer: {\n flexGrow: 1,\n },\n topView: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["StickyView.tsx"],"names":["stickyKey","StickyView","children","style","key","viewRef","containerRef","handleStickyViewLayout","stickyViewTops","scrollY","layoutValues","top","height","undefined","handleLayout","current","measureLayout","left","width","value","animatedStyle","inputMid","translateY","Extrapolate","CLAMP","transform","styles","container","StyleSheet","create","backgroundColor","zIndex"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AALA;AAiBA,IAAIA,SAAS,GAAG,CAAhB;;AAEe,SAASC,UAAT,CAAoB;AAAEC,EAAAA,QAAF;AAAYC,EAAAA;AAAZ,CAApB,EAAgD;AAC7D,QAAMC,GAAG,GAAG,oBAAQ,MAAO,UAASJ,SAAS,EAAG,EAApC,EAAuC,EAAvC,CAAZ;AACA,QAAMK,OAAO,GAAG,mBAAa,IAAb,CAAhB;AACA,QAAM;AAAEC,IAAAA,YAAF;AAAgBC,IAAAA,sBAAhB;AAAwCC,IAAAA;AAAxC,MACJ,mEADF;AAEA,QAAM;AAAEC,IAAAA;AAAF,MAAc,qCAApB;AACA,QAAMC,YAAY,GAAG,2CAAe;AAAEC,IAAAA,GAAG,EAAE,CAAP;AAAUC,IAAAA,MAAM,EAAE;AAAlB,GAAf,CAArB;AAEA,wBAAU,MAAM;AACd,WAAO,MAAML,sBAAsB,CAACH,GAAD,EAAMS,SAAN,CAAnC;AACD,GAFD,EAEG,EAFH;AAIA,QAAMC,YAAY,GAAG,wBAAY,MAAM;AACrC,QAAIT,OAAO,CAACU,OAAR,IAAmBT,YAAY,CAACS,OAApC,EAA6C;AAC3CV,MAAAA,OAAO,CAACU,OAAR,CAAgBC,aAAhB,EACE;AACAV,MAAAA,YAAY,CAACS,OAFf,EAGE,CAACE,IAAD,EAAON,GAAP,EAAYO,KAAZ,EAAmBN,MAAnB,KAA8B;AAC5BL,QAAAA,sBAAsB,CAACH,GAAD,EAAM;AAAEa,UAAAA,IAAF;AAAQN,UAAAA,GAAR;AAAaO,UAAAA,KAAb;AAAoBN,UAAAA;AAApB,SAAN,CAAtB;AACAF,QAAAA,YAAY,CAACS,KAAb,GAAqB;AAAER,UAAAA,GAAF;AAAOC,UAAAA;AAAP,SAArB;AACD,OANH,EAOE,MAAM,CAAE,CAPV;AASD;AACF,GAZoB,EAYlB,CAACL,sBAAD,CAZkB,CAArB;AAcA,QAAMa,aAAa,GAAG,6CAAiB,MAAM;AAC3C,UAAMT,GAAG,GAAGH,cAAc,CAACW,KAAf,CAAqBf,GAArB,KAA6B,CAAzC;AACA,UAAMiB,QAAQ,GAAGX,YAAY,CAACS,KAAb,CAAmBR,GAAnB,GAAyBA,GAA1C;AACA,UAAMW,UAAU,GAAG,wCACjBb,OAAO,CAACU,KADS,EAEjB,CAAC,CAAD,EAAIE,QAAJ,EAAcA,QAAQ,GAAG,MAAzB,CAFiB,EAGjB,CAAC,CAAD,EAAI,CAAJ,EAAO,MAAP,CAHiB,EAIjBE,mCAAYC,KAJK,CAAnB;AAMA,WAAO;AACLC,MAAAA,SAAS,EAAE,CACT;AACEH,QAAAA,UAAU,EAAEA;AADd,OADS;AADN,KAAP;AAOD,GAhBqB,EAgBnB,CAACd,cAAD,EAAiBE,YAAjB,EAA+BD,OAA/B,CAhBmB,CAAtB;AAkBA,sBACE,6BAAC,8BAAD,CAAU,IAAV;AACE,IAAA,GAAG,EAAEL,GADP,CAEE;AAFF;AAGE,IAAA,GAAG,EAAEC,OAHP;AAIE,IAAA,QAAQ,EAAES,YAJZ;AAKE,IAAA,KAAK,EAAE,CAACY,MAAM,CAACC,SAAR,EAAmBP,aAAnB,EAAkCjB,KAAlC,CALT;AAME,IAAA,aAAa,EAAC;AANhB,KAQGD,QARH,CADF;AAYD;;AAED,MAAMwB,MAAM,GAAGE,wBAAWC,MAAX,CAAkB;AAC/BF,EAAAA,SAAS,EAAE;AACTG,IAAAA,eAAe,EAAE,OADR;AAETC,IAAAA,MAAM,EAAE;AAFC;AADoB,CAAlB,CAAf","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n useSharedValue,\n} from 'react-native-reanimated';\n\ntype Props = {\n style?: StyleProp<ViewStyle>;\n children: Element;\n};\n\nlet stickyKey = 0;\n\nexport default function StickyView({ children, style }: Props) {\n const key = useMemo(() => `sticky_${stickyKey++}`, []);\n const viewRef = useRef<View>(null);\n const { containerRef, handleStickyViewLayout, stickyViewTops } =\n useInternalCollapsibleContext();\n const { scrollY } = useCollapsibleContext();\n const layoutValues = useSharedValue({ top: 0, height: 0 });\n\n useEffect(() => {\n return () => handleStickyViewLayout(key, undefined);\n }, []);\n\n const handleLayout = useCallback(() => {\n if (viewRef.current && containerRef.current) {\n viewRef.current.measureLayout(\n // @ts-ignore\n containerRef.current,\n (left, top, width, height) => {\n handleStickyViewLayout(key, { left, top, width, height });\n layoutValues.value = { top, height };\n },\n () => {}\n );\n }\n }, [handleStickyViewLayout]);\n\n const animatedStyle = useAnimatedStyle(() => {\n const top = stickyViewTops.value[key] || 0;\n const inputMid = layoutValues.value.top - top;\n const translateY = interpolate(\n scrollY.value,\n [0, inputMid, inputMid + 100000],\n [0, 0, 100000],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateY: translateY,\n },\n ],\n };\n }, [stickyViewTops, layoutValues, scrollY]);\n\n return (\n <Animated.View\n key={key}\n // @ts-ignore\n ref={viewRef}\n onLayout={handleLayout}\n style={[styles.container, animatedStyle, style]}\n pointerEvents=\"box-none\"\n >\n {children}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: 'white',\n zIndex: 10,\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["useAnimatedScroll.ts"],"names":["height","wHeight","Dimensions","get","useAnimatedScroll","headerSnappable","scrollTo","scrollDirection","scrollY","setCollapsibleHandlers","firstStickyViewY","fixedHeaderHeight","value","requestAnimationFrame","collapse","Math","min","current","expand","scrollHandler","onScroll","event","offset","contentOffset","y","diff","onEndDrag","maxY","delta","abs","yValue"],"mappings":"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","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { useCallback, useEffect } from 'react';\nimport { Dimensions } from 'react-native';\nimport {\n runOnJS,\n useAnimatedScrollHandler,\n useSharedValue,\n} from 'react-native-reanimated';\nimport useCollapsibleContext from './useCollapsibleContext';\nimport { useInternalCollapsibleContext } from './useInternalCollapsibleContext';\n\nconst { height: wHeight } = Dimensions.get('window');\n\ntype Props = {\n headerSnappable: boolean;\n scrollTo: (yValue: number, animated?: boolean) => void;\n};\n\nexport default function useAnimatedScroll({\n headerSnappable,\n scrollTo,\n}: Props) {\n const scrollDirection = useSharedValue('unknown');\n const { scrollY } = useCollapsibleContext();\n const { setCollapsibleHandlers, firstStickyViewY, fixedHeaderHeight } =\n useInternalCollapsibleContext();\n\n useEffect(() => {\n if (scrollY.value > 0) {\n requestAnimationFrame(() => scrollTo(scrollY.value, false));\n }\n }, []);\n\n const collapse = useCallback(() => {\n scrollTo(\n Math.min(fixedHeaderHeight.current || 0, firstStickyViewY.current || 0)\n );\n }, [scrollTo, fixedHeaderHeight.current, firstStickyViewY.current]);\n\n const expand = useCallback(() => scrollTo(0), [scrollTo]);\n\n useEffect(() => {\n setCollapsibleHandlers({\n collapse,\n expand,\n scrollTo,\n });\n }, [setCollapsibleHandlers, collapse, expand, scrollTo]);\n\n const scrollHandler = useAnimatedScrollHandler(\n {\n onScroll: (event) => {\n const offset = event.contentOffset.y;\n const diff = scrollY.value - offset;\n scrollDirection.value = diff > 0 ? 'down' : diff < 0 ? 'up' : 'unknown';\n scrollY.value = offset;\n },\n onEndDrag: () => {\n if (!headerSnappable) return;\n const maxY =\n firstStickyViewY.current && firstStickyViewY.current > 0\n ? firstStickyViewY.current\n : fixedHeaderHeight.current || 0;\n\n if (scrollY.value < maxY) {\n const delta = Math.abs(scrollY.value - maxY);\n if (delta < wHeight / 2) {\n let yValue = 0;\n if (scrollDirection.value === 'up') {\n yValue = maxY;\n }\n runOnJS(scrollTo)(yValue);\n }\n }\n },\n },\n [firstStickyViewY.current, fixedHeaderHeight.current]\n );\n\n return {\n scrollHandler,\n collapse,\n expand,\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["withCollapsibleContext.tsx"],"names":["withCollapsibleContext","Component","props","collapsibleHandlers","headerHeight","scrollY","headerCollapsed","contentMinHeight","stickyViewTops","stickyHeaderHeight","containerHeight","firstStickyViewY","fixedHeaderHeight","headerContainersHeight","stickyViewPositions","containerRef","setCollapsibleHandlers","handlers","current","refreshHeaderCollapsed","maxY","isCollapsed","value","refreshMinContentHeight","populateData","viewPositions","sortedKeys","Object","keys","sort","a","b","top","totalTop","values","i","length","height","stickyHeader","reduce","acc","key","data","isInsideHeader","handleStickyViewLayout","viewKey","layout","handleHeaderContainerLayout","totalHeight","duration","handleContainerHeight","context","collapse","expand","scrollTo","offset","animate","internalContext"],"mappings":"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","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { FC, useCallback, useMemo, useRef } from 'react';\nimport type { CollapsibleHandles, LayoutParams } from '../types';\nimport { CollapsibleContext } from './useCollapsibleContext';\nimport { InternalCollapsibleContext } from './useInternalCollapsibleContext';\nimport { useSharedValue, withTiming } from 'react-native-reanimated';\nimport type { View } from 'react-native';\n\nexport default function withCollapsibleContext<T>(Component: FC<T>) {\n return (props: T) => {\n const collapsibleHandlers = useRef<CollapsibleHandles>();\n const headerHeight = useSharedValue(0);\n const scrollY = useSharedValue(0);\n const headerCollapsed = useSharedValue(false);\n const contentMinHeight = useSharedValue(0);\n const stickyViewTops = useSharedValue<Record<string, number>>({});\n const stickyHeaderHeight = useRef(0);\n const containerHeight = useRef(0);\n const firstStickyViewY = useRef(1000000);\n const fixedHeaderHeight = useRef(0);\n const headerContainersHeight = useRef<Record<string, number>>({});\n const stickyViewPositions = useRef<Record<string, LayoutParams>>({});\n const containerRef = useRef<View>(null);\n\n const setCollapsibleHandlers = useCallback((handlers) => {\n collapsibleHandlers.current = handlers;\n }, []);\n\n const refreshHeaderCollapsed = useCallback(() => {\n const maxY = fixedHeaderHeight.current - firstStickyViewY.current;\n const isCollapsed = scrollY.value >= maxY;\n headerCollapsed.value = isCollapsed;\n }, []);\n\n const refreshMinContentHeight = useCallback(() => {\n contentMinHeight.value =\n containerHeight.current +\n fixedHeaderHeight.current -\n stickyHeaderHeight.current;\n }, []);\n\n const populateData = useCallback(() => {\n const viewPositions = stickyViewPositions.current;\n const headerHeight = fixedHeaderHeight.current;\n\n const sortedKeys = Object.keys(viewPositions).sort(\n (a, b) => viewPositions[a].top - viewPositions[b].top\n );\n let totalTop = 0;\n const values: any = {};\n for (let i = 0; i < sortedKeys.length; i++) {\n values[sortedKeys[i]] = totalTop;\n // Try minus 1 make it filled when scrolling up.\n // Otherwise, we can see a small space between the persits views\n totalTop += viewPositions[sortedKeys[i]].height - 1;\n }\n stickyViewTops.value = values;\n firstStickyViewY.current = viewPositions[sortedKeys[0]]?.top || 0;\n refreshHeaderCollapsed();\n const stickyHeader = sortedKeys.reduce((acc, key) => {\n const data = viewPositions[key];\n const isInsideHeader = data.top < headerHeight;\n if (isInsideHeader) {\n return acc + data.height;\n }\n return acc;\n }, 0);\n stickyHeaderHeight.current = stickyHeader;\n refreshMinContentHeight();\n }, [stickyViewPositions.current, fixedHeaderHeight.current]);\n\n const handleStickyViewLayout = useCallback(\n (viewKey: string, layout?: LayoutParams) => {\n if (!layout) {\n delete stickyViewPositions.current[viewKey];\n } else {\n stickyViewPositions.current = {\n ...stickyViewPositions.current,\n [viewKey]: layout,\n };\n }\n populateData();\n },\n [populateData, fixedHeaderHeight]\n );\n\n const handleHeaderContainerLayout = useCallback(\n (viewKey: string, height?: number) => {\n if (!height) {\n delete headerContainersHeight.current[viewKey];\n } else {\n headerContainersHeight.current[viewKey] = height;\n }\n const totalHeight = Object.keys(headerContainersHeight.current).reduce(\n (acc, key) => headerContainersHeight.current[key] + acc,\n 0\n );\n headerHeight.value = withTiming(totalHeight, {\n duration: fixedHeaderHeight.current === 0 ? 0 : 200,\n });\n fixedHeaderHeight.current = totalHeight;\n\n populateData();\n refreshHeaderCollapsed();\n refreshMinContentHeight();\n },\n [populateData, refreshHeaderCollapsed, refreshMinContentHeight]\n );\n\n const handleContainerHeight = useCallback(\n (height: number) => {\n containerHeight.current = height;\n refreshMinContentHeight();\n },\n [refreshMinContentHeight]\n );\n\n const context = useMemo(() => {\n return {\n collapse: () => collapsibleHandlers.current?.collapse(),\n expand: () => collapsibleHandlers.current?.expand(),\n scrollTo: (offset: number, animate?: boolean) =>\n collapsibleHandlers.current?.scrollTo(offset, animate),\n headerHeight,\n scrollY,\n headerCollapsed,\n };\n }, [scrollY, headerHeight, headerCollapsed]);\n\n const internalContext = useMemo(\n () => ({\n containerRef,\n handleStickyViewLayout,\n handleHeaderContainerLayout,\n setCollapsibleHandlers,\n handleContainerHeight,\n firstStickyViewY,\n stickyViewTops,\n fixedHeaderHeight,\n stickyHeaderHeight,\n contentMinHeight,\n }),\n [\n setCollapsibleHandlers,\n handleStickyViewLayout,\n handleHeaderContainerLayout,\n handleContainerHeight,\n firstStickyViewY,\n stickyViewTops,\n fixedHeaderHeight,\n stickyHeaderHeight,\n contentMinHeight,\n ]\n );\n\n return (\n <CollapsibleContext.Provider value={context}>\n <InternalCollapsibleContext.Provider value={internalContext}>\n <Component {...props} />\n </InternalCollapsibleContext.Provider>\n </CollapsibleContext.Provider>\n );\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["CollapsibleFlatList.tsx"],"names":["React","useCallback","useEffect","useMemo","useRef","useState","FlatList","View","StyleSheet","Animated","runOnJS","useDerivedValue","AnimatedTopView","useAnimatedScroll","useCollapsibleContext","useInternalCollapsibleContext","AnimatedFlatList","createAnimatedComponent","CollapsibleFlatList","headerSnappable","props","scrollView","headerHeight","contentMinHeight","mounted","contentHeight","current","scrollTo","yValue","animated","scrollToOffset","offset","handleInternalContentHeight","value","setInternalContentMinHeight","scrollHandler","internalContentMinHeight","contentContainerStyle","styles","contentContainer","minHeight","handleContentSizeChange","_","height","renderListHeader","ListHeaderComponent","container","style","create","absoluteFillObject","flexGrow","topView","position","top","left","right"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FlatListProps, FlatList, View, StyleSheet } from 'react-native';\nimport Animated, { runOnJS, useDerivedValue } from 'react-native-reanimated';\nimport AnimatedTopView from './AnimatedTopView';\nimport useAnimatedScroll from '../hooks/useAnimatedScroll';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\nimport type { CollapsibleProps } from '../types';\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\n\nconst AnimatedFlatList = Animated.createAnimatedComponent(FlatList);\n\ntype Props<Data> = Omit<FlatListProps<Data>, 'scrollEnabled'> &\n CollapsibleProps;\n\nexport default function CollapsibleFlatList<Data>({\n headerSnappable = true,\n ...props\n}: Props<Data>) {\n const scrollView = useRef<FlatList>(null);\n const { headerHeight } = useCollapsibleContext();\n const { contentMinHeight } = useInternalCollapsibleContext();\n const mounted = useRef(true);\n const contentHeight = useRef(0);\n\n useEffect(() => {\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const scrollTo = useCallback((yValue: number, animated = true) => {\n scrollView.current?.scrollToOffset({\n offset: yValue,\n animated,\n });\n }, []);\n\n const handleInternalContentHeight = useCallback((value: number) => {\n if (mounted.current) {\n setInternalContentMinHeight(value);\n }\n }, []);\n\n const { scrollHandler } = useAnimatedScroll({\n headerSnappable,\n scrollTo,\n });\n\n const [internalContentMinHeight, setInternalContentMinHeight] = useState(\n contentMinHeight.value\n );\n\n useDerivedValue(() => {\n if (\n contentHeight.current < contentMinHeight.value &&\n contentMinHeight.value !== internalContentMinHeight\n ) {\n runOnJS(handleInternalContentHeight)(contentMinHeight.value);\n }\n }, [internalContentMinHeight, contentHeight.current]);\n\n const contentContainerStyle = useMemo(\n () => [\n styles.contentContainer,\n { minHeight: internalContentMinHeight },\n props.contentContainerStyle,\n ],\n [props.contentContainerStyle, internalContentMinHeight]\n );\n\n const handleContentSizeChange = useCallback((_, height) => {\n contentHeight.current = height;\n }, []);\n\n const renderListHeader = () => (\n <View>\n <AnimatedTopView height={headerHeight} />\n {props.ListHeaderComponent}\n </View>\n );\n\n return (\n // @ts-ignore\n <AnimatedFlatList\n ref={scrollView}\n bounces={false}\n keyboardDismissMode=\"on-drag\"\n keyboardShouldPersistTaps=\"handled\"\n scrollEventThrottle={16}\n {...props}\n style={[styles.container, props.style]}\n contentContainerStyle={contentContainerStyle}\n onScroll={scrollHandler}\n ListHeaderComponent={renderListHeader()}\n onContentSizeChange={handleContentSizeChange}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n },\n contentContainer: {\n flexGrow: 1,\n },\n topView: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["CollapsibleHeaderContainer.tsx"],"names":["useInternalCollapsibleContext","React","useCallback","useEffect","useMemo","StyleSheet","View","Animated","interpolate","useAnimatedStyle","useDerivedValue","useSharedValue","withTiming","useCollapsibleContext","key","CollapsibleHeaderContainer","children","containerStyle","contentKey","scrollY","handleHeaderContainerLayout","headerHeight","undefined","handleHeaderLayout","nativeEvent","layout","height","value","duration","headerTranslate","Extrapolate","CLAMP","headerStyle","transform","translateY","minHeight","internalStyle","zIndex","styles","container","create","backgroundColor"],"mappings":"AAAA;AACA,SAASA,6BAAT,QAA8C,wCAA9C;AACA,OAAOC,KAAP,IAA2BC,WAA3B,EAAwCC,SAAxC,EAAmDC,OAAnD,QAAkE,OAAlE;AACA,SAGEC,UAHF,EAIEC,IAJF,QAMO,cANP;AAOA,OAAOC,QAAP,IACEC,WADF,EAEEC,gBAFF,EAGEC,eAHF,EAIEC,cAJF,EAKEC,UALF,QAMO,yBANP;AAOA,OAAOC,qBAAP,MAAkC,gCAAlC;AAOA,IAAIC,GAAG,GAAG,CAAV;AAEA,eAAe,SAASC,0BAAT,CAAoC;AACjDC,EAAAA,QADiD;AAEjDC,EAAAA;AAFiD,CAApC,EAGL;AACR,QAAMC,UAAU,GAAGd,OAAO,CAAC,MAAO,sBAAqBU,GAAG,EAAG,EAAnC,EAAsC,EAAtC,CAA1B;AACA,QAAM;AAAEK,IAAAA;AAAF,MAAcN,qBAAqB,EAAzC;AACA,QAAM;AAAEO,IAAAA;AAAF,MAAkCpB,6BAA6B,EAArE;AACA,QAAMqB,YAAY,GAAGV,cAAc,CAAC,CAAD,CAAnC;AAEAR,EAAAA,SAAS,CAAC,MAAM;AACd,WAAO,MAAMiB,2BAA2B,CAACF,UAAD,EAAaI,SAAb,CAAxC;AACD,GAFQ,EAEN,EAFM,CAAT;AAIA,QAAMC,kBAAkB,GAAGrB,WAAW,CACpC,CAAC;AACCsB,IAAAA,WAAW,EAAE;AACXC,MAAAA,MAAM,EAAE;AAAEC,QAAAA;AAAF;AADG;AADd,GAAD,KAIyB;AACvBL,IAAAA,YAAY,CAACM,KAAb,GAAqBf,UAAU,CAACc,MAAD,EAAS;AACtCE,MAAAA,QAAQ,EAAE;AAD4B,KAAT,CAA/B;AAGAR,IAAAA,2BAA2B,CAACF,UAAD,EAAaQ,MAAb,CAA3B;AACD,GAVmC,EAWpC,CAACR,UAAD,EAAaE,2BAAb,CAXoC,CAAtC;AAcA,QAAMS,eAAe,GAAGnB,eAAe,CACrC,MACEF,WAAW,CACTW,OAAO,CAACQ,KADC,EAET;AACA,GAAC,CAAC,GAAF,EAAO,CAAP,EAAU,MAAV,CAHS,EAIT,CAAC,GAAD,EAAM,CAAN,EAAS,CAAC,MAAV,CAJS,EAKTpB,QAAQ,CAACuB,WAAT,CAAqBC,KALZ,CAFwB,EASrC,EATqC,CAAvC;AAYA,QAAMC,WAAW,GAAGvB,gBAAgB,CAAC,MAAM;AACzC,WAAO;AACLwB,MAAAA,SAAS,EAAE,CAAC;AAAEC,QAAAA,UAAU,EAAEL,eAAe,CAACF;AAA9B,OAAD,CADN;AAELQ,MAAAA,SAAS,EAAEd,YAAY,CAACM;AAFnB,KAAP;AAID,GALmC,EAKjC,CAACN,YAAD,EAAeQ,eAAf,CALiC,CAApC;AAOA,QAAMO,aAAa,GAAGhC,OAAO,CAAC,MAAM;AAClC,WAAO;AACLiC,MAAAA,MAAM,EAAE,SAASvB;AADZ,KAAP;AAGD,GAJ4B,EAI1B,EAJ0B,CAA7B;AAMA,sBACE,oBAAC,QAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CAACwB,MAAM,CAACC,SAAR,EAAmBP,WAAnB,EAAgCI,aAAhC,CADT;AAEE,IAAA,aAAa,EAAC;AAFhB,kBAIE,oBAAC,IAAD;AACE,IAAA,GAAG,EAAElB,UADP;AAEE,IAAA,QAAQ,EAAEK,kBAFZ;AAGE,IAAA,aAAa,EAAC,UAHhB;AAIE,IAAA,KAAK,EAAEN;AAJT,KAMGD,QANH,CAJF,CADF;AAeD;AAED,MAAMsB,MAAM,GAAGjC,UAAU,CAACmC,MAAX,CAAkB;AAC/BD,EAAAA,SAAS,EAAE;AACTE,IAAAA,eAAe,EAAE;AADR;AADoB,CAAlB,CAAf","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\nimport React, { ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport {\n LayoutChangeEvent,\n StyleProp,\n StyleSheet,\n View,\n ViewStyle,\n} from 'react-native';\nimport Animated, {\n interpolate,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\n\ntype Props = {\n children: ReactNode;\n containerStyle?: StyleProp<ViewStyle>;\n};\n\nlet key = 0;\n\nexport default function CollapsibleHeaderContainer({\n children,\n containerStyle,\n}: Props) {\n const contentKey = useMemo(() => `collapsible-header-${key++}`, []);\n const { scrollY } = useCollapsibleContext();\n const { handleHeaderContainerLayout } = useInternalCollapsibleContext();\n const headerHeight = useSharedValue(0);\n\n useEffect(() => {\n return () => handleHeaderContainerLayout(contentKey, undefined);\n }, []);\n\n const handleHeaderLayout = useCallback(\n ({\n nativeEvent: {\n layout: { height },\n },\n }: LayoutChangeEvent) => {\n headerHeight.value = withTiming(height, {\n duration: 200,\n });\n handleHeaderContainerLayout(contentKey, height);\n },\n [contentKey, handleHeaderContainerLayout]\n );\n\n const headerTranslate = useDerivedValue(\n () =>\n interpolate(\n scrollY.value,\n // FIXME: can improve by geting maxY value of header and sticky views\n [-250, 0, 100000],\n [250, 0, -100000],\n Animated.Extrapolate.CLAMP\n ),\n []\n );\n\n const headerStyle = useAnimatedStyle(() => {\n return {\n transform: [{ translateY: headerTranslate.value }],\n minHeight: headerHeight.value,\n };\n }, [headerHeight, headerTranslate]);\n\n const internalStyle = useMemo(() => {\n return {\n zIndex: 100000 - key,\n };\n }, []);\n\n return (\n <Animated.View\n style={[styles.container, headerStyle, internalStyle]}\n pointerEvents=\"box-none\"\n >\n <View\n key={contentKey}\n onLayout={handleHeaderLayout}\n pointerEvents=\"box-none\"\n style={containerStyle}\n >\n {children}\n </View>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: 'white',\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["CollapsibleScrollView.tsx"],"names":["AnimatedTopView","useAnimatedScroll","React","useCallback","useMemo","useRef","StyleSheet","Animated","useAnimatedStyle","useCollapsibleContext","useInternalCollapsibleContext","CollapsibleScrollView","headerSnappable","children","props","scrollView","contentMinHeight","headerHeight","scrollTo","yValue","animated","current","y","scrollHandler","animatedStyle","minHeight","value","contentContainerStyle","styles","contentContainer","container","style","create","absoluteFillObject","flexGrow","topView","position","top","left","right"],"mappings":";;AAAA,OAAOA,eAAP,MAA4B,mBAA5B;AACA,OAAOC,iBAAP,MAA8B,4BAA9B;AACA,OAAOC,KAAP,IAA2BC,WAA3B,EAAwCC,OAAxC,EAAiDC,MAAjD,QAA+D,OAA/D;AACA,SAA0BC,UAA1B,QAA4C,cAA5C;AACA,OAAOC,QAAP,IAAmBC,gBAAnB,QAA2C,yBAA3C;AAEA,OAAOC,qBAAP,MAAkC,gCAAlC;AACA,SAASC,6BAAT,QAA8C,wCAA9C;AAOA,eAAe,SAASC,qBAAT,CAA+B;AAC5CC,EAAAA,eAAe,GAAG,IAD0B;AAE5CC,EAAAA,QAF4C;AAG5C,KAAGC;AAHyC,CAA/B,EAIL;AACR,QAAMC,UAAU,GAAGV,MAAM,CAAsB,IAAtB,CAAzB;AACA,QAAM;AAAEW,IAAAA;AAAF,MAAuBN,6BAA6B,EAA1D;AACA,QAAM;AAAEO,IAAAA;AAAF,MAAmBR,qBAAqB,EAA9C;AAEA,QAAMS,QAAQ,GAAGf,WAAW,CAAC,CAACgB,MAAD,EAAiBC,QAAQ,GAAG,IAA5B,KAAqC;AAAA;;AAChE;AACA,2BAAAL,UAAU,CAACM,OAAX,4EAAoBH,QAApB,CAA6B;AAAEI,MAAAA,CAAC,EAAEH,MAAL;AAAaC,MAAAA;AAAb,KAA7B;AACD,GAH2B,EAGzB,EAHyB,CAA5B;AAKA,QAAM;AAAEG,IAAAA;AAAF,MAAoBtB,iBAAiB,CAAC;AAC1CW,IAAAA,eAD0C;AAE1CM,IAAAA;AAF0C,GAAD,CAA3C;AAKA,QAAMM,aAAa,GAAGhB,gBAAgB,CAAC,MAAM;AAC3C,WAAO;AACLiB,MAAAA,SAAS,EAAET,gBAAgB,CAACU;AADvB,KAAP;AAGD,GAJqC,EAInC,EAJmC,CAAtC;AAMA,QAAMC,qBAAqB,GAAGvB,OAAO,CACnC,MAAM,CAACwB,MAAM,CAACC,gBAAR,EAA0Bf,KAAK,CAACa,qBAAhC,CAD6B,EAEnC,CAACb,KAAK,CAACa,qBAAP,CAFmC,CAArC;AAKA,sBACE,oBAAC,QAAD,CAAU,UAAV;AACE,IAAA,GAAG,EAAEZ,UADP;AAEE,IAAA,OAAO,EAAE;AAFX,KAGMD,KAHN;AAIE,IAAA,KAAK,EAAE,CAACc,MAAM,CAACE,SAAR,EAAmBhB,KAAK,CAACiB,KAAzB,CAJT;AAKE,IAAA,qBAAqB,EAAEJ,qBALzB;AAME,IAAA,QAAQ,EAAEJ,aANZ;AAOE,IAAA,mBAAmB,EAAC,SAPtB;AAQE,IAAA,yBAAyB,EAAC,SAR5B;AASE,IAAA,mBAAmB,EAAE;AATvB,mBAWE,oBAAC,QAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEC;AAAtB,kBACE,oBAAC,eAAD;AAAiB,IAAA,MAAM,EAAEP;AAAzB,IADF,EAEGJ,QAFH,CAXF,CADF;AAkBD;AAED,MAAMe,MAAM,GAAGtB,UAAU,CAAC0B,MAAX,CAAkB;AAC/BF,EAAAA,SAAS,EAAE,EACT,GAAGxB,UAAU,CAAC2B;AADL,GADoB;AAI/BJ,EAAAA,gBAAgB,EAAE;AAChBK,IAAAA,QAAQ,EAAE;AADM,GAJa;AAO/BC,EAAAA,OAAO,EAAE;AACPC,IAAAA,QAAQ,EAAE,UADH;AAEPC,IAAAA,GAAG,EAAE,CAFE;AAGPC,IAAAA,IAAI,EAAE,CAHC;AAIPC,IAAAA,KAAK,EAAE;AAJA;AAPsB,CAAlB,CAAf","sourcesContent":["import AnimatedTopView from './AnimatedTopView';\nimport useAnimatedScroll from '../hooks/useAnimatedScroll';\nimport React, { ReactNode, useCallback, useMemo, useRef } from 'react';\nimport { ScrollViewProps, StyleSheet } from 'react-native';\nimport Animated, { useAnimatedStyle } from 'react-native-reanimated';\nimport type { CollapsibleProps } from '../types';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\n\ntype Props = ScrollViewProps &\n CollapsibleProps & {\n children?: ReactNode;\n };\n\nexport default function CollapsibleScrollView({\n headerSnappable = true,\n children,\n ...props\n}: Props) {\n const scrollView = useRef<Animated.ScrollView>(null);\n const { contentMinHeight } = useInternalCollapsibleContext();\n const { headerHeight } = useCollapsibleContext();\n\n const scrollTo = useCallback((yValue: number, animated = true) => {\n // @ts-ignore\n scrollView.current?.scrollTo({ y: yValue, animated });\n }, []);\n\n const { scrollHandler } = useAnimatedScroll({\n headerSnappable,\n scrollTo,\n });\n\n const animatedStyle = useAnimatedStyle(() => {\n return {\n minHeight: contentMinHeight.value,\n };\n }, []);\n\n const contentContainerStyle = useMemo(\n () => [styles.contentContainer, props.contentContainerStyle],\n [props.contentContainerStyle]\n );\n\n return (\n <Animated.ScrollView\n ref={scrollView}\n bounces={false}\n {...props}\n style={[styles.container, props.style]}\n contentContainerStyle={contentContainerStyle}\n onScroll={scrollHandler}\n keyboardDismissMode=\"on-drag\"\n keyboardShouldPersistTaps=\"handled\"\n scrollEventThrottle={16}\n >\n <Animated.View style={animatedStyle}>\n <AnimatedTopView height={headerHeight} />\n {children}\n </Animated.View>\n </Animated.ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n },\n contentContainer: {\n flexGrow: 1,\n },\n topView: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["StickyView.tsx"],"names":["useInternalCollapsibleContext","React","useCallback","useEffect","useMemo","useRef","StyleSheet","useCollapsibleContext","Animated","Extrapolate","interpolate","useAnimatedStyle","useSharedValue","stickyKey","StickyView","children","style","key","viewRef","containerRef","handleStickyViewLayout","stickyViewTops","scrollY","layoutValues","top","height","undefined","handleLayout","current","measureLayout","left","width","value","animatedStyle","inputMid","translateY","CLAMP","transform","styles","container","create","backgroundColor","zIndex"],"mappings":"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","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { useInternalCollapsibleContext } from '../hooks/useInternalCollapsibleContext';\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';\nimport useCollapsibleContext from '../hooks/useCollapsibleContext';\nimport Animated, {\n Extrapolate,\n interpolate,\n useAnimatedStyle,\n useSharedValue,\n} from 'react-native-reanimated';\n\ntype Props = {\n style?: StyleProp<ViewStyle>;\n children: Element;\n};\n\nlet stickyKey = 0;\n\nexport default function StickyView({ children, style }: Props) {\n const key = useMemo(() => `sticky_${stickyKey++}`, []);\n const viewRef = useRef<View>(null);\n const { containerRef, handleStickyViewLayout, stickyViewTops } =\n useInternalCollapsibleContext();\n const { scrollY } = useCollapsibleContext();\n const layoutValues = useSharedValue({ top: 0, height: 0 });\n\n useEffect(() => {\n return () => handleStickyViewLayout(key, undefined);\n }, []);\n\n const handleLayout = useCallback(() => {\n if (viewRef.current && containerRef.current) {\n viewRef.current.measureLayout(\n // @ts-ignore\n containerRef.current,\n (left, top, width, height) => {\n handleStickyViewLayout(key, { left, top, width, height });\n layoutValues.value = { top, height };\n },\n () => {}\n );\n }\n }, [handleStickyViewLayout]);\n\n const animatedStyle = useAnimatedStyle(() => {\n const top = stickyViewTops.value[key] || 0;\n const inputMid = layoutValues.value.top - top;\n const translateY = interpolate(\n scrollY.value,\n [0, inputMid, inputMid + 100000],\n [0, 0, 100000],\n Extrapolate.CLAMP\n );\n return {\n transform: [\n {\n translateY: translateY,\n },\n ],\n };\n }, [stickyViewTops, layoutValues, scrollY]);\n\n return (\n <Animated.View\n key={key}\n // @ts-ignore\n ref={viewRef}\n onLayout={handleLayout}\n style={[styles.container, animatedStyle, style]}\n pointerEvents=\"box-none\"\n >\n {children}\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n backgroundColor: 'white',\n zIndex: 10,\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["useAnimatedScroll.ts"],"names":["useCallback","useEffect","Dimensions","runOnJS","useAnimatedScrollHandler","useSharedValue","useCollapsibleContext","useInternalCollapsibleContext","height","wHeight","get","useAnimatedScroll","headerSnappable","scrollTo","scrollDirection","scrollY","setCollapsibleHandlers","firstStickyViewY","fixedHeaderHeight","value","requestAnimationFrame","collapse","Math","min","current","expand","scrollHandler","onScroll","event","offset","contentOffset","y","diff","onEndDrag","maxY","delta","abs","yValue"],"mappings":"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","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport { useCallback, useEffect } from 'react';\nimport { Dimensions } from 'react-native';\nimport {\n runOnJS,\n useAnimatedScrollHandler,\n useSharedValue,\n} from 'react-native-reanimated';\nimport useCollapsibleContext from './useCollapsibleContext';\nimport { useInternalCollapsibleContext } from './useInternalCollapsibleContext';\n\nconst { height: wHeight } = Dimensions.get('window');\n\ntype Props = {\n headerSnappable: boolean;\n scrollTo: (yValue: number, animated?: boolean) => void;\n};\n\nexport default function useAnimatedScroll({\n headerSnappable,\n scrollTo,\n}: Props) {\n const scrollDirection = useSharedValue('unknown');\n const { scrollY } = useCollapsibleContext();\n const { setCollapsibleHandlers, firstStickyViewY, fixedHeaderHeight } =\n useInternalCollapsibleContext();\n\n useEffect(() => {\n if (scrollY.value > 0) {\n requestAnimationFrame(() => scrollTo(scrollY.value, false));\n }\n }, []);\n\n const collapse = useCallback(() => {\n scrollTo(\n Math.min(fixedHeaderHeight.current || 0, firstStickyViewY.current || 0)\n );\n }, [scrollTo, fixedHeaderHeight.current, firstStickyViewY.current]);\n\n const expand = useCallback(() => scrollTo(0), [scrollTo]);\n\n useEffect(() => {\n setCollapsibleHandlers({\n collapse,\n expand,\n scrollTo,\n });\n }, [setCollapsibleHandlers, collapse, expand, scrollTo]);\n\n const scrollHandler = useAnimatedScrollHandler(\n {\n onScroll: (event) => {\n const offset = event.contentOffset.y;\n const diff = scrollY.value - offset;\n scrollDirection.value = diff > 0 ? 'down' : diff < 0 ? 'up' : 'unknown';\n scrollY.value = offset;\n },\n onEndDrag: () => {\n if (!headerSnappable) return;\n const maxY =\n firstStickyViewY.current && firstStickyViewY.current > 0\n ? firstStickyViewY.current\n : fixedHeaderHeight.current || 0;\n\n if (scrollY.value < maxY) {\n const delta = Math.abs(scrollY.value - maxY);\n if (delta < wHeight / 2) {\n let yValue = 0;\n if (scrollDirection.value === 'up') {\n yValue = maxY;\n }\n runOnJS(scrollTo)(yValue);\n }\n }\n },\n },\n [firstStickyViewY.current, fixedHeaderHeight.current]\n );\n\n return {\n scrollHandler,\n collapse,\n expand,\n };\n}\n"]}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
/* eslint-disable react-hooks/exhaustive-deps */
|
|
2
|
-
import React, { useCallback, useMemo, useRef } from 'react';
|
|
3
|
-
import { CollapsibleContext } from './useCollapsibleContext';
|
|
4
|
-
import { InternalCollapsibleContext } from './useInternalCollapsibleContext';
|
|
5
|
-
import { useSharedValue, withTiming } from 'react-native-reanimated';
|
|
6
|
-
export default function withCollapsibleContext(Component) {
|
|
7
|
-
return props => {
|
|
8
|
-
const collapsibleHandlers = useRef();
|
|
9
|
-
const headerHeight = useSharedValue(0);
|
|
10
|
-
const scrollY = useSharedValue(0);
|
|
11
|
-
const headerCollapsed = useSharedValue(false);
|
|
12
|
-
const contentMinHeight = useSharedValue(0);
|
|
13
|
-
const stickyViewTops = useSharedValue({});
|
|
14
|
-
const stickyHeaderHeight = useRef(0);
|
|
15
|
-
const containerHeight = useRef(0);
|
|
16
|
-
const firstStickyViewY = useRef(1000000);
|
|
17
|
-
const fixedHeaderHeight = useRef(0);
|
|
18
|
-
const headerContainersHeight = useRef({});
|
|
19
|
-
const stickyViewPositions = useRef({});
|
|
20
|
-
const containerRef = useRef(null);
|
|
21
|
-
const setCollapsibleHandlers = useCallback(handlers => {
|
|
22
|
-
collapsibleHandlers.current = handlers;
|
|
23
|
-
}, []);
|
|
24
|
-
const refreshHeaderCollapsed = useCallback(() => {
|
|
25
|
-
const maxY = fixedHeaderHeight.current - firstStickyViewY.current;
|
|
26
|
-
const isCollapsed = scrollY.value >= maxY;
|
|
27
|
-
headerCollapsed.value = isCollapsed;
|
|
28
|
-
}, []);
|
|
29
|
-
const refreshMinContentHeight = useCallback(() => {
|
|
30
|
-
contentMinHeight.value = containerHeight.current + fixedHeaderHeight.current - stickyHeaderHeight.current;
|
|
31
|
-
}, []);
|
|
32
|
-
const populateData = useCallback(() => {
|
|
33
|
-
var _viewPositions$sorted;
|
|
34
|
-
|
|
35
|
-
const viewPositions = stickyViewPositions.current;
|
|
36
|
-
const headerHeight = fixedHeaderHeight.current;
|
|
37
|
-
const sortedKeys = Object.keys(viewPositions).sort((a, b) => viewPositions[a].top - viewPositions[b].top);
|
|
38
|
-
let totalTop = 0;
|
|
39
|
-
const values = {};
|
|
40
|
-
|
|
41
|
-
for (let i = 0; i < sortedKeys.length; i++) {
|
|
42
|
-
values[sortedKeys[i]] = totalTop; // Try minus 1 make it filled when scrolling up.
|
|
43
|
-
// Otherwise, we can see a small space between the persits views
|
|
44
|
-
|
|
45
|
-
totalTop += viewPositions[sortedKeys[i]].height - 1;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
stickyViewTops.value = values;
|
|
49
|
-
firstStickyViewY.current = ((_viewPositions$sorted = viewPositions[sortedKeys[0]]) === null || _viewPositions$sorted === void 0 ? void 0 : _viewPositions$sorted.top) || 0;
|
|
50
|
-
refreshHeaderCollapsed();
|
|
51
|
-
const stickyHeader = sortedKeys.reduce((acc, key) => {
|
|
52
|
-
const data = viewPositions[key];
|
|
53
|
-
const isInsideHeader = data.top < headerHeight;
|
|
54
|
-
|
|
55
|
-
if (isInsideHeader) {
|
|
56
|
-
return acc + data.height;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return acc;
|
|
60
|
-
}, 0);
|
|
61
|
-
stickyHeaderHeight.current = stickyHeader;
|
|
62
|
-
refreshMinContentHeight();
|
|
63
|
-
}, [stickyViewPositions.current, fixedHeaderHeight.current]);
|
|
64
|
-
const handleStickyViewLayout = useCallback((viewKey, layout) => {
|
|
65
|
-
if (!layout) {
|
|
66
|
-
delete stickyViewPositions.current[viewKey];
|
|
67
|
-
} else {
|
|
68
|
-
stickyViewPositions.current = { ...stickyViewPositions.current,
|
|
69
|
-
[viewKey]: layout
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
populateData();
|
|
74
|
-
}, [populateData, fixedHeaderHeight]);
|
|
75
|
-
const handleHeaderContainerLayout = useCallback((viewKey, height) => {
|
|
76
|
-
if (!height) {
|
|
77
|
-
delete headerContainersHeight.current[viewKey];
|
|
78
|
-
} else {
|
|
79
|
-
headerContainersHeight.current[viewKey] = height;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const totalHeight = Object.keys(headerContainersHeight.current).reduce((acc, key) => headerContainersHeight.current[key] + acc, 0);
|
|
83
|
-
headerHeight.value = withTiming(totalHeight, {
|
|
84
|
-
duration: fixedHeaderHeight.current === 0 ? 0 : 200
|
|
85
|
-
});
|
|
86
|
-
fixedHeaderHeight.current = totalHeight;
|
|
87
|
-
populateData();
|
|
88
|
-
refreshHeaderCollapsed();
|
|
89
|
-
refreshMinContentHeight();
|
|
90
|
-
}, [populateData, refreshHeaderCollapsed, refreshMinContentHeight]);
|
|
91
|
-
const handleContainerHeight = useCallback(height => {
|
|
92
|
-
containerHeight.current = height;
|
|
93
|
-
refreshMinContentHeight();
|
|
94
|
-
}, [refreshMinContentHeight]);
|
|
95
|
-
const context = useMemo(() => {
|
|
96
|
-
return {
|
|
97
|
-
collapse: () => {
|
|
98
|
-
var _collapsibleHandlers$;
|
|
99
|
-
|
|
100
|
-
return (_collapsibleHandlers$ = collapsibleHandlers.current) === null || _collapsibleHandlers$ === void 0 ? void 0 : _collapsibleHandlers$.collapse();
|
|
101
|
-
},
|
|
102
|
-
expand: () => {
|
|
103
|
-
var _collapsibleHandlers$2;
|
|
104
|
-
|
|
105
|
-
return (_collapsibleHandlers$2 = collapsibleHandlers.current) === null || _collapsibleHandlers$2 === void 0 ? void 0 : _collapsibleHandlers$2.expand();
|
|
106
|
-
},
|
|
107
|
-
scrollTo: (offset, animate) => {
|
|
108
|
-
var _collapsibleHandlers$3;
|
|
109
|
-
|
|
110
|
-
return (_collapsibleHandlers$3 = collapsibleHandlers.current) === null || _collapsibleHandlers$3 === void 0 ? void 0 : _collapsibleHandlers$3.scrollTo(offset, animate);
|
|
111
|
-
},
|
|
112
|
-
headerHeight,
|
|
113
|
-
scrollY,
|
|
114
|
-
headerCollapsed
|
|
115
|
-
};
|
|
116
|
-
}, [scrollY, headerHeight, headerCollapsed]);
|
|
117
|
-
const internalContext = useMemo(() => ({
|
|
118
|
-
containerRef,
|
|
119
|
-
handleStickyViewLayout,
|
|
120
|
-
handleHeaderContainerLayout,
|
|
121
|
-
setCollapsibleHandlers,
|
|
122
|
-
handleContainerHeight,
|
|
123
|
-
firstStickyViewY,
|
|
124
|
-
stickyViewTops,
|
|
125
|
-
fixedHeaderHeight,
|
|
126
|
-
stickyHeaderHeight,
|
|
127
|
-
contentMinHeight
|
|
128
|
-
}), [setCollapsibleHandlers, handleStickyViewLayout, handleHeaderContainerLayout, handleContainerHeight, firstStickyViewY, stickyViewTops, fixedHeaderHeight, stickyHeaderHeight, contentMinHeight]);
|
|
129
|
-
return /*#__PURE__*/React.createElement(CollapsibleContext.Provider, {
|
|
130
|
-
value: context
|
|
131
|
-
}, /*#__PURE__*/React.createElement(InternalCollapsibleContext.Provider, {
|
|
132
|
-
value: internalContext
|
|
133
|
-
}, /*#__PURE__*/React.createElement(Component, props)));
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=withCollapsibleContext.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["withCollapsibleContext.tsx"],"names":["React","useCallback","useMemo","useRef","CollapsibleContext","InternalCollapsibleContext","useSharedValue","withTiming","withCollapsibleContext","Component","props","collapsibleHandlers","headerHeight","scrollY","headerCollapsed","contentMinHeight","stickyViewTops","stickyHeaderHeight","containerHeight","firstStickyViewY","fixedHeaderHeight","headerContainersHeight","stickyViewPositions","containerRef","setCollapsibleHandlers","handlers","current","refreshHeaderCollapsed","maxY","isCollapsed","value","refreshMinContentHeight","populateData","viewPositions","sortedKeys","Object","keys","sort","a","b","top","totalTop","values","i","length","height","stickyHeader","reduce","acc","key","data","isInsideHeader","handleStickyViewLayout","viewKey","layout","handleHeaderContainerLayout","totalHeight","duration","handleContainerHeight","context","collapse","expand","scrollTo","offset","animate","internalContext"],"mappings":"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","sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { FC, useCallback, useMemo, useRef } from 'react';\nimport type { CollapsibleHandles, LayoutParams } from '../types';\nimport { CollapsibleContext } from './useCollapsibleContext';\nimport { InternalCollapsibleContext } from './useInternalCollapsibleContext';\nimport { useSharedValue, withTiming } from 'react-native-reanimated';\nimport type { View } from 'react-native';\n\nexport default function withCollapsibleContext<T>(Component: FC<T>) {\n return (props: T) => {\n const collapsibleHandlers = useRef<CollapsibleHandles>();\n const headerHeight = useSharedValue(0);\n const scrollY = useSharedValue(0);\n const headerCollapsed = useSharedValue(false);\n const contentMinHeight = useSharedValue(0);\n const stickyViewTops = useSharedValue<Record<string, number>>({});\n const stickyHeaderHeight = useRef(0);\n const containerHeight = useRef(0);\n const firstStickyViewY = useRef(1000000);\n const fixedHeaderHeight = useRef(0);\n const headerContainersHeight = useRef<Record<string, number>>({});\n const stickyViewPositions = useRef<Record<string, LayoutParams>>({});\n const containerRef = useRef<View>(null);\n\n const setCollapsibleHandlers = useCallback((handlers) => {\n collapsibleHandlers.current = handlers;\n }, []);\n\n const refreshHeaderCollapsed = useCallback(() => {\n const maxY = fixedHeaderHeight.current - firstStickyViewY.current;\n const isCollapsed = scrollY.value >= maxY;\n headerCollapsed.value = isCollapsed;\n }, []);\n\n const refreshMinContentHeight = useCallback(() => {\n contentMinHeight.value =\n containerHeight.current +\n fixedHeaderHeight.current -\n stickyHeaderHeight.current;\n }, []);\n\n const populateData = useCallback(() => {\n const viewPositions = stickyViewPositions.current;\n const headerHeight = fixedHeaderHeight.current;\n\n const sortedKeys = Object.keys(viewPositions).sort(\n (a, b) => viewPositions[a].top - viewPositions[b].top\n );\n let totalTop = 0;\n const values: any = {};\n for (let i = 0; i < sortedKeys.length; i++) {\n values[sortedKeys[i]] = totalTop;\n // Try minus 1 make it filled when scrolling up.\n // Otherwise, we can see a small space between the persits views\n totalTop += viewPositions[sortedKeys[i]].height - 1;\n }\n stickyViewTops.value = values;\n firstStickyViewY.current = viewPositions[sortedKeys[0]]?.top || 0;\n refreshHeaderCollapsed();\n const stickyHeader = sortedKeys.reduce((acc, key) => {\n const data = viewPositions[key];\n const isInsideHeader = data.top < headerHeight;\n if (isInsideHeader) {\n return acc + data.height;\n }\n return acc;\n }, 0);\n stickyHeaderHeight.current = stickyHeader;\n refreshMinContentHeight();\n }, [stickyViewPositions.current, fixedHeaderHeight.current]);\n\n const handleStickyViewLayout = useCallback(\n (viewKey: string, layout?: LayoutParams) => {\n if (!layout) {\n delete stickyViewPositions.current[viewKey];\n } else {\n stickyViewPositions.current = {\n ...stickyViewPositions.current,\n [viewKey]: layout,\n };\n }\n populateData();\n },\n [populateData, fixedHeaderHeight]\n );\n\n const handleHeaderContainerLayout = useCallback(\n (viewKey: string, height?: number) => {\n if (!height) {\n delete headerContainersHeight.current[viewKey];\n } else {\n headerContainersHeight.current[viewKey] = height;\n }\n const totalHeight = Object.keys(headerContainersHeight.current).reduce(\n (acc, key) => headerContainersHeight.current[key] + acc,\n 0\n );\n headerHeight.value = withTiming(totalHeight, {\n duration: fixedHeaderHeight.current === 0 ? 0 : 200,\n });\n fixedHeaderHeight.current = totalHeight;\n\n populateData();\n refreshHeaderCollapsed();\n refreshMinContentHeight();\n },\n [populateData, refreshHeaderCollapsed, refreshMinContentHeight]\n );\n\n const handleContainerHeight = useCallback(\n (height: number) => {\n containerHeight.current = height;\n refreshMinContentHeight();\n },\n [refreshMinContentHeight]\n );\n\n const context = useMemo(() => {\n return {\n collapse: () => collapsibleHandlers.current?.collapse(),\n expand: () => collapsibleHandlers.current?.expand(),\n scrollTo: (offset: number, animate?: boolean) =>\n collapsibleHandlers.current?.scrollTo(offset, animate),\n headerHeight,\n scrollY,\n headerCollapsed,\n };\n }, [scrollY, headerHeight, headerCollapsed]);\n\n const internalContext = useMemo(\n () => ({\n containerRef,\n handleStickyViewLayout,\n handleHeaderContainerLayout,\n setCollapsibleHandlers,\n handleContainerHeight,\n firstStickyViewY,\n stickyViewTops,\n fixedHeaderHeight,\n stickyHeaderHeight,\n contentMinHeight,\n }),\n [\n setCollapsibleHandlers,\n handleStickyViewLayout,\n handleHeaderContainerLayout,\n handleContainerHeight,\n firstStickyViewY,\n stickyViewTops,\n fixedHeaderHeight,\n stickyHeaderHeight,\n contentMinHeight,\n ]\n );\n\n return (\n <CollapsibleContext.Provider value={context}>\n <InternalCollapsibleContext.Provider value={internalContext}>\n <Component {...props} />\n </InternalCollapsibleContext.Provider>\n </CollapsibleContext.Provider>\n );\n };\n}\n"]}
|
package/lib/module/types.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type React from 'react';
|
|
2
|
-
import type { View } from 'react-native';
|
|
3
|
-
import type Animated from 'react-native-reanimated';
|
|
4
|
-
export declare type CollapsibleHandles = {
|
|
5
|
-
collapse: () => void;
|
|
6
|
-
expand: () => void;
|
|
7
|
-
scrollTo: (offset: number, animate?: boolean) => void;
|
|
8
|
-
};
|
|
9
|
-
export declare type CollapsibleContextType = CollapsibleHandles & {
|
|
10
|
-
scrollY: Animated.SharedValue<number>;
|
|
11
|
-
headerHeight: Animated.SharedValue<number>;
|
|
12
|
-
headerCollapsed: Animated.SharedValue<boolean>;
|
|
13
|
-
};
|
|
14
|
-
export declare type LayoutParams = {
|
|
15
|
-
top: number;
|
|
16
|
-
left: number;
|
|
17
|
-
width: number;
|
|
18
|
-
height: number;
|
|
19
|
-
};
|
|
20
|
-
export declare type CollapsibleContextInternalType = {
|
|
21
|
-
containerRef: React.RefObject<View>;
|
|
22
|
-
contentMinHeight: Animated.SharedValue<number>;
|
|
23
|
-
firstStickyViewY: React.RefObject<number>;
|
|
24
|
-
stickyViewTops: Animated.SharedValue<Record<string, number>>;
|
|
25
|
-
fixedHeaderHeight: React.RefObject<number>;
|
|
26
|
-
handleContainerHeight: (height: number) => void;
|
|
27
|
-
handleStickyViewLayout: (viewKey: string, layout?: LayoutParams) => void;
|
|
28
|
-
handleHeaderContainerLayout: (viewKey: string, height?: number) => void;
|
|
29
|
-
setCollapsibleHandlers: (handlers: CollapsibleHandles) => void;
|
|
30
|
-
};
|
|
31
|
-
export declare type CollapsibleProps = {
|
|
32
|
-
headerSnappable?: boolean;
|
|
33
|
-
};
|