Untitled
unknown
javascript
a year ago
7.9 kB
11
Indexable
import React, {useState, useEffect} from 'react';
import {
SafeAreaView,
TouchableOpacity,
View,
Text,
FlatList,
} from 'react-native';
import Title from './components/Title/Title';
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome';
import {faEnvelope} from '@fortawesome/free-solid-svg-icons';
import globalStyle from './assets/styles/globalStyle';
import UserStory from './components/UserStory/UserStory';
import UserPost from './components/UserPost/UserPost';
const App = () => {
const userStories = [
{
firstName: 'Joseph',
id: 1,
profileImage: require('./assets/images/default_profile.png'),
}, //0
{
firstName: 'Angel',
id: 2,
profileImage: require('./assets/images/default_profile.png'),
},
{
firstName: 'White',
id: 3,
profileImage: require('./assets/images/default_profile.png'),
},
{
firstName: 'Olivier',
id: 4,
profileImage: require('./assets/images/default_profile.png'),
},
{
firstName: 'Nata',
id: 5,
profileImage: require('./assets/images/default_profile.png'),
}, //4
{
firstName: 'Nicolas',
id: 6,
profileImage: require('./assets/images/default_profile.png'),
},
{
firstName: 'Nino',
id: 7,
profileImage: require('./assets/images/default_profile.png'),
},
{
firstName: 'Nana',
id: 8,
profileImage: require('./assets/images/default_profile.png'),
},
{
firstName: 'Adam',
id: 9,
profileImage: require('./assets/images/default_profile.png'),
}, //8
];
const userPosts = [
{
firstName: 'Allison',
lastName: 'Becker',
location: 'Boston, MA',
likes: 1201,
comments: 24,
bookmarks: 55,
image: require('./assets/images/default_post.png'),
profileImage: require('./assets/images/default_profile.png'),
id: 1,
},
{
firstName: 'Jennifer',
lastName: 'Wilkson',
location: 'Worcester, MA',
likes: 1301,
comments: 25,
bookmarks: 70,
image: require('./assets/images/default_post.png'),
profileImage: require('./assets/images/default_profile.png'),
id: 2,
},
{
firstName: 'Adam',
lastName: 'Spera',
location: 'Worcester, MA',
likes: 100,
comments: 8,
bookmarks: 3,
image: require('./assets/images/default_post.png'),
profileImage: require('./assets/images/default_profile.png'),
id: 3,
},
{
firstName: 'Nata',
lastName: 'Vacheishvili',
location: 'New York, NY',
likes: 200,
comments: 16,
bookmarks: 6,
image: require('./assets/images/default_post.png'),
profileImage: require('./assets/images/default_profile.png'),
id: 4,
},
{
firstName: 'Nicolas',
lastName: 'Namoradze',
location: 'Berlin, Germany',
likes: 2000,
comments: 32,
bookmarks: 12,
image: require('./assets/images/default_post.png'),
profileImage: require('./assets/images/default_profile.png'),
id: 5,
},
];
const userStoriesPageSize = 4;
const [userStoriesCurrentPage, setUserStoriesCurrentPage] = useState(1);
const [userStoriesRenderedData, setUserStoriesRenderedData] = useState([]);
const [isLoadingUserStories, setIsLoadingUserStories] = useState(false);
const userPostsPageSize = 2;
const [userPostsCurrentPage, setUserPostsCurrentPage] = useState(1);
const [userPostsRenderedData, setUserPostsRenderedData] = useState([]);
const [isLoadingUserPosts, setIsLoadingUserPosts] = useState(false);
const pagination = (database, currentPage, pageSize) => {
const startIndex = (currentPage - 1) * pageSize;
const endIndex = startIndex + pageSize;
if (startIndex >= database.length) {
return [];
}
return database.slice(startIndex, endIndex);
};
useEffect(() => {
setIsLoadingUserStories(true);
const getInitialData = pagination(userStories, 1, userStoriesPageSize);
setUserStoriesRenderedData(getInitialData);
setIsLoadingUserStories(false);
setIsLoadingUserPosts(true);
const getInitialDataPosts = pagination(userPosts, 1, userPostsPageSize);
setUserPostsRenderedData(getInitialDataPosts);
setIsLoadingUserPosts(false);
}, []);
return (
<SafeAreaView>
<View>
<FlatList
ListHeaderComponent={
<>
<View style={globalStyle.header}>
<Title title={'Let’s Explore'} />
<TouchableOpacity style={globalStyle.messageIcon}>
<FontAwesomeIcon
icon={faEnvelope}
size={20}
color={'#898DAE'}
/>
<View style={globalStyle.messageNumberContainer}>
<Text style={globalStyle.messageNumber}>2</Text>
</View>
</TouchableOpacity>
</View>
<View style={globalStyle.userStoryContainer}>
<FlatList
onEndReachedThreshold={0.5}
onEndReached={() => {
if (isLoadingUserStories) {
return;
}
setIsLoadingUserStories(true);
const contentToAppend = pagination(
userStories,
userStoriesCurrentPage + 1,
userStoriesPageSize,
);
if (contentToAppend.length > 0) {
setUserStoriesCurrentPage(userStoriesCurrentPage + 1);
setUserStoriesRenderedData(prev => [
...prev,
...contentToAppend,
]);
}
setIsLoadingUserStories(false);
}}
showsHorizontalScrollIndicator={false}
horizontal={true}
data={userStoriesRenderedData}
renderItem={({item}) => (
<UserStory
key={'userStory' + item.id}
firstName={item.firstName}
profileImage={item.profileImage}
/>
)}
/>
</View>
</>
}
onEndReachedThreshold={0.5}
onEndReached={() => {
if (isLoadingUserPosts) {
return;
}
setIsLoadingUserPosts(true);
console.log(
'fetching more data for you ',
userPostsCurrentPage + 1,
);
const contentToAppend = pagination(
userPosts,
userPostsCurrentPage + 1,
userPostsPageSize,
);
if (contentToAppend.length > 0) {
setUserPostsCurrentPage(userPostsCurrentPage + 1);
setUserPostsRenderedData(prev => [...prev, ...contentToAppend]);
}
setIsLoadingUserPosts(false);
}}
data={userPostsRenderedData}
showsVerticalScrollIndicator={false}
keyExtractor={item => item.id.toString()}
renderItem={({item}) => (
<View style={globalStyle.userPostContainer}>
<UserPost
firstName={item.firstName}
lastName={item.lastName}
image={item.image}
likes={item.likes}
comments={item.comments}
bookmarks={item.bookmarks}
profileImage={item.profileImage}
location={item.location}
/>
</View>
)}
/>
</View>
</SafeAreaView>
);
};
export default App;
Editor is loading...
Leave a Comment