Reactions

The Stream Chat SDK has built-in support for user reactions. Some common examples are likes, comments, loves, etc. The reactions are also customizable, so you can use any type of reaction your application requires.

Sending a Reaction

// Add reaction 'love' with custom field, using emoji
const reaction = await channel.sendReaction(messageID, {
  type: "love",
  myCustomField: "💙",
});

// Add reaction 'love' from the server side
const reaction = await channel.sendReaction(messageID, {
  type: "love",
  user_id: userid,
});

// Add reaction 'like' and replace all other reactions of this user by it
const reaction = await channel.sendReaction(
  messageID,
  { type: "love", user_id: userid },
  { enforce_unique: true },
);

Below you can find all the parameters for sending a reaction:

nametypedescriptiondefaultoptional
message_idstringID of the message to react to
reaction.typestringType of the reaction. User could have only 1 reaction of each type per message
reaction.scoreintegerScore of the reaction for cumulative reactions (see example below)1
user_idstringUser ID for server side calls
enforce_uniquebooleanIf set to true, new reaction will replace all reactions the user has (if any) on this messagefalse
skip_pushbooleanDo not send a push notificationfalse
emoji_codestringAccepts an unicode which is used by the backend to display the emoji in push notification

Custom data for reactions is limited to 1KB.

Cumulative Reactions (Clap)

You can use the Reactions API to build something similar to Medium’s clap reactions. If you are not familiar with this, Medium allows you to clap articles more than once and shows the sum of all claps from all users.

To do this, you only need to include a score for the reaction (ie. user X clapped 25 times) and the API will return the sum of all reaction scores as well as each user’s individual scores (ie. clapped 475 times, user Y clapped 14 times).

// user claps 5 times on a message
await channel.sendReaction(messageID, {
  type: "clap",
  score: 5,
});

// same user claps 20 times more
await channel.sendReaction(messageID, {
  type: "clap",
  score: 25,
});

Removing a Reaction

await channel.deleteReaction(messageID, "love");

Fetching Reactions

The message object will contain the most recent reactions of a message. But if you need to display all the reactions of a message, you can do so by fetching all the reactions.

// get the first 10 reactions
const response = await channel.getReactions(messageID, { limit: 10 });

// get 3 reactions past the first 10
const response = await channel.getReactions(messageID, {
  limit: 3,
  offset: 10,
});

Querying Reactions

If you need more control on how to fetch the reactions, you can use the query reactions endpoint. This allows you to filter the reactions by their type or the author id, so that you can provide an experience similar to Slack, for example, show all users who reacted with “like”.

// Filter by type
await client.queryReactions(message.id, { type: "like" });
// Filter by user id
const id = uuidv4();
await client.queryReactions(message.id, { user_id: id });
// Paginate the results
const data = await client.queryReactions(message.id, {});
const dataPage2 = await client.queryReactions(
  message.id,
  {},
  {},
  { limit: 5, next: data.next },
);
© Getstream.io, Inc. All Rights Reserved.