@@ -41,6 +41,8 @@ qx.Class.define("osparc.data.model.Conversation", {
4141
4242 this . __messages = [ ] ;
4343 this . __fetchLastMessage ( ) ;
44+
45+ this . __listenToConversationMessageWS ( ) ;
4446 } ,
4547
4648 statics : {
@@ -132,6 +134,12 @@ qx.Class.define("osparc.data.model.Conversation", {
132134 } ,
133135 } ,
134136
137+ events : {
138+ "messageAdded" : "qx.event.type.Data" ,
139+ "messageUpdated" : "qx.event.type.Data" ,
140+ "messageDeleted" : "qx.event.type.Data" ,
141+ } ,
142+
135143 members : {
136144 __fetchLastMessagePromise : null ,
137145 __nextRequestParams : null ,
@@ -150,6 +158,35 @@ qx.Class.define("osparc.data.model.Conversation", {
150158 }
151159 } ,
152160
161+ __listenToConversationMessageWS : function ( ) {
162+ [
163+ this . self ( ) . CHANNELS . CONVERSATION_MESSAGE_CREATED ,
164+ this . self ( ) . CHANNELS . CONVERSATION_MESSAGE_UPDATED ,
165+ this . self ( ) . CHANNELS . CONVERSATION_MESSAGE_DELETED ,
166+ ] . forEach ( eventName => {
167+ const eventHandler = message => {
168+ if ( message ) {
169+ const conversationId = message [ "conversationId" ] ;
170+ if ( conversationId === this . getConversationId ( ) ) {
171+ switch ( eventName ) {
172+ case osparc . data . model . Conversation . CHANNELS . CONVERSATION_MESSAGE_CREATED :
173+ this . addMessage ( message ) ;
174+ break ;
175+ case osparc . data . model . Conversation . CHANNELS . CONVERSATION_MESSAGE_UPDATED :
176+ this . updateMessage ( message ) ;
177+ break ;
178+ case osparc . data . model . Conversation . CHANNELS . CONVERSATION_MESSAGE_DELETED :
179+ this . deleteMessage ( message ) ;
180+ break ;
181+ }
182+ }
183+ }
184+ } ;
185+ socket . on ( eventName , eventHandler , this ) ;
186+ this . __wsHandlers . push ( { eventName, handler : eventHandler } ) ;
187+ } ) ;
188+ } ,
189+
153190 __fetchLastMessage : function ( ) {
154191 if ( this . __fetchLastMessagePromise ) {
155192 return this . __fetchLastMessagePromise ;
@@ -212,13 +249,34 @@ qx.Class.define("osparc.data.model.Conversation", {
212249 const found = this . __messages . find ( msg => msg [ "messageId" ] === message [ "messageId" ] ) ;
213250 if ( ! found ) {
214251 this . __messages . push ( message ) ;
252+ this . fireDataEvent ( "messageAdded" , message ) ;
215253 }
216254 // latest first
217255 this . __messages . sort ( ( a , b ) => new Date ( b . created ) - new Date ( a . created ) ) ;
218256 this . setLastMessage ( this . __messages [ 0 ] ) ;
219257 }
220258 } ,
221259
260+ updateMessage : function ( message ) {
261+ if ( message ) {
262+ const found = this . __messages . find ( msg => msg [ "messageId" ] === message [ "messageId" ] ) ;
263+ if ( found ) {
264+ Object . assign ( found , message ) ;
265+ this . fireDataEvent ( "messageUpdated" , found ) ;
266+ }
267+ }
268+ } ,
269+
270+ deleteMessage : function ( message ) {
271+ if ( message ) {
272+ const found = this . __messages . find ( msg => msg [ "messageId" ] === message [ "messageId" ] ) ;
273+ if ( found ) {
274+ this . __messages . remove ( found ) ;
275+ this . fireDataEvent ( "messageDeleted" , found ) ;
276+ }
277+ }
278+ } ,
279+
222280 getContextProjectId : function ( ) {
223281 if ( this . getExtraContext ( ) && "projectId" in this . getExtraContext ( ) ) {
224282 return this . getExtraContext ( ) [ "projectId" ] ;
0 commit comments