Files
honeyDueKMP/iosApp/iosApp/Residence/ResidenceViewModel.swift
Trey t e24d1d8559 wip
2025-11-06 09:25:21 -06:00

151 lines
5.1 KiB
Swift

import Foundation
import ComposeApp
import Combine
@MainActor
class ResidenceViewModel: ObservableObject {
// MARK: - Published Properties
@Published var residenceSummary: ResidenceSummaryResponse?
@Published var myResidences: MyResidencesResponse?
@Published var selectedResidence: Residence?
@Published var isLoading: Bool = false
@Published var errorMessage: String?
// MARK: - Private Properties
private let residenceApi: ResidenceApi
private let tokenStorage: TokenStorage
// MARK: - Initialization
init() {
self.residenceApi = ResidenceApi(client: ApiClient_iosKt.createHttpClient())
self.tokenStorage = TokenStorage.shared
}
// MARK: - Public Methods
func loadResidenceSummary() {
guard let token = tokenStorage.getToken() else {
errorMessage = "Not authenticated"
return
}
isLoading = true
errorMessage = nil
residenceApi.getResidenceSummary(token: token) { result, error in
if let successResult = result as? ApiResultSuccess<ResidenceSummaryResponse> {
self.residenceSummary = successResult.data
self.isLoading = false
} else if let errorResult = result as? ApiResultError {
self.errorMessage = errorResult.message
self.isLoading = false
} else if let error = error {
self.errorMessage = error.localizedDescription
self.isLoading = false
}
}
}
func loadMyResidences() {
guard let token = tokenStorage.getToken() else {
errorMessage = "Not authenticated"
return
}
isLoading = true
errorMessage = nil
residenceApi.getMyResidences(token: token) { result, error in
if let successResult = result as? ApiResultSuccess<MyResidencesResponse> {
self.myResidences = successResult.data
self.isLoading = false
} else if let errorResult = result as? ApiResultError {
self.errorMessage = errorResult.message
self.isLoading = false
} else if let error = error {
self.errorMessage = error.localizedDescription
self.isLoading = false
}
}
}
func getResidence(id: Int32) {
guard let token = tokenStorage.getToken() else {
errorMessage = "Not authenticated"
return
}
isLoading = true
errorMessage = nil
residenceApi.getResidence(token: token, id: id) { result, error in
if let successResult = result as? ApiResultSuccess<Residence> {
self.selectedResidence = successResult.data
self.isLoading = false
} else if let errorResult = result as? ApiResultError {
self.errorMessage = errorResult.message
self.isLoading = false
} else if let error = error {
self.errorMessage = error.localizedDescription
self.isLoading = false
}
}
}
func createResidence(request: ResidenceCreateRequest, completion: @escaping (Bool) -> Void) {
guard let token = tokenStorage.getToken() else {
errorMessage = "Not authenticated"
completion(false)
return
}
isLoading = true
errorMessage = nil
residenceApi.createResidence(token: token, request: request) { result, error in
if result is ApiResultSuccess<Residence> {
self.isLoading = false
completion(true)
} else if let errorResult = result as? ApiResultError {
self.errorMessage = errorResult.message
self.isLoading = false
completion(false)
} else if let error = error {
self.errorMessage = error.localizedDescription
self.isLoading = false
completion(false)
}
}
}
func updateResidence(id: Int32, request: ResidenceCreateRequest, completion: @escaping (Bool) -> Void) {
guard let token = tokenStorage.getToken() else {
errorMessage = "Not authenticated"
completion(false)
return
}
isLoading = true
errorMessage = nil
residenceApi.updateResidence(token: token, id: id, request: request) { result, error in
if let successResult = result as? ApiResultSuccess<Residence> {
self.selectedResidence = successResult.data
self.isLoading = false
completion(true)
} else if let errorResult = result as? ApiResultError {
self.errorMessage = errorResult.message
self.isLoading = false
completion(false)
} else if let error = error {
self.errorMessage = error.localizedDescription
self.isLoading = false
completion(false)
}
}
}
func clearError() {
errorMessage = nil
}
}