From 21bd37c0b1e9d4e17bd8c19f84b3897a9c40dcb3 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Fri, 24 Feb 2023 11:44:41 +0000 Subject: [PATCH] Naming consistency and improve conformance (a bit) (#625) --- .../RoomScreen/RoomScreenViewModel.swift | 8 +- .../Style/TimelineItemBubbledStylerView.swift | 10 +-- .../Style/TimelineItemPlainStylerView.swift | 6 +- .../RoomScreen/View/Style/TimelineStyle.swift | 4 +- .../CollapsibleRoomTimelineView.swift | 2 +- .../Items/Other/CollapsibleTimelineItem.swift | 14 +++- .../RoomTimelineViewProvider.swift | 76 +++++++++---------- 7 files changed, 63 insertions(+), 57 deletions(-) diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index ec4f77349..354c24271 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -166,16 +166,16 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol if itemGroup.count == 1 { if let firstItem = itemGroup.first { - timelineViews.append(RoomTimelineViewProvider(timelineItem: firstItem, grouping: .single)) + timelineViews.append(RoomTimelineViewProvider(timelineItem: firstItem, groupStyle: .single)) } } else { for (index, item) in itemGroup.enumerated() { if index == 0 { - timelineViews.append(RoomTimelineViewProvider(timelineItem: item, grouping: .first)) + timelineViews.append(RoomTimelineViewProvider(timelineItem: item, groupStyle: .first)) } else if index == itemGroup.count - 1 { - timelineViews.append(RoomTimelineViewProvider(timelineItem: item, grouping: .last)) + timelineViews.append(RoomTimelineViewProvider(timelineItem: item, groupStyle: .last)) } else { - timelineViews.append(RoomTimelineViewProvider(timelineItem: item, grouping: .middle)) + timelineViews.append(RoomTimelineViewProvider(timelineItem: item, groupStyle: .middle)) } } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift index 0e8f0d27d..44fd02385 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift @@ -19,7 +19,7 @@ import SwiftUI struct TimelineItemBubbledStylerView: View { @EnvironmentObject private var context: RoomScreenViewModel.Context - @Environment(\.timelineGroupStyle) private var timelineStyleGrouping + @Environment(\.timelineGroupStyle) private var timelineGroupStyle let timelineItem: EventBasedTimelineItemProtocol @ViewBuilder let content: () -> Content @@ -125,7 +125,7 @@ struct TimelineItemBubbledStylerView: View { private var messageBubbleTopPadding: CGFloat { guard timelineItem.isOutgoing else { return 0 } - return timelineStyleGrouping == .single || timelineStyleGrouping == .first ? 8 : 0 + return timelineGroupStyle == .single || timelineGroupStyle == .first ? 8 : 0 } private var shouldAvoidBubbling: Bool { @@ -137,7 +137,7 @@ struct TimelineItemBubbledStylerView: View { } private var roundedCorners: UIRectCorner { - switch timelineStyleGrouping { + switch timelineGroupStyle { case .single: return .allCorners case .first: @@ -158,7 +158,7 @@ struct TimelineItemBubbledStylerView: View { } private var shouldShowSenderDetails: Bool { - timelineStyleGrouping.shouldShowSenderDetails + timelineGroupStyle.shouldShowSenderDetails } } @@ -177,7 +177,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider { VStack(alignment: .leading, spacing: 0) { ForEach(1..: View { @EnvironmentObject private var context: RoomScreenViewModel.Context - @Environment(\.timelineGroupStyle) private var timelineStyleGrouping + @Environment(\.timelineGroupStyle) private var timelineGroupStyle let timelineItem: EventBasedTimelineItemProtocol @ViewBuilder let content: () -> Content @@ -81,7 +81,7 @@ struct TimelineItemPlainStylerView: View { } private var shouldShowSenderDetails: Bool { - timelineStyleGrouping.shouldShowSenderDetails + timelineGroupStyle.shouldShowSenderDetails } } @@ -92,7 +92,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider { VStack(alignment: .leading, spacing: 0) { ForEach(1.. some View { - environment(\.timelineGroupStyle, grouping) + func timelineGroupStyle(_ groupStyle: TimelineGroupStyle) -> some View { + environment(\.timelineGroupStyle, groupStyle) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/CollapsibleRoomTimelineView.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/CollapsibleRoomTimelineView.swift index 712a5d59d..b3d7152d4 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/CollapsibleRoomTimelineView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/CollapsibleRoomTimelineView.swift @@ -24,7 +24,7 @@ struct CollapsibleRoomTimelineView: View { init(timelineItem: CollapsibleTimelineItem) { self.timelineItem = timelineItem - timelineViews = timelineItem.items.map { RoomTimelineViewProvider(timelineItem: $0, grouping: .single) } + timelineViews = timelineItem.items.map { RoomTimelineViewProvider(timelineItem: $0, groupStyle: .single) } } var body: some View { diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/Items/Other/CollapsibleTimelineItem.swift b/ElementX/Sources/Services/Timeline/TimelineItems/Items/Other/CollapsibleTimelineItem.swift index da375f279..2bf3b70a2 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/Items/Other/CollapsibleTimelineItem.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/Items/Other/CollapsibleTimelineItem.swift @@ -19,25 +19,31 @@ import Foundation struct CollapsibleTimelineItem: RoomTimelineItemProtocol, Identifiable, Hashable { let id: String let items: [RoomTimelineItemProtocol] + let itemIDs: [String] init(items: [RoomTimelineItemProtocol]) { - guard let firstItem = items.first else { + self.items = items + itemIDs = items.map(\.id) + + guard let firstItemID = itemIDs.first else { fatalError() } - self.items = items - id = firstItem.id + id = firstItemID } // MARK: - Equatable static func == (lhs: CollapsibleTimelineItem, rhs: CollapsibleTimelineItem) -> Bool { - lhs.id == rhs.id + // Technically not a correct implementation of equality as the items themselves could be updated. + lhs.id == rhs.id && lhs.itemIDs == rhs.itemIDs } // MARK: - Hashable func hash(into hasher: inout Hasher) { + // Technically not a correct implementation of hashing as the items themselves could be updated. hasher.combine(id) + hasher.combine(itemIDs) } } diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift index 22ecd5e66..3a309deae 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift @@ -37,42 +37,42 @@ enum RoomTimelineViewProvider: Identifiable, Hashable { case group(CollapsibleTimelineItem, TimelineGroupStyle) // swiftlint:disable:next cyclomatic_complexity - init(timelineItem: RoomTimelineItemProtocol, grouping: TimelineGroupStyle) { + init(timelineItem: RoomTimelineItemProtocol, groupStyle: TimelineGroupStyle) { switch timelineItem { case let item as TextRoomTimelineItem: - self = .text(item, grouping) + self = .text(item, groupStyle) case let item as ImageRoomTimelineItem: - self = .image(item, grouping) + self = .image(item, groupStyle) case let item as VideoRoomTimelineItem: - self = .video(item, grouping) + self = .video(item, groupStyle) case let item as AudioRoomTimelineItem: - self = .audio(item, grouping) + self = .audio(item, groupStyle) case let item as FileRoomTimelineItem: - self = .file(item, grouping) + self = .file(item, groupStyle) case let item as SeparatorRoomTimelineItem: - self = .separator(item, grouping) + self = .separator(item, groupStyle) case let item as NoticeRoomTimelineItem: - self = .notice(item, grouping) + self = .notice(item, groupStyle) case let item as EmoteRoomTimelineItem: - self = .emote(item, grouping) + self = .emote(item, groupStyle) case let item as RedactedRoomTimelineItem: - self = .redacted(item, grouping) + self = .redacted(item, groupStyle) case let item as EncryptedRoomTimelineItem: - self = .encrypted(item, grouping) + self = .encrypted(item, groupStyle) case let item as ReadMarkerRoomTimelineItem: - self = .readMarker(item, grouping) + self = .readMarker(item, groupStyle) case let item as PaginationIndicatorRoomTimelineItem: - self = .paginationIndicator(item, grouping) + self = .paginationIndicator(item, groupStyle) case let item as StickerRoomTimelineItem: - self = .sticker(item, grouping) + self = .sticker(item, groupStyle) case let item as UnsupportedRoomTimelineItem: - self = .unsupported(item, grouping) + self = .unsupported(item, groupStyle) case let item as TimelineStartRoomTimelineItem: - self = .timelineStart(item, grouping) + self = .timelineStart(item, groupStyle) case let item as StateRoomTimelineItem: - self = .state(item, grouping) + self = .state(item, groupStyle) case let item as CollapsibleTimelineItem: - self = .group(item, grouping) + self = .group(item, groupStyle) default: fatalError("Unknown timeline item") } @@ -119,7 +119,7 @@ enum RoomTimelineViewProvider: Identifiable, Hashable { extension RoomTimelineViewProvider: View { var body: some View { timelineView - .environment(\.timelineGroupStyle, timelineStyleGrouping) + .timelineGroupStyle(timelineGroupStyle) } @ViewBuilder private var timelineView: some View { @@ -161,26 +161,26 @@ extension RoomTimelineViewProvider: View { } } - private var timelineStyleGrouping: TimelineGroupStyle { + private var timelineGroupStyle: TimelineGroupStyle { switch self { - case .text(_, let grouping), - .separator(_, let grouping), - .image(_, let grouping), - .video(_, let grouping), - .audio(_, let grouping), - .file(_, let grouping), - .emote(_, let grouping), - .notice(_, let grouping), - .redacted(_, let grouping), - .encrypted(_, let grouping), - .readMarker(_, let grouping), - .paginationIndicator(_, let grouping), - .sticker(_, let grouping), - .unsupported(_, let grouping), - .timelineStart(_, let grouping), - .state(_, let grouping), - .group(_, let grouping): - return grouping + case .text(_, let groupStyle), + .separator(_, let groupStyle), + .image(_, let groupStyle), + .video(_, let groupStyle), + .audio(_, let groupStyle), + .file(_, let groupStyle), + .emote(_, let groupStyle), + .notice(_, let groupStyle), + .redacted(_, let groupStyle), + .encrypted(_, let groupStyle), + .readMarker(_, let groupStyle), + .paginationIndicator(_, let groupStyle), + .sticker(_, let groupStyle), + .unsupported(_, let groupStyle), + .timelineStart(_, let groupStyle), + .state(_, let groupStyle), + .group(_, let groupStyle): + return groupStyle } } }