@ -1,4 +1,5 @@
// @flow
import { type Dispatch } from 'redux' ;
import { APP _WILL _MOUNT , APP _WILL _UNMOUNT } from '../base/app' ;
import {
@ -35,6 +36,7 @@ import { closeChat } from './actions.any';
import { ChatPrivacyDialog } from './components' ;
import {
INCOMING _MSG _SOUND _ID ,
LOBBY _CHAT _MESSAGE ,
MESSAGE _TYPE _ERROR ,
MESSAGE _TYPE _LOCAL ,
MESSAGE _TYPE _REMOTE
@ -122,7 +124,7 @@ MiddlewareRegistry.register(store => next => action => {
case SEND _MESSAGE : {
const state = store . getState ( ) ;
const { conference } = state [ 'features/base/conference' ] ;
const conference = getCurrentConference ( state ) ;
if ( conference ) {
// There may be cases when we intend to send a private message but we forget to set the
@ -137,13 +139,20 @@ MiddlewareRegistry.register(store => next => action => {
} else {
// Sending the message if privacy notice doesn't need to be shown.
const { privateMessageRecipient } = state [ 'features/chat' ] ;
const { privateMessageRecipient , isLobbyChatActive , lobbyMessageRecipient }
= state [ 'features/chat' ] ;
if ( typeof APP !== 'undefined' ) {
APP . API . notifySendingChatMessage ( action . message , Boolean ( privateMessageRecipient ) ) ;
}
if ( privateMessageRecipient ) {
if ( isLobbyChatActive && lobbyMessageRecipient ) {
conference . sendLobbyMessage ( {
type : LOBBY _CHAT _MESSAGE ,
message : action . message
} , lobbyMessageRecipient . id ) ;
_persistSentPrivateMessage ( store , lobbyMessageRecipient . id , action . message , true ) ;
} else if ( privateMessageRecipient ) {
conference . sendPrivateTextMessage ( privateMessageRecipient . id , action . message ) ;
_persistSentPrivateMessage ( store , privateMessageRecipient . id , action . message ) ;
} else {
@ -159,7 +168,8 @@ MiddlewareRegistry.register(store => next => action => {
id : localParticipant . id ,
message : action . message ,
privateMessage : false ,
timestamp : Date . now ( )
timestamp : Date . now ( ) ,
lobbyChat : false
} , false , true ) ;
}
}
@ -220,6 +230,7 @@ function _addChatMsgListener(conference, store) {
id ,
message ,
privateMessage : false ,
lobbyChat : false ,
timestamp
} ) ;
}
@ -232,6 +243,7 @@ function _addChatMsgListener(conference, store) {
id ,
message ,
privateMessage : true ,
lobbyChat : false ,
timestamp
} ) ;
}
@ -258,6 +270,7 @@ function _addChatMsgListener(conference, store) {
id : _id ,
message : getReactionMessageFromBuffer ( eventData . reactions ) ,
privateMessage : false ,
lobbyChat : false ,
timestamp : eventData . timestamp
} , false , true ) ;
}
@ -287,6 +300,49 @@ function _handleChatError({ dispatch }, error) {
} ) ) ;
}
/ * *
* Function to handle an incoming chat message from lobby room .
*
* @ param { string } message - The message received .
* @ param { string } participantId - The participant id .
* @ returns { Function }
* /
export function handleLobbyMessageReceived ( message : string , participantId : string ) {
return async ( dispatch : Dispatch < any > , getState : Function ) => {
_handleReceivedMessage ( { dispatch ,
getState } , { id : participantId ,
message ,
privateMessage : false ,
lobbyChat : true ,
timestamp : Date . now ( ) } ) ;
} ;
}
/ * *
* Function to get lobby chat user display name .
*
* @ param { Store } state - The Redux store .
* @ param { string } id - The knocking participant id .
* @ returns { string }
* /
function getLobbyChatDisplayName ( state , id ) {
const { knockingParticipants } = state [ 'features/lobby' ] ;
const { lobbyMessageRecipient } = state [ 'features/chat' ] ;
if ( id === lobbyMessageRecipient . id ) {
return lobbyMessageRecipient . name ;
}
const knockingParticipant = knockingParticipants . find ( p => p . id === id ) ;
if ( knockingParticipant ) {
return knockingParticipant . name ;
}
}
/ * *
* Function to handle an incoming chat message .
*
@ -297,7 +353,7 @@ function _handleChatError({ dispatch }, error) {
* @ returns { void }
* /
function _handleReceivedMessage ( { dispatch , getState } ,
{ id , message , privateMessage , timestamp } ,
{ id , message , privateMessage , timestamp , lobbyChat } ,
shouldPlaySound = true ,
isReaction = false
) {
@ -316,7 +372,9 @@ function _handleReceivedMessage({ dispatch, getState },
const participant = getParticipantById ( state , id ) || { } ;
const localParticipant = getLocalParticipant ( getState ) ;
const displayName = getParticipantDisplayName ( state , id ) ;
const displayName = lobbyChat
? getLobbyChatDisplayName ( state , id )
: getParticipantDisplayName ( state , id ) ;
const hasRead = participant . local || isChatOpen ;
const timestampToDate = timestamp ? new Date ( timestamp ) : new Date ( ) ;
const millisecondsTimestamp = timestampToDate . getTime ( ) ;
@ -332,6 +390,7 @@ function _handleReceivedMessage({ dispatch, getState },
messageType : participant . local ? MESSAGE _TYPE _LOCAL : MESSAGE _TYPE _REMOTE ,
message ,
privateMessage ,
lobbyChat ,
recipient : getParticipantDisplayName ( state , localParticipant . id ) ,
timestamp : millisecondsTimestamp ,
isReaction
@ -371,11 +430,14 @@ function _handleReceivedMessage({ dispatch, getState },
* @ param { Store } store - The Redux store .
* @ param { string } recipientID - The ID of the recipient the private message was sent to .
* @ param { string } message - The sent message .
* @ param { boolean } isLobbyPrivateMessage - Is a lobby message .
* @ returns { void }
* /
function _persistSentPrivateMessage ( { dispatch , getState } , recipientID , message ) {
const localParticipant = getLocalParticipant ( getState ) ;
const displayName = getParticipantDisplayName ( getState , localParticipant . id ) ;
function _persistSentPrivateMessage ( { dispatch , getState } , recipientID , message , isLobbyPrivateMessage = false ) {
const state = getState ( ) ;
const localParticipant = getLocalParticipant ( state ) ;
const displayName = getParticipantDisplayName ( state , localParticipant . id ) ;
const { lobbyMessageRecipient } = state [ 'features/chat' ] ;
dispatch ( addMessage ( {
displayName ,
@ -383,8 +445,11 @@ function _persistSentPrivateMessage({ dispatch, getState }, recipientID, message
id : localParticipant . id ,
messageType : MESSAGE _TYPE _LOCAL ,
message ,
privateMessage : true ,
recipient : getParticipantDisplayName ( getState , recipientID ) ,
privateMessage : ! isLobbyPrivateMessage ,
lobbyChat : isLobbyPrivateMessage ,
recipient : isLobbyPrivateMessage
? lobbyMessageRecipient && lobbyMessageRecipient . name
: getParticipantDisplayName ( getState , recipientID ) ,
timestamp : Date . now ( )
} ) ) ;
}