diff options
| author | Ivan Chen <ivan@tagg.id> | 2021-03-24 13:25:29 -0400 |
|---|---|---|
| committer | Ivan Chen <ivan@tagg.id> | 2021-03-24 13:25:29 -0400 |
| commit | cc1b5a0be911dc05386a5114e966b7ee4eb21441 (patch) | |
| tree | 90fad5a8ed92206b3026e8fd033b4d35360884f7 /src/components/profile/Friends.tsx | |
| parent | 96477697afe4dd92ce68f0f778decbca30d83e77 (diff) | |
| parent | 33c107f7382955f6993d8415f08262f51060d178 (diff) | |
Merge branch 'master' into tma698-api-profile
# Conflicts:
# src/components/search/SearchBar.tsx
Diffstat (limited to 'src/components/profile/Friends.tsx')
| -rw-r--r-- | src/components/profile/Friends.tsx | 173 |
1 files changed, 155 insertions, 18 deletions
diff --git a/src/components/profile/Friends.tsx b/src/components/profile/Friends.tsx index 7c7265c5..ac724ae0 100644 --- a/src/components/profile/Friends.tsx +++ b/src/components/profile/Friends.tsx @@ -1,14 +1,23 @@ -import React from 'react'; -import {View, StyleSheet, ScrollView, Text} from 'react-native'; -import {ProfilePreviewType, ScreenType} from '../../types'; -import {ProfilePreview} from '../profile'; -import {normalize, SCREEN_HEIGHT, SCREEN_WIDTH} from '../../utils'; +import {useNavigation} from '@react-navigation/native'; +import React, {useEffect, useState} from 'react'; +import {Alert, Linking, ScrollView, StyleSheet, Text, View} from 'react-native'; +import {checkPermission} from 'react-native-contacts'; +import {TouchableOpacity} from 'react-native-gesture-handler'; +import {useDispatch, useSelector, useStore} from 'react-redux'; import {TAGG_LIGHT_BLUE} from '../../constants'; -import {RootState} from '../../store/rootReducer'; -import {useDispatch, useStore} from 'react-redux'; -import {handleUnfriend} from '../../utils/friends'; +import {usersFromContactsService} from '../../services'; import {NO_USER} from '../../store/initialStates'; -import {TouchableOpacity} from 'react-native-gesture-handler'; +import {RootState} from '../../store/rootReducer'; +import {ProfilePreviewType, ScreenType} from '../../types'; +import { + extractContacts, + normalize, + SCREEN_HEIGHT, + SCREEN_WIDTH, +} from '../../utils'; +import {handleAddFriend, handleUnfriend} from '../../utils/friends'; +import {ProfilePreview} from '../profile'; +import FindFriendsBlueIcon from '../../assets/icons/findFriends/find-friends-blue-icon.svg'; interface FriendsProps { result: Array<ProfilePreviewType>; @@ -19,14 +28,101 @@ interface FriendsProps { const Friends: React.FC<FriendsProps> = ({result, screenType, userId}) => { const state: RootState = useStore().getState(); const dispatch = useDispatch(); - const {user: loggedInUser = NO_USER} = state; + const navigation = useNavigation(); + const [usersFromContacts, setUsersFromContacts] = useState< + ProfilePreviewType[] + >([]); + + useEffect(() => { + const handleFindFriends = () => { + extractContacts().then(async (contacts) => { + const permission = await checkPermission(); + if (permission === 'authorized') { + let response = await usersFromContactsService(contacts); + await setUsersFromContacts(response.existing_tagg_users); + } else { + console.log('Authorize access to contacts'); + } + }); + }; + handleFindFriends(); + }, []); + + const UsersFromContacts = () => ( + <> + {usersFromContacts?.splice(0, 2).map((profilePreview) => ( + <View key={profilePreview.id} style={styles.container}> + <View style={styles.friend}> + <ProfilePreview + {...{profilePreview}} + previewType={'Friend'} + screenType={screenType} + /> + </View> + <TouchableOpacity + style={styles.addFriendButton} + onPress={() => { + handleAddFriend(screenType, profilePreview, dispatch, state).then( + (success) => { + if (success) { + let users = usersFromContacts; + setUsersFromContacts( + users.filter( + (user) => user.username !== profilePreview.username, + ), + ); + } + }, + ); + }}> + <Text style={styles.addFriendButtonTitle}>Add Friend</Text> + </TouchableOpacity> + </View> + ))} + </> + ); return ( <> - <View style={styles.subheader}> - {/* <Text style={styles.subheaderText}>Friends</Text> */} - </View> + {loggedInUser.userId === userId && ( + <View style={styles.subheader}> + <View style={styles.addFriendHeaderContainer}> + <Text style={[styles.subheaderText]}>Add Friends</Text> + <TouchableOpacity + style={styles.findFriendsButton} + onPress={async () => { + const permission = await checkPermission(); + if (permission === 'authorized') { + navigation.navigate('InviteFriendsScreen', { + screenType: ScreenType.Profile, + }); + } else { + Alert.alert( + '"Tagg" Would Like to Access Your Contacts', + 'This helps you quickly get in touch with friends on the app and more', + [ + { + text: "Don't Allow", + style: 'cancel', + }, + {text: 'Allow', onPress: () => Linking.openSettings()}, + ], + ); + } + }}> + <FindFriendsBlueIcon width={20} height={20} /> + <Text style={styles.findFriendsSubheaderText}> + Invite Friends + </Text> + </TouchableOpacity> + </View> + <UsersFromContacts /> + </View> + )} + <Text style={[styles.subheaderText, styles.friendsSubheaderText]}> + Friends + </Text> <ScrollView keyboardShouldPersistTaps={'always'} style={styles.scrollView} @@ -43,11 +139,11 @@ const Friends: React.FC<FriendsProps> = ({result, screenType, userId}) => { </View> {loggedInUser.userId === userId && ( <TouchableOpacity - style={styles.button} + style={styles.unfriendButton} onPress={() => handleUnfriend(screenType, profilePreview, dispatch, state) }> - <Text style={styles.buttonTitle}>Unfriend</Text> + <Text style={styles.unfriendButtonTitle}>Unfriend</Text> </TouchableOpacity> )} </View> @@ -63,12 +159,19 @@ const styles = StyleSheet.create({ alignSelf: 'center', width: SCREEN_WIDTH * 0.85, }, + firstScrollView: {}, scrollViewContent: { alignSelf: 'center', paddingBottom: SCREEN_HEIGHT / 7, width: SCREEN_WIDTH * 0.85, marginTop: '1%', }, + addFriendHeaderContainer: { + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: '3%', + marginTop: '2%', + }, header: {flexDirection: 'row'}, subheader: { alignSelf: 'center', @@ -81,6 +184,20 @@ const styles = StyleSheet.create({ fontWeight: '600', lineHeight: normalize(14.32), }, + findFriendsButton: {flexDirection: 'row'}, + friendsSubheaderText: { + alignSelf: 'center', + width: SCREEN_WIDTH * 0.85, + marginVertical: '1%', + marginBottom: '2%', + }, + findFriendsSubheaderText: { + marginLeft: '5%', + color: '#08E2E2', + fontSize: normalize(12), + fontWeight: '600', + lineHeight: normalize(14.32), + }, container: { alignSelf: 'center', flexDirection: 'row', @@ -94,7 +211,7 @@ const styles = StyleSheet.create({ alignSelf: 'center', height: '100%', }, - button: { + addFriendButton: { alignSelf: 'center', justifyContent: 'center', alignItems: 'center', @@ -104,9 +221,29 @@ const styles = StyleSheet.create({ borderWidth: 2, borderRadius: 2, padding: 0, - backgroundColor: 'transparent', + backgroundColor: TAGG_LIGHT_BLUE, + }, + addFriendButtonTitle: { + color: 'white', + padding: 0, + fontSize: normalize(11), + fontWeight: '700', + lineHeight: normalize(13.13), + letterSpacing: normalize(0.6), + paddingHorizontal: '3.8%', + }, + unfriendButton: { + alignSelf: 'center', + justifyContent: 'center', + alignItems: 'center', + width: 82, + height: '55%', + borderColor: TAGG_LIGHT_BLUE, + borderWidth: 2, + borderRadius: 2, + padding: 0, }, - buttonTitle: { + unfriendButtonTitle: { color: TAGG_LIGHT_BLUE, padding: 0, fontSize: normalize(11), |
