Remove shared state in the chat provider to let the class state be in sync
This commit is contained in:
parent
d7fb003ad9
commit
c79afff162
|
|
@ -40,8 +40,6 @@ export const ChatAside = () => {
|
||||||
}
|
}
|
||||||
}, [chatHistory?.length]);
|
}, [chatHistory?.length]);
|
||||||
|
|
||||||
const isLocalUser = (id) => id === localParticipant.user_id;
|
|
||||||
|
|
||||||
if (!showAside || showAside !== CHAT_ASIDE) {
|
if (!showAside || showAside !== CHAT_ASIDE) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -51,7 +49,7 @@ export const ChatAside = () => {
|
||||||
<div className="messages-container" ref={chatWindowRef}>
|
<div className="messages-container" ref={chatWindowRef}>
|
||||||
{chatHistory?.map((chatItem) => (
|
{chatHistory?.map((chatItem) => (
|
||||||
<div
|
<div
|
||||||
className={isLocalUser(chatItem.senderID) ? 'message local' : 'message'}
|
className={chatItem.isLocal ? 'message local' : 'message'}
|
||||||
key={chatItem.id}
|
key={chatItem.id}
|
||||||
>
|
>
|
||||||
<span className="content">{chatItem.message}</span>
|
<span className="content">{chatItem.message}</span>
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import React, {
|
||||||
useState,
|
useState,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import { useCallState } from '@custom/shared/contexts/CallProvider';
|
import { useCallState } from '@custom/shared/contexts/CallProvider';
|
||||||
import { useSharedState } from '@custom/shared/hooks/useSharedState';
|
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
|
@ -14,12 +13,7 @@ export const ChatContext = createContext();
|
||||||
|
|
||||||
export const ChatProvider = ({ children }) => {
|
export const ChatProvider = ({ children }) => {
|
||||||
const { callObject } = useCallState();
|
const { callObject } = useCallState();
|
||||||
const { sharedState, setSharedState } = useSharedState({
|
const [chatHistory, setChatHistory] = useState([]);
|
||||||
initialValues: {
|
|
||||||
chatHistory: [],
|
|
||||||
},
|
|
||||||
broadcast: false,
|
|
||||||
});
|
|
||||||
const [hasNewMessages, setHasNewMessages] = useState(false);
|
const [hasNewMessages, setHasNewMessages] = useState(false);
|
||||||
|
|
||||||
const handleNewMessage = useCallback(
|
const handleNewMessage = useCallback(
|
||||||
|
|
@ -30,51 +24,44 @@ export const ChatProvider = ({ children }) => {
|
||||||
? participants[e.fromId].user_name
|
? participants[e.fromId].user_name
|
||||||
: 'Guest';
|
: 'Guest';
|
||||||
|
|
||||||
setSharedState(values => ({
|
setChatHistory((oldState) => [
|
||||||
...values,
|
...oldState,
|
||||||
chatHistory: [
|
{ sender, message: e.data.message, id: nanoid() },
|
||||||
...values?.chatHistory,
|
]);
|
||||||
// nanoid - we use it to generate unique ID string
|
|
||||||
{ sender, senderID: e.fromId, message: e.data.message, id: nanoid() },
|
|
||||||
]
|
|
||||||
}));
|
|
||||||
|
|
||||||
setHasNewMessages(true);
|
setHasNewMessages(true);
|
||||||
},
|
},
|
||||||
[callObject, setSharedState]
|
[callObject]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
const sendMessage = useCallback(
|
const sendMessage = useCallback(
|
||||||
(message) => {
|
(message) => {
|
||||||
if (!callObject) return;
|
if (!callObject) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
console.log('💬 Sending app message');
|
console.log('💬 Sending app message');
|
||||||
|
|
||||||
callObject.sendAppMessage({ message }, '*');
|
callObject.sendAppMessage({ message }, '*');
|
||||||
|
|
||||||
const participants = callObject.participants();
|
|
||||||
// Get the sender (local participant) name
|
// Get the sender (local participant) name
|
||||||
const sender = participants.local.user_name
|
const sender = callObject.participants().local.user_name
|
||||||
? participants.local.user_name
|
? callObject.participants().local.user_name
|
||||||
: 'Guest';
|
: 'Guest';
|
||||||
const senderID = participants.local.user_id;
|
|
||||||
|
|
||||||
// Update shared state chat history
|
// Update local chat history
|
||||||
return setSharedState(values => ({
|
return setChatHistory((oldState) => [
|
||||||
...values,
|
...oldState,
|
||||||
chatHistory: [
|
{ sender, message, id: nanoid(), isLocal: true },
|
||||||
...values?.chatHistory,
|
]);
|
||||||
// nanoid - we use it to generate unique ID string
|
|
||||||
{ sender, senderID, message, id: nanoid() }
|
|
||||||
]
|
|
||||||
}));
|
|
||||||
},
|
},
|
||||||
[callObject, setSharedState]
|
[callObject]
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!callObject) return;
|
if (!callObject) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
console.log(`💬 Chat provider listening for app messages`);
|
console.log(`💬 Chat provider listening for app messages`);
|
||||||
|
|
||||||
|
|
@ -87,7 +74,7 @@ export const ChatProvider = ({ children }) => {
|
||||||
<ChatContext.Provider
|
<ChatContext.Provider
|
||||||
value={{
|
value={{
|
||||||
sendMessage,
|
sendMessage,
|
||||||
chatHistory: sharedState.chatHistory,
|
chatHistory,
|
||||||
hasNewMessages,
|
hasNewMessages,
|
||||||
setHasNewMessages,
|
setHasNewMessages,
|
||||||
}}
|
}}
|
||||||
|
|
@ -101,4 +88,4 @@ ChatProvider.propTypes = {
|
||||||
children: PropTypes.node,
|
children: PropTypes.node,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useChat = () => useContext(ChatContext);
|
export const useChat = () => useContext(ChatContext);
|
||||||
Loading…
Reference in New Issue