import Foundation import OrgSocialKit @Observable @MainActor final class ThreadViewModel { private let postURL: String private let relayURL: URL private let fetcher = ThreadFetcher() var thread: OrgSocialThread? var isLoading = false var errorMessage: String? init(postURL: String, relayURL: URL) { self.postURL = postURL self.relayURL = relayURL } var useRelay: Bool { UserDefaults.standard.object(forKey: "useRelay") as? Bool ?? true } func load() async { // Skip if another load is already in flight, or if we already have data // (the .task modifier re-fires when the view reappears after navigation). guard !isLoading else { return } guard thread == nil else { return } guard useRelay else { errorMessage = "Threads require a relay. Enable Use Relay in Settings." return } isLoading = true errorMessage = nil do { thread = try await fetcher.fetchThread(for: postURL, from: relayURL) } catch { errorMessage = error.localizedDescription } isLoading = false } }