relays: fix crash in new RelayPicView

This commit is contained in:
William Casarin
2023-09-11 14:00:10 -07:00
parent e3ccf95780
commit 6a88ca2777

View File

@@ -9,6 +9,16 @@ import SwiftUI
import Kingfisher import Kingfisher
import TLDExtract import TLDExtract
struct FailedRelayImage: View {
let url: URL?
var body: some View {
let abbrv = String(url?.hostname?.first?.uppercased() ?? "R")
Text("\(abbrv)")
.font(.system(size: 40, weight: .bold))
}
}
struct InnerRelayPicView: View { struct InnerRelayPicView: View {
let url: URL? let url: URL?
let size: CGFloat let size: CGFloat
@@ -16,36 +26,38 @@ struct InnerRelayPicView: View {
let disable_animation: Bool let disable_animation: Bool
@State var failedImage: Bool = false @State var failedImage: Bool = false
var Placeholder: some View { func Placeholder(url: URL?) -> some View {
ZStack {
RoundedRectangle(cornerRadius: 15) RoundedRectangle(cornerRadius: 15)
.frame(width: size, height: size) .frame(width: size, height: size)
.foregroundColor(DamusColors.adaptableGrey) .foregroundColor(DamusColors.adaptableGrey)
.overlay(RoundedRectangle(cornerRadius: 15).stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight))) .overlay(RoundedRectangle(cornerRadius: 15).stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
.padding(2) .padding(2)
FailedRelayImage(url: url)
}
} }
var body: some View { var body: some View {
ZStack { ZStack {
Color(uiColor: .secondarySystemBackground) Color(uiColor: .secondarySystemBackground)
if let url {
KFAnimatedImage(url) KFAnimatedImage(url)
.imageContext(.pfp, disable_animation: disable_animation) .imageContext(.pfp, disable_animation: disable_animation)
.onFailure({ result in .onFailure { _ in
failedImage = true failedImage = true
}) }
.cancelOnDisappear(true) .cancelOnDisappear(true)
.configure { view in .configure { view in
view.framePreloadCount = 3 view.framePreloadCount = 3
} }
.placeholder { _ in .placeholder { _ in
Placeholder Placeholder(url: url)
} }
.scaledToFit() .scaledToFit()
} else {
if failedImage { FailedRelayImage(url: nil)
let abbrv = String(url?.hostname?.first?.uppercased() ?? "R")
Text("\(abbrv)")
.font(.system(size: 40, weight: .bold))
} }
} }
.frame(width: size, height: size) .frame(width: size, height: size)
@@ -69,22 +81,23 @@ struct RelayPicView: View {
self.disable_animation = disable_animation self.disable_animation = disable_animation
} }
var relay_url: URL? {
get_relay_url(relay: relay, icon: icon)
}
var body: some View { var body: some View {
InnerRelayPicView(url: get_relay_url(relay: relay, icon: icon), size: size, highlight: highlight, disable_animation: disable_animation) InnerRelayPicView(url: relay_url, size: size, highlight: highlight, disable_animation: disable_animation)
} }
} }
func get_relay_url(relay: String, icon: String?) -> URL { func get_relay_url(relay: String, icon: String?) -> URL? {
let extractor = TLDExtract() let extractor = TLDExtract()
var favicon = relay + "/favicon.ico" var favicon = relay + "/favicon.ico"
if let parseRelay: TLDResult = extractor.parse(relay) { if let parseRelay: TLDResult = extractor.parse(relay) {
favicon = "https://" + (parseRelay.rootDomain ?? relay) + "/favicon.ico" favicon = "https://" + (parseRelay.rootDomain ?? relay) + "/favicon.ico"
} }
let pic = icon ?? favicon let pic = icon ?? favicon
if let url = URL(string: pic) { return URL(string: pic)
return url
}
return URL(string: "")!
} }
struct RelayPicView_Previews: PreviewProvider { struct RelayPicView_Previews: PreviewProvider {