ImageContainerView.swift (2781B)
1 // 2 // CarouselImageContainerView.swift 3 // damus 4 // 5 // Created by William Casarin on 2023-03-23. 6 // 7 8 import SwiftUI 9 import Kingfisher 10 11 12 struct ImageContainerView: View { 13 let video_coordinator: DamusVideoCoordinator 14 let url: MediaUrl 15 let settings: UserSettingsStore 16 17 @Binding var imageDict: [URL: UIImage] 18 @State private var image: UIImage? 19 @State private var showShareSheet = false 20 21 init(video_coordinator: DamusVideoCoordinator, url: MediaUrl, settings: UserSettingsStore, imageDict: Binding<[URL: UIImage]>) { 22 self.video_coordinator = video_coordinator 23 self.url = url 24 self.settings = settings 25 self._imageDict = imageDict 26 } 27 28 private struct ImageHandler: ImageModifier { 29 @Binding var handler: UIImage? 30 @Binding var imageDict: [URL: UIImage] 31 let url: URL 32 33 func modify(_ image: UIImage) -> UIImage { 34 handler = image 35 imageDict[url] = image 36 return image 37 } 38 } 39 40 func Img(url: URL) -> some View { 41 KFAnimatedImage(url) 42 .imageContext(.note, disable_animation: settings.disable_animation) 43 .configure { view in 44 view.framePreloadCount = 3 45 } 46 .imageModifier(ImageHandler(handler: $image, imageDict: $imageDict, url: url)) 47 .kfClickable() 48 .clipped() 49 .modifier(ImageContextMenuModifier(url: url, image: image, settings: settings, showShareSheet: $showShareSheet)) 50 .sheet(isPresented: $showShareSheet) { 51 ShareSheet(activityItems: [url]) 52 } 53 } 54 55 var body: some View { 56 Group { 57 switch url { 58 case .image(let url): 59 Img(url: url) 60 case .video(let url): 61 DamusVideoPlayerView(url: url, coordinator: video_coordinator, style: .no_controls(on_tap: nil)) 62 } 63 } 64 } 65 } 66 67 let test_image_url = URL(string: "https://jb55.com/red-me.jpg")! 68 fileprivate let test_video_url = URL(string: "http://cdn.jb55.com/s/zaps-build.mp4")! 69 70 struct ImageContainerView_Previews: PreviewProvider { 71 static var previews: some View { 72 @State var imageDict: [URL: UIImage] = [:] 73 Group { 74 ImageContainerView(video_coordinator: test_damus_state.video, url: .image(test_image_url), settings: test_damus_state.settings, imageDict: $imageDict) 75 .previewDisplayName("Image") 76 ImageContainerView(video_coordinator: test_damus_state.video, url: .video(test_video_url), settings: test_damus_state.settings, imageDict: $imageDict) 77 .previewDisplayName("Video") 78 } 79 .environmentObject(OrientationTracker()) 80 } 81 }