From e1584a6c0f6f60a238a39426f5f06dcbe04f80c6 Mon Sep 17 00:00:00 2001 From: talksik Date: Sat, 28 May 2022 13:04:44 -0500 Subject: [PATCH] race condition with search and firebase initializing --- packages/desktop/src/app.tsx | 1 - .../desktop/src/components/Conversations.tsx | 70 +++++++++++++++++-- packages/desktop/src/firebase/connect.ts | 2 +- packages/desktop/src/firebase/firestore.ts | 43 +++++++++++- 4 files changed, 105 insertions(+), 11 deletions(-) diff --git a/packages/desktop/src/app.tsx b/packages/desktop/src/app.tsx index b8c0a8e..c590682 100644 --- a/packages/desktop/src/app.tsx +++ b/packages/desktop/src/app.tsx @@ -9,7 +9,6 @@ import { NirvanaTheme } from './mui/NirvanaTheme'; import { ElectronProvider } from './providers/ElectronProvider'; import { AuthProvider } from './providers/AuthProvider'; -import './firebase/connect'; import ErrorParent from './providers/ErrorBoundary'; const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); diff --git a/packages/desktop/src/components/Conversations.tsx b/packages/desktop/src/components/Conversations.tsx index 55fe8fe..cb42725 100644 --- a/packages/desktop/src/components/Conversations.tsx +++ b/packages/desktop/src/components/Conversations.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useRef } from 'react'; +import React, { useCallback, useRef, useState } from 'react'; import { Avatar, @@ -17,21 +17,37 @@ import { import { blueGrey } from '@mui/material/colors'; import { FiActivity, FiInbox, FiSearch } from 'react-icons/fi'; import NirvanaAvatar from './NirvanaAvatar'; -import { useKey } from 'react-use'; +import { useDebounce, useKey } from 'react-use'; import { useSnackbar } from 'notistack'; import KeyboardShortcutLabel from './KeyboardShortcutLabel'; +import { searchUsers, User } from '../firebase/firestore'; const Conversations = () => { const { enqueueSnackbar } = useSnackbar(); const searchRef = useRef(null); + const [searchVal, setSearchVal] = useState(''); - const onSearch = useCallback(() => { + const onSearchFocus = useCallback(() => { enqueueSnackbar('search focused'); if (searchRef?.current) searchRef.current.focus(); - }, []); + }, [enqueueSnackbar, searchRef]); - useKey('Shift', onSearch); + const [searchUsersResults, setSearchUsersResults] = useState([]); + + useKey('Shift', onSearchFocus); + + const [, cancel] = useDebounce( + async () => { + if (searchVal) { + enqueueSnackbar('searching...', { variant: 'info' }); + + setSearchUsersResults(await searchUsers(searchVal)); + } + }, + 500, + [searchVal, enqueueSnackbar, setSearchUsersResults], + ); return ( <> @@ -51,11 +67,18 @@ const Conversations = () => { > - + setSearchVal(e.target.value)} + value={searchVal} + placeholder={'Find or start a conversation'} + inputRef={searchRef} + /> + {searchVal && } + { ); }; +function ListPeople({ people }: { people: User[] }) { + return ( + + + Priority + + } + > + {people.length === 0 && ( + + Sorry please try someone else or invite them to nirvana. + + )} + + {people.map((person) => ( + + + + + + + + + 20 sec + + + ))} + + ); +} export default Conversations; diff --git a/packages/desktop/src/firebase/connect.ts b/packages/desktop/src/firebase/connect.ts index 09636cb..2c29bad 100644 --- a/packages/desktop/src/firebase/connect.ts +++ b/packages/desktop/src/firebase/connect.ts @@ -12,4 +12,4 @@ export const firebaseApp = initializeApp(devConfig); export const firebaseAuth = getAuth(firebaseApp); // Initialize Cloud Firestore and get a reference to the service -export const firestore = getFirestore(firebaseApp); +export const firestoreDb = getFirestore(firebaseApp); diff --git a/packages/desktop/src/firebase/firestore.ts b/packages/desktop/src/firebase/firestore.ts index ea538d4..4ad0746 100644 --- a/packages/desktop/src/firebase/firestore.ts +++ b/packages/desktop/src/firebase/firestore.ts @@ -8,9 +8,14 @@ import { QueryDocumentSnapshot, Timestamp, FieldValue, + getDoc, + query, + where, + getDocs, } from 'firebase/firestore'; import { User as FirebaseUser } from 'firebase/auth'; +import { firestoreDb } from './connect'; /** * UTILS @@ -20,11 +25,15 @@ const converter = () => ({ fromFirestore: (snap: QueryDocumentSnapshot) => snap.data() as T, }); -const dataPoint = (collectionPath: string) => - doc(getFirestore(), collectionPath).withConverter(converter()); +const docPoint = (collectionPath: string) => + firestoreDb && doc(getFirestore(), collectionPath).withConverter(converter()); + +const collectionPoint = (collectionPath: string) => + firestoreDb && collection(getFirestore(), collectionPath).withConverter(converter()); const db = { - user: (userId: string) => dataPoint(`users/${userId}`), + users: collectionPoint(`users`), + user: (userId: string) => docPoint(`users/${userId}`), }; export class User { @@ -65,3 +74,31 @@ export const createUser = async (user: FirebaseUser) => { throw new Error('Error creating user'); } }; + +export const searchUsers = async (searchQuery: string): Promise => { + try { + const emaildocSearchQuery = query( + db.users, + where('email', '>=', searchQuery.toUpperCase()), + where('email', '<=', searchQuery.toUpperCase() + '\uf8ff'), + ); + + const nameSearchQuery = query( + db.users, + where('displayName', '>=', searchQuery.toUpperCase()), + where('displayName', '<=', searchQuery.toUpperCase() + '\uf8ff'), + ); + + const emailquerySnap = await getDocs(emaildocSearchQuery); + const namequerySnap = await getDocs(nameSearchQuery); + + return [ + ...emailquerySnap.docs.map((doc) => doc.data()), + ...namequerySnap.docs.map((doc) => doc.data()), + ]; + } catch (e) { + console.error('Error: ', e); + + throw new Error('Error'); + } +};