1717 *
1818 */
1919
20- import { CONVERSATION_EVENT } from '@wireapp/api-client/src/event/' ;
20+ import { CONVERSATION_EVENT , ConversationEvent } from '@wireapp/api-client/src/event/' ;
2121import { LinkPreview , ITweet , Mention } from '@wireapp/protocol-messaging' ;
2222
2323import { getLogger , Logger } from 'Util/Logger' ;
@@ -64,6 +64,7 @@ import type {Text as TextAsset} from '../entity/message/Text';
6464import type { LinkPreviewMetaDataType } from '../links/LinkPreviewMetaDataType' ;
6565import { LinkPreview as LinkPreviewEntity } from '../entity/message/LinkPreview' ;
6666import { CallingTimeoutMessage } from '../entity/message/CallingTimeoutMessage' ;
67+ import { MemberJoinEvent , MemberLeaveEvent , TeamMemberLeaveEvent } from './EventBuilder' ;
6768
6869// Event Mapper to convert all server side JSON events into core entities.
6970export class EventMapper {
@@ -192,17 +193,17 @@ export class EventMapper {
192193 * @param conversationEntity Conversation entity the event belong to
193194 * @returns Mapped message entity
194195 */
195- async _mapJsonEvent ( event : EventRecord , conversationEntity : Conversation ) {
196+ async _mapJsonEvent ( event : ConversationEvent | EventRecord , conversationEntity : Conversation ) {
196197 let messageEntity ;
197198
198199 switch ( event . type ) {
199200 case CONVERSATION_EVENT . MEMBER_JOIN : {
200- messageEntity = this . _mapEventMemberJoin ( event , conversationEntity ) ;
201+ messageEntity = this . _mapEventMemberJoin ( event as MemberJoinEvent , conversationEntity ) ;
201202 break ;
202203 }
203204
204205 case CONVERSATION_EVENT . MEMBER_LEAVE : {
205- messageEntity = this . _mapEventMemberLeave ( event ) ;
206+ messageEntity = this . _mapEventMemberLeave ( event as MemberLeaveEvent ) ;
206207 break ;
207208 }
208209
@@ -285,7 +286,7 @@ export class EventMapper {
285286 }
286287
287288 case ClientEvent . CONVERSATION . TEAM_MEMBER_LEAVE : {
288- messageEntity = this . _mapEventTeamMemberLeave ( event ) ;
289+ messageEntity = this . _mapEventTeamMemberLeave ( event as TeamMemberLeaveEvent ) ;
289290 break ;
290291 }
291292
@@ -310,20 +311,33 @@ export class EventMapper {
310311 }
311312
312313 default : {
313- this . logger . warn ( `Ignored unhandled '${ event . type } ' event ${ event . id ? `'${ event . id } ' ` : '' } ` , event ) ;
314+ const { type, id} = event as EventRecord ;
315+ this . logger . warn ( `Ignored unhandled '${ type } ' event ${ id ? `'${ id } ' ` : '' } ` , event ) ;
314316 throw new ConversationError (
315317 ConversationError . TYPE . MESSAGE_NOT_FOUND ,
316318 ConversationError . MESSAGE . MESSAGE_NOT_FOUND ,
317319 ) ;
318320 }
319321 }
320322
321- const { category, data, from, id, primary_key, time, type, version} = event ;
323+ const {
324+ category,
325+ data,
326+ from,
327+ id,
328+ primary_key,
329+ time,
330+ type,
331+ version,
332+ from_client_id,
333+ ephemeral_expires,
334+ ephemeral_started,
335+ } = event as EventRecord ;
322336
323337 messageEntity . category = category ;
324338 messageEntity . conversation_id = conversationEntity . id ;
325339 messageEntity . from = from ;
326- messageEntity . fromClientId = event . from_client_id ;
340+ messageEntity . fromClientId = from_client_id ;
327341 messageEntity . id = id ;
328342 messageEntity . primary_key = primary_key ;
329343 messageEntity . timestamp ( new Date ( time ) . getTime ( ) ) ;
@@ -335,20 +349,21 @@ export class EventMapper {
335349 }
336350
337351 if ( messageEntity . isContent ( ) || messageEntity . isPing ( ) ) {
338- messageEntity . status ( event . status || StatusType . SENT ) ;
352+ messageEntity . status ( ( event as EventRecord ) . status || StatusType . SENT ) ;
339353 }
340354
341355 if ( messageEntity . isComposite ( ) ) {
342- messageEntity . selectedButtonId ( event . selected_button_id ) ;
343- messageEntity . waitingButtonId ( event . waiting_button_id ) ;
356+ const { selected_button_id, waiting_button_id} = event as EventRecord ;
357+ messageEntity . selectedButtonId ( selected_button_id ) ;
358+ messageEntity . waitingButtonId ( waiting_button_id ) ;
344359 }
345360 if ( messageEntity . isReactable ( ) ) {
346- ( messageEntity as ContentMessage ) . reactions ( event . reactions || { } ) ;
361+ ( messageEntity as ContentMessage ) . reactions ( ( event as EventRecord ) . reactions || { } ) ;
347362 }
348363
349- if ( event . ephemeral_expires ) {
350- messageEntity . ephemeral_expires ( event . ephemeral_expires ) ;
351- messageEntity . ephemeral_started ( Number ( event . ephemeral_started ) || 0 ) ;
364+ if ( ephemeral_expires ) {
365+ messageEntity . ephemeral_expires ( ephemeral_expires ) ;
366+ messageEntity . ephemeral_started ( Number ( ephemeral_started ) || 0 ) ;
352367 }
353368
354369 if ( isNaN ( messageEntity . timestamp ( ) ) ) {
@@ -460,9 +475,13 @@ export class EventMapper {
460475 * @param conversationEntity Conversation entity the event belong to
461476 * @returns Member message entity
462477 */
463- private _mapEventMemberJoin ( event : EventRecord , conversationEntity : Conversation ) {
478+ private _mapEventMemberJoin (
479+ event : MemberJoinEvent & { data : { has_service ?: boolean } } ,
480+ conversationEntity : Conversation ,
481+ ) {
464482 const { data : eventData , from : sender } = event ;
465- const { has_service : hasService , user_ids : userIds } = eventData ;
483+ const { has_service : hasService } = eventData ;
484+ const userIds = eventData . qualified_user_ids || eventData . user_ids . map ( id => ( { domain : null , id} ) ) ;
466485
467486 const messageEntity = new MemberMessage ( ) ;
468487
@@ -471,7 +490,7 @@ export class EventMapper {
471490
472491 if ( conversationEntity . isGroup ( ) ) {
473492 const messageFromCreator = sender === conversationEntity . creator ;
474- const creatorIndex = userIds . indexOf ( sender ) ;
493+ const creatorIndex = userIds . findIndex ( user => user . id === sender ) ;
475494 const creatorIsJoiningMember = messageFromCreator && creatorIndex !== - 1 ;
476495
477496 if ( creatorIsJoiningMember ) {
@@ -495,9 +514,10 @@ export class EventMapper {
495514 * @param eventData Message data
496515 * @returns Member message entity
497516 */
498- private _mapEventMemberLeave ( { data : eventData } : EventRecord ) {
517+ private _mapEventMemberLeave ( { data : eventData } : MemberLeaveEvent ) {
499518 const messageEntity = new MemberMessage ( ) ;
500- messageEntity . userIds ( eventData . user_ids ) ;
519+ const userIds = eventData . qualified_user_ids || eventData . user_ids . map ( id => ( { domain : null , id} ) ) ;
520+ messageEntity . userIds ( userIds ) ;
501521 messageEntity . reason = eventData . reason ;
502522 return messageEntity ;
503523 }
@@ -596,7 +616,7 @@ export class EventMapper {
596616 * @param event Message data
597617 * @returns Member message entity
598618 */
599- private _mapEventTeamMemberLeave ( event : EventRecord ) {
619+ private _mapEventTeamMemberLeave ( event : MemberLeaveEvent ) {
600620 const messageEntity = this . _mapEventMemberLeave ( event ) ;
601621 const eventData = event . data ;
602622 messageEntity . name ( eventData . name || t ( 'conversationSomeone' ) ) ;
0 commit comments