mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Refactor Rust timeline identifiers into our own. (#3731)
* Refactor eventOrTransactionID. * Refactor uniqueID.
This commit is contained in:
@@ -206,9 +206,9 @@ struct TimelineState {
|
||||
// These can be removed when we have full swiftUI and moved as @State values in the view
|
||||
var scrollToBottomPublisher = PassthroughSubject<Void, Never>()
|
||||
|
||||
var itemsDictionary = OrderedDictionary<TimelineUniqueId, RoomTimelineItemViewState>()
|
||||
var itemsDictionary = OrderedDictionary<TimelineItemIdentifier.UniqueID, RoomTimelineItemViewState>()
|
||||
|
||||
var uniqueIDs: [TimelineUniqueId] {
|
||||
var uniqueIDs: [TimelineItemIdentifier.UniqueID] {
|
||||
itemsDictionary.keys.elements
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class TimelineTableViewController: UIViewController {
|
||||
private let coordinator: TimelineView.Coordinator
|
||||
private let tableView = UITableView(frame: .zero, style: .plain)
|
||||
|
||||
var timelineItemsDictionary = OrderedDictionary<TimelineUniqueId, RoomTimelineItemViewState>() {
|
||||
var timelineItemsDictionary = OrderedDictionary<TimelineItemIdentifier.UniqueID, RoomTimelineItemViewState>() {
|
||||
didSet {
|
||||
guard canApplySnapshot else {
|
||||
hasPendingItems = true
|
||||
@@ -146,12 +146,12 @@ class TimelineTableViewController: UIViewController {
|
||||
|
||||
@Binding private var isScrolledToBottom: Bool
|
||||
|
||||
private var timelineItemsIDs: [TimelineUniqueId] {
|
||||
private var timelineItemsIDs: [TimelineItemIdentifier.UniqueID] {
|
||||
timelineItemsDictionary.keys.elements.reversed()
|
||||
}
|
||||
|
||||
/// The table's diffable data source.
|
||||
private var dataSource: UITableViewDiffableDataSource<TimelineSection, TimelineUniqueId>?
|
||||
private var dataSource: UITableViewDiffableDataSource<TimelineSection, TimelineItemIdentifier.UniqueID>?
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
/// A publisher used to throttle back pagination requests.
|
||||
@@ -247,7 +247,7 @@ class TimelineTableViewController: UIViewController {
|
||||
private func configureDataSource() {
|
||||
dataSource = .init(tableView: tableView) { [weak self] tableView, indexPath, id in
|
||||
switch id {
|
||||
case TimelineUniqueId(id: TimelineTypingIndicatorCell.reuseIdentifier):
|
||||
case TimelineItemIdentifier.UniqueID(TimelineTypingIndicatorCell.reuseIdentifier):
|
||||
let cell = tableView.dequeueReusableCell(withIdentifier: TimelineTypingIndicatorCell.reuseIdentifier, for: indexPath)
|
||||
guard let self else {
|
||||
return cell
|
||||
@@ -313,12 +313,12 @@ class TimelineTableViewController: UIViewController {
|
||||
private func applySnapshot() {
|
||||
guard let dataSource else { return }
|
||||
|
||||
var snapshot = NSDiffableDataSourceSnapshot<TimelineSection, TimelineUniqueId>()
|
||||
var snapshot = NSDiffableDataSourceSnapshot<TimelineSection, TimelineItemIdentifier.UniqueID>()
|
||||
|
||||
// We don't want to display the typing notification in this timeline
|
||||
if coordinator.context.viewState.timelineKind != .pinned {
|
||||
snapshot.appendSections([.typingIndicator])
|
||||
snapshot.appendItems([TimelineUniqueId(id: TimelineTypingIndicatorCell.reuseIdentifier)])
|
||||
snapshot.appendItems([TimelineItemIdentifier.UniqueID(TimelineTypingIndicatorCell.reuseIdentifier)])
|
||||
}
|
||||
snapshot.appendSections([.main])
|
||||
snapshot.appendItems(timelineItemsIDs)
|
||||
@@ -517,7 +517,7 @@ extension TimelineTableViewController {
|
||||
}
|
||||
|
||||
/// Returns the frame of the cell for a particular timeline item.
|
||||
private func cellFrame(for uniqueID: TimelineUniqueId) -> CGRect? {
|
||||
private func cellFrame(for uniqueID: TimelineItemIdentifier.UniqueID) -> CGRect? {
|
||||
guard let timelineCell = tableView.visibleCells.first(where: { ($0 as? TimelineItemCell)?.item?.identifier.uniqueID == uniqueID }) else {
|
||||
return nil
|
||||
}
|
||||
@@ -537,13 +537,13 @@ extension TimelineTableViewController {
|
||||
}
|
||||
}
|
||||
|
||||
private extension NSDiffableDataSourceSnapshot<TimelineTableViewController.TimelineSection, TimelineUniqueId> {
|
||||
private extension NSDiffableDataSourceSnapshot<TimelineTableViewController.TimelineSection, TimelineItemIdentifier.UniqueID> {
|
||||
var numberOfMainItems: Int {
|
||||
guard sectionIdentifiers.contains(.main) else { return 0 }
|
||||
return numberOfItems(inSection: .main)
|
||||
}
|
||||
|
||||
var mainItemIdentifiers: [TimelineUniqueId] {
|
||||
var mainItemIdentifiers: [TimelineItemIdentifier.UniqueID] {
|
||||
guard sectionIdentifiers.contains(.main) else { return [] }
|
||||
return itemIdentifiers(inSection: .main)
|
||||
}
|
||||
|
||||
@@ -658,7 +658,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
|
||||
// MARK: - Timeline Item Building
|
||||
|
||||
private func buildTimelineViews(timelineItems: [RoomTimelineItemProtocol], isSwitchingTimelines: Bool = false) {
|
||||
var timelineItemsDictionary = OrderedDictionary<TimelineUniqueId, RoomTimelineItemViewState>()
|
||||
var timelineItemsDictionary = OrderedDictionary<TimelineItemIdentifier.UniqueID, RoomTimelineItemViewState>()
|
||||
|
||||
timelineItems.filter { $0 is RedactedRoomTimelineItem }.forEach { timelineItem in
|
||||
// Stops the audio player when a voice message is redacted.
|
||||
|
||||
@@ -613,7 +613,7 @@ private struct MockTimelineContent: View {
|
||||
}
|
||||
|
||||
func makeItemIdentifier() -> TimelineItemIdentifier {
|
||||
isPinned ? .event(uniqueID: .init(id: ""), eventOrTransactionID: .eventId(eventId: "pinned")) : .randomEvent
|
||||
isPinned ? .event(uniqueID: .init(""), eventOrTransactionID: .eventID("pinned")) : .randomEvent
|
||||
}
|
||||
|
||||
var replyDetails: TimelineItemReplyDetails? {
|
||||
|
||||
@@ -79,8 +79,8 @@ struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
||||
}()
|
||||
|
||||
static let sendingLast: TextRoomTimelineItem = {
|
||||
let id = viewModel.state.timelineState.uniqueIDs.last ?? .init(id: UUID().uuidString)
|
||||
var result = TextRoomTimelineItem(id: .event(uniqueID: id, eventOrTransactionID: .eventId(eventId: UUID().uuidString)),
|
||||
let id = viewModel.state.timelineState.uniqueIDs.last ?? .init(UUID().uuidString)
|
||||
var result = TextRoomTimelineItem(id: .event(uniqueID: id, eventOrTransactionID: .eventID(UUID().uuidString)),
|
||||
timestamp: .mock,
|
||||
isOutgoing: true,
|
||||
isEditable: false,
|
||||
@@ -99,8 +99,8 @@ struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
||||
}()
|
||||
|
||||
static let sentLast: TextRoomTimelineItem = {
|
||||
let id = viewModel.state.timelineState.uniqueIDs.last ?? .init(id: UUID().uuidString)
|
||||
let result = TextRoomTimelineItem(id: .event(uniqueID: id, eventOrTransactionID: .eventId(eventId: UUID().uuidString)),
|
||||
let id = viewModel.state.timelineState.uniqueIDs.last ?? .init(UUID().uuidString)
|
||||
let result = TextRoomTimelineItem(id: .event(uniqueID: id, eventOrTransactionID: .eventID(UUID().uuidString)),
|
||||
timestamp: .mock,
|
||||
isOutgoing: true,
|
||||
isEditable: false,
|
||||
|
||||
+2
-2
@@ -52,8 +52,8 @@ struct CollapsibleRoomTimelineView: View {
|
||||
|
||||
struct CollapsibleRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
||||
static let item = CollapsibleTimelineItem(items: [
|
||||
SeparatorRoomTimelineItem(id: .virtual(uniqueID: .init(id: "First separator")), timestamp: .mock),
|
||||
SeparatorRoomTimelineItem(id: .virtual(uniqueID: .init(id: "Second separator")), timestamp: .mock)
|
||||
SeparatorRoomTimelineItem(id: .virtual(uniqueID: .init("First separator")), timestamp: .mock),
|
||||
SeparatorRoomTimelineItem(id: .virtual(uniqueID: .init("Second separator")), timestamp: .mock)
|
||||
])
|
||||
|
||||
static var previews: some View {
|
||||
|
||||
+2
-2
@@ -44,7 +44,7 @@ struct ImageRoomTimelineView: View {
|
||||
private var loadableImage: some View {
|
||||
if timelineItem.content.contentType == .gif {
|
||||
LoadableImage(mediaSource: timelineItem.content.imageInfo.source,
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID.id),
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID),
|
||||
blurhash: timelineItem.content.blurhash,
|
||||
size: timelineItem.content.imageInfo.size,
|
||||
mediaProvider: context?.mediaProvider) {
|
||||
@@ -53,7 +53,7 @@ struct ImageRoomTimelineView: View {
|
||||
.timelineMediaFrame(imageInfo: timelineItem.content.imageInfo)
|
||||
} else {
|
||||
LoadableImage(mediaSource: timelineItem.content.thumbnailInfo?.source ?? timelineItem.content.imageInfo.source,
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID.id),
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID),
|
||||
blurhash: timelineItem.content.blurhash,
|
||||
size: timelineItem.content.thumbnailInfo?.size ?? timelineItem.content.imageInfo.size,
|
||||
mediaProvider: context?.mediaProvider) {
|
||||
|
||||
+2
-2
@@ -33,7 +33,7 @@ struct ReadMarkerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
||||
|
||||
static var previews: some View {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
RoomTimelineItemView(viewState: .init(type: .separator(.init(id: .virtual(uniqueID: .init(id: "Separator")), timestamp: .mock)), groupStyle: .single))
|
||||
RoomTimelineItemView(viewState: .init(type: .separator(.init(id: .virtual(uniqueID: .init("Separator")), timestamp: .mock)), groupStyle: .single))
|
||||
RoomTimelineItemView(viewState: .init(type: .text(.init(id: .randomEvent,
|
||||
timestamp: .mock,
|
||||
isOutgoing: true,
|
||||
@@ -45,7 +45,7 @@ struct ReadMarkerRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
||||
|
||||
ReadMarkerRoomTimelineView(timelineItem: item)
|
||||
|
||||
RoomTimelineItemView(viewState: .init(type: .separator(.init(id: .virtual(uniqueID: .init(id: "Separator")), timestamp: .mock)), groupStyle: .single))
|
||||
RoomTimelineItemView(viewState: .init(type: .separator(.init(id: .virtual(uniqueID: .init("Separator")), timestamp: .mock)), groupStyle: .single))
|
||||
RoomTimelineItemView(viewState: .init(type: .text(.init(id: .randomEvent,
|
||||
timestamp: .mock,
|
||||
isOutgoing: false,
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ struct SeparatorRoomTimelineView: View {
|
||||
|
||||
struct SeparatorRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
||||
static var previews: some View {
|
||||
let item = SeparatorRoomTimelineItem(id: .virtual(uniqueID: .init(id: "Separator")),
|
||||
let item = SeparatorRoomTimelineItem(id: .virtual(uniqueID: .init("Separator")),
|
||||
timestamp: .mock)
|
||||
SeparatorRoomTimelineView(timelineItem: item)
|
||||
}
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ struct StickerRoomTimelineView: View {
|
||||
var body: some View {
|
||||
TimelineStyler(timelineItem: timelineItem) {
|
||||
LoadableImage(mediaSource: timelineItem.imageInfo.source,
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID.id),
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID),
|
||||
blurhash: timelineItem.blurhash,
|
||||
size: timelineItem.imageInfo.size,
|
||||
mediaProvider: context?.mediaProvider) {
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ struct VideoRoomTimelineView: View {
|
||||
var thumbnail: some View {
|
||||
if let thumbnailSource = timelineItem.content.thumbnailInfo?.source {
|
||||
LoadableImage(mediaSource: thumbnailSource,
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID.id),
|
||||
mediaType: .timelineItem(uniqueID: timelineItem.id.uniqueID),
|
||||
blurhash: timelineItem.content.blurhash,
|
||||
size: timelineItem.content.thumbnailInfo?.size,
|
||||
mediaProvider: context?.mediaProvider) { imageView in
|
||||
|
||||
Reference in New Issue
Block a user