diff --git a/src/app/slices/contacts.js b/src/app/slices/contacts.js
new file mode 100644
index 00000000..ba41040b
--- /dev/null
+++ b/src/app/slices/contacts.js
@@ -0,0 +1,26 @@
+import { createSlice } from "@reduxjs/toolkit";
+const initialState = [];
+const contactsSlice = createSlice({
+ name: `contacts`,
+ initialState,
+ reducers: {
+ setContacts(state, action) {
+ console.log("set Contacts store", state);
+ const contacts = action.payload || [];
+ return contacts;
+ },
+ updateUsersStatus(state, action) {
+ const onlines = action.payload;
+ onlines.forEach((item) => {
+ const { uid, online = false } = item;
+ const curr = state.find(({ uid: id }) => id == uid);
+ console.log("update user status", curr, online);
+ if (curr) {
+ curr.online = online;
+ }
+ });
+ },
+ },
+});
+export const { setContacts, updateUsersStatus } = contactsSlice.actions;
+export default contactsSlice.reducer;
diff --git a/src/app/store.with.persist.js b/src/app/store.with.persist.js
index 6ee227f1..66630b97 100644
--- a/src/app/store.with.persist.js
+++ b/src/app/store.with.persist.js
@@ -13,6 +13,7 @@ import {
import authDataReducer from "./slices/auth.data";
import uiReducer from "./slices/ui";
import channelsReducer from "./slices/channels";
+import contactsReducer from "./slices/contacts";
import channelMsgReducer from "./slices/message.channel";
import userMsgReducer from "./slices/message.user";
import { authApi } from "./services/auth";
@@ -28,6 +29,7 @@ const persistedReducer = persistReducer(
persistConfig,
combineReducers({
ui: uiReducer,
+ contacts: contactsReducer,
channels: channelsReducer,
userMsg: userMsgReducer,
channelMsg: channelMsgReducer,
@@ -53,4 +55,27 @@ const store = configureStore({
),
});
setupListeners(store.dispatch);
+// export function swapToUserStore(userId) {
+// console.log({ userId });
+// const newConfig = {
+// ...persistConfig,
+// keyPrefix: userId,
+// };
+// store.replaceReducer(
+// persistReducer(
+// newConfig,
+// combineReducers({
+// ui: uiReducer,
+// channels: channelsReducer,
+// userMsg: userMsgReducer,
+// channelMsg: channelMsgReducer,
+// authData: authDataReducer,
+// [authApi.reducerPath]: authApi.reducer,
+// [contactApi.reducerPath]: contactApi.reducer,
+// [channelApi.reducerPath]: channelApi.reducer,
+// [serverApi.reducerPath]: serverApi.reducer,
+// })
+// )
+// );
+// }
export default store;
diff --git a/src/common/component/NotificationHub.js b/src/common/component/NotificationHub.js
index 2b9bea4a..a2f707e6 100644
--- a/src/common/component/NotificationHub.js
+++ b/src/common/component/NotificationHub.js
@@ -10,6 +10,7 @@ import {
addChannel,
deleteChannel,
} from "../../app/slices/channels";
+import { updateUsersStatus } from "../../app/slices/contacts";
import {
clearAuthData,
setUsersVersion,
@@ -71,6 +72,14 @@ const NotificationHub = ({ token, usersVersion = 0, afterMid = 0 }) => {
dispatch(setUsersVersion({ version }));
}
break;
+ case "users_state":
+ case "users_state_changed":
+ {
+ let { type, ...rest } = data;
+ const onlines = type == "users_state_changed" ? [rest] : rest.users;
+ dispatch(updateUsersStatus(onlines));
+ }
+ break;
case "kick":
{
console.log("kicked");
diff --git a/src/common/hook/useFilteredUsers.js b/src/common/hook/useFilteredUsers.js
index 06f450e3..4b62a946 100644
--- a/src/common/hook/useFilteredUsers.js
+++ b/src/common/hook/useFilteredUsers.js
@@ -1,9 +1,8 @@
import { useState, useEffect } from "react";
-import { useGetContactsQuery } from "../../app/services/contact";
-
+import { useSelector } from "react-redux";
export default function useFilteredUsers() {
const [input, setInput] = useState("");
- const { data: contacts } = useGetContactsQuery();
+ const contacts = useSelector((store) => store.contacts);
const [filteredUsers, setFilteredUsers] = useState(contacts);
useEffect(() => {
if (!input) {
diff --git a/src/routes/chat/ChannelChat/index.js b/src/routes/chat/ChannelChat/index.js
index 4916f035..eea1cf84 100644
--- a/src/routes/chat/ChannelChat/index.js
+++ b/src/routes/chat/ChannelChat/index.js
@@ -10,7 +10,6 @@ import {
clearChannelMsgUnread,
setLastAccessTime,
} from "../../../app/slices/message.channel";
-import { useGetContactsQuery } from "../../../app/services/contact";
import Contact from "../../../common/component/Contact";
import Layout from "../Layout";
import {
@@ -29,10 +28,9 @@ export default function ChannelChat({
// const containerRef = useRef(null);
const [dragFiles, setDragFiles] = useState([]);
const dispatch = useDispatch();
- const msgs = useSelector((store) => {
- return store.channelMsg[cid] || {};
+ const { msgs, users } = useSelector((store) => {
+ return { msgs: store.channelMsg[cid] || {}, users: store.contacts };
});
- const { data: users } = useGetContactsQuery();
const handleClearUnreads = () => {
dispatch(clearChannelMsgUnread(cid));
};
diff --git a/src/routes/chat/DMChat/index.js b/src/routes/chat/DMChat/index.js
index b0e31786..e3de2f28 100644
--- a/src/routes/chat/DMChat/index.js
+++ b/src/routes/chat/DMChat/index.js
@@ -3,7 +3,6 @@ import { useSelector } from "react-redux";
import Message from "../../../common/component/Message";
import Send from "../../../common/component/Send";
import Contact from "../../../common/component/Contact";
-import { useGetContactsQuery } from "../../../app/services/contact";
import Layout from "../Layout";
import { StyledHeader, StyledDMChat } from "./styled";
@@ -11,10 +10,10 @@ import { StyledHeader, StyledDMChat } from "./styled";
export default function DMChat({ uid = "", dropFiles = [] }) {
console.log("dm files", dropFiles);
const [dragFiles, setDragFiles] = useState([]);
+ const contacts = useSelector((store) => store.contacts);
const msgs = useSelector((store) => {
return store.userMsg[uid] || {};
});
- const { data: contacts } = useGetContactsQuery();
const [currUser, setCurrUser] = useState(null);
useEffect(() => {
console.log({ uid });
diff --git a/src/routes/chat/index.js b/src/routes/chat/index.js
index dfc652fb..6fca943a 100644
--- a/src/routes/chat/index.js
+++ b/src/routes/chat/index.js
@@ -6,7 +6,6 @@ import { useSelector } from "react-redux";
import { MdAdd } from "react-icons/md";
import { AiOutlineCaretDown } from "react-icons/ai";
-import { useGetContactsQuery } from "../../app/services/contact";
import StyledWrapper from "./styled";
import Search from "../../common/component/Search";
import Avatar from "../../common/component/Avatar";
@@ -31,7 +30,7 @@ export default function ChatPage() {
const [channelModalVisible, setChannelModalVisible] = useState(false);
const [contactsModalVisible, setContactsModalVisible] = useState(false);
const { channel_id, user_id } = useParams();
- const { data: contacts } = useGetContactsQuery();
+ const contacts = useSelector((store) => store.contacts);
const toggleContactsModalVisible = () => {
setContactsModalVisible((prev) => !prev);
};
@@ -121,7 +120,7 @@ export default function ChatPage() {