From bc701a2c008bb767c2e3d18bd797c6bedaed8308 Mon Sep 17 00:00:00 2001 From: Mayank Singh Date: Fri, 2 Jul 2021 01:47:57 +0530 Subject: [PATCH 1/5] profile, logout added --- App.tsx | 5 +- package.json | 2 + .../Headers/ProfileHeader/ProfileHeader.tsx | 55 ++++ src/components/Messages/VideoChat.tsx | 13 +- src/components/Modals/Settings/Settings.tsx | 132 ++++++++++ .../Modals/VideoOptions/VideoOptions.tsx | 1 - src/constants/User/User.ts | 3 + src/hooks/Meeting/useStartMeeting.ts | 21 +- src/hooks/Messages/Meeting/useGetMeetMssg.ts | 21 ++ src/hooks/auth/useAuth.ts | 8 +- src/models/User/User.ts | 6 +- .../MainTabNavigator/MainTabNavigator.tsx | 6 +- .../Meeting/JoinMeetScreen/JoinMeetScreen.tsx | 2 +- src/screens/ProfileScreen/ProfileScreen.tsx | 239 +++++++++++++++++- src/store/theme/reducer/ThemeReducer.ts | 2 +- src/utils/Meeting/Methods/createMeeting.ts | 2 +- src/utils/Meeting/Methods/getShareMessage.ts | 10 +- yarn.lock | 12 + 18 files changed, 512 insertions(+), 28 deletions(-) create mode 100644 src/components/Headers/ProfileHeader/ProfileHeader.tsx create mode 100644 src/components/Modals/Settings/Settings.tsx create mode 100644 src/constants/User/User.ts diff --git a/App.tsx b/App.tsx index 25d0a4a..579799a 100644 --- a/App.tsx +++ b/App.tsx @@ -1,6 +1,7 @@ import React from 'react'; +import {View} from 'react-native'; import * as eva from '@eva-design/eva'; -import {ApplicationProvider, IconRegistry} from '@ui-kitten/components'; +import {ApplicationProvider, IconRegistry, Text} from '@ui-kitten/components'; import {EvaIconsPack} from '@ui-kitten/eva-icons'; import {default as appTheme} from './src/themes/custom-theme.json'; import {SafeAreaProvider} from 'react-native-safe-area-context'; @@ -10,6 +11,7 @@ import {useSelector} from 'react-redux'; import {RootState} from './src/store/rootReducer'; import MainNavigator from './src/navigation/MainNavigator'; import {LogBox} from 'react-native'; +import Toast from 'react-native-toast-message'; LogBox.ignoreAllLogs(); @@ -25,6 +27,7 @@ const App = () => { {...eva} theme={{...(theme && eva[theme]), ...appTheme}}> + Toast.setRef(ref)} /> ); diff --git a/package.json b/package.json index e2c6d93..a769f36 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "dependencies": { "@eva-design/eva": "^2.1.0", "@eva-design/material": "^2.1.0", + "@react-native-clipboard/clipboard": "^1.8.2", "@react-native-community/masked-view": "^0.1.11", "@react-native-firebase/app": "^12.1.0", "@react-native-firebase/auth": "^12.1.0", @@ -47,6 +48,7 @@ "react-native-screens": "^3.4.0", "react-native-splash-screen": "^3.2.0", "react-native-svg": "^12.1.1", + "react-native-toast-message": "^1.4.9", "react-native-vector-icons": "^8.1.0", "react-redux": "^7.2.4", "redux": "^4.1.0", diff --git a/src/components/Headers/ProfileHeader/ProfileHeader.tsx b/src/components/Headers/ProfileHeader/ProfileHeader.tsx new file mode 100644 index 0000000..f6bda0d --- /dev/null +++ b/src/components/Headers/ProfileHeader/ProfileHeader.tsx @@ -0,0 +1,55 @@ +import {Icon} from '@ui-kitten/components'; +import React from 'react'; +import {StyleSheet, Text, View, TouchableOpacity} from 'react-native'; +import {useSelector} from 'react-redux'; +import {RootState} from '../../../store/rootReducer'; + +interface props { + myProfile: boolean; + onPressEdit: () => void; + onPressSetting: () => void; +} + +const ProfileHeader = (props: props) => { + const theme = useSelector( + (reduxState: RootState) => reduxState.ThemeReducer.theme, + ); + + if (!props.myProfile) return null; + return ( + + + + + + + + + ); +}; + +const styles = StyleSheet.create({ + main: { + width: '100%', + flexDirection: 'row', + justifyContent: 'flex-end', + padding: 10, + alignItems: 'center', + flex: 1, + }, + icon: { + height: 30, + width: 30, + marginHorizontal: 7, + }, +}); + +export default ProfileHeader; diff --git a/src/components/Messages/VideoChat.tsx b/src/components/Messages/VideoChat.tsx index af21f0e..1236054 100644 --- a/src/components/Messages/VideoChat.tsx +++ b/src/components/Messages/VideoChat.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import {StyleSheet, View, ActivityIndicator, Clipboard} from 'react-native'; -import {Layout, Text, useTheme, Icon} from '@ui-kitten/components'; +import {StyleSheet, View, ActivityIndicator} from 'react-native'; +import {Layout, useTheme, Icon} from '@ui-kitten/components'; import {FirebaseFirestoreTypes} from '@react-native-firebase/firestore'; import {useSelector} from 'react-redux'; import {RootState} from '../../store/rootReducer'; @@ -15,8 +15,9 @@ import { } from 'react-native-gifted-chat'; import {Baithak} from '../../models/Meeting/CreateMeeting/interface'; import {onDeleteMessage} from '../../utils/Messages/onDeleteMessage'; +import Toast from 'react-native-toast-message'; +import Clipboard from '@react-native-clipboard/clipboard'; import {RALEWAY_MEDIUM} from '../../constants/Fonts/Fonts'; -import {ToastAndroid} from 'react-native'; interface props { message: IMessage[]; @@ -107,7 +108,11 @@ const onLongPress = ( break; case 1: Clipboard.setString(message.text); - ToastAndroid.show('Copied!', ToastAndroid.SHORT); + Toast.show({ + type: 'success', + text1: 'Copied!', + position: 'top', + }); break; } }, diff --git a/src/components/Modals/Settings/Settings.tsx b/src/components/Modals/Settings/Settings.tsx new file mode 100644 index 0000000..fe319c0 --- /dev/null +++ b/src/components/Modals/Settings/Settings.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import {StyleSheet, View, TouchableOpacity} from 'react-native'; +import {Layout, useStyleSheet, Text, Icon, Toggle} from '@ui-kitten/components'; +import Modal from 'react-native-modal'; +import {useDispatch, useSelector} from 'react-redux'; +import {RootState} from '../../../store/rootReducer'; +import {RALEWAY_BOLD, RALEWAY_MEDIUM} from '../../../constants/Fonts/Fonts'; +import {optionProp} from '../../../models/Meeting/CreateMeeting/interface'; +import {useState} from 'react'; +import FullDivider from '../../Divider/FullDivider'; +import {updateTheme} from '../../../store/theme/actionCreator/updateTheme'; + +interface props { + modalVisible: boolean; + onBackDropPress: () => void; +} + +const Settings = (props: props) => { + const styles = useStyleSheet(themedStyles); + + const storeDispatch = useDispatch(); + + const theme = useSelector( + (reduxState: RootState) => reduxState.ThemeReducer.theme, + ); + + const changeTheme = () => { + storeDispatch(updateTheme(theme === 'dark' ? 'light' : 'dark')); + }; + + return ( + + + + + + + + Settings + + + + + Dark Mode + + + + + + + Close + + + + + + ); +}; + +const themedStyles = StyleSheet.create({ + main: { + margin: 0, + borderTopLeftRadius: 30, + borderTopRightRadius: 30, + paddingBottom: 20, + }, + modal: { + flex: 1, + margin: 0, + justifyContent: 'flex-end', + }, + header: { + width: '100%', + alignItems: 'center', + marginTop: 20, + }, + drop: { + width: 50, + height: 10, + borderRadius: 20, + }, + container: { + padding: 20, + paddingBottom: 0, + }, + heading: { + fontFamily: RALEWAY_BOLD, + }, + icon: { + height: 25, + width: 25, + }, + option: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 20, + }, + createMeet: { + fontFamily: RALEWAY_MEDIUM, + marginLeft: 10, + }, + modeView: { + flexDirection: 'row', + width: '100%', + justifyContent: 'space-between', + marginTop: 20, + }, + dark: { + fontFamily: RALEWAY_MEDIUM, + }, +}); + +export default Settings; diff --git a/src/components/Modals/VideoOptions/VideoOptions.tsx b/src/components/Modals/VideoOptions/VideoOptions.tsx index 63e245b..4c3c821 100644 --- a/src/components/Modals/VideoOptions/VideoOptions.tsx +++ b/src/components/Modals/VideoOptions/VideoOptions.tsx @@ -22,7 +22,6 @@ interface props { const VideoOptions = (props: props) => { const styles = useStyleSheet(themedStyles); - const [meetInfo, toogleMeetInfo] = useState(false); const options: optionProp[] = [ { diff --git a/src/constants/User/User.ts b/src/constants/User/User.ts new file mode 100644 index 0000000..9b527fd --- /dev/null +++ b/src/constants/User/User.ts @@ -0,0 +1,3 @@ +export const DEFAULT_USER_NAME = 'Robot'; +export const DEFAULT_USER_TAGLINE = 'Baithak User'; +export const DEFAULT_BIO = `What's ssups ?`; diff --git a/src/hooks/Meeting/useStartMeeting.ts b/src/hooks/Meeting/useStartMeeting.ts index 31ec21f..e837e50 100644 --- a/src/hooks/Meeting/useStartMeeting.ts +++ b/src/hooks/Meeting/useStartMeeting.ts @@ -20,6 +20,7 @@ import {checkPermission} from '../../utils/Permissions/Permission'; import firestore from '@react-native-firebase/firestore'; import {Share, ToastAndroid} from 'react-native'; import {getShareMessage} from '../../utils/Meeting/Methods/getShareMessage'; +import Toast from 'react-native-toast-message'; interface props { appId: string; @@ -189,10 +190,12 @@ const useStartMeeting = ( const onPressSpeaker = () => { if (engine.current) { toogleSpeaker(!speakerOff); - ToastAndroid.show( - `Incoming Audios are ${speakerOff ? 'On' : 'Off'}!`, - ToastAndroid.SHORT, - ); + Toast.show({ + type: 'info', + text1: `Incoming Audios are ${speakerOff ? 'On' : 'Off'}!`, + position: 'top', + }); + if (menuOpen) setMenuOpen(!menuOpen); engine.current?.muteAllRemoteAudioStreams(speakerOff); } }; @@ -201,10 +204,12 @@ const useStartMeeting = ( const onPressInVideo = () => { if (engine.current) { toogleInVideoOff(!inVideoOff); - ToastAndroid.show( - `Incoming Videos are ${inVideoOff ? 'On' : 'Off'}!`, - ToastAndroid.SHORT, - ); + Toast.show({ + type: 'info', + text1: `Incoming Videos are ${inVideoOff ? 'On' : 'Off'}!`, + position: 'top', + }); + if (menuOpen) setMenuOpen(!menuOpen); engine.current?.muteAllRemoteVideoStreams(inVideoOff); } }; diff --git a/src/hooks/Messages/Meeting/useGetMeetMssg.ts b/src/hooks/Messages/Meeting/useGetMeetMssg.ts index 28e8931..43c6809 100644 --- a/src/hooks/Messages/Meeting/useGetMeetMssg.ts +++ b/src/hooks/Messages/Meeting/useGetMeetMssg.ts @@ -8,11 +8,13 @@ import {Message} from '../../../models/Messages/interface'; import {getUser} from '../../../utils/Messages/Meeting/utils'; import {debounce} from 'lodash'; import {getTime} from '../../../utils/Miscellaneous/utils'; +import Toast from 'react-native-toast-message'; const useGetMeetMssg = (Baithak: Baithak) => { const [messages, setMessages] = useState([]); const [lastDoc, setLastDoc] = useState(); const [isMoreLoading, setIsMoreLoading] = useState(false); + const [lastMessage, setLastMssg] = useState(); useEffect(() => { try { @@ -23,6 +25,11 @@ const useGetMeetMssg = (Baithak: Baithak) => { .orderBy('createdAt', 'desc') .limit(15) .onSnapshot((querySnapshot) => { + querySnapshot.docChanges().forEach((change) => { + if (change.type === 'added') { + change.doc.exists && setLastMssg(change.doc.data() as Message); + } + }); const chats: IMessage[] = []; querySnapshot.forEach((doc) => { const local_message = doc.exists && (doc.data() as Message); @@ -85,6 +92,20 @@ const useGetMeetMssg = (Baithak: Baithak) => { [lastDoc], ); + useEffect(() => { + if (lastMessage) { + const user = getUser(lastMessage.uid, Baithak); + if (lastMessage.uid !== user._id) { + Toast.show({ + type: 'success', + text1: user.name, + text2: lastMessage.text, + position: 'bottom', + }); + } + } + }, [lastMessage]); + const handleSend = async (mssgs: IMessage[]) => { try { mssgs.map((m) => { diff --git a/src/hooks/auth/useAuth.ts b/src/hooks/auth/useAuth.ts index cd787db..7530459 100644 --- a/src/hooks/auth/useAuth.ts +++ b/src/hooks/auth/useAuth.ts @@ -15,6 +15,7 @@ import {UserInterface} from '../../models/User/User'; import {addNewUserObj} from '../../utils/User/Methods/addNewUserObj'; import {updateUserObjOnAuth} from '../../utils/User/Methods/updateUserObjOnAuth'; import useFirestore from '../Firestore/useFirestore'; +import Toast from 'react-native-toast-message'; const useAuth = () => { const [firebaseUserRef, setFirebaseUserRef] = useState< @@ -53,7 +54,12 @@ const useAuth = () => { user.photoURL ? user.photoURL : undefined, false, ); - ToastAndroid.show('Successfully login !', ToastAndroid.SHORT); + Toast.show({ + type: 'success', + text1: 'Great Success👍', + text2: 'You have successfully login into the app', + position: 'top', + }); } else { //Update the User await updateUserObjOnAuth( diff --git a/src/models/User/User.ts b/src/models/User/User.ts index cfd3441..e20f886 100644 --- a/src/models/User/User.ts +++ b/src/models/User/User.ts @@ -1,17 +1,19 @@ export interface UserInterface { uid: string; name?: string; - email?: string; - phone?: string; + email: string; gender?: string; os?: 'android' | 'ios' | 'macos' | 'windows' | 'web'; photoURL?: string; + bio?: string; + tagLine?: string; agoraId: number; } export const defaultUser: UserInterface = { uid: '', agoraId: 0, + email: `example@gmail.com`, }; export type userStatusType = 'PENDING' | 'FAIL' | 'SUCCESS' | 'FETCHING'; diff --git a/src/navigation/MainTabNavigator/MainTabNavigator.tsx b/src/navigation/MainTabNavigator/MainTabNavigator.tsx index 2c0b5bc..6ac21dc 100644 --- a/src/navigation/MainTabNavigator/MainTabNavigator.tsx +++ b/src/navigation/MainTabNavigator/MainTabNavigator.tsx @@ -80,7 +80,11 @@ const MainTabNavigator = () => ( - + ); diff --git a/src/screens/Meeting/JoinMeetScreen/JoinMeetScreen.tsx b/src/screens/Meeting/JoinMeetScreen/JoinMeetScreen.tsx index 7262454..a97b345 100644 --- a/src/screens/Meeting/JoinMeetScreen/JoinMeetScreen.tsx +++ b/src/screens/Meeting/JoinMeetScreen/JoinMeetScreen.tsx @@ -79,7 +79,7 @@ const JoinMeetScreen = (props: any) => { status="basic" placeholder="Baithak ID" onBlur={() => formikProps.setFieldTouched('meetId')} - keyboardType="email-address" + keyboardType="phone-pad" accessoryLeft={NameIcon} value={formikProps.values.meetId} onChangeText={formikProps.handleChange('meetId')} diff --git a/src/screens/ProfileScreen/ProfileScreen.tsx b/src/screens/ProfileScreen/ProfileScreen.tsx index e5037d0..f7522cf 100644 --- a/src/screens/ProfileScreen/ProfileScreen.tsx +++ b/src/screens/ProfileScreen/ProfileScreen.tsx @@ -1,14 +1,241 @@ import React from 'react'; -import {Text, Layout} from '@ui-kitten/components'; +import {Text, Layout, useTheme, Icon} from '@ui-kitten/components'; +import {ScrollView, StyleSheet, View, TouchableOpacity} from 'react-native'; +import ProfileHeader from '../../components/Headers/ProfileHeader/ProfileHeader'; +import {useDispatch, useSelector} from 'react-redux'; +import {RootState} from '../../store/rootReducer'; +import FastImage from 'react-native-fast-image'; +import {DEFAULT_AVATAR} from '../../constants/Images/Images'; +import { + RALEWAY_BOLD, + RALEWAY_EXTRA_BOLD, + RALEWAY_MEDIUM, + RALEWAY_REGULAR, +} from '../../constants/Fonts/Fonts'; +import {DEFAULT_BIO, DEFAULT_USER_TAGLINE} from '../../constants/User/User'; +import FullDivider from '../../components/Divider/FullDivider'; +import Toast from 'react-native-toast-message'; +import Clipboard from '@react-native-clipboard/clipboard'; +import {useState} from 'react'; +import Settings from '../../components/Modals/Settings/Settings'; +import {updateFirebaseUserStatus} from '../../store/User/actionCreator/addFirebaseUser'; +import {FAIL} from '../../constants/RemoteStates/remotestates'; +import {generalErrorN} from '../../components/Alerts/GeneralError'; +import auth from '@react-native-firebase/auth'; + +const ProfileScreen = (props: any) => { + const {myProfile} = props.route.params; + + const [settingOpen, toggleSetting] = useState(false); + + const firebaseUser = useSelector( + (reduxState: RootState) => reduxState.UserReducer.firebaseUser, + ); + const theme = useSelector( + (reduxState: RootState) => reduxState.ThemeReducer.theme, + ); + + const storeDispatch = useDispatch(); + + const signOut = async () => { + try { + await auth().signOut(); + Toast.show({ + type: 'success', + position: 'top', + text1: 'Great Success✌', + text2: 'You have successfully logout ', + }); + storeDispatch(updateFirebaseUserStatus(FAIL)); + } catch (err) { + Toast.show({ + type: 'error', + position: 'top', + text1: 'Something went wrong 😔', + text2: 'Please try again!!', + }); + storeDispatch(updateFirebaseUserStatus(FAIL)); + console.log('Error in log out', err); + } + }; + + const onSignOut = async () => { + generalErrorN( + { + title: 'Log Out', + textMessage: 'Are you sure you want to logout', + okText: 'Yes', + }, + [ + { + text: 'No', + onPress: () => {}, + }, + { + text: 'Yes', + onPress: signOut, + }, + ], + ); + }; + + const appTheme = useTheme(); -const ProfileScreen = () => { return ( - - Profile Screen + + toggleSetting(!settingOpen)} + /> + + + console.log('Edit')} + onPressSetting={() => toggleSetting(!settingOpen)} + /> + + + + + + Hi, I'm{' '} + + {firebaseUser.name ? firebaseUser.name : 'Robot'} + + + + {firebaseUser.tagLine + ? firebaseUser.tagLine + : DEFAULT_USER_TAGLINE} + + + + + + Bio + + + {firebaseUser.bio ? firebaseUser.bio : DEFAULT_BIO} + + + + Email + + { + Clipboard.setString(firebaseUser.email); + Toast.show({ + type: 'success', + position: 'top', + text1: 'Copied!', + text2: `${firebaseUser.email}`, + }); + }}> + {firebaseUser.email} + + {myProfile && } + {myProfile && ( + + + + Invite you friends + + + )} + {myProfile && ( + + + + Log Out + + + )} + + ); }; +const styles = StyleSheet.create({ + main: { + flex: 1, + padding: 10, + }, + imgView: { + width: '100%', + justifyContent: 'center', + alignItems: 'center', + }, + image: { + height: 120, + width: 120, + borderRadius: 70, + }, + nameView: { + width: '100%', + alignItems: 'center', + marginTop: 20, + paddingHorizontal: 10, + }, + name: { + fontFamily: RALEWAY_BOLD, + }, + tagLine: { + fontFamily: RALEWAY_MEDIUM, + marginTop: 10, + color: 'grey', + }, + bioHeading: { + fontFamily: RALEWAY_BOLD, + }, + bioView: { + flex: 1, + padding: 10, + marginTop: 10, + }, + bio: { + fontFamily: RALEWAY_REGULAR, + marginTop: 10, + }, + invite: { + fontFamily: RALEWAY_EXTRA_BOLD, + }, + inviteView: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 10, + }, + icon: { + height: 20, + width: 20, + marginRight: 10, + }, +}); + export default ProfileScreen; diff --git a/src/store/theme/reducer/ThemeReducer.ts b/src/store/theme/reducer/ThemeReducer.ts index 5346196..d42271c 100644 --- a/src/store/theme/reducer/ThemeReducer.ts +++ b/src/store/theme/reducer/ThemeReducer.ts @@ -7,7 +7,7 @@ interface themes { } const initialThemeState: themes = { - theme: Appearance.getColorScheme(), + theme: 'dark', }; const ThemeReducer = ( diff --git a/src/utils/Meeting/Methods/createMeeting.ts b/src/utils/Meeting/Methods/createMeeting.ts index 5848217..bfad5dc 100644 --- a/src/utils/Meeting/Methods/createMeeting.ts +++ b/src/utils/Meeting/Methods/createMeeting.ts @@ -28,7 +28,7 @@ export const generateToken = async (channelName: string, agoraId: number) => { }; const generateMeetIdAndPassword = () => { - const meetId = randPassword(5, 0, 5); + const meetId = randPassword(0, 9, 0); const password = randPassword(0, 4, 5); return {meetId, password}; }; diff --git a/src/utils/Meeting/Methods/getShareMessage.ts b/src/utils/Meeting/Methods/getShareMessage.ts index f33c772..a100e93 100644 --- a/src/utils/Meeting/Methods/getShareMessage.ts +++ b/src/utils/Meeting/Methods/getShareMessage.ts @@ -1,9 +1,17 @@ +import moment from 'moment'; import {Baithak} from '../../../models/Meeting/CreateMeeting/interface'; +import {getUser} from '../../Messages/Meeting/utils'; export const getShareMessage = (baithak: Baithak | undefined) => { if (baithak) { - return `Would you like to join Baithak ? Here's a info + return `${ + getUser(baithak.host.uid, baithak).name + } would like you to join baithak? Here's a info +Topic: ${baithak.channelName} +${baithak.description ? 'Decription: ' + baithak?.description : ''} +Created At: ${moment(baithak.createAt).format('MMMM Do YYYY, h:mm:ss a')} + Baithak Id: ${baithak.meetId} Password: ${baithak.password} diff --git a/yarn.lock b/yarn.lock index 2cdd877..d43f371 100644 --- a/yarn.lock +++ b/yarn.lock @@ -989,6 +989,11 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@react-native-clipboard/clipboard@^1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@react-native-clipboard/clipboard/-/clipboard-1.8.2.tgz#454000db103442e830026566e3c2a436e9b3f781" + integrity sha512-IMUBqkwS6HyyHX1Dcu/yNqSYsgmI6UGilcUhD+qbH7tVQP8mX3k7hugr5K5IPzpGKaC1VSq4Lt7avy0jomHhLg== + "@react-native-community/cli-debugger-ui@^5.0.1": version "5.0.1" resolved "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1.tgz" @@ -5825,6 +5830,13 @@ react-native-svg@^12.1.1: css-select "^2.1.0" css-tree "^1.0.0-alpha.39" +react-native-toast-message@^1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/react-native-toast-message/-/react-native-toast-message-1.4.9.tgz#47f33ac312fe2aee5dbdd4ae14745fa0d354102e" + integrity sha512-QhHzzsiymKpHEWz2nUKQjQMRuGN+/a8cOwDXJcz3TQFY03p20f6sJW9JKw3KkMfvWiUhGbApCPpNU6tHaAZ32w== + dependencies: + prop-types "^15.7.2" + react-native-typing-animation@^0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/react-native-typing-animation/-/react-native-typing-animation-0.1.7.tgz" From 3a09e8868b8774b427c45b06c1ca62636da379da Mon Sep 17 00:00:00 2001 From: Mayank Singh Date: Fri, 2 Jul 2021 11:51:33 +0530 Subject: [PATCH 2/5] Sound on join and message added --- .../java/com/baithak/MainApplication.java | 1 + android/app/src/main/res/raw/joined.mp3 | Bin 0 -> 25715 bytes android/app/src/main/res/raw/message.mp3 | Bin 0 -> 19688 bytes android/settings.gradle | 2 + ios/Podfile | 2 + package.json | 1 + src/components/Messages/VideoChat.tsx | 1 - src/components/VideoStream/MainStream.tsx | 4 +- src/hooks/Meeting/useStartMeeting.ts | 75 +++++++++++++----- src/hooks/Messages/Meeting/useGetMeetMssg.ts | 22 +++-- src/utils/Messages/Meeting/utils.ts | 14 +++- yarn.lock | 5 ++ 12 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 android/app/src/main/res/raw/joined.mp3 create mode 100644 android/app/src/main/res/raw/message.mp3 diff --git a/android/app/src/main/java/com/baithak/MainApplication.java b/android/app/src/main/java/com/baithak/MainApplication.java index 1c3d3fc..c61747c 100644 --- a/android/app/src/main/java/com/baithak/MainApplication.java +++ b/android/app/src/main/java/com/baithak/MainApplication.java @@ -4,6 +4,7 @@ import android.content.Context; import com.facebook.react.PackageList; import com.facebook.react.ReactApplication; +import com.zmxv.RNSound.RNSoundPackage; import com.goodatlas.audiorecord.RNAudioRecordPackage; import org.devio.rn.splashscreen.SplashScreenReactPackage; import co.apptailor.googlesignin.RNGoogleSigninPackage; diff --git a/android/app/src/main/res/raw/joined.mp3 b/android/app/src/main/res/raw/joined.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..34b0c27d82feefe0b0e3b29beec2f417354673b5 GIT binary patch literal 25715 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 N#xno^mH)LJ_&+D+c~JlW literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/raw/message.mp3 b/android/app/src/main/res/raw/message.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..27a5351bb5ba1dc69387e6243aab3b534e0a4e67 GIT binary patch literal 19688 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 If0L;H0rrMYEC2ui literal 0 HcmV?d00001 diff --git a/android/settings.gradle b/android/settings.gradle index a1a89f0..49e6e88 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,6 @@ rootProject.name = 'Baithak' +include ':react-native-sound' +project(':react-native-sound').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sound/android') include ':react-native-audio-record' project(':react-native-audio-record').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-audio-record/android') include ':react-native-splash-screen' diff --git a/ios/Podfile b/ios/Podfile index 2ab109e..4284a2f 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -25,6 +25,8 @@ target 'Baithak' do pod 'RNAudioRecord', :path => '../node_modules/react-native-audio-record' + pod 'RNSound', :path => '../node_modules/react-native-sound' + target 'BaithakTests' do inherit! :complete # Pods for testing diff --git a/package.json b/package.json index a769f36..6624cde 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "react-native-reanimated": "^2.2.0", "react-native-safe-area-context": "^3.2.0", "react-native-screens": "^3.4.0", + "react-native-sound": "^0.11.0", "react-native-splash-screen": "^3.2.0", "react-native-svg": "^12.1.1", "react-native-toast-message": "^1.4.9", diff --git a/src/components/Messages/VideoChat.tsx b/src/components/Messages/VideoChat.tsx index 1236054..cdc05b1 100644 --- a/src/components/Messages/VideoChat.tsx +++ b/src/components/Messages/VideoChat.tsx @@ -165,7 +165,6 @@ const VideoChat = (props: props) => { renderComposer={(props3) => renderComposer(props3, appTheme === 'dark' ? 'white' : 'black') } - onPressAvatar={(item) => console.log('Press on avatar', item)} renderBubble={(props4) => renderBubble( props4, diff --git a/src/components/VideoStream/MainStream.tsx b/src/components/VideoStream/MainStream.tsx index ec2a912..d88f4bf 100644 --- a/src/components/VideoStream/MainStream.tsx +++ b/src/components/VideoStream/MainStream.tsx @@ -43,8 +43,6 @@ const MainStream = ({peerId, channelName}: props) => { style={{ height: height, width: width, - borderWidth: 2, - borderColor: 'white', }}> { /> ); }} - numColumns={1} + numColumns={2} /> )} diff --git a/src/hooks/Meeting/useStartMeeting.ts b/src/hooks/Meeting/useStartMeeting.ts index e837e50..7b2aa2e 100644 --- a/src/hooks/Meeting/useStartMeeting.ts +++ b/src/hooks/Meeting/useStartMeeting.ts @@ -1,10 +1,6 @@ import {useEffect, useRef, useState} from 'react'; import RtcEngine from 'react-native-agora'; -import { - generalError, - generalErrorN, -} from '../../components/Alerts/GeneralError'; -import {TITLE} from '../../constants/Alerts/GeneralError'; +import {generalErrorN} from '../../components/Alerts/GeneralError'; import {MEET_HOME_SCREEN} from '../../constants/Navigation/Navigation'; import { Baithak, @@ -18,9 +14,11 @@ import { } from '../../utils/Meeting/Methods/onMemberJoinMeet'; import {checkPermission} from '../../utils/Permissions/Permission'; import firestore from '@react-native-firebase/firestore'; -import {Share, ToastAndroid} from 'react-native'; +import {Share} from 'react-native'; import {getShareMessage} from '../../utils/Meeting/Methods/getShareMessage'; import Toast from 'react-native-toast-message'; +import {getBaithakPartiFromAgoraId} from '../../utils/Messages/Meeting/utils'; +import Sound from 'react-native-sound'; interface props { appId: string; @@ -46,6 +44,15 @@ const useStartMeeting = ( const [inVideoOff, toogleInVideoOff] = useState(false); let engine = useRef(null); + let sound = useRef( + new Sound('joined.mp3', Sound.MAIN_BUNDLE, (error) => { + if (error) { + console.log('failed to load the sound', error); + return; + } + sound.current?.play(() => sound.current?.release()); + }), + ); const startCall = async () => { try { @@ -59,10 +66,12 @@ const useStartMeeting = ( console.log('Error in start call', err); toggleModal(false); navigation.goBack(); - generalError(() => toggleModal(false), { - title: TITLE, - textMessage: 'Please try again', - okText: 'Ok', + Toast.show({ + type: 'error', + text1: 'Oops!', + text2: 'Something went wrong. Please try again', + position: 'top', + visibilityTime: 200, }); } }; @@ -96,10 +105,20 @@ const useStartMeeting = ( //Start the call await startCall(); + //================ Event Listeners Start ==================================== + + // Listen for the UserJoined callback. + // This callback occurs when the remote user successfully joins the channel. engine.current?.addListener('UserJoined', (uid, elapsed) => { - console.log('UserJoined', uid, elapsed); if (peerIds.indexOf(uid) === -1) { setPeerIds((prev) => [...prev, uid]); + const userJoined = getBaithakPartiFromAgoraId(uid, baithak); + sound.current?.play(); + Toast.show({ + type: 'info', + text1: `${userJoined.name ? userJoined.name : 'Someone'} joined`, + position: 'top', + }); } }); @@ -113,36 +132,48 @@ const useStartMeeting = ( } else { await onMemberJoinMeet(meetConfig, firebaseUser); } + sound.current?.play(); + setJoinSucceed(true); toggleModal(false); }, ); - engine.current?.addListener('Warning', (warn) => { - console.log('Warn', warn); - }); + //Listen for the Warning callback. + //This callback occurs when there is some warning + // engine.current?.addListener('Warning', (warn) => { + // console.log('Warn', warn); + // }); + //Listen for the Warning callback. + //This callback occurs when there is some warning engine.current?.addListener('Error', (err) => { console.log('Error', err); toggleModal(false); navigation.goBack(); - generalError(() => toggleModal(false), { - title: TITLE, - textMessage: 'Please try again', - okText: 'Ok', + Toast.show({ + type: 'error', + text1: 'Oops!', + text2: 'Something went wrong. Please try again', + position: 'top', }); }); }; + //================ Event Listeners Ends ==================================== + + //Call the initialize RTC method intializeRTC(); } catch (err) { console.log('Error in initialize RTC', err); toggleModal(false); navigation.goBack(); - generalError(() => toggleModal(false), { - title: TITLE, - textMessage: 'Please try again', - okText: 'Ok', + Toast.show({ + type: 'error', + text1: 'Oops!', + text2: 'Something went wrong. Please try again', + position: 'top', + visibilityTime: 300, }); } }, []); diff --git a/src/hooks/Messages/Meeting/useGetMeetMssg.ts b/src/hooks/Messages/Meeting/useGetMeetMssg.ts index 43c6809..219cce4 100644 --- a/src/hooks/Messages/Meeting/useGetMeetMssg.ts +++ b/src/hooks/Messages/Meeting/useGetMeetMssg.ts @@ -1,14 +1,15 @@ import firestore, { FirebaseFirestoreTypes, } from '@react-native-firebase/firestore'; -import {useState, useEffect, useCallback} from 'react'; +import {useState, useEffect, useCallback, useRef} from 'react'; import {IMessage} from 'react-native-gifted-chat'; import {Baithak} from '../../../models/Meeting/CreateMeeting/interface'; import {Message} from '../../../models/Messages/interface'; -import {getUser} from '../../../utils/Messages/Meeting/utils'; +import {getBaithakPartiFromUid} from '../../../utils/Messages/Meeting/utils'; import {debounce} from 'lodash'; import {getTime} from '../../../utils/Miscellaneous/utils'; import Toast from 'react-native-toast-message'; +import Sound from 'react-native-sound'; const useGetMeetMssg = (Baithak: Baithak) => { const [messages, setMessages] = useState([]); @@ -16,6 +17,8 @@ const useGetMeetMssg = (Baithak: Baithak) => { const [isMoreLoading, setIsMoreLoading] = useState(false); const [lastMessage, setLastMssg] = useState(); + let sound = useRef(null); + useEffect(() => { try { const unsubscribe = firestore() @@ -37,7 +40,7 @@ const useGetMeetMssg = (Baithak: Baithak) => { _id: local_message.messageId, text: local_message.text, createdAt: local_message.createdAt, - user: getUser(local_message.uid, Baithak), + user: getBaithakPartiFromUid(local_message.uid, Baithak), system: local_message.system, }); }); @@ -73,7 +76,7 @@ const useGetMeetMssg = (Baithak: Baithak) => { _id: local_message.messageId, text: local_message.text, createdAt: local_message.createdAt, - user: getUser(local_message.uid, Baithak), + user: getBaithakPartiFromUid(local_message.uid, Baithak), system: local_message.system, }); }); @@ -94,8 +97,17 @@ const useGetMeetMssg = (Baithak: Baithak) => { useEffect(() => { if (lastMessage) { - const user = getUser(lastMessage.uid, Baithak); + const user = getBaithakPartiFromUid(lastMessage.uid, Baithak); if (lastMessage.uid !== user._id) { + sound.current = new Sound('message.mp3', Sound.MAIN_BUNDLE, (error) => { + if (error) { + console.log('Error in playing message sound', error); + } + sound.current?.play(() => sound.current?.release()); + }); + + sound.current?.play(); + Toast.show({ type: 'success', text1: user.name, diff --git a/src/utils/Messages/Meeting/utils.ts b/src/utils/Messages/Meeting/utils.ts index fc4f2cc..513786f 100644 --- a/src/utils/Messages/Meeting/utils.ts +++ b/src/utils/Messages/Meeting/utils.ts @@ -1,6 +1,6 @@ import {Baithak} from '../../../models/Meeting/CreateMeeting/interface'; -export const getUser = (user_id: string, baithak: Baithak) => { +export const getBaithakPartiFromUid = (user_id: string, baithak: Baithak) => { const userData = baithak.members.find((user) => user.uid === user_id); return { _id: user_id, @@ -8,3 +8,15 @@ export const getUser = (user_id: string, baithak: Baithak) => { ...(userData && {avatar: userData.imageUrl}), }; }; + +export const getBaithakPartiFromAgoraId = ( + agoraId: number, + baithak: Baithak | undefined, +) => { + const userData = baithak?.members.find((user) => user.agoraId === agoraId); + return { + _id: userData?.uid, + ...(userData && {name: userData.name}), + ...(userData && {avatar: userData.imageUrl}), + }; +}; diff --git a/yarn.lock b/yarn.lock index d43f371..de8c0fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5817,6 +5817,11 @@ react-native-screens@^3.4.0: dependencies: warn-once "^0.1.0" +react-native-sound@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-native-sound/-/react-native-sound-0.11.0.tgz#ad60b55ba8c6dc89917f381ad3713f2738de530f" + integrity sha512-4bGAZfni6E2L695NQjOZwNLBQGXgBGYC4Sy+h99K5h0HqNZjCqR0+aLel+ezASxEJDpaH83gylNObXpiqJgdwg== + react-native-splash-screen@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/react-native-splash-screen/-/react-native-splash-screen-3.2.0.tgz" From 1d3335ae12f5603759e782116def32bd8e9463de Mon Sep 17 00:00:00 2001 From: Mayank Singh Date: Fri, 2 Jul 2021 13:18:47 +0530 Subject: [PATCH 3/5] theme update --- android/app/src/main/res/raw/joined.mp3 | Bin 25715 -> 28194 bytes src/components/Modals/Settings/Settings.tsx | 21 +++--- src/hooks/Meeting/useStartMeeting.ts | 65 ++++++++---------- src/hooks/auth/useAuth.ts | 15 ++-- src/models/User/User.ts | 4 ++ src/screens/Meeting/MeetScreen/MeetScreen.tsx | 2 +- src/screens/ProfileScreen/ProfileScreen.tsx | 2 + src/store/theme/reducer/ThemeReducer.ts | 2 +- src/utils/Permissions/Permission.ts | 2 - src/utils/User/Methods/addNewUserObj.ts | 8 +-- src/utils/User/Methods/createNewUserObj.ts | 8 +-- src/utils/User/Methods/getRemoteUser.ts | 22 ++++++ src/utils/User/Methods/getTheme.ts | 17 +++++ 13 files changed, 105 insertions(+), 63 deletions(-) create mode 100644 src/utils/User/Methods/getRemoteUser.ts create mode 100644 src/utils/User/Methods/getTheme.ts diff --git a/android/app/src/main/res/raw/joined.mp3 b/android/app/src/main/res/raw/joined.mp3 index 34b0c27d82feefe0b0e3b29beec2f417354673b5..1a07c2c254891de82d16c23c84e817877e7cb966 100644 GIT binary patch literal 28194 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
RL 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 A@c;k- literal 25715 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 N#xno^mH)LJ_&+D+c~JlW diff --git a/src/components/Modals/Settings/Settings.tsx b/src/components/Modals/Settings/Settings.tsx index fe319c0..980f7c2 100644 --- a/src/components/Modals/Settings/Settings.tsx +++ b/src/components/Modals/Settings/Settings.tsx @@ -8,24 +8,27 @@ import {RALEWAY_BOLD, RALEWAY_MEDIUM} from '../../../constants/Fonts/Fonts'; import {optionProp} from '../../../models/Meeting/CreateMeeting/interface'; import {useState} from 'react'; import FullDivider from '../../Divider/FullDivider'; -import {updateTheme} from '../../../store/theme/actionCreator/updateTheme'; +import {writeAsync} from '../../../utils/Firestore/write'; interface props { + uid: string; modalVisible: boolean; onBackDropPress: () => void; + theme: 'light' | 'dark'; } const Settings = (props: props) => { const styles = useStyleSheet(themedStyles); + const [theme, setThemeState] = useState<'light' | 'dark'>(props.theme); - const storeDispatch = useDispatch(); - - const theme = useSelector( - (reduxState: RootState) => reduxState.ThemeReducer.theme, - ); - - const changeTheme = () => { - storeDispatch(updateTheme(theme === 'dark' ? 'light' : 'dark')); + const changeTheme = async () => { + try { + const changedTheme = theme === 'dark' ? 'light' : 'dark'; + setThemeState(changedTheme); + await writeAsync('users', props.uid, {theme: changedTheme}, true); + } catch (error) { + console.log('Error in updating theme', error); + } }; return ( diff --git a/src/hooks/Meeting/useStartMeeting.ts b/src/hooks/Meeting/useStartMeeting.ts index 7b2aa2e..95bed98 100644 --- a/src/hooks/Meeting/useStartMeeting.ts +++ b/src/hooks/Meeting/useStartMeeting.ts @@ -55,32 +55,20 @@ const useStartMeeting = ( ); const startCall = async () => { - try { - await engine.current?.joinChannel( - meetConfig.token, - meetConfig.channelName, - null, - meetConfig.agoraId, - ); - } catch (err) { - console.log('Error in start call', err); - toggleModal(false); - navigation.goBack(); - Toast.show({ - type: 'error', - text1: 'Oops!', - text2: 'Something went wrong. Please try again', - position: 'top', - visibilityTime: 200, - }); - } + await engine.current?.joinChannel( + meetConfig.token, + meetConfig.channelName, + null, + meetConfig.agoraId, + ); }; const endCall = async () => { try { - console.log('end Call'); await engine.current?.leaveChannel(); + await engine.current?.destroy(); + //remove the user from the list await onMemberLeftMeet(meetConfig, firebaseUser); @@ -93,8 +81,8 @@ const useStartMeeting = ( }; useEffect(() => { - try { - const intializeRTC = async () => { + const intializeRTC = async () => { + try { await checkPermission(); engine.current = await RtcEngine.create(appId); @@ -132,6 +120,7 @@ const useStartMeeting = ( } else { await onMemberJoinMeet(meetConfig, firebaseUser); } + sound.current?.play(); setJoinSucceed(true); @@ -158,24 +147,24 @@ const useStartMeeting = ( position: 'top', }); }); - }; + } catch (err) { + console.log('Error in initialize RTC', err); + toggleModal(false); + navigation.goBack(); + Toast.show({ + type: 'error', + text1: 'Oops!', + text2: 'Something went wrong. Please try again', + position: 'top', + visibilityTime: 300, + }); + } + }; - //================ Event Listeners Ends ==================================== + //================ Event Listeners Ends ==================================== - //Call the initialize RTC method - intializeRTC(); - } catch (err) { - console.log('Error in initialize RTC', err); - toggleModal(false); - navigation.goBack(); - Toast.show({ - type: 'error', - text1: 'Oops!', - text2: 'Something went wrong. Please try again', - position: 'top', - visibilityTime: 300, - }); - } + //Call the initialize RTC method + intializeRTC(); }, []); useEffect(() => { diff --git a/src/hooks/auth/useAuth.ts b/src/hooks/auth/useAuth.ts index 7530459..08683b3 100644 --- a/src/hooks/auth/useAuth.ts +++ b/src/hooks/auth/useAuth.ts @@ -11,11 +11,13 @@ import { } from '../../store/User/actionCreator/addFirebaseUser'; import {FAIL, SUCCESS} from '../../constants/RemoteStates/remotestates'; import {Platform, ToastAndroid} from 'react-native'; -import {UserInterface} from '../../models/User/User'; +import {defaultUser, UserInterface} from '../../models/User/User'; import {addNewUserObj} from '../../utils/User/Methods/addNewUserObj'; import {updateUserObjOnAuth} from '../../utils/User/Methods/updateUserObjOnAuth'; import useFirestore from '../Firestore/useFirestore'; import Toast from 'react-native-toast-message'; +import {updateTheme} from '../../store/theme/actionCreator/updateTheme'; +import {getRemoteTheme, getTheme} from '../../utils/User/Methods/getTheme'; const useAuth = () => { const [firebaseUserRef, setFirebaseUserRef] = useState< @@ -48,9 +50,9 @@ const useAuth = () => { await addNewUserObj( user.uid, Platform.OS, + getTheme(), + user.email ? user.email : 'example@gmail.com', user.displayName ? user.displayName : undefined, - user.phoneNumber ? user.phoneNumber : undefined, - user.email ? user.email : undefined, user.photoURL ? user.photoURL : undefined, false, ); @@ -67,7 +69,7 @@ const useAuth = () => { Platform.OS, user.displayName ? user.displayName : undefined, user.phoneNumber ? user.phoneNumber : undefined, - user.email ? user.email : undefined, + user.email ? user.email : 'example@gmail.com', user.photoURL ? user.photoURL : '', ); } @@ -80,6 +82,7 @@ const useAuth = () => { } else { //update the firebase user with success status 'FAIL' in redux storeDispatch(updateFirebaseUserStatus(FAIL)); + storeDispatch(updateTheme(defaultUser.theme)); // remove listener setFirebaseUserRef(undefined); @@ -101,6 +104,10 @@ const useAuth = () => { (fetchedUser: UserInterface) => { if (fetchedUser) { const action = setFirebaseUser(fetchedUser, SUCCESS); + const themeAction = updateTheme(fetchedUser.theme); + if (themeAction) { + storeDispatch(themeAction); + } storeDispatch(action); } }, diff --git a/src/models/User/User.ts b/src/models/User/User.ts index e20f886..c59dd5c 100644 --- a/src/models/User/User.ts +++ b/src/models/User/User.ts @@ -1,3 +1,5 @@ +import {getTheme} from '../../utils/User/Methods/getTheme'; + export interface UserInterface { uid: string; name?: string; @@ -8,12 +10,14 @@ export interface UserInterface { bio?: string; tagLine?: string; agoraId: number; + theme: 'dark' | 'light'; } export const defaultUser: UserInterface = { uid: '', agoraId: 0, email: `example@gmail.com`, + theme: getTheme(), }; export type userStatusType = 'PENDING' | 'FAIL' | 'SUCCESS' | 'FETCHING'; diff --git a/src/screens/Meeting/MeetScreen/MeetScreen.tsx b/src/screens/Meeting/MeetScreen/MeetScreen.tsx index bf5f1a4..f6241f9 100644 --- a/src/screens/Meeting/MeetScreen/MeetScreen.tsx +++ b/src/screens/Meeting/MeetScreen/MeetScreen.tsx @@ -43,7 +43,7 @@ const MeetScreen = (props: any) => { heading="Baithak" rightIcon="video-outline" onPressLeft={() => props.navigation.navigate(PROFILE_SCREEN)} - onPressRight={() => setSelectMeet(!selectMeet)} + onPressRight={() => props.navigation.navigate(CREATE_MEET_SCREEN)} /> diff --git a/src/screens/ProfileScreen/ProfileScreen.tsx b/src/screens/ProfileScreen/ProfileScreen.tsx index f7522cf..f4b796a 100644 --- a/src/screens/ProfileScreen/ProfileScreen.tsx +++ b/src/screens/ProfileScreen/ProfileScreen.tsx @@ -84,6 +84,8 @@ const ProfileScreen = (props: any) => { return ( toggleSetting(!settingOpen)} /> diff --git a/src/store/theme/reducer/ThemeReducer.ts b/src/store/theme/reducer/ThemeReducer.ts index d42271c..5346196 100644 --- a/src/store/theme/reducer/ThemeReducer.ts +++ b/src/store/theme/reducer/ThemeReducer.ts @@ -7,7 +7,7 @@ interface themes { } const initialThemeState: themes = { - theme: 'dark', + theme: Appearance.getColorScheme(), }; const ThemeReducer = ( diff --git a/src/utils/Permissions/Permission.ts b/src/utils/Permissions/Permission.ts index 9b3ffb3..9220e3a 100644 --- a/src/utils/Permissions/Permission.ts +++ b/src/utils/Permissions/Permission.ts @@ -31,8 +31,6 @@ export const checkPermission = async () => { ); if (!cameraPerm || !micPerm) { await requestCameraAndAudioPermission(); - } else { - console.log('granted'); } } }; diff --git a/src/utils/User/Methods/addNewUserObj.ts b/src/utils/User/Methods/addNewUserObj.ts index 189f8b7..2785b77 100644 --- a/src/utils/User/Methods/addNewUserObj.ts +++ b/src/utils/User/Methods/addNewUserObj.ts @@ -5,9 +5,9 @@ import {createNewUserObj} from './createNewUserObj'; export const addNewUserObj = async ( uid: string, os: 'android' | 'ios' | 'windows' | 'macos' | 'web', + theme: 'light' | 'dark', + email: string, name?: string, - phone?: string, - email?: string, photoURL?: string, mergeCondition?: boolean, ) => { @@ -16,9 +16,9 @@ export const addNewUserObj = async ( agora_ID, uid, os, - name, - phone, + theme, email, + name, photoURL, ); await writeUserObj(newUser, mergeCondition ? true : false); diff --git a/src/utils/User/Methods/createNewUserObj.ts b/src/utils/User/Methods/createNewUserObj.ts index 80cae60..535ee6f 100644 --- a/src/utils/User/Methods/createNewUserObj.ts +++ b/src/utils/User/Methods/createNewUserObj.ts @@ -4,18 +4,18 @@ export const createNewUserObj = ( agoraId: number, uid: string, os: 'android' | 'ios' | 'macos' | 'windows' | 'web', + theme: 'light' | 'dark', + email: string, name?: string, - phone?: string, - email?: string, photoURL?: string, ): UserInterface => { return { agoraId: agoraId, uid: uid, + theme: theme, + email: email, ...(os ? {os: os} : {}), ...(name ? {name: name} : {}), - ...(phone ? {phone: phone} : {}), - ...(email ? {email: email} : {}), ...(photoURL ? {photoURL: photoURL} : {}), }; }; diff --git a/src/utils/User/Methods/getRemoteUser.ts b/src/utils/User/Methods/getRemoteUser.ts new file mode 100644 index 0000000..55b549f --- /dev/null +++ b/src/utils/User/Methods/getRemoteUser.ts @@ -0,0 +1,22 @@ +import firestore from '@react-native-firebase/firestore'; +import {UserInterface} from '../../../models/User/User'; + +export const getRemoteUser = async (uid: string) => { + try { + let data: UserInterface | undefined; + firestore() + .collection('users') + .doc(uid) + .onSnapshot((snapshot) => { + if (snapshot.exists) { + data = snapshot.data() as UserInterface; + } + }); + + if (data) { + return data; + } + } catch (error) { + console.log('Error if fetching remote user', error); + } +}; diff --git a/src/utils/User/Methods/getTheme.ts b/src/utils/User/Methods/getTheme.ts new file mode 100644 index 0000000..e2aa808 --- /dev/null +++ b/src/utils/User/Methods/getTheme.ts @@ -0,0 +1,17 @@ +import {Appearance} from 'react-native'; +import {getRemoteUser} from './getRemoteUser'; + +export const getTheme = (): 'dark' | 'light' => { + const theme = Appearance.getColorScheme(); + + if (theme === 'dark') return 'dark'; + else if (theme === 'light') return 'light'; + else return 'dark'; +}; + +export const getRemoteTheme = async (uid: string) => { + const user = await getRemoteUser(uid); + if (user) { + return user.theme; + } +}; From 1a848ca7139b6364a3ae26bd7a0790dacb920590 Mon Sep 17 00:00:00 2001 From: Mayank Singh Date: Fri, 2 Jul 2021 20:55:06 +0530 Subject: [PATCH 4/5] meeting bug fix --- android/app/src/main/res/raw/joined.mp3 | Bin 28194 -> 59565 bytes .../Headers/BackHeader/BackHeader.tsx | 41 ++++++++++++++---- src/components/Messages/VideoChat.tsx | 8 ++-- src/components/Modals/MeetInfo/MeetInfo.tsx | 30 ++++++++++--- src/components/Modals/Settings/Settings.tsx | 24 +++++----- .../Modals/VideoMessage/VideoMessage.tsx | 15 ++++++- src/hooks/Meeting/useStartMeeting.ts | 38 ++++++++++++---- src/hooks/Messages/Meeting/useGetMeetMssg.ts | 11 +++-- src/hooks/auth/useAuth.ts | 9 ++-- .../Meeting/VideoStream/VideoStream.tsx | 10 ++++- src/screens/ProfileScreen/ProfileScreen.tsx | 1 - src/store/theme/actionCreator/updateTheme.ts | 23 ++++++++-- src/store/theme/actions/action.ts | 1 + src/store/theme/reducer/ThemeReducer.ts | 25 ++++++++--- src/utils/Meeting/Methods/getShareMessage.ts | 4 +- src/utils/Screen/screen.ts | 6 +-- src/utils/User/Methods/getRemoteUser.ts | 20 +++++++++ 17 files changed, 201 insertions(+), 65 deletions(-) diff --git a/android/app/src/main/res/raw/joined.mp3 b/android/app/src/main/res/raw/joined.mp3 index 1a07c2c254891de82d16c23c84e817877e7cb966..217bed1ce92f0e7380a57bae99f2eb5f9e74ec0e 100644 GIT binary patch literal 59565 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 Y1%C7U&$Rx3L*2jm{ckYh|6CFO3z_0#%m4rY literal 28194 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
RL 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
x!#NlN-dj>FGokIO7itB&Zlo1Xm_0rVY zDy-2iHJAV$c;gr{Y~ZZn02PSOR;M(c}r_1+(rYRbgI8xYaBnx{MeKA zTHc#gZVOFJAiYLX`;(ExOO_15YK6xbXmWt4KxnqZl%c*H0h7fFyJ5NEC!vgN&kwjC zO1w(&)QmeH+p_xQa-Qgl<%8@f%j<#$W!JEKYkKJNk};p)Em`G+Gr3FcidMLy(Ewjf zfqw|?LqeqX^p`xb>pB2ZpAOT7Tw{J$I=ete{1#O^_s9i)HA-~CqWlsT8pa~T`x)h9Bcl@o3f4PT+ki?_*F{BZ2N)P1X4V*$*1KP z9QwJbRO=wNf9}wGKIsUk#6``?I8jqs1CyzjJ|CWacery`*5(=*w*gK6YiAUd@qlpD zdP48Y)wcxEt`ElWoEoA%8KeyN>O}MIO(4VYozl?8&QfSCs}AsBErana5x@!z!qCTn zWrh&IpqqoR3eu#A))>YYc#ez})g@4#zsFoh#xPPr9_{9l`b zD;?J0Xa&DQ19(%tr(aS5VN8*GTP*<65>|aL7ghuWY?m;qgw>>HGlJn*e!49d z(L+L_A@*|eQC{NNVrXBPfa8Y7!Ipfs?=&-(iJr>CX({>&HBj+_ORrR;%OZz!l6$gO zJ<>%T!;H&<9+L$p2dbjQElcXPGQai^YW3p)1w^0SWw<`x_TVmM`s z-?(yBWnd6{)B=aJ4sTyM^3Ci}Rjl?*Q%SxL8oJvHGl&(ZFjcBCe_`0zr=a?NSoI;dcVx3xhb zYdi}C{1Wd+yetop$xye<@0VNu7w+eOQlawa_eFZT=D45RT-NS?g^iK-Gh?hYBY)F6(SwH0d z%?SX=RT|3uysN|jP&IGG0f2r2oyV^LNyY_|E^zb#5#0XuhwCV)T>9H&dG(Yo9q09q zDuB>be#vKBQl`>7%A3yJMoYO_`Dfaw<#PX~h^K~H4Fngd+Vi@aqpL3!tEMZ@i@K$m z@rXv-ClOQq?T2+`4G21=I=qQ|YT_ccIDjP4*`zV|7cK6cDio7Wk4c?vy*ckGUBpo+ z*hBfqN52&ZC0XCxrm4Fi95@x-lltE|}aj`?~1be|8IW(2c82a A@c;k- diff --git a/src/components/Headers/BackHeader/BackHeader.tsx b/src/components/Headers/BackHeader/BackHeader.tsx index 6daf854..51ee2d3 100644 --- a/src/components/Headers/BackHeader/BackHeader.tsx +++ b/src/components/Headers/BackHeader/BackHeader.tsx @@ -11,6 +11,12 @@ interface props { rightIcon?: string; onRightPress?: () => void; centerText?: string; + centerTextColor?: string; + leftIconColor?: string; + rightIconColor?: string; + rightLeftIcon?: string; + rightLeftIconColor?: string; + onPressRightLeftIcon?: () => void; } const BackHeader = (props: props) => { @@ -27,26 +33,43 @@ const BackHeader = (props: props) => { )} {props.centerText && ( - + {props.centerText} )} {props.rightIcon && ( - - - + + {props.rightLeftIcon && ( + + + + )} + + + + )} ); diff --git a/src/components/Messages/VideoChat.tsx b/src/components/Messages/VideoChat.tsx index cdc05b1..943d7a5 100644 --- a/src/components/Messages/VideoChat.tsx +++ b/src/components/Messages/VideoChat.tsx @@ -150,7 +150,7 @@ const VideoChat = (props: props) => { props1, appTheme === 'dark' ? theme['color-basic-900'] - : theme['color-basic-600'], + : theme['color-basic-300'], ) } renderSend={(props2) => @@ -168,10 +168,10 @@ const VideoChat = (props: props) => { renderBubble={(props4) => renderBubble( props4, - appTheme === 'dark' - ? theme['color-basic-700'] - : theme['color-basic-400'], theme['color-primary-default'], + appTheme === 'dark' + ? theme['color-basic-200'] + : theme['color-basic-600'], ) } renderActions={(props5) => renderAction(props5)} diff --git a/src/components/Modals/MeetInfo/MeetInfo.tsx b/src/components/Modals/MeetInfo/MeetInfo.tsx index 8250572..1d3f7b4 100644 --- a/src/components/Modals/MeetInfo/MeetInfo.tsx +++ b/src/components/Modals/MeetInfo/MeetInfo.tsx @@ -16,6 +16,8 @@ import { } from '../../../constants/Fonts/Fonts'; import FullDivider from '../../Divider/FullDivider'; import {VideoStreamParams} from '../../../models/Meeting/CreateMeeting/interface'; +import Clipboard from '@react-native-clipboard/clipboard'; +import Toast from 'react-native-toast-message'; interface props { modalVisible: boolean; @@ -31,9 +33,27 @@ const MeetInfo = (props: props) => { (reduxState: RootState) => reduxState.ThemeReducer.theme, ); - const renderIcon = (props: any) => ( - console.log('Copied')}> - + const onPressCopy = (text: string) => { + Clipboard.setString(text); + Toast.show({ + type: 'success', + text1: 'Copied!', + position: 'top', + visibilityTime: 300, + }); + }; + + const renderIdIcon = (iconProps: any) => ( + onPressCopy(props.meetConfig.meetId)}> + + + ); + + const renderPassIcon = (iconProps: any) => ( + onPressCopy(props.meetConfig.password)}> + ); @@ -78,7 +98,7 @@ const MeetInfo = (props: props) => { { void; - theme: 'light' | 'dark'; } const Settings = (props: props) => { const styles = useStyleSheet(themedStyles); - const [theme, setThemeState] = useState<'light' | 'dark'>(props.theme); + const theme = useSelector( + (reduxState: RootState) => reduxState.ThemeReducer.theme, + ); + const storeDispatch = useDispatch(); - const changeTheme = async () => { - try { - const changedTheme = theme === 'dark' ? 'light' : 'dark'; - setThemeState(changedTheme); - await writeAsync('users', props.uid, {theme: changedTheme}, true); - } catch (error) { - console.log('Error in updating theme', error); - } + const changeTheme = () => { + const themeAction = updateThemeRemotely( + theme === 'dark' ? 'light' : 'dark', + props.uid, + ); + storeDispatch(themeAction); }; return ( diff --git a/src/components/Modals/VideoMessage/VideoMessage.tsx b/src/components/Modals/VideoMessage/VideoMessage.tsx index 24c0e87..9a697a5 100644 --- a/src/components/Modals/VideoMessage/VideoMessage.tsx +++ b/src/components/Modals/VideoMessage/VideoMessage.tsx @@ -6,6 +6,8 @@ import {Baithak} from '../../../models/Meeting/CreateMeeting/interface'; import BackHeader from '../../Headers/BackHeader/BackHeader'; import useGetMeetMssg from '../../../hooks/Messages/Meeting/useGetMeetMssg'; import VideoChat from '../../Messages/VideoChat'; +import {useSelector} from 'react-redux'; +import {RootState} from '../../../store/rootReducer'; interface props { baithak: Baithak | undefined; @@ -15,8 +17,17 @@ interface props { const VideoMessage = (props: props) => { if (!props.baithak) return null; + + const theme = useSelector( + (reduxState: RootState) => reduxState.ThemeReducer.theme, + ); + + const firebaseUser = useSelector( + (reduxState: RootState) => reduxState.UserReducer.firebaseUser, + ); + const {messages, handleSend, isMoreLoading, loadMore, lastDoc} = - useGetMeetMssg(props.baithak); + useGetMeetMssg(props.baithak, firebaseUser); const styles = useStyleSheet(themedStyles); return ( @@ -36,6 +47,8 @@ const VideoMessage = (props: props) => { leftIcon="arrow-back-outline" onLeftPress={props.onBackDropPress} centerText="Messages" + leftIconColor={theme === 'dark' ? 'white' : 'black'} + centerTextColor={theme === 'dark' ? 'white' : 'black'} /> (false); const [speakerOff, toogleSpeaker] = useState(false); const [inVideoOff, toogleInVideoOff] = useState(false); + const [flashOn, toggleFlash] = useState(false); let engine = useRef(null); let sound = useRef( @@ -110,6 +112,19 @@ const useStartMeeting = ( } }); + // Listen for the UserOffline callback. + // This callback occurs when the remote user gets cutt off the channel. + engine.current?.addListener('UserOffline', (uid, elapsed) => { + const user = getRemoteUserByAgoraId(uid); + if (user && user.name) { + Toast.show({ + type: 'info', + text1: `${user.name} left the Baithak`, + position: 'top', + }); + } + }); + // Listen for the JoinChannelSuccess callback. // This callback occurs when the local user successfully joins the channel. engine.current?.addListener( @@ -120,9 +135,6 @@ const useStartMeeting = ( } else { await onMemberJoinMeet(meetConfig, firebaseUser); } - - sound.current?.play(); - setJoinSucceed(true); toggleModal(false); }, @@ -148,6 +160,7 @@ const useStartMeeting = ( }); }); } catch (err) { + engine.current?.destroy(); console.log('Error in initialize RTC', err); toggleModal(false); navigation.goBack(); @@ -195,7 +208,8 @@ const useStartMeeting = ( //Make the camera to flash on const onCamerFlashOn = () => { if (engine.current) { - engine.current?.setCameraTorchOn(true); + engine.current?.setCameraTorchOn(!flashOn); + toggleFlash(!flashOn); } }; @@ -212,7 +226,7 @@ const useStartMeeting = ( toogleSpeaker(!speakerOff); Toast.show({ type: 'info', - text1: `Incoming Audios are ${speakerOff ? 'On' : 'Off'}!`, + text1: `Incoming Audios are ${speakerOff ? 'Off' : 'On'}!`, position: 'top', }); if (menuOpen) setMenuOpen(!menuOpen); @@ -226,7 +240,7 @@ const useStartMeeting = ( toogleInVideoOff(!inVideoOff); Toast.show({ type: 'info', - text1: `Incoming Videos are ${inVideoOff ? 'On' : 'Off'}!`, + text1: `Incoming Videos are ${inVideoOff ? 'Off' : 'On'}!`, position: 'top', }); if (menuOpen) setMenuOpen(!menuOpen); @@ -292,9 +306,13 @@ const useStartMeeting = ( }; const onShare = async () => { - if (menuOpen) setMenuOpen(!menuOpen); - if (meetInfo) toogleMeetInfo(!meetInfo); - const result = Share.share({message: getShareMessage(baithak)}); + try { + if (menuOpen) setMenuOpen(!menuOpen); + if (meetInfo) toogleMeetInfo(!meetInfo); + await Share.share({message: getShareMessage(baithak)}); + } catch (error) { + console.log('Error in sharing', error); + } }; return { @@ -324,6 +342,8 @@ const useStartMeeting = ( onPressSpeaker, inVideoOff, onPressInVideo, + flashOn, + onCamerFlashOn, }; }; diff --git a/src/hooks/Messages/Meeting/useGetMeetMssg.ts b/src/hooks/Messages/Meeting/useGetMeetMssg.ts index 219cce4..eaf0564 100644 --- a/src/hooks/Messages/Meeting/useGetMeetMssg.ts +++ b/src/hooks/Messages/Meeting/useGetMeetMssg.ts @@ -10,8 +10,9 @@ import {debounce} from 'lodash'; import {getTime} from '../../../utils/Miscellaneous/utils'; import Toast from 'react-native-toast-message'; import Sound from 'react-native-sound'; +import {UserInterface} from '../../../models/User/User'; -const useGetMeetMssg = (Baithak: Baithak) => { +const useGetMeetMssg = (Baithak: Baithak, firebaseUser: UserInterface) => { const [messages, setMessages] = useState([]); const [lastDoc, setLastDoc] = useState(); const [isMoreLoading, setIsMoreLoading] = useState(false); @@ -97,8 +98,9 @@ const useGetMeetMssg = (Baithak: Baithak) => { useEffect(() => { if (lastMessage) { - const user = getBaithakPartiFromUid(lastMessage.uid, Baithak); - if (lastMessage.uid !== user._id) { + const lastMessgageUser = getBaithakPartiFromUid(lastMessage.uid, Baithak); + + if (lastMessage.uid !== firebaseUser.uid) { sound.current = new Sound('message.mp3', Sound.MAIN_BUNDLE, (error) => { if (error) { console.log('Error in playing message sound', error); @@ -110,9 +112,10 @@ const useGetMeetMssg = (Baithak: Baithak) => { Toast.show({ type: 'success', - text1: user.name, + text1: lastMessgageUser.name ? lastMessgageUser.name : 'Someone', text2: lastMessage.text, position: 'bottom', + bottomOffset: 100, }); } } diff --git a/src/hooks/auth/useAuth.ts b/src/hooks/auth/useAuth.ts index 08683b3..7620ff1 100644 --- a/src/hooks/auth/useAuth.ts +++ b/src/hooks/auth/useAuth.ts @@ -18,6 +18,7 @@ import useFirestore from '../Firestore/useFirestore'; import Toast from 'react-native-toast-message'; import {updateTheme} from '../../store/theme/actionCreator/updateTheme'; import {getRemoteTheme, getTheme} from '../../utils/User/Methods/getTheme'; +import {DEFAULT_AVATAR} from '../../constants/Images/Images'; const useAuth = () => { const [firebaseUserRef, setFirebaseUserRef] = useState< @@ -52,8 +53,8 @@ const useAuth = () => { Platform.OS, getTheme(), user.email ? user.email : 'example@gmail.com', - user.displayName ? user.displayName : undefined, - user.photoURL ? user.photoURL : undefined, + user.displayName ? user.displayName : 'Robot', + user.photoURL ? user.photoURL : DEFAULT_AVATAR, false, ); Toast.show({ @@ -67,8 +68,8 @@ const useAuth = () => { await updateUserObjOnAuth( user.uid, Platform.OS, - user.displayName ? user.displayName : undefined, - user.phoneNumber ? user.phoneNumber : undefined, + user.displayName ? user.displayName : 'Robot', + user.phoneNumber ? user.phoneNumber : DEFAULT_AVATAR, user.email ? user.email : 'example@gmail.com', user.photoURL ? user.photoURL : '', ); diff --git a/src/screens/Meeting/VideoStream/VideoStream.tsx b/src/screens/Meeting/VideoStream/VideoStream.tsx index c37074e..fb68fff 100644 --- a/src/screens/Meeting/VideoStream/VideoStream.tsx +++ b/src/screens/Meeting/VideoStream/VideoStream.tsx @@ -52,6 +52,8 @@ const VideoStream = (props: any) => { onPressSpeaker, inVideoOff, onPressInVideo, + flashOn, + onCamerFlashOn, } = useStartMeeting( { appId: APP_ID, @@ -102,7 +104,13 @@ const VideoStream = (props: any) => { onLeftPress={confirmEnd} rightIcon="sync-outline" onRightPress={onSwitchCamera} - centerText={getRefinedTest(meetConfig.channelName, 22)} + centerText={getRefinedTest(meetConfig.channelName, 18)} + leftIconColor="white" + centerTextColor="white" + rightIconColor="white" + rightLeftIcon={flashOn ? 'flash-outline' : 'flash-off-outline'} + rightLeftIconColor="white" + onPressRightLeftIcon={onCamerFlashOn} /> diff --git a/src/screens/ProfileScreen/ProfileScreen.tsx b/src/screens/ProfileScreen/ProfileScreen.tsx index f4b796a..ebe8712 100644 --- a/src/screens/ProfileScreen/ProfileScreen.tsx +++ b/src/screens/ProfileScreen/ProfileScreen.tsx @@ -85,7 +85,6 @@ const ProfileScreen = (props: any) => { toggleSetting(!settingOpen)} /> diff --git a/src/store/theme/actionCreator/updateTheme.ts b/src/store/theme/actionCreator/updateTheme.ts index 7f26a37..8d73263 100644 --- a/src/store/theme/actionCreator/updateTheme.ts +++ b/src/store/theme/actionCreator/updateTheme.ts @@ -1,14 +1,31 @@ import {ColorSchemeName} from 'react-native'; -import {UPDATE_THEME} from '../actions/action'; +import {UPDATE_THEME, UPDATE_THEME_REMOTELY} from '../actions/action'; export interface updateThemeAction { type: typeof UPDATE_THEME; - theme: ColorSchemeName; + theme: 'light' | 'dark'; } -export const updateTheme = (theme: ColorSchemeName): updateThemeAction => { +export interface updateThemeRemoteAction { + type: typeof UPDATE_THEME_REMOTELY; + theme: 'light' | 'dark'; + uid: string; +} + +export const updateTheme = (theme: 'light' | 'dark'): updateThemeAction => { return { type: UPDATE_THEME, theme: theme, }; }; + +export const updateThemeRemotely = ( + theme: 'light' | 'dark', + uid: string, +): updateThemeRemoteAction => { + return { + type: UPDATE_THEME_REMOTELY, + theme: theme, + uid: uid, + }; +}; diff --git a/src/store/theme/actions/action.ts b/src/store/theme/actions/action.ts index 46416ab..2167860 100644 --- a/src/store/theme/actions/action.ts +++ b/src/store/theme/actions/action.ts @@ -1 +1,2 @@ export const UPDATE_THEME = 'UPDATE_THEME'; +export const UPDATE_THEME_REMOTELY = 'UPDATE_THEME_REMOTELY'; diff --git a/src/store/theme/reducer/ThemeReducer.ts b/src/store/theme/reducer/ThemeReducer.ts index 5346196..4d20c57 100644 --- a/src/store/theme/reducer/ThemeReducer.ts +++ b/src/store/theme/reducer/ThemeReducer.ts @@ -1,25 +1,38 @@ -import {updateThemeAction} from '../actionCreator/updateTheme'; +import { + updateThemeAction, + updateThemeRemoteAction, +} from '../actionCreator/updateTheme'; import {Appearance, ColorSchemeName} from 'react-native'; -import {UPDATE_THEME} from '../actions/action'; +import {UPDATE_THEME, UPDATE_THEME_REMOTELY} from '../actions/action'; +import {writeAsync} from '../../../utils/Firestore/write'; +import {getTheme} from '../../../utils/User/Methods/getTheme'; interface themes { - theme: ColorSchemeName; + theme: 'light' | 'dark'; } const initialThemeState: themes = { - theme: Appearance.getColorScheme(), + theme: getTheme(), }; const ThemeReducer = ( state: themes = initialThemeState, - action: updateThemeAction, -) => { + action: updateThemeAction | updateThemeRemoteAction, +): themes => { switch (action.type) { case UPDATE_THEME: return { ...state, theme: action.theme, }; + case UPDATE_THEME_REMOTELY: + writeAsync('users', action.uid, {theme: action.theme}, true).catch( + (err) => console.log('error in updating theme remotely', err), + ); + return { + ...state, + theme: action.theme, + }; default: return state; } diff --git a/src/utils/Meeting/Methods/getShareMessage.ts b/src/utils/Meeting/Methods/getShareMessage.ts index a100e93..4132f48 100644 --- a/src/utils/Meeting/Methods/getShareMessage.ts +++ b/src/utils/Meeting/Methods/getShareMessage.ts @@ -1,11 +1,11 @@ import moment from 'moment'; import {Baithak} from '../../../models/Meeting/CreateMeeting/interface'; -import {getUser} from '../../Messages/Meeting/utils'; +import {getBaithakPartiFromUid} from '../../Messages/Meeting/utils'; export const getShareMessage = (baithak: Baithak | undefined) => { if (baithak) { return `${ - getUser(baithak.host.uid, baithak).name + getBaithakPartiFromUid(baithak.host.uid, baithak).name } would like you to join baithak? Here's a info Topic: ${baithak.channelName} diff --git a/src/utils/Screen/screen.ts b/src/utils/Screen/screen.ts index a559b7a..041cae3 100644 --- a/src/utils/Screen/screen.ts +++ b/src/utils/Screen/screen.ts @@ -6,17 +6,17 @@ export const getRemoteStreamDimensions = (length: number) => { case 1: return { height: screenHeight, - width: screenWidth - 5, + width: screenWidth, }; case 2: return { height: screenHeight / 2, - width: screenWidth - 5, + width: screenWidth, }; default: return { height: screenHeight / 2, - width: (screenWidth - 5) / 2, + width: screenWidth / 2, }; } }; diff --git a/src/utils/User/Methods/getRemoteUser.ts b/src/utils/User/Methods/getRemoteUser.ts index 55b549f..9972357 100644 --- a/src/utils/User/Methods/getRemoteUser.ts +++ b/src/utils/User/Methods/getRemoteUser.ts @@ -20,3 +20,23 @@ export const getRemoteUser = async (uid: string) => { console.log('Error if fetching remote user', error); } }; + +export const getRemoteUserByAgoraId = (uid: number) => { + try { + let data: UserInterface | undefined; + firestore() + .collection('users') + .where('agoraId', '==', uid) + .onSnapshot((snapshot) => { + if (snapshot.docs.length !== 0) { + data = + snapshot.docs[0].exists && + (snapshot.docs[0].data() as UserInterface); + } + }); + + return data; + } catch (error) { + console.log('Error if fetching remote user by agora Id', error); + } +}; From a6c69b768a34189a711db6b9fb16f8ad5b13c976 Mon Sep 17 00:00:00 2001 From: Mayank Singh Date: Sat, 3 Jul 2021 01:32:46 +0530 Subject: [PATCH 5/5] user search added --- .../Card/UserSearchCard/UserSerchCard.tsx | 60 ++++++ .../Headers/GeneralHeader/GeneralHeader.tsx | 4 +- src/components/Icons/Icons.tsx | 4 + src/components/SearchBar/ShowSearchBar.tsx | 2 +- src/components/SearchBar/UserSearchBar.tsx | 42 ++++ src/constants/Navigation/Navigation.ts | 3 + src/hooks/User/useGetUserForProfile.ts | 96 +++++++++ src/hooks/User/useGetUsers.ts | 45 ++++ src/hooks/auth/useAuth.ts | 4 +- .../MainStackNavigator/MainStackNavigator.tsx | 13 ++ .../MainTabNavigator/MainTabNavigator.tsx | 34 +-- src/screens/Meeting/MeetScreen/MeetScreen.tsx | 2 + .../ProfileScreen/EditProfileScreen.tsx | 20 ++ src/screens/ProfileScreen/ProfileScreen.tsx | 108 +++------- .../ProfileScreen/RemoteProfileScreen.tsx | 202 ++++++++++++++++++ .../Search/UserSearch/UserSearchScreen.tsx | 97 +++++++++ src/utils/Firestore/read.ts | 7 + src/utils/User/Methods/getRemoteUser.ts | 14 +- 18 files changed, 654 insertions(+), 103 deletions(-) create mode 100644 src/components/Card/UserSearchCard/UserSerchCard.tsx create mode 100644 src/components/SearchBar/UserSearchBar.tsx create mode 100644 src/hooks/User/useGetUserForProfile.ts create mode 100644 src/hooks/User/useGetUsers.ts create mode 100644 src/screens/ProfileScreen/EditProfileScreen.tsx create mode 100644 src/screens/ProfileScreen/RemoteProfileScreen.tsx create mode 100644 src/screens/Search/UserSearch/UserSearchScreen.tsx diff --git a/src/components/Card/UserSearchCard/UserSerchCard.tsx b/src/components/Card/UserSearchCard/UserSerchCard.tsx new file mode 100644 index 0000000..0fefebe --- /dev/null +++ b/src/components/Card/UserSearchCard/UserSerchCard.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import {StyleSheet, View, TouchableOpacity} from 'react-native'; +import {UserInterface} from '../../../models/User/User'; +import {Text} from '@ui-kitten/components'; +import FastImage from 'react-native-fast-image'; +import {DEFAULT_AVATAR} from '../../../constants/Images/Images'; +import {RALEWAY_BOLD, RALEWAY_REGULAR} from '../../../constants/Fonts/Fonts'; + +interface props { + user: UserInterface; + onPress: () => void; +} + +const UserSerchCard = ({user, onPress}: props) => { + return ( + + + + + + {user.name ? user.name : 'Robot'} + + {user.tagLine ? user.tagLine : 'Baithak user'} + + + + ); +}; + +const styles = StyleSheet.create({ + main: { + flex: 1, + flexDirection: 'row', + }, + imgView: { + justifyContent: 'center', + alignItems: 'center', + flex: 1, + }, + content: { + flex: 4, + justifyContent: 'center', + paddingHorizontal: 10, + // borderBottomWidth: 0.3, + // borderColor: 'grey', + // paddingBottom: 15, + }, + name: { + fontFamily: RALEWAY_BOLD, + }, + tagLine: { + fontFamily: RALEWAY_REGULAR, + color: 'grey', + }, +}); + +export default UserSerchCard; diff --git a/src/components/Headers/GeneralHeader/GeneralHeader.tsx b/src/components/Headers/GeneralHeader/GeneralHeader.tsx index 5c94a61..f2922f8 100644 --- a/src/components/Headers/GeneralHeader/GeneralHeader.tsx +++ b/src/components/Headers/GeneralHeader/GeneralHeader.tsx @@ -20,6 +20,7 @@ interface props { onPressLeft: () => void; onPressRight?: () => void; rightIcon?: string; + onPressSearch: () => void; } const GeneralHeader: FC = ({ firebaseUser, @@ -27,6 +28,7 @@ const GeneralHeader: FC = ({ rightIcon, onPressLeft, onPressRight, + onPressSearch, }) => { const theme = useTheme(); const appTheme = useSelector( @@ -76,7 +78,7 @@ const GeneralHeader: FC = ({ )} - console.log('Search')} /> + ); diff --git a/src/components/Icons/Icons.tsx b/src/components/Icons/Icons.tsx index 690535a..c7c6640 100644 --- a/src/components/Icons/Icons.tsx +++ b/src/components/Icons/Icons.tsx @@ -17,6 +17,10 @@ export const PhoneIcon = (style: any) => ( ); +export const SearchIcon = (style: any) => ( + +); + export const PlusIcon = (style: any) => ; export const PasswordIcon = (style: any) => ( diff --git a/src/components/SearchBar/ShowSearchBar.tsx b/src/components/SearchBar/ShowSearchBar.tsx index ba76205..d32213c 100644 --- a/src/components/SearchBar/ShowSearchBar.tsx +++ b/src/components/SearchBar/ShowSearchBar.tsx @@ -36,7 +36,7 @@ const ShowSearchBar = (props: props) => { const themedStyles = StyleSheet.create({ main: { - borderRadius: 30, + borderRadius: 10, padding: 8, paddingLeft: 10, flexDirection: 'row', diff --git a/src/components/SearchBar/UserSearchBar.tsx b/src/components/SearchBar/UserSearchBar.tsx new file mode 100644 index 0000000..70c75cf --- /dev/null +++ b/src/components/SearchBar/UserSearchBar.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import {StyleSheet, Text, View} from 'react-native'; +import {Input} from '@ui-kitten/components'; +import {RALEWAY_MEDIUM} from '../../constants/Fonts/Fonts'; +import {SearchIcon} from '../Icons/Icons'; + +interface props { + query: string; + handleQuery: (text: string) => void; + placeholder: string; + style: any; + autoFocus: boolean; +} + +const UserSearchBar = ({ + query, + handleQuery, + placeholder, + style, + autoFocus, +}: props) => { + return ( + handleQuery(text)} + size="large" + autoFocus={autoFocus} + /> + ); +}; + +const styles = StyleSheet.create({ + input: {}, +}); + +export default UserSearchBar; diff --git a/src/constants/Navigation/Navigation.ts b/src/constants/Navigation/Navigation.ts index 038399e..7c2f1f4 100644 --- a/src/constants/Navigation/Navigation.ts +++ b/src/constants/Navigation/Navigation.ts @@ -13,3 +13,6 @@ export const PROFILE_SCREEN = 'PROFILE_SCREEN'; export const CREATE_MEET_SCREEN = 'CREATE_MEET_SCREEN'; export const JOIN_MEET_SCREEN = 'JOIN_MEET_SCREEN'; export const VIDEO_STREAM = 'VIDEO_STREAM'; +export const EDIT_PROFILE_SCREEN = 'EDIT_PROFILE_SCREEN'; +export const USER_SEARCH_SCREEN = 'USER_SEARCH_SCREEN'; +export const REMOTE_USER_SEARCH_SCREEN = 'REMOTE_USER_SEARCH_SCREEN'; diff --git a/src/hooks/User/useGetUserForProfile.ts b/src/hooks/User/useGetUserForProfile.ts new file mode 100644 index 0000000..23e3de6 --- /dev/null +++ b/src/hooks/User/useGetUserForProfile.ts @@ -0,0 +1,96 @@ +import {useEffect, useState} from 'react'; +import Toast from 'react-native-toast-message'; +import {FAIL} from '../../constants/RemoteStates/remotestates'; +import {defaultUser, UserInterface} from '../../models/User/User'; +import {updateFirebaseUserStatus} from '../../store/User/actionCreator/addFirebaseUser'; +import {getRemoteUser} from '../../utils/User/Methods/getRemoteUser'; +import auth from '@react-native-firebase/auth'; +import {useDispatch} from 'react-redux'; +import {generalErrorN} from '../../components/Alerts/GeneralError'; +import {readAsync} from '../../utils/Firestore/read'; + +const useGetUserForProfile = (uid: string) => { + const [loading, setLoading] = useState(true); + const [user, setUser] = useState(defaultUser); + const [settingOpen, toggleSetting] = useState(false); + + useEffect(() => { + const fetchUser = async () => { + try { + setLoading(true); + const localUser = await readAsync('users', uid); + localUser && setUser(localUser as UserInterface); + setLoading(false); + } catch (error) { + console.log('Eror in profile fecthing', error); + setLoading(false); + Toast.show({ + type: 'error', + position: 'top', + text1: 'Something went wrong 😔', + text2: 'Please try again!!', + }); + } + }; + + fetchUser(); + }, [uid]); + + const storeDispatch = useDispatch(); + + const signOut = async () => { + try { + await auth().signOut(); + Toast.show({ + type: 'success', + position: 'top', + text1: 'Great Success✌', + text2: 'You have successfully logout ', + }); + storeDispatch(updateFirebaseUserStatus(FAIL)); + } catch (err) { + Toast.show({ + type: 'error', + position: 'top', + text1: 'Something went wrong 😔', + text2: 'Please try again!!', + }); + storeDispatch(updateFirebaseUserStatus(FAIL)); + console.log('Error in log out', err); + } + }; + + const onSignOut = async () => { + generalErrorN( + { + title: 'Log Out', + textMessage: 'Are you sure you want to logout', + okText: 'Yes', + }, + [ + { + text: 'No', + onPress: () => {}, + }, + { + text: 'Yes', + onPress: signOut, + }, + ], + ); + }; + + const onClickSettings = () => { + toggleSetting(!settingOpen); + }; + + return { + loading, + user, + onSignOut, + settingOpen, + onClickSettings, + }; +}; + +export default useGetUserForProfile; diff --git a/src/hooks/User/useGetUsers.ts b/src/hooks/User/useGetUsers.ts new file mode 100644 index 0000000..a9dfc4e --- /dev/null +++ b/src/hooks/User/useGetUsers.ts @@ -0,0 +1,45 @@ +import {useEffect, useState} from 'react'; +import {UserInterface} from '../../models/User/User'; +import firestore from '@react-native-firebase/firestore'; + +const useGetUsers = () => { + const [users, setUsers] = useState(); + const [filteredUsers, setFilteredUsers] = useState(); + const [loading, setLoading] = useState(true); + const [query, setQuery] = useState(''); + + useEffect(() => { + const subscriber = firestore() + .collection('users') + .onSnapshot((querySnapshot) => { + const localUsers: UserInterface[] = []; + for (const doc of querySnapshot.docs) { + doc.exists && localUsers.push(doc.data() as UserInterface); + } + setUsers(localUsers); + setFilteredUsers(localUsers); + setLoading(false); + }); + + return () => subscriber(); + }, []); + + const handleQuery = (text: string) => { + const filterUsers = users?.filter((user) => { + return user.name + ? user.name.toLocaleLowerCase().indexOf(text.toLocaleLowerCase()) !== -1 + : false; + }); + setFilteredUsers(filterUsers); + setQuery(text); + }; + + return { + filteredUsers, + loading, + query, + handleQuery, + }; +}; + +export default useGetUsers; diff --git a/src/hooks/auth/useAuth.ts b/src/hooks/auth/useAuth.ts index 7620ff1..35ac260 100644 --- a/src/hooks/auth/useAuth.ts +++ b/src/hooks/auth/useAuth.ts @@ -69,9 +69,9 @@ const useAuth = () => { user.uid, Platform.OS, user.displayName ? user.displayName : 'Robot', - user.phoneNumber ? user.phoneNumber : DEFAULT_AVATAR, + user.phoneNumber ? user.phoneNumber : undefined, user.email ? user.email : 'example@gmail.com', - user.photoURL ? user.photoURL : '', + user.photoURL ? user.photoURL : DEFAULT_AVATAR, ); } diff --git a/src/navigation/MainStackNavigator/MainStackNavigator.tsx b/src/navigation/MainStackNavigator/MainStackNavigator.tsx index a04048c..f1d8a67 100644 --- a/src/navigation/MainStackNavigator/MainStackNavigator.tsx +++ b/src/navigation/MainStackNavigator/MainStackNavigator.tsx @@ -3,13 +3,20 @@ import {createStackNavigator} from '@react-navigation/stack'; import MainTabNavigator from '../MainTabNavigator/MainTabNavigator'; import { CREATE_MEET_SCREEN, + EDIT_PROFILE_SCREEN, JOIN_MEET_SCREEN, MAIN_TAB, + REMOTE_USER_SEARCH_SCREEN, + USER_SEARCH_SCREEN, VIDEO_STREAM, } from '../../constants/Navigation/Navigation'; import CreateMeetScreen from '../../screens/Meeting/CreateMeetScreen/CreateMeetScreen'; import JoinMeetScreen from '../../screens/Meeting/JoinMeetScreen/JoinMeetScreen'; import VideoStream from '../../screens/Meeting/VideoStream/VideoStream'; +import EditProfileScreen from '../../screens/ProfileScreen/EditProfileScreen'; +import UserSearchScreen from '../../screens/Search/UserSearch/UserSearchScreen'; +import ProfileScreen from '../../screens/ProfileScreen/ProfileScreen'; +import RemoteProfileScreen from '../../screens/ProfileScreen/RemoteProfileScreen'; const Stack = createStackNavigator(); @@ -20,6 +27,12 @@ const MainStackNavigator = () => { + + + ); }; diff --git a/src/navigation/MainTabNavigator/MainTabNavigator.tsx b/src/navigation/MainTabNavigator/MainTabNavigator.tsx index 6ac21dc..4c0f5b0 100644 --- a/src/navigation/MainTabNavigator/MainTabNavigator.tsx +++ b/src/navigation/MainTabNavigator/MainTabNavigator.tsx @@ -73,19 +73,25 @@ const BottomTabBar: FC = ({navigation, state}) => { ); }; -const MainTabNavigator = () => ( - } - initialRouteName="Home"> - - - - - -); +const MainTabNavigator = (props: any) => { + const firebaseUser = useSelector( + (reduxState: RootState) => reduxState.UserReducer.firebaseUser, + ); + + return ( + } + initialRouteName="Home"> + + + + + + ); +}; export default MainTabNavigator; diff --git a/src/screens/Meeting/MeetScreen/MeetScreen.tsx b/src/screens/Meeting/MeetScreen/MeetScreen.tsx index f6241f9..005498b 100644 --- a/src/screens/Meeting/MeetScreen/MeetScreen.tsx +++ b/src/screens/Meeting/MeetScreen/MeetScreen.tsx @@ -7,6 +7,7 @@ import { CREATE_MEET_SCREEN, JOIN_MEET_SCREEN, PROFILE_SCREEN, + USER_SEARCH_SCREEN, } from '../../../constants/Navigation/Navigation'; import {RootState} from '../../../store/rootReducer'; import {RALEWAY_BOLD, RALEWAY_REGULAR} from '../../../constants/Fonts/Fonts'; @@ -44,6 +45,7 @@ const MeetScreen = (props: any) => { rightIcon="video-outline" onPressLeft={() => props.navigation.navigate(PROFILE_SCREEN)} onPressRight={() => props.navigation.navigate(CREATE_MEET_SCREEN)} + onPressSearch={() => props.navigation.navigate(USER_SEARCH_SCREEN)} /> diff --git a/src/screens/ProfileScreen/EditProfileScreen.tsx b/src/screens/ProfileScreen/EditProfileScreen.tsx new file mode 100644 index 0000000..8885747 --- /dev/null +++ b/src/screens/ProfileScreen/EditProfileScreen.tsx @@ -0,0 +1,20 @@ +import {Layout, Text} from '@ui-kitten/components'; +import React from 'react'; +import {StyleSheet, View} from 'react-native'; + +const EditProfileScreen = () => { + return ( + + Edit Screen + + ); +}; + +const styles = StyleSheet.create({ + main: { + flex: 1, + padding: 10, + }, +}); + +export default EditProfileScreen; diff --git a/src/screens/ProfileScreen/ProfileScreen.tsx b/src/screens/ProfileScreen/ProfileScreen.tsx index ebe8712..33e58d0 100644 --- a/src/screens/ProfileScreen/ProfileScreen.tsx +++ b/src/screens/ProfileScreen/ProfileScreen.tsx @@ -1,8 +1,14 @@ import React from 'react'; import {Text, Layout, useTheme, Icon} from '@ui-kitten/components'; -import {ScrollView, StyleSheet, View, TouchableOpacity} from 'react-native'; +import { + ScrollView, + StyleSheet, + View, + TouchableOpacity, + ActivityIndicator, +} from 'react-native'; import ProfileHeader from '../../components/Headers/ProfileHeader/ProfileHeader'; -import {useDispatch, useSelector} from 'react-redux'; +import {useSelector} from 'react-redux'; import {RootState} from '../../store/rootReducer'; import FastImage from 'react-native-fast-image'; import {DEFAULT_AVATAR} from '../../constants/Images/Images'; @@ -16,92 +22,50 @@ import {DEFAULT_BIO, DEFAULT_USER_TAGLINE} from '../../constants/User/User'; import FullDivider from '../../components/Divider/FullDivider'; import Toast from 'react-native-toast-message'; import Clipboard from '@react-native-clipboard/clipboard'; -import {useState} from 'react'; import Settings from '../../components/Modals/Settings/Settings'; -import {updateFirebaseUserStatus} from '../../store/User/actionCreator/addFirebaseUser'; -import {FAIL} from '../../constants/RemoteStates/remotestates'; -import {generalErrorN} from '../../components/Alerts/GeneralError'; -import auth from '@react-native-firebase/auth'; +import {EDIT_PROFILE_SCREEN} from '../../constants/Navigation/Navigation'; +import useGetUserForProfile from '../../hooks/User/useGetUserForProfile'; const ProfileScreen = (props: any) => { - const {myProfile} = props.route.params; + const {myProfile, uid} = props.route.params; - const [settingOpen, toggleSetting] = useState(false); + const {loading, user, onSignOut, settingOpen, onClickSettings} = + useGetUserForProfile(uid); - const firebaseUser = useSelector( - (reduxState: RootState) => reduxState.UserReducer.firebaseUser, - ); const theme = useSelector( (reduxState: RootState) => reduxState.ThemeReducer.theme, ); - const storeDispatch = useDispatch(); - - const signOut = async () => { - try { - await auth().signOut(); - Toast.show({ - type: 'success', - position: 'top', - text1: 'Great Success✌', - text2: 'You have successfully logout ', - }); - storeDispatch(updateFirebaseUserStatus(FAIL)); - } catch (err) { - Toast.show({ - type: 'error', - position: 'top', - text1: 'Something went wrong 😔', - text2: 'Please try again!!', - }); - storeDispatch(updateFirebaseUserStatus(FAIL)); - console.log('Error in log out', err); - } - }; - - const onSignOut = async () => { - generalErrorN( - { - title: 'Log Out', - textMessage: 'Are you sure you want to logout', - okText: 'Yes', - }, - [ - { - text: 'No', - onPress: () => {}, - }, - { - text: 'Yes', - onPress: signOut, - }, - ], - ); - }; - const appTheme = useTheme(); - return ( + return loading ? ( + + + + ) : ( toggleSetting(!settingOpen)} + onBackDropPress={onClickSettings} /> console.log('Edit')} - onPressSetting={() => toggleSetting(!settingOpen)} + onPressEdit={() => props.navigation.navigate(EDIT_PROFILE_SCREEN)} + onPressSetting={onClickSettings} /> @@ -114,13 +78,11 @@ const ProfileScreen = (props: any) => { color: appTheme['color-primary-default'], fontFamily: RALEWAY_EXTRA_BOLD, }}> - {firebaseUser.name ? firebaseUser.name : 'Robot'} + {user.name ? user.name : 'Robot'} - {firebaseUser.tagLine - ? firebaseUser.tagLine - : DEFAULT_USER_TAGLINE} + {user.tagLine ? user.tagLine : DEFAULT_USER_TAGLINE} @@ -128,9 +90,7 @@ const ProfileScreen = (props: any) => { Bio - - {firebaseUser.bio ? firebaseUser.bio : DEFAULT_BIO} - + {user.bio ? user.bio : DEFAULT_BIO} Email @@ -138,15 +98,15 @@ const ProfileScreen = (props: any) => { { - Clipboard.setString(firebaseUser.email); + Clipboard.setString(user.email); Toast.show({ type: 'success', position: 'top', text1: 'Copied!', - text2: `${firebaseUser.email}`, + text2: `${user.email}`, }); }}> - {firebaseUser.email} + {user.email} {myProfile && } {myProfile && ( diff --git a/src/screens/ProfileScreen/RemoteProfileScreen.tsx b/src/screens/ProfileScreen/RemoteProfileScreen.tsx new file mode 100644 index 0000000..68ea80f --- /dev/null +++ b/src/screens/ProfileScreen/RemoteProfileScreen.tsx @@ -0,0 +1,202 @@ +import React from 'react'; +import {Text, Layout, useTheme, Icon} from '@ui-kitten/components'; +import { + ScrollView, + StyleSheet, + View, + TouchableOpacity, + ActivityIndicator, +} from 'react-native'; +import ProfileHeader from '../../components/Headers/ProfileHeader/ProfileHeader'; +import {useSelector} from 'react-redux'; +import {RootState} from '../../store/rootReducer'; +import FastImage from 'react-native-fast-image'; +import {DEFAULT_AVATAR} from '../../constants/Images/Images'; +import { + RALEWAY_BOLD, + RALEWAY_EXTRA_BOLD, + RALEWAY_MEDIUM, + RALEWAY_REGULAR, +} from '../../constants/Fonts/Fonts'; +import {DEFAULT_BIO, DEFAULT_USER_TAGLINE} from '../../constants/User/User'; +import FullDivider from '../../components/Divider/FullDivider'; +import Toast from 'react-native-toast-message'; +import Clipboard from '@react-native-clipboard/clipboard'; +import Settings from '../../components/Modals/Settings/Settings'; +import {EDIT_PROFILE_SCREEN} from '../../constants/Navigation/Navigation'; +import useGetUserForProfile from '../../hooks/User/useGetUserForProfile'; +import BackHeader from '../../components/Headers/BackHeader/BackHeader'; + +const RemoteProfileScreen = (props: any) => { + const {myProfile, uid} = props.route.params; + + const {loading, user, onSignOut, settingOpen, onClickSettings} = + useGetUserForProfile(uid); + + const theme = useSelector( + (reduxState: RootState) => reduxState.ThemeReducer.theme, + ); + const appTheme = useTheme(); + + return loading ? ( + + + + ) : ( + + + + + props.navigation.goBack()} + /> + + + + + + Hi, I'm{' '} + + {user.name ? user.name : 'Robot'} + + + + {user.tagLine ? user.tagLine : DEFAULT_USER_TAGLINE} + + + + + + Bio + + {user.bio ? user.bio : DEFAULT_BIO} + + + Email + + { + Clipboard.setString(user.email); + Toast.show({ + type: 'success', + position: 'top', + text1: 'Copied!', + text2: `${user.email}`, + }); + }}> + {user.email} + + {myProfile && } + {myProfile && ( + + + + Invite you friends + + + )} + {myProfile && ( + + + + Log Out + + + )} + + + + ); +}; + +const styles = StyleSheet.create({ + main: { + flex: 1, + padding: 10, + }, + imgView: { + width: '100%', + justifyContent: 'center', + alignItems: 'center', + }, + image: { + height: 120, + width: 120, + borderRadius: 70, + }, + nameView: { + width: '100%', + alignItems: 'center', + marginTop: 20, + paddingHorizontal: 10, + }, + name: { + fontFamily: RALEWAY_BOLD, + }, + tagLine: { + fontFamily: RALEWAY_MEDIUM, + marginTop: 10, + color: 'grey', + }, + bioHeading: { + fontFamily: RALEWAY_BOLD, + }, + bioView: { + flex: 1, + padding: 10, + marginTop: 10, + }, + bio: { + fontFamily: RALEWAY_REGULAR, + marginTop: 10, + }, + invite: { + fontFamily: RALEWAY_EXTRA_BOLD, + }, + inviteView: { + flexDirection: 'row', + alignItems: 'center', + marginTop: 10, + }, + icon: { + height: 20, + width: 20, + marginRight: 10, + }, +}); + +export default RemoteProfileScreen; diff --git a/src/screens/Search/UserSearch/UserSearchScreen.tsx b/src/screens/Search/UserSearch/UserSearchScreen.tsx new file mode 100644 index 0000000..b25ccc1 --- /dev/null +++ b/src/screens/Search/UserSearch/UserSearchScreen.tsx @@ -0,0 +1,97 @@ +import React from 'react'; +import {StyleSheet, View, ActivityIndicator, FlatList} from 'react-native'; +import {Layout, Text, useTheme} from '@ui-kitten/components'; +import useGetUsers from '../../../hooks/User/useGetUsers'; +import UserSearchBar from '../../../components/SearchBar/UserSearchBar'; +import {RALEWAY_MEDIUM} from '../../../constants/Fonts/Fonts'; +import FullDivider from '../../../components/Divider/FullDivider'; +import UserSerchCard from '../../../components/Card/UserSearchCard/UserSerchCard'; +import {REMOTE_USER_SEARCH_SCREEN} from '../../../constants/Navigation/Navigation'; + +const UserSearchScreen = (props: any) => { + const {filteredUsers, loading, query, handleQuery} = useGetUsers(); + const appTheme = useTheme(); + + return ( + + + {loading && !filteredUsers ? ( + + + + ) : filteredUsers?.length === 0 ? ( + + + Oops, No user{' '} + + Found!! + + + + ) : ( + + user.uid} + renderItem={({item}) => { + return ( + + props.navigation.navigate(REMOTE_USER_SEARCH_SCREEN, { + myProfile: false, + uid: item.uid, + }) + } + /> + ); + }} + ItemSeparatorComponent={() => ( + + )} + showsVerticalScrollIndicator={false} + /> + + )} + + ); +}; + +const styles = StyleSheet.create({ + main: { + flex: 1, + padding: 10, + }, + activityView: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + noUser: { + fontFamily: RALEWAY_MEDIUM, + }, + listView: { + padding: 10, + }, + divider: { + width: '80%', + alignSelf: 'flex-end', + marginVertical: 12, + }, +}); + +export default UserSearchScreen; diff --git a/src/utils/Firestore/read.ts b/src/utils/Firestore/read.ts index e69de29..f065047 100644 --- a/src/utils/Firestore/read.ts +++ b/src/utils/Firestore/read.ts @@ -0,0 +1,7 @@ +import firestore from '@react-native-firebase/firestore'; + +export const readAsync = async (collectionId: string, documentId: string) => { + return ( + await firestore().collection(collectionId).doc(documentId).get() + ).data(); +}; diff --git a/src/utils/User/Methods/getRemoteUser.ts b/src/utils/User/Methods/getRemoteUser.ts index 9972357..d5e7472 100644 --- a/src/utils/User/Methods/getRemoteUser.ts +++ b/src/utils/User/Methods/getRemoteUser.ts @@ -3,18 +3,10 @@ import {UserInterface} from '../../../models/User/User'; export const getRemoteUser = async (uid: string) => { try { - let data: UserInterface | undefined; - firestore() - .collection('users') - .doc(uid) - .onSnapshot((snapshot) => { - if (snapshot.exists) { - data = snapshot.data() as UserInterface; - } - }); + const userRef = await firestore().collection('users').doc(uid).get(); - if (data) { - return data; + if (userRef.exists) { + return userRef.data() as UserInterface; } } catch (error) { console.log('Error if fetching remote user', error);