From d11e3768f9f803eb817b40eae71a65e0e4f052a8 Mon Sep 17 00:00:00 2001 From: Akmal Isomadinov Date: Wed, 26 Jun 2024 19:28:38 +0500 Subject: [PATCH] Client:Store:SelectionPeopleStore Added sessions logout, fixed connections --- packages/client/src/Shell.jsx | 16 ++- .../client/src/store/SelectionPeopleStore.js | 118 +++++++++++++----- 2 files changed, 98 insertions(+), 36 deletions(-) diff --git a/packages/client/src/Shell.jsx b/packages/client/src/Shell.jsx index 7e06f0db00..078a419e68 100644 --- a/packages/client/src/Shell.jsx +++ b/packages/client/src/Shell.jsx @@ -91,6 +91,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => { organizationName, setDataFromSocket, setCurrentDataFromSocket, + sessisonLogout, } = rest; const theme = useTheme(); @@ -145,7 +146,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => { socketHelper.on("statuses-in-portal", (data) => { setDataFromSocket(data); - console.log("dataFromSocket", data); + // console.log("dataFromSocket", data); }); socketHelper.on("enter-in-portal", (data) => { @@ -154,7 +155,8 @@ const Shell = ({ items = [], page = "home", ...rest }) => { }); socketHelper.on("leave-in-portal", (data) => { - setCurrentDataFromSocket(data); + sessisonLogout(data); + // setCurrentDataFromSocket(data); console.log(data); }); @@ -165,7 +167,12 @@ const Shell = ({ items = [], page = "home", ...rest }) => { socketHelper.on("leave-session-in-portal", (data) => { console.log(data); }); - }, [socketHelper, setDataFromSocket, setCurrentDataFromSocket]); + }, [ + socketHelper, + setDataFromSocket, + setCurrentDataFromSocket, + sessisonLogout, + ]); useEffect(() => { socketHelper.emit({ @@ -493,7 +500,7 @@ const ShellWrapper = inject( peopleStore, }) => { const { i18n } = useTranslation(); - const { setDataFromSocket, setCurrentDataFromSocket } = + const { setDataFromSocket, setCurrentDataFromSocket, sessisonLogout } = peopleStore.selectionStore; const { @@ -586,6 +593,7 @@ const ShellWrapper = inject( organizationName, setDataFromSocket, setCurrentDataFromSocket, + sessisonLogout, }; }, )(observer(Shell)); diff --git a/packages/client/src/store/SelectionPeopleStore.js b/packages/client/src/store/SelectionPeopleStore.js index 5a42090099..4fbad1cccb 100644 --- a/packages/client/src/store/SelectionPeopleStore.js +++ b/packages/client/src/store/SelectionPeopleStore.js @@ -32,7 +32,7 @@ import moment from "moment-timezone"; class SelectionStore { peopleStore = null; - allSessions = []; + // allSessions = []; sessionsData = []; dataFromSocket = []; currentDataFromSocket = []; @@ -472,6 +472,34 @@ class SelectionStore { this.dataFromSocket = data; }; + sessisonLogout = (userId) => { + const newData = [...this.dataFromSocket]; + + const index = newData.findIndex((data) => data.id === userId); + + if (index === -1) return; + + newData[index].status = "offline"; + + this.setDataFromSocket(newData); + }; + + setCurrentDataFromSocket = (data) => { + this.currentDataFromSocket = data; + + const newArr = [...this.dataFromSocket]; + const indexTest = newArr.findIndex(({ id }) => id === data.id); + if (indexTest === -1) return; + const { sessions, status } = data; + + newArr[indexTest] = { + ...newArr[indexTest], + sessions, + status, + }; + this.setDataFromSocket(newArr); + }; + setDisplayName = (displayName) => { this.displayName = displayName; }; @@ -496,10 +524,6 @@ class SelectionStore { this.isLoading = isLoading; }; - setCurrentDataFromSocket = (data) => { - this.currentDataFromSocket = data; - }; - setFromDateAgo = (sessionId, value) => { this.fromDateAgo[sessionId] = value; }; @@ -520,38 +544,69 @@ class SelectionStore { return parsedDate.format(locale); }; - updateAllSessions = (sessions, dataFromSocket, currentDataFromSocket) => { - const socketDataMap = new Map( - dataFromSocket.map((user) => [user.id, user]), - ); - const filteredSessions = sessions.filter((session) => { - const socketData = socketDataMap.get(session.id); - return ( - socketData && socketData.sessions && socketData.sessions.length > 0 - ); - }); + getCurrentConnections = (session, data) => { + const { sessions, id } = this.currentDataFromSocket ?? {}; + const [first, ...other] = session.connections; + const [firstSessions] = sessions ?? []; + const isCurrentSesstion = session.id === id; - const newAllSessions = filteredSessions.map((session) => { - const socketData = socketDataMap.get(session.id); - const currentSocketData = - currentDataFromSocket && currentDataFromSocket.id === session.id - ? currentDataFromSocket - : null; + const connectionsIsEmpty = session.connections.length === 0; - const latestData = currentSocketData || socketData; + if (isCurrentSesstion) + return [ + { ...first, ...firstSessions, date: moment().utc().toISOString() }, + ...other, + ]; - return { - ...session, - status: latestData ? latestData.status : "offline", - sessions: latestData ? latestData.sessions.slice(-1)[0] : [], - }; - }); + if (connectionsIsEmpty) return [data.sessions.at(-1)]; - runInAction(() => { - this.setAllSessions(newAllSessions); - }); + return session.connections; }; + get allSessions() { + const dataFromSocketMap = this.dataFromSocket.reduce((map, data) => { + map[data.id] = data; + return map; + }, {}); + + const temp = this.sessionsData.map((session) => { + const data = dataFromSocketMap[session.id]; + + const connections = this.getCurrentConnections(session, data); + + return { ...data, ...session, connections }; + }); + + return temp; + } + + // updateAllSessions = (sessionsData, dataFromSocket, currentDataFromSocket) => { + // const newAllSessions = []; + + // sessionsData.forEach((session) => { + // const socketData = dataFromSocket.find((user) => user.id === session.id); + + // if (socketData && socketData.sessions && socketData.sessions.length > 0) { + // const isCurrentSession = + // currentDataFromSocket && currentDataFromSocket.id === session.id; + + // const latestData = isCurrentSession + // ? currentDataFromSocket + // : socketData; + + // newAllSessions.push({ + // ...session, + // status: latestData ? latestData.status : "offline", + // sessions: latestData ? latestData.sessions.slice(-1)[0] : [], + // }); + // } + // }); + + // runInAction(() => { + // this.setAllSessions(newAllSessions); + // }); + // }; + fetchData = async () => { const { getUserSessionsById } = this.settingsSetupStore; const { getUsersList } = this.peopleStore.usersStore; @@ -563,7 +618,6 @@ class SelectionStore { const sessions = await Promise.all(sessionsPromises); this.setSessionsData(sessions); - this.updateAllSessions(sessions, this.dataFromSocket); } catch (error) { console.error(error); }