diff options
author | Ivan Chen <ivan@tagg.id> | 2021-02-23 17:23:56 -0500 |
---|---|---|
committer | Ivan Chen <ivan@tagg.id> | 2021-02-23 17:23:56 -0500 |
commit | c860cb0dd149cc38a3c26b84fcb61df6da971fb5 (patch) | |
tree | a1a48ba6adfdb86f5a9d0354b5889b2f79bdd34d | |
parent | 6a2706cfa7edbe60ad0a6d27e5c4ca2b7faf1361 (diff) | |
parent | 5864b997b68ae774a871ee9b43c0e548a2656cc6 (diff) |
Merge branch 'master' into sp-add-friend-button
# Conflicts:
# src/screens/suggestedPeople/SuggestedPeopleScreen.tsx
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | src/screens/suggestedPeople/AnimatedTutorial.tsx | 29 | ||||
-rw-r--r-- | src/screens/suggestedPeople/SuggestedPeopleScreen.tsx | 167 | ||||
-rw-r--r-- | src/screens/suggestedPeopleOnboarding/SuggestedPeopleUploadPictureScreen.tsx | 4 | ||||
-rw-r--r-- | src/services/MomentCategoryService.ts | 1 | ||||
-rw-r--r-- | src/services/UserProfileService.ts | 2 | ||||
-rw-r--r-- | src/store/actions/user.ts | 16 | ||||
-rw-r--r-- | src/store/initialStates.ts | 1 | ||||
-rw-r--r-- | src/store/reducers/userReducer.ts | 5 |
9 files changed, 110 insertions, 116 deletions
diff --git a/package.json b/package.json index 0451e743..bfd1febf 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react-native-snap-carousel": "^3.9.1", "react-native-splash-screen": "^3.2.0", "react-native-svg": "^12.1.0", + "react-native-swipe-gestures": "^1.0.5", "react-native-vector-icons": "^7.0.0", "react-promise-tracker": "^2.1.0", "react-redux": "^7.2.2", diff --git a/src/screens/suggestedPeople/AnimatedTutorial.tsx b/src/screens/suggestedPeople/AnimatedTutorial.tsx index bf34ba6e..f7d62cee 100644 --- a/src/screens/suggestedPeople/AnimatedTutorial.tsx +++ b/src/screens/suggestedPeople/AnimatedTutorial.tsx @@ -3,8 +3,8 @@ import React from 'react'; import {StyleSheet, Text, View} from 'react-native'; import {Image} from 'react-native-animatable'; import {SafeAreaView} from 'react-native-safe-area-context'; +import GestureRecognizer from 'react-native-swipe-gestures'; import {useDispatch, useSelector} from 'react-redux'; -import CloseIcon from '../../assets/ionicons/close-outline.svg'; import {suggestedPeopleAnimatedTutorialFinished} from '../../store/actions/user'; import {RootState} from '../../store/rootReducer'; import {isIPhoneX, SCREEN_WIDTH} from '../../utils'; @@ -20,22 +20,19 @@ const AnimatedTutorial: React.FC = () => { }; return ( <SafeAreaView> - <View style={styles.container}> - <CloseIcon - height={'10%'} - width={'10%'} - color={'white'} - style={styles.closeButton} - onPress={handleCloseAnimationTutorial} - /> - <View style={styles.textContainer}> - <Text style={styles.text}>{'Swipe up to discover more people!'}</Text> + <GestureRecognizer onSwipeUp={handleCloseAnimationTutorial}> + <View style={styles.container}> + <View style={styles.textContainer}> + <Text style={styles.text}> + {'Swipe up to discover more people!'} + </Text> + </View> + <Image + source={require('../../assets/gifs/swipe-animation.gif')} + style={styles.swipeGif} + /> </View> - <Image - source={require('../../assets/gifs/swipe-animation.gif')} - style={styles.swipeGif} - /> - </View> + </GestureRecognizer> </SafeAreaView> ); }; diff --git a/src/screens/suggestedPeople/SuggestedPeopleScreen.tsx b/src/screens/suggestedPeople/SuggestedPeopleScreen.tsx index 42ca3247..7f7d9d07 100644 --- a/src/screens/suggestedPeople/SuggestedPeopleScreen.tsx +++ b/src/screens/suggestedPeople/SuggestedPeopleScreen.tsx @@ -1,6 +1,5 @@ -import AsyncStorage from '@react-native-community/async-storage'; import {useFocusEffect, useNavigation} from '@react-navigation/native'; -import React, {Fragment, useCallback, useEffect, useState} from 'react'; +import React, {memo, Fragment, useCallback, useEffect, useState} from 'react'; import { FlatList, ListRenderItemInfo, @@ -55,60 +54,59 @@ const SuggestedPeopleScreen: React.FC = () => { const {userId: loggedInUserId} = useSelector( (state: RootState) => state.user.user, ); + const {suggestedPeopleImage} = useSelector((state: RootState) => state.user); const [people, setPeople] = useState<SuggestedPeopleDataType[]>([]); const [displayedUser, setDisplayedUser] = useState<SuggestedPeopleDataType>(); const [page, setPage] = useState(0); const [refreshing, setRefreshing] = useState(false); + const [shouldResetData, setShouldResetData] = useState(false); const [hideStatusBar, setHideStatusBar] = useState(false); // loads data and append it to users based on current page useEffect(() => { - // console.log('current page', page); - loadMore(false); + loadMore(); }, [page]); - useFocusEffect(() => { + useEffect(() => { + if (shouldResetData) { + if (page !== 0) { + setPage(0); + } else { + loadMore(); + } + } + }, [shouldResetData]); + + useEffect(() => { const appendSelf = async () => { - AsyncStorage.getItem('suggested_people_url').then((image) => { - console.log('image path: ', image); - const self = { - user: getUserAsProfilePreviewType( - state.user.user, - state.user.profile, - ), - mutual_friends: [], - badges: [], - social_links: [], - suggested_people_url: image ? image : '', - }; - people.unshift(self); - setPeople(people); - }); + const self = { + user: getUserAsProfilePreviewType(state.user.user, state.user.profile), + mutual_friends: [], + badges: [], + social_links: [], + suggested_people_url: suggestedPeopleImage, + }; + people.unshift(self); + setPeople(people); }; if (suggested_people_linked < 2) { if (people.length > 1 && people[0].user.id !== loggedInUserId) { appendSelf(); } } - }); + }, [suggestedPeopleImage]); - const loadMore = async (resetData: boolean) => { + const loadMore = async () => { const loadNextPage = async () => await getSuggestedPeople( SP_PAGE_SIZE, - resetData ? 0 : page * SP_PAGE_SIZE, + shouldResetData ? 0 : page * SP_PAGE_SIZE, ); loadNextPage().then((newUsers) => { loadUserDataToStore(newUsers.map((ppl) => ppl.user)); - let newPeople = []; - if (resetData) { - newPeople = newUsers; - setPage(0); - } else { - newPeople = people.concat(newUsers); - } - setPeople(newPeople); + setPeople(shouldResetData ? newUsers : people.concat(newUsers)); + setShouldResetData(false); }); }; @@ -124,10 +122,11 @@ const SuggestedPeopleScreen: React.FC = () => { }; await Promise.all(users.map((user) => loadUserData(user))); }; - const resetPage = () => { + + const onRefresh = () => { const reset = async () => { await dispatch(resetScreenType(screenType)); - loadMore(true); + setShouldResetData(true); }; setRefreshing(true); reset().then(() => { @@ -135,10 +134,6 @@ const SuggestedPeopleScreen: React.FC = () => { }); }; - const onRefresh = useCallback(() => { - resetPage(); - }, []); - useFocusEffect( useCallback(() => { const navigateToAnimatedTutorial = () => { @@ -224,60 +219,56 @@ const SuggestedPeopleScreen: React.FC = () => { } }; - const SPBody = ({ - item, - }: { - item: ListRenderItemInfo<SuggestedPeopleDataType>; - }) => { - const data = item.item; - setDisplayedUser(item.item); - const firstItem = item.index === 0; - return ( - <> - <StatusBar barStyle={'light-content'} hidden={hideStatusBar} /> - <Image - source={{ - uri: data.suggested_people_url, - }} - style={styles.image} - /> - <View style={styles.mainContainer}> - <Text style={styles.title}>{firstItem && 'Suggested People'}</Text> - <View style={styles.body}> - <View style={styles.marginManager}> - <View style={styles.addUserContainer}> - <TouchableOpacity - onPress={() => { - navigation.push('Profile', { - userXId: data.user.id, - screenType, - }); - }} - style={styles.nameInfoContainer}> - <Text style={styles.firstName}>{data.user.first_name}</Text> - <Text style={styles.username}>@{data.user.username}</Text> - </TouchableOpacity> - {/* Friendship Button */} - {displayButton(data)} + const SPBody = memo( + ({item}: {item: ListRenderItemInfo<SuggestedPeopleDataType>}) => { + const data = item.item; + const firstItem = item.index === 0; + return ( + <> + <StatusBar barStyle={'light-content'} hidden={hideStatusBar} /> + <Image + source={{ + uri: data.suggested_people_url, + }} + style={styles.image} + /> + <View style={styles.mainContainer}> + <Text style={styles.title}>{firstItem && 'Suggested People'}</Text> + <View style={styles.body}> + <View style={styles.marginManager}> + <View style={styles.addUserContainer}> + <TouchableOpacity + onPress={() => { + navigation.push('Profile', { + userXId: data.user.id, + screenType, + }); + }} + style={styles.nameInfoContainer}> + <Text style={styles.firstName}>{data.user.first_name}</Text> + <Text style={styles.username}>@{data.user.username}</Text> + </TouchableOpacity> + {displayButton(data)} + </View> + </View> + <TaggsBar + y={y} + userXId={ + data.user.id === loggedInUserId ? undefined : data.user.id + } + profileBodyHeight={0} + screenType={screenType} + whiteRing={true} + /> + <View style={styles.marginManager}> + <MutualFriends user={data.user} friends={data.mutual_friends} /> </View> - </View> - <TaggsBar - y={y} - userXId={ - data.user.id === loggedInUserId ? undefined : data.user.id - } - profileBodyHeight={0} - screenType={screenType} - whiteRing={true} - /> - <View style={styles.marginManager}> - <MutualFriends user={data.user} friends={data.mutual_friends} /> </View> </View> - </View> - </> - ); - }; + </> + ); + }, + ); return suggested_people_linked === 0 ? ( <SuggestedPeopleOnboardingStackScreen /> diff --git a/src/screens/suggestedPeopleOnboarding/SuggestedPeopleUploadPictureScreen.tsx b/src/screens/suggestedPeopleOnboarding/SuggestedPeopleUploadPictureScreen.tsx index 5b678969..c587e930 100644 --- a/src/screens/suggestedPeopleOnboarding/SuggestedPeopleUploadPictureScreen.tsx +++ b/src/screens/suggestedPeopleOnboarding/SuggestedPeopleUploadPictureScreen.tsx @@ -1,6 +1,5 @@ import {useNavigation} from '@react-navigation/native'; import React, {useEffect, useState} from 'react'; -import AsyncStorage from '@react-native-community/async-storage'; import { Alert, Image, @@ -76,8 +75,7 @@ const SuggestedPeopleUploadPictureScreen: React.FC = ({route}) => { if (image) { const success = await sendSuggestedPeoplePhoto(image); if (success) { - dispatch(uploadedSuggestedPeoplePhoto()); - await AsyncStorage.setItem('suggested_people_url', image); + dispatch(uploadedSuggestedPeoplePhoto(image)); } else { Alert.alert(ERROR_UPLOAD); } diff --git a/src/services/MomentCategoryService.ts b/src/services/MomentCategoryService.ts index bb2c5542..edd13ad0 100644 --- a/src/services/MomentCategoryService.ts +++ b/src/services/MomentCategoryService.ts @@ -19,7 +19,6 @@ export const loadMomentCategories: ( const data = await response.json(); categories = data.categories; } else { - console.log('Could not load categories!'); return []; } } catch (err) { diff --git a/src/services/UserProfileService.ts b/src/services/UserProfileService.ts index fff35370..bfc4933f 100644 --- a/src/services/UserProfileService.ts +++ b/src/services/UserProfileService.ts @@ -145,8 +145,6 @@ export const loadSocialPosts: ( accountData.handle = body.handle; accountData.posts = body.posts; accountData.profile_pic = body.profile_pic; - } else { - throw 'Unable to fetch posts data from ' + socialType; } } catch (error) { console.log(error); diff --git a/src/store/actions/user.ts b/src/store/actions/user.ts index 3511dcf3..a9f9d945 100644 --- a/src/store/actions/user.ts +++ b/src/store/actions/user.ts @@ -13,6 +13,7 @@ import { setNewNotificationReceived, setNewVersionAvailable, setReplyPosted, + setSuggestedPeopleImage, setSuggestedPeopleLinked, socialEdited, userDetailsFetched, @@ -163,13 +164,16 @@ export const logout = (): ThunkAction< } }; -export const uploadedSuggestedPeoplePhoto = (): ThunkAction< - Promise<void>, - RootState, - unknown, - Action<string> -> => async (dispatch) => { +export const uploadedSuggestedPeoplePhoto = ( + imageUri: string, +): ThunkAction<Promise<void>, RootState, unknown, Action<string>> => async ( + dispatch, +) => { try { + await dispatch({ + type: setSuggestedPeopleImage.type, + payload: {suggestedPeopleImage: imageUri}, + }); dispatch({ type: setSuggestedPeopleLinked.type, payload: {suggested_people_linked: 1}, diff --git a/src/store/initialStates.ts b/src/store/initialStates.ts index 408de39e..4b61a2b1 100644 --- a/src/store/initialStates.ts +++ b/src/store/initialStates.ts @@ -47,6 +47,7 @@ export const NO_USER_DATA = { isOnboardedUser: false, newVersionAvailable: false, newNotificationReceived: false, + suggestedPeopleImage: '', replyPosted: <CommentThreadType | undefined>undefined, }; diff --git a/src/store/reducers/userReducer.ts b/src/store/reducers/userReducer.ts index ea9294ec..587aa374 100644 --- a/src/store/reducers/userReducer.ts +++ b/src/store/reducers/userReducer.ts @@ -66,6 +66,10 @@ const userDataSlice = createSlice({ setNewVersionAvailable: (state, action) => { state.newVersionAvailable = action.payload.newVersionAvailable; }, + + setSuggestedPeopleImage: (state, action) => { + state.suggestedPeopleImage = action.payload.suggestedPeopleImage; + }, }, }); @@ -79,5 +83,6 @@ export const { setNewVersionAvailable, setNewNotificationReceived, setReplyPosted, + setSuggestedPeopleImage, } = userDataSlice.actions; export const userDataReducer = userDataSlice.reducer; |