Flatlist simulating different pages - react-native

I have to build 5 pages but as they have all the same layout I want to use a flatlist to populate the fields, my doubt us vary basic, I read the documentation and had problems to fully understand, here is my code
const DATA = [
{
picture: '../../Components/Images/wellbeing.png',
text1: 'Get weekly overviews and find',
text2: 'out whats impacting your health',
text3: 'and wellness',
percent: 20,
},
];
const Item = ({picture, text1, text2, text3, percent}) => (
<View style={styles.container}>
<View>
<Image source={require({picture})} style={styles.image} />
</View>
<View style={styles.text_field}>
<Text style={styles.textContent}> {text1} </Text>
<Text style={styles.textContent}> {text2} </Text>
<Text style={styles.textContent}> {text3} </Text>
</View>
<View style={styles.footer}>
<TouchableOpacity onPress={() => navigation.navigate('HabitTracking')}>
<ProgressCircle
percent={{percent}}
radius={30}
borderWidth={3}
color="#3399FF"
shadowColor="white"
bgColor="blue">
<Icon name="arrowright" size={25} color="white"></Icon>
</ProgressCircle>
</TouchableOpacity>
</View>
</View>
);
I'm having trouble on how to populate this in the class, here is what I have so far
const Wellcome = () => {
const renderItem = ({picture, text1, text2, text3, percent}) => (
<Item picture={Item.picture}
/>
);
return (
);
};
export default Wellcome;
am I doing everything wrong?
please let me know if you need any further information

const renderItem = (item) => (
<Item picture={item.picture} />
);
and call renderItem in your render method
...
{renderItem(item)}
...
where item looks something like...
{
picture: 'something',
text1: 'something',
text2: 'something',
text3: 'something',
percent: 'something'
}

Related

How to show an icon on last index of flat list

I'm trying to wrap my flat list and trying to show an Icon after last index of Flatlist. I had tried but it works fine on a single row. when we data goes to next row it would not work.
Here is my flat list code. Modal and Input both are my custom component.
const renderItem = ({item}) => {
return (
<TouchableOpacity style={[styles.tagPostContainer, styles.viewTagContainer]}>
<AppText
type={'input'}
label={`#${item}`}
color={colors.placeholder}
containerStyle={[styles.tagPostInactiveTxt, styles.BgAddedTag]}
/>
</TouchableOpacity>
);
};
return(
<>
<View style={{flexDirection:'row',justifyContent:'flex-start'}}>
<FlatList
data={tags}
renderItem={renderItem}
keyExtractor={keyExtractor}
contentContainerStyle={styles.TagFlatlist}
/>
<TouchableOpacity
style={styles.plusIconContainer}
onPress={() => setVisible(true)}>
<CreateBuildIconFocus height={13} width={13} />
</TouchableOpacity>
</View>
<Modal
visible={visible}
buttonLabel={'Done'}
containerWidth={width / 1.7}
onCancel={onCancel}
onSubmit={onClick}
containerHeight={Platform.OS === 'android' ? 200 : 200}>
<Input
placeholder={'Add Tags'}
autoFocus={true}
minWidth={120}
maxWidth={150}
value={tag}
onChangeText={text => setTag(text)}
/>
</Modal>
</>
)
FlatList styles:
TagFlatlist: {
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'center',
},
Here is my design screen.
I find a solution for this. You can implement ListFooterComponent that used for showing something on end of flatlist. Here you can see more details of ListFooterComponent.
Here are the code of Flatlist.
return(
<FlatList
data={tags}
renderItem={renderItem}
keyExtractor={keyExtractor}
ListFooterComponent={
<TouchableOpacity
style={styles.plusIconContainer}
onPress={() => setVisible(true)}>
<CreateBuildIconFocus height={13} width={13} />
</TouchableOpacity>
}
contentContainerStyle={styles.TagFlatlist}
/>
)

How to make specific component functional in a flatlist?

