81 lines
2.5 KiB
Swift
81 lines
2.5 KiB
Swift
|
//
|
||
|
// ComposeAttachmentImage.swift
|
||
|
// Tusker
|
||
|
//
|
||
|
// Created by Shadowfacts on 11/10/21.
|
||
|
// Copyright © 2021 Shadowfacts. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import SwiftUI
|
||
|
import Photos
|
||
|
|
||
|
struct ComposeAttachmentImage: View {
|
||
|
let attachment: CompositionAttachment
|
||
|
let fullSize: Bool
|
||
|
|
||
|
@State private var image: UIImage? = nil
|
||
|
@State private var imageContentMode: ContentMode = .fill
|
||
|
@State private var imageBackgroundColor: Color = .black
|
||
|
|
||
|
@Environment(\.colorScheme) private var colorScheme: ColorScheme
|
||
|
|
||
|
var body: some View {
|
||
|
if let image = image {
|
||
|
Image(uiImage: image)
|
||
|
.resizable()
|
||
|
.aspectRatio(contentMode: imageContentMode)
|
||
|
.background(imageBackgroundColor)
|
||
|
} else {
|
||
|
Image(systemName: placeholderImageName)
|
||
|
.onAppear(perform: self.loadImage)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private var placeholderImageName: String {
|
||
|
switch colorScheme {
|
||
|
case .light:
|
||
|
return "photo"
|
||
|
case .dark:
|
||
|
return "photo.fill"
|
||
|
@unknown default:
|
||
|
return "photo"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private func loadImage() {
|
||
|
switch attachment.data {
|
||
|
case let .image(image):
|
||
|
self.image = image
|
||
|
case let .asset(asset):
|
||
|
let size: CGSize
|
||
|
if fullSize {
|
||
|
size = PHImageManagerMaximumSize
|
||
|
} else {
|
||
|
// currently only used as thumbnail in ComposeAttachmentRow
|
||
|
size = CGSize(width: 80, height: 80)
|
||
|
}
|
||
|
PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: .aspectFill, options: nil) { (image, _) in
|
||
|
DispatchQueue.main.async {
|
||
|
self.image = image
|
||
|
}
|
||
|
}
|
||
|
case let .video(url):
|
||
|
let asset = AVURLAsset(url: url)
|
||
|
let imageGenerator = AVAssetImageGenerator(asset: asset)
|
||
|
if let cgImage = try? imageGenerator.copyCGImage(at: .zero, actualTime: nil) {
|
||
|
self.image = UIImage(cgImage: cgImage)
|
||
|
}
|
||
|
case let .drawing(drawing):
|
||
|
image = drawing.imageInLightMode(from: drawing.bounds)
|
||
|
imageContentMode = .fit
|
||
|
imageBackgroundColor = .white
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct ComposeAttachmentImage_Previews: PreviewProvider {
|
||
|
static var previews: some View {
|
||
|
ComposeAttachmentImage(attachment: CompositionAttachment(data: .image(UIImage())), fullSize: false)
|
||
|
}
|
||
|
}
|