Home > Software engineering >  How to check multiconditions to concatenate an observable with rxjs
How to check multiconditions to concatenate an observable with rxjs

Time:02-25

I would like to make check condition on message which is an observable and to costumize the output like this scenerio : check if the messsage is to me or from me and concatenate 20 first caracters with the name of friend or if it is my message with you chech the type of message if it is a photo or file to make a message you sent an attament for example

getLastMessage(onlineUserModel: OnlineUserModel): Observable<string> {
    let message: Observable<string>;
   
    const messageModel = this.allDirectMessages$
      .pipe(
        map((x) =>
          x.filter(
            (f) =>
              f.messageModel.to.userName === onlineUserModel.userName ||
              f.messageModel.from.userName === onlineUserModel.userName
          )
        )
      )
      .pipe(map((data) => data[data.length - 1].messageModel))
      .pipe(
        map((item) => {
          if (item.to.userName == onlineUserModel.userName) {
            message = concat("You", item.content, "...");
          }
          else (item.to.userName == onlineUserModel.userName) {
            message = concat("You", item.content, "...");
          }
        })
      );

   
    return message;
  }

CodePudding user response:

If you want to return the message as an Observable<string> you can do something like this:

getLastMessage(onlineUserModel: OnlineUserModel): Observable<string> {   
  return this.allDirectMessages$
    .pipe(
      filter((f) =>
          f.messageModel.to.userName === onlineUserModel.userName ||
          f.messageModel.from.userName === onlineUserModel.userName
      ),
      map((data) => {
        const item = data[data.length - 1].messageModel;
        if (item.to.userName == onlineUserModel.userName) {
          return `You ${item.content}...`;
        }
        else (item.from.userName == onlineUserModel.userName) {
          return `Them ${item.content}...`;
        }
      })
    );
}

CodePudding user response:

I try to share you my result, just I added the map operator before filter:

getLastMessage(onlineUserModel: OnlineUserModel): Observable<string> {   
  return this.allDirectMessages$
    .pipe(
      filter((f) =>
          f.messageModel.to.userName === onlineUserModel.userName ||
          f.messageModel.from.userName === onlineUserModel.userName
      ),
      map((data) => {
        const item = data[data.length - 1].messageModel;
        if (item.to.userName == onlineUserModel.userName) {
          return `You ${item.content}...`;
        }
        else (item.from.userName == onlineUserModel.userName) {
          return `Them ${item.content}...`;
        }
      })
    );
}
  • Related