I am making an app where anyone can join a fantasy golf tournament. On my homepage there is a flatlist which is receiving data from api. There will be many tournaments but the user can only join the upcoming one. Now what i want to do is disable the functionality of every other tournament that means there is a join button through which user can join so i want to disable every other button and only enable the upcoming tournament button. What should i do?
here's my code
const Item = ({ title, location, date, Id }) => (
<View style={styles.renderItemView}>
<View style={styles.imageView}>
<Image style={styles.imageView2} source={require('../../assets/golf.png')} />
</View>
<View style={styles.TextView}>
<Text style={styles.Text}>Name: {title}</Text>
<Text style={styles.Text}>Location: {location}</Text>
<Text style={styles.Text}>StartDate: {moment(date).format('DD-MM-YYYY')}</Text>
<Text style={styles.Text}>Contest Fee: $49</Text>
</View>
<View style={styles.JoinView}>
<TouchableOpacity onPress={() =>{
navigation.navigate('Join', {key:Id, date});
}} style={styles.Touch1}>
<Text style={styles.JoinText}>Join</Text>
</TouchableOpacity>
</View>
</View>
);
const renderItem = ({ item }) => (
<View>
<Item title={item.name} location={item.location} date={item.startDate} Id={item.Id} />
</View>
);```
You could use row index and modulus operator to define the disabled prop like this:
const renderItem = ({ item, index }) => (
<View>
<Item title={item.name} disabled={index % 1 === 1} location={item.location} date={item.startDate} Id={item.Id} />
</View>
);`
And the use it in the Item component on the TouchableOpacity like this:
const Item = ({ disabled }) => (
<View>
...other stuff
<TouchableOpacity disabled={disabled} />
</View>
)
<TouchableOpacity disabled={props.disabled} />

I have passed component as argument, now how to render the component?

Below in a code I have describe the question as comment
//This is MessagesScreen.js
<FlatList
data={messages}
keyExtractor={messages => messages.id.toString()}
renderItem={({ item }) =>
<ListItem style={styles.listItem}
title={item.title}
subTitle={item.description}
image={item.image}
DeleteIconView={ListItemDeleteAction} /*Here ListItemDeleteAction.js
is component want to pass it to
the ListItem.js. Note: I have
imported all the nessory
labries*/
onPress={() => handleDelete(item)}
//renderRightActions={ListItemDeleteAction}
/>
}
ItemSeparatorComponent={ListItemSeparator}
refreshing={refreshing}
onRefresh={() => {
setMessages([
{
id: 2,
title: 'Komail',
description: 'React-Native Developer',
image: require("../asserts/komail.jpg"),
}
])
}}
/>
This is ListItemDeleteAction.js, which I want to render in ItemList.js
//This is ListItemDeleteAction.js
function ListItemDeleteAction(props) {
return (
<View style={styles.container}>
<MaterialCommunityIcons name="trash-can" size={30} color={Colors.danger} />
</View>
);
}
Now, in ListItem.js I want to render the ListItemDeleteAction.js as I have passed as a argument. Below in code I have described as comment.
Note: I am strict to this method, render the ListItemDeleteAction as it passed as argument, which is "DeleteIconView" as parameter in ListItem.js
function ListItem({ image, title, subTitle, ImageComponent, style, onPress, DeleteIconView}) {
return (
<TouchableHighlight
//onPress={onPress}
underlayColor={Colors.light}
>
<View style={[styles.container, style]}>
{ImageComponent}
{image && <Image style={styles.image} source={image} />}
<View style={styles.parentDeatailContainer}>
<View style={styles.detailContainer}>
<Text style={{ fontWeight: "bold" }}>{title}</Text>
{subTitle && <Text>{subTitle}</Text>}
</View>
<TouchableOpacity style={styles.deleteIconContainer} onPress={onPress}>
{DeleteIconView} /* This is the place where I want to render the
ListItemDeleteAction components as I passed as argument but How? */
</TouchableOpacity>
</View>
</View>
</TouchableHighlight>
);
}
You are passing the prop wrong. When you write DeleteIconView={ListItemDeleteAction}, you aren't actually creating a JSX component. This can be solved by writing the following.
renderItem={({ item }) =>
<ListItem style={styles.listItem}
title={item.title}
subTitle={item.description}
image={item.image}
DeleteIconView={<ListItemDeleteAction />}
onPress={() => handleDelete(item)}
/>
}
Now, the prop DeleteIconView is an actual JSX component which can be rendered as usual.

