Created
October 28, 2021 19:03
-
-
Save rgazeredo/e2b827405b21c059abcdda8294f8daae to your computer and use it in GitHub Desktop.
FlatList
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React, { useCallback, useRef, useState } from 'react' | |
import { | |
View, | |
Text, | |
Image, | |
Alert, | |
StyleSheet, | |
SafeAreaView, | |
Dimensions, | |
FlatList, | |
ImageBackground, | |
} from 'react-native' | |
import { useFocusEffect } from '@react-navigation/native' | |
import { TouchableOpacity } from 'react-native-gesture-handler' | |
import { Feather, MaterialIcons } from '@expo/vector-icons' | |
import { Form } from '@unform/mobile' | |
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' | |
import { Modalize } from 'react-native-modalize' | |
import { Portal } from 'react-native-portalize' | |
import { SearchBar } from 'react-native-elements' | |
const screen = Dimensions.get('window') | |
import Colors from '../../../utils/colors' | |
import CardImageLeft from '../../../components/CardImageLeft' | |
import ButtonPrimary from '../../../components/ButtonPrimary' | |
import Yup from '../../../config/yup' | |
import { color } from 'react-native-reanimated' | |
import { useAuth } from '../../../hooks/auth' | |
const CATEGORIES = [ | |
{ | |
id: '0', | |
name: 'TODAS', | |
}, | |
{ | |
id: '1', | |
name: 'Frutas', | |
}, | |
{ | |
id: '2', | |
name: 'Verduras/Legumes', | |
}, | |
{ | |
id: '3', | |
name: 'Verdinhos', | |
}, | |
{ | |
id: '4', | |
name: 'Castanhas', | |
}, | |
] | |
const PRODUCTS = [ | |
{ | |
id: '00', | |
name: 'Laranja', | |
price: '1,50', | |
image: 'https://images.unsplash.com/photo-1560749605-cebc04c2697c', | |
}, | |
{ | |
id: '01', | |
name: 'Uva', | |
price: '2,00', | |
image: 'https://images.unsplash.com/photo-1595938688117-8af7b8da9fca', | |
}, | |
{ | |
id: '02', | |
name: 'Morango', | |
price: '4,75', | |
image: 'https://images.unsplash.com/photo-1543158181-e6f9f6712055', | |
}, | |
{ | |
id: '03', | |
name: 'Banana', | |
price: '3,99', | |
image: 'https://images.unsplash.com/photo-1571771894821-ce9b6c11b08e', | |
}, | |
] | |
const Home: React.FC = ({ navigation, route }) => { | |
const [search, setSearch] = useState(null) | |
const [title, setTitle] = useState('Categorias') | |
const modalizeCategoriesRef = useRef<Modalize>(null) | |
React.useLayoutEffect(() => { | |
navigation.setOptions({ | |
headerTitle: (props) => ( | |
<TouchableOpacity | |
style={{ flexDirection: 'row' }} | |
onPress={() => modalizeCategoriesRef.current?.open()} | |
> | |
<Text style={{ fontFamily: 'Roboto_700Bold', fontSize: 18 }}> | |
{title} | |
</Text> | |
<MaterialIcons name="keyboard-arrow-down" size={24} color="black" /> | |
</TouchableOpacity> | |
), | |
headerLeft: (props) => ( | |
<TouchableOpacity | |
style={{ marginLeft: 10 }} | |
onPress={() => navigation.toggleDrawer()} | |
> | |
<Feather name="menu" size={24} color="black" /> | |
</TouchableOpacity> | |
), | |
headerRight: (props) => ( | |
<TouchableOpacity style={{ marginRight: 10 }}> | |
<Feather name="plus-square" size={24} color="black" /> | |
</TouchableOpacity> | |
), | |
}) | |
}, [navigation, route]) | |
const renderEmptyCell = (data, columns) => { | |
if (data % columns == 1) { | |
return ( | |
<> | |
<View | |
style={{ | |
height: screen.width / 3 - 10, | |
width: screen.width / 3 - 10, | |
borderRadius: 5, | |
borderWidth: 2, | |
borderColor: Colors.grey, | |
margin: 4, | |
justifyContent: 'center', | |
alignItems: 'center', | |
}} | |
> | |
<Feather name="plus" size={72} color={Colors.grey} /> | |
</View> | |
<View | |
style={{ | |
height: screen.width / 3 - 10, | |
width: screen.width / 3 - 10, | |
borderRadius: 5, | |
borderWidth: 2, | |
borderColor: Colors.grey, | |
margin: 4, | |
justifyContent: 'center', | |
alignItems: 'center', | |
}} | |
> | |
<Feather name="plus" size={72} color={Colors.grey} /> | |
</View> | |
</> | |
) | |
} else { | |
return ( | |
<View | |
style={{ | |
height: screen.width / 3 - 10, | |
width: screen.width / 3 - 10, | |
borderRadius: 5, | |
borderWidth: 2, | |
borderColor: Colors.grey, | |
margin: 4, | |
justifyContent: 'center', | |
alignItems: 'center', | |
}} | |
> | |
<Feather name="plus" size={72} color={Colors.grey} /> | |
</View> | |
) | |
} | |
} | |
const renderCategories = (data) => { | |
const { item } = data | |
return ( | |
<TouchableOpacity | |
style={{ | |
borderWidth: 2, | |
borderRadius: 5, | |
borderColor: Colors.grey, | |
flexDirection: 'row', | |
alignItems: 'center', | |
paddingVertical: 10, | |
paddingHorizontal: 10, | |
marginBottom: 10, | |
}} | |
> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 14, | |
color: Colors.grey, | |
}} | |
> | |
{item.name} | |
</Text> | |
</TouchableOpacity> | |
) | |
} | |
return ( | |
<SafeAreaView style={styles.container}> | |
{/* <KeyboardAwareScrollView showsVerticalScrollIndicator={false}> */} | |
<View | |
style={{ | |
backgroundColor: '#FFFFFF', | |
flexDirection: 'row', | |
alignItems: 'center', | |
}} | |
> | |
<SearchBar | |
placeholder="Buscar por produto..." | |
containerStyle={{ | |
backgroundColor: '#FFFFFF', | |
borderColor: 'red', | |
borderTopWidth: 0, | |
borderBottomWidth: 0, | |
flex: 1, | |
}} | |
inputContainerStyle={{ | |
backgroundColor: '#EBEDF0', | |
borderRadius: 25, | |
padding: 0, | |
margin: 0, | |
height: 36, | |
}} | |
inputStyle={{ fontSize: 14, marginLeft: 2 }} | |
lightTheme={true} | |
// onChangeText={(value) => setSearch(value)} | |
value={search} | |
/> | |
{/* <Feather name="search" size={24} color="black" /> */} | |
</View> | |
<FlatList | |
data={PRODUCTS} | |
keyExtractor={(item) => item.id} | |
numColumns={3} | |
style={{ | |
marginHorizontal: 4, | |
paddingVertical: 4, | |
backgroundColor: Colors.light, | |
}} | |
contentContainerStyle={{ alignItems: 'center' }} | |
renderItem={({ item, index }) => { | |
if (index == PRODUCTS.length - 1) { | |
return ( | |
<> | |
<TouchableOpacity style={{ margin: 4 }}> | |
<Image | |
source={{ uri: item.image }} | |
resizeMode="cover" | |
style={{ | |
height: screen.width / 3 - 10, | |
width: screen.width / 3 - 10, | |
borderTopLeftRadius: 5, | |
borderTopRightRadius: 5, | |
}} | |
/> | |
<View | |
style={{ | |
backgroundColor: Colors.grey, | |
borderBottomLeftRadius: 5, | |
borderBottomRightRadius: 5, | |
paddingHorizontal: 4, | |
paddingVertical: 2, | |
}} | |
> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 12, | |
color: '#FFFFFF', | |
}} | |
> | |
{item.name} | |
</Text> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 10, | |
color: '#FFFFFF', | |
}} | |
> | |
R$ {item.price} | |
</Text> | |
</View> | |
</TouchableOpacity> | |
{renderEmptyCell(PRODUCTS.length, 3)} | |
</> | |
) | |
} else { | |
return ( | |
<TouchableOpacity style={{ margin: 4 }}> | |
<Image | |
source={{ uri: item.image }} | |
resizeMode="cover" | |
style={{ | |
height: screen.width / 3 - 10, | |
width: screen.width / 3 - 10, | |
borderTopLeftRadius: 5, | |
borderTopRightRadius: 5, | |
}} | |
/> | |
<View | |
style={{ | |
backgroundColor: Colors.grey, | |
borderBottomLeftRadius: 5, | |
borderBottomRightRadius: 5, | |
paddingHorizontal: 4, | |
paddingVertical: 2, | |
}} | |
> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 12, | |
color: '#FFFFFF', | |
}} | |
> | |
{item.name} | |
</Text> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 10, | |
color: '#FFFFFF', | |
}} | |
> | |
R$ {item.price} | |
</Text> | |
</View> | |
</TouchableOpacity> | |
) | |
} | |
}} | |
/> | |
<View | |
style={{ | |
shadowColor: Colors.grey, | |
shadowOffset: { height: -2, width: 0 }, | |
shadowOpacity: 0.23, | |
elevation: 4, | |
backgroundColor: '#FFFFFF', | |
}} | |
> | |
<View | |
style={{ | |
flexDirection: 'row', | |
justifyContent: 'space-between', | |
alignItems: 'center', | |
marginHorizontal: 10, | |
marginVertical: 10, | |
}} | |
> | |
<View style={{}}> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 14, | |
}} | |
> | |
23 itens | |
</Text> | |
<Text | |
style={{ | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 22, | |
}} | |
> | |
R$ 108,50 | |
</Text> | |
</View> | |
<ButtonPrimary text="PEDIDO" onPress={() => setTitle('Frutas')} /> | |
</View> | |
</View> | |
{/* </KeyboardAwareScrollView> */} | |
<Portal> | |
<Modalize | |
ref={modalizeCategoriesRef} | |
adjustToContentHeight={true} | |
childrenStyle={{ marginHorizontal: 20, marginVertical: 20 }} | |
HeaderComponent={ | |
<View> | |
<Text | |
style={{ | |
textAlign: 'center', | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 16, | |
color: Colors.grey, | |
marginTop: 10, | |
}} | |
> | |
Escolha uma categoria | |
</Text> | |
</View> | |
} | |
flatListProps={{ | |
data: CATEGORIES, | |
renderItem: renderCategories, | |
keyExtractor: (item) => item.id, | |
showsVerticalScrollIndicator: false, | |
}} | |
/> | |
</Portal> | |
</SafeAreaView> | |
) | |
} | |
const styles = StyleSheet.create({ | |
container: { | |
flex: 1, | |
backgroundColor: '#FFFFFF', | |
}, | |
containerModalize: { | |
flex: 1, | |
}, | |
content: { | |
marginHorizontal: 20, | |
}, | |
containerLogo: { | |
alignItems: 'center', | |
}, | |
logo: { | |
width: 200, | |
resizeMode: 'contain', | |
}, | |
title: { | |
textAlign: 'center', | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 18, | |
color: Colors.grey, | |
marginVertical: 10, | |
}, | |
buttonPrimary: { | |
backgroundColor: Colors.primary, | |
alignItems: 'center', | |
padding: 15, | |
borderRadius: 5, | |
}, | |
buttonPrimaryText: { | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 16, | |
color: Colors.light, | |
}, | |
containerDivider: { | |
flexDirection: 'row', | |
alignItems: 'center', | |
marginTop: 10, | |
marginBottom: 20, | |
}, | |
divider: { | |
flex: 1, | |
height: 1, | |
backgroundColor: '#edf2f4', | |
}, | |
dividerText: { | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 12, | |
width: 50, | |
textAlign: 'center', | |
}, | |
buttonSocialMedia: { | |
borderWidth: 1.2, | |
borderRadius: 5, | |
borderColor: Colors.info, | |
flexDirection: 'row', | |
alignItems: 'center', | |
paddingVertical: 10, | |
marginBottom: 10, | |
}, | |
buttonSocialMediaIcon: { | |
marginHorizontal: 10, | |
}, | |
buttonSocialMediaText: { | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 14, | |
color: Colors.info, | |
}, | |
buttonForgotPassword: { | |
paddingVertical: 10, | |
alignItems: 'center', | |
}, | |
buttonForgotPasswordText: { | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 14, | |
color: Colors.info, | |
}, | |
buttonLink: { | |
paddingVertical: 10, | |
flexDirection: 'row', | |
justifyContent: 'center', | |
}, | |
buttonLinkText: { | |
fontFamily: 'Roboto_400Regular', | |
fontSize: 14, | |
color: Colors.grey, | |
}, | |
buttonLinkTextBold: { | |
fontFamily: 'Roboto_700Bold', | |
fontSize: 14, | |
color: Colors.info, | |
marginLeft: 5, | |
}, | |
}) | |
export default Home |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment