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

reaction := &stream_chat.Reaction{
	Type:   "love",
	ExtraData: map[string]interface{}{"my_custom_field": 123},
}
msg, err := channel.SendReaction(reaction, msgID, userID)

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).

_, err = channel.SendReaction(&stream_chat.Reaction{
	Type: "clap", ExtraData: map[string]interface{}{"score": 25},
}, msgID, userID)

Removing a Reaction

_, err := channel.DeleteReaction(msgID, "love", userID)

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.

options := map[string][]string{
		"limit": {"10"},
		"idlte": {"10"},
	}

	_, err := channel.GetReactions(msgID, options)

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
client.queryReactions(
  messageId = message.id,
  filter = Filters.eq("type", "like"),
).enqueue { /* ... */ }

// Filter by user id
client.queryReactions(
  messageId = message.id,
  filter = Filters.eq("user_id", "user123"),
).enqueue { /* ... */ }

// Paginate the results
val page1 = client.queryReactions(
    messageId = message.id,
    limit = 5,
).execute().getOrThrow()

val page2 = client.queryReactions(
    messageId = message.id,
    limit = 5,
    next = page1.next,
).execute().getOrThrow()
© Getstream.io, Inc. All Rights Reserved.