Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions Mactrix/Models/LiveRoom.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ public final class LiveRoom: Identifiable {

@ObservationIgnored private var typingHandle: TaskHandle?

public nonisolated var room: MatrixRustSDK.Room {
sidebarRoom.room
}
public let room: MatrixRustSDK.Room

public var roomInfo: MatrixRustSDK.RoomInfo? {
sidebarRoom.roomInfo
Expand All @@ -26,6 +24,7 @@ public final class LiveRoom: Identifiable {

public init(sidebarRoom: SidebarRoom) {
self.sidebarRoom = sidebarRoom
self.room = sidebarRoom.room

startListening()

Expand Down
16 changes: 14 additions & 2 deletions Mactrix/Models/MatrixClient+Listeners.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,25 @@ extension MatrixClient {
case let .insert(index, room):
self.rooms.insert(SidebarRoom(room: room), at: Int(index))
case let .set(index, room):
self.rooms[Int(index)] = SidebarRoom(room: room)
let existing = self.rooms[Int(index)]
if existing.id == room.id() {
existing.updateRoom(room)
} else {
self.rooms[Int(index)] = SidebarRoom(room: room)
}
case let .remove(index):
self.rooms.remove(at: Int(index))
case let .truncate(length):
self.rooms.removeSubrange(Int(length) ..< self.rooms.count)
case let .reset(values: values):
self.rooms = values.map(SidebarRoom.init(room:))
let existingById = Dictionary(self.rooms.map { ($0.id, $0) }, uniquingKeysWith: { first, _ in first })
self.rooms = values.map { room in
if let existing = existingById[room.id()] {
existing.updateRoom(room)
return existing
}
return SidebarRoom(room: room)
}
}
}
}
Expand Down
24 changes: 17 additions & 7 deletions Mactrix/Models/SidebarRoom.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@ import OSLog

@MainActor @Observable
public final class SidebarRoom: Identifiable {
public let room: MatrixRustSDK.Room
public let id: String
public private(set) var room: MatrixRustSDK.Room
public var roomInfo: RoomInfo?

@ObservationIgnored private var roomInfoHandle: TaskHandle?

public nonisolated var id: String {
room.id()
}
@ObservationIgnored private var listenerTask: Task<Void, Never>?

public init(room: MatrixRustSDK.Room) {
self.id = room.id()
self.room = room

Task {
Expand All @@ -28,13 +27,24 @@ public final class SidebarRoom: Identifiable {
}
}

/// Updates the underlying room reference without replacing this instance.
/// Preserves object identity and loaded roomInfo while ensuring the room
/// object stays current. Re-subscribes to room info updates on the new reference.
public func updateRoom(_ newRoom: MatrixRustSDK.Room) {
assert(id == newRoom.id())
room = newRoom
listenerTask?.cancel()
roomInfoHandle = nil
listenToRoomInfo()
}

private func listenToRoomInfo() {
let listener = AsyncSDKListener<RoomInfo>()
roomInfoHandle = room.subscribeToRoomInfoUpdates(listener: listener)

Task { [weak self] in
listenerTask = Task { [weak self] in
for await roomInfo in listener._throttle(for: .milliseconds(500)) {
guard let self else { break }
guard let self, !Task.isCancelled else { break }
self.roomInfo = roomInfo
}
}
Expand Down