diff --git a/src/pages/docs/chat/rooms/history.mdx b/src/pages/docs/chat/rooms/history.mdx index 68758be44b..929ccaba64 100644 --- a/src/pages/docs/chat/rooms/history.mdx +++ b/src/pages/docs/chat/rooms/history.mdx @@ -50,7 +50,7 @@ const MyComponent = () => { ``` ```swift -let paginatedResult = try await room.messages.get(options: .init(orderBy: .newestFirst)) +let paginatedResult = try await room.messages.history(options: .init(orderBy: .newestFirst)) print(paginatedResult.items) if let next = try await paginatedResult.next { print(next.items) @@ -60,7 +60,7 @@ if let next = try await paginatedResult.next { ``` ```kotlin -var historicalMessages = room.messages.get(orderBy = OrderBy.NewestFirst) +var historicalMessages = room.messages.history(orderBy = OrderBy.NewestFirst) println(historicalMessages.items.toString()) // historical messages are paginated, so we can iterate through @@ -143,7 +143,7 @@ const MyComponent = () => { ```swift let messagesSubscription = try await room.messages.subscribe() -let paginatedResult = try await messagesSubscription.getPreviousMessages(params: .init(limit: 50)) // `orderBy` here is ignored and always `newestFirst` +let paginatedResult = try await messagesSubscription.historyBeforeSubscribe(params: .init(limit: 50)) // `orderBy` here is ignored and always `newestFirst` print(paginatedResult.items) if let next = try await paginatedResult.next { print(next.items) @@ -157,7 +157,7 @@ val subscription = room.messages.subscribe { println("New message received") } -var historicalMessages = subscription.getPreviousMessages(limit = 50) +var historicalMessages = subscription.historyBeforeSubscribe(limit = 50) println(historicalMessages.items.toString()) while (historicalMessages.hasNext()) { diff --git a/src/pages/docs/chat/rooms/message-reactions.mdx b/src/pages/docs/chat/rooms/message-reactions.mdx index 1a1aa19a7a..2fbddb207d 100644 --- a/src/pages/docs/chat/rooms/message-reactions.mdx +++ b/src/pages/docs/chat/rooms/message-reactions.mdx @@ -43,6 +43,50 @@ await room.messages.reactions.send(message, { count: 100, }); ``` + +```swift +// Add a 👍 reaction using the default type +await room.messages.reactions.send(to: message.serial, params: .init(name: "👍")) + +// The reaction can be anything, not just UTF-8 emojis: +await room.messages.reactions.send(to: message.serial, params: .init(name: ":like:")) +await room.messages.reactions.send(to: message.serial, params: .init(name: "+1")) + +// Add a :love: reaction using the Unique type +await room.messages.reactions.send(to: message.serial, params: .init( + reaction: ":love:", + type: .unique +)) + +// Add a ❤️ reaction with count 100 using the Multiple type +await room.messages.reactions.send(to: message.serial, params: .init( + reaction: "❤️", + type: .multiple, + count: 100 +)) +``` + +```kotlin +// Add a 👍 reaction using the default type +room.messages.reactions.send(message, name = "👍") + +// The reaction can be anything, not just UTF-8 emojis: +room.messages.reactions.send(message, name = ":like:")) +room.messages.reactions.send(message, name = "+1")) + +// Add a :love: reaction using the Unique type +room.messages.reactions.send(message, + name = ":love:", + type = MessageReactionType.Unique, +) + +// Add a ❤️ reaction with count 100 using the Multiple type +room.messages.reactions.send(message, + name = "❤️", + type = MessageReactionType.Multiple, + count = 100, +) +``` The `annotation-publish` capability is required for adding reactions. @@ -73,6 +117,23 @@ const room = await ablyChatClient.rooms.get('room1', { }, }); ``` + +```swift +let room = try await ablyChatClient.rooms.get( + name: "room1", + options: .init( + messages: .init(defaultMessageReactionType: .unique) + ) +) +``` + +```kotlin +val room = ablyChatClient.rooms.get("room1") { + messages { + defaultMessageReactionType = MessageReactionType.Unique + } +} +``` ## Messages and reactions @@ -128,6 +189,17 @@ room.messages.reactions.subscribe((event) => { console.log("received reactions summary event", event); }); ``` +```swift +room.messages.reactions.subscribe { event in + print("received reactions summary event: \(event)") +} +``` + +```kotlin +room.messages.reactions.subscribe { event -> + println("received reactions summary event: $event") +} +``` The event is of type `reaction.summary`. `event.summary` is the received reactions summary and contains the following properties: @@ -160,6 +232,33 @@ room.messages.reactions.subscribe((event) => { messages[idx] = messages[idx].with(event); }); ``` + +```swift +// init messages, in practice this should be updated with a message subscription +var messages = (await room.messages.history(options: .init(limit: 50))).items + +// subscribe to message reactions summary events +room.messages.reactions.subscribe { event in + if let idx = messages.lastIndex(where: { $0.serial == event.summary.messageSerial }) { + messages[idx] = messages[idx].with(summaryEvent: event) + } +} +``` + +```kotlin +// init messages, in practice this should be updated with a message subscription +val messages = room.messages.history(limit = 50).items.toMutableList() + +// subscribe to message reactions summary events +room.messages.reactions.subscribe { event -> + // find the relevant message (in practice: use binary search or a map for lookups) + val idx = messages.indexOfLast { msg -> msg.serial == event.summary.messageSerial } + if (idx != -1) { + // update message + messages[idx] = messages[idx].with(event) + } +} +``` ### Summary events are sent efficiently at scale @@ -182,6 +281,23 @@ const room = await ablyChatClient.rooms.get('room1', { }, }); ``` + +```swift +let room = try await ablyChatClient.rooms.get( + name: "room1", + options: .init( + messages: .init(rawMessageReactions: true) + ) +) +``` + +```kotlin +val room = ablyChatClient.rooms.get("room1") { + messages { + rawMessageReactions = true + } +} +``` Then you can receive raw reactions using the `room.messages.reactions.subscribeRaw()` method: @@ -196,6 +312,26 @@ room.messages.reactions.subscribeRaw((event) => { } }); ``` + +```swift +room.messages.reactions.subscribeRaw { event in + if (event.type == .create) { + print("new reaction: \(event.reaction)") + } else if (event.type == .delete) { + print("reaction removed: \(event.reaction)") + } +} +``` + +```kotlin +room.messages.reactions.subscribeRaw { event -> + if (event.type == MessageReactionEventType.Create) { + println("new reaction: ${event.reaction}") + } else if (event.type == MessageReactionEventType.Delete) { + println("reaction removed: ${event.reaction}") + } +} +``` The `annotation-subscribe` capability is required for receiving individual reactions, however it is not required to receive summaries. diff --git a/src/pages/docs/chat/rooms/messages.mdx b/src/pages/docs/chat/rooms/messages.mdx index c114d0ea2c..62ebb01c51 100644 --- a/src/pages/docs/chat/rooms/messages.mdx +++ b/src/pages/docs/chat/rooms/messages.mdx @@ -49,7 +49,7 @@ for await message in messagesSubscription { ``` ```kotlin -val subscription = room.messages.subscribe { messageEvent: MessageEvent -> +val subscription = room.messages.subscribe { messageEvent: ChatMessageEvent -> println(messageEvent.message.toString()) } ``` @@ -330,8 +330,8 @@ for await message in messagesSubscription { val myMessageList: List val messagesSubscription = room.messages.subscribe { event -> when (event.type) { - MessageEventType.Created -> println("Received message: ${event.message}") - MessageEventType.Updated -> myMessageList.find { + ChatMessageEventType.Created -> println("Received message: ${event.message}") + ChatMessageEventType.Updated -> myMessageList.find { event.message.serial == it.serial && event.message.version > it.version }?.let { println("Message updated: ${event.message}") } else -> {} @@ -526,8 +526,8 @@ for await message in messagesSubscription { val myMessageList: List val messagesSubscription = room.messages.subscribe { event -> when (event.type) { - MessageEventType.Created -> println("Received message: ${event.message}") - MessageEventType.Deleted -> myMessageList.find { + ChatMessageEventType.Created -> println("Received message: ${event.message}") + ChatMessageEventType.Deleted -> myMessageList.find { event.message.serial == it.serial && event.message.version > it.version }?.let { println("Message deleted: ${event.message}") } else -> {} diff --git a/src/pages/docs/chat/rooms/occupancy.mdx b/src/pages/docs/chat/rooms/occupancy.mdx index 67ffe63b53..f392eeb4f6 100644 --- a/src/pages/docs/chat/rooms/occupancy.mdx +++ b/src/pages/docs/chat/rooms/occupancy.mdx @@ -48,13 +48,14 @@ const MyComponent = () => { ```swift let occupancySubscription = room.occupancy.subscribe() for await event in occupancySubscription { - occupancyInfo = "Connections: \(event.presenceMembers) (\(event.connections))" + occupancyInfo = "Connections: \(event.occupancy.presenceMembers) (\(event.occupancy.connections))" } ``` ```kotlin val subscription = room.occupancy.subscribe { event: OccupancyEvent -> - println(event.toString()) + println("Number of users connected is: ${event.occupancy.connections}") + println("Number of members present is: ${event.occupancy.presenceMembers}") } ``` diff --git a/src/pages/docs/chat/rooms/presence.mdx b/src/pages/docs/chat/rooms/presence.mdx index 36f03b31cf..f197dc105c 100644 --- a/src/pages/docs/chat/rooms/presence.mdx +++ b/src/pages/docs/chat/rooms/presence.mdx @@ -55,13 +55,13 @@ const MyComponent = () => { ```swift let presenceSubscription = room.presence.subscribe(events: [.enter, .leave, .update]) for await event in presenceSubscription { - print("Presence event `\(event.action)` from `\(event.clientId)` with data `\(event.data)`") + print("Presence event `\(event.type)` from `\(event.member.clientId)` with data `\(event.member.data)`") } ``` ```kotlin val subscription = room.presence.subscribe { event: PresenceEvent -> - println("Presence event ${event.action} from ${event.clientId} with data: ${event.data}") + println("Presence event ${event.type} from ${event.member.clientId} with data: ${event.member.data}") } ``` diff --git a/src/pages/docs/chat/rooms/reactions.mdx b/src/pages/docs/chat/rooms/reactions.mdx index 3f82d8008b..f6bcaf6c05 100644 --- a/src/pages/docs/chat/rooms/reactions.mdx +++ b/src/pages/docs/chat/rooms/reactions.mdx @@ -40,14 +40,14 @@ const MyComponent = () => { ```swift let reactionSubscription = room.reactions.subscribe() -for await reaction in reactionSubscription { - print("Received a reaction of type \(reaction.type), and metadata \(reaction.metadata)") +for await event in reactionSubscription { + print("Received a reaction of type \(event.reaction.type), and metadata \(event.reaction.metadata)") } ``` ```kotlin -val subscription = room.reactions.subscribe { reaction: Reaction -> - println("received a ${reaction.type} with metadata ${reaction.metadata}") +val subscription = room.reactions.subscribe { event: RoomReactionEvent -> + println("received a ${event.reaction.type} with metadata ${event.reaction.metadata}") } ```