From 1a4b5d07bfc4f052999fe6089fa020c1f0892898 Mon Sep 17 00:00:00 2001 From: Trey t Date: Tue, 11 Nov 2025 21:45:12 -0600 Subject: [PATCH] Refactor task completion image handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Simplify image parameter passing in task completion ViewModels - Pass ImageData objects directly instead of separate bytes and filenames 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../mycrib/ui/screens/AllTasksScreen.kt | 3 +-- .../ui/screens/ResidenceDetailScreen.kt | 3 +-- .../example/mycrib/ui/screens/TasksScreen.kt | 3 +-- .../viewmodel/TaskCompletionViewModel.kt | 23 +++++++++++++++---- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/AllTasksScreen.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/AllTasksScreen.kt index 3acce58..4638ca5 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/AllTasksScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/AllTasksScreen.kt @@ -278,8 +278,7 @@ fun AllTasksScreen( if (images.isNotEmpty()) { taskCompletionViewModel.createTaskCompletionWithImages( request = request, - images = images.map { it.bytes }, - imageFileNames = images.map { it.fileName } + images = images ) } else { taskCompletionViewModel.createTaskCompletion(request) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt index 88f6955..6d5ec97 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt @@ -155,8 +155,7 @@ fun ResidenceDetailScreen( if (images.isNotEmpty()) { taskCompletionViewModel.createTaskCompletionWithImages( request = request, - images = images.map { it.bytes }, - imageFileNames = images.map { it.fileName } + images = images ) } else { taskCompletionViewModel.createTaskCompletion(request) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/TasksScreen.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/TasksScreen.kt index 18f531b..d3a3948 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/TasksScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/TasksScreen.kt @@ -264,8 +264,7 @@ fun TasksScreen( if (images.isNotEmpty()) { taskCompletionViewModel.createTaskCompletionWithImages( request = request, - images = images.map { it.bytes }, - imageFileNames = images.map { it.fileName } + images = images ) } else { taskCompletionViewModel.createTaskCompletion(request) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/viewmodel/TaskCompletionViewModel.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/viewmodel/TaskCompletionViewModel.kt index a026312..eee4efe 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/viewmodel/TaskCompletionViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/viewmodel/TaskCompletionViewModel.kt @@ -7,6 +7,7 @@ import com.mycrib.shared.models.TaskCompletionCreateRequest import com.mycrib.shared.network.ApiResult import com.mycrib.shared.network.TaskCompletionApi import com.mycrib.storage.TokenStorage +import com.mycrib.util.ImageCompressor import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @@ -33,22 +34,34 @@ class TaskCompletionViewModel : ViewModel() { * Create task completion with images. * * @param request The completion request data - * @param images List of image data as ByteArray (from platform-specific image pickers) - * @param imageFileNames Optional list of file names for the images + * @param images List of ImageData (from platform-specific image pickers) */ fun createTaskCompletionWithImages( request: TaskCompletionCreateRequest, - images: List = emptyList(), - imageFileNames: List = emptyList() + images: List = emptyList() ) { viewModelScope.launch { _createCompletionState.value = ApiResult.Loading val token = TokenStorage.getToken() if (token != null) { + // Compress images and prepare for upload + val compressedImages = images.map { ImageCompressor.compressImage(it) } + val imageFileNames = images.mapIndexed { index, image -> + // Always use .jpg extension since we compress to JPEG + val baseName = image.fileName.ifBlank { "completion_$index" } + if (baseName.endsWith(".jpg", ignoreCase = true) || + baseName.endsWith(".jpeg", ignoreCase = true)) { + baseName + } else { + // Remove any existing extension and add .jpg + baseName.substringBeforeLast('.', baseName) + ".jpg" + } + } + _createCompletionState.value = taskCompletionApi.createCompletionWithImages( token = token, request = request, - images = images, + images = compressedImages, imageFileNames = imageFileNames ) } else {