damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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 }