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

let channelId = ChannelId(type: .messaging, id: "general")
let messageId: MessageId = "message-id"
let messageController = chatClient.messageController(cid: channelId, messageId: messageId)

messageController.addReaction("like") { error in
  print(error ?? "message liked")
}

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

messageController.addReaction("clap", score: 2) { error in
  print(error ?? "message clapped twice")
}

Removing a Reaction

messageController.deleteReaction("like") { error in
  print(error ?? "like removed")
}

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.

// Load 10 first reactions
messageController.loadReactions(limit: 10, offset: 0) { result in
  let loadedReactions = messageController.reactions
}

// Load 10 more reactions
messageController.loadNextReactions(limit: 10) { error in
  let loadedReactions = messageController.reactions
}

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
let reactionListController = client.reactionListController(
    query: .init(
        messageId: message.id,
        filter: .equal(.reactionType, to: "like")
    )
)

// Filter by user id
let reactionListController = client.reactionListController(
    query: .init(
        messageId: message.id,
        filter: .equal(.authorId, to: "user123")
    )
)

// Synchronize the controller and observe the changes
reactionListController.synchronize()
reactionListController.delegate = self

// Paginate the results
reactionListController.loadMoreReactions()

// Paginate the results with custom limit
reactionListController.loadMoreReactions(limit: 10)
© Getstream.io, Inc. All Rights Reserved.