Skip to content

Commit 7d10200

Browse files
committed
chore: added test screen to test issue #44
Highlights: - Added new test screen with the example code from issue #44 (#44) - Could not reproduce the issue with the TouchableOpacity not being pressable
1 parent 3cb3be7 commit 7d10200

File tree

5 files changed

+119
-0
lines changed

5 files changed

+119
-0
lines changed

example/src/navigation/AppNavigation.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
ArbitraryYTransitionHeaderUsageScreen,
1616
InvertedUsageScreen,
1717
CustomOnScrollWorkletUsageScreen,
18+
TestScreen,
1819
} from '../screens';
1920

2021
const Stack = createNativeStackNavigator<RootStackParamList>();
@@ -50,5 +51,6 @@ export default () => (
5051
name="CustomOnScrollWorkletUsageScreen"
5152
component={CustomOnScrollWorkletUsageScreen}
5253
/>
54+
<Stack.Screen name="TestScreen" component={TestScreen} />
5355
</Stack.Navigator>
5456
);

example/src/navigation/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type RootStackParamList = {
1515
ArbitraryYTransitionHeaderUsageScreen: undefined;
1616
InvertedUsageScreen: undefined;
1717
CustomOnScrollWorkletUsageScreen: undefined;
18+
TestScreen: undefined;
1819
};
1920

2021
// Overrides the typing for useNavigation in @react-navigation/native to support the internal
@@ -83,3 +84,5 @@ export type CustomOnScrollWorkletUsageScreenNavigationProps = NativeStackScreenP
8384
RootStackParamList,
8485
'CustomOnScrollWorkletUsageScreen'
8586
>;
87+
88+
export type TestScreenNavigationProps = NativeStackScreenProps<RootStackParamList, 'TestScreen'>;

example/src/screens/Home.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ const SCREEN_LIST_CONFIG: ScreenConfigItem[] = [
7676
description:
7777
"A simple example with a custom worklet that tracks the scroll container's offset.",
7878
},
79+
{
80+
name: 'Test Screen',
81+
route: 'TestScreen',
82+
description: 'A simple example of the library using the ScrollView.',
83+
},
7984
];
8085

8186
const HeaderComponent: React.FC<ScrollHeaderProps> = ({ showNavBar }) => {

example/src/screens/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ export { default as TwitterProfileScreen } from './usage/TwitterProfile';
1313
export { default as AbsoluteHeaderBlurSurfaceUsageScreen } from './usage/AbsoluteHeaderBlurSurface';
1414
export { default as ArbitraryYTransitionHeaderUsageScreen } from './usage/ArbitraryYTransitionHeader';
1515
export { default as CustomOnScrollWorkletUsageScreen } from './usage/CustomWorklet';
16+
export { default as TestScreen } from './usage/TestScreen';
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import React, { useCallback, useMemo, useState } from 'react';
2+
import { RefreshControl, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
3+
import { useSafeAreaInsets } from 'react-native-safe-area-context';
4+
import {
5+
Header,
6+
LargeHeader,
7+
ScalingView,
8+
ScrollViewWithHeaders,
9+
ScrollHeaderProps,
10+
ScrollLargeHeaderProps,
11+
} from '@codeherence/react-native-header';
12+
13+
import { range } from '../../utils';
14+
import { BackButton } from '../../components';
15+
import type { TestScreenNavigationProps } from '../../navigation';
16+
17+
const HeaderComponent: React.FC<ScrollHeaderProps> = ({ showNavBar }) => {
18+
return (
19+
<Header
20+
showNavBar={showNavBar}
21+
headerCenterFadesIn={false}
22+
borderColor="red"
23+
initialBorderColor="blue"
24+
headerCenter={
25+
<Text style={styles.navBarTitle} numberOfLines={1}>
26+
Header
27+
</Text>
28+
}
29+
headerLeft={<BackButton />}
30+
/>
31+
);
32+
};
33+
34+
const Simple: React.FC<TestScreenNavigationProps> = () => {
35+
const { bottom } = useSafeAreaInsets();
36+
const [refreshing, setRefreshing] = useState(false);
37+
38+
const data = useMemo(() => range({ end: 100 }), []);
39+
40+
const onRefresh = async () => {
41+
if (refreshing) return;
42+
43+
setRefreshing(true);
44+
// Mimic some asynchronous task
45+
await new Promise((res) => setTimeout(res, 2500));
46+
setRefreshing(false);
47+
};
48+
49+
const LargeHeaderComponent: React.FC<ScrollLargeHeaderProps> = useCallback(({ scrollY }) => {
50+
return (
51+
<LargeHeader>
52+
<ScalingView scrollY={scrollY}>
53+
<View
54+
style={{
55+
flexDirection: 'row',
56+
justifyContent: 'space-between',
57+
alignItems: 'center',
58+
paddingHorizontal: 24,
59+
}}
60+
>
61+
<Text style={{ fontSize: 24 }}>List</Text>
62+
<TouchableOpacity onPress={() => console.log('Pressed')}>
63+
<Text>Icon</Text>
64+
</TouchableOpacity>
65+
</View>
66+
</ScalingView>
67+
</LargeHeader>
68+
);
69+
}, []);
70+
71+
return (
72+
<ScrollViewWithHeaders
73+
HeaderComponent={HeaderComponent}
74+
LargeHeaderComponent={LargeHeaderComponent}
75+
automaticallyAdjustsScrollIndicatorInsets={false}
76+
scrollIndicatorInsets={{ bottom }}
77+
contentContainerStyle={{ paddingBottom: bottom }}
78+
refreshControl={
79+
<RefreshControl refreshing={refreshing} colors={['#8E8E93']} onRefresh={onRefresh} />
80+
}
81+
>
82+
<View style={styles.children}>
83+
{data.map((i) => (
84+
<View key={`text-${i}`} style={styles.box} />
85+
))}
86+
</View>
87+
</ScrollViewWithHeaders>
88+
);
89+
};
90+
91+
export default Simple;
92+
93+
const styles = StyleSheet.create({
94+
children: { marginTop: 16, paddingHorizontal: 16 },
95+
box: {
96+
backgroundColor: 'lightgray',
97+
height: 50,
98+
marginVertical: 8,
99+
borderRadius: 8,
100+
},
101+
navBarTitle: { fontSize: 16, fontWeight: 'bold' },
102+
largeHeaderStyle: { flexDirection: 'row-reverse' },
103+
largeHeaderSubtitleStyle: {
104+
fontSize: 16,
105+
fontWeight: 'bold',
106+
paddingHorizontal: 16,
107+
},
108+
});

0 commit comments

Comments
 (0)