Naming consistency and improve conformance (a bit) (#625)

This commit is contained in:
Doug
2023-02-24 11:44:41 +00:00
committed by GitHub
parent a3c7c47a69
commit 21bd37c0b1
7 changed files with 63 additions and 57 deletions
@@ -166,16 +166,16 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
if itemGroup.count == 1 { if itemGroup.count == 1 {
if let firstItem = itemGroup.first { if let firstItem = itemGroup.first {
timelineViews.append(RoomTimelineViewProvider(timelineItem: firstItem, grouping: .single)) timelineViews.append(RoomTimelineViewProvider(timelineItem: firstItem, groupStyle: .single))
} }
} else { } else {
for (index, item) in itemGroup.enumerated() { for (index, item) in itemGroup.enumerated() {
if index == 0 { if index == 0 {
timelineViews.append(RoomTimelineViewProvider(timelineItem: item, grouping: .first)) timelineViews.append(RoomTimelineViewProvider(timelineItem: item, groupStyle: .first))
} else if index == itemGroup.count - 1 { } else if index == itemGroup.count - 1 {
timelineViews.append(RoomTimelineViewProvider(timelineItem: item, grouping: .last)) timelineViews.append(RoomTimelineViewProvider(timelineItem: item, groupStyle: .last))
} else { } else {
timelineViews.append(RoomTimelineViewProvider(timelineItem: item, grouping: .middle)) timelineViews.append(RoomTimelineViewProvider(timelineItem: item, groupStyle: .middle))
} }
} }
} }
@@ -19,7 +19,7 @@ import SwiftUI
struct TimelineItemBubbledStylerView<Content: View>: View { struct TimelineItemBubbledStylerView<Content: View>: View {
@EnvironmentObject private var context: RoomScreenViewModel.Context @EnvironmentObject private var context: RoomScreenViewModel.Context
@Environment(\.timelineGroupStyle) private var timelineStyleGrouping @Environment(\.timelineGroupStyle) private var timelineGroupStyle
let timelineItem: EventBasedTimelineItemProtocol let timelineItem: EventBasedTimelineItemProtocol
@ViewBuilder let content: () -> Content @ViewBuilder let content: () -> Content
@@ -125,7 +125,7 @@ struct TimelineItemBubbledStylerView<Content: View>: View {
private var messageBubbleTopPadding: CGFloat { private var messageBubbleTopPadding: CGFloat {
guard timelineItem.isOutgoing else { return 0 } guard timelineItem.isOutgoing else { return 0 }
return timelineStyleGrouping == .single || timelineStyleGrouping == .first ? 8 : 0 return timelineGroupStyle == .single || timelineGroupStyle == .first ? 8 : 0
} }
private var shouldAvoidBubbling: Bool { private var shouldAvoidBubbling: Bool {
@@ -137,7 +137,7 @@ struct TimelineItemBubbledStylerView<Content: View>: View {
} }
private var roundedCorners: UIRectCorner { private var roundedCorners: UIRectCorner {
switch timelineStyleGrouping { switch timelineGroupStyle {
case .single: case .single:
return .allCorners return .allCorners
case .first: case .first:
@@ -158,7 +158,7 @@ struct TimelineItemBubbledStylerView<Content: View>: View {
} }
private var shouldShowSenderDetails: Bool { private var shouldShowSenderDetails: Bool {
timelineStyleGrouping.shouldShowSenderDetails timelineGroupStyle.shouldShowSenderDetails
} }
} }
@@ -177,7 +177,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider {
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
ForEach(1..<MockRoomTimelineController().timelineItems.count, id: \.self) { index in ForEach(1..<MockRoomTimelineController().timelineItems.count, id: \.self) { index in
let item = MockRoomTimelineController().timelineItems[index] let item = MockRoomTimelineController().timelineItems[index]
RoomTimelineViewProvider(timelineItem: item, grouping: .single) RoomTimelineViewProvider(timelineItem: item, groupStyle: .single)
.padding(TimelineStyle.bubbles.rowInsets) // Insets added in the table view cells .padding(TimelineStyle.bubbles.rowInsets) // Insets added in the table view cells
} }
} }
@@ -19,7 +19,7 @@ import SwiftUI
struct TimelineItemPlainStylerView<Content: View>: View { struct TimelineItemPlainStylerView<Content: View>: View {
@EnvironmentObject private var context: RoomScreenViewModel.Context @EnvironmentObject private var context: RoomScreenViewModel.Context
@Environment(\.timelineGroupStyle) private var timelineStyleGrouping @Environment(\.timelineGroupStyle) private var timelineGroupStyle
let timelineItem: EventBasedTimelineItemProtocol let timelineItem: EventBasedTimelineItemProtocol
@ViewBuilder let content: () -> Content @ViewBuilder let content: () -> Content
@@ -81,7 +81,7 @@ struct TimelineItemPlainStylerView<Content: View>: View {
} }
private var shouldShowSenderDetails: Bool { private var shouldShowSenderDetails: Bool {
timelineStyleGrouping.shouldShowSenderDetails timelineGroupStyle.shouldShowSenderDetails
} }
} }
@@ -92,7 +92,7 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider {
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
ForEach(1..<MockRoomTimelineController().timelineItems.count, id: \.self) { index in ForEach(1..<MockRoomTimelineController().timelineItems.count, id: \.self) { index in
let item = MockRoomTimelineController().timelineItems[index] let item = MockRoomTimelineController().timelineItems[index]
RoomTimelineViewProvider(timelineItem: item, grouping: .single) RoomTimelineViewProvider(timelineItem: item, groupStyle: .single)
.padding(TimelineStyle.plain.rowInsets) // Insets added in the table view cells .padding(TimelineStyle.plain.rowInsets) // Insets added in the table view cells
} }
} }
@@ -75,7 +75,7 @@ extension View {
environment(\.timelineStyle, style) environment(\.timelineStyle, style)
} }
func timelineStyleGrouping(_ grouping: TimelineGroupStyle) -> some View { func timelineGroupStyle(_ groupStyle: TimelineGroupStyle) -> some View {
environment(\.timelineGroupStyle, grouping) environment(\.timelineGroupStyle, groupStyle)
} }
} }
@@ -24,7 +24,7 @@ struct CollapsibleRoomTimelineView: View {
init(timelineItem: CollapsibleTimelineItem) { init(timelineItem: CollapsibleTimelineItem) {
self.timelineItem = timelineItem 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 { var body: some View {
@@ -19,25 +19,31 @@ import Foundation
struct CollapsibleTimelineItem: RoomTimelineItemProtocol, Identifiable, Hashable { struct CollapsibleTimelineItem: RoomTimelineItemProtocol, Identifiable, Hashable {
let id: String let id: String
let items: [RoomTimelineItemProtocol] let items: [RoomTimelineItemProtocol]
let itemIDs: [String]
init(items: [RoomTimelineItemProtocol]) { init(items: [RoomTimelineItemProtocol]) {
guard let firstItem = items.first else { self.items = items
itemIDs = items.map(\.id)
guard let firstItemID = itemIDs.first else {
fatalError() fatalError()
} }
self.items = items id = firstItemID
id = firstItem.id
} }
// MARK: - Equatable // MARK: - Equatable
static func == (lhs: CollapsibleTimelineItem, rhs: CollapsibleTimelineItem) -> Bool { 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 // MARK: - Hashable
func hash(into hasher: inout Hasher) { 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(id)
hasher.combine(itemIDs)
} }
} }
@@ -37,42 +37,42 @@ enum RoomTimelineViewProvider: Identifiable, Hashable {
case group(CollapsibleTimelineItem, TimelineGroupStyle) case group(CollapsibleTimelineItem, TimelineGroupStyle)
// swiftlint:disable:next cyclomatic_complexity // swiftlint:disable:next cyclomatic_complexity
init(timelineItem: RoomTimelineItemProtocol, grouping: TimelineGroupStyle) { init(timelineItem: RoomTimelineItemProtocol, groupStyle: TimelineGroupStyle) {
switch timelineItem { switch timelineItem {
case let item as TextRoomTimelineItem: case let item as TextRoomTimelineItem:
self = .text(item, grouping) self = .text(item, groupStyle)
case let item as ImageRoomTimelineItem: case let item as ImageRoomTimelineItem:
self = .image(item, grouping) self = .image(item, groupStyle)
case let item as VideoRoomTimelineItem: case let item as VideoRoomTimelineItem:
self = .video(item, grouping) self = .video(item, groupStyle)
case let item as AudioRoomTimelineItem: case let item as AudioRoomTimelineItem:
self = .audio(item, grouping) self = .audio(item, groupStyle)
case let item as FileRoomTimelineItem: case let item as FileRoomTimelineItem:
self = .file(item, grouping) self = .file(item, groupStyle)
case let item as SeparatorRoomTimelineItem: case let item as SeparatorRoomTimelineItem:
self = .separator(item, grouping) self = .separator(item, groupStyle)
case let item as NoticeRoomTimelineItem: case let item as NoticeRoomTimelineItem:
self = .notice(item, grouping) self = .notice(item, groupStyle)
case let item as EmoteRoomTimelineItem: case let item as EmoteRoomTimelineItem:
self = .emote(item, grouping) self = .emote(item, groupStyle)
case let item as RedactedRoomTimelineItem: case let item as RedactedRoomTimelineItem:
self = .redacted(item, grouping) self = .redacted(item, groupStyle)
case let item as EncryptedRoomTimelineItem: case let item as EncryptedRoomTimelineItem:
self = .encrypted(item, grouping) self = .encrypted(item, groupStyle)
case let item as ReadMarkerRoomTimelineItem: case let item as ReadMarkerRoomTimelineItem:
self = .readMarker(item, grouping) self = .readMarker(item, groupStyle)
case let item as PaginationIndicatorRoomTimelineItem: case let item as PaginationIndicatorRoomTimelineItem:
self = .paginationIndicator(item, grouping) self = .paginationIndicator(item, groupStyle)
case let item as StickerRoomTimelineItem: case let item as StickerRoomTimelineItem:
self = .sticker(item, grouping) self = .sticker(item, groupStyle)
case let item as UnsupportedRoomTimelineItem: case let item as UnsupportedRoomTimelineItem:
self = .unsupported(item, grouping) self = .unsupported(item, groupStyle)
case let item as TimelineStartRoomTimelineItem: case let item as TimelineStartRoomTimelineItem:
self = .timelineStart(item, grouping) self = .timelineStart(item, groupStyle)
case let item as StateRoomTimelineItem: case let item as StateRoomTimelineItem:
self = .state(item, grouping) self = .state(item, groupStyle)
case let item as CollapsibleTimelineItem: case let item as CollapsibleTimelineItem:
self = .group(item, grouping) self = .group(item, groupStyle)
default: default:
fatalError("Unknown timeline item") fatalError("Unknown timeline item")
} }
@@ -119,7 +119,7 @@ enum RoomTimelineViewProvider: Identifiable, Hashable {
extension RoomTimelineViewProvider: View { extension RoomTimelineViewProvider: View {
var body: some View { var body: some View {
timelineView timelineView
.environment(\.timelineGroupStyle, timelineStyleGrouping) .timelineGroupStyle(timelineGroupStyle)
} }
@ViewBuilder private var timelineView: some View { @ViewBuilder private var timelineView: some View {
@@ -161,26 +161,26 @@ extension RoomTimelineViewProvider: View {
} }
} }
private var timelineStyleGrouping: TimelineGroupStyle { private var timelineGroupStyle: TimelineGroupStyle {
switch self { switch self {
case .text(_, let grouping), case .text(_, let groupStyle),
.separator(_, let grouping), .separator(_, let groupStyle),
.image(_, let grouping), .image(_, let groupStyle),
.video(_, let grouping), .video(_, let groupStyle),
.audio(_, let grouping), .audio(_, let groupStyle),
.file(_, let grouping), .file(_, let groupStyle),
.emote(_, let grouping), .emote(_, let groupStyle),
.notice(_, let grouping), .notice(_, let groupStyle),
.redacted(_, let grouping), .redacted(_, let groupStyle),
.encrypted(_, let grouping), .encrypted(_, let groupStyle),
.readMarker(_, let grouping), .readMarker(_, let groupStyle),
.paginationIndicator(_, let grouping), .paginationIndicator(_, let groupStyle),
.sticker(_, let grouping), .sticker(_, let groupStyle),
.unsupported(_, let grouping), .unsupported(_, let groupStyle),
.timelineStart(_, let grouping), .timelineStart(_, let groupStyle),
.state(_, let grouping), .state(_, let groupStyle),
.group(_, let grouping): .group(_, let groupStyle):
return grouping return groupStyle
} }
} }
} }