#if os(macOS) import Foundation import DocsKit import Observation import RastrilloApple import SwiftUI /// Scene values are opaque IDs, never credentials. Reserve before opening a scene. @MainActor @Observable final class DocsWindows { struct Entry: Identifiable { let id: UUID let account: String var document: String let client: NativeHTTP var title: String var isOpen = false var isDraft = false } var entries: [Entry] = [] var activeAccount: String? var createRequested = false var accountsRequested = false func reserve(account: String, document: String, title: String, client: NativeHTTP) -> UUID { if let index = entries.firstIndex(where: { $0.account == account && $0.client.origin == client.origin && $0.document == document }) { var entry = entries.remove(at: index) entry.title = title entry.isOpen = true entries.insert(entry, at: 0) return entry.id } let entry = Entry(id: UUID(), account: account, document: document, client: client, title: title, isOpen: true) entries.insert(entry, at: 0) return entry.id } func reserveDraft(account: String, client: NativeHTTP) -> UUID { let id = UUID() entries.insert(Entry(id: id, account: account, document: "draft-" + id.uuidString, client: client, title: docsMacString("Untitled document"), isOpen: true, isDraft: true), at: 0) return id } func attach(_ id: UUID, document: String, title: String) { guard let index = entries.firstIndex(where: { $0.id == id }) else { return } entries[index].document = document; entries[index].title = title; entries[index].isDraft = false let account = entries[index].account entries.removeAll { $0.id != id && !$0.isOpen && $0.account == account && $0.document == document } } func updateRecents(_ documents: [(String, String)], account: String, client: NativeHTTP) { for (document, title) in documents { if let index = entries.firstIndex(where: { $0.account == account && $0.client.origin == client.origin && $0.document == document }) { entries[index].title = title } else { entries.append(Entry(id: UUID(), account: account, document: document, client: client, title: title)) } } } func setOpen(_ id: UUID, _ value: Bool) { if let index = entries.firstIndex(where: { $0.id == id }) { if !value && entries[index].isDraft { entries.remove(at: index) } else { entries[index].isOpen = value } } } func canSignOut(_ account: String?) -> Bool { !entries.contains { $0.account == account && $0.isOpen } } } extension FocusedValues { @Entry var docsWindowAccount: String? } #endif