forked from zelo72/mastodon-ios
145 lines
4.0 KiB
Swift
145 lines
4.0 KiB
Swift
//
|
|
// MediaView+Configuration.swift
|
|
// TwidereX
|
|
//
|
|
// Created by Cirno MainasuK on 2021-10-14.
|
|
// Copyright © 2021 Twidere. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Combine
|
|
import CoreData
|
|
import Photos
|
|
|
|
extension MediaView {
|
|
public class Configuration: Hashable {
|
|
|
|
var disposeBag = Set<AnyCancellable>()
|
|
|
|
public let info: Info
|
|
public let blurhash: String?
|
|
|
|
@Published public var isReveal = true
|
|
@Published public var previewImage: UIImage?
|
|
@Published public var blurhashImage: UIImage?
|
|
public var blurhashImageDisposeBag = Set<AnyCancellable>()
|
|
|
|
public init(
|
|
info: MediaView.Configuration.Info,
|
|
blurhash: String?
|
|
) {
|
|
self.info = info
|
|
self.blurhash = blurhash
|
|
}
|
|
|
|
public var aspectRadio: CGSize {
|
|
switch info {
|
|
case .image(let info): return info.aspectRadio
|
|
case .gif(let info): return info.aspectRadio
|
|
case .video(let info): return info.aspectRadio
|
|
}
|
|
}
|
|
|
|
public var previewURL: String? {
|
|
switch info {
|
|
case .image(let info):
|
|
return info.assetURL
|
|
case .gif(let info):
|
|
return info.previewURL
|
|
case .video(let info):
|
|
return info.previewURL
|
|
}
|
|
}
|
|
|
|
public var assetURL: String? {
|
|
switch info {
|
|
case .image(let info):
|
|
return info.assetURL
|
|
case .gif(let info):
|
|
return info.assetURL
|
|
case .video(let info):
|
|
return info.assetURL
|
|
}
|
|
}
|
|
|
|
public var resourceType: PHAssetResourceType {
|
|
switch info {
|
|
case .image:
|
|
return .photo
|
|
case .gif:
|
|
return .video
|
|
case .video:
|
|
return .video
|
|
}
|
|
}
|
|
|
|
public static func == (lhs: MediaView.Configuration, rhs: MediaView.Configuration) -> Bool {
|
|
return lhs.info == rhs.info
|
|
&& lhs.blurhash == rhs.blurhash
|
|
&& lhs.isReveal == rhs.isReveal
|
|
}
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(info)
|
|
hasher.combine(blurhash)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
extension MediaView.Configuration {
|
|
|
|
public enum Info: Hashable {
|
|
case image(info: ImageInfo)
|
|
case gif(info: VideoInfo)
|
|
case video(info: VideoInfo)
|
|
}
|
|
|
|
public struct ImageInfo: Hashable {
|
|
public let aspectRadio: CGSize
|
|
public let assetURL: String?
|
|
|
|
public init(
|
|
aspectRadio: CGSize,
|
|
assetURL: String?
|
|
) {
|
|
self.aspectRadio = aspectRadio
|
|
self.assetURL = assetURL
|
|
}
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(aspectRadio.width)
|
|
hasher.combine(aspectRadio.height)
|
|
assetURL.flatMap { hasher.combine($0) }
|
|
}
|
|
}
|
|
|
|
public struct VideoInfo: Hashable {
|
|
public let aspectRadio: CGSize
|
|
public let assetURL: String?
|
|
public let previewURL: String?
|
|
public let durationMS: Int?
|
|
|
|
public init(
|
|
aspectRadio: CGSize,
|
|
assetURL: String?,
|
|
previewURL: String?,
|
|
durationMS: Int?
|
|
) {
|
|
self.aspectRadio = aspectRadio
|
|
self.assetURL = assetURL
|
|
self.previewURL = previewURL
|
|
self.durationMS = durationMS
|
|
}
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(aspectRadio.width)
|
|
hasher.combine(aspectRadio.height)
|
|
assetURL.flatMap { hasher.combine($0) }
|
|
previewURL.flatMap { hasher.combine($0) }
|
|
durationMS.flatMap { hasher.combine($0) }
|
|
}
|
|
}
|
|
|
|
}
|