From 0f57843695cd7eaf684c024dc00cb869fcc3b243 Mon Sep 17 00:00:00 2001 From: talksik Date: Sat, 28 May 2022 15:56:14 -0500 Subject: [PATCH] data segmentation --- packages/desktop/package.json | 4 +- packages/desktop/src/components/Terminal.tsx | 56 ++++++++++++++++---- yarn.lock | 15 ++++-- 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/packages/desktop/package.json b/packages/desktop/package.json index b221b17..f8dc8ec 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -101,11 +101,13 @@ "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.0.1", "firebase": "^9.8.2", + "immer": "^9.0.14", "notistack": "^2.0.5", "react": "^18.1.0", "react-dom": "^18.1.0", "react-error-boundary": "^3.1.4", "react-icons": "^4.3.1", - "react-use": "^17.4.0" + "react-use": "^17.4.0", + "use-immer": "^0.7.0" } } diff --git a/packages/desktop/src/components/Terminal.tsx b/packages/desktop/src/components/Terminal.tsx index 5bd9e43..4e5a165 100644 --- a/packages/desktop/src/components/Terminal.tsx +++ b/packages/desktop/src/components/Terminal.tsx @@ -11,16 +11,36 @@ import Navbar from './Navbar'; import Conversation from '@nirvana/core/src/models/conversation.model'; import useAuth from '../providers/AuthProvider'; import { createOneOnOneConversation } from '../firebase/firestore'; +import { Link, AudioClip, Image } from '@nirvana/core/src/models/content.model'; +import { useImmer } from 'use-immer'; +import { User } from '@nirvana/core/src/models/user.model'; + +type ConversationMap = { + [conversationId: string]: Conversation; +}; + +type UserMap = { + [userId: string]: User; +}; + +type ConversationContentMap = { + [conversationId: string]: { audio: AudioClip[]; links: Link[]; images: Image[] }; +}; interface ITerminalContext { - conversations: Conversation[]; + conversationMap: ConversationMap; + userMap: UserMap; + contentMap: ConversationContentMap; + selectedConversation?: Conversation; handleQuickDial?: (otherUserId: string) => void; } const TerminalContext = React.createContext({ - conversations: [], + conversationMap: {}, + userMap: {}, + contentMap: {}, }); // TODOS @@ -39,22 +59,36 @@ const TerminalContext = React.createContext({ // if no conversations, show stale state + create one with nirvana +// sort based on the different data sources: conversations, audio clips, etc. + export function TerminalProvider({ children }: { children?: React.ReactNode }) { const { enqueueSnackbar } = useSnackbar(); const { user } = useAuth(); const [selectedConversationId, setSelectedConversationId] = useState(undefined); - const [conversations, setConversations] = useState([]); + const [conversationMap, updateConversationMap] = useImmer({}); + const [userMap, updateUserMap] = useImmer({}); + const [contentMap, updatecontentMap] = useImmer({}); // cache of selected conversation - const selectedConversation: Conversation | undefined = useMemo(() => { - // get conversation if not here // select if we do have it - return undefined; - }, [selectedConversationId]); + const conversation = conversationMap[selectedConversationId]; + + if (!conversation) { + enqueueSnackbar('no conversation found', { variant: 'error' }); + console.error('Should have found it... maybe retry once more'); + } + + return conversation; + + // get conversation if not here + // const fetchedConversation = await getConversationById + + // return undefined; + }, [selectedConversationId, conversationMap, enqueueSnackbar]); // handle create or open existing conversation // not 100% consistent to the second, but still works...don't need atomicity @@ -64,7 +98,7 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { // check all current conversations which should be live listened to // if there is already a convo with exactly me and him, then select it - const findExistingConversation = conversations.find((convo) => { + const findExistingConversation = Object.values(conversationMap).find((convo) => { if ( convo.membersInRoom?.length === 2 && convo.membersInRoom.includes(user.uid) && @@ -86,11 +120,13 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { enqueueSnackbar('Something went wrong, please try again', { variant: 'error' }); } }, - [conversations, enqueueSnackbar, user], + [conversationMap, enqueueSnackbar, user], ); return ( - +