Skip to content

Commit 79e8e37

Browse files
ethansharmendyEdri
andauthored
Infra/expo app fixes (#1166)
* Load assets for demo app * expo settings stuff * Update UI for main screen * use useCallback for renderItem and renderSectionHeader * register ChipScreen so it will be accessible in expo demo app * Update README * remove .expo files from git * Update .gitignore to exclude .expo files * Use Incubator.TextField * Update our expo demo icon with the new one * Update expoDemo/.gitignore Co-authored-by: Mendy Edri <[email protected]> * code review fixes and search improvements * refactor item onPress and use useCallback Co-authored-by: Mendy Edri <[email protected]>
1 parent af976f0 commit 79e8e37

20 files changed

+115
-68
lines changed

demo/src/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ module.exports = {
4040
get CheckboxScreen() {
4141
return require('./screens/componentScreens/CheckboxScreen').default;
4242
},
43+
get ChipScreen() {
44+
return require('./screens/componentScreens/ChipScreen').default;
45+
},
4346
get ConnectionStatusBarScreen() {
4447
return require('./screens/componentScreens/ConnectionStatusBarScreen').default;
4548
},
@@ -206,6 +209,10 @@ module.exports = {
206209
get ProgressBarScreen() {
207210
return require('./screens/componentScreens/ProgressBarScreen').default;
208211
},
212+
// Incubator
213+
get IncubatorTextFieldScreen() {
214+
return require('./screens/incubatorScreens/IncubatorTextFieldScreen').default;
215+
},
209216
// realExamples
210217
get AppleMusic() {
211218
return require('./screens/realExamples/AppleMusic').default;

expoDemo/.expo/README.md

Whitespace-only changes.

expoDemo/.expo/packager-info.json

Lines changed: 0 additions & 10 deletions
This file was deleted.

expoDemo/.expo/settings.json

Lines changed: 0 additions & 9 deletions
This file was deleted.

expoDemo/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,8 @@ buck-out/
5454

5555
# Bundle artifact
5656
*.jsbundle
57+
58+
# Expo
59+
.expo
60+
__generated__
61+
web-build

expoDemo/App.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import _ from 'lodash';
33
import {screens} from 'unicorn-demo-app';
44
import {NavigationContainer} from '@react-navigation/native';
55
import {createStackNavigator} from '@react-navigation/stack';
6+
import './src/assets';
67
import MainScreen from './MainScreen';
78

89
const Stack = createStackNavigator();

expoDemo/MainScreen.js

Lines changed: 94 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,105 @@
1-
import React from 'react';
2-
import {ScrollView, TextInput} from 'react-native';
3-
import {Colors, View, Text, TouchableOpacity} from 'react-native-ui-lib';
1+
import React, {useCallback} from 'react';
2+
import {SectionList, StyleSheet} from 'react-native';
3+
import {Colors, View, Text, TouchableOpacity, Spacings, Image, Assets, Incubator} from 'react-native-ui-lib';
44
import {menuStructure} from 'unicorn-demo-app';
55
import _ from 'lodash';
6+
import fuzzysearch from 'fuzzysearch';
7+
8+
const {TextField} = Incubator;
9+
10+
const sections = _.map(menuStructure, (section, key) => {
11+
return {
12+
key,
13+
data: section.screens
14+
};
15+
});
616

717
export default function MainScreen({navigation}) {
818
const [searchText, setSearchText] = React.useState('');
919

20+
const includedInSearch = (text = '') => {
21+
return fuzzysearch(searchText.toLowerCase(), text.toLowerCase());
22+
};
23+
24+
const onItemPress = useCallback(({customValue: screenId}) => {
25+
// convert "unicorn.components.ActionBarScreen" -> "ActionBar"
26+
navigation.navigate(screenId);
27+
});
28+
29+
const renderSectionHeader = useCallback(({section}) => {
30+
if (!_.find(section.data, screen => includedInSearch(screen.title))) {
31+
return null;
32+
}
33+
34+
return (
35+
<View paddingV-s1 paddingH-s5 bg-primary>
36+
<Text text90BO uppercase grey70>
37+
{section.key}
38+
</Text>
39+
</View>
40+
);
41+
},
42+
[searchText]);
43+
44+
const renderItem = useCallback(({item}) => {
45+
if (!includedInSearch(item.title)) {
46+
return null;
47+
}
48+
49+
if (!item.title) {
50+
return <View height={Spacings.s2} bg-grey70/>;
51+
}
52+
53+
const screenId = _.chain(item.screen).split('.').last().replace('Screen', '').value();
54+
55+
return (
56+
<TouchableOpacity
57+
activeOpacity={1}
58+
key={item.title}
59+
style={styles.sectionItem}
60+
activeBackgroundColor={Colors.violet80}
61+
customValue={screenId}
62+
onPress={onItemPress}
63+
>
64+
<Text grey10 text70M>
65+
{item.title}
66+
</Text>
67+
</TouchableOpacity>
68+
);
69+
},
70+
[searchText]);
71+
1072
return (
11-
<View>
12-
<TextInput
13-
style={{padding: 10, marginBottom:0, fontSize: 18}}
14-
placeholder= 'Search for your component...'
15-
onChangeText={text => setSearchText(text)}
16-
value={searchText}
73+
<View flex bg-white>
74+
<SectionList
75+
ListHeaderComponent={
76+
<TextField
77+
migrate
78+
placeholder="Search component name"
79+
onChangeText={text => setSearchText(text)}
80+
value={searchText}
81+
preset={null}
82+
text70
83+
fieldStyle={styles.fieldStyle}
84+
leadingAccessory={<Image source={Assets.icons.search} marginH-s2/>}
85+
/>
86+
}
87+
sections={sections}
88+
renderSectionHeader={renderSectionHeader}
89+
renderItem={renderItem}
1790
/>
18-
<ScrollView>
19-
<View bg-white>
20-
{_.map(menuStructure, section => {
21-
return (
22-
<View key={section.title}>
23-
<Text text50 marginL-s5 marginV-s3>
24-
{section.title}
25-
</Text>
26-
{_.map(section.screens, screen => {
27-
return (
28-
<TouchableOpacity
29-
activeOpacity={1}
30-
bg-blue40
31-
paddingH-s5
32-
paddingV-s4
33-
key={screen.title}
34-
activeBackgroundColor={Colors.blue20}
35-
style={{borderBottomWidth: 1, borderColor: Colors.white}}
36-
onPress={() => {
37-
// convert "unicorn.components.ActionBarScreen" -> "ActionBar"
38-
const screenId = _.chain(screen.screen)
39-
.split('.')
40-
.last()
41-
.replace('Screen', '')
42-
.value();
43-
navigation.navigate(screenId);
44-
}}
45-
>
46-
<Text white text70M>
47-
{screen.title}
48-
</Text>
49-
</TouchableOpacity>
50-
);
51-
}).filter(item => item.key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1)}
52-
</View>
53-
);
54-
})}
55-
</View>
56-
</ScrollView>
5791
</View>
5892
);
5993
}
94+
95+
const styles = StyleSheet.create({
96+
fieldStyle: {
97+
paddingVertical: Spacings.s3
98+
},
99+
sectionItem: {
100+
borderBottomWidth: 1,
101+
borderBottomColor: Colors.grey60,
102+
paddingHorizontal: Spacings.s5,
103+
paddingVertical: Spacings.s3
104+
}
105+
});

expoDemo/app.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"name": "rnuilib",
66
"slug": "rnuilib",
77
"privacy": "public",
8-
"icon": "https://user-images.githubusercontent.com/1780255/76164954-b97b3880-615b-11ea-85b9-209ac7932d89.png",
8+
"icon": "https://user-images.githubusercontent.com/1780255/107911939-34e98a80-6f66-11eb-91a6-1eb1b384e429.png",
99
"version": "1.0.0",
1010
"entryPoint": "index.js",
1111
"packagerOpts": {

expoDemo/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"@react-navigation/native": "^5.0.8",
1717
"@react-navigation/stack": "^5.1.0",
1818
"expo": "^40.0.0",
19+
"fuzzysearch": "^1.0.3",
1920
"lodash": "^4.17.15",
2021
"react": "16.13.1",
2122
"react-dom": "16.13.1",

expoDemo/src/assets/chevronRight.png

360 Bytes
Loading
558 Bytes
Loading
699 Bytes
Loading
1007 Bytes
Loading
1.28 KB
Loading

expoDemo/src/assets/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import {Assets} from 'react-native-ui-lib';
2+
3+
Assets.loadAssetsGroup('', {
4+
chevronRight: require('./chevronRight.png'),
5+
search: require('./search.png')
6+
});

expoDemo/src/assets/search.png

266 Bytes
Loading
388 Bytes
Loading
433 Bytes
Loading
570 Bytes
Loading
726 Bytes
Loading

0 commit comments

Comments
 (0)