> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-feature-react-native-sdk-quotedmessage-a.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Reactions

Enhance user engagement in your chat application with message reactions. Users can express their emotions using reactions to messages. This feature allows users to add or remove reactions, and to fetch all reactions on a message. You can also listen to reaction events in real-time. Let's see how to work with reactions in CometChat's SDK.

## Add a Reaction

Users can add a reaction to a message by calling `addReaction` with the message ID and the reaction emoji.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let messageId = "1";
    let emoji = "😊";

    CometChat.addReaction(messageId, emoji)
    .then((res) => {
      console.log('response', res);
    }).catch(err => {
      console.log('err', err);
    })    
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let messageId:string = "1";
    let emoji:string = "😊";

    CometChat.addReaction(messageId, emoji)
    .then((res:CometChat.BaseMessage) => {
      console.log('response', res);
    }).catch((err:CometChat.CometChatException) => {
      console.log('err', err);
    })  
    ```
  </Tab>
</Tabs>

<Note>
  You can react on text message, media message and custom message
</Note>

## Remove a Reaction

Removing a reaction from a message can be done using the `removeReaction` method.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let messageId = "1";
    let emoji = "😊";

    CometChat.removeReaction(messageId, emoji)
    .then((res) => {
      console.log('response', res);
    }).catch(err => {
      console.log('err', err);
    }) 
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let messageId:string = "1";
    let emoji:string = "😊";

    CometChat.removeReaction(messageId, emoji)
    .then((res:CometChat.BaseMessage) => {
      console.log('response', res);
    }).catch((err:CometChat.CometChatException) => {
      console.log('err', err);
    })  
    ```
  </Tab>
</Tabs>

## Fetch Reactions for a Message

To get all reactions for a specific message, first create a `ReactionRequest` using `ReactionRequestBuilder`. You can specify the number of reactions to fetch with setLimit with max limit 100. For this, you will require the ID of the message. This ID needs to be passed to the `setMessageId()` method of the builder class. The `setReaction()` will allow you to fetch details for specific reaction or emoji.

| Setting               | Description                                                                                                                                                                                                          |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `setMessageId(value)` | Specifies the unique identifier of the message for which you want to fetch reactions. This parameter is mandatory as it tells the SDK which message's reactions are being requested.                                 |
| `setReaction(value)`  | Filters the reactions fetched by the specified reaction type (e.g., "😊", "😂", "👍"). When set, this method will cause the ReactionRequest to only retrieve details of the provided reaction for the given message. |

***

## Fetch Next

The `fetchNext()` method fetches the next set of reactions for the message.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let limit = 10;
    let messageId = 1;

    let reactionRequest = new CometChat.ReactionRequestBuilder()
    .setMessageId(messageId)
    .setLimit(limit)
    .build();

    reactionRequest.fetchNext().then(
        messages => {
          console.log("list fetched:", messages);
        },
        error => {a
          console.log('list fetching failed with error:', error);
        },
      );    
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let limit:number = 10;
    let messageId:number = 1;

    let reactionRequest = new CometChat.ReactionRequestBuilder()
    .setMessageId(messageId)
    .setLimit(limit)
    .build();

    reactionRequest.fetchNext().then(
        (messages: MessageReaction[]) => {
          console.log("list fetched:", messages);
        },
        (error: CometChat.CometChatException) => {
          console.log('list fetching failed with error:', error);
        },
      );
    ```
  </Tab>
</Tabs>

Fetch Previous The `fetchPrevious()` method fetches the previous set of reactions for the message.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let limit = 10;
    let messageId = 1;

    let reactionRequest = new CometChat.ReactionRequestBuilder()
    .setMessageId(messageId)
    .setLimit(limit)
    .build();

    reactionRequest.fetchPrevious().then(
        messages => {
          console.log("list fetched:", messages);
        },
        error => {a
          console.log('list fetching failed with error:', error);
        },
      );  
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let limit:number = 10;
    let messageId:number = 1;

    let reactionRequest = new CometChat.ReactionRequestBuilder()
    .setMessageId(messageId)
    .setLimit(limit)
    .build();

    reactionRequest.fetchPrevious().then(
        (messages: MessageReaction[]) => {
          console.log("list fetched:", messages);
        },
        (error: CometChat.CometChatException) => {
          console.log('list fetching failed with error:', error);
        },
      );   
    ```
  </Tab>
