JSFiddle - React, Tailwind, and code Playground

by Vladymyr Shevchuk

JavaScript

export default (action$, state$) => action$.pipe(
  ofType(MESSAGE_MARK_READ_REQUEST),
  mergeMap(({ payload: { conversationId } }) => {
    const { userId } = state$.value.authentication;
    const { messages: { byHash, byId } } = state$.value.conversations.byHash[conversationId];

    const allowedTypes = ['message', 'secret', 'set_members', 'leave', 'title'];
    
    const lastMessageId = byId.find(id => {
      const { type } = byHash[id];
    
      return allowedTypes.includes(type);    
    });
    
    const lastMessage = get(byHash, lastMessageId, {});
    const lastMessageRead = get(lastMessage, 'read', []);
    const topic = `futurechat/conversation/${conversationId}/${userId}/member/read`;
    
    const message = {
      id: lastMessageId,
      type: 'read',
      sentAt: (new Date()).toISOString(),
      createdAt: lastMessage.createdAt,
    };
    
    return 
      lastMessageRead.includes(userId) 
      ? []
      : [
          mqttMessagePublishRequest(topic, message, conversationId),
          messageMarkReadSuccess(conversationId),
        ];
  }),
);


===