diff --git a/packages/api/routes/conversations.ts b/packages/api/routes/conversations.ts index 1b592b8..8d80330 100644 --- a/packages/api/routes/conversations.ts +++ b/packages/api/routes/conversations.ts @@ -38,27 +38,15 @@ const createConversation = async (req: Request, res: Response, next: NextFunctio const createRequest = req.body as CreateConversationRequest; const userInfo = res.locals.userInfo as JwtClaims; - console.log('other members', createRequest.otherMemberIds); - - if (!createRequest.otherMemberIds || createRequest.otherMemberIds.length === 0) { + if (!createRequest.otherUsers) { return next(new Error('must provide who you want to talk to')); } // process of creating other conversation user members with their user objects // for cached data purposes - const otherUserMembers = await UserService.getUsersByIds(createRequest.otherMemberIds); - if (!otherUserMembers) { - return next(new Error('unable to find other conversation members')); - } const conversationUserMembers: ConversationUserMember[] = []; - createRequest.otherMemberIds.forEach(async (memberId) => { - const userObject = otherUserMembers.find((userObj) => userObj._id?.equals(memberId)); - - if (!userObject) { - return next(new Error('unable to find a user that was passed in')); - } - + createRequest.otherUsers.forEach((userObject) => { const newConversationMember = new ConversationMember(MemberRole.regular, MemberState.inbox); conversationUserMembers.push({ @@ -89,6 +77,8 @@ const createConversation = async (req: Request, res: Response, next: NextFunctio return next(Error('unable to create a conversation')); } + // todo: send updates to other users if they are connected through sockets + const responseObj = new NirvanaResponse( new CreateConversationResponse(insertResult.insertedId), undefined, diff --git a/packages/core/requests/CreateConversationRequest.request.ts b/packages/core/requests/CreateConversationRequest.request.ts index ba8ac7d..d49a3c6 100644 --- a/packages/core/requests/CreateConversationRequest.request.ts +++ b/packages/core/requests/CreateConversationRequest.request.ts @@ -1,6 +1,7 @@ import Conversation from '@nirvana/core/models/conversation.model'; import { ObjectId } from 'mongodb'; +import User from '../models/user.model'; export default class CreateConversationRequest { - constructor(public otherMemberIds: ObjectId[], public conversationName?: string) {} + constructor(public otherUsers: User[], public conversationName?: string) {} } diff --git a/packages/desktop/src/api/NirvanaApi.tsx b/packages/desktop/src/api/NirvanaApi.tsx index e79fcbe..fae3709 100644 --- a/packages/desktop/src/api/NirvanaApi.tsx +++ b/packages/desktop/src/api/NirvanaApi.tsx @@ -1,6 +1,9 @@ import axios, { AxiosRequestConfig, AxiosResponse, Method } from 'axios'; +import CreateConversationRequest from '../../../core/requests/CreateConversationRequest.request'; +import CreateConversationResponse from '../../../core/responses/CreateConversationResponse.response'; import LoginResponse from '@nirvana/core/responses/login.response'; +import NirvanaResponse from '../../../core/responses/nirvanaResponse'; import UserDetailsResponse from '@nirvana/core/responses/userDetails.response'; import UserSearchResponse from '@nirvana/core/responses/userSearch.response'; @@ -71,3 +74,9 @@ export async function getUserDetails(): Promise { export async function userSearch(searchQuery: string): Promise { return await NirvanaApi.fetch(`/search/users?query=${searchQuery}`, 'GET', true); } + +export async function createConversation( + req: CreateConversationRequest, +): Promise> { + return await NirvanaApi.fetch(`/conversations`, 'POST', true, req); +} diff --git a/packages/desktop/src/tree/NewConversationDialog.tsx b/packages/desktop/src/tree/NewConversationDialog.tsx index adc14f0..543b54b 100644 --- a/packages/desktop/src/tree/NewConversationDialog.tsx +++ b/packages/desktop/src/tree/NewConversationDialog.tsx @@ -20,11 +20,13 @@ import React, { HTMLAttributes, useCallback, useEffect, useState } from 'react'; import { useDebounce, useKeyPressEvent, useToggle } from 'react-use'; import CircularProgress from '@mui/material/CircularProgress'; +import CreateConversationRequest from '../../../core/requests/CreateConversationRequest.request'; import { FiX } from 'react-icons/fi'; import { NirvanaRules } from '../util/rules'; import User from '@nirvana/core/models/user.model'; import UserDetailRow from '../subcomponents/UserDetailRow'; import { blueGrey } from '@mui/material/colors'; +import { createConversation } from '../api/NirvanaApi'; import toast from 'react-hot-toast'; import useAuth from '../providers/AuthProvider'; import useRouter from '../providers/RouterProvider'; @@ -92,12 +94,23 @@ export default function NewConversationDialog() { setIsSubmitting(true); - // await handleSubmit(selectedUsers, conversationName); - toast('submitting'); + try { + // if it's just one other person, then call quick dial master function which would do all of the checking - // clear form for next time - setSelectedUsers([]); - setConversationName(''); + // if more than one person, then just create conversation + + const createResult = await createConversation( + new CreateConversationRequest(selectedUsers, conversationName), + ); + + // clear form for next time + setSelectedUsers([]); + setConversationName(''); + + // todo: select conversation Id that was created + } catch (error) { + console.error(error); + } setIsSubmitting(false); }, [selectedUsers, setConversationName, conversationName, setSelectedUsers, setIsSubmitting]);