@r0b0t3d/react-native-collapsible 1.3.5-beta.2 → 1.3.5-beta.3
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 +1 -2
- package/lib/commonjs/components/CollapsibleContainer.js.map +1 -1
- package/lib/commonjs/components/CollapsibleView.js +1 -1
- package/lib/commonjs/components/CollapsibleView.js.map +1 -1
- package/lib/commonjs/components/header/CollapsibleHeaderContainer.js +85 -23
- package/lib/commonjs/components/header/CollapsibleHeaderContainer.js.map +1 -1
- package/lib/commonjs/components/header/StickyView.js +30 -19
- package/lib/commonjs/components/header/StickyView.js.map +1 -1
- package/lib/commonjs/components/scrollable/useAnimatedScroll.js +2 -3
- package/lib/commonjs/components/scrollable/useAnimatedScroll.js.map +1 -1
- package/lib/commonjs/hooks/useCollapsibleHeaderContext.js.map +1 -1
- package/lib/commonjs/utils/useSharedValueRef.js +21 -0
- package/lib/commonjs/utils/useSharedValueRef.js.map +1 -0
- package/lib/commonjs/withCollapsibleContext.js +37 -92
- package/lib/commonjs/withCollapsibleContext.js.map +1 -1
- package/lib/module/components/CollapsibleContainer.js +1 -2
- package/lib/module/components/CollapsibleContainer.js.map +1 -1
- package/lib/module/components/CollapsibleView.js +1 -1
- package/lib/module/components/CollapsibleView.js.map +1 -1
- package/lib/module/components/header/CollapsibleHeaderContainer.js +87 -24
- package/lib/module/components/header/CollapsibleHeaderContainer.js.map +1 -1
- package/lib/module/components/header/StickyView.js +31 -20
- package/lib/module/components/header/StickyView.js.map +1 -1
- package/lib/module/components/scrollable/useAnimatedScroll.js +2 -3
- package/lib/module/components/scrollable/useAnimatedScroll.js.map +1 -1
- package/lib/module/hooks/useCollapsibleHeaderContext.js.map +1 -1
- package/lib/module/utils/useSharedValueRef.js +15 -0
- package/lib/module/utils/useSharedValueRef.js.map +1 -0
- package/lib/module/withCollapsibleContext.js +38 -92
- package/lib/module/withCollapsibleContext.js.map +1 -1
- package/lib/typescript/components/CollapsibleContainer.d.ts.map +1 -1
- package/lib/typescript/components/header/CollapsibleHeaderContainer.d.ts +2 -2
- package/lib/typescript/components/header/CollapsibleHeaderContainer.d.ts.map +1 -1
- package/lib/typescript/components/header/StickyView.d.ts.map +1 -1
- package/lib/typescript/components/scrollable/useAnimatedScroll.d.ts.map +1 -1
- package/lib/typescript/hooks/useCollapsibleHeaderContext.d.ts +6 -11
- package/lib/typescript/hooks/useCollapsibleHeaderContext.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +6 -6
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/useSharedValueRef.d.ts +3 -0
- package/lib/typescript/utils/useSharedValueRef.d.ts.map +1 -0
- package/lib/typescript/withCollapsibleContext.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/CollapsibleContainer.tsx +0 -2
- package/src/components/CollapsibleView.tsx +1 -1
- package/src/components/header/CollapsibleHeaderContainer.tsx +145 -25
- package/src/components/header/StickyView.tsx +32 -17
- package/src/components/scrollable/useAnimatedScroll.ts +3 -9
- package/src/hooks/useCollapsibleHeaderContext.ts +6 -8
- package/src/types.ts +8 -8
- package/src/utils/useSharedValueRef.ts +22 -0
- package/src/withCollapsibleContext.tsx +46 -110
- package/lib/commonjs/components/header/CollapsibleHeaderConsumer.js +0 -59
- package/lib/commonjs/components/header/CollapsibleHeaderConsumer.js.map +0 -1
- package/lib/commonjs/components/header/CollapsibleHeaderProvider.js +0 -58
- package/lib/commonjs/components/header/CollapsibleHeaderProvider.js.map +0 -1
- package/lib/module/components/header/CollapsibleHeaderConsumer.js +0 -50
- package/lib/module/components/header/CollapsibleHeaderConsumer.js.map +0 -1
- package/lib/module/components/header/CollapsibleHeaderProvider.js +0 -49
- package/lib/module/components/header/CollapsibleHeaderProvider.js.map +0 -1
- package/lib/typescript/components/header/CollapsibleHeaderConsumer.d.ts +0 -3
- package/lib/typescript/components/header/CollapsibleHeaderConsumer.d.ts.map +0 -1
- package/lib/typescript/components/header/CollapsibleHeaderProvider.d.ts +0 -5
- package/lib/typescript/components/header/CollapsibleHeaderProvider.d.ts.map +0 -1
- package/src/components/header/CollapsibleHeaderConsumer.tsx +0 -62
- package/src/components/header/CollapsibleHeaderProvider.tsx +0 -70
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
/* eslint-disable react-hooks/exhaustive-deps */
|
|
2
2
|
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import {
|
|
4
|
+
LayoutChangeEvent,
|
|
5
|
+
LayoutRectangle,
|
|
6
|
+
StyleProp,
|
|
7
|
+
StyleSheet,
|
|
8
|
+
View,
|
|
9
|
+
ViewStyle,
|
|
10
|
+
} from 'react-native';
|
|
6
11
|
import Animated, {
|
|
7
12
|
Extrapolate,
|
|
8
13
|
interpolate,
|
|
9
14
|
useAnimatedStyle,
|
|
10
15
|
useDerivedValue,
|
|
16
|
+
useSharedValue,
|
|
11
17
|
} from 'react-native-reanimated';
|
|
18
|
+
import useCollapsibleHeaderContext from '../../hooks/useCollapsibleHeaderContext';
|
|
12
19
|
|
|
13
20
|
type Props = {
|
|
14
21
|
style?: StyleProp<ViewStyle>;
|
|
@@ -20,29 +27,37 @@ let stickyKey = 0;
|
|
|
20
27
|
export default function StickyView({ children, style }: Props) {
|
|
21
28
|
const key = useMemo(() => `sticky_${stickyKey++}`, []);
|
|
22
29
|
const viewRef = useRef<View>(null);
|
|
23
|
-
const { handleStickyViewLayout,
|
|
24
|
-
|
|
25
|
-
const { scrollY } = useCollapsibleContext();
|
|
30
|
+
const { handleStickyViewLayout, animatedY } = useCollapsibleHeaderContext();
|
|
31
|
+
const currentLayout = useSharedValue<LayoutRectangle | undefined>(undefined);
|
|
26
32
|
|
|
27
33
|
useEffect(() => {
|
|
28
34
|
return () => handleStickyViewLayout(key, undefined);
|
|
29
35
|
}, [key]);
|
|
30
36
|
|
|
31
|
-
const handleLayout = useCallback(
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
const handleLayout = useCallback(
|
|
38
|
+
({ nativeEvent: { layout } }: LayoutChangeEvent) => {
|
|
39
|
+
currentLayout.value = layout;
|
|
40
|
+
handleStickyViewLayout(key, layout);
|
|
41
|
+
},
|
|
42
|
+
[key, handleStickyViewLayout]
|
|
43
|
+
);
|
|
34
44
|
|
|
35
45
|
const translateY = useDerivedValue(() => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
46
|
+
if (!currentLayout.value) {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
const { height: stickyHeight, y: top } = currentLayout.value;
|
|
50
|
+
const topValue = top;
|
|
51
|
+
|
|
52
|
+
console.log({ key, animatedY: animatedY.value, top, stickyHeight });
|
|
53
|
+
|
|
39
54
|
return interpolate(
|
|
40
|
-
|
|
41
|
-
[0,
|
|
42
|
-
[0, 0,
|
|
55
|
+
animatedY.value,
|
|
56
|
+
[0, topValue, topValue + stickyHeight + 100],
|
|
57
|
+
[0, 0, stickyHeight + 100],
|
|
43
58
|
Extrapolate.CLAMP
|
|
44
59
|
);
|
|
45
|
-
}, [
|
|
60
|
+
}, []);
|
|
46
61
|
|
|
47
62
|
const animatedStyle = useAnimatedStyle(() => {
|
|
48
63
|
return {
|
|
@@ -60,7 +75,7 @@ export default function StickyView({ children, style }: Props) {
|
|
|
60
75
|
// @ts-ignore
|
|
61
76
|
ref={viewRef}
|
|
62
77
|
onLayout={handleLayout}
|
|
63
|
-
style={[styles.container,
|
|
78
|
+
style={[styles.container, style, animatedStyle]}
|
|
64
79
|
pointerEvents="box-none"
|
|
65
80
|
>
|
|
66
81
|
{children}
|
|
@@ -25,7 +25,7 @@ export default function useAnimatedScroll({
|
|
|
25
25
|
}: Props) {
|
|
26
26
|
const scrollDirection = useSharedValue('unknown');
|
|
27
27
|
const { scrollY } = useCollapsibleContext();
|
|
28
|
-
const { setCollapsibleHandlers,
|
|
28
|
+
const { setCollapsibleHandlers, fixedHeaderHeight } =
|
|
29
29
|
useInternalCollapsibleContext();
|
|
30
30
|
|
|
31
31
|
useEffect(() => {
|
|
@@ -36,10 +36,7 @@ export default function useAnimatedScroll({
|
|
|
36
36
|
|
|
37
37
|
const collapse = useCallback(
|
|
38
38
|
(animated = true) => {
|
|
39
|
-
scrollTo(
|
|
40
|
-
Math.min(fixedHeaderHeight.value || 0, firstStickyViewY.value || 0),
|
|
41
|
-
animated
|
|
42
|
-
);
|
|
39
|
+
scrollTo(fixedHeaderHeight.value, animated);
|
|
43
40
|
},
|
|
44
41
|
[scrollTo]
|
|
45
42
|
);
|
|
@@ -65,10 +62,7 @@ export default function useAnimatedScroll({
|
|
|
65
62
|
},
|
|
66
63
|
onEndDrag: () => {
|
|
67
64
|
if (!headerSnappable) return;
|
|
68
|
-
const maxY =
|
|
69
|
-
firstStickyViewY.value && firstStickyViewY.value > 0
|
|
70
|
-
? firstStickyViewY.value
|
|
71
|
-
: fixedHeaderHeight.value || 0;
|
|
65
|
+
const maxY = fixedHeaderHeight.value;
|
|
72
66
|
|
|
73
67
|
if (scrollY.value < maxY) {
|
|
74
68
|
const delta = Math.abs(scrollY.value - maxY);
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { createContext,
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { LayoutRectangle } from 'react-native';
|
|
3
|
+
import Animated from 'react-native-reanimated';
|
|
2
4
|
|
|
3
|
-
export type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
headers: HeaderItem[];
|
|
7
|
-
mount: (key: string, header: ReactNode) => void;
|
|
8
|
-
update: (key: string, header: ReactNode) => void;
|
|
9
|
-
unmount: (key: string) => void;
|
|
5
|
+
export type CollapsibleContextHeaderType = {
|
|
6
|
+
handleStickyViewLayout: (key: string, layout?: LayoutRectangle) => void;
|
|
7
|
+
animatedY: Animated.SharedValue<number>;
|
|
10
8
|
};
|
|
11
9
|
|
|
12
10
|
export const CollapsibleHeaderContext =
|
package/src/types.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
-
import type { View } from 'react-native';
|
|
2
|
+
import type { LayoutRectangle, View } from 'react-native';
|
|
3
3
|
import type Animated from 'react-native-reanimated';
|
|
4
4
|
|
|
5
5
|
export type ScrollToIndexParams = {
|
|
@@ -33,16 +33,16 @@ export type CollapsibleContextInternalType = {
|
|
|
33
33
|
scrollViewRef: React.RefObject<any>;
|
|
34
34
|
containerRef: React.RefObject<View>;
|
|
35
35
|
contentMinHeight: Animated.SharedValue<number>;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
headerViewPositions: Animated.SharedValue<
|
|
37
|
+
Record<string, { top: number; stickyHeight: number }>
|
|
38
|
+
>;
|
|
39
39
|
fixedHeaderHeight: Animated.SharedValue<number>;
|
|
40
40
|
handleContainerHeight: (height: number) => void;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
handleHeaderContainerLayout: (
|
|
42
|
+
key: string,
|
|
43
|
+
layout?: LayoutRectangle,
|
|
44
|
+
stickyHeight?: number
|
|
44
45
|
) => void;
|
|
45
|
-
handleHeaderContainerLayout: (height: number) => void;
|
|
46
46
|
setCollapsibleHandlers: (handlers: CollapsibleHandles) => void;
|
|
47
47
|
};
|
|
48
48
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useCallback, useRef } from 'react';
|
|
2
|
+
import Animated, { useSharedValue } from 'react-native-reanimated';
|
|
3
|
+
|
|
4
|
+
export default function useSharedValueRef<T>(
|
|
5
|
+
defaultValue: T
|
|
6
|
+
): [Animated.SharedValue<T>, (value: T) => void] {
|
|
7
|
+
const sharedValue = useSharedValue<T>(defaultValue);
|
|
8
|
+
const savedValue = useRef<T>(defaultValue);
|
|
9
|
+
|
|
10
|
+
const appendValue = useCallback(
|
|
11
|
+
(value: T) => {
|
|
12
|
+
savedValue.current = {
|
|
13
|
+
...savedValue.current,
|
|
14
|
+
...value,
|
|
15
|
+
};
|
|
16
|
+
sharedValue.value = savedValue.current;
|
|
17
|
+
},
|
|
18
|
+
[sharedValue]
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
return [sharedValue, appendValue];
|
|
22
|
+
}
|
|
@@ -1,45 +1,35 @@
|
|
|
1
1
|
/* eslint-disable react-hooks/exhaustive-deps */
|
|
2
2
|
import React, { useCallback, useMemo, useRef, FC } from 'react';
|
|
3
|
-
import type { CollapsibleHandles
|
|
3
|
+
import type { CollapsibleHandles } from './types';
|
|
4
4
|
import { CollapsibleContext } from './hooks/useCollapsibleContext';
|
|
5
5
|
import { InternalCollapsibleContext } from './hooks/useInternalCollapsibleContext';
|
|
6
6
|
import {
|
|
7
|
-
useAnimatedReaction,
|
|
8
7
|
useDerivedValue,
|
|
9
8
|
useSharedValue,
|
|
10
9
|
withTiming,
|
|
11
10
|
} from 'react-native-reanimated';
|
|
12
|
-
import type { View } from 'react-native';
|
|
13
|
-
import { debounce } from './utils/debounce';
|
|
14
|
-
import CollapsibleHeaderProvider from './components/header/CollapsibleHeaderProvider';
|
|
11
|
+
import type { LayoutRectangle, View } from 'react-native';
|
|
15
12
|
|
|
16
13
|
export default function withCollapsibleContext<T>(Component: FC<T>) {
|
|
17
14
|
return (props: T) => {
|
|
18
15
|
const collapsibleHandlers = useRef<CollapsibleHandles>();
|
|
19
16
|
const headerHeight = useSharedValue(0);
|
|
20
17
|
const scrollY = useSharedValue(0);
|
|
21
|
-
const stickyViewRefs = useRef<
|
|
22
|
-
Record<string, React.RefObject<View> | undefined>
|
|
23
|
-
>({});
|
|
24
|
-
const stickyViewTops = useSharedValue<Record<string, number>>({});
|
|
25
|
-
const stickyViewPositionsRef = useRef<
|
|
26
|
-
Record<string, LayoutParams | undefined>
|
|
27
|
-
>({});
|
|
28
|
-
const stickyViewPositions = useSharedValue<Record<string, LayoutParams>>(
|
|
29
|
-
{}
|
|
30
|
-
);
|
|
31
18
|
const fixedHeaderHeight = useSharedValue(0);
|
|
32
19
|
const containerHeight = useSharedValue(0);
|
|
33
|
-
const firstStickyViewY = useSharedValue(1000000);
|
|
34
20
|
const containerRef = useRef<View>(null);
|
|
35
21
|
const scrollViewRef = useRef<View>(null);
|
|
22
|
+
const headerContainerLayouts = useRef<
|
|
23
|
+
Record<string, (LayoutRectangle & { stickyHeight?: number }) | undefined>
|
|
24
|
+
>({});
|
|
25
|
+
const headerViewPositions = useSharedValue({});
|
|
36
26
|
|
|
37
27
|
const setCollapsibleHandlers = useCallback((handlers) => {
|
|
38
28
|
collapsibleHandlers.current = handlers;
|
|
39
29
|
}, []);
|
|
40
30
|
|
|
41
31
|
const headerCollapsed = useDerivedValue(() => {
|
|
42
|
-
const maxY = fixedHeaderHeight.value
|
|
32
|
+
const maxY = fixedHeaderHeight.value;
|
|
43
33
|
return scrollY.value >= maxY;
|
|
44
34
|
}, []);
|
|
45
35
|
|
|
@@ -47,97 +37,51 @@ export default function withCollapsibleContext<T>(Component: FC<T>) {
|
|
|
47
37
|
return containerHeight.value + fixedHeaderHeight.value;
|
|
48
38
|
}, []);
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
() => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return acc + value.top;
|
|
40
|
+
const handleHeaderContainerLayout = useCallback(
|
|
41
|
+
(key: string, layout?: LayoutRectangle, stickyHeight?: number) => {
|
|
42
|
+
headerContainerLayouts.current[key] = layout
|
|
43
|
+
? {
|
|
44
|
+
...layout,
|
|
45
|
+
stickyHeight,
|
|
57
46
|
}
|
|
58
|
-
|
|
59
|
-
|
|
47
|
+
: undefined;
|
|
48
|
+
const headerContainers = Object.keys(
|
|
49
|
+
headerContainerLayouts.current
|
|
50
|
+
).filter((k: string) => !!headerContainerLayouts.current[k]);
|
|
51
|
+
// Calculate total header height
|
|
52
|
+
const totalHeight = headerContainers.reduce(
|
|
53
|
+
(acc, value) =>
|
|
54
|
+
acc + (headerContainerLayouts.current[value]?.height ?? 0),
|
|
60
55
|
0
|
|
61
56
|
);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
.
|
|
71
|
-
let totalTop = 0;
|
|
72
|
-
const values: any = {};
|
|
73
|
-
for (let i = 0; i < sortedKeys.length; i++) {
|
|
74
|
-
// @ts-ignore
|
|
75
|
-
values[sortedKeys[i]] = totalTop;
|
|
76
|
-
// Try minus 1 make it filled when scrolling up.
|
|
77
|
-
// Otherwise, we can see a small space between the persits views
|
|
78
|
-
// @ts-ignore
|
|
79
|
-
totalTop += viewPositions[sortedKeys[i]].height - 1;
|
|
80
|
-
}
|
|
81
|
-
stickyViewTops.value = values;
|
|
82
|
-
// @ts-ignore
|
|
83
|
-
firstStickyViewY.value = viewPositions[sortedKeys[0]]?.top || 0;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
const handleStickyViewLayout = useCallback(
|
|
89
|
-
(viewKey: string, viewRef?: React.RefObject<View>) => {
|
|
90
|
-
if (viewRef && viewRef.current && containerRef.current) {
|
|
91
|
-
stickyViewRefs.current[viewKey] = viewRef;
|
|
92
|
-
viewRef.current.measureLayout(
|
|
93
|
-
// @ts-ignore
|
|
94
|
-
containerRef.current,
|
|
95
|
-
(left, top, width, height) => {
|
|
96
|
-
stickyViewPositionsRef.current = {
|
|
97
|
-
...stickyViewPositionsRef.current,
|
|
98
|
-
[viewKey]: { left, top, width, height },
|
|
99
|
-
};
|
|
100
|
-
// @ts-ignore
|
|
101
|
-
stickyViewPositions.value = stickyViewPositionsRef.current;
|
|
102
|
-
},
|
|
103
|
-
() => {}
|
|
57
|
+
headerHeight.value = withTiming(totalHeight, {
|
|
58
|
+
duration: fixedHeaderHeight.value === 0 ? 0 : 10,
|
|
59
|
+
});
|
|
60
|
+
fixedHeaderHeight.value = totalHeight;
|
|
61
|
+
// Calculate header positions
|
|
62
|
+
const sortedHeaders = headerContainers.sort((a, b) => {
|
|
63
|
+
return (
|
|
64
|
+
(headerContainerLayouts.current[a]?.y || 0) -
|
|
65
|
+
(headerContainerLayouts.current[b]?.y || 0)
|
|
104
66
|
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
67
|
+
});
|
|
68
|
+
const values: any = {};
|
|
69
|
+
let aStickyHeight = 0;
|
|
70
|
+
for (let index = 0; index < sortedHeaders.length; index++) {
|
|
71
|
+
const headerKey = sortedHeaders[index];
|
|
72
|
+
const sHeight =
|
|
73
|
+
headerContainerLayouts.current[headerKey]?.stickyHeight ?? 0;
|
|
74
|
+
values[headerKey] = {
|
|
75
|
+
top: aStickyHeight,
|
|
76
|
+
stickyHeight: sHeight,
|
|
113
77
|
};
|
|
114
|
-
|
|
115
|
-
stickyViewPositions.value = stickyViewPositionsRef.current;
|
|
78
|
+
aStickyHeight += sHeight;
|
|
116
79
|
}
|
|
80
|
+
headerViewPositions.value = values;
|
|
117
81
|
},
|
|
118
82
|
[]
|
|
119
83
|
);
|
|
120
84
|
|
|
121
|
-
const debounceRefreshStickyPositions = useMemo(() => {
|
|
122
|
-
return debounce(() => {
|
|
123
|
-
Object.keys(stickyViewRefs.current).forEach((key) => {
|
|
124
|
-
const viewRef = stickyViewRefs.current[key];
|
|
125
|
-
if (viewRef) {
|
|
126
|
-
handleStickyViewLayout(key, viewRef);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}, 200);
|
|
130
|
-
}, []);
|
|
131
|
-
|
|
132
|
-
const handleHeaderContainerLayout = useCallback((height: number) => {
|
|
133
|
-
headerHeight.value = withTiming(height, {
|
|
134
|
-
duration: fixedHeaderHeight.value === 0 ? 0 : 10,
|
|
135
|
-
});
|
|
136
|
-
fixedHeaderHeight.value = height;
|
|
137
|
-
// Try refresh sticky positions
|
|
138
|
-
debounceRefreshStickyPositions();
|
|
139
|
-
}, []);
|
|
140
|
-
|
|
141
85
|
const handleContainerHeight = useCallback((height: number) => {
|
|
142
86
|
containerHeight.value = height;
|
|
143
87
|
}, []);
|
|
@@ -161,36 +105,28 @@ export default function withCollapsibleContext<T>(Component: FC<T>) {
|
|
|
161
105
|
() => ({
|
|
162
106
|
scrollViewRef,
|
|
163
107
|
containerRef,
|
|
164
|
-
handleStickyViewLayout,
|
|
165
108
|
handleHeaderContainerLayout,
|
|
166
109
|
setCollapsibleHandlers,
|
|
167
110
|
handleContainerHeight,
|
|
168
|
-
firstStickyViewY,
|
|
169
|
-
stickyViewTops,
|
|
170
|
-
stickyViewPositions,
|
|
171
111
|
fixedHeaderHeight,
|
|
172
112
|
contentMinHeight,
|
|
113
|
+
headerViewPositions,
|
|
173
114
|
}),
|
|
174
115
|
[
|
|
175
116
|
setCollapsibleHandlers,
|
|
176
|
-
handleStickyViewLayout,
|
|
177
117
|
handleHeaderContainerLayout,
|
|
178
118
|
handleContainerHeight,
|
|
179
|
-
firstStickyViewY,
|
|
180
|
-
stickyViewTops,
|
|
181
|
-
stickyViewPositions,
|
|
182
119
|
fixedHeaderHeight,
|
|
183
120
|
contentMinHeight,
|
|
121
|
+
headerViewPositions,
|
|
184
122
|
]
|
|
185
123
|
);
|
|
186
124
|
|
|
187
125
|
return (
|
|
188
126
|
<CollapsibleContext.Provider value={context}>
|
|
189
127
|
<InternalCollapsibleContext.Provider value={internalContext}>
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
<Component {...props} />
|
|
193
|
-
</CollapsibleHeaderProvider>
|
|
128
|
+
{/** @ts-ignore */}
|
|
129
|
+
<Component {...props} />
|
|
194
130
|
</InternalCollapsibleContext.Provider>
|
|
195
131
|
</CollapsibleContext.Provider>
|
|
196
132
|
);
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = CollapsibleHeaderConsumer;
|
|
7
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
-
var _useInternalCollapsibleContext = _interopRequireDefault(require("../../hooks/useInternalCollapsibleContext"));
|
|
9
|
-
var _useCollapsibleHeaderContext = _interopRequireDefault(require("../../hooks/useCollapsibleHeaderContext"));
|
|
10
|
-
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
11
|
-
var _useCollapsibleContext = _interopRequireDefault(require("../../hooks/useCollapsibleContext"));
|
|
12
|
-
var _reactNative = require("react-native");
|
|
13
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
16
|
-
function CollapsibleHeaderConsumer() {
|
|
17
|
-
const {
|
|
18
|
-
headers
|
|
19
|
-
} = (0, _useCollapsibleHeaderContext.default)();
|
|
20
|
-
const {
|
|
21
|
-
handleHeaderContainerLayout
|
|
22
|
-
} = (0, _useInternalCollapsibleContext.default)();
|
|
23
|
-
const {
|
|
24
|
-
scrollY,
|
|
25
|
-
headerHeight
|
|
26
|
-
} = (0, _useCollapsibleContext.default)();
|
|
27
|
-
const headerTranslate = (0, _reactNativeReanimated.useDerivedValue)(() => (0, _reactNativeReanimated.interpolate)(scrollY.value,
|
|
28
|
-
// FIXME: can improve by geting maxY value of header and sticky views
|
|
29
|
-
[-1000, 0, 100000], [0, 0, -100000], 'clamp'), []);
|
|
30
|
-
const headerStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
|
|
31
|
-
return {
|
|
32
|
-
transform: [{
|
|
33
|
-
translateY: headerTranslate.value
|
|
34
|
-
}]
|
|
35
|
-
};
|
|
36
|
-
}, [headerHeight, headerTranslate]);
|
|
37
|
-
const handleHeaderLayout = (0, _react.useCallback)(_ref => {
|
|
38
|
-
let {
|
|
39
|
-
nativeEvent: {
|
|
40
|
-
layout: {
|
|
41
|
-
height
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
} = _ref;
|
|
45
|
-
handleHeaderContainerLayout(height);
|
|
46
|
-
}, [handleHeaderContainerLayout]);
|
|
47
|
-
return /*#__PURE__*/_react.default.createElement(_reactNativeReanimated.default.View, {
|
|
48
|
-
onLayout: handleHeaderLayout,
|
|
49
|
-
style: [styles.container, headerStyle],
|
|
50
|
-
pointerEvents: "box-none"
|
|
51
|
-
}, headers.map(item => item.children));
|
|
52
|
-
}
|
|
53
|
-
const styles = _reactNative.StyleSheet.create({
|
|
54
|
-
container: {
|
|
55
|
-
zIndex: 10,
|
|
56
|
-
backgroundColor: 'white'
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=CollapsibleHeaderConsumer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_useInternalCollapsibleContext","_interopRequireDefault","_useCollapsibleHeaderContext","_reactNativeReanimated","_useCollapsibleContext","_reactNative","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CollapsibleHeaderConsumer","headers","useCollapsibleHeaderContext","handleHeaderContainerLayout","useInternalCollapsibleContext","scrollY","headerHeight","useCollapsibleContext","headerTranslate","useDerivedValue","interpolate","value","headerStyle","useAnimatedStyle","transform","translateY","handleHeaderLayout","useCallback","_ref","nativeEvent","layout","height","createElement","View","onLayout","style","styles","container","pointerEvents","map","item","children","StyleSheet","create","zIndex","backgroundColor"],"sourceRoot":"../../../../src","sources":["components/header/CollapsibleHeaderConsumer.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,8BAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,4BAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,sBAAA,GAAAL,uBAAA,CAAAC,OAAA;AAKA,IAAAK,sBAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,YAAA,GAAAN,OAAA;AAA6D,SAAAE,uBAAAK,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAZ,wBAAAQ,GAAA,EAAAI,WAAA,SAAAA,WAAA,IAAAJ,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAQ,KAAA,GAAAL,wBAAA,CAAAC,WAAA,OAAAI,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAT,GAAA,YAAAQ,KAAA,CAAAE,GAAA,CAAAV,GAAA,SAAAW,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAhB,GAAA,QAAAgB,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAnB,GAAA,EAAAgB,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAf,GAAA,EAAAgB,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAhB,GAAA,CAAAgB,GAAA,SAAAL,MAAA,CAAAT,OAAA,GAAAF,GAAA,MAAAQ,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAArB,GAAA,EAAAW,MAAA,YAAAA,MAAA;AAE9C,SAASW,yBAAyBA,CAAA,EAAG;EAClD,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAAC,oCAA2B,EAAC,CAAC;EACjD,MAAM;IAAEC;EAA4B,CAAC,GAAG,IAAAC,sCAA6B,EAAC,CAAC;EACvE,MAAM;IAAEC,OAAO;IAAEC;EAAa,CAAC,GAAG,IAAAC,8BAAqB,EAAC,CAAC;EAEzD,MAAMC,eAAe,GAAG,IAAAC,sCAAe,EACrC,MACE,IAAAC,kCAAW,EACTL,OAAO,CAACM,KAAK;EACb;EACA,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAClB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EACf,OACF,CAAC,EACH,EACF,CAAC;EAED,MAAMC,WAAW,GAAG,IAAAC,uCAAgB,EAAC,MAAM;IACzC,OAAO;MACLC,SAAS,EAAE,CAAC;QAAEC,UAAU,EAAEP,eAAe,CAACG;MAAM,CAAC;IACnD,CAAC;EACH,CAAC,EAAE,CAACL,YAAY,EAAEE,eAAe,CAAC,CAAC;EAEnC,MAAMQ,kBAAkB,GAAG,IAAAC,kBAAW,EACpCC,IAAA,IAIyB;IAAA,IAJxB;MACCC,WAAW,EAAE;QACXC,MAAM,EAAE;UAAEC;QAAO;MACnB;IACiB,CAAC,GAAAH,IAAA;IAClBf,2BAA2B,CAACkB,MAAM,CAAC;EACrC,CAAC,EACD,CAAClB,2BAA2B,CAC9B,CAAC;EAED,oBACElC,MAAA,CAAAW,OAAA,CAAA0C,aAAA,CAAC/C,sBAAA,CAAAK,OAAQ,CAAC2C,IAAI;IACZC,QAAQ,EAAER,kBAAmB;IAC7BS,KAAK,EAAE,CAACC,MAAM,CAACC,SAAS,EAAEf,WAAW,CAAE;IACvCgB,aAAa,EAAC;EAAU,GAEvB3B,OAAO,CAAC4B,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,QAAQ,CACvB,CAAC;AAEpB;AAEA,MAAML,MAAM,GAAGM,uBAAU,CAACC,MAAM,CAAC;EAC/BN,SAAS,EAAE;IACTO,MAAM,EAAE,EAAE;IACVC,eAAe,EAAE;EACnB;AACF,CAAC,CAAC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = CollapsibleHeaderProvider;
|
|
7
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
-
var _useCollapsibleHeaderContext = require("../../hooks/useCollapsibleHeaderContext");
|
|
9
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
11
|
-
/* eslint-disable no-shadow */
|
|
12
|
-
|
|
13
|
-
function CollapsibleHeaderProvider(_ref) {
|
|
14
|
-
let {
|
|
15
|
-
children
|
|
16
|
-
} = _ref;
|
|
17
|
-
const [headers, setHeaders] = (0, _react.useState)([]);
|
|
18
|
-
const mounted = (0, _react.useRef)(false);
|
|
19
|
-
(0, _react.useEffect)(() => {
|
|
20
|
-
mounted.current = true;
|
|
21
|
-
return () => {
|
|
22
|
-
mounted.current = false;
|
|
23
|
-
};
|
|
24
|
-
}, []);
|
|
25
|
-
const mount = (0, _react.useCallback)((key, children) => {
|
|
26
|
-
setHeaders(prev => [...prev, {
|
|
27
|
-
key,
|
|
28
|
-
children
|
|
29
|
-
}]);
|
|
30
|
-
}, []);
|
|
31
|
-
const unmount = (0, _react.useCallback)(key => {
|
|
32
|
-
setHeaders(prev => prev.filter(h => h.key !== key));
|
|
33
|
-
}, []);
|
|
34
|
-
const update = (0, _react.useCallback)((key, children) => {
|
|
35
|
-
if (!mounted.current) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
setHeaders(prev => prev.map(item => {
|
|
39
|
-
if (item.key === key) {
|
|
40
|
-
return {
|
|
41
|
-
...item,
|
|
42
|
-
children
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
return item;
|
|
46
|
-
}));
|
|
47
|
-
}, []);
|
|
48
|
-
const context = (0, _react.useMemo)(() => ({
|
|
49
|
-
headers,
|
|
50
|
-
mount,
|
|
51
|
-
unmount,
|
|
52
|
-
update
|
|
53
|
-
}), [headers, mount, unmount, update]);
|
|
54
|
-
return /*#__PURE__*/_react.default.createElement(_useCollapsibleHeaderContext.CollapsibleHeaderContext.Provider, {
|
|
55
|
-
value: context
|
|
56
|
-
}, children);
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=CollapsibleHeaderProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_useCollapsibleHeaderContext","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CollapsibleHeaderProvider","_ref","children","headers","setHeaders","useState","mounted","useRef","useEffect","current","mount","useCallback","prev","unmount","filter","h","update","map","item","context","useMemo","createElement","CollapsibleHeaderContext","Provider","value"],"sourceRoot":"../../../../src","sources":["components/header/CollapsibleHeaderProvider.tsx"],"mappings":"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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import React, { useCallback } from 'react';
|
|
2
|
-
import useInternalCollapsibleContext from '../../hooks/useInternalCollapsibleContext';
|
|
3
|
-
import useCollapsibleHeaderContext from '../../hooks/useCollapsibleHeaderContext';
|
|
4
|
-
import Animated, { interpolate, useAnimatedStyle, useDerivedValue } from 'react-native-reanimated';
|
|
5
|
-
import useCollapsibleContext from '../../hooks/useCollapsibleContext';
|
|
6
|
-
import { StyleSheet } from 'react-native';
|
|
7
|
-
export default function CollapsibleHeaderConsumer() {
|
|
8
|
-
const {
|
|
9
|
-
headers
|
|
10
|
-
} = useCollapsibleHeaderContext();
|
|
11
|
-
const {
|
|
12
|
-
handleHeaderContainerLayout
|
|
13
|
-
} = useInternalCollapsibleContext();
|
|
14
|
-
const {
|
|
15
|
-
scrollY,
|
|
16
|
-
headerHeight
|
|
17
|
-
} = useCollapsibleContext();
|
|
18
|
-
const headerTranslate = useDerivedValue(() => interpolate(scrollY.value,
|
|
19
|
-
// FIXME: can improve by geting maxY value of header and sticky views
|
|
20
|
-
[-1000, 0, 100000], [0, 0, -100000], 'clamp'), []);
|
|
21
|
-
const headerStyle = useAnimatedStyle(() => {
|
|
22
|
-
return {
|
|
23
|
-
transform: [{
|
|
24
|
-
translateY: headerTranslate.value
|
|
25
|
-
}]
|
|
26
|
-
};
|
|
27
|
-
}, [headerHeight, headerTranslate]);
|
|
28
|
-
const handleHeaderLayout = useCallback(_ref => {
|
|
29
|
-
let {
|
|
30
|
-
nativeEvent: {
|
|
31
|
-
layout: {
|
|
32
|
-
height
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
} = _ref;
|
|
36
|
-
handleHeaderContainerLayout(height);
|
|
37
|
-
}, [handleHeaderContainerLayout]);
|
|
38
|
-
return /*#__PURE__*/React.createElement(Animated.View, {
|
|
39
|
-
onLayout: handleHeaderLayout,
|
|
40
|
-
style: [styles.container, headerStyle],
|
|
41
|
-
pointerEvents: "box-none"
|
|
42
|
-
}, headers.map(item => item.children));
|
|
43
|
-
}
|
|
44
|
-
const styles = StyleSheet.create({
|
|
45
|
-
container: {
|
|
46
|
-
zIndex: 10,
|
|
47
|
-
backgroundColor: 'white'
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
//# sourceMappingURL=CollapsibleHeaderConsumer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useInternalCollapsibleContext","useCollapsibleHeaderContext","Animated","interpolate","useAnimatedStyle","useDerivedValue","useCollapsibleContext","StyleSheet","CollapsibleHeaderConsumer","headers","handleHeaderContainerLayout","scrollY","headerHeight","headerTranslate","value","headerStyle","transform","translateY","handleHeaderLayout","_ref","nativeEvent","layout","height","createElement","View","onLayout","style","styles","container","pointerEvents","map","item","children","create","zIndex","backgroundColor"],"sourceRoot":"../../../../src","sources":["components/header/CollapsibleHeaderConsumer.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,OAAOC,6BAA6B,MAAM,2CAA2C;AACrF,OAAOC,2BAA2B,MAAM,yCAAyC;AACjF,OAAOC,QAAQ,IACbC,WAAW,EACXC,gBAAgB,EAChBC,eAAe,QACV,yBAAyB;AAChC,OAAOC,qBAAqB,MAAM,mCAAmC;AACrE,SAA4BC,UAAU,QAAQ,cAAc;AAE5D,eAAe,SAASC,yBAAyBA,CAAA,EAAG;EAClD,MAAM;IAAEC;EAAQ,CAAC,GAAGR,2BAA2B,CAAC,CAAC;EACjD,MAAM;IAAES;EAA4B,CAAC,GAAGV,6BAA6B,CAAC,CAAC;EACvE,MAAM;IAAEW,OAAO;IAAEC;EAAa,CAAC,GAAGN,qBAAqB,CAAC,CAAC;EAEzD,MAAMO,eAAe,GAAGR,eAAe,CACrC,MACEF,WAAW,CACTQ,OAAO,CAACG,KAAK;EACb;EACA,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAClB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EACf,OACF,CAAC,EACH,EACF,CAAC;EAED,MAAMC,WAAW,GAAGX,gBAAgB,CAAC,MAAM;IACzC,OAAO;MACLY,SAAS,EAAE,CAAC;QAAEC,UAAU,EAAEJ,eAAe,CAACC;MAAM,CAAC;IACnD,CAAC;EACH,CAAC,EAAE,CAACF,YAAY,EAAEC,eAAe,CAAC,CAAC;EAEnC,MAAMK,kBAAkB,GAAGnB,WAAW,CACpCoB,IAAA,IAIyB;IAAA,IAJxB;MACCC,WAAW,EAAE;QACXC,MAAM,EAAE;UAAEC;QAAO;MACnB;IACiB,CAAC,GAAAH,IAAA;IAClBT,2BAA2B,CAACY,MAAM,CAAC;EACrC,CAAC,EACD,CAACZ,2BAA2B,CAC9B,CAAC;EAED,oBACEZ,KAAA,CAAAyB,aAAA,CAACrB,QAAQ,CAACsB,IAAI;IACZC,QAAQ,EAAEP,kBAAmB;IAC7BQ,KAAK,EAAE,CAACC,MAAM,CAACC,SAAS,EAAEb,WAAW,CAAE;IACvCc,aAAa,EAAC;EAAU,GAEvBpB,OAAO,CAACqB,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,QAAQ,CACvB,CAAC;AAEpB;AAEA,MAAML,MAAM,GAAGpB,UAAU,CAAC0B,MAAM,CAAC;EAC/BL,SAAS,EAAE;IACTM,MAAM,EAAE,EAAE;IACVC,eAAe,EAAE;EACnB;AACF,CAAC,CAAC"}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-shadow */
|
|
2
|
-
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
-
import { CollapsibleHeaderContext } from '../../hooks/useCollapsibleHeaderContext';
|
|
4
|
-
export default function CollapsibleHeaderProvider(_ref) {
|
|
5
|
-
let {
|
|
6
|
-
children
|
|
7
|
-
} = _ref;
|
|
8
|
-
const [headers, setHeaders] = useState([]);
|
|
9
|
-
const mounted = useRef(false);
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
mounted.current = true;
|
|
12
|
-
return () => {
|
|
13
|
-
mounted.current = false;
|
|
14
|
-
};
|
|
15
|
-
}, []);
|
|
16
|
-
const mount = useCallback((key, children) => {
|
|
17
|
-
setHeaders(prev => [...prev, {
|
|
18
|
-
key,
|
|
19
|
-
children
|
|
20
|
-
}]);
|
|
21
|
-
}, []);
|
|
22
|
-
const unmount = useCallback(key => {
|
|
23
|
-
setHeaders(prev => prev.filter(h => h.key !== key));
|
|
24
|
-
}, []);
|
|
25
|
-
const update = useCallback((key, children) => {
|
|
26
|
-
if (!mounted.current) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
setHeaders(prev => prev.map(item => {
|
|
30
|
-
if (item.key === key) {
|
|
31
|
-
return {
|
|
32
|
-
...item,
|
|
33
|
-
children
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
return item;
|
|
37
|
-
}));
|
|
38
|
-
}, []);
|
|
39
|
-
const context = useMemo(() => ({
|
|
40
|
-
headers,
|
|
41
|
-
mount,
|
|
42
|
-
unmount,
|
|
43
|
-
update
|
|
44
|
-
}), [headers, mount, unmount, update]);
|
|
45
|
-
return /*#__PURE__*/React.createElement(CollapsibleHeaderContext.Provider, {
|
|
46
|
-
value: context
|
|
47
|
-
}, children);
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=CollapsibleHeaderProvider.js.map
|