diff --git a/packages/desktop/src/api/NirvanaApi.tsx b/packages/desktop/src/api/NirvanaApi.tsx index 2b1eaf3..b8aa4eb 100644 --- a/packages/desktop/src/api/NirvanaApi.tsx +++ b/packages/desktop/src/api/NirvanaApi.tsx @@ -1,6 +1,7 @@ import NirvanaResponse, { INirvanaResponse } from '@nirvana/core/responses/nirvanaResponse'; import axios, { AxiosRequestConfig, AxiosResponse, Method } from 'axios'; +import Conversation from '@nirvana/core/models/conversation.model'; import CreateConversationRequest from '@nirvana/core/requests/CreateConversationRequest.request'; import CreateConversationResponse from '@nirvana/core/responses/CreateConversationResponse.response'; import LoginResponse from '@nirvana/core/responses/login.response'; @@ -80,3 +81,7 @@ export async function createConversation( ): Promise> { return await NirvanaApi.fetch(`/conversations`, 'POST', true, req); } + +export async function getConversations(): Promise> { + return await NirvanaApi.fetch(`/conversations`, 'GET', true); +} diff --git a/packages/desktop/src/providers/ConversationProvider.tsx b/packages/desktop/src/providers/ConversationProvider.tsx new file mode 100644 index 0000000..59e3eba --- /dev/null +++ b/packages/desktop/src/providers/ConversationProvider.tsx @@ -0,0 +1,67 @@ +import React, { useEffect } from 'react'; + +import Conversation from '@nirvana/core/models/conversation.model'; +import { ConversationMap } from '../util/types'; +import { Typography } from '@mui/material'; +import { getConversations } from '../api/NirvanaApi'; +import { useAsyncFn } from 'react-use'; +import { useImmer } from 'use-immer'; + +interface IConversationContext { + conversations: ConversationMap; +} + +const ConversationContext = React.createContext({ + conversations: {}, +}); + +export function ConversationProvider({ children }: { children: React.ReactNode }) { + // the initial persistent fetch for conversations + const [fetchState, doFetch] = useAsyncFn(getConversations); + + // the map that we manage throughout the app + const [conversationMap, setConversationMap] = useImmer({}); + + useEffect(() => { + doFetch(); + }, [doFetch]); + + useEffect(() => { + console.log(fetchState.value); + + if (fetchState.value?.data) { + setConversationMap((draft) => { + fetchState.value.data.forEach((conversationResult) => { + draft[conversationResult._id.toString()] = { + ...conversationResult, + tunedInUsers: [], + connectedUserIds: [], + }; + }); + }); + } + }, [fetchState.value, setConversationMap]); + + // todo: open up a handler for children + // to refetch or search for a particular conversation and add it to the list of conversations + + // todo: transform conversations to a map and keep adding to the map + + if (fetchState.error) { + return ( + + Something went terribly wrong + + ); + } + + return ( + + {children} + + ); +} + +export default function useConversations() { + return React.useContext(ConversationContext); +} diff --git a/packages/desktop/src/providers/RealtimeProvider.tsx b/packages/desktop/src/providers/RealtimeProvider.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/desktop/src/providers/RouterProvider.tsx b/packages/desktop/src/providers/RouterProvider.tsx index 613a33f..7243287 100644 --- a/packages/desktop/src/providers/RouterProvider.tsx +++ b/packages/desktop/src/providers/RouterProvider.tsx @@ -15,11 +15,11 @@ interface IRouterContext { } const RouterContext = React.createContext({ - page: 'START_NEW_CONVERSATION', + page: 'WELCOME', }); export function RouterProvider({ children }: { children: React.ReactNode }) { - const [page, setPage] = useState('START_NEW_CONVERSATION'); + const [page, setPage] = useState('WELCOME'); const handleSetPage = useCallback((newPage: TPage) => () => setPage(newPage), [setPage]); diff --git a/packages/desktop/src/tree/electronApp.tsx b/packages/desktop/src/tree/electronApp.tsx index 62e2564..1f5a142 100644 --- a/packages/desktop/src/tree/electronApp.tsx +++ b/packages/desktop/src/tree/electronApp.tsx @@ -1,4 +1,5 @@ import { AuthProvider } from '../providers/AuthProvider'; +import { ConversationProvider } from '../providers/ConversationProvider'; import { ElectronProvider } from '../providers/ElectronProvider'; import { NirvanaTheme } from '../mui/NirvanaTheme'; import ProtectedRoute from './ProtectedRoute'; @@ -21,11 +22,13 @@ export default function ElectronApp() { - - - - - + + + + + + + diff --git a/packages/desktop/src/util/types.ts b/packages/desktop/src/util/types.ts index 331d414..baf83ad 100644 --- a/packages/desktop/src/util/types.ts +++ b/packages/desktop/src/util/types.ts @@ -3,7 +3,7 @@ import Conversation from '@nirvana/core/models/conversation.model'; import User from '@nirvana/core/models/user.model'; export type ConversationMap = { - [conversationId: string]: Conversation; + [conversationId: string]: Conversation & { tunedInUsers: string[]; connectedUserIds: string[] }; }; export type UserMap = {