75 lines
2.1 KiB
Swift
75 lines
2.1 KiB
Swift
#if os(iOS) || os(macOS)
|
|
import Foundation
|
|
import Library
|
|
import SwiftUI
|
|
|
|
@MainActor
|
|
public final class EditProfileContentViewModel: ObservableObject {
|
|
@Published public var isLoading = true
|
|
@Published public var profile: Profile?
|
|
@Published public var profileContent = ""
|
|
@Published public var isChanged = false
|
|
@Published public var alert: Alert?
|
|
|
|
private let profileID: Int64?
|
|
|
|
public init(profileID: Int64?) {
|
|
self.profileID = profileID
|
|
}
|
|
|
|
public func markAsChanged() {
|
|
isChanged = true
|
|
}
|
|
|
|
public func reset() {
|
|
isLoading = true
|
|
profile = nil
|
|
profileContent = ""
|
|
isChanged = false
|
|
alert = nil
|
|
}
|
|
|
|
public func loadContent() async {
|
|
do {
|
|
try await loadContentBackground()
|
|
} catch {
|
|
alert = Alert(error)
|
|
}
|
|
isLoading = false
|
|
}
|
|
|
|
private nonisolated func loadContentBackground() async throws {
|
|
guard let profileID else {
|
|
throw NSError(domain: "Context destroyed", code: 0)
|
|
}
|
|
guard let profile = try await ProfileManager.get(profileID) else {
|
|
throw NSError(domain: "Profile missing", code: 0)
|
|
}
|
|
let profileContent = try profile.read()
|
|
await MainActor.run {
|
|
self.profile = profile
|
|
self.profileContent = profileContent
|
|
}
|
|
}
|
|
|
|
public func saveContent() async {
|
|
guard let profile else {
|
|
return
|
|
}
|
|
do {
|
|
try await saveContentBackground(profile)
|
|
} catch {
|
|
alert = Alert(error)
|
|
return
|
|
}
|
|
isChanged = false
|
|
}
|
|
|
|
private nonisolated func saveContentBackground(_ profile: Profile) async throws {
|
|
let profileContent = await profileContent
|
|
try profile.write(profileContent)
|
|
}
|
|
}
|
|
|
|
#endif
|