TM-SGNL-iOS/Signal/ConversationView/Loading/CVViewStateSnapshot.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

86 lines
3.2 KiB
Swift

//
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import LibSignalClient
import SignalServiceKit
import SignalUI
// This captures the CV view state that can affect the load.
// It is used when building, measuring & configuring components and their views.
struct CVViewStateSnapshot {
let textExpansion: CVTextExpansion
let spoilerReveal: SpoilerRevealState.Snapshot
let messageSwipeActionState: CVMessageSwipeActionState
// We can only measure (configure) with a given ConversationStyle.
// So we need to capture the ConversationStyle at the time the
// update is initiated. If the ConversationStyle has changed by
// the time the update is delivered, we should reject the update
// and request a new one.
let coreState: CVCoreState
public var conversationStyle: ConversationStyle { coreState.conversationStyle }
public var mediaCache: CVMediaCache { coreState.mediaCache }
// TODO: We need to determine exactly what the desired behavior here is.
let collapseCutoffDate = Date()
let typingIndicatorsSender: SignalServiceAddress?
let uiMode: ConversationUIMode
let previousUIMode: ConversationUIMode
public var isShowingSelectionUI: Bool { uiMode.hasSelectionUI }
public var wasShowingSelectionUI: Bool { previousUIMode.hasSelectionUI }
let searchText: String?
let oldestUnreadMessageSortId: UInt64?
let hasActiveCall: Bool
let currentGroupThreadCallGroupId: GroupIdentifier?
private static var currentCallProvider: any CurrentCallProvider { DependenciesBridge.shared.currentCallProvider }
static func snapshot(
viewState: CVViewState,
typingIndicatorsSender: SignalServiceAddress?,
oldestUnreadMessageSortId: UInt64?,
previousViewStateSnapshot: CVViewStateSnapshot?
) -> CVViewStateSnapshot {
CVViewStateSnapshot(
textExpansion: viewState.textExpansion.copy(),
spoilerReveal: viewState.spoilerState.revealState.snapshot(),
messageSwipeActionState: viewState.messageSwipeActionState.copy(),
coreState: viewState.asCoreState,
typingIndicatorsSender: typingIndicatorsSender,
uiMode: viewState.uiMode,
previousUIMode: previousViewStateSnapshot?.uiMode ?? .normal,
searchText: viewState.lastSearchedText,
oldestUnreadMessageSortId: oldestUnreadMessageSortId,
hasActiveCall: currentCallProvider.hasCurrentCall,
currentGroupThreadCallGroupId: currentCallProvider.currentGroupThreadCallGroupId
)
}
static func mockSnapshotForStandaloneItems(
coreState: CVCoreState,
spoilerReveal: SpoilerRevealState
) -> CVViewStateSnapshot {
CVViewStateSnapshot(
textExpansion: CVTextExpansion(),
spoilerReveal: spoilerReveal.snapshot(),
messageSwipeActionState: CVMessageSwipeActionState(),
coreState: coreState,
typingIndicatorsSender: nil,
uiMode: .normal,
previousUIMode: .normal,
searchText: nil,
oldestUnreadMessageSortId: nil,
hasActiveCall: false,
currentGroupThreadCallGroupId: nil
)
}
}