TouchableOpacity link to another page and pass data React Native

Hi i am hitting to a problem. In the Homepage, I am creating a list of cards where show name, amount, and image, and those cards are created by another function from InfoCard.js.
Now I am not sure how to pass the data ( name, amount) and link to another page
Homepage:
import InfoCard from "../components/test";
const Home = ({ navigation }) => {
return (
{data.map((item, index) => (
<InfoCard {...item} key={index} />
))}
);
};
export default Home;
InfoCard js
export default InfoCard = ({ image, brand, amount }) => {
return (
<TouchableOpacity onPress={() => navigation.navigate("Detail")}>
<View style={externalStyle.home_company_list}>
<Image source={image} />
<View style={externalStyle.card}>
<Text style={externalStyle.home_company_text}>{brand}</Text>
<Text style={externalStyle.home_company_text}>{amount}</Text>
</View>
</View>
</TouchableOpacity>
);
};
Detail Page
Once the TouchableOpacity clicked from home page which created by InFoCard.js, will pass the data(brand,amount) to Detail page and display the data
You can pass it as params:
export default InfoCard = ({ image, brand, amount }) => {
return (
<TouchableOpacity onPress={() => navigation.navigate("Detail", {brand: brand,
amount: amount,})}>
<View style={externalStyle.home_company_list}>
<Image source={image} />
<View style={externalStyle.card}>
<Text style={externalStyle.home_company_text}>{brand}</Text>
<Text style={externalStyle.home_company_text}>{amount}</Text>
</View>
</View>
</TouchableOpacity>
);
};
And get it in details as:
this.props.navigation.state.params.brand,
this.props.navigation.state.params.amount
You can simply pass the parameter after the "Detail" Route name.
Take a look here: https://reactnavigation.org/docs/params/

how could I read the data and the image from this json file into flatlist?

Please I'm struggling to read this data of the json file on a simple flatlist, I tried to do item.content or item.description and item.medias but it doesnt work please could someone help me
[
{
"medias": [
"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"
],
"description": "ccc",
"id": 3,
"user": {
"id": 1,
"nom": "user",
"prenom": "user",
"tel": "2126548390",
"url": null,
"departement": "RH",
"username": "admin"
},
"content": "cccc"
}
]
and this is my code (I want to display the image too )
<FlatList
style={{ marginTop: 20 }}
data={this.state.data}
refreshing={this.state.isLoading}
onRefresh={this.makeRemoteRequest}
renderItem={({ item, index })=>
<View>
{item.published == true ? <Card>
<TouchableOpacity onPress={this.onRemove}>
<Animated.View style={rowStyles}>
<View>
<Text style={styles.email}>{item.data[0].content}</Text>
</View>
</Animated.View>
<Animated.View style={rowStyles}>
<Text style={styles.email}>{item.description}</Text>
</Animated.View>
</TouchableOpacity></Card> : <Text></Text> }
</View>
}
keyExtractor={(item) => item.id}
ItemSeparatorComponent={this.renderSeparator}
ListHeaderComponent={this.renderHeader}
ListFooterComponent={this.renderFooter}
/>
First of all, keyExtractor expects a return of string and you are supplying an int (id);
You could either change your id in the data store to a string if possible, or do a map to convert the id to a string or you could do this:
keyExtractor={(item) => item.id.toString()}
which I don't recommend because it will always be rerun on render.
Also if the data from json is not changing, you could put it on the class as shown below:
The choices are yours but I believe the keyExtractor is your major issue.
// read the json file on import
const jsonData = require('path/to/file.json');
// set the data on mount to convert id to string
this.dataWithStringId = jsonData.map((item) => ({
...item,
id: item.id.toString(),
}));
render() {
return (
<FlatList
keyExtractor={(item) => item.id}
data={this.dataWithStringId}
renderItem={({item}) => (
<Card>
<TouchableOpacity>
<View>
<View>
<Text>{item.content}</Text>
</View>
</View>
<Animated.View>
<Text>{item.description}</Text>
</Animated.View>
</TouchableOpacity>
</Card>
)}
/>
)
}
EDIT:
here is a link to keyExtrctor