Skip to content

Commit a540083

Browse files
committed
chore: pressable experiment
1 parent c5a9627 commit a540083

File tree

4 files changed

+104
-4
lines changed

4 files changed

+104
-4
lines changed

experiments-app/src/experiments.ts

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AccessibilityScreen } from './screens/Accessibility';
2+
import { PressEvents } from './screens/PressEvents';
23
import { TextInputEventPropagation } from './screens/TextInputEventPropagation';
34
import { TextInputEvents } from './screens/TextInputEvents';
45
import { ScrollViewEvents } from './screens/ScrollViewEvents';
@@ -13,6 +14,11 @@ export const experiments = [
1314
title: 'Accessibility',
1415
component: AccessibilityScreen,
1516
},
17+
{
18+
key: 'PressEvents',
19+
title: 'Press Events',
20+
component: PressEvents,
21+
},
1622
{
1723
key: 'TextInputEvents',
1824
title: 'TextInput Events',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import * as React from 'react';
2+
import {
3+
StyleSheet,
4+
SafeAreaView,
5+
Text,
6+
TextInput,
7+
View,
8+
Pressable,
9+
TouchableOpacity,
10+
} from 'react-native';
11+
import { nativeEventLogger, logEvent } from '../utils/helpers';
12+
13+
export function PressEvents() {
14+
const [value, setValue] = React.useState('');
15+
16+
const handleChangeText = (value: string) => {
17+
setValue(value);
18+
logEvent('changeText', value);
19+
};
20+
21+
return (
22+
<SafeAreaView style={styles.container}>
23+
<View style={styles.wrapper}>
24+
<TextInput
25+
style={styles.textInput}
26+
value={value}
27+
onPress={nativeEventLogger('press')}
28+
onPressIn={nativeEventLogger('pressIn')}
29+
onPressOut={nativeEventLogger('pressOut')}
30+
/>
31+
</View>
32+
<View style={styles.wrapper}>
33+
<Text
34+
onPress={nativeEventLogger('press')}
35+
onLongPress={nativeEventLogger('longPress')}
36+
onPressIn={nativeEventLogger('pressIn')}
37+
onPressOut={nativeEventLogger('pressOut')}
38+
>
39+
Text
40+
</Text>
41+
</View>
42+
<View style={styles.wrapper}>
43+
<Pressable
44+
onPress={nativeEventLogger('press')}
45+
onLongPress={nativeEventLogger('longPress')}
46+
onPressIn={nativeEventLogger('pressIn')}
47+
onPressOut={nativeEventLogger('pressOut')}
48+
>
49+
<Text>Pressable</Text>
50+
</Pressable>
51+
</View>
52+
<View style={styles.wrapper}>
53+
<TouchableOpacity
54+
onPress={nativeEventLogger('press')}
55+
onLongPress={nativeEventLogger('longPress')}
56+
onPressIn={nativeEventLogger('pressIn')}
57+
onPressOut={nativeEventLogger('pressOut')}
58+
>
59+
<Text>Pressable</Text>
60+
</TouchableOpacity>
61+
</View>
62+
</SafeAreaView>
63+
);
64+
}
65+
66+
const styles = StyleSheet.create({
67+
container: {
68+
flex: 1,
69+
},
70+
wrapper: {
71+
padding: 20,
72+
backgroundColor: 'yellow',
73+
},
74+
textInput: {
75+
backgroundColor: 'white',
76+
margin: 20,
77+
padding: 8,
78+
fontSize: 18,
79+
borderWidth: 1,
80+
borderColor: 'grey',
81+
},
82+
});

experiments-app/src/utils/helpers.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { NativeSyntheticEvent } from 'react-native/types';
22

3+
let lastEventTimeStamp: number | null = null;
4+
35
export function nativeEventLogger(name: string) {
46
return (event: NativeSyntheticEvent<unknown>) => {
57
logEvent(name, event?.nativeEvent);
@@ -14,5 +16,6 @@ export function customEventLogger(name: string) {
1416

1517
export function logEvent(name: string, ...args: unknown[]) {
1618
// eslint-disable-next-line no-console
17-
console.log(`Event: ${name}`, ...args);
19+
console.log(`[${Date.now() - (lastEventTimeStamp ?? Date.now())}ms] Event: ${name}`, ...args);
20+
lastEventTimeStamp = Date.now();
1821
}

src/__tests__/render.test.tsx

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-disable no-console */
22
import * as React from 'react';
33
import { Pressable, Text, TextInput, View } from 'react-native';
4-
import { getConfig, resetToDefaults } from '../config';
4+
import { configure, getConfig, resetToDefaults } from '../config';
55
import { fireEvent, render, RenderAPI, screen } from '..';
66

77
const PLACEHOLDER_FRESHNESS = 'Add custom freshness';
@@ -247,7 +247,16 @@ test('supports legacy rendering', () => {
247247
expect(screen.root).toBeDefined();
248248
});
249249

250-
test('supports concurrent rendering', () => {
250+
// Enable concurrent rendering globally
251+
configure({ concurrentRoot: true });
252+
253+
test('globally enable concurrent rendering', () => {
254+
render(<View testID="test" />);
255+
expect(screen.root).toBeOnTheScreen();
256+
});
257+
258+
// Enable concurrent rendering locally
259+
test('locally enable concurrent rendering', () => {
251260
render(<View testID="test" />, { concurrentRoot: true });
252-
expect(screen.root).toBeDefined();
261+
expect(screen.root).toBeOnTheScreen();
253262
});

0 commit comments

Comments
 (0)