53 lines
1.6 KiB
Swift
53 lines
1.6 KiB
Swift
import Foundation
|
|
import Combine
|
|
|
|
@MainActor
|
|
final class WorkspaceStore: ObservableObject {
|
|
@Published private(set) var workspaces: [SonarWorkspace] = [.personal]
|
|
@Published var selectedWorkspaceID: UUID = SonarWorkspace.personal.id
|
|
|
|
private let driveStore = ICloudDriveStore.shared
|
|
private let fileName = "workspaces.json"
|
|
|
|
var selectedWorkspace: SonarWorkspace {
|
|
workspaces.first(where: { $0.id == selectedWorkspaceID }) ?? .personal
|
|
}
|
|
|
|
init() {
|
|
load()
|
|
}
|
|
|
|
func load() {
|
|
do {
|
|
guard let saved = try driveStore.read([SonarWorkspace].self, fileName: fileName), !saved.isEmpty else {
|
|
persist()
|
|
return
|
|
}
|
|
workspaces = saved
|
|
if !workspaces.contains(where: { $0.id == selectedWorkspaceID }) {
|
|
selectedWorkspaceID = workspaces.first?.id ?? SonarWorkspace.personal.id
|
|
}
|
|
} catch {
|
|
// Keep Personal usable if iCloud is temporarily unavailable.
|
|
workspaces = [.personal]
|
|
}
|
|
}
|
|
|
|
func createTeam(name: String) {
|
|
let clean = name.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
guard !clean.isEmpty else { return }
|
|
let team = SonarWorkspace(name: clean, kind: .team, role: .owner)
|
|
workspaces.append(team)
|
|
selectedWorkspaceID = team.id
|
|
persist()
|
|
}
|
|
|
|
func select(_ workspace: SonarWorkspace) {
|
|
selectedWorkspaceID = workspace.id
|
|
}
|
|
|
|
private func persist() {
|
|
try? driveStore.write(workspaces, fileName: fileName)
|
|
}
|
|
}
|