diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift index 45d42386a..0d9206480 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift @@ -219,6 +219,8 @@ struct HomeScreenRoom: Identifiable, Equatable { let avatar: RoomAvatar + let statusEmoji: Character? + let canonicalAlias: String? let isTombstoned: Bool @@ -246,6 +248,7 @@ struct HomeScreenRoom: Identifiable, Equatable { lastMessage: placeholderLastMessage, lastMessageState: nil, avatar: .room(id: "", name: "", avatarURL: nil), + statusEmoji: nil, canonicalAlias: nil, isTombstoned: false) } @@ -298,6 +301,7 @@ extension HomeScreenRoom { lastMessage: summary.lastMessage, lastMessageState: summary.homeScreenLastMessageState, avatar: summary.avatar, + statusEmoji: summary.statusEmoji, canonicalAlias: summary.canonicalAlias, isTombstoned: summary.isTombstoned) } diff --git a/ElementX/Sources/Screens/HomeScreen/View/HomeScreenRoomCell.swift b/ElementX/Sources/Screens/HomeScreen/View/HomeScreenRoomCell.swift index 7e1542e0c..753a6178b 100644 --- a/ElementX/Sources/Screens/HomeScreen/View/HomeScreenRoomCell.swift +++ b/ElementX/Sources/Screens/HomeScreen/View/HomeScreenRoomCell.swift @@ -74,11 +74,17 @@ struct HomeScreenRoomCell: View { private var header: some View { HStack(alignment: .top, spacing: 16) { - Text(room.name) - .font(headerFont) - .foregroundColor(.compound.textPrimary) - .lineLimit(1) - .frame(maxWidth: .infinity, alignment: .leading) + HStack(spacing: 4) { + Text(room.name) + .lineLimit(1) + + if let statusEmoji = room.statusEmoji { + Text(String(statusEmoji)) + } + } + .font(headerFont) + .foregroundColor(.compound.textPrimary) + .frame(maxWidth: .infinity, alignment: .leading) if let timestamp = room.timestamp { Text(timestamp) @@ -218,6 +224,8 @@ struct HomeScreenRoomCell_Previews: PreviewProvider, TestablePreview { static let lastMessageStateRooms = [makeRoom(lastMessageState: .sending), makeRoom(lastMessageState: .failed)] + static let roomHeroRooms = [makeRoom(heroes: [.mockDan]), makeRoom(heroes: [.mockErin])] + static var previews: some View { VStack(spacing: 0) { ForEach(genericRooms) { room in @@ -244,6 +252,14 @@ struct HomeScreenRoomCell_Previews: PreviewProvider, TestablePreview { } .previewLayout(.sizeThatFits) .previewDisplayName("Last Message State") + + VStack(spacing: 0) { + ForEach(roomHeroRooms) { room in + HomeScreenRoomCell(room: room, isSelected: false, mediaProvider: MediaProviderMock(.init())) { _ in } + } + } + .previewLayout(.sizeThatFits) + .previewDisplayName("Room Heroes") } static func mockRoom(summary: RoomSummary) -> HomeScreenRoom? { @@ -261,15 +277,21 @@ struct HomeScreenRoomCell_Previews: PreviewProvider, TestablePreview { userIndicatorController: UserIndicatorControllerMock()) } - static func makeRoom(lastMessageState: RoomSummary.LastMessageState) -> HomeScreenRoom { + static func makeRoom(lastMessageState: RoomSummary.LastMessageState? = nil, + heroes: [UserProfile] = []) -> HomeScreenRoom { + let name = if heroes.count == 1 { + heroes[0].displayName ?? heroes[0].id + } else { + "Foundation and Empire" + } let summary = RoomSummary(room: RoomSDKMock(), id: UUID().uuidString, joinRequestType: nil, - name: "Foundation and Empire", - isDirect: false, + name: name, + isDirect: heroes.count == 1, isSpace: false, - avatarURL: .mockMXCAvatar, - heroes: [], + avatarURL: heroes.count == 1 ? nil : .mockMXCAvatar, + heroes: heroes, activeMembersCount: 0, lastMessage: AttributedString("How do you see the Emperor then? You think he keeps office hours?"), lastMessageDate: .mock, diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift index 0c704d42e..b8be3c3c4 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift @@ -191,4 +191,9 @@ nonisolated extension RoomSummary { return .room(id: id, name: name, avatarURL: avatarURL) } } + + var statusEmoji: Character? { + guard isDirect, case let .heroes(heroes) = avatar, heroes.count == 1 else { return nil } + return heroes.first?.status.displayed?.emoji + } }