relays: fix crash in new RelayPicView
This commit is contained in:
@@ -9,43 +9,55 @@ 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
|
||||||
let highlight: Highlight
|
let highlight: Highlight
|
||||||
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 {
|
||||||
RoundedRectangle(cornerRadius: 15)
|
ZStack {
|
||||||
.frame(width: size, height: size)
|
RoundedRectangle(cornerRadius: 15)
|
||||||
.foregroundColor(DamusColors.adaptableGrey)
|
.frame(width: size, height: size)
|
||||||
.overlay(RoundedRectangle(cornerRadius: 15).stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
|
.foregroundColor(DamusColors.adaptableGrey)
|
||||||
.padding(2)
|
.overlay(RoundedRectangle(cornerRadius: 15).stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
|
||||||
|
.padding(2)
|
||||||
|
|
||||||
|
FailedRelayImage(url: url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
Color(uiColor: .secondarySystemBackground)
|
Color(uiColor: .secondarySystemBackground)
|
||||||
|
|
||||||
KFAnimatedImage(url)
|
if let url {
|
||||||
.imageContext(.pfp, disable_animation: disable_animation)
|
KFAnimatedImage(url)
|
||||||
.onFailure({ result in
|
.imageContext(.pfp, disable_animation: disable_animation)
|
||||||
failedImage = true
|
.onFailure { _ in
|
||||||
})
|
failedImage = true
|
||||||
.cancelOnDisappear(true)
|
}
|
||||||
.configure { view in
|
.cancelOnDisappear(true)
|
||||||
view.framePreloadCount = 3
|
.configure { view in
|
||||||
}
|
view.framePreloadCount = 3
|
||||||
.placeholder { _ in
|
}
|
||||||
Placeholder
|
.placeholder { _ in
|
||||||
}
|
Placeholder(url: url)
|
||||||
.scaledToFit()
|
}
|
||||||
|
.scaledToFit()
|
||||||
if failedImage {
|
} else {
|
||||||
let abbrv = String(url?.hostname?.first?.uppercased() ?? "R")
|
FailedRelayImage(url: nil)
|
||||||
Text("\(abbrv)")
|
|
||||||
.font(.system(size: 40, weight: .bold))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(width: size, height: size)
|
.frame(width: size, height: size)
|
||||||
@@ -68,23 +80,24 @@ struct RelayPicView: View {
|
|||||||
self.highlight = highlight
|
self.highlight = highlight
|
||||||
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user