fetching conversations and managing in the conversation provider

This commit is contained in:
talksik
2022-06-11 11:06:28 -05:00
parent 701ae1fdde
commit fa38aa8af8
6 changed files with 83 additions and 8 deletions
+5
View File
@@ -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<NirvanaResponse<CreateConversationResponse>> {
return await NirvanaApi.fetch(`/conversations`, 'POST', true, req);
}
export async function getConversations(): Promise<NirvanaResponse<Conversation[]>> {
return await NirvanaApi.fetch(`/conversations`, 'GET', true);
}
@@ -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<IConversationContext>({
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<ConversationMap>({});
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 (
<Typography variant={'h6'} color={'danger'}>
Something went terribly wrong
</Typography>
);
}
return (
<ConversationContext.Provider value={{ conversations: conversationMap }}>
{children}
</ConversationContext.Provider>
);
}
export default function useConversations() {
return React.useContext(ConversationContext);
}
@@ -15,11 +15,11 @@ interface IRouterContext {
}
const RouterContext = React.createContext<IRouterContext>({
page: 'START_NEW_CONVERSATION',
page: 'WELCOME',
});
export function RouterProvider({ children }: { children: React.ReactNode }) {
const [page, setPage] = useState<TPage>('START_NEW_CONVERSATION');
const [page, setPage] = useState<TPage>('WELCOME');
const handleSetPage = useCallback((newPage: TPage) => () => setPage(newPage), [setPage]);
+8 -5
View File
@@ -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() {
<ProtectedRoute>
<ZenProvider>
<SocketProvider>
<SearchProvider>
<RouterProvider>
<Terminal />
</RouterProvider>
</SearchProvider>
<ConversationProvider>
<SearchProvider>
<RouterProvider>
<Terminal />
</RouterProvider>
</SearchProvider>
</ConversationProvider>
</SocketProvider>
</ZenProvider>
</ProtectedRoute>
+1 -1
View File
@@ -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 = {