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