From 4c6e242215f915a412d3e3287870769b41086241 Mon Sep 17 00:00:00 2001 From: Justin Mazzocchi <2831158+jzzocc@users.noreply.github.com> Date: Mon, 5 Oct 2020 16:44:15 -0700 Subject: [PATCH] Refactoring --- DB/Sources/DB/Content/ContextItemsInfo.swift | 1 + DB/Sources/DB/Content/TimelineItemsInfo.swift | 2 +- DB/Sources/DB/Entities/CollectionItem.swift | 12 ++++++++--- .../Services/CollectionService.swift | 3 --- .../Services/ContextService.swift | 1 - .../ViewModels/CollectionItemsViewModel.swift | 20 +++++++++---------- .../Entities/CollectionItemIdentifier.swift | 2 +- 7 files changed, 22 insertions(+), 19 deletions(-) diff --git a/DB/Sources/DB/Content/ContextItemsInfo.swift b/DB/Sources/DB/Content/ContextItemsInfo.swift index de477c6..d22acd8 100644 --- a/DB/Sources/DB/Content/ContextItemsInfo.swift +++ b/DB/Sources/DB/Content/ContextItemsInfo.swift @@ -34,6 +34,7 @@ extension ContextItemsInfo { && section[index + 1].record.inReplyToId == statusInfo.record.id return .status(.init(status: .init(info: statusInfo), + isContextParent: statusInfo.record.id == parent.record.id, isReplyInContext: isReplyInContext, hasReplyFollowing: hasReplyFollowing)) } diff --git a/DB/Sources/DB/Content/TimelineItemsInfo.swift b/DB/Sources/DB/Content/TimelineItemsInfo.swift index 9657212..e1b43a4 100644 --- a/DB/Sources/DB/Content/TimelineItemsInfo.swift +++ b/DB/Sources/DB/Content/TimelineItemsInfo.swift @@ -51,7 +51,7 @@ extension TimelineItemsInfo { if let pinnedStatusInfos = pinnedStatusesInfo?.pinnedStatusInfos { return [pinnedStatusInfos.filtered(regularExpression: filterRegularExpression) - .map { CollectionItem.status(.init(status: .init(info: $0), pinned: true)) }, + .map { CollectionItem.status(.init(status: .init(info: $0), isPinned: true)) }, timelineItems] } else { return [timelineItems] diff --git a/DB/Sources/DB/Entities/CollectionItem.swift b/DB/Sources/DB/Entities/CollectionItem.swift index 0931fd7..281e46d 100644 --- a/DB/Sources/DB/Entities/CollectionItem.swift +++ b/DB/Sources/DB/Entities/CollectionItem.swift @@ -11,13 +11,19 @@ public enum CollectionItem: Hashable { public extension CollectionItem { struct StatusConfiguration: Hashable { public let status: Status - public let pinned: Bool + public let isContextParent: Bool + public let isPinned: Bool public let isReplyInContext: Bool public let hasReplyFollowing: Bool - init(status: Status, pinned: Bool = false, isReplyInContext: Bool = false, hasReplyFollowing: Bool = false) { + init(status: Status, + isContextParent: Bool = false, + isPinned: Bool = false, + isReplyInContext: Bool = false, + hasReplyFollowing: Bool = false) { self.status = status - self.pinned = pinned + self.isContextParent = isContextParent + self.isPinned = isPinned self.isReplyInContext = isReplyInContext self.hasReplyFollowing = hasReplyFollowing } diff --git a/ServiceLayer/Sources/ServiceLayer/Services/CollectionService.swift b/ServiceLayer/Sources/ServiceLayer/Services/CollectionService.swift index e815f54..6982187 100644 --- a/ServiceLayer/Sources/ServiceLayer/Services/CollectionService.swift +++ b/ServiceLayer/Sources/ServiceLayer/Services/CollectionService.swift @@ -7,7 +7,6 @@ public protocol CollectionService { var nextPageMaxId: AnyPublisher { get } var title: AnyPublisher { get } var navigationService: NavigationService { get } - var contextParentId: String? { get } func request(maxId: String?, minId: String?) -> AnyPublisher } @@ -15,6 +14,4 @@ extension CollectionService { public var nextPageMaxId: AnyPublisher { Empty().eraseToAnyPublisher() } public var title: AnyPublisher { Empty().eraseToAnyPublisher() } - - public var contextParentId: String? { nil } } diff --git a/ServiceLayer/Sources/ServiceLayer/Services/ContextService.swift b/ServiceLayer/Sources/ServiceLayer/Services/ContextService.swift index 46a4527..eed2697 100644 --- a/ServiceLayer/Sources/ServiceLayer/Services/ContextService.swift +++ b/ServiceLayer/Sources/ServiceLayer/Services/ContextService.swift @@ -9,7 +9,6 @@ import MastodonAPI public struct ContextService { public let sections: AnyPublisher<[[CollectionItem]], Error> public let navigationService: NavigationService - public var contextParentId: String? { id } private let id: Status.Id private let mastodonAPIClient: MastodonAPIClient diff --git a/ViewModels/Sources/ViewModels/CollectionItemsViewModel.swift b/ViewModels/Sources/ViewModels/CollectionItemsViewModel.swift index bbb5658..11282a4 100644 --- a/ViewModels/Sources/ViewModels/CollectionItemsViewModel.swift +++ b/ViewModels/Sources/ViewModels/CollectionItemsViewModel.swift @@ -81,7 +81,7 @@ extension CollectionItemsViewModel: CollectionViewModel { public func canSelect(indexPath: IndexPath) -> Bool { switch items.value[indexPath.section][indexPath.item] { case let .status(configuration): - return configuration.status.id != collectionService.contextParentId + return !configuration.isContextParent case .loadMore: return !((viewModel(indexPath: indexPath) as? LoadMoreViewModel)?.loading ?? false) default: @@ -104,8 +104,8 @@ extension CollectionItemsViewModel: CollectionViewModel { cache(viewModel: viewModel, forItem: item) } - viewModel.isContextParent = configuration.status.id == collectionService.contextParentId - viewModel.isPinned = configuration.pinned + viewModel.isContextParent = configuration.isContextParent + viewModel.isPinned = configuration.isPinned viewModel.isReplyInContext = configuration.isReplyInContext viewModel.hasReplyFollowing = configuration.hasReplyFollowing @@ -156,14 +156,14 @@ private extension CollectionItemsViewModel { maintainScrollPositionOfItem = nil // clear old value // Maintain scroll position of parent after initial load of context - if let contextParentId = collectionService.contextParentId { - let contextParentIdentifier = CollectionItemIdentifier(id: contextParentId, kind: .status, info: [:]) - let onlyContextParentId = [[], [contextParentIdentifier], []] + if collectionService is ContextService, + items.value.isEmpty || items.value.map(\.count) == [0, 1, 0], + let contextParent = newItems.reduce([], +).first(where: { + guard case let .status(configuration) = $0 else { return false } - if items.value.isEmpty - || items.value.map({ $0.map(CollectionItemIdentifier.init(item:)) }) == onlyContextParentId { - maintainScrollPositionOfItem = contextParentIdentifier - } + return configuration.isContextParent + }) { + maintainScrollPositionOfItem = .init(item: contextParent) } } } diff --git a/ViewModels/Sources/ViewModels/Entities/CollectionItemIdentifier.swift b/ViewModels/Sources/ViewModels/Entities/CollectionItemIdentifier.swift index b8e9a8b..87a61fb 100644 --- a/ViewModels/Sources/ViewModels/Entities/CollectionItemIdentifier.swift +++ b/ViewModels/Sources/ViewModels/Entities/CollectionItemIdentifier.swift @@ -27,7 +27,7 @@ extension CollectionItemIdentifier { case let .status(configuration): id = configuration.status.id kind = .status - info = configuration.pinned ? [.pinned: true] : [:] + info = configuration.isPinned ? [.pinned: true] : [:] case let .loadMore(loadMore): id = loadMore.afterStatusId kind = .loadMore