151 lines
5.1 KiB
Swift
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
|
|
}
|
|
}
|