mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Naming consistency and improve conformance (a bit) (#625)
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
+10
-4
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user