fetching conversations and managing in the conversation provider
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import NirvanaResponse, { INirvanaResponse } from '@nirvana/core/responses/nirvanaResponse';
|
import NirvanaResponse, { INirvanaResponse } from '@nirvana/core/responses/nirvanaResponse';
|
||||||
import axios, { AxiosRequestConfig, AxiosResponse, Method } from 'axios';
|
import axios, { AxiosRequestConfig, AxiosResponse, Method } from 'axios';
|
||||||
|
|
||||||
|
import Conversation from '@nirvana/core/models/conversation.model';
|
||||||
import CreateConversationRequest from '@nirvana/core/requests/CreateConversationRequest.request';
|
import CreateConversationRequest from '@nirvana/core/requests/CreateConversationRequest.request';
|
||||||
import CreateConversationResponse from '@nirvana/core/responses/CreateConversationResponse.response';
|
import CreateConversationResponse from '@nirvana/core/responses/CreateConversationResponse.response';
|
||||||
import LoginResponse from '@nirvana/core/responses/login.response';
|
import LoginResponse from '@nirvana/core/responses/login.response';
|
||||||
@@ -80,3 +81,7 @@ export async function createConversation(
|
|||||||
): Promise<NirvanaResponse<CreateConversationResponse>> {
|
): Promise<NirvanaResponse<CreateConversationResponse>> {
|
||||||
return await NirvanaApi.fetch(`/conversations`, 'POST', true, req);
|
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>({
|
const RouterContext = React.createContext<IRouterContext>({
|
||||||
page: 'START_NEW_CONVERSATION',
|
page: 'WELCOME',
|
||||||
});
|
});
|
||||||
|
|
||||||
export function RouterProvider({ children }: { children: React.ReactNode }) {
|
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]);
|
const handleSetPage = useCallback((newPage: TPage) => () => setPage(newPage), [setPage]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { AuthProvider } from '../providers/AuthProvider';
|
import { AuthProvider } from '../providers/AuthProvider';
|
||||||
|
import { ConversationProvider } from '../providers/ConversationProvider';
|
||||||
import { ElectronProvider } from '../providers/ElectronProvider';
|
import { ElectronProvider } from '../providers/ElectronProvider';
|
||||||
import { NirvanaTheme } from '../mui/NirvanaTheme';
|
import { NirvanaTheme } from '../mui/NirvanaTheme';
|
||||||
import ProtectedRoute from './ProtectedRoute';
|
import ProtectedRoute from './ProtectedRoute';
|
||||||
@@ -21,11 +22,13 @@ export default function ElectronApp() {
|
|||||||
<ProtectedRoute>
|
<ProtectedRoute>
|
||||||
<ZenProvider>
|
<ZenProvider>
|
||||||
<SocketProvider>
|
<SocketProvider>
|
||||||
<SearchProvider>
|
<ConversationProvider>
|
||||||
<RouterProvider>
|
<SearchProvider>
|
||||||
<Terminal />
|
<RouterProvider>
|
||||||
</RouterProvider>
|
<Terminal />
|
||||||
</SearchProvider>
|
</RouterProvider>
|
||||||
|
</SearchProvider>
|
||||||
|
</ConversationProvider>
|
||||||
</SocketProvider>
|
</SocketProvider>
|
||||||
</ZenProvider>
|
</ZenProvider>
|
||||||
</ProtectedRoute>
|
</ProtectedRoute>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import Conversation from '@nirvana/core/models/conversation.model';
|
|||||||
import User from '@nirvana/core/models/user.model';
|
import User from '@nirvana/core/models/user.model';
|
||||||
|
|
||||||
export type ConversationMap = {
|
export type ConversationMap = {
|
||||||
[conversationId: string]: Conversation;
|
[conversationId: string]: Conversation & { tunedInUsers: string[]; connectedUserIds: string[] };
|
||||||
};
|
};
|
||||||
|
|
||||||
export type UserMap = {
|
export type UserMap = {
|
||||||
|
|||||||
Reference in New Issue
Block a user