// // Copyright 2022-2024 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. // import Combine import Foundation import MatrixRustSDK enum PaginationDirection: String { case backwards, forwards } enum PaginationStatus { case idle case timelineEndReached case paginating } struct PaginationState: Equatable { /// An initial state that is used to prevent pagination whilst loading the timeline. /// Once the initial items are loaded the TimelineProxy will publish the correct value. static var initial = PaginationState(backward: .timelineEndReached, forward: .timelineEndReached) let backward: PaginationStatus let forward: PaginationStatus } @MainActor // sourcery: AutoMockable protocol TimelineProviderProtocol { /// A publisher that signals when ``itemProxies`` or ``paginationState`` are changed. var updatePublisher: AnyPublisher<([TimelineItemProxy], PaginationState), Never> { get } /// The current set of items in the timeline. var itemProxies: [TimelineItemProxy] { get } /// Whether the timeline is back/forward paginating or not (or has reached the start/end of the room). var paginationState: PaginationState { get } /// The kind of the timeline var kind: TimelineKind { get } /// A publisher that signals when changes to the room's membership have occurred through `/sync`. /// /// This is temporary and will be replace by a subscription on the room itself. var membershipChangePublisher: AnyPublisher { get } }