Update Kotlin models and iOS Swift to align with new Go API format
- Update all Kotlin API models to match Go API response structures - Fix Swift type aliases (TaskDetail→TaskResponse, Residence→ResidenceResponse, etc.) - Update TaskCompletionCreateRequest to simplified Go API format (taskId, notes, actualCost, photoUrl) - Fix optional handling for frequency, priority, category, status in task models - Replace isPrimaryOwner with ownerId comparison against current user - Update ResidenceUsersResponse to use owner.id instead of ownerId - Fix non-optional String fields to use isEmpty checks instead of optional binding - Add type aliases for backwards compatibility in Kotlin models 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -7,9 +7,9 @@ struct ManageUsersView: View {
|
||||
let isPrimaryOwner: Bool
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
|
||||
@State private var users: [ResidenceUser] = []
|
||||
@State private var users: [ResidenceUserResponse] = []
|
||||
@State private var ownerId: Int32?
|
||||
@State private var shareCode: ResidenceShareCode?
|
||||
@State private var shareCode: ShareCodeResponse?
|
||||
@State private var isLoading = true
|
||||
@State private var errorMessage: String?
|
||||
@State private var isGeneratingCode = false
|
||||
@@ -100,7 +100,7 @@ struct ManageUsersView: View {
|
||||
if let successResult = result as? ApiResultSuccess<ResidenceUsersResponse>,
|
||||
let responseData = successResult.data as? ResidenceUsersResponse {
|
||||
self.users = Array(responseData.users)
|
||||
self.ownerId = responseData.ownerId as? Int32
|
||||
self.ownerId = Int32(responseData.owner.id)
|
||||
self.isLoading = false
|
||||
} else if let errorResult = result as? ApiResultError {
|
||||
self.errorMessage = ErrorMessageParser.parse(errorResult.message)
|
||||
@@ -127,7 +127,7 @@ struct ManageUsersView: View {
|
||||
let result = try await APILayer.shared.getShareCode(residenceId: Int32(Int(residenceId)))
|
||||
|
||||
await MainActor.run {
|
||||
if let successResult = result as? ApiResultSuccess<ResidenceShareCode> {
|
||||
if let successResult = result as? ApiResultSuccess<ShareCodeResponse> {
|
||||
self.shareCode = successResult.data
|
||||
}
|
||||
// It's okay if there's no active share code
|
||||
@@ -148,7 +148,7 @@ struct ManageUsersView: View {
|
||||
let result = try await APILayer.shared.generateShareCode(residenceId: Int32(Int(residenceId)))
|
||||
|
||||
await MainActor.run {
|
||||
if let successResult = result as? ApiResultSuccess<ResidenceShareCode> {
|
||||
if let successResult = result as? ApiResultSuccess<ShareCodeResponse> {
|
||||
self.shareCode = successResult.data
|
||||
self.isGeneratingCode = false
|
||||
} else if let errorResult = result as? ApiResultError {
|
||||
|
||||
@@ -15,9 +15,9 @@ struct ResidenceDetailView: View {
|
||||
@State private var showEditResidence = false
|
||||
@State private var showEditTask = false
|
||||
@State private var showManageUsers = false
|
||||
@State private var selectedTaskForEdit: TaskDetail?
|
||||
@State private var selectedTaskForComplete: TaskDetail?
|
||||
@State private var selectedTaskForArchive: TaskDetail?
|
||||
@State private var selectedTaskForEdit: TaskResponse?
|
||||
@State private var selectedTaskForComplete: TaskResponse?
|
||||
@State private var selectedTaskForArchive: TaskResponse?
|
||||
@State private var showArchiveConfirmation = false
|
||||
|
||||
@State private var hasAppeared = false
|
||||
@@ -29,7 +29,15 @@ struct ResidenceDetailView: View {
|
||||
@StateObject private var subscriptionCache = SubscriptionCacheWrapper.shared
|
||||
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
|
||||
|
||||
// Check if current user is the owner of the residence
|
||||
private func isCurrentUserOwner(of residence: ResidenceResponse) -> Bool {
|
||||
guard let currentUser = ComposeApp.DataCache.shared.currentUser.value else {
|
||||
return false
|
||||
}
|
||||
return Int(residence.ownerId) == Int(currentUser.id)
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
Color.appBackgroundPrimary
|
||||
@@ -100,7 +108,7 @@ struct ResidenceDetailView: View {
|
||||
ManageUsersView(
|
||||
residenceId: residence.id,
|
||||
residenceName: residence.name,
|
||||
isPrimaryOwner: residence.isPrimaryOwner
|
||||
isPrimaryOwner: isCurrentUserOwner(of: residence)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -184,7 +192,7 @@ private extension ResidenceDetailView {
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
func contentView(for residence: Residence) -> some View {
|
||||
func contentView(for residence: ResidenceResponse) -> some View {
|
||||
ScrollView {
|
||||
VStack(spacing: 16) {
|
||||
PropertyHeaderCard(residence: residence)
|
||||
@@ -251,7 +259,7 @@ private extension ResidenceDetailView {
|
||||
.disabled(viewModel.isGeneratingReport)
|
||||
}
|
||||
|
||||
if let residence = viewModel.selectedResidence, residence.isPrimaryOwner {
|
||||
if let residence = viewModel.selectedResidence, isCurrentUserOwner(of: residence) {
|
||||
Button {
|
||||
showManageUsers = true
|
||||
} label: {
|
||||
@@ -272,7 +280,7 @@ private extension ResidenceDetailView {
|
||||
}
|
||||
.accessibilityIdentifier(AccessibilityIdentifiers.Task.addButton)
|
||||
|
||||
if let residence = viewModel.selectedResidence, residence.isPrimaryOwner {
|
||||
if let residence = viewModel.selectedResidence, isCurrentUserOwner(of: residence) {
|
||||
Button {
|
||||
showDeleteConfirmation = true
|
||||
} label: {
|
||||
@@ -363,9 +371,9 @@ private struct TasksSectionContainer: View {
|
||||
let tasksResponse: TaskColumnsResponse
|
||||
|
||||
@ObservedObject var taskViewModel: TaskViewModel
|
||||
@Binding var selectedTaskForEdit: TaskDetail?
|
||||
@Binding var selectedTaskForComplete: TaskDetail?
|
||||
@Binding var selectedTaskForArchive: TaskDetail?
|
||||
@Binding var selectedTaskForEdit: TaskResponse?
|
||||
@Binding var selectedTaskForComplete: TaskResponse?
|
||||
@Binding var selectedTaskForArchive: TaskResponse?
|
||||
@Binding var showArchiveConfirmation: Bool
|
||||
|
||||
let reloadTasks: () -> Void
|
||||
|
||||
@@ -7,7 +7,7 @@ class ResidenceViewModel: ObservableObject {
|
||||
// MARK: - Published Properties
|
||||
@Published var residenceSummary: ResidenceSummaryResponse?
|
||||
@Published var myResidences: MyResidencesResponse?
|
||||
@Published var selectedResidence: Residence?
|
||||
@Published var selectedResidence: ResidenceResponse?
|
||||
@Published var isLoading: Bool = false
|
||||
@Published var errorMessage: String?
|
||||
@Published var isGeneratingReport: Bool = false
|
||||
@@ -65,7 +65,7 @@ class ResidenceViewModel: ObservableObject {
|
||||
|
||||
sharedViewModel.getResidence(id: id) { result in
|
||||
Task { @MainActor in
|
||||
if let success = result as? ApiResultSuccess<Residence> {
|
||||
if let success = result as? ApiResultSuccess<ResidenceResponse> {
|
||||
self.selectedResidence = success.data
|
||||
self.isLoading = false
|
||||
} else if let error = result as? ApiResultError {
|
||||
@@ -101,7 +101,7 @@ class ResidenceViewModel: ObservableObject {
|
||||
sharedViewModel.updateResidenceState,
|
||||
loadingSetter: { [weak self] in self?.isLoading = $0 },
|
||||
errorSetter: { [weak self] in self?.errorMessage = $0 },
|
||||
onSuccess: { [weak self] (data: Residence) in
|
||||
onSuccess: { [weak self] (data: ResidenceResponse) in
|
||||
self?.selectedResidence = data
|
||||
},
|
||||
completion: completion,
|
||||
|
||||
@@ -121,7 +121,7 @@ struct ResidencesListView: View {
|
||||
|
||||
private struct ResidencesContent: View {
|
||||
let response: MyResidencesResponse
|
||||
let residences: [ResidenceWithTasks]
|
||||
let residences: [ResidenceResponse]
|
||||
|
||||
var body: some View {
|
||||
ScrollView(showsIndicators: false) {
|
||||
|
||||
Reference in New Issue
Block a user