From 2d70aa14c3d6b1fb25bbb54f386f9db4cafa10d5 Mon Sep 17 00:00:00 2001 From: umair Date: Tue, 23 Dec 2025 13:01:38 +0000 Subject: [PATCH] Updates chat swift getting started guide to use more performant lookup --- src/pages/docs/chat/getting-started/swift.mdx | 75 ++++++++++++------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/src/pages/docs/chat/getting-started/swift.mdx b/src/pages/docs/chat/getting-started/swift.mdx index 1725519f8e..cceb076689 100644 --- a/src/pages/docs/chat/getting-started/swift.mdx +++ b/src/pages/docs/chat/getting-started/swift.mdx @@ -329,11 +329,11 @@ struct ContentView: View { } messages.append(event.message) case .updated: - if let index = messages.firstIndex(where: { $0.id == event.message.id }) { + if let index = messages.firstIndex(where: { $0.serial == event.message.serial }) { messages[index] = event.message } case .deleted: - if let index = messages.firstIndex(where: { $0.id == event.message.id }) { + if let index = messages.firstIndex(where: { $0.serial == event.message.serial }) { messages[index] = event.message } } @@ -546,42 +546,61 @@ When you tap the "Edit" button next to a message, you can modify the text and it Ably Chat enables you to retrieve previously sent messages in a room. This is useful for providing conversational context when a user first joins a room, or when they subsequently rejoin it later on. The message subscription provides `historyBeforeSubscribe()` to enable this functionality. This method returns a paginated response, which can be queried further to retrieve the next set of messages. -Update the `setupMessages` function in your `ContentView.swift` to retrieve previous messages: +Add a new state variable `messageSerials` and update the `setupMessages` function in your `ContentView.swift` to retrieve previous messages: ```swift -private func setupMessages(room: Room) { - let subscription = room.messages.subscribe { event in - withAnimation { - switch event.type { - case .created: - // Only add if not already in the list - if !messages.contains(where: { $0.id == event.message.id }) { - messages.append(event.message) - } - case .updated: - if let index = messages.firstIndex(where: { $0.id == event.message.id }) { - messages[index] = event.message - } - case .deleted: - if let index = messages.firstIndex(where: { $0.id == event.message.id }) { - messages[index] = event.message +struct ContentView: View { + private let roomName = "my-first-room" + + @State private var chatClient: ChatClient + @State private var connectionStatus = "" + @State private var roomStatus = "" + @State private var room: Room? + @State private var messages: [Message] = [] + @State private var messageSerials: Set = [] + @State private var newMessage = "" + @State private var editingMessage: Message? + + // ... initialization code remains the same ... + + private func setupMessages(room: Room) { + let subscription = room.messages.subscribe { event in + withAnimation { + switch event.type { + case .created: + // Only add if not already in the list + if !messageSerials.contains(event.message.serial) { + messages.append(event.message) + messageSerials.insert(event.message.serial) + } + case .updated: + if let index = messages.firstIndex(where: { $0.serial == event.message.serial }) { + messages[index] = event.message + } + case .deleted: + if let index = messages.firstIndex(where: { $0.serial == event.message.serial }) { + messages[index] = event.message + } } } } - } - // Get previous messages after subscribing - Task { - do { - let previousMessages = try await subscription.historyBeforeSubscribe(.init()) - await MainActor.run { - messages.append(contentsOf: previousMessages.items) + // Get previous messages after subscribing + Task { + do { + let previousMessages = try await subscription.historyBeforeSubscribe(.init()) + await MainActor.run { + messages.append(contentsOf: previousMessages.items) + messageSerials.formUnion(previousMessages.items.map(\.serial)) + } + } catch { + print("Failed to get previous messages: \(error)") } - } catch { - print("Failed to get previous messages: \(error)") } } + + // ... rest of the functions remain the same ... } ```