metatext/ViewModels/Sources/ViewModels/View Models/AttachmentViewModel.swift

74 lines
2.5 KiB
Swift
Raw Normal View History

2020-08-28 19:56:28 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
2021-01-10 01:26:51 +00:00
import Combine
2020-08-28 19:56:28 +00:00
import Foundation
2020-08-30 23:33:11 +00:00
import Mastodon
2020-10-22 22:16:06 +00:00
import Network
2020-08-28 19:56:28 +00:00
2021-01-08 06:11:33 +00:00
public final class AttachmentViewModel: ObservableObject {
2020-09-01 07:33:49 +00:00
public let attachment: Attachment
2021-01-10 01:26:51 +00:00
@Published public var editingDescription: String
@Published public var editingFocus: Attachment.Meta.Focus
@Published public private(set) var descriptionRemainingCharacters = AttachmentViewModel.descriptionMaxCharacters
public let identityContext: IdentityContext
2020-08-28 19:56:28 +00:00
2021-01-08 06:11:33 +00:00
private let status: Status?
2020-10-22 05:05:50 +00:00
2021-01-26 00:06:35 +00:00
init(attachment: Attachment, identityContext: IdentityContext, status: Status? = nil) {
2020-08-28 19:56:28 +00:00
self.attachment = attachment
2021-01-26 00:06:35 +00:00
self.identityContext = identityContext
2021-01-08 06:11:33 +00:00
self.status = status
2021-01-10 01:26:51 +00:00
editingDescription = attachment.description ?? ""
editingFocus = attachment.meta?.focus ?? .default
$editingDescription
.map { Self.descriptionMaxCharacters - $0.count }
.assign(to: &$descriptionRemainingCharacters)
2020-08-28 19:56:28 +00:00
}
}
2020-09-01 07:33:49 +00:00
public extension AttachmentViewModel {
2020-10-22 05:05:50 +00:00
var tag: Int {
2021-01-08 06:11:33 +00:00
attachment.id.appending(status?.id ?? "").hashValue
2020-10-22 05:05:50 +00:00
}
2020-10-22 22:16:06 +00:00
var shouldAutoplay: Bool {
switch attachment.type {
case .video:
2021-01-26 00:06:35 +00:00
return identityContext.appPreferences.autoplayVideos == .always
|| (identityContext.appPreferences.autoplayVideos == .wifi
2020-10-22 22:16:06 +00:00
&& Self.wifiMonitor.currentPath.status == .satisfied)
case .gifv:
2021-01-26 00:06:35 +00:00
return identityContext.appPreferences.autoplayGIFs == .always
|| (identityContext.appPreferences.autoplayGIFs == .wifi
2020-10-22 22:16:06 +00:00
&& Self.wifiMonitor.currentPath.status == .satisfied)
default: return false
}
}
}
2021-01-10 01:26:51 +00:00
extension AttachmentViewModel {
func updated() -> AnyPublisher<AttachmentViewModel, Error> {
2021-01-26 00:06:35 +00:00
identityContext.service.updateAttachment(id: attachment.id,
description: editingDescription,
focus: editingFocus)
2021-01-10 01:26:51 +00:00
.compactMap { [weak self] in
guard let self = self else { return nil }
2021-01-26 00:06:35 +00:00
return AttachmentViewModel(attachment: $0, identityContext: self.identityContext, status: self.status)
2021-01-10 01:26:51 +00:00
}
.eraseToAnyPublisher()
}
}
2020-10-22 22:16:06 +00:00
private extension AttachmentViewModel {
2021-01-10 01:26:51 +00:00
static let descriptionMaxCharacters = 1500
2021-01-08 06:11:33 +00:00
static var wifiMonitor: NWPathMonitor = {
let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
monitor.start(queue: .main)
return monitor
}()
2020-08-28 19:56:28 +00:00
}