damus

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

ProfileZoomView.swift (2639B)


      1 //
      2 //  ProfileZoomView.swift
      3 //  damus
      4 //
      5 //  Created by scoder1747 on 12/27/22.
      6 //
      7 import SwiftUI
      8 import Kingfisher
      9 
     10 struct ProfileImageContainerView: View {
     11     
     12     let url: URL?
     13     
     14     @State private var image: UIImage?
     15     @State private var showShareSheet = false
     16     
     17     private struct ImageHandler: ImageModifier {
     18         @Binding var handler: UIImage?
     19         
     20         func modify(_ image: UIImage) -> UIImage {
     21             handler = image
     22             return image
     23         }
     24     }
     25     
     26     var body: some View {
     27         
     28         KFAnimatedImage(url)
     29             .imageContext(.pfp)
     30             .configure { view in
     31                 view.framePreloadCount = 3
     32             }
     33             .imageModifier(ImageHandler(handler: $image))
     34             .clipShape(Circle())
     35             .modifier(ImageContextMenuModifier(url: url, image: image, showShareSheet: $showShareSheet))
     36             .sheet(isPresented: $showShareSheet) {
     37                 ShareSheet(activityItems: [url])
     38             }
     39     }
     40 }
     41 
     42 struct ProfileZoomView: View {
     43     
     44     let pubkey: String
     45     let profiles: Profiles
     46     
     47     @Environment(\.presentationMode) var presentationMode
     48     
     49     var navBarView: some View {
     50         HStack {
     51             Button(action: {
     52                 presentationMode.wrappedValue.dismiss()
     53             }, label: {
     54                 Image(systemName: "xmark")
     55                     .frame(width: 33, height: 33)
     56                     .background(.regularMaterial)
     57                     .clipShape(Circle())
     58             })
     59             
     60             Spacer()
     61         }
     62         .padding()
     63     }
     64 
     65     var body: some View {
     66         ZStack {
     67             Color(.systemBackground)
     68                 .ignoresSafeArea()
     69             
     70             ZoomableScrollView {
     71                 ProfileImageContainerView(url: get_profile_url(picture: nil, pubkey: pubkey, profiles: profiles))
     72                     .aspectRatio(contentMode: .fit)
     73                     .padding(.top, Theme.safeAreaInsets?.top)
     74                     .padding(.bottom, Theme.safeAreaInsets?.bottom)
     75                     .padding(.horizontal)
     76             }
     77             .ignoresSafeArea()
     78             .modifier(SwipeToDismissModifier(minDistance: 50, onDismiss: {
     79                 presentationMode.wrappedValue.dismiss()
     80             }))
     81         }
     82         .overlay(navBarView, alignment: .top)
     83     }
     84 }
     85 
     86 struct ProfileZoomView_Previews: PreviewProvider {
     87     static let pubkey = "ca48854ac6555fed8e439ebb4fa2d928410e0eef13fa41164ec45aaaa132d846"
     88     
     89     static var previews: some View {
     90         ProfileZoomView(
     91             pubkey: pubkey,
     92             profiles: make_preview_profiles(pubkey))
     93     }
     94 }