From d255935f68ae2a867dd1aea35e654a72cddfb6e8 Mon Sep 17 00:00:00 2001 From: talksik Date: Sun, 29 May 2022 11:17:25 -0500 Subject: [PATCH] logic for joining and leaving room --- packages/desktop/src/components/Terminal.tsx | 31 ++++++++++++++- packages/desktop/src/firebase/firestore.ts | 40 ++++++++++++++++---- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/packages/desktop/src/components/Terminal.tsx b/packages/desktop/src/components/Terminal.tsx index 3e69c36..7988d78 100644 --- a/packages/desktop/src/components/Terminal.tsx +++ b/packages/desktop/src/components/Terminal.tsx @@ -55,6 +55,8 @@ import { createOneOnOneConversation, getConversationsQueryLIVE, getUserById, + joinConversation, + leaveConversation, searchUsers, sendAudioClipToConversation, } from '../firebase/firestore'; @@ -826,6 +828,8 @@ function MainPanel() { ); } +const maxPriorityConvos = 5; + function ConversationDetails() { const { user } = useAuth(); const { getUser, selectedConversation, selectConversation, isCloudDoingMagic } = useTerminal(); @@ -834,13 +838,36 @@ function ConversationDetails() { // TODO: at the terminal level, make sure we are listening for audio clips // and here it's just an access of that map of content for each conversation's blocks + // the reference last active date based on current session of viewing this conversation + const [lastActiveDate, setLastActiveDate] = useState(null); + // join the room useEffect(() => { - if (selectedConversation.membersInRoom?.length > 0) { - // join the audio room + if (selectedConversation.membersInRoom?.length > 1) { + // join the audio room with hms } }, [selectedConversation.membersInRoom]); + // update my last active date in this conversation + // put me in the membersInRoom + useEffect(() => { + setLastActiveDate((prevLastActiveForCurrentSession) => { + if (prevLastActiveForCurrentSession) return prevLastActiveForCurrentSession; + + return selectedConversation.members[user.uid].lastActiveDate?.toDate(); + }); + + if (!selectedConversation.memberIdsList.includes(user.uid)) + joinConversation(selectedConversation.id, user.uid); + + return () => { + leaveConversation(selectedConversation.id, user.uid); + }; + }, [selectedConversation.members, user.uid, setLastActiveDate, selectedConversation.id]); + + // TODO: uncheck priority or not + // soft max of 10...not going to enforce by counting all in database, but relying on client side list of convos + useEffect(() => { (async () => { const userPromises = selectedConversation.memberIdsList diff --git a/packages/desktop/src/firebase/firestore.ts b/packages/desktop/src/firebase/firestore.ts index a418402..64497ab 100644 --- a/packages/desktop/src/firebase/firestore.ts +++ b/packages/desktop/src/firebase/firestore.ts @@ -17,6 +17,9 @@ import { startAt, endAt, addDoc, + arrayUnion, + updateDoc, + arrayRemove, } from 'firebase/firestore'; import { User as FirebaseUser } from 'firebase/auth'; @@ -60,7 +63,8 @@ const db = { users: collectionPoint(`users`), user: (userId: string) => docPoint(`users/${userId}`), conversations: collectionPoint(`conversations`), - conversation: (conversationId: string) => docPoint(`conversations/${conversationId}`), + conversation: (conversationId: string) => + docPoint(`conversations/${conversationId}`), conversationAudioClips: (conversationId: string) => collectionPoint(`conversations/${conversationId}/audioClips`), @@ -163,9 +167,9 @@ export const createOneOnOneConversation = async ( const newDoc = await addDoc(db.conversations, newConversation); return newDoc.id; } catch (e) { - console.error('Error creating user: ', e); + console.error('Error: ', e); - throw new Error('Error creating user'); + throw new Error('Error'); } }; @@ -193,9 +197,9 @@ export const createGroupConversation = async ( try { await addDoc(db.conversations, newConversation); } catch (e) { - console.error('Error creating user: ', e); + console.error('Error : ', e); - throw new Error('Error creating user'); + throw new Error('Error '); } }; @@ -203,8 +207,30 @@ export const sendAudioClipToConversation = async (audioClip: AudioClip, conversa try { await addDoc(db.conversationAudioClips(conversationId), audioClip); } catch (e) { - console.error('Error creating user: ', e); + console.error('Error ', e); - throw new Error('Error creating user'); + throw new Error('Error '); + } +}; + +// put the user in membersInroom +export const joinConversation = async (conversationId: string, userId: string) => { + try { + await updateDoc(db.conversation(conversationId), { membersInRoom: arrayUnion(userId) }); + } catch (e) { + console.error('Error ', e); + + throw new Error('Error'); + } +}; + +// leave membersInroom +export const leaveConversation = async (conversationId: string, userId: string) => { + try { + await updateDoc(db.conversation(conversationId), { membersInRoom: arrayRemove(userId) }); + } catch (e) { + console.error('Error ', e); + + throw new Error('Error'); } };