From 500330e02c7067210c81c3466ef2c9c3503ffe09 Mon Sep 17 00:00:00 2001 From: talksik Date: Wed, 23 Mar 2022 21:09:50 -0400 Subject: [PATCH] starting implementation of user status changing --- packages/api/index.ts | 27 +++++++++++++++++++ packages/api/services/user.service.ts | 17 ++++++++++-- packages/desktop/src/controller/index.tsx | 3 +++ packages/desktop/src/controller/sockets.tsx | 9 +++++++ .../desktop/src/pages/Home/header/index.tsx | 11 ++++++++ .../pages/Home/selectedConversation/index.tsx | 9 +++---- 6 files changed, 68 insertions(+), 8 deletions(-) diff --git a/packages/api/index.ts b/packages/api/index.ts index ccaf7c6..8f02515 100644 --- a/packages/api/index.ts +++ b/packages/api/index.ts @@ -2,6 +2,8 @@ import express, { Application, Request, Response } from "express"; import { NextFunction } from "express"; import SocketChannels from "@nirvana/core/sockets/channels"; +import { UserService } from "./services/user.service"; +import { UserStatus } from "@nirvana/core/models"; import { connectToDatabase } from "./services/database.service"; import cors from "cors"; import getContactsRoutes from "./routes/contacts"; @@ -101,6 +103,31 @@ io.on("connection", function (socket: any) { ); }); + // change of user status to all of users' rooms and db update + socket.on( + SocketChannels.SEND_USER_STATUS_UPDATE, + async (userGoogleId: string, newStatus: UserStatus) => { + console.log("new status for user"); + + const resultUpdate = await UserService.updateUserStatus( + userGoogleId, + newStatus + ); + + // tell all rooms that the user is part of + // that this user has updated their status + if (resultUpdate?.modifiedCount) { + socket.rooms.forEach((roomId: string) => { + io.in(roomId).emit( + SocketChannels.SEND_USER_STATUS_UPDATE, + userGoogleId, + newStatus + ); + }); + } + } + ); + // ==== DISCONNECT ==== socket.on("disconnect", () => { console.log("user disconnected"); diff --git a/packages/api/services/user.service.ts b/packages/api/services/user.service.ts index 286105c..9371569 100644 --- a/packages/api/services/user.service.ts +++ b/packages/api/services/user.service.ts @@ -1,6 +1,7 @@ import { GoogleUserInfo, User } from "@nirvana/core/models"; import { ObjectId } from "mongodb"; +import { UserStatus } from "../../core/models/user.model"; import axios from "axios"; import { collections } from "./database.service"; @@ -58,8 +59,9 @@ export class UserService { } static async createUserIfNotExists(newUser: User) { - const exists = (await collections.users?.findOne({ id: newUser.googleId })) - ?._id; + const exists = ( + await collections.users?.findOne({ googleId: newUser.googleId }) + )?._id; if (!exists) { return await collections.users?.insertOne(newUser); @@ -78,4 +80,15 @@ export class UserService { ) ).data; } + + static async updateUserStatus(userGoogleId: string, newStatus: UserStatus) { + const query = { googleId: userGoogleId }; + const updateDoc = { + $set: { status: newStatus, lastUpdatedDate: new Date() }, + }; + + const resultUpdate = await collections.users?.updateOne(query, updateDoc); + + return resultUpdate; + } } diff --git a/packages/desktop/src/controller/index.tsx b/packages/desktop/src/controller/index.tsx index 4cd007f..4db2214 100644 --- a/packages/desktop/src/controller/index.tsx +++ b/packages/desktop/src/controller/index.tsx @@ -107,6 +107,9 @@ export function useGetUserDetails() { { retry: false, refetchOnWindowFocus: false, + onError: (err) => { + console.log(err); + }, } ); } diff --git a/packages/desktop/src/controller/sockets.tsx b/packages/desktop/src/controller/sockets.tsx index 655bc7e..4ea564e 100644 --- a/packages/desktop/src/controller/sockets.tsx +++ b/packages/desktop/src/controller/sockets.tsx @@ -1,6 +1,7 @@ import { useEffect, useState } from "react"; import SocketChannels from "@nirvana/core/sockets/channels"; +import { UserStatus } from "../../../core/models/user.model"; import { socket } from "../nirvanaApp"; import { useGetAllContactBasicDetails } from "./index"; @@ -62,10 +63,18 @@ export default function useSocketData() { } ); + socket.on( + SocketChannels.SEND_USER_STATUS_UPDATE, + (userGoogleId: string, newStatus: UserStatus) => { + console.log("someone updated their status...hmmm"); + } + ); + return () => { socket.removeAllListeners(SocketChannels.SEND_STARTED_SPEAKING); socket.removeAllListeners(SocketChannels.SEND_STOPPED_SPEAKING); socket.removeAllListeners(SocketChannels.SEND_AUDIO_CLIP); + socket.removeAllListeners(SocketChannels.SEND_USER_STATUS_UPDATE); }; }, []); diff --git a/packages/desktop/src/pages/Home/header/index.tsx b/packages/desktop/src/pages/Home/header/index.tsx index fbb93db..1f55295 100644 --- a/packages/desktop/src/pages/Home/header/index.tsx +++ b/packages/desktop/src/pages/Home/header/index.tsx @@ -6,6 +6,7 @@ import { useRecoilState, useSetRecoilState } from "recoil"; import { GlobalHotKeys } from "react-hotkeys"; import { STORE_ITEMS } from "../../../electron/constants"; import UserAvatarWithStatus from "../../../components/User/userAvatarWithStatus"; +import { UserStatus } from "@nirvana/core/models"; import { useGetUserDetails } from "../../../controller/index"; import { useRef } from "react"; @@ -26,10 +27,20 @@ export default function Header() { setAuthTokens(null); }; + const updateStatus = (newStatus: UserStatus) => {}; const ProfileMenu = ( + {user.status === UserStatus.online ? ( + + ) : ( + + )} ); diff --git a/packages/desktop/src/pages/Home/selectedConversation/index.tsx b/packages/desktop/src/pages/Home/selectedConversation/index.tsx index f3823ff..4b1c79d 100644 --- a/packages/desktop/src/pages/Home/selectedConversation/index.tsx +++ b/packages/desktop/src/pages/Home/selectedConversation/index.tsx @@ -39,7 +39,7 @@ export default function SelectedConversation() { $selectedConversation ); const { data: userDetailsData } = useGetUserDetails(); - const { data: convoDetailsResponse, isFetching } = + const { data: convoDetailsResponse, isLoading } = useConversationDetails(selectedConvo); const { mutate: sendContactRequest } = useSendContactRequest(); const { mutate: updateRelationshipState } = useUpdateRelationshipState(); @@ -137,10 +137,6 @@ export default function SelectedConversation() { return <>; } - if (isFetching) { - return Loading conversation details; - } - // todo: add cancel request option const sendRequest = () => { @@ -174,7 +170,7 @@ export default function SelectedConversation() { ); }; - if (isFetching) return Please wait; + if (isLoading) return Please wait; const renderMainContent = () => { // if there's no relationship, then don't show messages, show "send request" button @@ -274,6 +270,7 @@ export default function SelectedConversation() { action: "keyup", }, }; + const handlers = { CLOSE_SELECTED_CONVO: handleClose, START_RECORDING: startRecording,