Spaces:
Paused
Paused
| const { | |
| checkMembersOffUndeliveredListInMessage, | |
| } = require("../controllers/chatRoomController"); | |
| const User = require("../models/User"); | |
| exports.getSocketDetails = async (userId) => { | |
| // Get user model | |
| userModel = await User.findById(userId); | |
| // Get all rooms | |
| allRoomsUserIn = userModel.chatRooms.map((room) => room.toString()); | |
| return { userModel, allRoomsUserIn }; | |
| }; | |
| exports.onlineController = (io, socket) => { | |
| socket.on("user:online", async (userId) => { | |
| socket.userId = userId; | |
| // Get user detaiils | |
| const { userModel, allRoomsUserIn } = await this.getSocketDetails(userId); | |
| // Make user join rooms | |
| socket.join(allRoomsUserIn); | |
| // Update database on status | |
| userModel.status = { | |
| online: true, | |
| lastSeen: undefined, | |
| }; | |
| for (let properties of userModel.undeliveredMessages) { | |
| await checkMembersOffUndeliveredListInMessage({ | |
| membersId: [userId], | |
| io, | |
| ...properties, | |
| }); | |
| } | |
| userModel.undeliveredMessages = []; | |
| // Save user model | |
| await userModel.save({ validateBeforeSave: false }); | |
| // Emit user online status in all rooms user is in | |
| socket.to(allRoomsUserIn).emit("user:online", userId); | |
| }); | |
| }; | |
| exports.offlineController = (io, socket) => { | |
| socket.on("user:offline", async () => { | |
| const { userId } = socket; | |
| // Get user detaiils | |
| const { userModel, allRoomsUserIn } = await this.getSocketDetails(userId); | |
| const time = new Date(Date.now()).toISOString(); | |
| userModel.status = { | |
| online: false, | |
| lastSeen: time, | |
| }; | |
| await userModel.save({ validateBeforeSave: false }); | |
| socket | |
| .to(allRoomsUserIn) | |
| .emit("user:offline", { userId: userModel._id, time }); | |
| }); | |
| }; | |
| // socket disconnection | |
| exports.disconnectingController = (io, socket) => { | |
| socket.on("disconnecting", async () => { | |
| if (!socket.userId) return; | |
| // Get user detaiils | |
| const { userModel, allRoomsUserIn } = await this.getSocketDetails( | |
| socket.userId | |
| ); | |
| const time = new Date(Date.now()).toISOString(); | |
| userModel.status = { | |
| online: false, | |
| lastSeen: time, | |
| }; | |
| await userModel.save({ validateBeforeSave: false }); | |
| socket | |
| .to(allRoomsUserIn) | |
| .emit("user:offline", { userId: userModel._id, time }); | |
| }); | |
| }; | |
| exports.joinRoomController = (io, socket) => { | |
| socket.on("user:joinRooms", ({ rooms }) => { | |
| socket.join(rooms); | |
| }); | |
| }; | |