@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.
Files changed (124) hide show
  1. package/lib/commonjs/components/CollapsibleContainer.js +4 -2
  2. package/lib/commonjs/components/CollapsibleContainer.js.map +1 -1
  3. package/lib/commonjs/components/CollapsibleView.js +4 -3
  4. package/lib/commonjs/components/CollapsibleView.js.map +1 -1
  5. package/lib/commonjs/components/{AnimatedTopView.js → header/AnimatedTopView.js} +0 -0
  6. package/lib/commonjs/components/{AnimatedTopView.js.map → header/AnimatedTopView.js.map} +0 -0
  7. package/lib/commonjs/components/{CollapsibleHeaderContainer.js → header/CollapsibleHeaderContainer.js} +9 -8
  8. package/lib/commonjs/components/header/CollapsibleHeaderContainer.js.map +1 -0
  9. package/lib/commonjs/components/{StickyView.js → header/StickyView.js} +18 -31
  10. package/lib/commonjs/components/header/StickyView.js.map +1 -0
  11. package/lib/commonjs/components/pullToRefresh/PullToRefreshContainer.js +75 -0
  12. package/lib/commonjs/components/pullToRefresh/PullToRefreshContainer.js.map +1 -0
  13. package/lib/commonjs/components/pullToRefresh/PullToRefreshProvider.js +35 -0
  14. package/lib/commonjs/components/pullToRefresh/PullToRefreshProvider.js.map +1 -0
  15. package/lib/commonjs/components/pullToRefresh/RefreshControl.js +73 -0
  16. package/lib/commonjs/components/pullToRefresh/RefreshControl.js.map +1 -0
  17. package/lib/commonjs/components/pullToRefresh/usePullToRefreshContext.js +24 -0
  18. package/lib/commonjs/components/pullToRefresh/usePullToRefreshContext.js.map +1 -0
  19. package/lib/commonjs/components/pullToRefresh/utils.js +59 -0
  20. package/lib/commonjs/components/pullToRefresh/utils.js.map +1 -0
  21. package/lib/commonjs/components/{CollapsibleFlatList.js → scrollable/CollapsibleFlatList.js} +36 -31
  22. package/lib/commonjs/components/scrollable/CollapsibleFlatList.js.map +1 -0
  23. package/lib/commonjs/components/{CollapsibleScrollView.js → scrollable/CollapsibleScrollView.js} +6 -6
  24. package/lib/commonjs/components/scrollable/CollapsibleScrollView.js.map +1 -0
  25. package/lib/commonjs/{hooks → components/scrollable}/useAnimatedScroll.js +7 -7
  26. package/lib/commonjs/components/scrollable/useAnimatedScroll.js.map +1 -0
  27. package/lib/commonjs/hooks/useInternalCollapsibleContext.js +1 -1
  28. package/lib/commonjs/hooks/useInternalCollapsibleContext.js.map +1 -1
  29. package/lib/commonjs/index.js +21 -12
  30. package/lib/commonjs/index.js.map +1 -1
  31. package/lib/commonjs/{types.js → types.d.js} +1 -1
  32. package/lib/commonjs/{types.js.map → types.d.js.map} +0 -0
  33. package/lib/commonjs/utils/debounce.js +20 -0
  34. package/lib/commonjs/utils/debounce.js.map +1 -0
  35. package/lib/commonjs/{hooks/withCollapsibleContext.js → withCollapsibleContext.js} +95 -64
  36. package/lib/commonjs/withCollapsibleContext.js.map +1 -0
  37. package/lib/module/components/CollapsibleContainer.js +1 -1
  38. package/lib/module/components/CollapsibleContainer.js.map +1 -1
  39. package/lib/module/components/CollapsibleView.js +4 -3
  40. package/lib/module/components/CollapsibleView.js.map +1 -1
  41. package/lib/module/components/{AnimatedTopView.js → header/AnimatedTopView.js} +0 -0
  42. package/lib/module/components/{AnimatedTopView.js.map → header/AnimatedTopView.js.map} +0 -0
  43. package/lib/module/components/{CollapsibleHeaderContainer.js → header/CollapsibleHeaderContainer.js} +7 -6
  44. package/lib/module/components/header/CollapsibleHeaderContainer.js.map +1 -0
  45. package/lib/module/components/{StickyView.js → header/StickyView.js} +17 -30
  46. package/lib/module/components/header/StickyView.js.map +1 -0
  47. package/lib/module/components/pullToRefresh/PullToRefreshContainer.js +56 -0
  48. package/lib/module/components/pullToRefresh/PullToRefreshContainer.js.map +1 -0
  49. package/lib/module/components/pullToRefresh/PullToRefreshProvider.js +21 -0
  50. package/lib/module/components/pullToRefresh/PullToRefreshProvider.js.map +1 -0
  51. package/lib/module/components/pullToRefresh/RefreshControl.js +55 -0
  52. package/lib/module/components/pullToRefresh/RefreshControl.js.map +1 -0
  53. package/lib/module/components/pullToRefresh/usePullToRefreshContext.js +13 -0
  54. package/lib/module/components/pullToRefresh/usePullToRefreshContext.js.map +1 -0
  55. package/lib/module/components/pullToRefresh/utils.js +42 -0
  56. package/lib/module/components/pullToRefresh/utils.js.map +1 -0
  57. package/lib/module/components/{CollapsibleFlatList.js → scrollable/CollapsibleFlatList.js} +36 -32
  58. package/lib/module/components/scrollable/CollapsibleFlatList.js.map +1 -0
  59. package/lib/module/components/{CollapsibleScrollView.js → scrollable/CollapsibleScrollView.js} +5 -5
  60. package/lib/module/components/scrollable/CollapsibleScrollView.js.map +1 -0
  61. package/lib/module/{hooks → components/scrollable}/useAnimatedScroll.js +6 -6
  62. package/lib/module/components/scrollable/useAnimatedScroll.js.map +1 -0
  63. package/lib/module/hooks/useInternalCollapsibleContext.js +1 -1
  64. package/lib/module/hooks/useInternalCollapsibleContext.js.map +1 -1
  65. package/lib/module/index.js +6 -5
  66. package/lib/module/index.js.map +1 -1
  67. package/lib/module/types.d.js +2 -0
  68. package/lib/module/{types.js.map → types.d.js.map} +0 -0
  69. package/lib/module/utils/debounce.js +13 -0
  70. package/lib/module/utils/debounce.js.map +1 -0
  71. package/lib/module/withCollapsibleContext.js +163 -0
  72. package/lib/module/withCollapsibleContext.js.map +1 -0
  73. package/lib/typescript/components/CollapsibleView.d.ts +1 -1
  74. package/lib/typescript/components/{AnimatedTopView.d.ts → header/AnimatedTopView.d.ts} +0 -0
  75. package/lib/typescript/components/{CollapsibleHeaderContainer.d.ts → header/CollapsibleHeaderContainer.d.ts} +0 -0
  76. package/lib/typescript/components/{StickyView.d.ts → header/StickyView.d.ts} +0 -0
  77. package/lib/typescript/components/pullToRefresh/PullToRefreshContainer.d.ts +8 -0
  78. package/lib/typescript/components/pullToRefresh/PullToRefreshProvider.d.ts +6 -0
  79. package/lib/typescript/components/pullToRefresh/RefreshControl.d.ts +9 -0
  80. package/lib/typescript/components/pullToRefresh/usePullToRefreshContext.d.ts +4 -0
  81. package/lib/typescript/components/pullToRefresh/utils.d.ts +20 -0
  82. package/lib/typescript/components/{CollapsibleFlatList.d.ts → scrollable/CollapsibleFlatList.d.ts} +1 -1
  83. package/lib/typescript/components/{CollapsibleScrollView.d.ts → scrollable/CollapsibleScrollView.d.ts} +1 -1
  84. package/lib/typescript/{hooks → components/scrollable}/useAnimatedScroll.d.ts +0 -0
  85. package/lib/typescript/hooks/useInternalCollapsibleContext.d.ts +1 -1
  86. package/lib/typescript/index.d.ts +6 -5
  87. package/lib/typescript/utils/debounce.d.ts +1 -0
  88. package/lib/typescript/{hooks/withCollapsibleContext.d.ts → withCollapsibleContext.d.ts} +0 -0
  89. package/package.json +4 -2
  90. package/src/components/CollapsibleContainer.tsx +1 -1
  91. package/src/components/CollapsibleView.tsx +4 -3
  92. package/src/components/{AnimatedTopView.tsx → header/AnimatedTopView.tsx} +0 -0
  93. package/src/components/{CollapsibleHeaderContainer.tsx → header/CollapsibleHeaderContainer.tsx} +6 -4
  94. package/src/components/{StickyView.tsx → header/StickyView.tsx} +15 -22
  95. package/src/components/pullToRefresh/PullToRefreshContainer.tsx +65 -0
  96. package/src/components/pullToRefresh/PullToRefreshProvider.tsx +27 -0
  97. package/src/components/pullToRefresh/RefreshControl.tsx +80 -0
  98. package/src/components/pullToRefresh/usePullToRefreshContext.ts +13 -0
  99. package/src/components/pullToRefresh/utils.ts +49 -0
  100. package/src/components/scrollable/CollapsibleFlatList.tsx +135 -0
  101. package/src/components/{CollapsibleScrollView.tsx → scrollable/CollapsibleScrollView.tsx} +6 -6
  102. package/src/{hooks → components/scrollable}/useAnimatedScroll.ts +8 -8
  103. package/src/hooks/useInternalCollapsibleContext.ts +1 -1
  104. package/src/index.tsx +6 -5
  105. package/src/{types.ts → types.d.ts} +14 -3
  106. package/src/utils/debounce.ts +10 -0
  107. package/src/withCollapsibleContext.tsx +201 -0
  108. package/lib/commonjs/components/CollapsibleFlatList.js.map +0 -1
  109. package/lib/commonjs/components/CollapsibleHeaderContainer.js.map +0 -1
  110. package/lib/commonjs/components/CollapsibleScrollView.js.map +0 -1
  111. package/lib/commonjs/components/StickyView.js.map +0 -1
  112. package/lib/commonjs/hooks/useAnimatedScroll.js.map +0 -1
  113. package/lib/commonjs/hooks/withCollapsibleContext.js.map +0 -1
  114. package/lib/module/components/CollapsibleFlatList.js.map +0 -1
  115. package/lib/module/components/CollapsibleHeaderContainer.js.map +0 -1
  116. package/lib/module/components/CollapsibleScrollView.js.map +0 -1
  117. package/lib/module/components/StickyView.js.map +0 -1
  118. package/lib/module/hooks/useAnimatedScroll.js.map +0 -1
  119. package/lib/module/hooks/withCollapsibleContext.js +0 -136
  120. package/lib/module/hooks/withCollapsibleContext.js.map +0 -1
  121. package/lib/module/types.js +0 -2
  122. package/lib/typescript/types.d.ts +0 -33
  123. package/src/components/CollapsibleFlatList.tsx +0 -119
  124. 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: React.RefObject<number>;
28
+ firstStickyViewY: Animated.SharedValue<number>;
29
+ stickyViewPositions: Animated.SharedValue<Record<string, LayoutParams>>;
28
30
  stickyViewTops: Animated.SharedValue<Record<string, number>>;
29
- fixedHeaderHeight: React.RefObject<number>;
31
+ fixedHeaderHeight: Animated.SharedValue<number>;
30
32
  handleContainerHeight: (height: number) => void;
31
- handleStickyViewLayout: (viewKey: string, layout?: LayoutParams) => void;
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"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -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
- };