</Tabs>

## Real-time Reaction Events

Keep the chat interactive with real-time updates for reactions. Register a listener for these events and make your UI responsive.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let listenerID = "UNIQUE_LISTENER_ID";

    CometChat.addMessageListener(listenerID, {
        onMessageReactionAdded:(message) => {
          console.log("Reaction added", message);
        },
        onMessageReactionRemoved:(message) => {
          console.log("Reaction removed", message);
        }
      })    
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let listenerID:string = "UNIQUE_LISTENER_ID";

    CometChat.addMessageListener(listenerID, {
        onMessageReactionAdded:(message: Object) => {
          console.log("Reaction added", message);
        },
        onMessageReactionRemoved:(message: Object) => {
          console.log("Reaction removed", message);
        }
      }) 
    ```
  </Tab>
</Tabs>

## Removing a Reaction Listener

To stop listening for reaction events, remove the listener as follows:

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let listenerID = "UNIQUE_LISTENER_ID";

    CometChat.removeMessageListener(listenerID);
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let listenerID:string = "UNIQUE_LISTENER_ID";

    CometChat.removeMessageReactionListener(listenerID);
    ```
  </Tab>
</Tabs>

## Get Reactions List

To retrieve the list of reactions reacted on particular message, you can use the `message.getReactions()` method. This method will return an array containing the reactions, or an empty array if no one reacted on the message.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    message.getReactions()    
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    message.getReactions()
    ```
  </Tab>
</Tabs>

## Check if Logged-in User has Reacted on Message

To check if the logged-in user has reacted on a particular message or not, You can use the `getReactedByMe()` method on any `ReactionCount` object instance. This method will return a boolean value, true if the logged-in user has reacted on that message, otherwise false.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    let reactions = message.getReactions();
    reactions.forEach((reaction) => {
    reaction.getReactedByMe(); //Return true is logged-in user reacted on that message, otherwise false
    }) 
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    let reactions = message.getReactions();
    reactions.forEach((reaction) => {
    reaction.getReactedByMe(); //Return true is logged-in user reacted on that message, otherwise false
    })   
    ```
  </Tab>
</Tabs>

## Update Message With Reaction Info

When a user adds or removes a reaction, you will receive a real-time event. Once you receive the real time event you would want to update the message with the latest reaction information. To do so you can use the `updateMessageWithReactionInfo()` method.

The `updateMessageWithReactionInfo()` method provides a seamless way to update the reactions on a message instance (`BaseMessage`) in real-time. This method ensures that when a reaction is added or removed from a message, the BaseMessage object's `getReactions()` property reflects this change immediately.

When you receive a real-time reaction event (`MessageReaction`), call the `updateMessageWithReactionInfo()` method, passing the BaseMessage instance (`message`), event data (`MessageReaction`) and reaction event action type (`CometChat.REACTION_ACTION.REACTION_ADDED` or `CometChat.REACTION_ACTION.REACTION_REMOVED`) that corresponds to the message being reacted to.

<Tabs>
  <Tab title="JavaScript">
    ```js theme={null}
    // The message to which the reaction is related
    let message = ...;

    // The reaction event data received in real-time
    let messageReaction = ...;

    // The recieved reaction event real-time action type. Can be CometChatConstants.REACTION_ADDED or CometChatConstants.REACTION_REMOVED
    let action = CometChat.REACTION_ACTION.REACTION_ADDED;

    let modifiedBaseMessage = CometChat.CometChatHelper.updateMessageWithReactionInfo(
    baseMessage, 
    messageReaction, 
    action
    );    
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={null}
    // The message to which the reaction is related
    let message: CometChat.BaseMessage = ...;

    // The reaction event data received in real-time
    let messageReaction: CometChat.MessageReaction = ...;

    // The recieved reaction event real-time action type. Can be CometChatConstants.REACTION_ADDED or CometChatConstants.REACTION_REMOVED
    let action: CometChat.REACTION_ACTION = CometChat.REACTION_ACTION.REACTION_ADDED;

    let modifiedBaseMessage = CometChat.CometChatHelper.updateMessageWithReactionInfo(
    baseMessage, 
    messageReaction, 
    action
    );   
    ```
  </Tab>
</Tabs>

After calling this method, the message instance's reactions are updated. You can then use message.getReactions() to get the latest reactions and refresh your UI accordingly.
