Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/Signal/src/ViewControllers/HomeView/Stories/MyStoryViewModel.swift
1 views
//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import Foundation
import SignalServiceKit

struct MyStoryViewModel {
    let messages: [StoryMessage]

    let latestMessageIdentifier: InteractionSnapshotIdentifier?
    let latestMessageAttachment: StoryThumbnailView.Attachment?
    let latestMessageTimestamp: UInt64?
    let sendingCount: UInt64

    enum FailureState {
        case none
        case partial
        case complete
    }

    let failureState: FailureState

    let secondLatestMessageIdentifier: InteractionSnapshotIdentifier?
    let secondLatestMessageAttachment: StoryThumbnailView.Attachment?

    init(messages: [StoryMessage], transaction: DBReadTransaction) {
        sendingCount = messages.reduce(0) {
            $0 + ([.sending, .pending].contains($1.sendingState) ? 1 : 0)
        }

        let sortedFilteredMessages = messages.sorted { $0.timestamp < $1.timestamp }.suffix(2)
        self.messages = Array(sortedFilteredMessages)

        if let latestFailedMessage = sortedFilteredMessages.last(where: { $0.sendingState == .failed }) {
            failureState = latestFailedMessage.hasSentToAnyRecipients ? .partial : .complete
        } else {
            failureState = .none
        }

        if let latestMessage = sortedFilteredMessages.last {
            latestMessageIdentifier = .fromStoryMessage(latestMessage)
            latestMessageAttachment = .from(latestMessage, transaction: transaction)
            latestMessageTimestamp = latestMessage.timestamp
        } else {
            latestMessageIdentifier = nil
            latestMessageAttachment = nil
            latestMessageTimestamp = nil
        }

        if let secondLatestMessage = sortedFilteredMessages.dropLast().last {
            secondLatestMessageIdentifier = .fromStoryMessage(secondLatestMessage)
            secondLatestMessageAttachment = .from(secondLatestMessage, transaction: transaction)
        } else {
            secondLatestMessageIdentifier = nil
            secondLatestMessageAttachment = nil
        }
    }
}