From 39d6ea00d970ccdb295cf70589f60a5f67774ead Mon Sep 17 00:00:00 2001 From: Simon Franken Date: Thu, 19 Feb 2026 19:05:43 +0100 Subject: [PATCH] Fix iOS list response decoding to match plain-array backend responses GET /clients and GET /projects return bare arrays, not wrapped objects. Remove ClientListResponse and ProjectListResponse wrapper structs and update ClientsViewModel, ProjectsViewModel, and TimerViewModel to decode [Client] and [Project] directly. --- .../TimeTracker/Features/Clients/ClientsViewModel.swift | 3 +-- .../TimeTracker/Features/Projects/ProjectsViewModel.swift | 6 ++---- .../TimeTracker/Features/Timer/TimerViewModel.swift | 3 +-- ios/TimeTracker/TimeTracker/Models/Client.swift | 4 ---- ios/TimeTracker/TimeTracker/Models/Project.swift | 4 ---- 5 files changed, 4 insertions(+), 16 deletions(-) diff --git a/ios/TimeTracker/TimeTracker/Features/Clients/ClientsViewModel.swift b/ios/TimeTracker/TimeTracker/Features/Clients/ClientsViewModel.swift index 1bf9a94..09e9414 100644 --- a/ios/TimeTracker/TimeTracker/Features/Clients/ClientsViewModel.swift +++ b/ios/TimeTracker/TimeTracker/Features/Clients/ClientsViewModel.swift @@ -15,11 +15,10 @@ final class ClientsViewModel: ObservableObject { error = nil do { - let response: ClientListResponse = try await apiClient.request( + clients = try await apiClient.request( endpoint: APIEndpoint.clients, authenticated: true ) - clients = response.clients try await database.saveClients(clients) diff --git a/ios/TimeTracker/TimeTracker/Features/Projects/ProjectsViewModel.swift b/ios/TimeTracker/TimeTracker/Features/Projects/ProjectsViewModel.swift index f47af6d..f47e548 100644 --- a/ios/TimeTracker/TimeTracker/Features/Projects/ProjectsViewModel.swift +++ b/ios/TimeTracker/TimeTracker/Features/Projects/ProjectsViewModel.swift @@ -16,17 +16,15 @@ final class ProjectsViewModel: ObservableObject { error = nil do { - let clientsResponse: ClientListResponse = try await apiClient.request( + clients = try await apiClient.request( endpoint: APIEndpoint.clients, authenticated: true ) - clients = clientsResponse.clients - let projectsResponse: ProjectListResponse = try await apiClient.request( + projects = try await apiClient.request( endpoint: APIEndpoint.projects, authenticated: true ) - projects = projectsResponse.projects try await database.saveProjects(projects) diff --git a/ios/TimeTracker/TimeTracker/Features/Timer/TimerViewModel.swift b/ios/TimeTracker/TimeTracker/Features/Timer/TimerViewModel.swift index de1dd9c..222478f 100644 --- a/ios/TimeTracker/TimeTracker/Features/Timer/TimerViewModel.swift +++ b/ios/TimeTracker/TimeTracker/Features/Timer/TimerViewModel.swift @@ -37,11 +37,10 @@ final class TimerViewModel: ObservableObject { try await database.cacheTimer(activeTimer) // Fetch projects - let response: ProjectListResponse = try await apiClient.request( + projects = try await apiClient.request( endpoint: APIEndpoint.projects, authenticated: true ) - projects = response.projects // Set selected project if timer has one if let timerProject = activeTimer?.project { diff --git a/ios/TimeTracker/TimeTracker/Models/Client.swift b/ios/TimeTracker/TimeTracker/Models/Client.swift index 9ed6d81..c8ffece 100644 --- a/ios/TimeTracker/TimeTracker/Models/Client.swift +++ b/ios/TimeTracker/TimeTracker/Models/Client.swift @@ -8,10 +8,6 @@ struct Client: Codable, Identifiable, Equatable, Hashable { let updatedAt: String } -struct ClientListResponse: Codable { - let clients: [Client] -} - struct CreateClientInput: Codable { let name: String let description: String? diff --git a/ios/TimeTracker/TimeTracker/Models/Project.swift b/ios/TimeTracker/TimeTracker/Models/Project.swift index be34552..89a0041 100644 --- a/ios/TimeTracker/TimeTracker/Models/Project.swift +++ b/ios/TimeTracker/TimeTracker/Models/Project.swift @@ -16,10 +16,6 @@ struct ClientReference: Codable, Equatable, Hashable { let name: String } -struct ProjectListResponse: Codable { - let projects: [Project] -} - struct CreateProjectInput: Codable { let name: String let description: String?