diff --git a/Packages/Env/Sources/Env/Router.swift b/Packages/Env/Sources/Env/Router.swift index 354ec4d2..8173ff70 100644 --- a/Packages/Env/Sources/Env/Router.swift +++ b/Packages/Env/Sources/Env/Router.swift @@ -68,6 +68,7 @@ public class RouterPath: ObservableObject { @Published public var path: [RouterDestination] = [] @Published public var presentedSheet: SheetDestination? + public init() {} public func navigate(to: RouterDestination) { @@ -94,12 +95,14 @@ public class RouterPath: ObservableObject { client.hasConnection(with: url), let id = Int(url.lastPathComponent) { - if url.absoluteString.contains(client.server) { - navigate(to: .statusDetail(id: String(id))) - } else { - navigate(to: .remoteStatusDetail(url: url)) + if !StatusEmbedCache.shared.badStatusesURLs.contains(url) { + if url.absoluteString.contains(client.server) { + navigate(to: .statusDetail(id: String(id))) + } else { + navigate(to: .remoteStatusDetail(url: url)) + } + return .handled } - return .handled } return urlHandler?(url) ?? .systemAction } diff --git a/Packages/Env/Sources/Env/StatusEmbedCache.swift b/Packages/Env/Sources/Env/StatusEmbedCache.swift new file mode 100644 index 00000000..ffbc8bb2 --- /dev/null +++ b/Packages/Env/Sources/Env/StatusEmbedCache.swift @@ -0,0 +1,22 @@ +import Foundation +import Models +import SwiftUI + +@MainActor +public class StatusEmbedCache { + public static let shared = StatusEmbedCache() + + private var cache: [URL: Status] = [:] + + public var badStatusesURLs = Set() + + private init() {} + + public func set(url: URL, status: Status) { + cache[url] = status + } + + public func get(url: URL) -> Status? { + cache[url] + } +} diff --git a/Packages/Status/Sources/Status/Embed/StatusEmbedCache.swift b/Packages/Status/Sources/Status/Embed/StatusEmbedCache.swift deleted file mode 100644 index 399b3b35..00000000 --- a/Packages/Status/Sources/Status/Embed/StatusEmbedCache.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import Models -import SwiftUI - -@MainActor -class StatusEmbedCache { - static let shared = StatusEmbedCache() - - private var cache: [URL: Status] = [:] - - private init() {} - - func set(url: URL, status: Status) { - cache[url] = status - } - - func get(url: URL) -> Status? { - cache[url] - } -} diff --git a/Packages/Status/Sources/Status/Row/StatusRowViewModel.swift b/Packages/Status/Sources/Status/Row/StatusRowViewModel.swift index 851bbda1..5107405f 100644 --- a/Packages/Status/Sources/Status/Row/StatusRowViewModel.swift +++ b/Packages/Status/Sources/Status/Row/StatusRowViewModel.swift @@ -181,8 +181,8 @@ public class StatusRowViewModel: ObservableObject { let content = status.reblog?.content ?? status.content if !content.statusesURLs.isEmpty, let url = content.statusesURLs.first, - client.hasConnection(with: url) - { + !StatusEmbedCache.shared.badStatusesURLs.contains(url), + client.hasConnection(with: url) { return url } return nil @@ -197,7 +197,7 @@ public class StatusRowViewModel: ObservableObject { } return } - + if let embed = StatusEmbedCache.shared.get(url: url) { isEmbedLoading = false embeddedStatus = embed @@ -220,12 +220,16 @@ public class StatusRowViewModel: ObservableObject { if let embed { StatusEmbedCache.shared.set(url: url, status: embed) } + else { + StatusEmbedCache.shared.badStatusesURLs.insert(url) + } withAnimation { embeddedStatus = embed isEmbedLoading = false } } catch { isEmbedLoading = false + StatusEmbedCache.shared.badStatusesURLs.insert(url) } }