damus

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

BannerImageView.swift (3648B)


      1 //
      2 //  BannerImageView.swift
      3 //  damus
      4 //
      5 //  Created by Jason Jōb on 2023-01-10.
      6 //
      7 
      8 import SwiftUI
      9 import Kingfisher
     10 
     11 struct EditBannerImageView: View {
     12     
     13     var damus_state: DamusState
     14     @ObservedObject var viewModel: ImageUploadingObserver
     15     let callback: (URL?) -> Void
     16     let defaultImage = UIImage(named: "profile-banner") ?? UIImage()
     17     
     18     @State var banner_image: URL? = nil
     19 
     20     var body: some View {
     21         ZStack {
     22             Color(uiColor: .systemBackground)
     23             KFAnimatedImage(get_banner_url(banner: banner_image?.absoluteString, pubkey: damus_state.pubkey, profiles: damus_state.profiles))
     24                 .imageContext(.banner, disable_animation: damus_state.settings.disable_animation)
     25                 .configure { view in
     26                     view.framePreloadCount = .max
     27                 }
     28                 .placeholder { _ in
     29                     Color(uiColor: .secondarySystemBackground)
     30                 }
     31                 .onFailureImage(defaultImage)
     32             
     33             EditPictureControl(uploader: damus_state.settings.default_media_uploader, pubkey: damus_state.pubkey, image_url: $banner_image, uploadObserver: viewModel, callback: callback)
     34         }
     35     }
     36 }
     37 
     38 struct InnerBannerImageView: View {
     39     let disable_animation: Bool
     40     let url: URL?
     41     let defaultImage = UIImage(named: "profile-banner") ?? UIImage()
     42 
     43     var body: some View {
     44         ZStack {
     45             Color(uiColor: .systemBackground)
     46             
     47             if (url != nil) {
     48                 KFAnimatedImage(url)
     49                     .imageContext(.banner, disable_animation: disable_animation)
     50                     .configure { view in
     51                         view.framePreloadCount = 3
     52                     }
     53                     .placeholder { _ in
     54                         Color(uiColor: .secondarySystemBackground)
     55                     }
     56                     .onFailureImage(defaultImage)
     57             } else {
     58                 Image(uiImage: defaultImage).resizable()
     59             }
     60         }
     61     }
     62 }
     63 
     64 struct BannerImageView: View {
     65     let disable_animation: Bool
     66     let pubkey: Pubkey
     67     let profiles: Profiles
     68     
     69     @State var banner: String?
     70     
     71     init(pubkey: Pubkey, profiles: Profiles, disable_animation: Bool, banner: String? = nil) {
     72         self.pubkey = pubkey
     73         self.profiles = profiles
     74         self._banner = State(initialValue: banner)
     75         self.disable_animation = disable_animation
     76     }
     77     
     78     var body: some View {
     79         InnerBannerImageView(disable_animation: disable_animation, url: get_banner_url(banner: banner, pubkey: pubkey, profiles: profiles))
     80             .onReceive(handle_notify(.profile_updated)) { updated in
     81                 guard updated.pubkey == self.pubkey,
     82                       let profile_txn = profiles.lookup(id: updated.pubkey)
     83                 else {
     84                     return
     85                 }
     86 
     87                 let profile = profile_txn.unsafeUnownedValue
     88                 if let bannerImage = profile?.banner, bannerImage != self.banner {
     89                     self.banner = bannerImage
     90                 }
     91             }
     92     }
     93 }
     94 
     95 func get_banner_url(banner: String?, pubkey: Pubkey, profiles: Profiles) -> URL? {
     96     let bannerUrlString = banner ?? profiles.lookup(id: pubkey)?.map({ p in p?.banner }).value ?? ""
     97     if let url = URL(string: bannerUrlString) {
     98         return url
     99     }
    100     return nil
    101 }
    102 
    103 struct BannerImageView_Previews: PreviewProvider {
    104     static var previews: some View {
    105         BannerImageView(
    106             pubkey: test_pubkey,
    107             profiles: make_preview_profiles(test_pubkey),
    108             disable_animation: false
    109         )
    110     }
    111 }
    112